| # LANGUAGE translation of FILENAME.pot |
| # Copyright (C) 2018-2024 Savoir-faire Linux Inc. and contributors |
| # This file is distributed under the same license as the Jami documentation. |
| # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. |
| # |
| # Translators: |
| # savoirfairelinux <support@savoirfairelinux.com>, 2023 |
| # |
| #, fuzzy |
| msgid "" |
| msgstr "" |
| "Project-Id-Version: Jami\n" |
| "Report-Msgid-Bugs-To: https://git.jami.net/savoirfairelinux/jami-docs/-/issues\n" |
| "POT-Creation-Date: 2024-04-02 02:52+0000\n" |
| "PO-Revision-Date: 2022-09-14 17:48+0000\n" |
| "Last-Translator: savoirfairelinux <support@savoirfairelinux.com>, 2023\n" |
| "Language-Team: Vietnamese (https://app.transifex.com/savoirfairelinux/teams/49466/vi/)\n" |
| "MIME-Version: 1.0\n" |
| "Content-Type: text/plain; charset=UTF-8\n" |
| "Content-Transfer-Encoding: 8bit\n" |
| "Language: vi\n" |
| "Plural-Forms: nplurals=1; plural=0;\n" |
| |
| #: ../../../developer/account-management.md:1 |
| msgid "Account management" |
| msgstr "Quản lý tài khoản" |
| |
| #: ../../../developer/account-management.md:4 |
| msgid "" |
| "In this part, we will learn how to manage a Jami account. This means, how to" |
| " create a Jami account, modify the basic settings and delete the account. " |
| "This part will *NOT* explain what all the settings mean or how we can use " |
| "the account to do any action like adding a contact." |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:6 |
| msgid "Create a new account" |
| msgstr "Tạo tài khoản mới" |
| |
| #: ../../../developer/account-management.md:8 |
| #: ../../../developer/account-management.md:89 ../../../developer/calls.md:8 |
| msgid "Daemon side" |
| msgstr "Mặt Daemon" |
| |
| #: ../../../developer/account-management.md:10 |
| #: ../../../developer/account-management.md:91 |
| #: ../../../developer/account-management.md:116 |
| #: ../../../developer/account-management.md:143 |
| #: ../../../developer/account-management.md:168 |
| #: ../../../developer/account-management.md:192 |
| msgid "API" |
| msgstr "API" |
| |
| #: ../../../developer/account-management.md:12 |
| #: ../../../developer/account-management.md:93 |
| #: ../../../developer/account-management.md:118 |
| #: ../../../developer/account-management.md:145 |
| #: ../../../developer/account-management.md:170 |
| msgid "In cx.ring.Ring.ConfigurationManager:" |
| msgstr "Trong cx.ring.Ring.ConfigurationManager:" |
| |
| #: ../../../developer/account-management.md:35 |
| msgid "" |
| "The details can be retrieven from the method `getAccountTemplate(type)` with" |
| " `type=RING` or `type=SIP`. For example, this is the following code used in " |
| "LRC." |
| msgstr "" |
| "Các chi tiết có thể được lấy từ phương pháp `getAccountTemplate(type) ` với " |
| "`type=RING` hoặc `type=SIP`. Ví dụ, đây là mã sau được sử dụng trong LRC." |
| |
| #: ../../../developer/account-management.md:62 |
| msgid "" |
| "When a new account is added, the signal `accountsChanged` will be emitted. " |
| "The client should update its internal structure after this signal with other" |
| " methods in ConfigurationManager." |
| msgstr "" |
| "Khi một tài khoản mới được thêm vào, tín hiệu `accountsChanged` sẽ được phát" |
| " ra." |
| |
| #: ../../../developer/account-management.md:64 |
| #: ../../../developer/account-management.md:110 |
| msgid "Core" |
| msgstr "Nòng cốt lõi" |
| |
| #: ../../../developer/account-management.md:66 |
| msgid "" |
| "The main logic to create a new account is located in " |
| "`src/ringdht/ringaccount.cpp`, in `RingAccount::createAccount`" |
| msgstr "" |
| "Lý logic chính để tạo tài khoản mới nằm trong `src/ringdht/ringaccount.cpp`," |
| " trong `RingAccount::createAccount`" |
| |
| #: ../../../developer/account-management.md:68 |
| msgid "How it works, from scratch" |
| msgstr "Làm thế nào nó hoạt động, từ đầu" |
| |
| #: ../../../developer/account-management.md:70 |
| msgid "" |
| "A Jami account is in fact represented by some files stored in a gzip " |
| "archive. If a password is provided during the account creation, the archive " |
| "will be encrypted as following: `dht::crypto::aesEncrypt(archive, password)`" |
| " (`dht::crypto::aesEncrypt` is defined in OpenDHT and use " |
| "`nettle/{aes,gcm}`). This is what the archive will contain a big JSON file " |
| "with:" |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:72 |
| msgid "" |
| "The private key `ringAccountKey` and certificate chain `ringAccountCert` " |
| "(base64 encoded)" |
| msgstr "" |
| "Chìa khóa riêng `ringAccountKey` và chuỗi chứng chỉ `ringAccountCert` (được " |
| "mã hóa dựa trên 64)" |
| |
| #: ../../../developer/account-management.md:73 |
| msgid "Generated CA key (for self-signed certificates) `ringCAKey`" |
| msgstr "Generated CA key (for self-signed certificates) `ringCAKey`" |
| |
| #: ../../../developer/account-management.md:74 |
| msgid "Revocated devices `ringAccountCRL`" |
| msgstr "Các thiết bị bị bị hủy bỏ `ringAccountCRL`" |
| |
| #: ../../../developer/account-management.md:75 |
| msgid "" |
| "The ethereum private key `ethKey` for the device. It's only used when you " |
| "register your name on `ns.jami.net`. Not mandatory." |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:76 |
| msgid "The contacts" |
| msgstr "Các liên lạc" |
| |
| #: ../../../developer/account-management.md:77 |
| msgid "The account settings" |
| msgstr "Các cài đặt tài khoản" |
| |
| #: ../../../developer/account-management.md:79 |
| msgid "So let's generate it!" |
| msgstr "Vậy hãy tạo ra nó!" |
| |
| #: ../../../developer/account-management.md:81 |
| #: ../../../developer/contact-management.md:162 |
| msgid "**TODO**" |
| msgstr "** TODO**" |
| |
| #: ../../../developer/account-management.md:84 |
| msgid "Delete the account" |
| msgstr "Xóa tài khoản" |
| |
| #: ../../../developer/account-management.md:86 |
| msgid "" |
| "Deleting a Jami account is pretty simple. Because the keys are only on the " |
| "device, if the keys are deleted... the account is deleted! The only thing " |
| "outside the device is the username, on the nameserver. To remove this info, " |
| "it depends how the nameserver work. For example, it's not possible with " |
| "https://ns.jami.net" |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:108 |
| msgid "" |
| "When the account is deleted, the signal `accountsChanged` will be emitted. " |
| "The client should update its internal structure after this signal with other" |
| " methods in ConfigurationManager." |
| msgstr "Khi tài khoản bị xóa, tín hiệu `accountsChanged` sẽ được phát ra." |
| |
| #: ../../../developer/account-management.md:112 |
| msgid "" |
| "The main logic to create a new account is located in `src/manager.cpp`, in " |
| "`Manager::removeAccount`. It removes the accounts files and update the " |
| "config (`dring.yml`)." |
| msgstr "" |
| "Lý logic chính để tạo tài khoản mới nằm trong `src/manager.cpp`, trong " |
| "`Manager::removeAccount`. Nó xóa các tệp tài khoản và cập nhật cấu hình " |
| "(`dring.yml`)." |
| |
| #: ../../../developer/account-management.md:114 |
| msgid "Update the details of an account" |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:135 |
| msgid "" |
| "The map can contains a partial update and `accountDetailsChanged` will be " |
| "emitted on success. `getAccountDetails`" |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:137 |
| msgid "Add a device" |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:139 |
| msgid "There is two possibilities to add a device." |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:141 |
| msgid "Backup archive (Then import from backup)" |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:166 |
| msgid "Export on DHT" |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:188 |
| msgid "Then `exportOnRingEnded` is emitted." |
| msgstr "" |
| |
| #: ../../../developer/account-management.md:190 |
| msgid "Revoke device" |
| msgstr "Thiết bị hủy bỏ" |
| |
| #: ../../../developer/apis-of-jami.md:1 |
| msgid "The APIs of Jami" |
| msgstr "Các API của Jami" |
| |
| #: ../../../developer/apis-of-jami.md:4 |
| msgid "OpenDHT" |
| msgstr "OpenDHT" |
| |
| #: ../../../developer/apis-of-jami.md:6 |
| msgid "" |
| "The documentation related to the API of OpenDHT is " |
| "[here](https://github.com/savoirfairelinux/opendht/wiki/API-Overview) and " |
| "will not be detailed in the following part." |
| msgstr "" |
| "Tài liệu liên quan đến API của OpenDHT là " |
| "[đây]https://github.com/savoirfairelinux/opendht/wiki/API-Overview) và sẽ " |
| "không được chi tiết trong phần sau." |
| |
| #: ../../../developer/apis-of-jami.md:8 |
| msgid "Daemon" |
| msgstr "Daemon" |
| |
| #: ../../../developer/apis-of-jami.md:10 |
| msgid "The managers" |
| msgstr "Các nhà quản lý" |
| |
| #: ../../../developer/apis-of-jami.md:12 |
| msgid "" |
| "The API of the daemon is decomposed between 5 Managers + 1 Instance file:" |
| msgstr "API của daemon được phân hủy giữa 5 Manager + 1 File Instance:" |
| |
| #: ../../../developer/apis-of-jami.md:13 |
| msgid "" |
| "The **CallManager** interface is used to manage call and conference related " |
| "actions. Since the Jami daemon supports multiple incoming/outgoing calls, " |
| "any actions involving a specific call must address the method by the means " |
| "of a unique callID. Jami daemon will generate a unique callID for outgoing " |
| "and incoming calls." |
| msgstr "" |
| "Các giao diện **CallManager** được sử dụng để quản lý các hành động liên " |
| "quan đến cuộc gọi và hội nghị. Vì daemon Jami hỗ trợ nhiều cuộc gọi đến / ra" |
| " ngoài, bất kỳ hành động liên quan đến một cuộc gọi cụ thể phải giải quyết " |
| "phương pháp bằng cách sử dụng một callID độc đáo. Daemon Jami sẽ tạo ra một " |
| "callID độc đáo cho các cuộc gọi ra ngoài và vào." |
| |
| #: ../../../developer/apis-of-jami.md:14 |
| msgid "" |
| "The **ConfigurationManager** used to handle the configuration stuff: " |
| "accounts settings, user preferences, ..." |
| msgstr "" |
| "**ConfigurationManager** được sử dụng để xử lý các thứ cấu hình: cài đặt tài" |
| " khoản, sở thích của người dùng,..." |
| |
| #: ../../../developer/apis-of-jami.md:15 |
| msgid "The **PresenceManager** is used to track the presence of contacts" |
| msgstr "" |
| "**PresenceManager** được sử dụng để theo dõi sự hiện diện của các liên lạc" |
| |
| #: ../../../developer/apis-of-jami.md:16 |
| msgid "The **VideoManager** used to manage video devices and renderers" |
| msgstr "" |
| "**VideoManager** được sử dụng để quản lý các thiết bị và trình chiếu video" |
| |
| #: ../../../developer/apis-of-jami.md:17 |
| msgid "" |
| "The **Instance** is used to count the number of clients actually registered " |
| "to the core. When initializing your client, you need to register it against " |
| "the core by using this interface." |
| msgstr "" |
| "**Instance** được sử dụng để đếm số lượng khách hàng thực sự đăng ký vào " |
| "lõi. Khi khởi tạo khách hàng của bạn, bạn cần đăng ký nó chống lại lõi bằng " |
| "cách sử dụng giao diện này." |
| |
| #: ../../../developer/apis-of-jami.md:19 |
| msgid "DBUS" |
| msgstr "DBUS" |
| |
| #: ../../../developer/apis-of-jami.md:21 |
| msgid "" |
| "All the documentation and code for the dbus API is located in `jami-" |
| "daemon/bin/dbus`." |
| msgstr "" |
| "Tất cả các tài liệu và mã cho API dbus được đặt trong `jami-" |
| "daemon/bin/dbus`." |
| |
| #: ../../../developer/apis-of-jami.md:23 |
| msgid "" |
| "If you use linux, you can use `d-feet` when the daemon is running to " |
| "manipulate the API (or with any another tool)." |
| msgstr "" |
| "Nếu bạn sử dụng linux, bạn có thể sử dụng `d-feet` khi daemon đang chạy để " |
| "thao túng API (hoặc với bất kỳ công cụ nào khác)." |
| |
| #: ../../../developer/apis-of-jami.md:25 |
| msgid "The LRC project uses this API (and use libwrap on windows and mac os)." |
| msgstr "Dự án LRC sử dụng API này (và sử dụng libwrap trên Windows và macOS)." |
| |
| #: ../../../developer/apis-of-jami.md:27 |
| msgid "JNI" |
| msgstr "JNI" |
| |
| #: ../../../developer/apis-of-jami.md:29 |
| msgid "" |
| "All the documentation and code for the JNI API is located in `jami-" |
| "daemon/bin/jni`." |
| msgstr "" |
| "Tất cả các tài liệu và mã cho API JNI được đặt trong `jami-daemon/bin/jni`." |
| |
| #: ../../../developer/apis-of-jami.md:31 |
| msgid "node js" |
| msgstr "js node" |
| |
| #: ../../../developer/apis-of-jami.md:33 |
| msgid "" |
| "All the documentation and code for the Node JS API is located in `jami-" |
| "daemon/bin/nodejs`. This API is not used in any known project and maybe is " |
| "not up-to-date." |
| msgstr "" |
| "Tất cả các tài liệu và mã cho Node JS API nằm trong `jami-" |
| "daemon/bin/nodejs`. API này không được sử dụng trong bất kỳ dự án nào được " |
| "biết đến và có thể không cập nhật." |
| |
| #: ../../../developer/apis-of-jami.md:35 |
| msgid "REST" |
| msgstr "REST" |
| |
| #: ../../../developer/apis-of-jami.md:37 |
| msgid "" |
| "All the documentation and code for the REST API is located in `jami-" |
| "daemon/bin/restcpp`. This API is not used in any known project and maybe is " |
| "not up-to-date." |
| msgstr "" |
| "Tất cả các tài liệu và mã cho REST API được đặt trong `jami-" |
| "daemon/bin/restcpp`. API này không được sử dụng trong bất kỳ dự án nào được " |
| "biết đến và có thể không cập nhật." |
| |
| #: ../../../developer/apis-of-jami.md:39 |
| msgid "Python wrapper" |
| msgstr "Lớp lưng Python" |
| |
| #: ../../../developer/apis-of-jami.md:41 |
| msgid "" |
| "A Python wrapper is available in `jami-daemon/tools/jamictrl`. This wrapper " |
| "uses DBus." |
| msgstr "Một gói Python có sẵn bằng `jami-daemon/tools/jamictrl`." |
| |
| #: ../../../developer/banned-contacts.md:1 |
| msgid "Banned contacts" |
| msgstr "Liên lạc bị cấm" |
| |
| #: ../../../developer/banned-contacts.md:4 |
| msgid "" |
| "Following information are here for development purposes and may not reflect " |
| "the current state of any Jami client." |
| msgstr "" |
| |
| #: ../../../developer/banned-contacts.md:7 |
| msgid "Introducing scenario" |
| msgstr "Kế hoạch giới thiệu" |
| |
| #: ../../../developer/banned-contacts.md:10 |
| msgid "Let's explain banned contacts with a simple scenario:" |
| msgstr "" |
| "Hãy giải thích những người liên lạc bị cấm bằng một kịch bản đơn giản:" |
| |
| #: ../../../developer/banned-contacts.md:12 |
| msgid "" |
| "Alice and Jessica are friends, and like all good friends do, they use Jami " |
| "to communicate. They are both Jami contact of each other, so Alice is a " |
| "contact of Jessica and Jessica is a contact of Alice. Some day however, " |
| "Jessica does something really bad to Alice and Alice doesn't want to hear " |
| "from her anymore. Instead of removing Jessica from her Ring contacts -- " |
| "which would still allow Jessica to send her contact requests, Alice *bans* " |
| "Jessica." |
| msgstr "" |
| |
| #: ../../../developer/banned-contacts.md:20 |
| msgid "**So, what does it mean ?**" |
| msgstr "Vậy, nó có nghĩa là gì?" |
| |
| #: ../../../developer/banned-contacts.md:22 |
| msgid "In the daemon" |
| msgstr "Trong con quỷ" |
| |
| #: ../../../developer/banned-contacts.md:25 |
| msgid "Jessica *won't be notified that she was banned by Alice*." |
| msgstr "Jessica *sẽ không được thông báo rằng cô ấy bị Alice cấm*." |
| |
| #: ../../../developer/banned-contacts.md:27 |
| msgid "" |
| "As a *banned contact* of Alice, Jessica *won't be allowed to contact her " |
| "anymore*, in any way. Text messages, voice or video calls won't be " |
| "acknowledged or answered in any way. Alice won't even be aware that Jessica " |
| "tried to contact her." |
| msgstr "" |
| "Là một người liên lạc bị cấm của Alice, Jessica * sẽ không được phép liên " |
| "lạc với cô ấy nữa, bằng bất kỳ cách nào. Tin nhắn văn bản, giọng nói hoặc " |
| "video cuộc gọi sẽ không được nhận biết hoặc trả lời bằng bất kỳ cách nào. " |
| "Alice thậm chí sẽ không biết rằng Jessica đã cố gắng liên lạc với cô ấy." |
| |
| #: ../../../developer/banned-contacts.md:32 |
| msgid "Banned contacts are synched across linked devices like other contacts." |
| msgstr "" |
| "Các liên lạc bị cấm được đồng bộ hóa qua các thiết bị kết nối như các liên " |
| "lạc khác." |
| |
| #: ../../../developer/banned-contacts.md:34 |
| msgid "In Jami clients (recommended implementation)" |
| msgstr "Tại khách hàng Jami (được khuyến cáo thực hiện)" |
| |
| #: ../../../developer/banned-contacts.md:37 |
| msgid "" |
| "As long as Jessica is a banned contact, the conversation with Jessica " |
| "doesn't appears in the conversations list. The conversation history, " |
| "however, is not deleted. Jessica appears in Alice' account banned contact " |
| "list. Alice might also find/open the conversation by performing an exact " |
| "search for Jessica' username." |
| msgstr "" |
| "Chừng nào Jessica là một liên lạc bị cấm, cuộc trò chuyện với Jessica không " |
| "xuất hiện trong danh sách cuộc trò chuyện. Lịch sử cuộc trò chuyện, tuy " |
| "nhiên, không bị xóa. Jessica xuất hiện trong danh sách liên lạc bị cấm tài " |
| "khoản của Alice. Alice cũng có thể tìm thấy / mở cuộc trò chuyện bằng cách " |
| "thực hiện một tìm kiếm chính xác cho tên người dùng của Jessica." |
| |
| #: ../../../developer/banned-contacts.md:43 |
| msgid "" |
| "Alice can un-ban Jessica from the conversation or the banned contact list." |
| msgstr "" |
| "Alice có thể xóa Jessica khỏi cuộc trò chuyện hoặc danh sách liên lạc bị " |
| "cấm." |
| |
| #: ../../../developer/banned-contacts.md:46 |
| msgid "" |
| "The search result and the conversation indicates Jessica' banned status. " |
| "Alice must unban Jessica to send her a message, call her or otherwise " |
| "interract with her." |
| msgstr "" |
| "Kết quả tìm kiếm và cuộc trò chuyện cho thấy Jessica bị cấm. Alice phải giải" |
| " quyết việc cấm Jessica gửi tin nhắn, gọi cho cô ấy hoặc tương tác với cô " |
| "ấy." |
| |
| #: ../../../developer/banned-contacts.md:50 |
| msgid "" |
| "Alice can still delete the conversation history using a *Delete History* " |
| "button." |
| msgstr "" |
| "Alice vẫn có thể xóa lịch sử cuộc trò chuyện bằng cách sử dụng nút *Tắt lịch" |
| " sử *." |
| |
| #: ../../../developer/calls.md:1 ../../../developer/swarm.md:536 |
| #: ../../../developer/synchronizing-profiles.md:19 |
| msgid "Calls" |
| msgstr "- Các cuộc gọi" |
| |
| #: ../../../developer/calls.md:4 |
| msgid "" |
| "**NOTE: this page detail the principle for Jami accounts. For SIP accounts, " |
| "the SIP protocol is used.**" |
| msgstr "" |
| "**Lưu ý: trang này chi tiết nguyên tắc cho các tài khoản Jami. Đối với các " |
| "tài khoản SIP, giao thức SIP được sử dụng.**" |
| |
| #: ../../../developer/calls.md:6 |
| msgid "Let's do a call in Jami!" |
| msgstr "Chúng ta hãy gọi điện cho Jami!" |
| |
| #: ../../../developer/calls.md:10 |
| msgid "" |
| "When creating a call between two peers, Jami mainly uses known protocols " |
| "such as ICE, SIP or TLS. However, to make it distributed, the process of " |
| "creating a call is a bit different. To summarize, when someone wants to " |
| "contact one of its contact, this is what they will do:" |
| msgstr "" |
| "Khi tạo cuộc gọi giữa hai người đồng nghiệp, Jami chủ yếu sử dụng các giao " |
| "thức được biết đến như ICE, SIP hoặc TLS. Tuy nhiên, để phân phối nó, quá " |
| "trình tạo cuộc gọi hơi khác nhau. Để tóm tắt, khi ai đó muốn liên hệ với một" |
| " trong những người liên lạc của mình, họ sẽ làm như sau:" |
| |
| #: ../../../developer/calls.md:12 |
| msgid "" |
| "Search the contact presence on the DHT (for more details, see {doc}`contact-" |
| "management`)" |
| msgstr "" |
| "Tìm sự hiện diện liên lạc trên DHT (để biết thêm chi tiết, xem {doc}` liên " |
| "lạc quản lý`)" |
| |
| #: ../../../developer/calls.md:13 |
| msgid "" |
| "Once the contact is found, send a call request, announcing the known " |
| "candidates (the ip of each network interfaces + relay addresses (TURN) + " |
| "reflexives addresses (UPnP, public ones)." |
| msgstr "" |
| "Khi liên lạc được tìm thấy, gửi yêu cầu gọi, thông báo các ứng cử viên được " |
| "biết (IP của mỗi giao diện mạng + địa chỉ liên tiếp (TURN) + địa chỉ phản xạ" |
| " (UPnP, công cộng)." |
| |
| #: ../../../developer/calls.md:14 |
| msgid "" |
| "Wait for the response of the contact (they will respond their known " |
| "addresses)." |
| msgstr "" |
| "Chờ cho sự phản hồi của liên lạc (bọn họ sẽ trả lời địa chỉ được biết đến " |
| "của họ)." |
| |
| #: ../../../developer/calls.md:15 |
| msgid "" |
| "Negotiate the socket via ICE. In fact, two ICE sessions are negotiated. One " |
| "(preferred) in TCP, one in UDP (as a fallback)." |
| msgstr "" |
| "Tham đàm giao tiếp thông qua ICE. Trên thực tế, hai phiên ICE được đàm phán." |
| " Một (tích thích) trong TCP, một trong UDP (như một sự lùi)." |
| |
| #: ../../../developer/calls.md:16 |
| msgid "Then, the socket is encrypted in TLS (if TCP) or DTLS (if UDP)." |
| msgstr "Sau đó, ổ cắm được mã hóa trong TLS (nếu TCP) hoặc DTLS (nếu UDP)." |
| |
| #: ../../../developer/calls.md:17 |
| msgid "" |
| "The contact is now able to accept or decline the call. When they accept, a " |
| "ICE transport (UDP only for now) is negotiated to create 4 new sockets for " |
| "the medias (2 for audio, 2 for video)." |
| msgstr "" |
| "Khi họ chấp nhận, một giao thông ICE (UDP chỉ cho thời gian này) được đàm " |
| "phán để tạo ra 4 ổ cắm mới cho các phương tiện truyền thông (2 cho âm thanh," |
| " 2 cho video)." |
| |
| #: ../../../developer/calls.md:18 |
| msgid "The call is now alive!" |
| msgstr "Cuộc gọi đã được đưa ra!" |
| |
| #: ../../../developer/calls.md:20 |
| msgid "Exchange ICE candidates" |
| msgstr "Các ứng viên trao đổi ICE" |
| |
| #: ../../../developer/calls.md:22 |
| msgid "" |
| "Everything really starts in `jamiaccount.cpp` " |
| "(`JamiAccount::startOutgoingCall`). Once both ICE objects are ready and when" |
| " the contact is found via the DHT, the call request for the contact is " |
| "crafted. This request contains all the informations necessary for the remote" |
| " ICE session defined by:" |
| msgstr "" |
| "Mọi thứ thực sự bắt đầu trong `jamiaccount.cpp` " |
| "(`JamiAccount::startOutgoingCall`). Một khi cả hai đối tượng ICE đã sẵn sàng" |
| " và khi liên lạc được tìm thấy qua DHT, yêu cầu gọi cho liên lạc được tạo " |
| "ra." |
| |
| #: ../../../developer/calls.md:28 |
| msgid "" |
| "where `callvid` is a random number used to identify the call and blob " |
| "contains two concatened ICE messages (`IceTransport::packIceMsg` in " |
| "`ice_transport.cpp`) containing the password of the session, the *ufrag* and" |
| " ICE candidates.) like:" |
| msgstr "" |
| "nơi `callvid` là một số ngẫu nhiên được sử dụng để xác định cuộc gọi và blob" |
| " chứa hai tin nhắn ICE kết nối (`IceTransport::packIceMsg` trong " |
| "`ice_transport.cpp`) chứa mật khẩu của phiên, *ufrag* và ICE ứng cử viên.) " |
| "như:" |
| |
| #: ../../../developer/calls.md:48 |
| msgid "" |
| "and is sent via the DHT in an encrypted message for the device to " |
| "`hash(callto:xxxxxx)` where `xxxxxx` is the device id. The peer will answer " |
| "at the exact same place (but encrypted for the sender device) its own " |
| "`dht::IceCandidates`. See `JamiAccount::replyToIncomingIceMsg` for more " |
| "details." |
| msgstr "" |
| "và được gửi qua DHT trong một tin nhắn mã hóa cho thiết bị đến " |
| "`hash(call:xxxxxx) ` nơi `xxxxxx` là ID thiết bị. Người ngang sẽ trả lời ở " |
| "cùng một nơi chính xác (nhưng mã hóa cho thiết bị gửi) của riêng mình " |
| "`dht::IceCandidates`. Xem `JamiAccount::replyToIncomingIceMsg` để biết thêm " |
| "chi tiết." |
| |
| #: ../../../developer/calls.md:50 |
| msgid "" |
| "The ICE session is created both side when they have all the candidates (so " |
| "for the sender, when the reply from the contact is received)." |
| msgstr "" |
| "Các phiên ICE được tạo ra từ cả hai bên khi họ có tất cả các ứng cử viên (vì" |
| " vậy đối với người gửi, khi nhận được câu trả lời từ liên lạc)." |
| |
| #: ../../../developer/calls.md:52 |
| msgid "ICE negotiation" |
| msgstr "Cuộc đàm phán ICE" |
| |
| #: ../../../developer/calls.md:54 |
| msgid "" |
| "Pending calls are managed by `JamiAccount::handlePendingCallList()`, which " |
| "first wait that the TCP negotiation finish (and if it fails, wait for the " |
| "UDP one). The code for the ICE negotiation is mainly managed by " |
| "[pjproject](https://github.com/pjsip/pjproject) but for Jami, the " |
| "interesting part is located in `ice_transport.cpp`. Moreover, we add some " |
| "important patches/features on top of *pjproject* not merged upstream for now" |
| " (for example, ICE over TCP). These patches are present in " |
| "`contrib/src/pjproject`." |
| msgstr "" |
| "Các cuộc gọi chờ được quản lý bởi `JamiAccount::handlePendingCallList() `, " |
| "trước tiên chờ đợi khi cuộc đàm phán TCP kết thúc (và nếu không, hãy chờ cho" |
| " UDP). Mã cho cuộc đàm phán ICE chủ yếu được quản lý bởi " |
| "[pjproject]https://github.com/pjsip/pjproject) nhưng đối với Jami, phần thú " |
| "vị nằm trong `ice_transport.cpp`. Hơn nữa, chúng tôi thêm một số bản vá/ " |
| "tính năng quan trọng trên *pjproject* chưa được sáp nhập dòng chảy lên (ví " |
| "dụ, ICE trên TCP)." |
| |
| #: ../../../developer/calls.md:56 |
| msgid "Encrypt the control socket" |
| msgstr "Mã hóa ổ cắm điều khiển" |
| |
| #: ../../../developer/calls.md:58 |
| msgid "" |
| "Once the socket is created and managed by an **IceTransport** instance, it " |
| "is then wrapped in a **SipTransport** corresponding to a *TlsIceTransport*. " |
| "The main code is located into `JamiAccount::handlePendingCall()` and the " |
| "wrapping is done into `SipTransportBroker::getTlsIceTransport`. Finally, our" |
| " session is managed by **TlsSession** in " |
| "`daemon/src/security/tls_session.cpp` and uses the GnuTLS library." |
| msgstr "" |
| "Khi ổ cắm được tạo và quản lý bởi một phiên bản **IceTransport**, nó sau đó " |
| "được gói trong một **SipTransport** tương ứng với một *TlsIceTransport*. Mã " |
| "chính nằm trong `JamiAccount::handlePendingCall() ` và gói được thực hiện " |
| "trong `SipTransportBroker::getTlsIceTransport`. Cuối cùng, phiên bản của " |
| "chúng tôi được quản lý bởi **TlsSession** trong " |
| "`daemon/src/security/tls_session.cpp` và sử dụng thư viện GnuTLS." |
| |
| #: ../../../developer/calls.md:60 |
| msgid "" |
| "So, the control socket will be a TLS (1.3 if your and your peer gnutls " |
| "version support it) if a TCP socket is negotiated. If a UDP socket is " |
| "negotiated instead (due to firewall restrictions/problem in the " |
| "negotiation/etc), the socket will use DTLS (still managed by the same " |
| "parts)." |
| msgstr "" |
| "Vì vậy, ổ cắm điều khiển sẽ là một TLS (1.3 nếu phiên bản của bạn và các " |
| "gnutls đồng nghiệp của bạn hỗ trợ nó) nếu một ổ cắm TCP được đàm phán. Nếu " |
| "một ổ cắm UDP được đàm phán thay vì (do hạn chế tường lửa / vấn đề trong đàm" |
| " phán / vv), ổ cắm sẽ sử dụng DTLS (mặc dù vẫn được quản lý bởi cùng một " |
| "phần)." |
| |
| #: ../../../developer/calls.md:62 |
| msgid "" |
| "The control socket is used to transmit SIP packets, like invites, custom " |
| "messages (Jami sends the VCard of your profile on this socket at the start " |
| "of the call, or the rotation of the camera), text messages." |
| msgstr "" |
| "Các ổ cắm điều khiển được sử dụng để truyền các gói SIP, như lời mời, tin " |
| "nhắn tùy chỉnh (Jami gửi VCard của hồ sơ của bạn trên ổ cắm này vào lúc bắt " |
| "đầu cuộc gọi, hoặc quay của máy ảnh), tin nhắn văn bản." |
| |
| #: ../../../developer/calls.md:64 |
| msgid "Related articles:" |
| msgstr "Các bài viết liên quan:" |
| |
| #: ../../../developer/calls.md:66 |
| msgid "https://jami.net/improved-video-rotation-support/" |
| msgstr "https://jami.net/improved-video-rotation-support/" |
| |
| #: ../../../developer/calls.md:67 |
| msgid "https://jami.net/peer-to-peer-file-sharing-support-in-jami/" |
| msgstr "https://jami.net/peer-to-peer-file-sharing-support-in-jami/" |
| |
| #: ../../../developer/calls.md:69 |
| msgid "Media sockets" |
| msgstr "Các ổ cắm truyền thông" |
| |
| #: ../../../developer/calls.md:71 |
| msgid "" |
| "Media sockets are SRTP sockets where the key is negotiated through the TLS " |
| "Session previously created. **TODO**" |
| msgstr "" |
| "Các ổ cắm truyền thông là ổ cắm SRTP nơi chìa khóa được đàm phán thông qua " |
| "phiên TLS được tạo ra trước đó. ** TODO**" |
| |
| #: ../../../developer/calls.md:74 ../../../developer/drt.rst:140 |
| msgid "Architecture" |
| msgstr "Kiến trúc" |
| |
| #: ../../../developer/calls.md:76 |
| msgid "**TOOD**" |
| msgstr "**THOOD**" |
| |
| #: ../../../developer/calls.md:79 |
| msgid "Multi-stream" |
| msgstr "Dòng chảy đa" |
| |
| #: ../../../developer/calls.md:81 |
| msgid "" |
| "Since daemon's version 13.3.0, multi-stream is fully supported. This " |
| "feature allows users to share multiple videos during a call at the same " |
| "time. In the following parts, we will describe all related changes." |
| msgstr "" |
| "Kể từ phiên bản 13.3.0 của daemon, đa dòng được hỗ trợ đầy đủ. Tính năng này" |
| " cho phép người dùng chia sẻ nhiều video trong một cuộc gọi cùng một lúc. " |
| "Trong các phần sau, chúng tôi sẽ mô tả tất cả các thay đổi liên quan." |
| |
| #: ../../../developer/calls.md:86 |
| msgid "pjsip" |
| msgstr "đậu phộng" |
| |
| #: ../../../developer/calls.md:88 |
| msgid "" |
| "The first part is to negotiate enough media streams. In fact, every media " |
| "stream uses 2 UDP sockets. We consider three scenarios:" |
| msgstr "" |
| "Phần đầu tiên là đàm phán đủ các luồng truyền thông. thực tế, mỗi luồng " |
| "truyền thông sử dụng 2 ổ cắm UDP. Chúng tôi xem xét ba kịch bản:" |
| |
| #: ../../../developer/calls.md:91 |
| msgid "" |
| "If it's the host of a conference who wants to add media, there is nothing " |
| "more to negotiate, because we already mix the videos into one stream. So, " |
| "we add the new media directly to the video-mixer without negotiations." |
| msgstr "" |
| "Nếu chủ nhà hội nghị muốn thêm phương tiện truyền thông thì không còn gì để " |
| "đàm phán nữa, bởi vì chúng tôi đã trộn các video vào một dòng. Vì vậy, chúng" |
| " tôi thêm các phương tiện truyền thông mới trực tiếp vào máy trộn video mà " |
| "không cần đàm phán." |
| |
| #: ../../../developer/calls.md:96 |
| msgid "" |
| "If we're in 1:1, for now, as there is no conference information, multi-" |
| "stream is not supported." |
| msgstr "" |
| "Nếu chúng ta ở mức 1:1, cho đến nay, vì không có thông tin hội nghị, đa dòng" |
| " không được hỗ trợ." |
| |
| #: ../../../developer/calls.md:99 |
| msgid "Else, 2 new sockets are negotiated for new media." |
| msgstr "" |
| "Nếu không, 2 ổ cắm mới được thương lượng cho phương tiện truyền thông mới." |
| |
| #: ../../../developer/calls.md:101 |
| msgid "" |
| "To make pjsip able to generate more sockets per ICE session, " |
| "`PJ_ICE_COMP_BITS` was modified to `5` (which corresponds to `2^5`, so 32 " |
| "streams)." |
| msgstr "" |
| "Để pjsip có thể tạo ra nhiều ổ cắm hơn mỗi phiên ICE, `PJ_ICE_COMP_BITS` đã " |
| "được sửa đổi thành `5` (có tương ứng với `2^5`, do đó 32 dòng)." |
| |
| #: ../../../developer/calls.md:105 |
| msgid "Deprecate switchInput, support requestMediaChange" |
| msgstr "Deprecate switchInput, yêu cầu hỗ trợMediaChange" |
| |
| #: ../../../developer/calls.md:107 |
| msgid "" |
| "In the daemon, the old API `switchInput` is now **DEPRECATED**; same for " |
| "`switchSecondaryInput`:" |
| msgstr "" |
| "Trong daemon, API cũ `switchInput` bây giờ là **DEPRECATED**; tương tự cho " |
| "`switchSecondaryInput`:" |
| |
| #: ../../../developer/calls.md:133 |
| msgid "`requestMediaChange` replaces this, for both calls and conferences:" |
| msgstr "`requestMediaChange` thay thế điều này, cho cả cuộc gọi và hội nghị:" |
| |
| #: ../../../developer/calls.md:157 |
| msgid "Compability" |
| msgstr "Sự tương thích" |
| |
| #: ../../../developer/calls.md:159 |
| msgid "" |
| "If a call is done with a peer where the daemon's version is < 13.3.0, multi-" |
| "stream is not enabled and the old behavior is used (1 video only)." |
| msgstr "" |
| "Nếu cuộc gọi được thực hiện với một peer nơi phiên bản của daemon là < " |
| "13.3.0, đa dòng không được bật và hành vi cũ được sử dụng (1 video chỉ)." |
| |
| #: ../../../developer/calls.md:163 |
| msgid "Identifications of streams" |
| msgstr "Định dạng các dòng chảy" |
| |
| #: ../../../developer/calls.md:165 |
| msgid "" |
| "Because there can be multiple streams now, every media stream is identified " |
| "by its identifier, and the format is \"<type>_<idx>\"; for example: " |
| "\"audio_0\", \"video_2\", etc." |
| msgstr "" |
| "Bởi vì có thể có nhiều dòng stream bây giờ, mỗi dòng truyền thông được xác " |
| "định bằng trình nhận dạng của nó, và định dạng là \"<type>_<idx>\"; ví dụ: " |
| "\"audio_0\", \"video_2\", vv" |
| |
| #: ../../../developer/calls.md:169 |
| msgid "Rotation" |
| msgstr "Chuyển đổi" |
| |
| #: ../../../developer/calls.md:171 ../../../developer/calls.md:187 |
| #: ../../../developer/calls.md:201 |
| msgid "The XML was updated to add the wanted stream:" |
| msgstr "XML đã được cập nhật để thêm dòng truy cập:" |
| |
| #: ../../../developer/calls.md:185 |
| msgid "Key-frame" |
| msgstr "Phong khung phím" |
| |
| #: ../../../developer/calls.md:199 |
| msgid "Voice activity" |
| msgstr "Hành động giọng nói" |
| |
| #: ../../../developer/calls.md:215 |
| msgid "Conference" |
| msgstr "Hội nghị" |
| |
| #: ../../../developer/calls.md:217 |
| msgid "Reflected changes are documented {doc}`here <conference-protocol>`." |
| msgstr "" |
| "Những thay đổi được phản ánh được ghi lại {doc}` ở đây <conference-" |
| "protocol>`." |
| |
| #: ../../../developer/calls.md:219 |
| msgid "Client" |
| msgstr "Khách hàng" |
| |
| #: ../../../developer/calls.md:221 |
| msgid "" |
| "Even if the back-end supports up to 32 media at the same time, except for " |
| "custom clients we currently recommend only giving the ability to share one " |
| "camera and one video at the same time. The camera is controlled via the " |
| "camera button, and the other media via the \"Share\" button." |
| msgstr "" |
| "Ngay cả khi nền cuối hỗ trợ lên đến 32 phương tiện truyền thông cùng một " |
| "lúc, ngoại trừ các khách hàng tùy chỉnh chúng tôi hiện khuyên chỉ nên cung " |
| "cấp khả năng chia sẻ một máy ảnh và một video cùng một lúc." |
| |
| #: ../../../developer/calls.md:227 |
| msgid "" |
| "In client-qt, the interesting part is in `AvAdapter` (methods like " |
| "`isCapturing`, `shareAllScreens`, `stopSharing`). In the library's logic, " |
| "`addMedia` and `removeMedia` in the `callModel` directly use the " |
| "`requestMediaChange` and can be used as a design reference." |
| msgstr "" |
| "Trong client-qt, phần thú vị là trong `AvAdapter` (phương pháp như " |
| "`isCapturing`, `shareAllScreens`, `stopSharing`). Trong logic của thư viện, " |
| "`addMedia` và `removeMedia` trong `callModel` trực tiếp sử dụng " |
| "`requestMediaChange` và có thể được sử dụng như một tham chiếu thiết kế." |
| |
| #: ../../../developer/calls-in-swarm.md:1 |
| msgid "Calls in Swarm" |
| msgstr "Các cuộc gọi của Swarm" |
| |
| #: ../../../developer/calls-in-swarm.md:4 |
| msgid "Goals" |
| msgstr "Mục tiêu" |
| |
| #: ../../../developer/calls-in-swarm.md:6 |
| msgid "" |
| "This page aims to describe how call will works with groups. This method will" |
| " allow clients to provides call for multiple participants with a shared text" |
| " history. The protocol must be flexible, keep compatibility with the SIP " |
| "stack, adn must work in a distributed environment. This distributed " |
| "environment also brings some challenges, such as possible race conditions " |
| "(where multiple parties can start a call at the same time). Finally, because" |
| " the Swarm can be with members only using mobiles, or by companies with " |
| "dedicated servers to mix the video, it should also be able to work with the " |
| "best experience possible on heterogeneous environment." |
| msgstr "" |
| "Trang này nhằm mô tả cách gọi sẽ hoạt động với các nhóm. Phương pháp này sẽ " |
| "cho phép khách hàng cung cấp cuộc gọi cho nhiều người tham gia với lịch sử " |
| "văn bản được chia sẻ. Các giao thức phải linh hoạt, giữ tính tương thích với" |
| " SIP stack, adn phải làm việc trong một môi trường phân tán. Môi trường phân" |
| " tán này cũng mang lại một số thách thức, chẳng hạn như các điều kiện chủng " |
| "tộc có thể xảy ra (nơi nhiều bên có thể bắt đầu cuộc gọi cùng một lúc). Cuối" |
| " cùng, vì Swarm có thể với các thành viên chỉ sử dụng điện thoại di động, " |
| "hoặc bởi các công ty có máy chủ chuyên dụng để trộn video, nó cũng nên có " |
| "thể làm việc với trải nghiệm tốt nhất có thể trên môi trường đa dạng." |
| |
| #: ../../../developer/calls-in-swarm.md:8 |
| #: ../../../developer/conference-protocol.md:5 |
| #: ../../../developer/design-process.md:4 ../../../developer/drt.rst:23 |
| msgid "Definitions" |
| msgstr "Các định nghĩa" |
| |
| #: ../../../developer/calls-in-swarm.md:10 |
| msgid "" |
| "a **Rendezvous** will mix all authorized incoming calls in a conference." |
| msgstr "" |
| "Một **Rendezvous** sẽ trộn tất cả các cuộc gọi nhập cảnh được ủy quyền trong" |
| " một hội nghị." |
| |
| #: ../../../developer/calls-in-swarm.md:11 |
| msgid "Two new URIs will be used for this feature:" |
| msgstr "Hai URI mới sẽ được sử dụng cho tính năng này:" |
| |
| #: ../../../developer/calls-in-swarm.md:12 |
| msgid "`swarm:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`" |
| msgstr "" |
| "`swarm:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" |
| |
| #: ../../../developer/calls-in-swarm.md:13 |
| msgid "`rdv:accountUri/deviceId/conversationId/confId`" |
| msgstr "`rdv:accountUri/deviceId/conversationId/confId`" |
| |
| #: ../../../developer/calls-in-swarm.md:14 |
| msgid "" |
| "**Swarm's profile** is the profile of the swarm stored in a vCard " |
| "(`profile.vcf`, see {ref}`developer/swarm:Conversation's profile " |
| "synchronization` and {doc}`synchronizing-profiles`)" |
| msgstr "" |
| "**Profile của swarm** là profile của swarm được lưu trữ trong vCard " |
| "(`profile.vcf`, xem {ref}`developer/swarm:Conversation's profile " |
| "synchronization` và {doc}`synchronizing-profiles`)" |
| |
| #: ../../../developer/calls-in-swarm.md:15 |
| msgid "`rdvUri` is the default URI for a Swarm, set in the *Swarm's profile*" |
| msgstr "" |
| "`rdvUri` là URI mặc định cho một Swarm, được đặt trong hồ sơ của Swarm*" |
| |
| #: ../../../developer/calls-in-swarm.md:17 |
| msgid "" |
| "Note: those two URIs allow the client to place a call in order to join a " |
| "*Rendezvous* or to init a call to a swarm, resulting in the logic described " |
| "in the next section." |
| msgstr "" |
| "Lưu ý: hai URI này cho phép khách hàng thực hiện cuộc gọi để tham gia một * " |
| "Rendezvous * hoặc khởi động cuộc gọi cho một đám đông, dẫn đến logic được mô" |
| " tả trong phần tiếp theo." |
| |
| #: ../../../developer/calls-in-swarm.md:19 |
| msgid "Place a call in a Swarm" |
| msgstr "Đặt một cuộc gọi trong một Swarm" |
| |
| #: ../../../developer/calls-in-swarm.md:21 |
| msgid "Proposed flow:" |
| msgstr "Phương pháp vận chuyển:" |
| |
| #: ../../../developer/calls-in-swarm.md:23 |
| msgid "**a:** If `rdvUri` is set:" |
| msgstr "**a:** Nếu `rdvUri` được đặt:" |
| |
| #: ../../../developer/calls-in-swarm.md:24 |
| #: ../../../developer/calls-in-swarm.md:27 |
| msgid "Call it" |
| msgstr "Hãy gọi nó." |
| |
| #: ../../../developer/calls-in-swarm.md:25 |
| msgid "If failed, go to **b:**" |
| msgstr "Nếu thất bại, hãy đi đến **b:**" |
| |
| #: ../../../developer/calls-in-swarm.md:26 |
| msgid "**b:** else if there is a current active call:" |
| msgstr "**b:** nếu có cuộc gọi hoạt động hiện tại:" |
| |
| #: ../../../developer/calls-in-swarm.md:28 |
| msgid "If failed, go to **c:**" |
| msgstr "Nếu thất bại, hãy đi đến **c:**" |
| |
| #: ../../../developer/calls-in-swarm.md:29 |
| msgid "**c:** else, host a new *Rendezvous* and join it." |
| msgstr "Nếu không, hãy tổ chức một cuộc hẹn mới và tham gia." |
| |
| #: ../../../developer/calls-in-swarm.md:30 |
| msgid "Also, ask users if they want to be the host for next calls." |
| msgstr "" |
| "Ngoài ra, hãy hỏi người dùng nếu họ muốn là người chủ cho cuộc gọi tiếp " |
| "theo." |
| |
| #: ../../../developer/calls-in-swarm.md:32 |
| msgid "" |
| "![Diagram: Placing a call in a Swarm](images/placing-call-in-swarm-" |
| "diagram.png)" |
| msgstr "" |
| "! [Chương đồ: Đặt một cuộc gọi trong một Swarm](photos/đặt-call-in-swarm-" |
| "chương đồ.png)" |
| |
| #: ../../../developer/calls-in-swarm.md:32 |
| msgid "Diagram: Placing a call in a Swarm" |
| msgstr "Chữ đồ: Đặt một cuộc gọi trong một nhóm" |
| |
| #: ../../../developer/calls-in-swarm.md:34 |
| msgid "**TODO, when to commit and who is commiting**" |
| msgstr "**TODO, khi nào phải cam kết và ai đang cam kết**" |
| |
| #: ../../../developer/calls-in-swarm.md:36 |
| msgid "Incoming calls for swarm" |
| msgstr "Các cuộc gọi đến cho đám đông" |
| |
| #: ../../../developer/calls-in-swarm.md:38 |
| msgid "" |
| "When receiving a new incoming call, the URI MUST be parsed. If the incoming " |
| "call is for a *Rendezvous* which is currently hosted by the device and the " |
| "caller is authorized to join, the call MUST be answered and added to the " |
| "current *Rendezvous*" |
| msgstr "" |
| "Khi nhận được một cuộc gọi tiếp nhận mới, URI MUST được phân tích. Nếu cuộc " |
| "gọi tiếp nhận là cho một *Rendezvous* hiện đang được lưu trữ bởi thiết bị và" |
| " người gọi được ủy quyền tham gia, cuộc gọi MUST được trả lời và thêm vào " |
| "hiện tại *Rendezvous*" |
| |
| #: ../../../developer/calls-in-swarm.md:41 |
| msgid "Defining a host for a Swarm" |
| msgstr "Định nghĩa một chủ nhà cho một Swarm" |
| |
| #: ../../../developer/calls-in-swarm.md:43 |
| msgid "" |
| "To define a default URI, the member who wants to be the host should update " |
| "the profile of the conversation, and this will be synced and validated by " |
| "peers. However, the host MUST be able to accept or not to be the host and a " |
| "member with enough permissions SHOULD be able to ask a device to be the " |
| "host. This process is not decided for now." |
| msgstr "" |
| "Để xác định một URI mặc định, thành viên muốn là chủ nhà nên cập nhật hồ sơ " |
| "của cuộc trò chuyện, và điều này sẽ được đồng bộ hóa và xác nhận bởi các " |
| "đồng nghiệp. Tuy nhiên, chủ nhà phải có khả năng chấp nhận hoặc không được " |
| "chủ nhà và một thành viên có đủ quyền SẼ có thể yêu cầu một thiết bị là chủ " |
| "nhà." |
| |
| #: ../../../developer/calls-in-swarm.md:45 |
| msgid "**TODO? Permissions to update, negotiation of the host**" |
| msgstr "** TODO? Giấy phép cập nhật, đàm phán của chủ nhà**" |
| |
| #: ../../../developer/calls-in-swarm.md:47 |
| #: ../../../developer/conference-protocol.md:181 |
| #: ../../../developer/file-transfer.md:196 |
| msgid "Future" |
| msgstr "Tương lai" |
| |
| #: ../../../developer/calls-in-swarm.md:49 |
| msgid "Join notifications?" |
| msgstr "Tham gia thông báo?" |
| |
| #: ../../../developer/calls-in-swarm.md:51 |
| msgid "" |
| "Members of the swarm that aren't in a call SHOULD be able to know who is in " |
| "the active calls." |
| msgstr "" |
| "Những thành viên trong đám đông không tham gia cuộc gọi nên biết ai đang " |
| "tham gia cuộc gọi." |
| |
| #: ../../../developer/calls-in-swarm.md:53 |
| msgid "SIP Bridge?" |
| msgstr "Cầu SIP?" |
| |
| #: ../../../developer/calls-in-swarm.md:55 |
| msgid "" |
| "Because conferences are still mixed SIP calls, a SIP bridge is still " |
| "possible. In the *Swarm's profile* it should be possible to add a SIP entry," |
| " like some popular VoIP systems)" |
| msgstr "" |
| "Vì hội nghị vẫn là cuộc gọi SIP hỗn hợp, một cầu SIP vẫn có thể. Trong hồ sơ" |
| " của *Swarm's* nên có thể thêm một mục SIP, như một số hệ thống VoIP phổ " |
| "biến)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:1 |
| msgid "Choosing CRF value for encoder" |
| msgstr "Chọn giá trị CRF cho bộ mã hóa" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:4 |
| #: ../../../developer/design-process.md:13 |
| msgid "Context" |
| msgstr "Khối cảnh" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:5 |
| msgid "" |
| "Bandwidth usage by the Jami application is not optimal for all types of " |
| "connections. Indeed, in some cases, the user experience is not good " |
| "(satellite connection, ...) despite the bandwidth management algorithm." |
| msgstr "" |
| "Việc sử dụng băng thông bởi ứng dụng Jami không tối ưu cho tất cả các loại " |
| "kết nối. Thật vậy, trong một số trường hợp, trải nghiệm người dùng không tốt" |
| " (sáp nối vệ tinh,...) mặc dù thuật toán quản lý băng thông." |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:7 |
| msgid "Observation" |
| msgstr "Quan sát" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:8 |
| msgid "" |
| "It is not necessary to aim for an optimal quality (CRF < 20) because beyond " |
| "that, the visual perception is almost similar while the data flow (bitrate) " |
| "required is much higher." |
| msgstr "" |
| "Không cần phải nhắm đến chất lượng tối ưu (CRF < 20) vì ngoài đó, nhận thức " |
| "trực quan gần như giống nhau trong khi dòng dữ liệu (bitrate) cần thiết cao " |
| "hơn nhiều." |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:10 |
| msgid "Objective" |
| msgstr "Mục tiêu" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:11 |
| msgid "" |
| "The purpose of this document is to verify the impact of a change in video " |
| "quality with the CRF parameter of the encoder." |
| msgstr "" |
| "Mục đích của tài liệu này là xác minh tác động của sự thay đổi chất lượng " |
| "video bằng tham số CRF của bộ mã hóa." |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:13 |
| msgid "Test" |
| msgstr "Kiểm tra" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:14 |
| msgid "These tests were performed by comparing :" |
| msgstr "Các xét nghiệm này được thực hiện bằng cách so sánh:" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:15 |
| msgid "The first one encoded with Jami's current parameters" |
| msgstr "Cái đầu tiên được mã hóa với các tham số hiện tại của Jami" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:16 |
| msgid "The second encoded with a lower quality" |
| msgstr "Thứ hai được mã hóa với chất lượng thấp hơn" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:18 |
| msgid "" |
| "Each of these tests were performed for the following resolutions: 1080p, " |
| "720p and 436p." |
| msgstr "" |
| "Mỗi thử nghiệm này được thực hiện cho các độ phân giải sau đây: 1080p, 720p " |
| "và 436p." |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:20 |
| msgid "For each of these resolutions several bitrates have been used:" |
| msgstr "Đối với mỗi độ phân giải này đã được sử dụng một số bitrate:" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:21 |
| msgid "300 Kbit/s (Jami low value)" |
| msgstr "300 Kbit/s (giá trị thấp của Jam)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:22 |
| msgid "1.5 Mbit/s (Intermediate value)" |
| msgstr "1,5 Mbit/s (Tầm giá trị)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:23 |
| msgid "6 Mbit/s (High value)" |
| msgstr "6 Mbit/s (Tầm giá trị cao)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:25 |
| msgid "" |
| "The graphs show the evolution of the bitrate with the file being tested " |
| "(resolution and specific set bitrate)." |
| msgstr "" |
| "Các biểu đồ cho thấy sự phát triển của tỷ lệ bit với tệp đang được kiểm tra " |
| "(định giải và tỷ lệ bit thiết lập cụ thể)." |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:27 |
| msgid "A visual comparison (side by side) was made for each test." |
| msgstr "" |
| "Một so sánh trực quan (bằng cạnh) đã được thực hiện cho mỗi xét nghiệm." |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:29 |
| msgid "" |
| "Thanks to this test we can estimate the bitrate that will be emitted in Jami" |
| " according to the chosen parameters. We also have an overview of the visual " |
| "quality." |
| msgstr "" |
| "Nhờ thử nghiệm này chúng tôi có thể ước tính tỷ lệ bit sẽ được phát ra ở " |
| "Jami theo các tham số được chọn." |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:33 |
| msgid "" |
| "1080p / 300 kbit/s / CRF28 ![image](images/choosing-crf-1080p-300kbps-" |
| "crf28.png) 1080p / 300 kbit/s / CRF38 ![image](images/choosing-" |
| "crf-1080p-300kbps-crf38.png)" |
| msgstr "" |
| "1080p / 300 kbit/s / CRF28! [image](photos/choosing-crf-1080p-300kbps-" |
| "crf28.png) 1080p / 300 kbit/s / CRF38! [image](photos/choosing-" |
| "crf-1080p-300kbps-crf38.png)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:33 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:40 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:47 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:56 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:62 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:69 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:78 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:85 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:92 |
| msgid "image" |
| msgstr "hình ảnh" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:38 |
| msgid "Visual comparison (CRF28 a gauche / CRF38 a droite)" |
| msgstr "So sánh hình ảnh (CRF28 ở bên trái / CRF38 ở bên phải)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:40 |
| msgid "" |
| "1080p / 1.5 Mbps / CRF22 ![image](images/choosing-crf-1080p-1.5mbps-" |
| "crf22.png) 1080p / 1.5 Mbit/s / CRF30 ![image](images/choosing-" |
| "crf-1080p-1.5mbps-crf30.png)" |
| msgstr "" |
| "1080p / 1.5 Mbps / CRF22! [hình ảnh](photos/choosing-crf-1080p-1.5mbps-" |
| "crf22.png) 1080p / 1.5 Mbit/s / CRF30! [hình ảnh](photos/choosing-" |
| "crf-1080p-1.5mbps-crf30.png)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:45 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:67 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:90 |
| msgid "Visual comparison (CRF22 left / CRF30 right)" |
| msgstr "So sánh trực quan (CRF22 trái / CRF30 phải)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:47 |
| msgid "" |
| "1080p / 6 Mbps / CRF17 ![image](images/choosing-crf-1080p-6mbps-crf17.png) " |
| "1080p / 6 Mbit/s / CRF23 ![image](images/choosing-crf-1080p-6mbps-crf23.png)" |
| msgstr "" |
| "1080p / 6 Mbps / CRF17! [image](photos/choosing-crf-1080p-6mbps-crf17.png) " |
| "1080p / 6 Mbit/s / CRF23! [image](photos/choosing-crf-1080p-6mbps-crf23.png)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:52 |
| msgid "Visual comparison (CRF17 on the left / CRF23 on the right)" |
| msgstr "So sánh hình ảnh (CRF17 ở bên trái / CRF23 ở bên phải)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:56 |
| msgid "" |
| "720p / 300 kbps / CRF28 ![image](images/choosing-crf-720p-300kbps-crf28.png)" |
| " 720p / 300 kbit/s / CRF38 ![image](images/choosing-crf-720p-300kbps-" |
| "crf38.png) Visual comparison (CRF28 left / CRF38 right)" |
| msgstr "" |
| "720p / 300 kbps / CRF28! [hình ảnh](hình ảnh/ chọn-crf-720p-300kbps-" |
| "crf28.png) 720p / 300 kbit/s / CRF38! [hình ảnh](hình ảnh/ chọn-" |
| "crf-720p-300kbps-crf38.png) So sánh trực quan (CRF28 trái / CRF38 phải)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:62 |
| msgid "" |
| "720p / 1.5 Mbps / CRF22 ![image](images/choosing-crf-720p-1.5mbps-crf22.png)" |
| " 720p / 1.5 Mbit/s / CRF30 (Test with reduced CRF) ![image](images/choosing-" |
| "crf-720p-1.5mbps-crf30.png)" |
| msgstr "" |
| "720p / 1.5 Mbps / CRF22![image](photos/choosing-crf-720p-1.5mbps-crf22.png) " |
| "720p / 1.5 Mbit/s / CRF30 (Test with reduced CRF)![image](photos/choosing-" |
| "crf-720p-1.5mbps-crf30.png)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:69 |
| msgid "" |
| "720p / 6 Mbps / CRF17 ![image](images/choosing-crf-720p-6mbps-crf17.png) " |
| "720p / 6 Mbit/s / CRF23 ![image](images/choosing-crf-720p-6mbps-crf23.png)" |
| msgstr "" |
| "720p / 6 Mbps / CRF17! [image](photos/choosing-crf-720p-6mbps-crf17.png) " |
| "720p / 6 Mbit/s / CRF23! [image](photos/choosing-crf-720p-6mbps-crf23.png)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:74 |
| #: ../../../developer/choosing-crf-value-for-encoder.md:97 |
| msgid "Visual comparison (CRF17 left / CRF23 right)" |
| msgstr "So sánh trực quan (CRF17 trái / CRF23 phải)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:78 |
| msgid "" |
| "436p / 300 kbps / CRF28 ![image](images/choosing-crf-436p-300kbps-crf28.png)" |
| " 436p / 300 kbit/s / CRF38 ![image](images/choosing-crf-436p-300kbps-" |
| "crf38.png)" |
| msgstr "" |
| "436p / 300 kbps / CRF28! [hình ảnh](photos/choosing-crf-436p-300kbps-" |
| "crf28.png) 436p / 300 kbit/s / CRF38! [hình ảnh](photos/choosing-" |
| "crf-436p-300kbps-crf38.png)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:83 |
| msgid "Visual comparison (CRF28 left / CRF38 right)" |
| msgstr "So sánh trực quan (CRF28 trái / CRF38 phải)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:85 |
| msgid "" |
| "436p / 1.5 Mbps / CRF22 ![image](images/choosing-crf-436p-1.5mbps-crf22.png)" |
| " 436p / 1.5 Mbit/s / CRF30 ![image](images/choosing-crf-436p-1.5mbps-" |
| "crf30.png)" |
| msgstr "" |
| "436p / 1.5 Mbps / CRF22! [hình ảnh](photos/choosing-crf-436p-1.5mbps-" |
| "crf22.png) 436p / 1.5 Mbit/s / CRF30! [hình ảnh](photos/choosing-" |
| "crf-436p-1.5mbps-crf30.png)" |
| |
| #: ../../../developer/choosing-crf-value-for-encoder.md:92 |
| msgid "" |
| "436p / 6 Mbps / CRF17 ![image](images/choosing-crf-436p-6mbps-crf17.png) " |
| "436p / 6 Mbit/s / CRF23 ![image](images/choosing-crf-436p-6mbps-crf23.png)" |
| msgstr "" |
| "436p / 6 Mbps / CRF17! [image](images/choosing-crf-436p-6mbps-crf17.png) " |
| "436p / 6 Mbit/s / CRF23! [image](images/choosing-crf-436p-6mbps-crf23.png)" |
| |
| #: ../../../developer/coding-style.md:1 |
| msgid "Coding style" |
| msgstr "Phong cách mã hóa" |
| |
| #: ../../../developer/coding-style.md:4 |
| msgid "" |
| "**This page gives rules and/or guidances to all developers that want to " |
| "integrate some code to Jami**" |
| msgstr "" |
| |
| #: ../../../developer/coding-style.md:7 |
| msgid "" |
| "C++ format rules are defined by this clang-format file: " |
| "https://git.jami.net/savoirfairelinux/jami-daemon/blob/master/.clang-format" |
| msgstr "" |
| "Các quy tắc định dạng C++ được định nghĩa bởi tệp định dạng clang này: " |
| "https://git.jami.net/savoirfairelinux/jami-daemon/blob/master/.clang-format" |
| |
| #: ../../../developer/coding-style.md:10 |
| msgid "" |
| "QML format rules are defined by the source code used to build the qmlformat " |
| "executable: " |
| "https://codebrowser.dev/qt6/qtdeclarative/tools/qmlformat/qmlformat.cpp.html" |
| msgstr "" |
| |
| #: ../../../developer/coding-style.md:13 |
| msgid "" |
| "All developers are recommended to format their code using the script in " |
| "`jami-project/scripts/format.sh`. This is done automatically (as a pre-" |
| "commit hook) when using `./build.py --init --qt=<path-to-qt>`." |
| msgstr "" |
| |
| #: ../../../developer/conference-protocol.md:1 |
| msgid "Conference protocol" |
| msgstr "Nghị định thư hội nghị" |
| |
| #: ../../../developer/conference-protocol.md:3 |
| msgid "" |
| "This document aims to describe the evolutions we will do for managing " |
| "conferences (audio/video). The goal is to improve the current implementation" |
| " which simply merges SIP calls and provide a grid view, to a view where " |
| "participants are listed, can be muted independently, or the video layout " |
| "changed (to show only one participant)" |
| msgstr "" |
| "Tài liệu này nhằm mô tả những tiến bộ chúng ta sẽ thực hiện trong việc quản " |
| "lý hội nghị (audio/video). Mục tiêu là cải thiện việc thực hiện hiện hiện " |
| "tại mà chỉ đơn giản là kết hợp các cuộc gọi SIP và cung cấp một khung cảnh " |
| "lưới, để xem nơi người tham gia được liệt kê, có thể được câm độc lập, hoặc " |
| "bố trí video thay đổi (để chỉ hiển thị một người tham gia)" |
| |
| #: ../../../developer/conference-protocol.md:7 |
| msgid "Host: Is the user who mix the audio/video streams for the others" |
| msgstr "" |
| "Chủ: Là người dùng trộn các dòng âm thanh / video cho những người khác" |
| |
| #: ../../../developer/conference-protocol.md:8 |
| msgid "Participant: Every user in the conference, even the host" |
| msgstr "Người tham gia: Mỗi người dùng trong hội nghị, ngay cả người chủ nhà" |
| |
| #: ../../../developer/conference-protocol.md:10 |
| msgid "Disclaimer" |
| msgstr "Chứng chỉ trách nhiệm" |
| |
| #: ../../../developer/conference-protocol.md:12 |
| msgid "" |
| "This document only describes the first steps for now. This means the " |
| "identification of participants and position in the video mixer sent to all " |
| "participants." |
| msgstr "" |
| "Tài liệu này chỉ mô tả các bước đầu tiên cho đến nay. Điều này có nghĩa là " |
| "xác định các đối tác và vị trí trong máy trộn video được gửi cho tất cả các " |
| "đối tác." |
| |
| #: ../../../developer/conference-protocol.md:14 |
| msgid "Possible layouts" |
| msgstr "Các bố cục có thể" |
| |
| #: ../../../developer/conference-protocol.md:16 |
| msgid "GRID: Every member is shown with the same height/width" |
| msgstr "GRID: Mỗi thành viên được hiển thị với chiều cao/luồng tương tự" |
| |
| #: ../../../developer/conference-protocol.md:17 |
| msgid "" |
| "ONE_BIG_WITH_SMALL: One member is zoomed and the other preview is shown" |
| msgstr "" |
| "ONE_BIG_WITH_SMALL: Một thành viên được phóng to và xem trước người khác " |
| "được hiển thị" |
| |
| #: ../../../developer/conference-protocol.md:18 |
| msgid "ONE_BIG: One member take the full screen rendered" |
| msgstr "ONE_BIG: Một thành viên chụp màn hình đầy đủ" |
| |
| #: ../../../developer/conference-protocol.md:20 |
| msgid "" |
| "Two new methods are available to manage the conference Layout in " |
| "CallManager:" |
| msgstr "" |
| "Hai phương pháp mới có sẵn để quản lý Layout hội nghị trong CallManager:" |
| |
| #: ../../../developer/conference-protocol.md:38 |
| #: ../../../developer/conference-protocol.md:95 ../../../developer/drt.rst:120 |
| #: ../../../developer/swarm.md:493 |
| msgid "Implementation" |
| msgstr "Thực hiện" |
| |
| #: ../../../developer/conference-protocol.md:40 |
| msgid "" |
| "The implementation is pretty straightforward. Everything is managed by " |
| "`conference.cpp` (to link participant to sources) and `video_mixer.cpp` (to " |
| "render the wanted layout)." |
| msgstr "" |
| "Việc thực hiện khá đơn giản. Mọi thứ được quản lý bởi `conference.cpp` (để " |
| "liên kết người tham gia đến nguồn) và `video_mixer.cpp` (để render bố cục " |
| "mong muốn)." |
| |
| #: ../../../developer/conference-protocol.md:43 |
| msgid "Syncing Conferences Informations" |
| msgstr "Thông tin hội nghị đồng bộ" |
| |
| #: ../../../developer/conference-protocol.md:45 |
| msgid "" |
| "Note: Actually, the word participant is used for callId mixed in a " |
| "conference. This can lead at first to some problems for the API and must be " |
| "fixed in the future" |
| msgstr "" |
| "Lưu ý: Thực tế, từ tham gia được sử dụng cho callId trộn trong một hội nghị." |
| " Điều này có thể dẫn đến một số vấn đề cho API và phải được sửa chữa trong " |
| "tương lai" |
| |
| #: ../../../developer/conference-protocol.md:47 |
| msgid "" |
| "The goal is to notify all participants of the metadata of the rendered " |
| "video. This means what participant is in the conference and where the video " |
| "is located." |
| msgstr "" |
| "Mục tiêu là thông báo cho tất cả các người tham gia về metadata của video " |
| "được hiển thị. Điều này có nghĩa là người tham gia trong hội nghị là ai và " |
| "video nằm ở đâu." |
| |
| #: ../../../developer/conference-protocol.md:49 |
| msgid "" |
| "If a participant is itself a conference, its incoming layout info should be " |
| "merged when sent to other participants. Layout info must not be merged when " |
| "sent back to a conference." |
| msgstr "" |
| "Nếu một người tham gia là một hội nghị, thông tin bố trí tiếp theo của nó " |
| "nên được kết hợp khi được gửi đến những người tham gia khác." |
| |
| #: ../../../developer/conference-protocol.md:51 |
| msgid "Layout Info" |
| msgstr "Thông tin bố cục" |
| |
| #: ../../../developer/conference-protocol.md:53 |
| msgid "" |
| "The Layout is stored as a VectorMapStringString for clients and internally " |
| "with a vector<ParticipantInfo> with the following format:" |
| msgstr "" |
| "Layout được lưu trữ như một VectorMapStringString cho khách hàng và bên " |
| "trong với một vector<ParticipantInfo> với định dạng sau:" |
| |
| #: ../../../developer/conference-protocol.md:67 |
| msgid "Possible keys are:" |
| msgstr "Các chìa khóa có thể là:" |
| |
| #: ../../../developer/conference-protocol.md:69 |
| msgid "uri = account's uri" |
| msgstr "uri = uri của tài khoản" |
| |
| #: ../../../developer/conference-protocol.md:70 |
| msgid "device = device's id" |
| msgstr "thiết bị = ID của thiết bị" |
| |
| #: ../../../developer/conference-protocol.md:71 |
| msgid "media = media's id" |
| msgstr "media = ID của media" |
| |
| #: ../../../developer/conference-protocol.md:72 |
| msgid "active = if the participant is active" |
| msgstr "active = nếu người tham gia là tích cực" |
| |
| #: ../../../developer/conference-protocol.md:73 |
| msgid "x = position (x) in the video" |
| msgstr "x = vị trí (x) trong video" |
| |
| #: ../../../developer/conference-protocol.md:74 |
| msgid "y = position (y) in the video" |
| msgstr "y = vị trí (y) trong video" |
| |
| #: ../../../developer/conference-protocol.md:75 |
| msgid "w = size (width) in the video" |
| msgstr "w = kích thước (thường độ) trong video" |
| |
| #: ../../../developer/conference-protocol.md:76 |
| msgid "h = size (height) in the video" |
| msgstr "h = kích thước (bức độ) trong video" |
| |
| #: ../../../developer/conference-protocol.md:77 |
| msgid "videoMuted = if the video is muted" |
| msgstr "video Muted = nếu video bị câm" |
| |
| #: ../../../developer/conference-protocol.md:78 |
| msgid "audioLocalMuted = if the audio is locally muted" |
| msgstr "audioLocalMuted = nếu âm thanh được tắt ở địa phương" |
| |
| #: ../../../developer/conference-protocol.md:79 |
| msgid "audioModeratorMuted = if the audio is muted by moderators" |
| msgstr "audioModeratorMuted = nếu âm thanh được các người điều hành làm câm" |
| |
| #: ../../../developer/conference-protocol.md:80 |
| msgid "isModerator = if it's a moderator" |
| msgstr "isModerator = nếu đó là một người điều hành" |
| |
| #: ../../../developer/conference-protocol.md:81 |
| msgid "handRaised = if the hand is raised" |
| msgstr "tay nâng = nếu tay nâng" |
| |
| #: ../../../developer/conference-protocol.md:82 |
| msgid "voiceActivity = if the stream has voice activity" |
| msgstr "voiceActivity = nếu dòng có hoạt động giọng nói" |
| |
| #: ../../../developer/conference-protocol.md:83 |
| msgid "recording = if the peer is recording the conference" |
| msgstr "ghi âm = nếu người đồng nghiệp đang ghi âm hội nghị" |
| |
| #: ../../../developer/conference-protocol.md:85 |
| msgid "New API" |
| msgstr "API mới" |
| |
| #: ../../../developer/conference-protocol.md:87 |
| msgid "" |
| "A new method (in CallManager) and a new signal to respectively get current " |
| "conference infos and updates are available:" |
| msgstr "" |
| "Một phương pháp mới (trong CallManager) và một tín hiệu mới để nhận được " |
| "thông tin và cập nhật hội nghị hiện tại tương ứng có sẵn:" |
| |
| #: ../../../developer/conference-protocol.md:97 |
| msgid "" |
| "The `Conference` Object (which only exists if we mix calls, this means that " |
| "we are the master) manages the information for the whole conference, based " |
| "on the LayoutInfos of each `Call` object. The getConferenceInfos will " |
| "retrieve info directly from this object." |
| msgstr "" |
| "`Conference` Object (chỉ tồn tại nếu chúng ta trộn các cuộc gọi, điều này có" |
| " nghĩa là chúng ta là chủ nhân) quản lý thông tin cho toàn bộ hội nghị, dựa " |
| "trên LayoutInfos của mỗi đối tượng `Call`. getConferenceInfos sẽ lấy thông " |
| "tin trực tiếp từ đối tượng này." |
| |
| #: ../../../developer/conference-protocol.md:99 |
| msgid "" |
| "So, every `Call` object now has a LayoutInfo and if updated, ask the " |
| "`Conference` object to updates its info." |
| msgstr "" |
| "Vì vậy, mỗi đối tượng `Call` bây giờ có một LayoutInfo và nếu cập nhật, yêu " |
| "cầu đối tượng `Conference` cập nhật thông tin của nó." |
| |
| #: ../../../developer/conference-protocol.md:101 |
| msgid "" |
| "The master of a conference sends its info via the SIP channel as a message " |
| "with the following MIME type: `application/confInfo+json`" |
| msgstr "" |
| "Chủ hội nghị gửi thông tin của mình qua kênh SIP dưới dạng thông điệp với " |
| "loại MIME sau đây: `application/confInfo+json`" |
| |
| #: ../../../developer/conference-protocol.md:104 |
| msgid "" |
| "So, if a call receives some confInfo, we know that this call is a member of " |
| "a conference." |
| msgstr "" |
| "Vì vậy, nếu một cuộc gọi nhận được một số thông tin thông tin, chúng tôi " |
| "biết rằng cuộc gọi này là một thành viên của một hội nghị." |
| |
| #: ../../../developer/conference-protocol.md:106 |
| msgid "" |
| "To summarize, `Call` manages received layouts, `Conference`-managed sent " |
| "layouts." |
| msgstr "" |
| "Để tóm tắt, `Call` quản lý bố cục nhận được, `Conference`-managed gửi bố " |
| "cục." |
| |
| #: ../../../developer/conference-protocol.md:108 |
| msgid "Changing the state of the conference" |
| msgstr "Thay đổi tình trạng của hội nghị" |
| |
| #: ../../../developer/conference-protocol.md:110 |
| msgid "" |
| "To change the state of the conference, participants needs to send orders " |
| "that the host will handle." |
| msgstr "" |
| "Để thay đổi tình trạng của hội nghị, người tham gia cần gửi lệnh mà chủ nhà " |
| "sẽ xử lý." |
| |
| #: ../../../developer/conference-protocol.md:112 |
| msgid "The protocol have the following needs:" |
| msgstr "Các quy định này có những nhu cầu sau:" |
| |
| #: ../../../developer/conference-protocol.md:114 |
| msgid "" |
| "It should handle orders at multiple levels. In fact for a conference the is " |
| "3 levels to define a participant:" |
| msgstr "Nó nên xử lý các đơn đặt hàng ở nhiều cấp độ." |
| |
| #: ../../../developer/conference-protocol.md:115 |
| msgid "The account which is the identity of the participant" |
| msgstr "Tài khoản là danh tính của người tham gia" |
| |
| #: ../../../developer/conference-protocol.md:116 |
| msgid "Devices, because each account can join via multiple devices" |
| msgstr "" |
| "Các thiết bị, bởi vì mỗi tài khoản có thể tham gia thông qua nhiều thiết bị" |
| |
| #: ../../../developer/conference-protocol.md:117 |
| msgid "" |
| "Medias, because there can be multiple videos by devices (eg 1 camera and 1 " |
| "screen sharing)" |
| msgstr "" |
| "Truyền thông, vì có thể có nhiều video theo thiết bị (ví dụ: 1 camera và 1 " |
| "chia sẻ màn hình)" |
| |
| #: ../../../developer/conference-protocol.md:119 |
| msgid "" |
| "To save bandwidth, clients should be able to send multiple orders at once." |
| msgstr "" |
| "Để tiết kiệm băng thông, khách hàng nên có thể gửi nhiều đơn đặt hàng cùng " |
| "một lúc." |
| |
| #: ../../../developer/conference-protocol.md:121 |
| msgid "General actions" |
| msgstr "Các hành động chung" |
| |
| #: ../../../developer/conference-protocol.md:123 |
| msgid "" |
| "To change a layout, the moderator can send a payload with " |
| "\"application/confOrder+json\" as type: where **0** is a grid, **1** is one " |
| "user in big, others in small, **2** is one in big" |
| msgstr "" |
| "Để thay đổi bố cục, người điều hành có thể gửi tải trọng hữu ích với " |
| "\"application/confOrder+json\" như kiểu: nơi **0** là một lưới, **1** là một" |
| " người dùng trong lớn, những người khác trong nhỏ, **2** là một trong lớn" |
| |
| #: ../../../developer/conference-protocol.md:126 |
| msgid "Account's actions" |
| msgstr "Hành động của tài khoản" |
| |
| #: ../../../developer/conference-protocol.md:128 |
| msgid "" |
| "For now, there is no action supported, however, in the future `moderator: " |
| "true/false` should be handled to change a moderator." |
| msgstr "" |
| "Hiện tại, không có hành động được hỗ trợ, tuy nhiên, trong tương lai " |
| "`moderator: đúng / sai ` nên được xử lý để thay đổi một người điều hành." |
| |
| #: ../../../developer/conference-protocol.md:130 |
| msgid "Device's actions" |
| msgstr "Hành động của thiết bị" |
| |
| #: ../../../developer/conference-protocol.md:132 |
| msgid "" |
| "`hangup: true` to hangup a device from the conference (only moderators)" |
| msgstr "`hangup: true` để treo một thiết bị từ hội nghị (chỉ người điều hành)" |
| |
| #: ../../../developer/conference-protocol.md:133 |
| msgid "" |
| "`raisehand: true/false` to change the raise hand's status. Only doable by " |
| "the device itself, else dropped." |
| msgstr "" |
| "`raisehand: true/false ` để thay đổi tình trạng của tay nâng. Chỉ có thể làm" |
| " bằng thiết bị, nếu không bị bỏ." |
| |
| #: ../../../developer/conference-protocol.md:135 |
| msgid "Media's actions" |
| msgstr "Hành động của phương tiện truyền thông" |
| |
| #: ../../../developer/conference-protocol.md:137 |
| msgid "" |
| "`muteAudio` only doable by moderators to mute the audio of a participant" |
| msgstr "" |
| "`muteAudio` chỉ có thể được thực hiện bởi các nhà điều tra để câm âm thanh " |
| "của một người tham gia" |
| |
| #: ../../../developer/conference-protocol.md:138 |
| msgid "`muteVideo` not supported yet." |
| msgstr "`muteVideo` chưa được hỗ trợ." |
| |
| #: ../../../developer/conference-protocol.md:139 |
| msgid "`active` to mark the media as active." |
| msgstr "`active` để đánh dấu các phương tiện truyền thông như là hoạt động." |
| |
| #: ../../../developer/conference-protocol.md:140 |
| msgid "" |
| "`voiceActivity` to indiciate a media stream's voice activity status (only " |
| "relevant for audio)" |
| msgstr "" |
| "`voiceActivity` để chỉ ra tình trạng hoạt động giọng nói của một dòng truyền" |
| " thông (chỉ có liên quan đến âm thanh)" |
| |
| #: ../../../developer/conference-protocol.md:142 |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "Example" |
| msgstr "Ví dụ:" |
| |
| #: ../../../developer/conference-protocol.md:144 |
| msgid "So, the `application/confOrder+json` will contains:" |
| msgstr "Vì vậy, ` ứng dụng/confOrder+json` sẽ chứa:" |
| |
| #: ../../../developer/conference-protocol.md:169 |
| msgid "" |
| "Note: the type of the media should be included in conferences informations " |
| "and can be used for the client to improve display (e.g. do not crop screen " |
| "sharing)" |
| msgstr "" |
| "Lưu ý: loại phương tiện truyền thông nên được bao gồm trong thông tin hội " |
| "nghị và có thể được sử dụng cho khách hàng để cải thiện hiển thị (ví dụ: " |
| "không cắt chia sẻ màn hình)" |
| |
| #: ../../../developer/conference-protocol.md:172 |
| msgid "Controlling moderators" |
| msgstr "Kiểm soát các người điều hành" |
| |
| #: ../../../developer/conference-protocol.md:174 |
| msgid "There is actually 3 possibilities:" |
| msgstr "Thực tế có 3 khả năng:" |
| |
| #: ../../../developer/conference-protocol.md:176 |
| msgid "" |
| "Changing account's config to add a list of moderators (In the config.yml " |
| "(`defaultModerators` can contains a list of default moderators)" |
| msgstr "" |
| "Config của tài khoản thay đổi để thêm một danh sách các người điều hành " |
| "(Trong config.yml (`defaultModerators` có thể chứa một danh sách các người " |
| "điều hành mặc định)" |
| |
| #: ../../../developer/conference-protocol.md:177 |
| msgid "" |
| "If `localModeratorsEnabled` is true, all accounts of the device will be " |
| "moderators" |
| msgstr "" |
| "Nếu `localModeratorsEnabled` là đúng, tất cả các tài khoản của thiết bị sẽ " |
| "là người điều chỉnh" |
| |
| #: ../../../developer/conference-protocol.md:178 |
| msgid "" |
| "If `allModeratorsEnabled` is true, anybody in the conference will be a " |
| "moderator" |
| msgstr "" |
| "Nếu `allModeratorsEnabled` là đúng, bất cứ ai trong hội nghị sẽ là người " |
| "điều hành" |
| |
| #: ../../../developer/conference-protocol.md:183 |
| msgid "Separate streams to allow more controls?" |
| msgstr "Các dòng chảy riêng biệt để cho phép kiểm soát nhiều hơn?" |
| |
| #: ../../../developer/conference-protocol.md:185 |
| msgid "Notes/Comments" |
| msgstr "Các ghi chú/Sau ý" |
| |
| #: ../../../developer/conference-protocol.md:186 |
| msgid "" |
| "It's likely that the protocol will evolve for future needs. I believe it's " |
| "best if we have a \"version\" field. The older version will be recognized if" |
| " this field is missing." |
| msgstr "" |
| "Có thể giao thức sẽ phát triển cho nhu cầu trong tương lai. Tôi tin rằng tốt" |
| " nhất là chúng ta có một trường \"được phiên bản\". phiên bản cũ sẽ được " |
| "nhận ra nếu trường này bị thiếu." |
| |
| #: ../../../developer/connection-manager.md:1 |
| msgid "The connection manager" |
| msgstr "Người quản lý kết nối" |
| |
| #: ../../../developer/connection-manager.md:4 |
| #: ../../../developer/file-transfer.md:49 ../../../developer/introduction.md:1 |
| #: ../../../developer/location-sharing.md:42 |
| msgid "Introduction" |
| msgstr "Khởi đầu" |
| |
| #: ../../../developer/connection-manager.md:6 |
| msgid "" |
| "The connection manager is the first piece of the group chat features. This " |
| "class manages connections to peers and offer to the user multiplexed sockets" |
| " to devices they want to connect. For example, if Alice wants to be " |
| "connected to one of Bob's device to transfer 2 files, she will ask the " |
| "ConnectionManager to open 2 channels (one per file) to Bob. This will give:" |
| msgstr "" |
| "Các hệ thống quản lý kết nối là phần đầu tiên của các tính năng trò chuyện " |
| "nhóm. lớp này quản lý các kết nối với các đồng nghiệp và cung cấp cho người " |
| "dùng các ổ cắm đa phương cho các thiết bị họ muốn kết nối. Ví dụ, nếu Alice " |
| "muốn được kết nối với một trong các thiết bị của Bob để chuyển 2 tệp, cô ấy " |
| "sẽ yêu cầu ConnectionManager mở 2 kênh (một cho mỗi tệp). Điều này sẽ cung " |
| "cấp:" |
| |
| #: ../../../developer/connection-manager.md:24 |
| msgid "" |
| "Behind that, the ConnectionManager will first connect to Bob's device via " |
| "the DHT (via ICE) and setup a TLS Socket. Then, it will ask for a channel, " |
| "and when the channel is ready, inform Alice via a callback. For the second " |
| "file, it will use the first socket and will just open a new channel (only " |
| "needs 2 TLS packet, so it's fast)" |
| msgstr "" |
| "Sau đó, ConnectionManager sẽ kết nối với thiết bị của Bob thông qua DHT (via" |
| " ICE) và thiết lập một TLS Socket. Sau đó, nó sẽ yêu cầu một kênh, và khi " |
| "kênh sẵn sàng, thông báo cho Alice thông qua một callback. Đối với tập tin " |
| "thứ hai, nó sẽ sử dụng ổ cắm đầu tiên và sẽ mở một kênh mới (chỉ cần 2 gói " |
| "TLS, vì vậy nó nhanh chóng)" |
| |
| #: ../../../developer/connection-manager.md:26 |
| msgid "DHT side" |
| msgstr "DHT bên" |
| |
| #: ../../../developer/connection-manager.md:28 |
| msgid "" |
| "It's the same as {doc}`calls`, see **Exchange ICE candidates**, **ICE " |
| "negotiation**, **Encrypt the control socket** but only in TCP." |
| msgstr "" |
| "Nó giống như {doc}`call`, xem **Chân đổi ICE ứng cử viên**, **ICE đàm " |
| "phán**, **Encrypt socket điều khiển** nhưng chỉ trong TCP." |
| |
| #: ../../../developer/connection-manager.md:30 |
| msgid "" |
| "However, when a side receives a new ICE request, the callback set by ` void " |
| "onICERequest(onICERequestCallback&& cb);` is triggered." |
| msgstr "" |
| "Tuy nhiên, khi một bên nhận được yêu cầu ICE mới, cuộc gọi trở lại được " |
| "thiết lập bởi ` vô hiệu onICERequest(onICERequestCallback&&& cb);` được kích" |
| " hoạt." |
| |
| #: ../../../developer/connection-manager.md:32 |
| msgid "Negotiating a new channel" |
| msgstr "Tham đàm một kênh mới" |
| |
| #: ../../../developer/connection-manager.md:34 |
| msgid "" |
| "A channel is defined by an id (unique) and a uri (not unique). For example " |
| "(1, 'git://*')" |
| msgstr "" |
| "Một kênh được định nghĩa bởi một id (đặc biệt) và một uri (không độc đáo). " |
| "Ví dụ (1, 'git://*')" |
| |
| #: ../../../developer/connection-manager.md:36 |
| msgid "" |
| "When ready, the ConnectionManager considers that the channel 0 exists. This " |
| "channel is called the *CONTROL* channel and is used to ask for new channels." |
| msgstr "Khi sẵn sàng, ConnectionManager xem xét rằng kênh 0 hiện hữu." |
| |
| #: ../../../developer/connection-manager.md:38 |
| msgid "The protocol used is pretty simple and looks like the RTP protocol:" |
| msgstr "" |
| "Các giao thức được sử dụng khá đơn giản và trông giống như giao thức RTP:" |
| |
| #: ../../../developer/connection-manager.md:40 |
| msgid "16 bits are used to store the length of the body." |
| msgstr "16 bit được sử dụng để lưu trữ chiều dài của cơ thể." |
| |
| #: ../../../developer/connection-manager.md:41 |
| msgid "16 bits for the channel id (destination)" |
| msgstr "16 bit cho ID kênh (các điểm đến)" |
| |
| #: ../../../developer/connection-manager.md:42 |
| msgid "body" |
| msgstr "cơ thể" |
| |
| #: ../../../developer/connection-manager.md:44 |
| msgid "So all packets have a 32 bits len header." |
| msgstr "Tất cả các gói đều có len header 32 bit." |
| |
| #: ../../../developer/connection-manager.md:46 |
| msgid "" |
| "To ask for a new channel, the ConnectionManager will send a `ChannelRequest`" |
| " object (msgpack is used to serialize the struct) in the channel 0 to send " |
| "the id and the name of the new channel to the peer (with `isAnswer = " |
| "false`). The peer will call the callback given with ̀ void " |
| "onChannelRequest(ChannelRequestCallBack&& cb);` and will refuse or accept " |
| "the request. If accepted, the peer will answer with a ChannelRequest with " |
| "the same data (and ̀`isAnswer = true`) and then both peers callbacks will be" |
| " triggered to inform that the ChannelSock is usable." |
| msgstr "" |
| "Để yêu cầu một kênh mới, ConnectionManager sẽ gửi một đối tượng " |
| "`ChannelRequest` (msgpack được sử dụng để xoay trình cấu trúc) trong kênh 0 " |
| "để gửi id và tên của kênh mới cho người ngang hàng (với `isAnswer = false`)." |
| " Người ngang hàng sẽ gọi lại cuộc gọi được đưa ra với ̀ void " |
| "trênChannelRequest(ChannelRequestCallBack&&& cb);` và sẽ từ chối hoặc chấp " |
| "nhận yêu cầu. Nếu được chấp nhận, người ngang hàng sẽ trả lời bằng một " |
| "ChannelRequest với cùng dữ liệu (và ̀`isAnswer = true`) và sau đó cả hai " |
| "người ngang hàng sẽ được kích hoạt để thông báo rằng ChannelSock có thể sử " |
| "dụng." |
| |
| #: ../../../developer/connection-manager.md:48 |
| msgid "Closing a channel" |
| msgstr "Đóng một kênh" |
| |
| #: ../../../developer/connection-manager.md:50 |
| msgid "" |
| "A *EOF* is transmitted for a channel if the length of the content is 0." |
| msgstr "Một *EOF* được truyền cho một kênh nếu chiều dài của nội dung là 0." |
| |
| #: ../../../developer/connection-manager.md:52 |
| msgid "Structure of the connectionManager" |
| msgstr "Cấu trúc kết nốiManager" |
| |
| #: ../../../developer/connection-manager.md:54 |
| msgid "Ownership" |
| msgstr "Chủ sở hữu" |
| |
| #: ../../../developer/connection-manager.md:56 |
| msgid "" |
| "A JamiAccount owns the ConnectionManager and have access to the " |
| "ChannelSocket objects (shared_ptr owned with the MultiplexedSocket." |
| msgstr "" |
| "Một JamiAccount sở hữu ConnectionManager và có quyền truy cập vào các đối " |
| "tượng ChannelSocket (shared_ptr thuộc sở hữu của MultiplexedSocket." |
| |
| #: ../../../developer/connection-manager.md:57 |
| msgid "The ConnectionManager owns MultiplexedSockets and ICE objects" |
| msgstr "ConnectionManager sở hữu MultiplexedSockets và các đối tượng ICE" |
| |
| #: ../../../developer/connection-manager.md:58 |
| msgid "" |
| "MultiplexedSockets owns the TLS transport and the ChannelSocket objects" |
| msgstr "" |
| "MultiplexedSockets sở hữu các giao thông TLS và các đối tượng ChannelSocket" |
| |
| #: ../../../developer/connection-manager.md:59 |
| msgid "ChannelSocket owns the data buffers" |
| msgstr "ChannelSocket sở hữu các bộ đệm dữ liệu" |
| |
| #: ../../../developer/connection-manager.md:61 |
| msgid "Roles" |
| msgstr "Vai trò" |
| |
| #: ../../../developer/connection-manager.md:63 |
| msgid "ConnectionManager is used to manage connections to peers." |
| msgstr "" |
| "ConnectionManager được sử dụng để quản lý kết nối với các đồng nghiệp." |
| |
| #: ../../../developer/connection-manager.md:64 |
| msgid "" |
| "MultiplexedSockets are used to send data over the TLSSocket, read the " |
| "incoming packets and manage channels." |
| msgstr "" |
| "MultiplexedSockets được sử dụng để gửi dữ liệu qua TLSSocket, đọc các gói " |
| "tin nhập và quản lý kênh." |
| |
| #: ../../../developer/connection-manager.md:65 |
| msgid "ChannelSockets are used by the client to interact with the other peer." |
| msgstr "" |
| "ChannelSockets được sử dụng bởi khách hàng để tương tác với người đồng " |
| "nghiệp khác." |
| |
| #: ../../../developer/connection-manager.md:67 ../../../developer/swarm.md:620 |
| msgid "Usage" |
| msgstr "Sử dụng" |
| |
| #: ../../../developer/connection-manager.md:69 |
| msgid "" |
| "Scenarios are described in the corresponding unit tests " |
| "(`test/unitTest/connectionManager/connectionManager.cpp`)" |
| msgstr "" |
| "Các kịch bản được mô tả trong các thử nghiệm đơn vị tương ứng " |
| "(`test/unitTest/connectionManager/connectionManager.cpp`)" |
| |
| #: ../../../developer/contact-management.md:1 |
| msgid "Contact management" |
| msgstr "Quản lý liên lạc" |
| |
| #: ../../../developer/contact-management.md:4 |
| msgid "" |
| "This section will present how to find and add a contact from the DHT to the " |
| "client. The usage of a name server will not be explained here. If you'd " |
| "like more details about that, please read {doc}`name-server-protocol`." |
| msgstr "" |
| "Phần này sẽ trình bày cách tìm và thêm một liên hệ từ DHT cho khách hàng. " |
| "Việc sử dụng máy chủ tên sẽ không được giải thích ở đây. Nếu bạn muốn biết " |
| "thêm chi tiết về điều đó, vui lòng đọc {doc}`name-server-protocol`." |
| |
| #: ../../../developer/contact-management.md:6 |
| msgid "Presence on the network" |
| msgstr "Sự hiện diện trên mạng" |
| |
| #: ../../../developer/contact-management.md:8 |
| msgid "Announce the presence on the DHT" |
| msgstr "Thông báo sự hiện diện trên DHT" |
| |
| #: ../../../developer/contact-management.md:10 |
| msgid "" |
| "The presence is pretty simple to announce on the DHT. In fact, it's just a " |
| "value containing the device hash (see the previous section, {doc}`account-" |
| "management`) on the hash corresponding to the fingerprint of the key. So, if" |
| " we have the account `bf5f1e21d3eb2c1246946aa49d5dcf3e5b9cb1b9` with the " |
| "device `62fbdff0ce86f368c7d3c2682539e5ba9e06404f`, the following defined " |
| "value will be sent over the DHT:" |
| msgstr "" |
| "Sự hiện diện khá đơn giản để thông báo trên DHT. Trên thực tế, nó chỉ là một" |
| " giá trị chứa hash thiết bị (xem phần trước, {doc}`account-management`) trên" |
| " hash tương ứng với dấu vân tay của khóa. Vì vậy, nếu chúng ta có tài khoản " |
| "`bf5f1e21d3eb2c1246946aa49d5dcf3e5b9cb1b9` với thiết bị " |
| "`62fbdff0ce86f368c7d3c2682539e5ba9e06404f`, giá trị được xác định sau đây sẽ" |
| " được gửi qua DHT:" |
| |
| #: ../../../developer/contact-management.md:29 |
| msgid "" |
| "(This value can be put with `dht_.put(h, VALUE, dht::DoneCallback{}, {}, " |
| "true);`, as a permanent put). If the device is announced, the device is " |
| "present. For now, there is no way to delete or edit a value on the DHT (this" |
| " will come when OpenDHT will supports ECC). So, the presence always have a " |
| "delay for now (mean delay: expire-time/2, so 2min30 for now)." |
| msgstr "" |
| "(Thiết định này có thể được đặt bằng `dht_.put(h, VALUE, " |
| "dht::DoneCallback{}, {}, true);`, như một định nghĩa vĩnh viễn). Nếu thiết " |
| "bị được công bố, thiết bị hiện diện. Hiện tại, không có cách nào để xóa hoặc" |
| " chỉnh sửa một giá trị trên DHT (điều này sẽ xảy ra khi OpenDHT hỗ trợ ECC)." |
| " Vì vậy, sự hiện diện luôn có sự chậm trễ cho bây giờ (tương đương chậm trễ:" |
| " hết thời gian/2, vì vậy 2min30 cho bây giờ)." |
| |
| #: ../../../developer/contact-management.md:31 |
| msgid "Get if a contact is present" |
| msgstr "Hãy gọi nếu có liên lạc" |
| |
| #: ../../../developer/contact-management.md:33 |
| msgid "" |
| "Now our presence on the network, it's time to get if somebody is present on " |
| "the DHT. With the previous section, it's easy to do the reverse process. To " |
| "know if somebody is present on the DHT (ex: " |
| "`bf5f1e21d3eb2c1246946aa49d5dcf3e5b9cb1b9`), we have to get value at " |
| "`bf5f1e21d3eb2c1246946aa49d5dcf3e5b9cb1b9` and retrieve the " |
| "`DeviceAnnouncement` on this hash. The related code in the ring daemon is in" |
| " `ringaccount.cpp`:" |
| msgstr "" |
| "Bây giờ sự hiện diện của chúng tôi trên mạng, đó là thời gian để có được nếu" |
| " có ai đó có mặt trên DHT. Với phần trước, nó dễ dàng để làm quá trình ngược" |
| " lại. Để biết nếu có ai đó có mặt trên DHT (ví dụ: " |
| "`bf5f1e21d3eb2c1246946aa49d5dcf3e5b9b9b`), chúng ta phải có được giá trị tại" |
| " `bf5f1e21d3eb2c1246946aa49d5dcf3e5b9cb1b9` và lấy `DeviceAnnouncement` trên" |
| " hash này. Mã liên quan trong daemon vòng là trong `ccount.cpp`:" |
| |
| #: ../../../developer/contact-management.md:66 |
| msgid "And that's all." |
| msgstr "Và đó là tất cả." |
| |
| #: ../../../developer/contact-management.md:68 |
| msgid "Client perspective" |
| msgstr "" |
| |
| #: ../../../developer/contact-management.md:139 |
| msgid "" |
| "Are the main APIs for clients. `subscribeBuddy` will listen on the DHT to " |
| "detect presence changes and `newBuddyNotification` will be sent whenever a " |
| "new status is detected:" |
| msgstr "" |
| |
| #: ../../../developer/contact-management.md:140 |
| msgid "" |
| "The status sent to the client is now 0=offline (no device found on the DHT)," |
| " 1=dht_presence (at least a device is found on the DHT), 2=connected (with a" |
| " TCP + SIP channel, so ready to exchange data)." |
| msgstr "" |
| |
| #: ../../../developer/contact-management.md:141 |
| msgid "" |
| "`lineStatus` will contain any custom status sent by the peer (e.g. *Lunch " |
| "Time!*)" |
| msgstr "" |
| |
| #: ../../../developer/contact-management.md:143 |
| msgid "" |
| "`publish` is used for publishing a custom note (`status` is ignored for Jami" |
| " accounts, note will contain the custom status)." |
| msgstr "" |
| |
| #: ../../../developer/contact-management.md:145 |
| msgid "RFC3863 is used to send status over the SIP connection." |
| msgstr "" |
| |
| #: ../../../developer/contact-management.md:147 |
| msgid "Pending request" |
| msgstr "Đơn xin chờ" |
| |
| #: ../../../developer/contact-management.md:149 |
| msgid "Send a request" |
| msgstr "Gửi yêu cầu" |
| |
| #: ../../../developer/contact-management.md:151 |
| msgid "**TODO craft request**" |
| msgstr "**Thiếu nại tàu TODO**" |
| |
| #: ../../../developer/contact-management.md:153 |
| msgid "" |
| "Finally, once the trust request is crafted, we can push the request to the " |
| "following hash: `InfoHash(\"inbox:\" + deviceId)`" |
| msgstr "" |
| "Cuối cùng, một khi yêu cầu tin tưởng được tạo ra, chúng ta có thể đẩy yêu " |
| "cầu đến hash sau: `InfoHash(\"inbox:\" + deviceId) `" |
| |
| #: ../../../developer/contact-management.md:155 |
| msgid "The following code is used in the daemon:" |
| msgstr "Mã sau được sử dụng trong daemon:" |
| |
| #: ../../../developer/contact-management.md:160 |
| msgid "Receiving a request" |
| msgstr "Nhận yêu cầu" |
| |
| #: ../../../developer/contact-management.md:164 |
| msgid "(Accept/Block/Discard)" |
| msgstr "(Tình dụng chấp nhận/đấu trừ/đánh giá)" |
| |
| #: ../../../developer/contact-management.md:166 |
| msgid "Daemon API" |
| msgstr "Daemon API" |
| |
| #: ../../../developer/contact-management.md:168 |
| msgid "" |
| "All methods to follow the presence of a buddy is located in the " |
| "`PresenceManager` such as:" |
| msgstr "" |
| "Tất cả các phương pháp để theo dõi sự hiện diện của một bạn bè được tìm thấy" |
| " trong `PresenceManager` như:" |
| |
| #: ../../../developer/contact-management.md:199 |
| msgid "" |
| "All methods and signals used to manage trust requests and contacts are in " |
| "the `ConfigurationManager` such as:" |
| msgstr "" |
| "Tất cả các phương pháp và tín hiệu được sử dụng để quản lý yêu cầu và liên " |
| "lạc tin cậy đều nằm trong `ConfigurationManager` như:" |
| |
| #: ../../../developer/contact-management.md:291 |
| msgid "" |
| "If you want some examples, these methods are used into `contactmodel.cpp` in" |
| " LRC." |
| msgstr "" |
| "Nếu bạn muốn một số ví dụ, các phương pháp này được sử dụng trong " |
| "`contactmodel.cpp` trong LRC." |
| |
| #: ../../../developer/debugging-tools.rst:2 |
| msgid "Debugging Tools" |
| msgstr "Các công cụ gỡ lỗi" |
| |
| #: ../../../developer/debugging-tools.rst:4 |
| msgid "" |
| "There are several ways to debug Jami from a developer perspective, depending" |
| " on what you want to debug." |
| msgstr "" |
| "Có nhiều cách để gỡ lỗi Jami từ góc độ của nhà phát triển, tùy thuộc vào " |
| "những gì bạn muốn gỡ lỗi." |
| |
| #: ../../../developer/debugging-tools.rst:7 |
| msgid "Loggers" |
| msgstr "Các nhà làm gỗ" |
| |
| #: ../../../developer/debugging-tools.rst:9 |
| msgid "" |
| "The first way is to use runtime loggers. Starting `jami` with `-d` will " |
| "enable logging by the deamon (or the Troubleshoot section in the General " |
| "settings). Because Jami uses several libraries, we do not enable all logs by" |
| " default. But you can pass some environment variables to show it:" |
| msgstr "" |
| "Cách đầu tiên là sử dụng các lập trình ghi thời gian chạy. Bắt đầu `jami` " |
| "với `-d` sẽ cho phép ghi bằng diamon (hoặc phần Giải quyết vấn đề trong cài " |
| "đặt chung). Bởi vì Jami sử dụng nhiều thư viện, chúng tôi không cho phép tất" |
| " cả các nhật ký mặc định. Nhưng bạn có thể vượt qua một số biến môi trường " |
| "để hiển thị nó:" |
| |
| #: ../../../developer/debugging-tools.rst:13 |
| msgid "`SIPLOGLEVEL=5` for enabling logs from PJSIP." |
| msgstr "`SIPLOGLEVEL=5` cho việc cho phép các nhật ký từ PJSIP." |
| |
| #: ../../../developer/debugging-tools.rst:14 |
| msgid "`DHTLOGLEVEL=5` for enabling logs from OpenDHT." |
| msgstr "`DHTLOGLEVEL=5` cho việc cho phép các nhật ký từ OpenDHT." |
| |
| #: ../../../developer/debugging-tools.rst:15 |
| msgid "`AVLOGLEVEL=50` for enabling logs from ffmpeg." |
| msgstr "`AVLOGLEVEL=50` cho việc cho phép các nhật ký từ ffmpeg." |
| |
| #: ../../../developer/debugging-tools.rst:18 |
| msgid "Debuggers" |
| msgstr "Dòng dỡ lỗi" |
| |
| #: ../../../developer/debugging-tools.rst:20 |
| msgid "" |
| "Generally your IDE has an embedded debuggger. Else, you can use `gdb` for " |
| "example to be able to add breakpoints, backtraces from crashes, print " |
| "internal structures, etc. You need to compile the project in *DEBUG* mode to" |
| " get debug symbols." |
| msgstr "" |
| "Thông thường IDE của bạn có một bộ gỡ lỗi nhúng. Nếu không, bạn có thể sử " |
| "dụng `gdb` ví dụ để có thể thêm điểm vỡ, dấu vết trở lại từ các vụ tai nạn, " |
| "in cấu trúc nội bộ, vv. Bạn cần biên dịch dự án trong chế độ *DEBUG* để có " |
| "được các biểu tượng gỡ lỗi." |
| |
| #: ../../../developer/debugging-tools.rst:24 |
| msgid "Some useful commands:" |
| msgstr "Một số lệnh hữu ích:" |
| |
| #: ../../../developer/debugging-tools.rst:26 |
| msgid "" |
| "`b file.cpp:line` - Add a breakpoint (*file.cpp:line* can be replaced by a " |
| "symbol)" |
| msgstr "" |
| "`b file.cpp:line` - Thêm một điểm chia tay (*file.cpp:line* có thể được thay" |
| " thế bằng một biểu tượng)" |
| |
| #: ../../../developer/debugging-tools.rst:27 |
| msgid "`t a a bt` - (thread apply all backtrace) to get all backtraces" |
| msgstr "" |
| "`t a a bt` - (thông áp dụng tất cả các backtrace) để có được tất cả các " |
| "backtrace" |
| |
| #: ../../../developer/debugging-tools.rst:28 |
| msgid "`Ctrl + X / A` - pass in graphical view" |
| msgstr "`Ctrl + X / A` - vượt qua trong hình ảnh" |
| |
| #: ../../../developer/debugging-tools.rst:29 |
| msgid "`p` - print an internal value." |
| msgstr "`p` - in một giá trị nội bộ." |
| |
| #: ../../../developer/debugging-tools.rst:32 |
| msgid "Profilers" |
| msgstr "Các hồ sơ" |
| |
| #: ../../../developer/debugging-tools.rst:34 |
| msgid "" |
| "Debuggers are useful, but they do not show real-time memory " |
| "consumption/network activity/CPU usage. For this, you can use the embedded " |
| "profiler in your IDE (from Android Studio or Qt Creator/Visual Studio for " |
| "example)." |
| msgstr "" |
| "Các trình gỡ lỗi hữu ích, nhưng chúng không hiển thị tiêu thụ bộ nhớ thời " |
| "gian thực / hoạt động mạng / sử dụng CPU." |
| |
| #: ../../../developer/debugging-tools.rst:39 |
| msgid "Address Sanitizer" |
| msgstr "Địa chỉ Tế liệu" |
| |
| #: ../../../developer/debugging-tools.rst:41 |
| msgid "" |
| "This can be useful to detect leaks, crashes, potential deadlocks at runtime." |
| " To enable this, you can compile the daemon with " |
| "`CXXFLAGS+=\"-fsanitize=address\"`. Other flags like `tsan` may be useful." |
| msgstr "" |
| "Điều này có thể hữu ích để phát hiện rò rỉ, tai nạn, ổ cắm tiềm ẩn trong " |
| "thời gian chạy. Để cho phép điều này, bạn có thể biên soạn daemon với " |
| "`CXXFLAGS+=\"-fsanitize=address\"`. Các cờ khác như `tsan` có thể hữu ích." |
| |
| #: ../../../developer/debugging-tools.rst:45 |
| msgid "Valgrind/Callgrind" |
| msgstr "Valgrind/Callgrind" |
| |
| #: ../../../developer/debugging-tools.rst:47 |
| msgid "" |
| "Valgrind is a tool to watch allocations, CPU usage and more and can be used " |
| "via: `valgrind --tool=callgrind ./jami -d`. This will make the application " |
| "very slow but can provide useful reports about memory allocation/performance" |
| " usage (**KCacheGrind** can be used to read reports)." |
| msgstr "" |
| "Valgrind là một công cụ để theo dõi phân bổ, sử dụng CPU và nhiều hơn nữa và" |
| " có thể được sử dụng thông qua: `valgrind --tool=callgrind./jami -d`. Điều " |
| "này sẽ làm cho ứng dụng chậm rất nhiều nhưng có thể cung cấp các báo cáo hữu" |
| " ích về phân bổ bộ nhớ / sử dụng hiệu suất (**KCacheGrind** có thể được sử " |
| "dụng để đọc báo cáo)." |
| |
| #: ../../../developer/debugging-tools.rst:52 |
| msgid "Tests" |
| msgstr "Các thử nghiệm" |
| |
| #: ../../../developer/debugging-tools.rst:54 |
| msgid "" |
| "Daemon has many tests and coverage enabled. If the daemon is built in static" |
| " (else private symbols will not be available), adding new tests can help to " |
| "reproduce bugs, solve bugs and avoid any regression. (cf. " |
| "`daemon/tests/unitTests``)" |
| msgstr "" |
| "Daemon có nhiều thử nghiệm và bảo hiểm được bật. Nếu daemon được xây dựng " |
| "trong tĩnh (không có các biểu tượng riêng tư khác), việc thêm các thử nghiệm" |
| " mới có thể giúp tái tạo lỗi, giải quyết lỗi và tránh bất kỳ sự lùi nào. " |
| "(xem `daemon/tests/unitTests``)" |
| |
| #: ../../../developer/debugging-tools.rst:59 |
| msgid "Agent" |
| msgstr "- Trưởng lý." |
| |
| #: ../../../developer/debugging-tools.rst:61 |
| msgid "" |
| "Tests are only using one daemon to simulate both peers. So it can be " |
| "difficult to test in various environments. Another possibility is to write a" |
| " scenario and run an agent (documentation is available in the daemon's " |
| "repository)." |
| msgstr "" |
| "Các thử nghiệm chỉ sử dụng một daemon để mô phỏng cả hai đồng nghiệp. Vì " |
| "vậy, có thể khó để thử nghiệm trong nhiều môi trường khác nhau. Một khả năng" |
| " khác là viết kịch bản và chạy một đại lý (tài liệu có sẵn trong kho lưu trữ" |
| " daemon)." |
| |
| #: ../../../developer/debugging-tools.rst:66 |
| msgid "LTTng" |
| msgstr "LTTng" |
| |
| #: ../../../developer/debugging-tools.rst:68 |
| msgid "" |
| "Finally, tracepoints can be created and analyzed. `daemon/tools/trace` " |
| "provide the documentation and some examples. The advantage of LTTng is that " |
| "it is quicker than logs, can be triggered by system events and can be used " |
| "with tracepoints already present in the kernel (so that it can be used with " |
| "tracepoints from network interfaces)." |
| msgstr "" |
| "Cuối cùng, các điểm theo dõi có thể được tạo và phân tích. " |
| "`daemon/tools/trace` cung cấp tài liệu và một số ví dụ." |
| |
| #: ../../../developer/delivery-status.md:1 |
| msgid "Synchronization of delivery status" |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:3 |
| msgid "" |
| "When we send a message to a conversation, the delivery status must be " |
| "explicit and understandable for the end user. So, Jami must offer the " |
| "possibility to know if the message was delivered to the other members of a " |
| "conversation and synchronize this status (sent and displayed) across " |
| "devices." |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:5 |
| msgid "How it works (backend)" |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:7 |
| msgid "" |
| "The status of messages is stored in the conversation layer via the variable " |
| "`messagesStatus (map<string, map<string, string>)` with the following " |
| "structure:" |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:19 |
| msgid "" |
| "The `fetch` status is the commitId of the last message fetched by the " |
| "member. The `fetched_ts` is the timestamp of the last message fetched by the" |
| " member. The `read` status is the commitId of the last message read by the " |
| "member. The `read_ts` is the timestamp of the last message read by the " |
| "member." |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:21 |
| msgid "" |
| "When a member fetches a message, the `fetch` status is updated with the " |
| "commitId of the message and the `fetched_ts` is updated with the timestamp " |
| "of the message. When a member reads a message, the `read` status is updated " |
| "with the commitId of the message and the `read_ts` is updated with the " |
| "timestamp of the message. This information is synced across devices and " |
| "other devices will update their internal structure if the timestamp is " |
| "newer." |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:23 |
| msgid "This information is stored in `conversation_data/xxxxxxxxx/status`." |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:25 |
| msgid "Client API" |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:27 |
| msgid "" |
| "The client should get status from the current **SwarmMessage** structure " |
| "when loading conversation and update the status via " |
| "`AccountMessageStatusChanged`. In `AccountMessageStatusChanged` the client " |
| "will have the commitId, peer uri and new status. So, this will correspond to" |
| " `message.status[uri]`." |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:30 |
| msgid "SwarmMessage's status structure is:" |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:39 |
| msgid "" |
| "Where `uri` is the peer uri and `status` is the status of the message for " |
| "this peer (from the `MessageStates` enum)." |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:41 |
| msgid "" |
| "When sending a new message, the `status` map can be empty (because no one " |
| "fetched). By default, if there is no fetch/read information for a message, " |
| "the message MUST be considered as sending. The global status of a message is" |
| " the maximum of the status of all members except ourselves. For example, if " |
| "Alice sends a message and we have:" |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:48 |
| msgid "The global status is `sent`." |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:50 |
| msgid "Notes for client" |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:52 |
| msgid "" |
| "If the client wants to show which message is the last read message for a " |
| "member, they must check the index when responding to " |
| "`AccountMessageStatusChanged`. Because this signal can emit that a previous " |
| "message is displayed later." |
| msgstr "" |
| |
| #: ../../../developer/delivery-status.md:53 |
| msgid "" |
| "The status of a message can be used to create a detailed view of who " |
| "received/displayed a specific message. However, timestamps of those events " |
| "are not stored, because this would represent too much data." |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:1 |
| msgid "Design Process" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:6 |
| msgid "" |
| "Client: The person who is paying for the feature (and can be the PO because " |
| "it's a R&D project)" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:8 |
| #: ../../../developer/file-transfer.md:59 |
| msgid "Process" |
| msgstr "Quá trình" |
| |
| #: ../../../developer/design-process.md:10 |
| msgid "Ideas:" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:11 |
| msgid "The **client** come with a new Idea" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:12 |
| msgid "Ask for justifications:" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:14 |
| msgid "Who (user definitions)" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:15 |
| msgid "Why do we want this feature" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:16 |
| msgid "When do we want this feature" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:17 |
| msgid "Where do we want this feature (platforms)" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:18 |
| msgid "Priority" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:19 |
| msgid "Decide if we want or not this feature, Yes/No" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:20 |
| msgid "If yes, Brainstorming" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:21 |
| msgid "Should be the max of person (users/tech/**client**)" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:22 |
| msgid "" |
| "Produce a brief of the feature (User Story, Details from step 2, Notes from " |
| "Step 4.) => Meta ticket on GitLab" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:23 |
| msgid "Create UX Wireframe" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:24 |
| #: ../../../developer/design-process.md:27 |
| msgid "Validation (user/technical/**client**) Yes/No" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:25 |
| msgid "If no, return to step 6." |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:26 |
| msgid "If validated, POC (Adobe XD/Figma)" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:28 |
| msgid "If no, return to step 9." |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:29 |
| msgid "" |
| "Create sub-tickets (GitLab) with design specification, resources evaluation " |
| "(time/resource)" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:30 |
| msgid "Prioritize or stop the process (too much time needed)" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:31 |
| msgid "Develop" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:32 |
| msgid "Validate implementation (Design + **client**) - YES/No" |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:33 |
| msgid "If no return to 12." |
| msgstr "" |
| |
| #: ../../../developer/design-process.md:34 |
| msgid "If validated merge and release!" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:2 |
| msgid "Dynamic Routing Table (DRT)" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:4 |
| msgid "" |
| "The DRT is a novel concept utilized in swarm technology to maintain peer-to-" |
| "peer (P2P) connections. In this approach, group members establish a graph of" |
| " nodes, each identified by a unique hash, and these nodes must be " |
| "interconnected." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:6 |
| msgid "" |
| "Therefore, we require a structural framework that accomplishes the following" |
| " objectives:" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:8 |
| msgid "Maximizes the number of connected nodes at all times." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:9 |
| msgid "Minimizes message transmission times." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:10 |
| msgid "Reduces the number of links between peers." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:11 |
| msgid "Requires minimal computational resources." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:13 |
| msgid "Several solutions have been proposed to achieve these goals:" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:15 |
| msgid "" |
| "Each node is connected to the next node, resulting in only 'N' connections. " |
| "However, this approach is not efficient for transmitting messages since the " |
| "message must traverse all peers one by one." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:16 |
| msgid "" |
| "Every node is connected to all other nodes, leading to 'N x N' connections. " |
| "This configuration is effective for message transmission but demands more " |
| "resources. **This option will be selected for the first version.**" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:17 |
| msgid "" |
| "An alternative solution is presented in the paper titled [*Maximizing the " |
| "Coverage of Roadmap Graph for Optimal Motion " |
| "Planning*](https://www.hindawi.com/journals/complexity/2018/9104720/), which" |
| " offers optimal motion planning coverage but necessitates significant " |
| "computational calculations." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:18 |
| msgid "" |
| "Utilizing the DHT (Distributed Hash Table) algorithm for the routing table, " |
| "which effectively addresses all four points and is already employed by Jami " |
| "in their UDP implementation." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:20 |
| msgid "" |
| "Additionally, to optimize the number of sockets, a socket will be allocated " |
| "by a **ConnectionManager** to enable multiplexing sockets with a specific " |
| "hash. This means that if there is a need to transmit multiple files and " |
| "engage in a chat with someone, only one socket will be utilized." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:25 |
| msgid "**Notations:**" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:27 |
| msgid "`n`: Node identifier" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:28 |
| msgid "`N`: Number of nodes in the network" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:29 |
| msgid "`b`: Configuration parameter" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:31 |
| msgid "**Terms and Concepts:**" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:33 |
| msgid "" |
| "**Mobile Node**: Some devices in the network can establish dynamic " |
| "connectivity, allowing them to quickly connect and disconnect to optimize " |
| "battery usage. Instead of maintaining a dedicated peer-to-peer socket with " |
| "these devices, the protocol opts to use existing sockets if available or " |
| "relies on push notifications to transmit information. These nodes are marked" |
| " with a dedicated flag in the protocol." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:35 |
| msgid "" |
| "**Bucket**: This class is used to manipulate and store connections and to " |
| "manage the state of nodes (connecting, known, mobile). Known nodes are used " |
| "when the connection with a node goes offline." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:37 |
| msgid "" |
| "**Routing Table**: It is employed to organize buckets, enabling the search " |
| "for nearest nodes and establishing the link between the swarm manager and " |
| "the DRT (Distributed Routing Table)." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:39 |
| msgid "" |
| "**Swarm Manager**: This component is responsible for managing the internal " |
| "logic and overseeing the distribution of connections within the network." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:41 |
| msgid "" |
| "**Swarm Protocol**: It is used for data exchange between peers. The " |
| "following types of data can be exchanged:" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:43 |
| msgid "Request (e.g., FIND): Query | num | nodeId" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:44 |
| msgid "Response (e.g., FOUND): Query | nodes | mobileNodes" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:45 |
| msgid "Message: Version | isMobile | Request or Response" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:49 |
| msgid "Algorithms comparison" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:52 |
| msgid "Chord" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:54 |
| msgid "" |
| "In a Chord network, each node is associated with a unique key computed using" |
| " either SHA-1 or MD5 hash functions. The nodes are organized into a ring in " |
| "increasing order, and each node maintains a routing table that stores " |
| "information about its nearest nodes. Each entry `i` in the routing table " |
| "contains nodes with keys such that :math:`hash = (n + 2i - 1) mod 2^m`, " |
| "where `m` represents the number of bits in the key." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:56 |
| msgid "" |
| "Every node is aware of its successors and predecessors in the Chord network." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:58 |
| msgid "" |
| "To retrieve data, a node sends a request to its immediate successor. If the " |
| "node possesses the required key, it responds; otherwise, it forwards the " |
| "request to its own successor." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:60 |
| msgid "" |
| "When adding a new node to the network, the node broadcasts messages to other" |
| " nodes to update their routing tables and ensure proper integration." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:62 |
| msgid "" |
| "If a node goes offline, it must update its routing table to reroute traffic " |
| "through other available nodes." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:64 |
| msgid "The distance between two nodes is: :math:`d(n1,n2,) = (n1-n2) mod 2b``" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:67 |
| msgid "The routing table size is: :math:`log{N}`" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:70 |
| msgid "The number of hops to get a value is: :math:`log{N}`" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:73 |
| msgid "" |
| "Sources: (Stoica, Morris, Karger, Kaashoek & Balakrishnan, 2001). (Liben-" |
| "Nowell, Balakrishnan & Karger, 2002)." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:79 |
| msgid "Pastry" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:81 |
| msgid "" |
| "In a Pastry network, each node is associated with a 128-bit identifier " |
| "generated from a hashing function. Pastry is commonly used with IP " |
| "addresses, and nodes are organized in a ring with increasing order. The " |
| "routing table is divided into segments, typically determined by :math:`128 /" |
| " 2b`, where :math:`b` is typically set to 4, and IP addresses are placed " |
| "within these segments." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:83 |
| msgid "" |
| "When a message needs to be transmitted to a leaf node, it is sent directly " |
| "to the intended recipient. If the message is not intended for a leaf node, " |
| "the network attempts to locate the nearest node and forwards the data to " |
| "that node for further transmission." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:85 |
| msgid "Distance is: :math:`d(n1,n2,) = (prefix(n1) - prefix(n2)) mod 2b`" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:88 |
| msgid "Size of the routing table: :math:`(2b - 1)log{_2}{N}`" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:91 |
| msgid "Number of hops to get a value: :math:`log{_2}{N}`" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:94 |
| msgid "where b is generally 2." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:96 |
| msgid "Sources: Tirée de Castro, Druschel, Hu, Rowstron (2002, p.3)21" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:100 |
| msgid "Kademlia" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:102 |
| msgid "" |
| "This algorithm is used by BitTorrent and Ethereum. In this scheme, each node" |
| " is assigned a 160-bit identifier, and nodes can be organized in a ring with" |
| " increasing order. Data is stored in the nearest nodes. However, the routing" |
| " table employs a binary tree structure with k-buckets (where k represents " |
| "the number of nodes in each bucket) to store information about the nearest " |
| "nodes." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:104 |
| msgid "" |
| "When a node connects to the DHT (Distributed Hash Table), it attempts to " |
| "populate the routing table by inserting discovered nodes into appropriate " |
| "buckets. If a bucket becomes full, a node may be ignored if it is too " |
| "distant; however, if the bucket represents the nearest available, it will be" |
| " split into two to accommodate the new node. When a new node is added, its " |
| "routing table is queried to obtain information about the nearest nodes." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:106 |
| msgid "" |
| "To retrieve a specific value, a node sends a request to the nearest node " |
| "with the corresponding hash." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:108 |
| msgid "Distance is :math:`d(n1, n2,) = n1 XOR n2`" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:111 |
| msgid "Size of the routing table: :math:`K \\times log{_2}{N}`" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:114 |
| msgid "Number of hops: :math:`log{_2}{N}`" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:117 |
| msgid "where b is generally 1." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:122 |
| msgid "" |
| "When starting Jami, every conversation initiates the creation of its routing" |
| " table. The initial step is to establish contact with a first node to begin " |
| "synchronization with other nodes. This process is known as \"bootstrapping\"" |
| " and consists of two main parts." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:124 |
| msgid "" |
| "The first part involves retrieving all known devices in a conversation. This" |
| " is accomplished by checking for known certificates in the repository or " |
| "verifying the presence of certain members on the DHT (Distributed Hash " |
| "Table). If a TCP connection already exists with any device in the " |
| "conversation, it will be utilized. Additionally, known nodes are injected " |
| "into the routing table." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:126 |
| msgid "" |
| "The routing table is subsequently updated whenever an event occurs on a " |
| "node." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:128 |
| msgid "" |
| "During routing table updates, the component will attempt to establish " |
| "connections with new nodes if necessary. The decision to connect to new " |
| "nodes is determined by the following conditions: - For the nearest bucket, a" |
| " connection attempt is made if :math:`(maxSize(Bucket) - connected nodes - " |
| "connecting nodes) > 0`. - For other buckets, a connection is initiated if " |
| ":math:`(maxSize(Bucket) - connecting nodes) > 0`." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:132 |
| msgid "" |
| "The distinction lies in the fact that, in the case of the nearest bucket, " |
| "the goal is to attempt to split buckets if required while compensating for " |
| "disconnections in other buckets. This is essential to maintain knowledge of " |
| "the nearest nodes." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:134 |
| msgid "" |
| "Upon connecting to a new node, a \"FIND\" request is sent to discover new " |
| "identifiers nearby and identify all mobile nodes. Subsequently, a \"FIND\" " |
| "request is sent every ten minutes to keep the routing table up to date." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:136 |
| msgid "" |
| "The primary class responsible for this process in the codebase is " |
| "`SwarmManager`, and the bootstrapping phase is handled within the " |
| "conversation's section." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst-1 |
| msgid "Global architecture" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:147 |
| msgid "Perfomance analysis" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:150 |
| msgid "Tools" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:152 |
| msgid "" |
| "To validate the implementation and performance of the DRT component, we have" |
| " developed several tools located in `daemon/tests/unitTest/swarm`, including" |
| " `swarm_spread`, `bootstrap`, and more." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:154 |
| msgid "To interpret the results, we utilize the following tools:" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:156 |
| msgid "`gcov` for test coverage analysis." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:157 |
| msgid "`ASan` to check for memory leaks and heap overflows." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:158 |
| msgid "`gdb` for debugging internal structures." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:160 |
| msgid "" |
| "While the major focus is on unit tests, for performance analysis, we rely on" |
| " `swarm_spread` to assess various aspects, including:" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:162 |
| msgid "The number of hops required for message transmission." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:163 |
| msgid "The number of messages received per node." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:164 |
| msgid "Determining the maximum and minimum messages received by each node." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:165 |
| msgid "Calculating the iterations needed to transmit a message to all nodes." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:166 |
| msgid "Measuring message reception times." |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:169 |
| msgid "Results" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst-1 |
| msgid "Number of iterations to send a message" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst-1 |
| msgid "Routing table size" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:181 |
| msgid "Future work" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:183 |
| msgid "" |
| "Dynamic bucket size limit to get different bucket size depending on how " |
| "large is the routing table" |
| msgstr "" |
| |
| #: ../../../developer/drt.rst:184 |
| msgid "Declining some connections to speed-up the transmission a bit" |
| msgstr "" |
| |
| #: ../../../developer/feature-requests.md:1 |
| msgid "Feature requests" |
| msgstr "Các yêu cầu tính năng" |
| |
| #: ../../../developer/feature-requests.md:4 |
| msgid "" |
| "This page exists to classify feature requests per users' feedback, to avoid " |
| "leaving tickets open for years. Under construction, will sort the tickets." |
| msgstr "" |
| "Trang này tồn tại để phân loại các yêu cầu tính năng theo phản hồi của người" |
| " dùng, để tránh để lại vé mở trong nhiều năm." |
| |
| #: ../../../developer/feature-requests.md:8 |
| msgid "SFL" |
| msgstr "SFL" |
| |
| #: ../../../developer/feature-requests.md:10 |
| msgid "" |
| "{daemon-issue}`Implement pipewire <13> to support screen sharing on Wayland`" |
| " -> Contact #Jami (Adrien, Sébastien, etc.) / hard / In progress" |
| msgstr "" |
| "{daemon-issued}`Implement pipewire <13> để hỗ trợ chia sẻ màn hình trên " |
| "Wayland` -> Liên hệ #Jami (Adrien, Sébastien, vv) / hard / đang tiến hành" |
| |
| #: ../../../developer/feature-requests.md:12 |
| msgid "Connectivity -> Contact #Jami (Sébastien) / medium:" |
| msgstr "Kết nối -> Liên hệ #Jami (Sébastien) / phương tiện:" |
| |
| #: ../../../developer/feature-requests.md:13 |
| msgid "TURN ipv6 support" |
| msgstr "hỗ trợ TURN ipv6" |
| |
| #: ../../../developer/feature-requests.md:14 |
| msgid "connection ipv6 only<->ipv4 only" |
| msgstr "kết nối ipv6 chỉ<->ipv4 chỉ" |
| |
| #: ../../../developer/feature-requests.md:15 |
| msgid "SIP:" |
| msgstr "SIP:" |
| |
| #: ../../../developer/feature-requests.md:16 |
| msgid "Fix IP to IP -> Contact #Jami (Adrien, Sébastien) / easy" |
| msgstr "Xác định IP đến IP -> Liên hệ #Jami (Adrien, Sébastien) / dễ dàng" |
| |
| #: ../../../developer/feature-requests.md:17 |
| msgid "Add unit-tests / probably easy" |
| msgstr "Thêm các unit test / có lẽ dễ dàng" |
| |
| #: ../../../developer/feature-requests.md:18 |
| msgid "" |
| "Search in system contacts ({client-gnome-issue}`1191`, {client-gnome-" |
| "issue}`829`, etc.) -> Contact #Jami (Adrien, Sébastien, Andreas, etc.) / " |
| "easy but long" |
| msgstr "" |
| "Tìm kiếm trong các liên hệ hệ thống ({client-gnome-issued}`1191`, {client-" |
| "gnome-issued}`829`, vv.) -> Liên hệ #Jami (Adrien, Sébastien, Andreas, vv.) " |
| "/ dễ dàng nhưng dài" |
| |
| #: ../../../developer/feature-requests.md:21 |
| msgid "Crypto: (Contact #Jami - Adrien)" |
| msgstr "Crypto: (Công nối #Jami - Adrien)" |
| |
| #: ../../../developer/feature-requests.md:22 |
| msgid "Update media RTP ciphers for ffmpeg / probably easy" |
| msgstr "Cập nhật mã RTP phương tiện truyền thông cho ffmpeg / có lẽ dễ dàng" |
| |
| #: ../../../developer/feature-requests.md:23 |
| msgid "Support ECC (instead RSA) for Jami accounts / hard but short" |
| msgstr "Hỗ trợ ECC (trừ RSA) cho các tài khoản Jami / cứng nhưng ngắn" |
| |
| #: ../../../developer/feature-requests.md:24 |
| msgid "Remove usages of SHA1 (ids + git) / hard" |
| msgstr "Xóa sử dụng của SHA1 (ids + git) / hard" |
| |
| #: ../../../developer/feature-requests.md:25 |
| msgid "Media -> Contact #Jami (Adrien, Andreas, etc.)" |
| msgstr "Truyền thông -> Liên hệ với #Jami (Adrien, Andreas, vv)" |
| |
| #: ../../../developer/feature-requests.md:26 |
| msgid "{daemon-issue}`POC for AV1 support <27>` / probably hard" |
| msgstr "{daemon-issued}`POC cho AV1 hỗ trợ <27>` / có lẽ khó khăn" |
| |
| #: ../../../developer/feature-requests.md:27 |
| msgid "Investigate audio quality (contact #Jami, medium difficulty)" |
| msgstr "" |
| "Xét nghiệm chất lượng âm thanh (tham liên hệ #Jami, khó khăn trung bình)" |
| |
| #: ../../../developer/feature-requests.md:28 |
| msgid "Plugins ideas: (Contact #Jami - Aline)" |
| msgstr "Ý tưởng Plugins: (Công nối #Jami - Aline)" |
| |
| #: ../../../developer/feature-requests.md:29 |
| msgid "{plugins-issue}`Payment plug-in <27>`" |
| msgstr "{plugins-issues}` thanh toán <27>`" |
| |
| #: ../../../developer/feature-requests.md:30 |
| msgid "A chat-GPT plugin" |
| msgstr "Một plugin chat-GPT" |
| |
| #: ../../../developer/feature-requests.md:31 |
| msgid "Add new transports (e.g. QUIC?)" |
| msgstr "Thêm các phương tiện vận chuyển mới (ví dụ: QUIC?)" |
| |
| #: ../../../developer/feature-requests.md:32 |
| msgid "Add libtorrent support?" |
| msgstr "Thêm sự hỗ trợ giải phóng?" |
| |
| #: ../../../developer/feature-requests.md:33 |
| msgid "" |
| "Public page/personal blog available through Jami (Contact #Jami / medium " |
| "difficulty & long term project)" |
| msgstr "" |
| "Trang công cộng/blog cá nhân có sẵn thông qua Jami (Contact #Jami / dự án " |
| "khó khăn trung bình & dài hạn)" |
| |
| #: ../../../developer/feature-requests.md:35 |
| msgid "Qt:" |
| msgstr "Qt:" |
| |
| #: ../../../developer/feature-requests.md:36 |
| msgid "" |
| "{client-qt-issue}`Add support for peer discovery<868>` (contact #Jami - " |
| "easy)" |
| msgstr "" |
| "{client-qt-issue}`T thêm hỗ trợ cho khám phá đồng nghiệp<868>` (contact " |
| "#Jami - dễ dàng)" |
| |
| #: ../../../developer/feature-requests.md:37 |
| msgid "" |
| "Emoji as a native component to avoid depending on qt-webengine for this (not" |
| " available on macOS) (e.g. https://github.com/jnodev/QMLemoji)" |
| msgstr "" |
| "Emoji như một thành phần bản địa để tránh phụ thuộc vào qt-webengine cho " |
| "điều này (không có sẵn trên macOS) (ví dụ " |
| "https://github.com/jnodev/QMLemoji)" |
| |
| #: ../../../developer/feature-requests.md:39 |
| msgid "" |
| "Categorized conversations (like favorites, groups, etc) (to discuss with " |
| "#Jami)" |
| msgstr "" |
| "Các cuộc trò chuyện được phân loại (như người yêu thích, nhóm, vv) (để thảo " |
| "luận với #Jami)" |
| |
| #: ../../../developer/feature-requests.md:40 |
| msgid "jami-web:" |
| msgstr "jami-web:" |
| |
| #: ../../../developer/feature-requests.md:41 |
| msgid "" |
| "Design architecture to support calls between jami-web and desktop versions " |
| "-> Contact #Jami (Adrien, Sébastien) / hard" |
| msgstr "" |
| "Thiết kế kiến trúc để hỗ trợ cuộc gọi giữa các phiên bản jami-web và máy " |
| "tính để bàn -> Liên hệ #Jami (Adrien, Sébastien) / hard" |
| |
| #: ../../../developer/feature-requests.md:44 |
| msgid "" |
| "Help for the Roadmap 2023: " |
| "https://git.jami.net/groups/savoirfairelinux/-/epics/48" |
| msgstr "" |
| "Hỗ trợ cho lộ trình 2023: " |
| "https://git.jami.net/groups/savoirfairelinux/-/epics/48" |
| |
| #: ../../../developer/feature-requests.md:46 |
| msgid "Some other ideas from tickets:" |
| msgstr "Một vài ý tưởng khác từ vé:" |
| |
| #: ../../../developer/feature-requests.md:48 |
| msgid "Planned/In progress" |
| msgstr "Kế hoạch/Tạm dịch" |
| |
| #: ../../../developer/feature-requests.md:50 |
| msgid "" |
| "Improve Jami on Yocto (some codecs problems/lag on i.MX 6) -> Contact Rennes" |
| msgstr "" |
| "Cải thiện Jami trên Yocto (một số vấn đề codec/trễ trên i.MX 6) -> Liên hệ " |
| "Rennes" |
| |
| #: ../../../developer/feature-requests.md:52 |
| msgid "" |
| "[Qt/QML Improve client](https://git.jami.net/savoirfairelinux/jami-client-" |
| "qt/-/issues) -> Contact #Jami (Andreas)" |
| msgstr "" |
| "[Qt/QML Improve client](https://git.jami.net/savoirfairelinux/jami-client-" |
| "qt/-/issues) -> Liên hệ với #Jami (Andreas)" |
| |
| #: ../../../developer/feature-requests.md:54 |
| msgid "Redo emoji-picker with native component" |
| msgstr "Tạo lại emoji-picker với thành phần bản địa" |
| |
| #: ../../../developer/feature-requests.md:55 |
| msgid "Implement designs from Charlotte" |
| msgstr "Các thiết kế thực hiện từ Charlotte" |
| |
| #: ../../../developer/feature-requests.md:56 |
| msgid "Help for swarms (Sébastien)" |
| msgstr "Giúp cho đàn đàn (Sébastien)" |
| |
| #: ../../../developer/feature-requests.md:57 |
| msgid "" |
| "{gerrit-project}`jami-web`; because installing an app can be boring. Joining" |
| " a conference via a link can be cool. For now, nobody is working on it." |
| msgstr "" |
| "{gerrit-project}`jami-web`; vì cài đặt một ứng dụng có thể nhàm chán. tham " |
| "gia một hội nghị thông qua một liên kết có thể rất tuyệt vời." |
| |
| #: ../../../developer/feature-requests.md:61 |
| msgid "Wanted but not planned" |
| msgstr "Được tìm nhưng không có kế hoạch" |
| |
| #: ../../../developer/feature-requests.md:63 |
| #: ../../../developer/feature-requests.md:93 |
| msgid "?" |
| msgstr "- Không." |
| |
| #: ../../../developer/feature-requests.md:65 |
| msgid "" |
| "Can be implemented, contributions welcome (or will take months/years to " |
| "come)" |
| msgstr "" |
| "Có thể được thực hiện, đóng góp được chấp nhận (hoặc sẽ mất nhiều tháng/năm " |
| "tới)" |
| |
| #: ../../../developer/feature-requests.md:67 |
| msgid "" |
| "{project-issue}`add possibility to show \"reachable at the following times\"" |
| " (contact details) <1261>`" |
| msgstr "" |
| "{ dự án- vấn đề}` thêm khả năng hiển thị \"có thể truy cập vào các thời điểm" |
| " sau\" (dữ liệu liên lạc) <1261>`" |
| |
| #: ../../../developer/feature-requests.md:69 |
| msgid "" |
| "{project-issue}`Preferences per contact (allow calls, file transfer, custom " |
| "ringtone) <1280>`" |
| msgstr "" |
| "{project-issue}`Tích thích cho mỗi liên lạc (cho phép gọi, chuyển tập tin, " |
| "âm thanh gọi tùy chỉnh) <1280>`" |
| |
| #: ../../../developer/feature-requests.md:71 |
| msgid "" |
| "{project-issue}`Ability to create polls (ideally a plugin with swarm) " |
| "<1254>`" |
| msgstr "" |
| "{ dự án- vấn đề}`Sự tạo ra các cuộc thăm dò (hiện là một plugin với đám " |
| "đông) <1254>`" |
| |
| #: ../../../developer/feature-requests.md:73 |
| msgid "{project-issue}`Support for Panic buttons <623>`" |
| msgstr "{ dự án- vấn đề}`Điều trợ cho các nút hoảng loạn <623>`" |
| |
| #: ../../../developer/feature-requests.md:74 |
| msgid "Matrix bridge" |
| msgstr "Cầu Matrix" |
| |
| #: ../../../developer/feature-requests.md:75 |
| msgid "" |
| "Full TOR support or other alternatives such as lokinet ({project-" |
| "issue}`922`, {project-issue}`622`, {project-issue}`495`), {project-" |
| "issue}`i2p <630>`" |
| msgstr "" |
| "Sự hỗ trợ đầy đủ của TOR hoặc các lựa chọn thay thế khác như lokinet ({ dự " |
| "án-thể thức}`922`, { dự án-thể thức}`622`, { dự án-thể thức}`495`), { dự án-" |
| "thể thức}`i2p <630>`" |
| |
| #: ../../../developer/feature-requests.md:78 |
| msgid "{project-issue}`Bluetooth support <774>`" |
| msgstr "{ dự án- vấn đề}`Hỗ trợ Bluetooth <774>`" |
| |
| #: ../../../developer/feature-requests.md:79 |
| msgid "{project-issue}`Secret-based turn server <886>`" |
| msgstr "{ dự án- vấn đề}`Bộ mật dựa trên máy chủ lượt <886>`" |
| |
| #: ../../../developer/feature-requests.md:80 |
| msgid "{client-android-issue}`Ability to compress files before sending <720>`" |
| msgstr "{client-android-issue}`Khả năng nén các tệp trước khi gửi <720>`" |
| |
| #: ../../../developer/feature-requests.md:82 |
| msgid "Ability to trim recorded clips before sending" |
| msgstr "Khả năng cắt clip ghi âm trước khi gửi" |
| |
| #: ../../../developer/feature-requests.md:83 |
| msgid "{client-gnome-issue}`Spell checking support <1169>`" |
| msgstr "{client-gnome-issue}`Spell checking support <1169>`" |
| |
| #: ../../../developer/feature-requests.md:84 |
| msgid "{project-issue}`Echo bot to test audio <392>`" |
| msgstr "{ dự án- vấn đề}`Echo bot để kiểm tra âm thanh <392>`" |
| |
| #: ../../../developer/feature-requests.md:85 |
| msgid "" |
| "{project-issue}`Handle click on jami:uri system wide (missing " |
| "macOS/Android/iOS) <653>`" |
| msgstr "" |
| "{ dự án-thể thức}` Nhấp vào jami:uri hệ thống rộng (không có " |
| "macOS/Android/iOS) <653>`" |
| |
| #: ../../../developer/feature-requests.md:86 |
| msgid "" |
| "{project-issue}`Initial audio mode <1288>` (need to wait for group chat)" |
| msgstr "" |
| "{ dự án- vấn đề}`Luyện thoại âm thanh ban đầu <1288>` (nhanh chờ cho trò " |
| "chuyện nhóm)" |
| |
| #: ../../../developer/feature-requests.md:88 |
| msgid "{project-issue}`Feature Request: Volume Slider <1524>`" |
| msgstr "{ dự án-thế số}`Tình yêu cầu: Volume Slider <1524>`" |
| |
| #: ../../../developer/feature-requests.md:89 |
| msgid "{client-qt-issue}`Portable version for Windows <170>`" |
| msgstr "{client-qt-issue}` Phiên bản di động cho Windows <170>`" |
| |
| #: ../../../developer/feature-requests.md:91 |
| msgid "Depends on mass changes" |
| msgstr "Tùy thuộc vào sự thay đổi khối lượng" |
| |
| #: ../../../developer/feature-requests.md:95 |
| #: ../../../developer/release-process.md:0 |
| #: ../../../developer/release-process.md:59 |
| msgid "Packaging" |
| msgstr "Bao bì" |
| |
| #: ../../../developer/feature-requests.md:97 |
| msgid "{client-gnome-issue}`FreeBSD support <1272>`" |
| msgstr "{client-gnome-issue}`FreeBSD support <1272>" |
| |
| #: ../../../developer/feature-requests.md:99 |
| msgid "Others" |
| msgstr "Những người khác" |
| |
| #: ../../../developer/feature-requests.md:101 |
| msgid "{project-issue}`Collaborative editor <1010>`" |
| msgstr "{ dự án-thế số}`Tác giả cộng tác <1010>`" |
| |
| #: ../../../developer/feature-requests.md:102 |
| msgid "{project-issue}`A thunderbird plugin <516>`" |
| msgstr "{về dự án}`Một plugin thunderbird <516>`" |
| |
| #: ../../../developer/feature-requests.md:103 |
| msgid "{project-issue}`OpenAlias <928>`" |
| msgstr "{ dự án-thể thức}`OpenAlias <928>`" |
| |
| #: ../../../developer/feature-requests.md:104 |
| msgid "{project-issue}`CMIS integration <455>`" |
| msgstr "{ dự án- vấn đề}`CMIS tích hợp <455>`" |
| |
| #: ../../../developer/feature-requests.md:105 |
| msgid "{project-issue}`Sound safety <441>`" |
| msgstr "{ dự án- vấn đề}`Sự an toàn âm thanh <441>`" |
| |
| #: ../../../developer/feature-requests.md:106 |
| msgid "" |
| "{client-gnome-issue}`Ability to see multiple chats at the same time <909>`" |
| msgstr "{client-gnome-issue}`Sự xem nhiều cuộc trò chuyện cùng một lúc <909>`" |
| |
| #: ../../../developer/feature-requests.md:107 |
| msgid "{client-gnome-issue}`Vocoder option <957>`" |
| msgstr "{client-gnome-issue}`Vocoder option <957>`" |
| |
| #: ../../../developer/feature-requests.md:108 |
| msgid "{project-issue}`SOCKS5 support <430>`" |
| msgstr "{ dự án-thể thức}`SOCKS5 hỗ trợ <430>`" |
| |
| #: ../../../developer/feature-requests.md:109 |
| msgid "{project-issue}`Cardbook integration <383>`" |
| msgstr "{ dự án-thế độ}`Tích hợp sổ thẻ <383>`" |
| |
| #: ../../../developer/feature-requests.md:110 |
| msgid "{project-issue}`Multiple instances running <629>`" |
| msgstr "{ dự án- vấn đề}` Nhiều trường hợp chạy <629>`" |
| |
| #: ../../../developer/feature-requests.md:111 |
| msgid "{daemon-issue}`Whiteboard <181>`" |
| msgstr "{daemon-issued}` Whiteboard <181>`" |
| |
| #: ../../../developer/feature-requests.md:112 |
| msgid "{client-android-issue}`Camera zoom <979#note_29386>`" |
| msgstr "{client-android-issue}`Camera zoom <979#note_29386>`" |
| |
| #: ../../../developer/feature-requests.md:113 |
| msgid "{client-qt-issue}`Emoji reaction in calls <497>`" |
| msgstr "{client-qt-issue}`Tình thức phản ứng trong cuộc gọi <497>`" |
| |
| #: ../../../developer/feature-requests.md:114 |
| msgid "{client-android-issue}`Conversation's background <710>`" |
| msgstr "{client-android-issue}`Tầm lề cuộc trò chuyện <710>`" |
| |
| #: ../../../developer/feature-requests.md:115 |
| msgid "{project-issue}`[Desktop] Option to have a Window per Chat <633>`" |
| msgstr "" |
| "{ dự án- vấn đề}`[Desktop] Tùy chọn để có một cửa sổ mỗi trò chuyện <633>`" |
| |
| #: ../../../developer/feature-requests.md:116 |
| msgid "{project-issue}`Multiple text selection <1096>`" |
| msgstr "{ dự án-thế số}`Phác chọn văn bản nhiều <1096>`" |
| |
| #: ../../../developer/feature-requests.md:117 |
| msgid "{project-issue}`In-app sticker pack creation <1317>`" |
| msgstr "{ dự án-thế độ}`Tạo gói nhãn dán trong ứng dụng <1317>`" |
| |
| #: ../../../developer/feature-requests.md:118 |
| msgid "{project-issue}`Re-order messages <1357>`" |
| msgstr "{đề án-thể thức}`Tạm dịch:" |
| |
| #: ../../../developer/feature-requests.md:119 |
| msgid "{daemon-issue}`Remote control <349>`" |
| msgstr "{daemon-issued}`Xem xa <349>`" |
| |
| #: ../../../developer/feature-requests.md:120 |
| msgid "" |
| "{client-android-issue}`Locked messages (feature that can be enabled to hide " |
| "messages until they are clicked upon) <1146>`" |
| msgstr "" |
| "{client-android-issue}`Báo thư bị khóa (tương tự có thể được bật để ẩn các " |
| "tin nhắn cho đến khi chúng được nhấp vào) <1146>`" |
| |
| #: ../../../developer/feature-requests.md:121 |
| msgid "" |
| "{client-qt-issue}`selecting one or multiple messages and delete them just " |
| "for the user doing so <1188>`" |
| msgstr "" |
| |
| #: ../../../developer/feature-requests.md:122 |
| msgid "" |
| "{client-qt-issue}`Drag and drop files from chatview and send to other " |
| "contacts <485>`" |
| msgstr "" |
| |
| #: ../../../developer/file-transfer.md:1 ../../../developer/swarm.md:397 |
| #: ../../../developer/swarm.md:667 |
| msgid "File transfer" |
| msgstr "Chuyển tập tin" |
| |
| #: ../../../developer/file-transfer.md:4 |
| msgid "**THIS PAGE IS DEPRECATED: READ {ref}`developer/swarm:File transfer`**" |
| msgstr "**THÀI CHÂN HN HÔN: Đọc {ref}`developer/swarm:File transfer`**" |
| |
| #: ../../../developer/file-transfer.md:7 |
| #: ../../../developer/location-sharing.md:4 |
| msgid "How to use it?" |
| msgstr "Làm thế nào để sử dụng nó?" |
| |
| #: ../../../developer/file-transfer.md:10 |
| #: ../../../developer/release-process.md:111 |
| msgid "Gnome" |
| msgstr "Gnome" |
| |
| #: ../../../developer/file-transfer.md:12 |
| msgid "" |
| "For sending a file on gnome, in a conversation you need to click to the send" |
| " file icon at the bottom right of the conversation:" |
| msgstr "" |
| "Để gửi tập tin trên gnome, trong một cuộc trò chuyện bạn cần nhấp vào biểu " |
| "tượng gửi tập tin ở bên dưới bên phải của cuộc trò chuyện:" |
| |
| #: ../../../developer/file-transfer.md:15 |
| msgid "" |
| "![Gnome_send_file](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/e7571789effe8641f5ff4117e47f89dd/Gnome_send_file.png)" |
| msgstr "" |
| "![Gnome_send_file](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/e7571789effe8641f5ff4117e47f89dd/Gnome_send_file.png)" |
| |
| #: ../../../developer/file-transfer.md:15 |
| msgid "Gnome_send_file" |
| msgstr "Gnome_send_file" |
| |
| #: ../../../developer/file-transfer.md:17 |
| msgid "" |
| "Then you will see your image as soon as the transfer is finished (and show " |
| "images is activated)" |
| msgstr "" |
| "Sau đó bạn sẽ thấy hình ảnh của bạn ngay khi chuyển giao hoàn tất (và hiển " |
| "thị hình ảnh được kích hoạt)" |
| |
| #: ../../../developer/file-transfer.md:20 |
| msgid "" |
| "![Gnome_image](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/cc03387d134a9aa71c6deb60ccf53ed8/Gnome_image.png)" |
| msgstr "" |
| "! [Gnome_image](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/cc03387d134a9aa71c6deb60ccf53ed8/Gnome_image.png)" |
| |
| #: ../../../developer/file-transfer.md:20 |
| msgid "Gnome_image" |
| msgstr "Gnome_image" |
| |
| #: ../../../developer/file-transfer.md:22 |
| msgid "" |
| "On the contrary if you receive a file (and if it's not a picture < 20 " |
| "Mb), you will have to accept the transfer:" |
| msgstr "" |
| "Ngược lại nếu bạn nhận được một tập tin (và nếu nó không phải là một hình " |
| "ảnh < 20 Mb), bạn sẽ phải chấp nhận chuyển:" |
| |
| #: ../../../developer/file-transfer.md:25 |
| msgid "" |
| "![Gnome_accept](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/29dd852e062e7bcbcb654e4e7e3f8e47/Gnome_accept.png)" |
| msgstr "" |
| "[Gnome_accept](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/29dd852e062e7bcbcb654e4e7e3f8e47/Gnome_accept.png)" |
| |
| #: ../../../developer/file-transfer.md:25 |
| msgid "Gnome_accept" |
| msgstr "Gnome_accept" |
| |
| #: ../../../developer/file-transfer.md:27 |
| msgid "" |
| "And then the file will be sent. You have the possibility to cancel in a " |
| "middle of a transfer." |
| msgstr "" |
| "Và sau đó hồ sơ sẽ được gửi. Bạn có khả năng hủy bỏ trong một quá trình " |
| "chuyển nhượng." |
| |
| #: ../../../developer/file-transfer.md:30 |
| msgid "" |
| "![Gnome_ongoing](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/92f319f8a88f75c388020d999f607bdc/Gnome_ongoing.png)" |
| msgstr "" |
| "[Gnome_ongoing] [https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/92f319f8a88f75c388020d999f607bdc/Gnome_ongoing.png)" |
| |
| #: ../../../developer/file-transfer.md:30 |
| msgid "Gnome_ongoing" |
| msgstr "Gnome_ongoing" |
| |
| #: ../../../developer/file-transfer.md:32 |
| msgid "Android" |
| msgstr "Android" |
| |
| #: ../../../developer/file-transfer.md:34 |
| msgid "" |
| "When you are talking to somebody on Android, you have the possibility to " |
| "send a picture on your device or take a photo with these buttons:" |
| msgstr "" |
| "Khi bạn đang nói chuyện với ai đó trên Android, bạn có khả năng gửi một bức " |
| "ảnh trên thiết bị của mình hoặc chụp ảnh với các nút này:" |
| |
| #: ../../../developer/file-transfer.md:37 |
| msgid "" |
| "![Android_file_buttons](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/d68472b2c7bfcc616b0c674c9c7a8fed/Android_file_buttons.png)" |
| msgstr "" |
| "![Android_file_buttons](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/d68472b2c7bfcc616b0c674c9c7a8fed/Android_file_buttons.png)" |
| |
| #: ../../../developer/file-transfer.md:37 |
| msgid "Android_file_buttons" |
| msgstr "Android_file_buttons" |
| |
| #: ../../../developer/file-transfer.md:39 |
| msgid "" |
| "Note: when you send a file, the other has to accept it. At this moment you " |
| "will see 'awaiting peer':" |
| msgstr "Lưu ý: khi bạn gửi một tập tin, người khác phải chấp nhận nó." |
| |
| #: ../../../developer/file-transfer.md:42 |
| msgid "" |
| "![Android_awaiting_peer](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/56f0316c945ca243448668ae9091b1de/Android_awaiting_peer.png)" |
| msgstr "" |
| "! [Android_waiting_peer](https://git.jami.net/savoirfairelinux/jami-" |
| "project/uploads/56f0316c945ca243448668ae9091b1de/Android_waiting_peer.png)" |
| |
| #: ../../../developer/file-transfer.md:42 |
| msgid "Android_awaiting_peer" |
| msgstr "Android_waiting_peer" |
| |
| #: ../../../developer/file-transfer.md:44 |
| #: ../../../developer/location-sharing.md:39 |
| msgid "How it works? (technical)" |
| msgstr "Làm thế nào nó hoạt động?" |
| |
| #: ../../../developer/file-transfer.md:47 |
| msgid "How it works" |
| msgstr "Làm thế nào nó hoạt động" |
| |
| #: ../../../developer/file-transfer.md:51 |
| msgid "" |
| "Jami is a distributed application and has to work without any internet " |
| "connectivity. So, file transfer too! Basically, we use the same method to " |
| "perform file transfer and calls, but in TCP. To summarize how it works, we " |
| "can imagine a situation where Alice (A) wants to transfer a file to Bob (B)." |
| msgstr "" |
| "Jami là một ứng dụng phân tán và phải hoạt động mà không cần kết nối " |
| "internet. Vì vậy, chuyển tập tin cũng vậy! Về cơ bản, chúng tôi sử dụng cùng" |
| " một phương pháp để thực hiện chuyển tập tin và cuộc gọi, nhưng trong TCP. " |
| "Để tóm tắt cách nó hoạt động, chúng tôi có thể tưởng tượng một tình huống mà" |
| " Alice (A) muốn chuyển tập tin đến Bob (B)." |
| |
| #: ../../../developer/file-transfer.md:53 |
| msgid "" |
| "First, Alice will request a connection to Bob. To do that, Jami is using ICE" |
| " (RFC 6544), a protocol used to negotiate links between peers. Alice will " |
| "send, into an encrypted packet via the DHT the ip of its device. So, when " |
| "Bob receives the ips of Alice, they will be able to negotiate a transport " |
| "where Bob will be able to send packets to Alice. The negotiation can be " |
| "successful, but if it fails, a TURN server will be used (the one configured " |
| "into the settings) to perform the transfer. If the negotiation succeeds, Bob" |
| " will send its ips to Alice to perform the negotiation in the other " |
| "direction. Note that the link is still not secure, so Bob will send the ips " |
| "through the DHT in an encrypted message. If the second negotiation fails, " |
| "the TURN will be used as a fallback." |
| msgstr "" |
| "Trước tiên, Alice sẽ yêu cầu kết nối với Bob. Để làm điều đó, Jami đang sử " |
| "dụng ICE (RFC 6544), một giao thức được sử dụng để đàm phán liên kết giữa " |
| "các đồng nghiệp. Alice sẽ gửi, vào một gói mã hóa thông qua DHT IP của thiết" |
| " bị của mình. Vì vậy, khi Bob nhận được các ips của Alice, họ sẽ có thể đàm " |
| "phán một vận chuyển nơi Bob sẽ có thể gửi các gói cho Alice." |
| |
| #: ../../../developer/file-transfer.md:55 |
| msgid "" |
| "Now that the bidirectionnal TCP link is here, the next step will be to " |
| "negotiate a TLS 1.3 (generally a (TLS1.3)-(DHE-FFDHE8192)-(RSA-PSS-RSAE-" |
| "SHA384)-(AES-256-GCM) when I write these lines) between Alice an Bob, then " |
| "Alice will start to transfer the file." |
| msgstr "" |
| "Bây giờ khi liên kết TCP hai chiều ở đây, bước tiếp theo sẽ là đàm phán một " |
| "TLS 1.3 (thường là (TLS1.3) - DHE-FFDHE8192) - RSA-PSS-RSAE-SHA384) - " |
| "AES-256-GCM khi tôi viết những dòng này) giữa Alice và Bob, sau đó Alice sẽ " |
| "bắt đầu chuyển tập tin." |
| |
| #: ../../../developer/file-transfer.md:57 |
| msgid "" |
| "The first part will be a small header to describe the content of the file. " |
| "Then, after Bob accepts the transfer, the full file will be transmitted." |
| msgstr "Phần đầu tiên sẽ là một tiêu đề nhỏ để mô tả nội dung của tệp." |
| |
| #: ../../../developer/file-transfer.md:61 |
| msgid "Sending a file" |
| msgstr "Gửi tập tin" |
| |
| #: ../../../developer/file-transfer.md:63 |
| msgid "The following method is used:" |
| msgstr "Phương pháp sau đây được sử dụng:" |
| |
| #: ../../../developer/file-transfer.md:65 |
| msgid "" |
| "1\\. A client will call `DataTransferFacade::sendFile()`. " |
| "`DataTransferFacade` is the class corresponding to the API exposed for the " |
| "clients. It is used to manage a view of the file transfers (the " |
| "corresponding classes are `DataTransfer`, `IncomingFileTransfer`, " |
| "`OutgoingFileTransfer` and `SubOutgoingFileTransfer`). This method will ask " |
| "the linked `JamiAccount` to request a connection." |
| msgstr "" |
| "1\\. Một khách hàng sẽ gọi `DataTransferFacade::sendFile() `. " |
| "`DataTransferFacade` là lớp tương ứng với API được phơi bày cho khách hàng. " |
| "Nó được sử dụng để quản lý một dạng xem chuyển giao tệp (bản ứng lớp là " |
| "`DataTransfer`, `IncomingFileTransfer`, `OutgoingFileTransfer` và " |
| "`SubOutgoingFileTransfer`)." |
| |
| #: ../../../developer/file-transfer.md:67 |
| msgid "" |
| "![Diagram: DataTransfer class diagram]images/file-transfer-datatransfer-" |
| "class-diagram.png)" |
| msgstr "" |
| "![Chương trình: Chương trình lớp chuyển dữ liệu]photos/file-transfer-" |
| "dataatransfer-class-chương trình.png)" |
| |
| #: ../../../developer/file-transfer.md:69 |
| msgid "" |
| "2\\. The method `DhtPeerConnector: requestConnection()` is triggered and " |
| "creates a connection between all connected devices of the peer (found on the" |
| " DHT). `DhtPeerConnector` is used to manage the main event loop which manage" |
| " connections. When a device is found, the *event loop* will create a " |
| "`ClientConnector` (which manage the connection for one device) and launch " |
| "the `process()` method." |
| msgstr "" |
| "2\\. Phương pháp `DhtPeerConnector: requestConnection() ` được kích hoạt và " |
| "tạo ra kết nối giữa tất cả các thiết bị kết nối của peer (được tìm thấy trên" |
| " DHT). `DhtPeerConnector` được sử dụng để quản lý vòng lặp sự kiện chính " |
| "quản lý các kết nối. Khi một thiết bị được tìm thấy, vòng lặp sự kiện * sẽ " |
| "tạo ra một `ClientConnector` (để quản lý kết nối cho một thiết bị) và khởi " |
| "động phương pháp ` quy trình) `." |
| |
| #: ../../../developer/file-transfer.md:71 |
| msgid "" |
| "3\\. This method is used to initialize the ICE transport and put a " |
| "*PeerConnectionMsg* (which contains the SDP message, see below) on the DHT " |
| "and waits for a response (`DhtPeerConnector::Impl::onResponseMsg`)." |
| msgstr "" |
| "3\\. Phương pháp này được sử dụng để khởi động vận chuyển ICE và đặt một " |
| "*PeerConnectionMsg* (có chứa thông điệp SDP, xem bên dưới) trên DHT và chờ " |
| "đợi một phản ứng (`DhtPeerConnector::Impl::onResponseMsg`)." |
| |
| #: ../../../developer/file-transfer.md:73 |
| msgid "" |
| "4\\. Then a response is received from the DHT, which contains public " |
| "addresses of the peer device. We can now negotiate a TLS link (directly via " |
| "ICE, or via TURN as a fallback). This `TlsSocketEndpoint` is given to the " |
| "`PeerConnection` object as an output and the transfer can start." |
| msgstr "" |
| "4\\. Sau đó, một phản hồi được nhận từ DHT, chứa địa chỉ công cộng của thiết" |
| " bị đồng cấp. Bây giờ chúng ta có thể đàm phán một liên kết TLS (thương trực" |
| " qua ICE, hoặc qua TURN như một sự trở lại)." |
| |
| #: ../../../developer/file-transfer.md:75 |
| msgid "" |
| "5.\\ When the TLS socket is ready, the callback " |
| "`DataTransferFacade::Impl::onConnectionRequestReply` is called, and a " |
| "`OutgoingFileTransfer` is linked to the `PeerConnection` as an input. This " |
| "`OutgoingFileTransfer` contains a list of `SubOutgoingFileTransfer` (one per" |
| " device) where each sub transfer is a transfer to one device. We do that to " |
| "be able to furnish the most optimistic view of the transfer (if a contact as" |
| " 3 devices, where the contact cancel the transfer on one device, but " |
| "accepted the transfer on the two others, the most advanced transfer will be " |
| "shown)." |
| msgstr "" |
| "Khi ổ cắm TLS sẵn sàng, callback " |
| "`DataTransferFacade::Impl::onConnectionRequestReply` được gọi, và một " |
| "`OutgoingFileTransfer` được liên kết với `PeerConnection` như là đầu vào. " |
| "`OutgoingFileTransfer` này chứa một danh sách `SubOutgoingFileTransfer` (một" |
| " trên mỗi thiết bị) nơi mỗi chuyển tiếp là một chuyển tiếp đến một thiết bị." |
| " Chúng tôi làm điều đó để có thể cung cấp cái nhìn lạc quan nhất về chuyển " |
| "tiếp (nếu một liên lạc như 3 thiết bị, nơi liên lạc hủy chuyển tiếp trên một" |
| " thiết bị, nhưng chấp nhận chuyển tiếp trên hai thiết bị khác, sẽ hiển thị " |
| "chuyển tiếp tiên tiến nhất)." |
| |
| #: ../../../developer/file-transfer.md:77 |
| msgid "" |
| "6\\. The `SubOutgoingFileTransfer` will first transfer the header of the " |
| "file, wait the peer acceptance (A \"GO\\n\" message on the socket) and then " |
| "will send the file." |
| msgstr "" |
| "6\\. `SubOutgoingFileTransfer` sẽ chuyển đầu của tệp, chờ nhận bằng cấp (Một" |
| " thông điệp \"GO\\n\" trên ổ cắm) và sau đó sẽ gửi tệp." |
| |
| #: ../../../developer/file-transfer.md:79 |
| msgid "" |
| "7\\. If a cancel is received from the peer or the client or if the file " |
| "transfer finish, the connection will be closed via a `CANCEL` message on the" |
| " `DhtPeerConnector::eventLoop()` and the resources will be released." |
| msgstr "" |
| "7\\. Nếu nhận được một hủy từ người đồng nghiệp hoặc khách hàng hoặc nếu " |
| "chuyển giao tệp kết thúc, kết nối sẽ bị đóng qua một thông báo `CANCEL` trên" |
| " `DhtPeerConnector::eventLoop() ` và các tài nguyên sẽ được giải phóng." |
| |
| #: ../../../developer/file-transfer.md:81 |
| msgid "" |
| "![TLSsocketEndpoint](images/file-transfer-tlssocketendpoint-diagram.png)" |
| msgstr "" |
| "! [TLSsocketEndpoint](photos/file-transfer-tlssocketendpoint-diagram.png)" |
| |
| #: ../../../developer/file-transfer.md:81 |
| msgid "TLSsocketEndpoint" |
| msgstr "TLSsocketEndpoint" |
| |
| #: ../../../developer/file-transfer.md:83 |
| msgid "Receiving a file" |
| msgstr "Nhận một tập tin" |
| |
| #: ../../../developer/file-transfer.md:86 |
| msgid "" |
| "The same structure is used to receive files, but the method changes a bit:" |
| msgstr "" |
| "Tương tự cấu trúc được sử dụng để nhận các tệp, nhưng phương pháp thay đổi " |
| "một chút:" |
| |
| #: ../../../developer/file-transfer.md:88 |
| msgid "" |
| "The `JamiAccount` class is used to receives messages from the DHT, because " |
| "the first thing received will be the DHT request." |
| msgstr "" |
| "Hạng `JamiAccount` được sử dụng để nhận tin nhắn từ DHT, bởi vì điều đầu " |
| "tiên được nhận là yêu cầu DHT." |
| |
| #: ../../../developer/file-transfer.md:89 |
| msgid "" |
| "Then, this message is given to `DhtPeerConnector: onRequestMessage()` " |
| "through the eventLoop." |
| msgstr "" |
| "Sau đó, thông điệp này được gửi đến `DhtPeerConnector: onRequestMessage() ` " |
| "thông qua eventLoop." |
| |
| #: ../../../developer/file-transfer.md:90 |
| msgid "" |
| "The `DhtPeerConnector::Impl::answerToRequest` will try to connect to the " |
| "TURN server (if not connected) and initialize the ICE transport. This method" |
| " open 2 control connections to a TURN server (one to authorize IPv4 peers, " |
| "another one for IPv6 peers, due to **RFC 6156**) if it's not already open " |
| "and permit Peer public addresses to connect. Then, if the SDP received " |
| "doesn't contains ICE candidates, will use the TURN and craft the SDP answer " |
| "to wait for the peer. If the SDP contains ICE candidates, the method will " |
| "try to negotiate the link (or fallback on the TURN) and then answer the SDP " |
| "(with ICE candidates or not)." |
| msgstr "" |
| "`DhtPeerConnector::Impl::answerToRequest` sẽ cố gắng kết nối với máy chủ " |
| "TURN (nếu không kết nối) và khởi tạo giao thông ICE. Phương pháp này sẽ mở 2" |
| " kết nối điều khiển với máy chủ TURN (một để ủy quyền cho các đồng nghiệp " |
| "IPv4, một cho các đồng nghiệp IPv6, do **RFC 6156**) nếu nó chưa mở và cho " |
| "phép địa chỉ công cộng của đồng nghiệp kết nối. Sau đó, nếu SDP nhận được " |
| "không chứa các ứng viên ICE, sẽ sử dụng TURN và tạo câu trả lời SDP để chờ " |
| "cho đồng nghiệp. Nếu SDP chứa các ứng viên ICE, phương pháp sẽ cố gắng đàm " |
| "phán liên kết (hoặc quay lại trên TURN) và sau đó trả lời SDP (với các ứng " |
| "viên ICE hoặc không)." |
| |
| #: ../../../developer/file-transfer.md:91 |
| msgid "" |
| "Once the links are ready, like the sender, a TLS link is negotiated and " |
| "given to the `PeerConnection` given to the `IncomingFileTransfer` as an " |
| "input. The headers of the file will come and the client is now able to " |
| "accept or cancel the transfer." |
| msgstr "" |
| "Khi các liên kết đã sẵn sàng, giống như người gửi, một liên kết TLS được đàm" |
| " phán và được trao cho `PeerConnection` được trao cho `IncomingFileTransfer`" |
| " như một đầu vào." |
| |
| #: ../../../developer/file-transfer.md:93 |
| msgid "Re-ask for a previous file transfer" |
| msgstr "Cần lại chuyển giao tập tin trước đó" |
| |
| #: ../../../developer/file-transfer.md:95 |
| msgid "" |
| "As specified in {ref}`developer/swarm:Other mime types`, the data-transfer " |
| "interactions are now synced and stored into conversations. So, a device can " |
| "easily detects if a file was downloaded or not. If not, it can asks all " |
| "members in the conversation to transmits the file again." |
| msgstr "" |
| "Như được chỉ định trong {ref}`developer/swarm:Other mime types`, các tương " |
| "tác chuyển dữ liệu bây giờ được đồng bộ hóa và lưu trữ thành các cuộc trò " |
| "chuyện. Vì vậy, một thiết bị có thể dễ dàng phát hiện xem một tệp đã được " |
| "tải xuống hay không. Nếu không, nó có thể yêu cầu tất cả các thành viên " |
| "trong cuộc trò chuyện để truyền tệp lại." |
| |
| #: ../../../developer/file-transfer.md:97 |
| msgid "" |
| "To do this, the device will send a json with the mime-type: " |
| "`application/data-transfer-request+json` containing `conversation` (the " |
| "conversation's id), `interaction` (related interaction), `deviceId` the " |
| "device receiving the file." |
| msgstr "" |
| "Để làm điều này, thiết bị sẽ gửi một json với kiểu mime: `application/data-" |
| "transfer-request+json` chứa `conversation` (id của cuộc trò chuyện), " |
| "`interaction` (interaction liên quan), `deviceId` thiết bị nhận tệp." |
| |
| #: ../../../developer/file-transfer.md:99 |
| msgid "" |
| "The sender now checks if the device is a device from the announced peer and " |
| "that the device is a member of the conversation, and can sends the file via " |
| "a classic file transfer." |
| msgstr "" |
| "Người gửi bây giờ kiểm tra xem thiết bị là một thiết bị từ người đồng nghiệp" |
| " được công bố và thiết bị là một thành viên của cuộc trò chuyện, và có thể " |
| "gửi tập tin thông qua một chuyển giao tập tin cổ điển." |
| |
| #: ../../../developer/file-transfer.md:101 |
| msgid "" |
| "The receiver can now accepts the first incoming transfer, download the file " |
| "and verify that the sha3sum is correct." |
| msgstr "" |
| "Người nhận bây giờ có thể chấp nhận chuyển tiếp đầu tiên, tải xuống tệp và " |
| "xác minh rằng số lượng sha3sum là chính xác." |
| |
| #: ../../../developer/file-transfer.md:103 |
| msgid "Schema" |
| msgstr "Chương trình" |
| |
| #: ../../../developer/file-transfer.md:105 |
| msgid "" |
| "![Diagram: main schema diagram](images/file-transfer-main-schema-" |
| "diagram.png)" |
| msgstr "" |
| "! [Chương trình: sơ đồ chính](phần/phần chuyển-phần chuyển-chương trình " |
| "chính.png)" |
| |
| #: ../../../developer/file-transfer.md:105 |
| msgid "Diagram: main schema diagram" |
| msgstr "Chụp đồ: sơ đồ sơ đồ chính" |
| |
| #: ../../../developer/file-transfer.md:107 |
| msgid "SDP sent over the DHT" |
| msgstr "SDP được gửi qua DHT" |
| |
| #: ../../../developer/file-transfer.md:123 |
| msgid "" |
| "Where `0d04b932` is the ufrag and `7c33834e7cf944bf0e367b47` the password of" |
| " the ICE session. `2130706431` and `1694498815` are the priority of the " |
| "candidates. `192.168.0.126 42751 typ host tcptype passive` is a passive host" |
| " candidate and `1694498815 X.X.X.X 42751 typ srflx tcptype passive` a " |
| "passive host reflecting the public ip (mapped via UPnP for example)." |
| msgstr "" |
| "Trong đó `0d04b932` là ufrag và `7c33834e7cf944bf0e367b47` mật khẩu của " |
| "phiên ICE. `2130706431` và `1694498815` là ưu tiên của các ứng cử viên. " |
| "`192.168.0.126 42751 host type tcptype passive` là ứng cử viên chủ động và " |
| "`1694498815 X.X.X.X 42751 type srflx tcptype passive` là một host thụ động " |
| "phản ánh IP công cộng (ví dụ: được lập bản đồ thông qua UPnP)." |
| |
| #: ../../../developer/file-transfer.md:125 |
| msgid "PJSIP related patches." |
| msgstr "Các vết bẻ liên quan đến PJSIP." |
| |
| #: ../../../developer/file-transfer.md:127 |
| msgid "3 patches will be included into the PJSIP project:" |
| msgstr "3 bản vá sẽ được đưa vào dự án PJSIP:" |
| |
| #: ../../../developer/file-transfer.md:129 |
| msgid "" |
| "RFC 6062, used to perform TURN over TCP (merged upstream: pjproject - " |
| "fa6616c43c7e19797084f4e02a67d1fb6fd99473)" |
| msgstr "" |
| "RFC 6062, được sử dụng để thực hiện TURN trên TCP (thủy lên dòng: pjproject " |
| "- fa6616c43c7e19797084f4e02a67d1fb6fd99473)" |
| |
| #: ../../../developer/file-transfer.md:130 |
| msgid "RFC 6544, used to perform ICE over TCP" |
| msgstr "RFC 6544, được sử dụng để thực hiện ICE trên TCP" |
| |
| #: ../../../developer/file-transfer.md:131 |
| msgid "A fix for pj_activesock" |
| msgstr "Một sửa chữa cho pj_activesock" |
| |
| #: ../../../developer/file-transfer.md:133 |
| msgid "Note that the stack for the file transfer is:" |
| msgstr "Lưu ý rằng các tập tin chuyển giao là:" |
| |
| #: ../../../developer/file-transfer.md:145 |
| msgid "Multi devices" |
| msgstr "Các thiết bị đa dạng" |
| |
| #: ../../../developer/file-transfer.md:147 |
| msgid "" |
| "A RING user can link its account to several devices. So, we need to " |
| "implement the transfer when a user send a file to a contact who have " |
| "multiple devices linked to this account." |
| msgstr "" |
| "Một người dùng RING có thể liên kết tài khoản của mình với nhiều thiết bị. " |
| "Vì vậy, chúng ta cần thực hiện chuyển giao khi một người dùng gửi một tệp " |
| "đến một liên lạc có nhiều thiết bị liên kết với tài khoản này." |
| |
| #: ../../../developer/file-transfer.md:151 |
| msgid "First approach" |
| msgstr "Cách tiếp cận đầu tiên" |
| |
| #: ../../../developer/file-transfer.md:153 |
| msgid "" |
| "The first approach was to send a request through the DHT to all devices and " |
| "the first devices which answers get the file to transfer. This is bad for " |
| "your contact because they will not know which device will receives will get " |
| "the transfer." |
| msgstr "" |
| "Cách tiếp cận đầu tiên là gửi yêu cầu thông qua DHT đến tất cả các thiết bị " |
| "và các thiết bị đầu tiên trả lời nhận được tập tin để chuyển giao." |
| |
| #: ../../../developer/file-transfer.md:158 |
| msgid "Current approach" |
| msgstr "Phương pháp hiện tại" |
| |
| #: ../../../developer/file-transfer.md:160 |
| msgid "" |
| "Now, we still send a request to all devices. The difference is that all " |
| "devices will have the notification for receiving a file and can " |
| "accept/refuse the transfer. The major part of the code for that is in " |
| "*data\\_transfer.cpp*." |
| msgstr "" |
| "Bây giờ, chúng tôi vẫn gửi yêu cầu đến tất cả các thiết bị. Sự khác biệt là " |
| "tất cả các thiết bị sẽ có thông báo nhận một tệp và có thể chấp nhận / từ " |
| "chối chuyển giao. Phần lớn mã cho điều đó là trong *data\\_transfer.cpp*." |
| |
| #: ../../../developer/file-transfer.md:165 |
| msgid "" |
| "Now (since <https://gerrit-ring.savoirfairelinux.com/#/c/9327/>), when a " |
| "user send a file, it will request a *PeerConnection* with all peer devices. " |
| "And for all connections, we attach a new input stream to have the ability to" |
| " accept/refuse/cancel each transfer separately." |
| msgstr "" |
| "Bây giờ (từ khi <https://gerrit-ring.savoirfairelinux.com/#/c/9327/>), khi " |
| "người dùng gửi một tệp, nó sẽ yêu cầu *PeerConnection* với tất cả các thiết " |
| "bị đồng nghiệp. Và đối với tất cả các kết nối, chúng tôi gắn một dòng đầu " |
| "vào mới để có khả năng chấp nhận / từ chối / hủy từng chuyển giao riêng " |
| "biệt." |
| |
| #: ../../../developer/file-transfer.md:170 |
| msgid "" |
| "In *data\\_transfer.cpp* we define the *OptimisticMetaOutgoingInfo* class " |
| "which represent the optimistic view to show to the client. It's optimistic " |
| "because if a contact accept a transfer on one device and refuse on others, " |
| "this class will show the ongoing file transfer. And it will only show an " |
| "error if all devices refuse the transfer." |
| msgstr "" |
| "Trong *data\\_transfer.cpp* chúng tôi xác định lớp " |
| "*OptimisticMetaOutgoingInfo* đại diện cho quan điểm lạc quan để hiển thị cho" |
| " khách hàng. Nó lạc quan bởi vì nếu một liên lạc chấp nhận chuyển giao trên " |
| "một thiết bị và từ chối trên các thiết bị khác, lớp này sẽ hiển thị chuyển " |
| "giao tập tin đang diễn ra. Và nó sẽ chỉ hiển thị lỗi nếu tất cả các thiết bị" |
| " từ chối chuyển giao." |
| |
| #: ../../../developer/file-transfer.md:176 |
| msgid "" |
| "This class is linked to *SubOutgoingFileTransfer* which represent the state " |
| "of a transfer with one device. Clients will have the ability to show a sub " |
| "transfer instead the optimistic later (see TODO list)." |
| msgstr "" |
| "Các lớp này được liên kết với *SubOutgoingFileTransfer* đại diện cho trạng " |
| "thái chuyển giao với một thiết bị. Khách hàng sẽ có khả năng hiển thị một " |
| "chuyển giao phụ thay vì lạc quan sau đó (xem danh sách TODO)." |
| |
| #: ../../../developer/file-transfer.md:180 |
| msgid "Using another TURN server" |
| msgstr "Sử dụng máy chủ TURN khác" |
| |
| #: ../../../developer/file-transfer.md:182 |
| msgid "" |
| "Actually the default TURN server is *turn.ring.cx*. But you can host your " |
| "own TURN server. For example by running a " |
| "[coturn](https://github.com/coturn/coturn) server." |
| msgstr "" |
| "Thực tế, máy chủ TURN mặc định là *turn.ring.cx*. Nhưng bạn có thể lưu trữ " |
| "máy chủ TURN của riêng bạn. Ví dụ bằng cách chạy một máy chủ " |
| "[coturn](https://github.com/coturn/coturn)." |
| |
| #: ../../../developer/file-transfer.md:186 |
| msgid "`sudo turnserver -a -v -n -u user:password -r \"realm\"`" |
| msgstr "`sudo turnserver -a -v -n -u người dùng: mật khẩu -r \"trung\"" |
| |
| #: ../../../developer/file-transfer.md:188 |
| msgid "" |
| "Then, you can configure the TURN server in the advanced settings of RING." |
| msgstr "" |
| "Sau đó, bạn có thể cấu hình máy chủ TURN trong cài đặt nâng cao của RING." |
| |
| #: ../../../developer/file-transfer.md:191 |
| msgid "" |
| "Note: this needs some technical knowledges. Moreover, the TURN server should" |
| " see the same ip address of your node as the destination node or the peer " |
| "connection will fail (because the authorization will be incorrect)" |
| msgstr "" |
| "Lưu ý: điều này cần một số kiến thức kỹ thuật. Hơn nữa, máy chủ TURN nên " |
| "thấy địa chỉ IP của nút của bạn giống như nút đích hoặc kết nối đồng cấp sẽ " |
| "thất bại (vì ủy quyền sẽ không chính xác)" |
| |
| #: ../../../developer/file-transfer.md:199 |
| msgid "" |
| "For now, if a file transfer fails when ongoing, the sender can not resume " |
| "the transfer and must relaunch the whole transfer. In the future, there will" |
| " be a retry button for resuming the transfer." |
| msgstr "" |
| "Hiện tại, nếu chuyển giao tập tin không thành công khi đang diễn ra, người " |
| "gửi không thể tiếp tục chuyển giao và phải khởi động lại toàn bộ chuyển " |
| "giao." |
| |
| #: ../../../developer/file-transfer.md:203 |
| msgid "" |
| "Finally, because Jami do not support text conferences (just video " |
| "conferences, where there is one master merging slaves SIP calls), there is " |
| "no real file transfer in conferences. For now, when you are in a conference " |
| "on the gnome client for example: A master, B and C slave. B will be able to " |
| "send a file to A the master (C same) A will be able to send a file to B or " |
| "to C (just have to select the correct conversation)." |
| msgstr "" |
| |
| #: ../../../developer/file-transfer.md:210 |
| msgid "TODO List" |
| msgstr "Danh sách TODO" |
| |
| #: ../../../developer/file-transfer.md:212 |
| msgid "Add unit-tests (https://gerrit-ring.savoirfairelinux.com/\\#/c/9365/)" |
| msgstr "" |
| "Thêm các unit test (https://gerrit-ring.savoirfairelinux.com/\\#/c/9365/)" |
| |
| #: ../../../developer/file-transfer.md:213 |
| msgid "Show subtransfers status for outgoing files" |
| msgstr "Hiển thị trạng thái chuyển nhượng phụ cho các tệp ra ngoài" |
| |
| #: ../../../developer/file-transfer.md:214 |
| msgid "Offset resume (for failed transfer)" |
| msgstr "Thử lý lý lịch bù đắp (trong việc chuyển khoản thất bại)" |
| |
| #: ../../../developer/important-rfcs.md:1 |
| msgid "Important RFCs" |
| msgstr "RFC quan trọng" |
| |
| #: ../../../developer/important-rfcs.md:4 |
| msgid "SIP" |
| msgstr "SIP" |
| |
| #: ../../../developer/important-rfcs.md:6 |
| msgid "Reference: <http://tools.ietf.org/html/rfc3261>" |
| msgstr "Đề xuất: <http://tools.ietf.org/html/rfc3261>" |
| |
| #: ../../../developer/important-rfcs.md:8 |
| #: ../../../developer/important-rfcs.md:35 |
| #: ../../../developer/important-rfcs.md:44 |
| msgid "Valuable updates and extensions:" |
| msgstr "Các bản cập nhật và mở rộng có giá trị:" |
| |
| #: ../../../developer/important-rfcs.md:10 |
| msgid "SIP Re-INVITE: <http://tools.ietf.org/html/rfc6141>" |
| msgstr "SIP RE-INVITE: <http://tools.ietf.org/html/rfc6141>" |
| |
| #: ../../../developer/important-rfcs.md:12 |
| msgid "ICE" |
| msgstr "ICE" |
| |
| #: ../../../developer/important-rfcs.md:14 |
| msgid "Reference: <http://tools.ietf.org/html/rfc5245>" |
| msgstr "Đề xuất: <http://tools.ietf.org/html/rfc5245>" |
| |
| #: ../../../developer/important-rfcs.md:16 |
| msgid "ICE TCP" |
| msgstr "" |
| |
| #: ../../../developer/important-rfcs.md:18 |
| msgid "Reference: <http://tools.ietf.org/html/rfc6544>" |
| msgstr "" |
| |
| #: ../../../developer/important-rfcs.md:20 |
| msgid "SDP" |
| msgstr "SDP" |
| |
| #: ../../../developer/important-rfcs.md:22 |
| msgid "Reference: <http://tools.ietf.org/html/rfc4566>" |
| msgstr "Đề xuất: <http://tools.ietf.org/html/rfc4566>" |
| |
| #: ../../../developer/important-rfcs.md:24 |
| msgid "" |
| "How to use SDP: <http://tools.ietf.org/html/rfc3264> Valuable updates and " |
| "extensions:" |
| msgstr "" |
| "Làm thế nào để sử dụng SDP: <http://tools.ietf.org/html/rfc3264> Cập nhật và" |
| " mở rộng có giá trị:" |
| |
| #: ../../../developer/important-rfcs.md:27 |
| msgid "SDP and IPv6: <http://tools.ietf.org/html/rfc6157>" |
| msgstr "SDP và IPv6: <http://tools.ietf.org/html/rfc6157>" |
| |
| #: ../../../developer/important-rfcs.md:28 |
| msgid "SDP for SRTP: <http://tools.ietf.org/html/rfc4568>" |
| msgstr "SDP cho SRTP: <http://tools.ietf.org/html/rfc4568>" |
| |
| #: ../../../developer/important-rfcs.md:31 |
| msgid "RTP" |
| msgstr "RTP" |
| |
| #: ../../../developer/important-rfcs.md:33 |
| msgid "Reference: <http://tools.ietf.org/html/rfc3550>" |
| msgstr "Đề xuất: <http://tools.ietf.org/html/rfc3550>" |
| |
| #: ../../../developer/important-rfcs.md:37 |
| msgid "RTP and RTCP on same port: <http://tools.ietf.org/html/rfc5761>" |
| msgstr "RTP và RTCP trên cùng cổng: <http://tools.ietf.org/html/rfc5761>" |
| |
| #: ../../../developer/important-rfcs.md:40 |
| msgid "SRTP" |
| msgstr "SRTP" |
| |
| #: ../../../developer/important-rfcs.md:42 |
| msgid "Reference: <http://tools.ietf.org/html/rfc3711>" |
| msgstr "Đề xuất: <http://tools.ietf.org/html/rfc3711>" |
| |
| #: ../../../developer/important-rfcs.md:46 |
| msgid "" |
| "DTLS for SRTP: <https://tools.ietf.org/html/rfc5763> et " |
| "<http://tools.ietf.org/html/rfc5764>" |
| msgstr "" |
| "DTLS cho SRTP: <https://tools.ietf.org/html/rfc5763> et " |
| "<http://tools.ietf.org/html/rfc5764>" |
| |
| #: ../../../developer/important-rfcs.md:47 |
| msgid "AES-192 and AES-256: <https://tools.ietf.org/html/rfc6188>" |
| msgstr "AES-192 và AES-256: <https://tools.ietf.org/html/rfc6188>" |
| |
| #: ../../../developer/important-rfcs.md:48 |
| msgid "AES-GCM: <https://tools.ietf.org/html/rfc7714>" |
| msgstr "AES-GCM: <https://tools.ietf.org/html/rfc7714>" |
| |
| #: ../../../developer/improving-quality-of-jami.md:1 |
| msgid "Improving the quality of Jami" |
| msgstr "Cải thiện chất lượng của Jami" |
| |
| #: ../../../developer/improving-quality-of-jami.md:4 |
| msgid "Unit-tests" |
| msgstr "Các thử nghiệm đơn vị" |
| |
| #: ../../../developer/improving-quality-of-jami.md:6 |
| msgid "" |
| "It is harder to make unit-test on Jami project because of the race " |
| "conditions on multi-level dependance." |
| msgstr "" |
| "Thật khó khăn hơn để thực hiện thử nghiệm đơn vị trên dự án Jami vì điều " |
| "kiện đua trên sự phụ thuộc nhiều cấp độ." |
| |
| #: ../../../developer/improving-quality-of-jami.md:8 |
| msgid "" |
| "There is about 30 unit-tests and 26% coverage. Due to Jami high demand to " |
| "give new functionalities to user quickly, they are not maintained by the " |
| "developers or by a QA dept." |
| msgstr "" |
| "Có khoảng 30 unit-test và 26% bảo hiểm. Do nhu cầu cao của Jami để cung cấp " |
| "chức năng mới cho người dùng nhanh chóng, chúng không được duy trì bởi các " |
| "nhà phát triển hoặc bởi một bộ phận QA." |
| |
| #: ../../../developer/improving-quality-of-jami.md:10 |
| msgid "" |
| "We use lcov for the coverage, you can find the lcov’s configuration in the " |
| "daemon’s Makefile.am. Also, the coverage can be found at " |
| "https://docs.jami.net/coverage/" |
| msgstr "" |
| "Chúng tôi sử dụng lcov cho bảo hiểm, bạn có thể tìm thấy cấu hình lcov trong" |
| " daemon Makefile.am. Ngoài ra, bảo hiểm có thể được tìm thấy tại " |
| "https://docs.jami.net/coverage/" |
| |
| #: ../../../developer/improving-quality-of-jami.md:12 |
| msgid "" |
| "A system needs to be implemented to start convincing the team to make a " |
| "unit-test for new code before merging" |
| msgstr "" |
| "Một hệ thống cần được triển khai để bắt đầu thuyết phục nhóm làm một thử " |
| "nghiệm đơn vị cho mã mới trước khi sáp nhập" |
| |
| #: ../../../developer/improving-quality-of-jami.md:14 |
| msgid "" |
| "You can launch them by doing ‘make check’ in the daemon folder or separately" |
| " in the unit-test folder with gdb: ‘gdb ut_media_encoder’" |
| msgstr "" |
| "Bạn có thể khởi động chúng bằng cách thực hiện make check trong thư mục " |
| "daemon hoặc riêng biệt trong thư mục unit-test với gdb: gdb ut_media_encoder" |
| |
| #: ../../../developer/improving-quality-of-jami.md:16 |
| msgid "" |
| "The environment needs to be set with ‘--disable-shared’ during the " |
| "’./configure’ command" |
| msgstr "" |
| "Môi trường cần được thiết lập với - disable-shared trong lệnh./configure" |
| |
| #: ../../../developer/improving-quality-of-jami.md:18 |
| msgid "Framework Tests" |
| msgstr "Các thử nghiệm khung" |
| |
| #: ../../../developer/improving-quality-of-jami.md:20 |
| msgid "" |
| "You can find framework tests in the daemon’s Makefile.am and lunch it with " |
| "‘make integration’. This calls jami_test.py script in the tools/dringctrl " |
| "folder. It uses dringctrl.py and controller.py which let you control Jami " |
| "through bash." |
| msgstr "" |
| "Bạn có thể tìm thấy các thử nghiệm khung trong daemon s Makefile.am và dùng " |
| "make integration. Điều này gọi là kịch bản jami_test.py trong thư mục " |
| "tools/dringctrl. Nó sử dụng dringctrl.py và controller.py cho phép bạn kiểm " |
| "soát Jami thông qua bash." |
| |
| #: ../../../developer/improving-quality-of-jami.md:22 |
| msgid "" |
| "This makes a series of calls to assure jami’s opendht network is stable." |
| msgstr "" |
| "Điều này làm cho một loạt các cuộc gọi để đảm bảo mạng lưới mở của jamit là " |
| "ổn định." |
| |
| #: ../../../developer/improving-quality-of-jami.md:24 |
| msgid "" |
| "Other framework tests need to be implemented in the future to tests Jami’s " |
| "functionalities as a whole." |
| msgstr "" |
| "Các thử nghiệm khung khác cần được triển khai trong tương lai để kiểm tra " |
| "chức năng của Jami như một toàn thể." |
| |
| #: ../../../developer/improving-quality-of-jami.md:26 |
| msgid "Integration tests" |
| msgstr "Các thử nghiệm tích hợp" |
| |
| #: ../../../developer/improving-quality-of-jami.md:28 |
| msgid "" |
| "Each commit goes through integration tests in dockers on the build machines " |
| "you can find the details at: jenkins.jami.net" |
| msgstr "" |
| "Mỗi commit trải qua các thử nghiệm tích hợp trong các máy đóng tàu trên máy " |
| "xây dựng bạn có thể tìm thấy chi tiết tại: jenkins.jami.net" |
| |
| #: ../../../developer/improving-quality-of-jami.md:30 |
| msgid "" |
| "Code-review is made by a fellow developer, sometimes the code is reviewed by" |
| " the same developer, this should be avoided to emphasize Linus’ law. The " |
| "‘Jenkins verified’ label is sometimes discarded and replaced by +1 from a " |
| "developer, this should also be avoided." |
| msgstr "" |
| "Việc đánh giá mã được thực hiện bởi một nhà phát triển đồng nghiệp, đôi khi " |
| "mã được xem xét bởi cùng một nhà phát triển, điều này nên tránh để nhấn mạnh" |
| " luật Linus." |
| |
| #: ../../../developer/improving-quality-of-jami.md:32 |
| msgid "" |
| "Sonarqube lets Jenkins build Jami and verify linting. You can find filters " |
| "and results at: sonar- jami.savoirfairelinux.net Sonar uses clang-tidy as a " |
| "preprocessor linting compilator, you can find clang’s filters in .clang-tidy" |
| " file in the daemon folder." |
| msgstr "" |
| "Sonarqube cho phép Jenkins xây dựng Jami và xác minh linting. Bạn có thể tìm" |
| " thấy các bộ lọc và kết quả tại: sonar- jami.savoirfairelinux.net Sonar sử " |
| "dụng clang-tidy như một bộ sưu tập preprocessor linting, bạn có thể tìm thấy" |
| " các bộ lọc clangs trong tệp.clang-tidy trong thư mục daemon." |
| |
| #: ../../../developer/improving-quality-of-jami.md:34 |
| msgid "" |
| "On sflvault sonarqube can be found at service m#2637 and admin logins at " |
| "service s#7169" |
| msgstr "" |
| "Trên sflvault sonarqube có thể được tìm thấy tại dịch vụ m#2637 và đăng nhập" |
| " quản trị tại dịch vụ s#7169" |
| |
| #: ../../../developer/improving-quality-of-jami.md:36 |
| msgid "Doc and feedback:" |
| msgstr "Bác sĩ và phản hồi:" |
| |
| #: ../../../developer/improving-quality-of-jami.md:38 |
| msgid "You can find all the documentation on docs.jami.net" |
| msgstr "Bạn có thể tìm thấy tất cả các tài liệu trên docs.jami.net" |
| |
| #: ../../../developer/improving-quality-of-jami.md:40 |
| msgid "Issues are made by developers or users on git.jami.net" |
| msgstr "" |
| "Các vấn đề được đưa ra bởi các nhà phát triển hoặc người dùng trên " |
| "git.jami.net" |
| |
| #: ../../../developer/improving-quality-of-jami.md:42 |
| msgid "Monitoring" |
| msgstr "Giám sát" |
| |
| #: ../../../developer/improving-quality-of-jami.md:44 |
| msgid "" |
| "A script is called every 30 minutes on a virtual machine jami-" |
| "monitorpeervm-01. You can find it on sflvault service s#7209 and is calling " |
| "an other client viratual jami- monitorpeer-02 (service s#7224). A series of " |
| "calls is being made and it returns the failure rate. You can find all the " |
| "details at https://wiki.savoirfairelinux.com/wiki/Jami-" |
| "monitorpeervm-01.mtl.sfl." |
| msgstr "" |
| "Một kịch bản được gọi mỗi 30 phút trên một máy ảo jami-monitorpeervm-01. Bạn" |
| " có thể tìm thấy nó trên dịch vụ sflvault s#7209 và đang gọi cho một khách " |
| "hàng khác virtual jami-monitorpeer-02 ( dịch vụ s#7224). Một loạt các cuộc " |
| "gọi đang được thực hiện và nó trả lại tỷ lệ thất bại. Bạn có thể tìm thấy " |
| "tất cả các chi tiết tại https://wiki.savoirfairelinux.com/wiki/Jami-" |
| "monitorpeervm-01.mt.sfl." |
| |
| #: ../../../developer/improving-quality-of-jami.md:46 |
| msgid "" |
| "If needed, the manual command is ./script.sh –peer " |
| "031acbb73f2a3385b2babc7161f13325be103431" |
| msgstr "" |
| "Nếu cần thiết, lệnh thủ công là./script.sh peer " |
| "031acbb73f2a3385b2babc7161f13325be103431" |
| |
| #: ../../../developer/improving-quality-of-jami.md:48 |
| msgid "" |
| "It traces a real time point by point graph on " |
| "https://monitoring.savoirfairelinux.com/grafana/dashboard/script/dyndash.js?host=jami-" |
| "monitorpeervm-01.mtl.sfl&service=Check%20JamiCall&panelId=1&fullscreen&orgId=1" |
| msgstr "" |
| "Nó theo dõi một biểu đồ thời gian thực theo điểm trên " |
| "https://monitoring.savoirfairelinux.com/grafana/dashboard/script/dyndash.js?host=jami-" |
| "monitorpeervm-01.mtl.sfl&service=Check%20JamiCall&panelId=1&fullscreen&orgId=1" |
| |
| #: ../../../developer/improving-quality-of-jami.md:50 |
| msgid "Smoke tests" |
| msgstr "Kiểm tra khói" |
| |
| #: ../../../developer/improving-quality-of-jami.md:52 |
| msgid "Before each releases every clients MUST past a list of scenarios." |
| msgstr "" |
| "Trước khi mỗi bản phát hành, mọi khách hàng phải vượt qua một danh sách kịch" |
| " bản." |
| |
| #: ../../../developer/improving-quality-of-jami.md:54 |
| msgid "Scenarios are described here: [Jami smoke tests](jami-smoke-tests.ods)" |
| msgstr "" |
| "Các kịch bản được mô tả ở đây: [Jami smoke tests](jami-smoke-tests.ods)" |
| |
| #: ../../../developer/improving-quality-of-jami.md:57 |
| msgid "" |
| "They are reviewed by QA dpt. before sending it to the developers if needed." |
| msgstr "" |
| "Chúng được QA dpt xem xét trước khi gửi cho các nhà phát triển nếu cần " |
| "thiết." |
| |
| #: ../../../developer/improving-quality-of-jami.md:59 |
| msgid "" |
| "If a release contains a network commit that has been merged, the QA dept. " |
| "Should be able to automate the different connectivity tests (as descibed " |
| "below in Calls configurations)" |
| msgstr "" |
| "Nếu một bản phát hành chứa một liên kết mạng đã được sáp nhập, bộ phận QA " |
| "nên có thể tự động hóa các thử nghiệm kết nối khác nhau (như được mô tả dưới" |
| " đây trong cấu hình Calls)" |
| |
| #: ../../../developer/improving-quality-of-jami.md:61 |
| msgid "Calls configurations." |
| msgstr "- Đưa ra cấu hình." |
| |
| #: ../../../developer/improving-quality-of-jami.md:63 |
| msgid "This is the list of network configurations that need to be tested:" |
| msgstr "Đây là danh sách các cấu hình mạng cần được kiểm tra:" |
| |
| #: ../../../developer/improving-quality-of-jami.md:65 |
| msgid "" |
| "(IPv4 | IPv6) + (TURN | !TURN) + (STUN | !STUN) + (UPnP | !UPnP) for both " |
| "sides." |
| msgstr "" |
| "(IPv4 IPv6) + (TURN !TURN) + (STUN !STUN) + (UPnP !UPnP) cho cả hai bên." |
| |
| #: ../../../developer/improving-quality-of-jami.md:67 |
| msgid "" |
| "If both sides are IPv4 only without TURN/STUN/UPnP, the call should be only " |
| "local." |
| msgstr "" |
| "Nếu cả hai bên chỉ là IPv4 mà không có TURN/STUN/UPnP, cuộc gọi chỉ nên là " |
| "địa phương." |
| |
| #: ../../../developer/improving-quality-of-jami.md:69 |
| msgid "Special note: FDroid" |
| msgstr "Lưu ý đặc biệt: FDroid" |
| |
| #: ../../../developer/improving-quality-of-jami.md:71 |
| msgid "" |
| "The script to generate MR is in the client-android repo " |
| "(fdroidMergeRequest.sh)" |
| msgstr "" |
| "Các kịch bản để tạo MR là trong client-android repo (fdroidMergeRequest.sh)" |
| |
| #: ../../../developer/improving-quality-of-jami.md:73 |
| msgid "What needs to be done" |
| msgstr "Điều cần làm" |
| |
| #: ../../../developer/improving-quality-of-jami.md:75 |
| msgid "Push coverage closer to 60%" |
| msgstr "Tăng bảo hiểm gần 60%" |
| |
| #: ../../../developer/improving-quality-of-jami.md:77 |
| msgid "" |
| "Establish a system within the team to assure maintenance and creation of " |
| "unit-tests." |
| msgstr "" |
| "Thiết lập một hệ thống trong nhóm để đảm bảo bảo trì và tạo ra các unit " |
| "test." |
| |
| #: ../../../developer/improving-quality-of-jami.md:79 |
| msgid "" |
| "Each major functionality should be tested as whole by adding a framework " |
| "test (i.e. making sure a message was received, the call was ended well on " |
| "both side, etc...)" |
| msgstr "" |
| "Mỗi chức năng chính nên được kiểm tra như một toàn thể bằng cách thêm một " |
| "thử nghiệm khung (ví dụ: đảm bảo thông điệp đã được nhận, cuộc gọi đã kết " |
| "thúc tốt trên cả hai bên, vv...)" |
| |
| #: ../../../developer/improving-quality-of-jami.md:81 |
| msgid "" |
| "Each new functionality should be tested on each platform before merging it " |
| "to reduce regression" |
| msgstr "" |
| "Mỗi chức năng mới nên được thử nghiệm trên mỗi nền tảng trước khi sáp nhập " |
| "nó để giảm sự lùi" |
| |
| #: ../../../developer/improving-quality-of-jami.md:83 |
| msgid "Integrate sonarqube on each client" |
| msgstr "Thêm sonarqube trên mỗi khách hàng" |
| |
| #: ../../../developer/improving-quality-of-jami.md:85 |
| msgid "Automate the testing of Jami’s behavior on network compatibility" |
| msgstr "Tự động hóa kiểm tra hành vi của Jami về khả năng tương thích mạng" |
| |
| #: ../../../developer/improving-quality-of-jami.md:87 |
| msgid "Make a make_ring.py script adaptable to windows also" |
| msgstr "Làm cho một script make_ring.py thích nghi với windows cũng" |
| |
| #: ../../../developer/index.rst:3 |
| msgid "Developer manual" |
| msgstr "Quyển hướng dẫn phát triển" |
| |
| #: ../../../developer/index.rst:5 |
| msgid "" |
| "The Jami developer manual is a reference for Jami developers and " |
| "contributors, documenting the various aspects of hacking on and developing " |
| "Jami, including in-depth explanations of how Jami is designed and how its " |
| "various parts work together." |
| msgstr "" |
| "Quyển hướng dẫn nhà phát triển Jami là một tài liệu tham khảo cho các nhà " |
| "phát triển và người đóng góp của Jami, ghi lại các khía cạnh khác nhau của " |
| "việc hack và phát triển Jami, bao gồm các lời giải thích sâu sắc về cách " |
| "Jami được thiết kế và cách các bộ phận khác nhau của nó hoạt động cùng nhau." |
| |
| #: ../../../developer/introduction.md:4 |
| msgid "" |
| "Greetings! In the developer manual of Jami, you will learn about how Jami " |
| "works from the high level, to the low, with some examples." |
| msgstr "" |
| "Trong hướng dẫn của Jami, bạn sẽ tìm hiểu về cách Jami hoạt động từ cấp cao " |
| "đến cấp thấp, với một số ví dụ." |
| |
| #: ../../../developer/introduction.md:7 |
| msgid "Table of contents" |
| msgstr "Bảng nội dung" |
| |
| #: ../../../developer/introduction.md:9 |
| msgid "{doc}`apis-of-jami`" |
| msgstr "{doc}`apis-of-jami`" |
| |
| #: ../../../developer/introduction.md:10 |
| msgid "Basic features" |
| msgstr "Các tính năng cơ bản" |
| |
| #: ../../../developer/introduction.md:11 |
| msgid "{doc}`account-management`" |
| msgstr "{doc}` tài khoản quản lý" |
| |
| #: ../../../developer/introduction.md:12 |
| msgid "{doc}`contact-management`" |
| msgstr "{doc}` liên lạc quản lý" |
| |
| #: ../../../developer/introduction.md:13 |
| msgid "{doc}`swarm`" |
| msgstr "{doc}`swarm`" |
| |
| #: ../../../developer/introduction.md:14 |
| msgid "{doc}`calls`" |
| msgstr "{doc}`call`" |
| |
| #: ../../../developer/introduction.md:15 |
| msgid "{doc}`file-transfer` (deprecated; see {doc}`swarm`)" |
| msgstr "{doc}`file-transfer` (được giảm giá; xem {doc}`swarm`)" |
| |
| #: ../../../developer/introduction.md:16 |
| msgid "{doc}`message-displayed-status`" |
| msgstr "{doc}`thông tin hiển thị-status`" |
| |
| #: ../../../developer/introduction.md:18 |
| msgid "Advanced features" |
| msgstr "Các tính năng tiên tiến" |
| |
| #: ../../../developer/introduction.md:19 |
| msgid "Manage audio/videos" |
| msgstr "Quản lý âm thanh / video" |
| |
| #: ../../../developer/introduction.md:20 |
| msgid "Call recording" |
| msgstr "Lập tắt cuộc gọi" |
| |
| #: ../../../developer/introduction.md:21 |
| msgid "" |
| "[The push notifications " |
| "system](https://github.com/savoirfairelinux/opendht/wiki/Push-notifications-" |
| "support)" |
| msgstr "" |
| "[System of push " |
| "notifications]https://github.com/savoirfairelinux/opendht/wiki/Push-" |
| "notifications-support)" |
| |
| #: ../../../developer/introduction.md:22 |
| msgid "What is a DHTProxy" |
| msgstr "DHTProxy là gì" |
| |
| #: ../../../developer/introduction.md:23 |
| msgid "Supporting SIP" |
| msgstr "Hỗ trợ SIP" |
| |
| #: ../../../developer/introduction.md:24 |
| msgid "{doc}`setting-up-your-own-turn-server`" |
| msgstr "{doc}`setting-up-your-own-turn-server`" |
| |
| #: ../../../developer/introduction.md:25 |
| msgid "{doc}`synchronizing-profiles`" |
| msgstr "{doc}`tích hợp hồ sơ" |
| |
| #: ../../../developer/introduction.md:27 |
| msgid "{doc}`../contribute`" |
| msgstr "{doc}`../contribution`" |
| |
| #: ../../../developer/introduction.md:28 |
| msgid "{doc}`Build instructions <../build/building>`" |
| msgstr "{doc}`Tạo ra hướng dẫn <../tạo ra/tạo ra>`" |
| |
| #: ../../../developer/introduction.md:29 |
| msgid "{doc}`submitting-your-first-patch`" |
| msgstr "{doc}` gửi-tên-tên-tên-tên của bạn" |
| |
| #: ../../../developer/introduction.md:30 |
| msgid "{doc}`feature-requests`" |
| msgstr "{doc}`feature-requests `" |
| |
| #: ../../../developer/introduction.md:32 |
| msgid "Group chats in details" |
| msgstr "Các cuộc trò chuyện nhóm chi tiết" |
| |
| #: ../../../developer/introduction.md:33 ../../../developer/introduction.md:42 |
| msgid "Description" |
| msgstr "Mô tả" |
| |
| #: ../../../developer/introduction.md:34 |
| msgid "{doc}`connection-manager`" |
| msgstr "{doc}` liên kết quản lý" |
| |
| #: ../../../developer/introduction.md:35 |
| msgid "DRT" |
| msgstr "DRT" |
| |
| #: ../../../developer/introduction.md:36 |
| msgid "{doc}`calls-in-swarm`" |
| msgstr "{doc}`call-in-swarmm`" |
| |
| #: ../../../developer/introduction.md:38 |
| msgid "Drafts" |
| msgstr "Các bản thảo" |
| |
| #: ../../../developer/introduction.md:39 |
| msgid "{doc}`conference-protocol`" |
| msgstr "{doc}` hội nghị-bản ghi" |
| |
| #: ../../../developer/introduction.md:40 |
| msgid "{doc}`synchronization-protocol`" |
| msgstr "{doc}`synchronization-protocol`" |
| |
| #: ../../../developer/introduction.md:44 |
| msgid "" |
| "If you are reading this, chances are you'd either like to contribute to one " |
| "of Jami's components/projects, or to implement your own client. There are " |
| "three main layers in this project:" |
| msgstr "" |
| "Nếu bạn đang đọc bài viết này, có thể bạn muốn đóng góp vào một trong những " |
| "thành phần/các dự án của Jami, hoặc thực hiện khách hàng của riêng bạn." |
| |
| #: ../../../developer/introduction.md:48 |
| msgid "" |
| "[OpenDHT](https://opendht.net), used for the p2p communication. You can " |
| "interact with this library like any C++ library, or using the Python " |
| "wrapper, or via its [REST " |
| "API](https://github.com/savoirfairelinux/opendht/wiki/REST-API)." |
| msgstr "" |
| "[OpenDHT](https://opendht.net), được sử dụng cho giao tiếp p2p. Bạn có thể " |
| "tương tác với thư viện này như bất kỳ thư viện C ++ nào, hoặc sử dụng gói " |
| "Python, hoặc thông qua [REST API] " |
| "(https://github.com/savoirfairelinux/opendht/wiki/REST-API)." |
| |
| #: ../../../developer/introduction.md:53 |
| msgid "" |
| "The daemon, which is the main part. It's the part which does all the logic " |
| "for Jami and interacts with OpenDHT, pjsip, FFmpeg, and the other libraries," |
| " and implements the whole protocol. If you'd like to do create a new Jami " |
| "client, we recommend implementing it on top of this daemon, using one of its" |
| " many APIs (REST, DBus, libwrap, or JNI)." |
| msgstr "" |
| "Daemon, đó là phần chính. Nó là phần thực hiện tất cả các logic cho Jami và " |
| "tương tác với OpenDHT, pjsip, FFmpeg, và các thư viện khác, và thực hiện " |
| "toàn bộ giao thức. Nếu bạn muốn tạo ra một khách hàng Jami mới, chúng tôi " |
| "khuyên bạn nên thực hiện nó trên đỉnh của daemon này, sử dụng một trong " |
| "nhiều API của nó (REST, DBus, libwrap, hoặc JNI)." |
| |
| #: ../../../developer/introduction.md:60 |
| msgid "The client part, which is basically the *frontend*." |
| msgstr "Phần khách hàng, đó là phần đầu tiên." |
| |
| #: ../../../developer/introduction.md:62 |
| msgid "" |
| "The developer manual of Jami will explain the different features from all of" |
| " these layers." |
| msgstr "" |
| "Quyển hướng dẫn của Jami sẽ giải thích các tính năng khác nhau của tất cả " |
| "các lớp này." |
| |
| #: ../../../developer/jami-identifiers.md:1 |
| msgid "Jami identifiers" |
| msgstr "Các nhận dạng Jami" |
| |
| #: ../../../developer/jami-identifiers.md:4 |
| msgid "" |
| "There are many identifiers in Jami. We need to unify the naming of these " |
| "identifiers between all implementations. This page reference various kind of" |
| " identifiers used in Jami with relevant examples." |
| msgstr "" |
| "Có nhiều nhận dạng trong Jami. Chúng ta cần phải thống nhất tên gọi của các " |
| "nhận dạng này giữa tất cả các thực hiện. Trang này tham khảo các loại nhận " |
| "dạng khác nhau được sử dụng trong Jami với các ví dụ liên quan." |
| |
| #: ../../../developer/jami-identifiers.md:8 |
| msgid "" |
| "**Jami Infohash** or **Jami public key fingerprint** : a public key " |
| "fingerprint such as `3d1112ab2bb089370c0744a44bbbb0786418d40b`" |
| msgstr "" |
| "**Jami Infohash** hoặc **Jami Public Key fingerprint**: một dấu vân tay bằng" |
| " khóa công cộng như `3d1112ab2bb089370c0744a44bb0786418d40b`" |
| |
| #: ../../../developer/jami-identifiers.md:10 |
| msgid "" |
| "**Registered name** : a username associated to a Jami Infohash on the " |
| "blockchain such as `jeandupont`" |
| msgstr "" |
| "** Tên đăng ký**: một tên người dùng liên kết với một Jami Infohash trên " |
| "blockchain như `jeandupont`" |
| |
| #: ../../../developer/jami-identifiers.md:12 |
| msgid "" |
| "**URI** : a Jami or SIP URI such as " |
| "`jami:3d1112ab2bb089370c0744a44bbbb0786418d40b` or `jami:jeandupont` or " |
| "`<sip:nnnnn@host:5060>`. Must be compliant with " |
| "[rfc3986](https://tools.ietf.org/html/rfc3986). If it's a SIP URI, it must " |
| "be compliant with " |
| "[rfc3261#19.1](https://tools.ietf.org/html/rfc3261#section-19.1)." |
| msgstr "" |
| "**URI**: một Jami hoặc SIP URI như " |
| "`jami:3d1112ab2bb089370c0744a44bb0786418d40b` hoặc `jami:jeandupont` hoặc " |
| "`<sip:nnnnn@host:5060>`. Phải tuân thủ " |
| "[rfc3986]https://tools.ietf.org/html/rfc3986). Nếu đó là một SIP URI, nó " |
| "phải tuân thủ [rfc3261#19.1](https://tools.ietf.org/html/rfc3261# " |
| "section-19.1)." |
| |
| #: ../../../developer/jami-identifiers.md:15 |
| msgid "" |
| "**Canonical URI** : `jami:3d1112ab2bb089370c0744a44bbbb0786418d40b` or " |
| "`sip:nnnnn@host:5060`. The most simplified form of the URI. Registered name " |
| "must be resolved, doesn't include <> brackets or display name. Prefixed with" |
| " the scheme (`jami:` or `sip:` or `sips:`)." |
| msgstr "" |
| "** URI có thể được sử dụng: `jami:3d1112ab2bb089370c0744a44bb0786418d40b` " |
| "hoặc `sip:nnnnn@host:5060`." |
| |
| #: ../../../developer/jami-identifiers.md:16 |
| msgid "" |
| "**User ID**: registered name (preferred) or public key fingerprint. User-" |
| "facing identifier for an account public key." |
| msgstr "" |
| "**ID người dùng**: tên đăng ký (tích thích) hoặc dấu vân tay khóa công cộng." |
| |
| #: ../../../developer/jami-identifiers.md:17 |
| msgid "" |
| "**Display name** or **Profile name** : an editable user-defined profile name" |
| " such as `Jean Dupont`." |
| msgstr "" |
| "**Tên hiển thị** hoặc **Tên hồ sơ**: một tên hồ sơ được xác định bởi người " |
| "dùng có thể chỉnh sửa như `Jean Dupont`." |
| |
| #: ../../../developer/jami-identifiers.md:20 |
| msgid "When displaying a contact:" |
| msgstr "Khi hiển thị một liên lạc:" |
| |
| #: ../../../developer/jami-identifiers.md:28 |
| msgid "If Display name is empty, User ID is shown instead" |
| msgstr "Nếu tên hiển thị trống, ID người dùng sẽ được hiển thị thay vào đó" |
| |
| #: ../../../developer/jami-identifiers.md:29 |
| msgid "If both lines have the same content, only the first line is displayed" |
| msgstr "" |
| "Nếu cả hai dòng đều có nội dung tương tự, chỉ có dòng đầu tiên được hiển thị" |
| |
| #: ../../../developer/jami-identifiers.md:31 |
| msgid "" |
| "If no photo is available and a registered name (ring) or display name (sip) " |
| "is available, the first letter of this name can be used to generate a " |
| "placeholder. Otherwise a generic placeholder is used." |
| msgstr "" |
| "Nếu không có hình ảnh và có tên đăng ký (phòng) hoặc tên hiển thị (sip), chữ" |
| " cái đầu tiên của tên này có thể được sử dụng để tạo ra một vị trí. Nếu " |
| "không, một vị trí chung được sử dụng." |
| |
| #: ../../../developer/jami-identifiers.md:32 |
| msgid "" |
| "If no photo is available, a placeholder with an Canonical URI-specific " |
| "background color can be used:" |
| msgstr "" |
| "Nếu không có hình ảnh, một bộ ghi vị trí có màu nền cụ thể cho Canonical URI" |
| " có thể được sử dụng:" |
| |
| #: ../../../developer/jami-identifiers.md:57 |
| msgid "" |
| "Color values are from the material palette: https://material.io/tools/color" |
| msgstr "" |
| "Giá trị màu sắc là từ bảng màu vật liệu: https://material.io/tools/color" |
| |
| #: ../../../developer/jami-identifiers.md:60 |
| msgid "![références_couleurs_jami](images/jami-reference-colours.png)" |
| msgstr "! [références_couleurs_jami](photos/jami-reference-colors.png)" |
| |
| #: ../../../developer/jami-identifiers.md:60 |
| msgid "références_couleurs_jami" |
| msgstr "références_couleurs_jami" |
| |
| #: ../../../developer/location-sharing.md:1 |
| msgid "Location Sharing on QT Client" |
| msgstr "Địa điểm chia sẻ trên khách hàng QT" |
| |
| #: ../../../developer/location-sharing.md:7 |
| msgid "Trivial use" |
| msgstr "Sử dụng nhỏ" |
| |
| #: ../../../developer/location-sharing.md:9 |
| msgid "" |
| "In a conversation, the user can click on the location icon to display a map." |
| " If `Location Services` is enabled on the device, the user's position will " |
| "be shown on the map, along with the locations of all other members who are " |
| "sharing their location (from all conversations of the selected account). The" |
| " user can toggle location sharing on and off by clicking the location " |
| "sharing buttons. By default, the user's location is shared for 15 minutes, " |
| "but this setting can be modified in the app's settings." |
| msgstr "" |
| "Trong một cuộc trò chuyện, người dùng có thể nhấp vào biểu tượng vị trí để " |
| "hiển thị một bản đồ. Nếu `Location Services` được bật trên thiết bị, vị trí " |
| "của người dùng sẽ được hiển thị trên bản đồ, cùng với vị trí của tất cả các " |
| "thành viên khác đang chia sẻ vị trí của họ (từ tất cả các cuộc trò chuyện " |
| "của tài khoản đã chọn). Người dùng có thể chuyển đổi chia sẻ vị trí vào và " |
| "tắt bằng cách nhấp vào nút chia sẻ vị trí. Theo mặc định, vị trí của người " |
| "dùng được chia sẻ trong 15 phút, nhưng cài đặt này có thể được sửa đổi trong" |
| " cài đặt của ứng dụng." |
| |
| #: ../../../developer/location-sharing.md:11 |
| msgid "" |
| "When a user is sharing their location in a conversation, a red location icon" |
| " will appear on the conversation icon. If the user receives a location from " |
| "another member, an orange location icon will be displayed on all " |
| "conversations in which the member is present." |
| msgstr "" |
| "Khi người dùng chia sẻ vị trí của mình trong một cuộc trò chuyện, một biểu " |
| "tượng vị trí màu đỏ sẽ xuất hiện trên biểu tượng trò chuyện. Nếu người dùng " |
| "nhận được một vị trí từ thành viên khác, một biểu tượng vị trí màu cam sẽ " |
| "hiển thị trên tất cả các cuộc trò chuyện mà thành viên đang có mặt." |
| |
| #: ../../../developer/location-sharing.md:13 |
| msgid "" |
| "The user can interact with the map by recentering, zooming in and out, " |
| "moving it, and closing it. The map can also be pinned or unpinned. When the " |
| "map is unpinned, it can be repinned if the user is in the right account. " |
| "This feature allows the user to keep the map visible while continuing to use" |
| " Jami." |
| msgstr "" |
| "Người dùng có thể tương tác với bản đồ bằng cách gần đây, phóng to, di " |
| "chuyển và đóng nó. Bản đồ cũng có thể được gắn hoặc không gắn. Khi bản đồ " |
| "không gắn, nó có thể được gắn lại nếu người dùng ở trong tài khoản đúng." |
| |
| #: ../../../developer/location-sharing.md:15 |
| msgid "Advanced use" |
| msgstr "Sử dụng nâng cao" |
| |
| #: ../../../developer/location-sharing.md:17 |
| msgid "Multi-sharing" |
| msgstr "Chia sẻ nhiều" |
| |
| #: ../../../developer/location-sharing.md:19 |
| msgid "scenario" |
| msgstr "kịch bản" |
| |
| #: ../../../developer/location-sharing.md:21 |
| msgid "" |
| "The user is already sharing location with conversation A and conversation B." |
| msgstr "" |
| "Người dùng đã chia sẻ vị trí với cuộc trò chuyện A và cuộc trò chuyện B." |
| |
| #: ../../../developer/location-sharing.md:23 |
| msgid "Feature" |
| msgstr "Tính năng" |
| |
| #: ../../../developer/location-sharing.md:25 |
| msgid "" |
| "If the user switches to conversation C, the map is still visible and the " |
| "user has two options" |
| msgstr "" |
| "Nếu người dùng chuyển sang cuộc trò chuyện C, bản đồ vẫn có thể nhìn thấy và" |
| " người dùng có hai tùy chọn" |
| |
| #: ../../../developer/location-sharing.md:27 |
| msgid "" |
| "Click on the location sharing button to also share location with the members" |
| " of conversation C." |
| msgstr "" |
| "Nhấp vào nút chia sẻ vị trí để chia sẻ vị trí với các thành viên cuộc trò " |
| "chuyện C." |
| |
| #: ../../../developer/location-sharing.md:28 |
| msgid "" |
| "Click the location sharing end button. This will bring up a pop-up that " |
| "allows the user to either turn off location sharing entirely or only stop " |
| "sharing their location with the members of conversation C." |
| msgstr "" |
| "Nhấp vào nút chia sẻ vị trí cuối. Điều này sẽ đưa ra một pop-up cho phép " |
| "người dùng tắt chia sẻ vị trí hoàn toàn hoặc chỉ ngừng chia sẻ vị trí của họ" |
| " với các thành viên của cuộc trò chuyện C." |
| |
| #: ../../../developer/location-sharing.md:30 |
| msgid "Pinned window" |
| msgstr "Chiếc cửa sổ đệm" |
| |
| #: ../../../developer/location-sharing.md:32 |
| msgid "" |
| "If the window is unpinned, the user will not be able to click on the " |
| "location sharing button because the window is no longer connected to a " |
| "conversation. To start sharing location with new people, the user must re-" |
| "pin the window. Note that unpinning the window does not affect any ongoing " |
| "location sharing. Additionally, clicking on the location sharing end button " |
| "while the window is unpinned will stop all current location sharing and no " |
| "pop-up will appear to allow the user to select a specific conversation to " |
| "stop sharing with." |
| msgstr "" |
| "Nếu cửa sổ không được gắn, người dùng sẽ không thể nhấp vào nút chia sẻ vị " |
| "trí vì cửa sổ không còn kết nối với cuộc trò chuyện. Để bắt đầu chia sẻ vị " |
| "trí với những người mới, người dùng phải nhấp lại cửa sổ. Lưu ý rằng việc gỡ" |
| " bỏ cửa sổ không ảnh hưởng đến bất kỳ chia sẻ vị trí nào liên tục. Ngoài ra," |
| " nhấp vào nút chia sẻ vị trí cuối trong khi cửa sổ được gỡ bỏ sẽ dừng tất cả" |
| " chia sẻ vị trí hiện tại và không có bật lên sẽ xuất hiện để cho phép người " |
| "dùng chọn một cuộc trò chuyện cụ thể để ngừng chia sẻ." |
| |
| #: ../../../developer/location-sharing.md:34 |
| msgid "Multi accounts" |
| msgstr "Nhiều tài khoản" |
| |
| #: ../../../developer/location-sharing.md:36 |
| msgid "" |
| "Each account has its own unique map. If the user unpins the map while on " |
| "account A, then switches to account B and unpins the map, two maps will be " |
| "visible. The maps for accounts A and B display positions shared with those " |
| "accounts, respectively, and are completely separate from each other" |
| msgstr "" |
| "Mỗi tài khoản có bản đồ độc đáo của riêng mình. Nếu người dùng gỡ bản đồ " |
| "trong khi trên tài khoản A, sau đó chuyển sang tài khoản B và gỡ bản đồ, hai" |
| " bản đồ sẽ hiển thị. Các bản đồ cho tài khoản A và B hiển thị vị trí được " |
| "chia sẻ với các tài khoản đó, tương ứng, và hoàn toàn tách biệt với nhau" |
| |
| #: ../../../developer/location-sharing.md:44 |
| msgid "This feature is divided into three parts:" |
| msgstr "Tính năng này được chia thành ba phần:" |
| |
| #: ../../../developer/location-sharing.md:46 |
| msgid "Sending one's position" |
| msgstr "Đưa vị trí của người ta" |
| |
| #: ../../../developer/location-sharing.md:47 |
| #: ../../../developer/location-sharing.md:78 |
| msgid "Receiving a position" |
| msgstr "Nhận một vị trí" |
| |
| #: ../../../developer/location-sharing.md:48 |
| #: ../../../developer/location-sharing.md:89 |
| msgid "Displaying a position" |
| msgstr "Khán giả" |
| |
| #: ../../../developer/location-sharing.md:50 |
| msgid "" |
| "To determine the location, [Qt " |
| "Positioning](https://doc.qt.io/qt-6/qtpositioning-index.html) API is used. " |
| "Once the position is determined, it is sent as a message on the DHT and is " |
| "transmitted to the client. The received position is then displayed using the" |
| " [OpenLayers](https://openlayers.org/) JavaScript library." |
| msgstr "" |
| "Để xác định vị trí, [Qt Positioning] (https://doc.qt.io/qt-6/qtpositioning-" |
| "index.html) API được sử dụng. Một khi vị trí được xác định, nó được gửi như " |
| "một tin nhắn trên DHT và được truyền đến khách hàng. vị trí nhận được sau đó" |
| " được hiển thị bằng thư viện JavaScript [OpenLayers] " |
| "(https://openlayers.org/)." |
| |
| #: ../../../developer/location-sharing.md:53 |
| msgid "Sending a position" |
| msgstr "Gửi một vị trí" |
| |
| #: ../../../developer/location-sharing.md:55 |
| msgid "" |
| "As soon as a map is opened, the `Positioning` class takes care of retrieving" |
| " the current position using the `QGeoPositionInfoSource` class of the " |
| "`QtPositioning` module. The position is then converted to JSON format and is" |
| " transmitted to the `positionManager`. This class coordinates the entire " |
| "position sharing process. The position is then shared through the " |
| "`sendPosition()` function. It is shared:" |
| msgstr "" |
| "Ngay khi mở bản đồ, lớp `Positioning` đảm bảo lấy lại vị trí hiện tại bằng " |
| "cách sử dụng lớp `QGeoPositionInfoSource` của mô-đun `QtPositioning`." |
| |
| #: ../../../developer/location-sharing.md:61 |
| msgid "" |
| "Locally through the `localPositionReceived` signal so that the user can see " |
| "their own position" |
| msgstr "" |
| "Địa điểm địa phương thông qua tín hiệu `localPositionReceived` để người dùng" |
| " có thể thấy vị trí của mình" |
| |
| #: ../../../developer/location-sharing.md:63 |
| msgid "" |
| "On the DHT to all conversations in the `positionShareConvIds_` list. This " |
| "list contains the keys of all conversations that the user wants to share " |
| "their position with. From this key, the URIs of all participants are " |
| "obtained and a position message is sent to each participant." |
| msgstr "" |
| "Trên DHT để tất cả các cuộc trò chuyện trong danh sách " |
| "`positionShareConvIds_`. Danh sách này chứa các chìa khóa của tất cả các " |
| "cuộc trò chuyện mà người dùng muốn chia sẻ vị trí của họ với. Từ khóa này, " |
| "các URI của tất cả các đối tác được lấy và một thông điệp vị trí được gửi " |
| "đến mỗi đối tác." |
| |
| #: ../../../developer/location-sharing.md:65 |
| msgid "The JSON format of a position is as follows:" |
| msgstr "Các định dạng JSON của một vị trí là như sau:" |
| |
| #: ../../../developer/location-sharing.md:67 |
| msgid "Type (position or stop message)" |
| msgstr "Tiêu thức (tin nhắn vị trí hoặc dừng)" |
| |
| #: ../../../developer/location-sharing.md:68 |
| msgid "Latitude" |
| msgstr "Độ vĩ độ" |
| |
| #: ../../../developer/location-sharing.md:69 |
| msgid "Longitude" |
| msgstr "Độ dài" |
| |
| #: ../../../developer/location-sharing.md:70 |
| msgid "Time (unused by the QtClient)" |
| msgstr "Thời gian (không được sử dụng bởi QtClient)" |
| |
| #: ../../../developer/location-sharing.md:72 |
| msgid "" |
| "An example of data: " |
| "`{\\\"lat\\\":45.51616583988481,\\\"long\\\":-73.620693,\\\"time\\\":1671658862000,\\\"type\\\":\\\"Position\\\"}`" |
| msgstr "" |
| "Ví dụ về dữ liệu: " |
| "`{\\\"lat\\\":45.51616583988481,\\\"long\\\":-73.620693,\\\"time\\\":1671658862000,\\\"type\\\":\\\"Position\\\"}`" |
| |
| #: ../../../developer/location-sharing.md:74 |
| msgid "" |
| "When sending the position to the daemon, the author's URI is also " |
| "transmitted." |
| msgstr "Khi gửi vị trí cho con quái vật, URI của tác giả cũng được truyền." |
| |
| #: ../../../developer/location-sharing.md:76 |
| msgid "" |
| "When the user stops sharing their position with a conversation, the " |
| "conversation's ID is simply removed from the `positionShareConvIds_` list. A" |
| " \"stop\" message is also sent to each participant." |
| msgstr "" |
| "Khi người dùng ngừng chia sẻ vị trí của mình với một cuộc trò chuyện, ID của" |
| " cuộc trò chuyện chỉ đơn giản là được xóa khỏi danh sách " |
| "`positionShareConvIds_`." |
| |
| #: ../../../developer/location-sharing.md:80 |
| msgid "" |
| "When a position is received, it triggers the 'onPositionReceived()' slot. " |
| "Whether it is a local position from the `QtPositioning` module or a position" |
| " from another contact. At the `positionManager` level, the " |
| "`objectListSharingUris_` list stores all of the client's positions. The " |
| "position is either:" |
| msgstr "" |
| "Khi một vị trí được nhận, nó kích hoạt khe \"onPositionReceived() \" dù đó " |
| "là một vị trí địa phương từ mô-đun `QtPositioning` hoặc một vị trí từ một " |
| "liên lạc khác." |
| |
| #: ../../../developer/location-sharing.md:83 |
| msgid "Added (the URI is not present in the list)" |
| msgstr "Thêm (URI không có trong danh sách)" |
| |
| #: ../../../developer/location-sharing.md:84 |
| msgid "Updated (the URI is already present in the list)" |
| msgstr "Được cập nhật (URI đã có mặt trong danh sách)" |
| |
| #: ../../../developer/location-sharing.md:85 |
| msgid "Deleted (type = \"Stop\")" |
| msgstr "Deleted (type = \"Stop\")" |
| |
| #: ../../../developer/location-sharing.md:87 |
| msgid "" |
| "The position is stored in the list in the form of an object of type " |
| "`positionObject`. This type allows for a watchdog for each position. If the " |
| "position is not updated within a certain time frame, it is removed from the " |
| "list." |
| msgstr "" |
| "Vị trí được lưu trữ trong danh sách dưới dạng một đối tượng kiểu " |
| "`positionObject`." |
| |
| #: ../../../developer/location-sharing.md:91 |
| msgid "" |
| "When a position is received (slot `onPositionReceived()` triggered), the " |
| "position is transmitted to Qml which in turn sends the information to the " |
| "[OpenLayers](https://openlayers.org/) JavaScript library. The Qt `WebEngine`" |
| " module allows for the bridge between the library's web technology and Qml. " |
| "Each position is represented by a layer added to the map. The " |
| "`newPosition()` function adds a new layer, the `updatePosition()` function " |
| "updates the coordinates of the layer, and the `removePosition()` function " |
| "removes the layer." |
| msgstr "" |
| "Khi một vị trí được nhận (slot `onPositionReceived() ` kích hoạt), vị trí " |
| "được truyền đến Qml, mà sau đó gửi thông tin đến thư viện JavaScript " |
| "[https://openlayers.org/)." |
| |
| #: ../../../developer/message-displayed-status.md:1 |
| msgid "Message displayed status" |
| msgstr "Tình trạng hiển thị thông điệp" |
| |
| #: ../../../developer/message-displayed-status.md:4 |
| msgid "" |
| "Every client generally must be able to show what peer read what message and " |
| "get how many unread messages there is." |
| msgstr "" |
| "Mỗi khách hàng nói chung phải có thể cho thấy những người đồng nghiệp đọc " |
| "những tin nhắn nào và nhận biết có bao nhiêu tin nhắn chưa đọc." |
| |
| #: ../../../developer/message-displayed-status.md:6 |
| msgid "For this, the daemon provides some APIs:" |
| msgstr "Để làm điều này, con quỷ cung cấp một số API:" |
| |
| #: ../../../developer/message-displayed-status.md:8 |
| msgid "Set a message displayed" |
| msgstr "Đặt một tin nhắn hiển thị" |
| |
| #: ../../../developer/message-displayed-status.md:10 |
| msgid "The Configuration manager provides:" |
| msgstr "Configuration manager cung cấp:" |
| |
| #: ../../../developer/message-displayed-status.md:46 |
| msgid "" |
| "to set a message as displayed. Should be done when the interaction is shown " |
| "and the conversation selected." |
| msgstr "" |
| "để đặt một tin nhắn như hiển thị. nên được thực hiện khi tương tác được hiển" |
| " thị và cuộc trò chuyện được chọn." |
| |
| #: ../../../developer/message-displayed-status.md:48 |
| msgid "" |
| "This sends a SIP messages to connected peers with the following format:" |
| msgstr "" |
| "Điều này gửi một tin nhắn SIP cho các đồng nghiệp kết nối với định dạng sau:" |
| |
| #: ../../../developer/message-displayed-status.md:66 |
| msgid "" |
| "Then the peer will know this via `onMessageDisplayed` and emit a signal to " |
| "the client (`libjami::ConfigurationSignal::AccountMessageStatusChanged` with" |
| " status 3 (`libjami::Account::MessageStates::DISPLAYED`))" |
| msgstr "" |
| "Sau đó, người đồng nghiệp sẽ biết điều này thông qua `onMessageDisplayed` và" |
| " phát ra một tín hiệu cho khách hàng " |
| "(`libjami::ConfigurationSignal::AccountMessageStatusChanged` với trạng thái " |
| "3 (`libjami::Account::MessageStates::DISPLAYED`))" |
| |
| #: ../../../developer/message-displayed-status.md:68 |
| msgid "Get unread messages" |
| msgstr "Nhận tin nhắn chưa đọc" |
| |
| #: ../../../developer/message-displayed-status.md:70 |
| msgid "" |
| "By knowing the lastDisplayedMessage for our account, we can use this " |
| "informations and `ConfigrationManager::countInteractionsSince` which count " |
| "interaction since last message to a given message (typically last displayed " |
| "interaction)" |
| msgstr "" |
| "Bằng cách biết LastDisplayedMessage cho tài khoản của chúng tôi, chúng tôi " |
| "có thể sử dụng thông tin này và " |
| "`ConfigrationManager::countInteractionsSince`, tính tương tác từ thông điệp " |
| "cuối cùng đến thông điệp nhất định (thường là tương tác cuối cùng được hiển " |
| "thị)" |
| |
| #: ../../../developer/message-displayed-status.md:72 |
| msgid "" |
| "To get last displayed message for a member, in " |
| "`Configuration::getConversationMembers` each member will have the last " |
| "displayed interaction available via `memberInfo[\"lastDisplayed\"]`" |
| msgstr "" |
| "Để có được thông điệp hiển thị cuối cùng cho một thành viên, trong " |
| "`Configuration::getConversationMembers` mỗi thành viên sẽ có tương tác hiển " |
| "thị cuối cùng có sẵn thông qua `memberInfo[\"LastDisplayed\"]`" |
| |
| #: ../../../developer/message-displayed-status.md:74 |
| msgid "How this information is stored" |
| msgstr "Cách lưu trữ thông tin này" |
| |
| #: ../../../developer/message-displayed-status.md:76 |
| msgid "" |
| "In `src/jamidht/conversation.cpp` each conversation store the last displayed" |
| " messages in a map<string, string> (uri, interactionId) and this structure " |
| "is serialized in " |
| "`fileutils::get_data_dir()/getAccountID()/conversation_data/repository_->id()/lastDisplayed`" |
| msgstr "" |
| "Trong `src/jamidht/conversation.cpp` mỗi cuộc trò chuyện lưu trữ các tin " |
| "nhắn cuối cùng được hiển thị trong một bản đồ<string, string> (uri, " |
| "interactionId) và cấu trúc này được phân phối theo chuỗi trong " |
| "`fileutils::get_data_dir()/getAccountID()/conversation_data/repository_->id()/lastDisplayed`" |
| |
| #: ../../../developer/name-server-protocol.md:1 |
| msgid "Name Server protocol" |
| msgstr "Tên Protocol Server" |
| |
| #: ../../../developer/name-server-protocol.md:4 |
| msgid "" |
| "The protocol used by Jami to query and register a name is based on an HTTP " |
| "[REST](https://en.wikipedia.org/wiki/Representational_state_transfer) API " |
| "answering requests with JSON documents and regular HTTP status codes." |
| msgstr "" |
| "Các giao thức được sử dụng bởi Jami để truy vấn và đăng ký một tên dựa trên " |
| "HTTP [REST] (https://en.wikipedia.org/wiki/Representational_state_transfer) " |
| "API trả lời các yêu cầu với tài liệu JSON và mã trạng thái HTTP thường " |
| "xuyên." |
| |
| #: ../../../developer/name-server-protocol.md:10 |
| msgid "" |
| "The public nameserver is hosted at `ns.jami.net` and uses a blockchain as " |
| "its backend. Another implementation could use any other database or " |
| "directory service making the nameserver protocol reusable." |
| msgstr "" |
| "Các máy chủ tên công cộng được lưu trữ tại `ns.jami.net` và sử dụng một " |
| "blockchain như là hậu trường của nó." |
| |
| #: ../../../developer/name-server-protocol.md:14 |
| msgid "" |
| "If you run your own nameserver, looking up a username in the form of " |
| "`username@example.com` will look up the name `username` with the nameserver " |
| "at `example.com`. (There is no need to add `@ns.jami.net` to use the " |
| "default nameserver.)" |
| msgstr "" |
| "Nếu bạn chạy máy chủ tên riêng của mình, tìm kiếm một tên người dùng dưới " |
| "dạng `username@example.com` sẽ tìm kiếm tên người dùng ` với máy chủ tên ở " |
| "`example.com`. (Không cần thêm `@ns.jami.net` để sử dụng máy chủ tên mặc " |
| "định.)" |
| |
| #: ../../../developer/name-server-protocol.md:19 |
| msgid "Rules on name formatting" |
| msgstr "Quy tắc định dạng tên" |
| |
| #: ../../../developer/name-server-protocol.md:22 |
| msgid "" |
| "Usernames are checked by a regex to ensure some rules about their format:" |
| msgstr "" |
| "Tên người dùng được kiểm tra bởi một regex để đảm bảo một số quy tắc về định" |
| " dạng của chúng:" |
| |
| #: ../../../developer/name-server-protocol.md:25 |
| msgid "Length must be between 3 and 32 characters" |
| msgstr "Độ dài phải từ 3 đến 32 ký tự" |
| |
| #: ../../../developer/name-server-protocol.md:26 |
| msgid "" |
| "Those characters must be alphanumerical with dashes `-` being also accepted." |
| msgstr "" |
| |
| #: ../../../developer/name-server-protocol.md:29 |
| msgid "Querying a name" |
| msgstr "Tìm kiếm tên" |
| |
| #: ../../../developer/name-server-protocol.md:32 |
| msgid "" |
| "This is the main service provided by a name server. It enables getting the " |
| "Jami ID corresponding to a username." |
| msgstr "" |
| "Đây là dịch vụ chính được cung cấp bởi một máy chủ tên. Nó cho phép nhận " |
| "được ID Jami tương ứng với một tên người dùng." |
| |
| #: ../../../developer/name-server-protocol.md:35 |
| #: ../../../developer/name-server-protocol.md:83 |
| #: ../../../developer/name-server-protocol.md:131 |
| msgid "Request" |
| msgstr "Yêu cầu" |
| |
| #: ../../../developer/name-server-protocol.md:37 |
| msgid "" |
| "A request for the name `foobar` is a `GET` request with `/name/`*`foobar`* " |
| "as the URI." |
| msgstr "" |
| "Một yêu cầu cho tên `foobar` là một yêu cầu `GET` với `/name/`*`foobar`* như" |
| " URI." |
| |
| #: ../../../developer/name-server-protocol.md:40 |
| #: ../../../developer/name-server-protocol.md:89 |
| #: ../../../developer/name-server-protocol.md:150 |
| msgid "Response (Success)" |
| msgstr "Phản ứng (Sự thành công)" |
| |
| #: ../../../developer/name-server-protocol.md:42 |
| msgid "" |
| "If the name is found, a response with status code `200` `OK` must be sent to" |
| " the client with a `Content-type` field set as `application/json`." |
| msgstr "" |
| "Nếu tên được tìm thấy, một câu trả lời với mã trạng thái `200` `OK` phải " |
| "được gửi cho khách hàng với một trường `Content-type` được đặt là " |
| "`application/json`." |
| |
| #: ../../../developer/name-server-protocol.md:46 |
| msgid "" |
| "The body is a JSON documents with 2 string attributes : `name` and `addr`. " |
| "`name` is equal to the one requested and `addr` is an hexadecimal " |
| "representation of the Jami ID prefixed with `0x`." |
| msgstr "" |
| "Cơ thể là một tài liệu JSON với 2 thuộc tính chuỗi: `name` và `addr`. `name`" |
| " bằng với yêu cầu và `addr` là một đại diện sáu thập kỷ của ID Jami được gắn" |
| " với `0x`." |
| |
| #: ../../../developer/name-server-protocol.md:50 |
| #: ../../../developer/name-server-protocol.md:98 |
| msgid "In our example, the JSON answer would be:" |
| msgstr "Trong ví dụ của chúng tôi, câu trả lời JSON sẽ là:" |
| |
| #: ../../../developer/name-server-protocol.md:59 |
| #: ../../../developer/name-server-protocol.md:106 |
| msgid "Response (Not found)" |
| msgstr "Phản ứng (Không tìm thấy)" |
| |
| #: ../../../developer/name-server-protocol.md:61 |
| msgid "" |
| "If the name is not found, a response with status code `404` `Not` `Found` " |
| "must be sent to the client with a `Content-type` field set as " |
| "`application/json`." |
| msgstr "" |
| "Nếu tên không được tìm thấy, một câu trả lời với mã trạng thái `404` `Not` " |
| "`Found` phải được gửi đến khách hàng với một trường `Content-type` được đặt " |
| "là `application/json`." |
| |
| #: ../../../developer/name-server-protocol.md:65 |
| #: ../../../developer/name-server-protocol.md:112 |
| msgid "" |
| "The body is a JSON documents with 1 string attribute : `error`. This " |
| "attribute is filled with an error message that explains the error (and could" |
| " be displayed in the client in the future)." |
| msgstr "" |
| "Cơ thể là một tài liệu JSON với 1 thuộc tính chuỗi: `error`. thuộc tính này " |
| "được lấp đầy với một thông báo lỗi giải thích lỗi (và có thể được hiển thị " |
| "trong client trong tương lai)." |
| |
| #: ../../../developer/name-server-protocol.md:69 |
| #: ../../../developer/name-server-protocol.md:116 |
| msgid "On the reference implementation, the returned document is:" |
| msgstr "Về việc thực hiện tham chiếu, tài liệu trả lại là:" |
| |
| #: ../../../developer/name-server-protocol.md:77 |
| msgid "Querying an address" |
| msgstr "Tìm kiếm địa chỉ" |
| |
| #: ../../../developer/name-server-protocol.md:80 |
| msgid "" |
| "This service is a reverse lookup. You query for an address and a username " |
| "is returned if one is registered on the name server." |
| msgstr "" |
| "Dịch vụ này là tìm kiếm ngược. Bạn truy vấn một địa chỉ và một tên người " |
| "dùng sẽ được trả lại nếu một tên đăng ký trên máy chủ tên." |
| |
| #: ../../../developer/name-server-protocol.md:85 |
| msgid "" |
| "A request for the ID `jami:29347542eb07159f316577e1ae16243d152f6b7b` is a " |
| "`GET` request with `/addr/`*`29347542eb07159f316577e1ae16243d152f6b7b`* as " |
| "the URI." |
| msgstr "" |
| "Một yêu cầu về ID `jami:29347542eb07159f316577e1ae16243d152f6b7b` là một yêu" |
| " cầu `GET` với `/addr/`*29347542eb07159f316577e1ae16243d152f6b7b`* như URI." |
| |
| #: ../../../developer/name-server-protocol.md:91 |
| msgid "" |
| "If the address corresponds to a username, a response with status code `200` " |
| "`OK` must be sent to the client with a `Content-type` field set as " |
| "`application/json`." |
| msgstr "" |
| "Nếu địa chỉ tương ứng với tên người dùng, một câu trả lời với mã trạng thái " |
| "`200` `OK` phải được gửi đến khách hàng với một trường `Content-type` được " |
| "đặt là `application/json`." |
| |
| #: ../../../developer/name-server-protocol.md:95 |
| msgid "" |
| "The body is a JSON documents with 1 string attribute : `name`. The value of" |
| " this field is the name registered to this address" |
| msgstr "" |
| "Cơ thể là một tài liệu JSON với 1 thuộc tính chuỗi: `name`. Giá trị của " |
| "trường này là tên đăng ký vào địa chỉ này" |
| |
| #: ../../../developer/name-server-protocol.md:108 |
| msgid "" |
| "If the address is not found, a response with status code `404` `Not` `Found`" |
| " must be sent to the client with a `Content-type` field set as " |
| "`application/json`." |
| msgstr "" |
| "Nếu không tìm thấy địa chỉ, một câu trả lời với mã trạng thái `404` `Not` " |
| "`Found` phải được gửi đến khách hàng với một trường `Content-type` được đặt " |
| "là `application/json`." |
| |
| #: ../../../developer/name-server-protocol.md:124 |
| msgid "Registering a name" |
| msgstr "Đăng ký tên" |
| |
| #: ../../../developer/name-server-protocol.md:127 |
| msgid "" |
| "This part of the protocol is used to register a new name/address pair. It is" |
| " used on the main public registry but may be optional in a custom " |
| "implementation." |
| msgstr "" |
| "Phần này của giao thức được sử dụng để đăng ký một cặp tên / địa chỉ mới. Nó" |
| " được sử dụng trên đăng ký công cộng chính nhưng có thể là tùy chọn trong " |
| "một thực hiện tùy chỉnh." |
| |
| #: ../../../developer/name-server-protocol.md:133 |
| msgid "" |
| "A request for registering the name `foobar` is a `POST` request with " |
| "`/name/`*`foobar`* as the URI. The header attribute `Content-type` must be " |
| "set to `application/json`." |
| msgstr "" |
| "Một yêu cầu đăng ký tên `foobar` là một yêu cầu `POST` với " |
| "`/name/`*`foobar`* như URI." |
| |
| #: ../../../developer/name-server-protocol.md:137 |
| msgid "" |
| "The body of the request is a JSON document with 2 string attributes: `addr` " |
| "and `owner`. `addr` contains the Jami ID prefixed with `0x` and `owner` is " |
| "the name to be registered." |
| msgstr "" |
| "Cơ thể của yêu cầu là một tài liệu JSON với 2 thuộc tính chuỗi: `addr` và " |
| "`owner`. `addr` chứa ID Jami được gắn với `0x` và `owner` là tên để đăng ký." |
| |
| #: ../../../developer/name-server-protocol.md:141 |
| msgid "An example for `foobar` could be:" |
| msgstr "Một ví dụ cho `foobar` có thể là:" |
| |
| #: ../../../developer/name-server-protocol.md:152 |
| msgid "" |
| "If the name/address pair is successfully registered, a response with status " |
| "code `200` `OK` must be sent to the client with a `Content-type` field set " |
| "as `application/json`." |
| msgstr "" |
| "Nếu cặp tên/địa chỉ được đăng ký thành công, một câu trả lời với mã trạng " |
| "thái `200` `OK` phải được gửi cho khách hàng với một trường `Content-type` " |
| "được đặt là `application/json`." |
| |
| #: ../../../developer/name-server-protocol.md:156 |
| msgid "" |
| "The body contain a JSON document with 1 boolean attribute `success` set to " |
| "`true`." |
| msgstr "" |
| "Cơ thể chứa một tài liệu JSON với 1 thuộc tính boolean `success` được thiết " |
| "lập thành `true`." |
| |
| #: ../../../developer/name-server-protocol.md:159 |
| msgid "As an example:" |
| msgstr "Ví dụ:" |
| |
| #: ../../../developer/name-server-protocol.md:167 |
| msgid "" |
| "Further attempts to query the name or the address should then be successful." |
| msgstr "Sau đó, các nỗ lực tìm kiếm tên hoặc địa chỉ sẽ thành công." |
| |
| #: ../../../developer/name-server-protocol.md:170 |
| msgid "Response (Bad request)" |
| msgstr "Phản ứng (phát đơn không tốt)" |
| |
| #: ../../../developer/name-server-protocol.md:172 |
| msgid "" |
| "If the registration cannot be achieved because of an error in the request " |
| "(formatting, missing attribute, etc.), a response with status code `400` " |
| "`Bad` `Request` must be sent to the client with a `Content-type` field set " |
| "as `application/json`." |
| msgstr "" |
| "Nếu đăng ký không thể đạt được do lỗi trong yêu cầu (phát định, thuộc tính " |
| "thiếu, v.v.), một câu trả lời với mã trạng thái `400` `Bad` `Request` phải " |
| "được gửi đến khách hàng với một trường `Content-type` được đặt là " |
| "`application/json`." |
| |
| #: ../../../developer/name-server-protocol.md:177 |
| msgid "" |
| "The body is a JSON documents with 2 attributes: `success` which is a boolean" |
| " and `error` which is a string. `success` is set to `false` and `error` is " |
| "filled with an error message that explains the error (and could be displayed" |
| " in the client in the future)." |
| msgstr "" |
| "Cơ thể là một tài liệu JSON với 2 thuộc tính: `success` là một boolean và " |
| "`error` là một chuỗi. `success` được đặt là `false` và `error` được lấp đầy " |
| "với một thông báo lỗi giải thích lỗi (và có thể được hiển thị trong khách " |
| "hàng trong tương lai)." |
| |
| #: ../../../developer/name-server-protocol.md:182 |
| msgid "For an invalid formatting of the username, the body could be:" |
| msgstr "Đối với định dạng không hợp lệ của tên người dùng, cơ thể có thể là:" |
| |
| #: ../../../developer/name-server-protocol.md:191 |
| msgid "Response (Forbidden)" |
| msgstr "Phản ứng (được cấm)" |
| |
| #: ../../../developer/name-server-protocol.md:193 |
| msgid "" |
| "If the registration cannot be achieved because the name is already taken, a " |
| "response with status code `403` `Forbidden` must be sent to the client with " |
| "a `Content-type` field set as `application/json`." |
| msgstr "" |
| "Nếu đăng ký không thể đạt được vì tên đã được lấy, một câu trả lời với mã " |
| "trạng thái `403` `Banned` phải được gửi đến khách hàng với một trường " |
| "`Content-type` được đặt là `application/json`." |
| |
| #: ../../../developer/name-server-protocol.md:197 |
| msgid "" |
| "The body is a JSON documents with 3 attributes: `success` which is a boolean" |
| " set to `false`, `name` and `addr` which are both strings replicated from " |
| "the original request." |
| msgstr "" |
| "Cơ thể là một tài liệu JSON với 3 thuộc tính: `success` là một tập hợp " |
| "boolean cho `false`, `name` và `addr`, cả hai đều là chuỗi sao chép từ yêu " |
| "cầu ban đầu." |
| |
| #: ../../../developer/name-server-protocol.md:201 |
| msgid "" |
| "Registering `foobar`, with it being already registered, would lead to the " |
| "following response:" |
| msgstr "" |
| "Việc đăng ký `foobar`, khi nó đã được đăng ký, sẽ dẫn đến phản ứng sau:" |
| |
| #: ../../../developer/name-server-protocol.md:212 |
| msgid "Some links" |
| msgstr "Một số liên kết" |
| |
| #: ../../../developer/name-server-protocol.md:215 |
| msgid "" |
| "{gitlab-project}`jami-nameservice`: reference NodeJS implementation used by " |
| "`ns.jami.net` and querying an Ethereum node." |
| msgstr "" |
| "{gitlab-project}`jami-nameservice`: thực hiện NodeJS tham chiếu được sử dụng" |
| " bởi `ns.jami.net` và truy vấn một nút Ethereum." |
| |
| #: ../../../developer/protocol.md:1 ../../../developer/swarm.md:401 |
| msgid "Protocol" |
| msgstr "Phương pháp" |
| |
| #: ../../../developer/protocol.md:4 |
| msgid "Jami account creation" |
| msgstr "" |
| |
| #: ../../../developer/protocol.md:7 |
| msgid "" |
| "A **Jami account** is defined by an **RSA key pair** with a key length of at" |
| " least 4096 bits." |
| msgstr "" |
| |
| #: ../../../developer/protocol.md:10 |
| msgid "" |
| "The standard x509 160-bits fingerprint of the account public key is called " |
| "the **RingID**." |
| msgstr "" |
| "Các dấu vân tay x509 160 bit tiêu chuẩn của khóa công khai tài khoản được " |
| "gọi là **RingID**." |
| |
| #: ../../../developer/protocol.md:13 |
| msgid "" |
| "The account public key is used as the subject of an x509 certificate that " |
| "must be valid, have the Certificate Authority flag set, and can be self-" |
| "signed. This certificate is called the **Jami account certificate**." |
| msgstr "" |
| |
| #: ../../../developer/protocol.md:18 |
| msgid "" |
| "The subject UID field of the account certificate must be the hexadecimal " |
| "form of the public key fingerprint. The issuer UID field must be the " |
| "hexadecimal form of the issuer public key fingerprint." |
| msgstr "" |
| "Vùng UID đối tượng của chứng chỉ tài khoản phải là hình thức heksadecimal " |
| "của dấu vân tay khóa công cộng." |
| |
| #: ../../../developer/protocol.md:22 |
| msgid "Persisting the account" |
| msgstr "Cung cấp tài khoản" |
| |
| #: ../../../developer/protocol.md:24 |
| msgid "" |
| "Persisting a Jami account private key and certificate is implementation " |
| "defined." |
| msgstr "" |
| |
| #: ../../../developer/protocol.md:27 |
| msgid "" |
| "Access to a saved Jami account private key must be authenticated and " |
| "authorized. Authentication and authorization method to access the account " |
| "private key is implementation defined." |
| msgstr "" |
| |
| #: ../../../developer/protocol.md:31 |
| msgid "Adding a device to a Jami account" |
| msgstr "" |
| |
| #: ../../../developer/protocol.md:33 |
| msgid "*See [RFC 5280](https://tools.ietf.org/html/rfc5280)*" |
| msgstr "* Xem [RFC 5280]" |
| |
| #: ../../../developer/protocol.md:35 |
| msgid "" |
| "A **device** is defined by an RSA key pair with a key length of at least " |
| "4096 bits." |
| msgstr "" |
| "Một ** thiết bị** được định nghĩa bởi một cặp phím RSA với chiều dài phím ít" |
| " nhất 4096 bit." |
| |
| #: ../../../developer/protocol.md:38 |
| msgid "" |
| "A **device certificate** is defined as an x509 certificate whose subject is " |
| "a device public key, signed with an account private key. The certificate " |
| "MUST be valid. The issuer UID field MUST be the hexadecimal form of the " |
| "account public key fingerprint." |
| msgstr "" |
| "Một chứng chỉ ** thiết bị** được định nghĩa là một chứng chỉ x509 có chủ đề " |
| "là một khóa công khai thiết bị, được ký bằng khóa riêng của tài khoản." |
| |
| #: ../../../developer/protocol.md:43 |
| msgid "" |
| "Persisting a device private key and certificate is implementation defined. " |
| "Access to a saved device private key should be authenticated. Authentication" |
| " method to access the device private key is implementation defined." |
| msgstr "" |
| "Cung cấp khóa riêng của thiết bị và chứng chỉ là việc thực hiện được xác " |
| "định. Việc truy cập vào khóa riêng của thiết bị được lưu lại phải được xác " |
| "thực." |
| |
| #: ../../../developer/protocol.md:48 |
| msgid "Removing a device from a Jami account" |
| msgstr "" |
| |
| #: ../../../developer/protocol.md:50 |
| msgid "" |
| "A device can be \"removed\" from a Jami account through revocation of the " |
| "device certificate. Revoked device certificates are added to one or more " |
| "standard x509 Certificate Revocation List (CRL). CRLs for revoked device " |
| "must be valid and signed with the corresponding CA key, which is the Jami " |
| "account private key." |
| msgstr "" |
| |
| #: ../../../developer/protocol.md:56 |
| msgid "Account transmission format" |
| msgstr "Tạng chuyển giao tài khoản" |
| |
| #: ../../../developer/protocol.md:58 |
| msgid "" |
| "The **account archive format** defines how to serialize an account private " |
| "key for transmission, for instance to sign a new device certificate." |
| msgstr "" |
| "Các **conto archive format** xác định cách để xoay trình một khóa riêng tư " |
| "tài khoản để truyền tải, ví dụ để ký một chứng chỉ thiết bị mới." |
| |
| #: ../../../developer/protocol.md:62 |
| msgid "" |
| "The account archive is an encrypted JSON object with the following " |
| "structure:" |
| msgstr "" |
| "Tệp lưu trữ tài khoản là một đối tượng JSON được mã hóa với cấu trúc sau:" |
| |
| #: ../../../developer/protocol.md:73 |
| msgid "" |
| "The JSON object can contain additional implementation-defined key-value " |
| "pairs. Implementation-defined key names shouldn't start with \"ring\"." |
| msgstr "" |
| "Đối tượng JSON có thể chứa các cặp giá trị khóa được xác định bởi thực hiện." |
| " Tên khóa được xác định bởi thực hiện không nên bắt đầu bằng \"đánh\"." |
| |
| #: ../../../developer/protocol.md:76 |
| msgid "The string JSON object is encrypted using a key defined as :" |
| msgstr "" |
| "Các string JSON đối tượng được mã hóa bằng cách sử dụng một khóa được định " |
| "nghĩa như:" |
| |
| #: ../../../developer/protocol.md:83 |
| msgid "" |
| "Where PIN is a random 32bits number in hexadecimal form, \"+\" is string " |
| "concatenation, timestamp is the current UNIX timestamp divided by 1200 (20 " |
| "minutes) and password is a user-chosen password." |
| msgstr "" |
| "Ở đó PIN là một số 32 bit ngẫu nhiên trong dạng sáu thập kỷ, \"+\" là chuỗi " |
| "kết nối, dấu thời gian là dấu thời gian UNIX hiện tại được chia bằng 1200 " |
| "(20 phút) và mật khẩu là mật khẩu được người dùng chọn." |
| |
| #: ../../../developer/protocol.md:87 |
| msgid "" |
| "The PIN should be shown to the user to be copied manually on the new " |
| "physical device along with the password." |
| msgstr "" |
| "PIN nên được hiển thị cho người dùng để sao chép bằng tay trên thiết bị vật " |
| "lý mới cùng với mật khẩu." |
| |
| #: ../../../developer/protocol.md:90 |
| msgid "Contacting another account" |
| msgstr "Liên hệ với tài khoản khác" |
| |
| #: ../../../developer/protocol.md:93 |
| msgid "ICE descriptor exchange over OpenDHT" |
| msgstr "Giao dịch mô tả ICE với OpenDHT" |
| |
| #: ../../../developer/protocol.md:95 |
| msgid "**Listening for incoming calls**" |
| msgstr "** Nghe các cuộc gọi tiếp theo**" |
| |
| #: ../../../developer/protocol.md:97 |
| msgid "" |
| "A device listens for incoming call by performing a listen OpenDHT operation " |
| "on" |
| msgstr "" |
| "Một thiết bị nghe cho cuộc gọi tiếp nhận bằng cách thực hiện một hoạt động " |
| "OpenDHT nghe trên" |
| |
| #: ../../../developer/protocol.md:100 |
| msgid "`h(\"callto\"+deviceID)`" |
| msgstr "`h(\"callto\"+deviceID) `" |
| |
| #: ../../../developer/protocol.md:102 |
| msgid "" |
| "where h is SHA1, \"+\" is the string concatenation and deviceID is the " |
| "hexadecimal form of the deviceID." |
| msgstr "" |
| "nơi h là SHA1, \"+\" là chuỗi kết nối và deviceID là hình thức heksadecimal " |
| "của deviceID." |
| |
| #: ../../../developer/protocol.md:105 |
| msgid "" |
| "Received OpenDHT values that are not encrypted or not properly signed must " |
| "be dropped. The value must be encrypted with the called device public key " |
| "and signed with the calling device private key according to OpenDHT " |
| "specifications." |
| msgstr "" |
| "Các giá trị OpenDHT được nhận được không được mã hóa hoặc không được ký hiệu" |
| " đúng cách phải bị bỏ đi. Giá trị phải được mã hóa bằng khóa công khai thiết" |
| " bị được gọi và được ký với khóa riêng của thiết bị gọi theo các thông số kỹ" |
| " thuật OpenDHT." |
| |
| #: ../../../developer/protocol.md:110 |
| msgid "**Sending the Initial Offer**" |
| msgstr "**Sending the Initial Offer**" |
| |
| #: ../../../developer/protocol.md:112 |
| msgid "*See [RFC 5245](https://tools.ietf.org/html/rfc5245)*" |
| msgstr "* Xem [RFC 5245]" |
| |
| #: ../../../developer/protocol.md:114 |
| msgid "" |
| "RFC 5245 defines ICE (Interactive Connectivity Establishment), a protocol " |
| "for NAT traversal." |
| msgstr "" |
| "RFC 5245 xác định ICE (Interactive Connectivity Establishment), một giao " |
| "thức cho việc đi qua NAT." |
| |
| #: ../../../developer/protocol.md:117 |
| #: ../../../developer/technical-overview.md:173 |
| msgid "" |
| "ICE is used in Jami to establish a peer-to-peer communication between two " |
| "devices." |
| msgstr "" |
| "ICE được sử dụng ở Jami để thiết lập một giao tiếp ngang hàng giữa hai thiết" |
| " bị." |
| |
| #: ../../../developer/protocol.md:120 |
| msgid "" |
| "The calling device gathers candidates and build an Initial Offer according " |
| "to the ICE specifications and starts the ICE negotiation process." |
| msgstr "" |
| "Thiết bị gọi thu thập ứng cử viên và xây dựng Thỏa thuận ban đầu theo các " |
| "thông số kỹ thuật của ICE và bắt đầu quá trình đàm phán của ICE." |
| |
| #: ../../../developer/protocol.md:124 |
| msgid "" |
| "The calling device puts the encrypted ICE offer (the Initial Offer) on the " |
| "DHT at h(\"callto\"+deviceID) where deviceID is the hexadecimal form of the " |
| "called deviceID." |
| msgstr "" |
| "Thiết bị gọi đặt lời đề nghị ICE mã hóa (Thỏa thuận ban đầu) trên DHT tại " |
| "h(\"callto\"+deviceID) nơi deviceID là hình thức hexadecimal của deviceID " |
| "được gọi." |
| |
| #: ../../../developer/protocol.md:128 |
| msgid "**ICE serialization format**" |
| msgstr "**Tình thức phân phối theo chuỗi của ICE**" |
| |
| #: ../../../developer/protocol.md:130 |
| msgid "" |
| "ICE messages exchanged between peers during a call setup use following " |
| "format. An ICE message is a chunk of binary data, following " |
| "[msgpack](http://msgpack.org/) data format." |
| msgstr "" |
| "Thông điệp ICE được trao đổi giữa các đồng nghiệp trong một cuộc gọi thiết " |
| "lập sử dụng định dạng sau. Một thông điệp ICE là một mảnh dữ liệu nhị phân, " |
| "theo định dạng dữ liệu [msgpack](http://msgpack.org/)." |
| |
| #: ../../../developer/protocol.md:134 |
| msgid "" |
| "This protocol is a compound of msgpack values, successively packed in this " |
| "order:" |
| msgstr "" |
| "Phương thức này là một hợp chất của các giá trị msgpack, liên tiếp được đóng" |
| " gói theo thứ tự này:" |
| |
| #: ../../../developer/protocol.md:138 |
| msgid "" |
| "an integer giving the version of ICE message format protocol used for the " |
| "rest of the data. Current defined protocol version is **1**." |
| msgstr "" |
| "Một số nguyên cho phiên bản của giao thức định dạng thông điệp ICE được sử " |
| "dụng cho phần còn lại của dữ liệu. phiên bản giao thức được xác định hiện " |
| "tại là **1**." |
| |
| #: ../../../developer/protocol.md:139 |
| msgid "" |
| "a 2-elements array of strings of the ICE local session ufrag and the ICE " |
| "local session password" |
| msgstr "" |
| "một chuỗi 2 yếu tố của các chuỗi của phiên ICE địa phương ufrag và mật khẩu " |
| "phiên ICE địa phương" |
| |
| #: ../../../developer/protocol.md:140 |
| msgid "an integer giving the number of components in the ICE session" |
| msgstr "Một số nguyên cho số thành phần trong phiên ICE" |
| |
| #: ../../../developer/protocol.md:141 |
| msgid "" |
| "an array of string, of the previous number entries, where each string " |
| "describe the ICE candidate, formated as an \"a=\" line (without the \"a=\" " |
| "header) described in [rfc5245, section " |
| "4.3](https://tools.ietf.org/html/rfc5245#page-26)" |
| msgstr "" |
| "một chuỗi, của các mục số trước đó, nơi mỗi chuỗi mô tả ứng cử viên ICE, " |
| "định dạng như một dòng \"a=\" (không có tiêu đề \"a=\") được mô tả trong " |
| "[rfc5245, phần 4.3](https://tools.ietf.org/html/rfc5245#page-26)" |
| |
| #: ../../../developer/protocol.md:143 |
| msgid "**Sending the Answer**" |
| msgstr "**Thumela câu trả lời**" |
| |
| #: ../../../developer/protocol.md:145 |
| msgid "" |
| "Upon reception of the encrypted and signed Initial ICE Offer (through the " |
| "listen operation), a called device should perform authorization checks of " |
| "the calling device, identified as the Initial Offer signer. Authorization " |
| "rules are implementation defined, but a typical implementation would " |
| "authorize known or trusted contacts." |
| msgstr "" |
| "Khi nhận được Thỏa thuận ICE ban đầu được mã hóa và ký (thông qua hoạt động " |
| "nghe), một thiết bị được gọi nên thực hiện kiểm tra ủy quyền của thiết bị " |
| "gọi, được xác định là ký kết Thỏa thuận ban đầu." |
| |
| #: ../../../developer/protocol.md:151 |
| #: ../../../developer/technical-overview.md:232 |
| msgid "" |
| "If the calling device is not authorized or if for any implementation defined" |
| " reason the called device refuses the incoming connection request, the " |
| "called device must ignore the Initial Offer and may log the event." |
| msgstr "" |
| "Nếu thiết bị gọi không được phép hoặc nếu vì bất kỳ lý do thực hiện nào được" |
| " xác định, thiết bị gọi từ chối yêu cầu kết nối tiếp theo, thiết bị gọi phải" |
| " phớt lờ đề nghị ban đầu và có thể ghi lại sự kiện." |
| |
| #: ../../../developer/protocol.md:156 |
| #: ../../../developer/technical-overview.md:236 |
| msgid "" |
| "If the called device authorizes the caller and wish to accept the connection" |
| " it must build an ICE answer, start the ICE negotiation process and send the" |
| " encrypted and signed ICE answer at the same DHT key." |
| msgstr "" |
| "Nếu thiết bị gọi cho phép người gọi và muốn chấp nhận kết nối, nó phải xây " |
| "dựng câu trả lời ICE, bắt đầu quá trình đàm phán ICE và gửi câu trả lời ICE " |
| "được mã hóa và ký vào cùng một phím DHT." |
| |
| #: ../../../developer/protocol.md:161 |
| #: ../../../developer/technical-overview.md:241 |
| msgid "DTLS negotiation" |
| msgstr "Cuộc đàm phán DTLS" |
| |
| #: ../../../developer/protocol.md:163 |
| msgid "" |
| "Once a peer-to-peer communication channel has been established, the called " |
| "device listens on it for incoming DTLS connections (acting as a DTLS server)" |
| " while the caller initiates an outgoing DTLS connection (acting as a DTLS " |
| "client)." |
| msgstr "" |
| "Một khi một kênh truyền thông ngang hàng đã được thiết lập, thiết bị được " |
| "gọi nghe trên nó cho các kết nối DTLS nhập (giảng hành như một máy chủ DTLS)" |
| " trong khi người gọi khởi động một kết nối DTLS ra (giảng hành như một khách" |
| " hàng DTLS)." |
| |
| #: ../../../developer/protocol.md:168 |
| msgid "" |
| "The DTLS communication must be RFC6347 compliant " |
| "([1](https://tools.ietf.org/html/rfc6347))." |
| msgstr "" |
| "Thông tin liên lạc DTLS phải tuân thủ RFC6347 " |
| "([1](https://tools.ietf.org/html/rfc6347))." |
| |
| #: ../../../developer/protocol.md:171 |
| msgid "" |
| "Peers must only support PFS cypher suites. The set of supported cypher " |
| "suites is implementation defined but should include at least ECDHE-AES-GCM " |
| "(TODO: specify the exact suites recommended to support)." |
| msgstr "" |
| "Các đồng nghiệp chỉ phải hỗ trợ các bộ mã PFS. Mức bộ mã hỗ trợ được xác " |
| "định thực hiện nhưng phải bao gồm ít nhất ECDHE-AES-GCM (TODO: chỉ định các " |
| "bộ chính xác được khuyến cáo hỗ trợ)." |
| |
| #: ../../../developer/protocol.md:175 |
| msgid "" |
| "During the DTLS handshake, both peers must provide their respective device " |
| "certificate chain and must authenticate the other peer, checking that its " |
| "public key is the same used during the DHT ICE exchange." |
| msgstr "" |
| "Trong thời gian bắt tay DTLS, cả hai đồng nghiệp phải cung cấp chuỗi chứng " |
| "chỉ thiết bị của mình và phải xác thực đồng nghiệp khác, kiểm tra rằng khóa " |
| "công khai của nó là giống như được sử dụng trong thời gian trao đổi DHT ICE." |
| |
| #: ../../../developer/protocol.md:179 |
| msgid "SIP call" |
| msgstr "SIP call" |
| |
| #: ../../../developer/protocol.md:181 |
| msgid "*See [Important\\_RFC](Important_RFC \"wikilink\")*" |
| msgstr "* Xem [Tầm quan trọng\\_RFC]" |
| |
| #: ../../../developer/protocol.md:183 |
| msgid "" |
| "Once an encrypted and authenticated peer-to-peer communication channel is " |
| "available, the SIP protocol [2](https://tools.ietf.org/html/rfc3261) must be" |
| " used to place a call and send messages. The caller might send a SIP INVITE " |
| "as soon as the DTLS channel is established." |
| msgstr "" |
| "Khi một kênh truyền thông ngang hàng được mã hóa và xác thực có sẵn, giao " |
| "thức SIP [2](https://tools.ietf.org/html/rfc3261) phải được sử dụng để đặt " |
| "cuộc gọi và gửi tin nhắn. Người gọi có thể gửi SIP INVITE ngay khi kênh DTLS" |
| " được thiết lập." |
| |
| #: ../../../developer/protocol.md:188 |
| #: ../../../developer/technical-overview.md:277 |
| msgid "The SIP implementation must support ICE and SRTP." |
| msgstr "Việc thực hiện SIP phải hỗ trợ ICE và SRTP." |
| |
| #: ../../../developer/protocol.md:190 |
| #: ../../../developer/technical-overview.md:278 |
| msgid "" |
| "Supported codecs are implementation defined, but Jami clients should support" |
| " the Opus audio coded and the H264 video codec." |
| msgstr "" |
| "Các codec được hỗ trợ là các ứng dụng được xác định, nhưng các khách hàng " |
| "Jami nên hỗ trợ mã âm thanh Opus và codec video H264." |
| |
| #: ../../../developer/protocol.md:193 |
| #: ../../../developer/technical-overview.md:280 |
| msgid "" |
| "SRTP must be used when negotiating media with SIP, using a new random key " |
| "for each media and each negotiation. ICE should be used when negotiating " |
| "media with SIP." |
| msgstr "" |
| "SRTP phải được sử dụng khi đàm phán truyền thông với SIP, sử dụng một khóa " |
| "ngẫu nhiên mới cho mỗi phương tiện truyền thông và mỗi cuộc đàm phán." |
| |
| #: ../../../developer/protocol.md:197 |
| msgid "Cryptographic primitives" |
| msgstr "Các nguyên thủy mật mã" |
| |
| #: ../../../developer/protocol.md:200 |
| msgid "Password stretching" |
| msgstr "Mở khóa mật khẩu" |
| |
| #: ../../../developer/protocol.md:202 |
| msgid "" |
| "*See [Argon2 specifications](https://github.com/P-H-C/phc-winner-" |
| "argon2/blob/master/argon2-specs.pdf)*" |
| msgstr "" |
| "* Xem [đặc chỉ của Argon2]https://github.com/P-H-C/phc-winner-" |
| "argon2/blob/master/argon2-specs.pdf) *" |
| |
| #: ../../../developer/protocol.md:205 |
| msgid "" |
| "Passwords are stretched using argon2i using t\\_cost = 16, m\\_cost = 2\\^16" |
| " (64 MiB), mono-threaded, to generate a 512 bits hash." |
| msgstr "" |
| "Các mật khẩu được kéo dài bằng argon2i sử dụng t\\_cost = 16, m\\_cost = " |
| "2\\^16 (64 MiB), đơn-threaded, để tạo ra một hash 512 bit." |
| |
| #: ../../../developer/protocol.md:208 |
| msgid "" |
| "The result is then hashed again using SHA{1, 256, 512} depending on the " |
| "requested key size." |
| msgstr "" |
| "Kết quả sau đó được phân tích lại bằng cách sử dụng SHA{1, 256, 512} tùy " |
| "thuộc vào kích thước khóa được yêu cầu." |
| |
| #: ../../../developer/protocol.md:211 |
| msgid "Encryption" |
| msgstr "Mã hóa" |
| |
| #: ../../../developer/protocol.md:213 |
| msgid "Using a provided key (128, 192 or 256 bits)" |
| msgstr "Sử dụng một khóa được cung cấp (128, 192 hoặc 256 bit)" |
| |
| #: ../../../developer/protocol.md:215 |
| msgid "" |
| "Encryption uses standard AES-GCM as implemented by Nettle using a random IV " |
| "for each encryption." |
| msgstr "" |
| "Mã hóa sử dụng AES-GCM tiêu chuẩn như được thực hiện bởi Nettle sử dụng một " |
| "IV ngẫu nhiên cho mỗi mã hóa." |
| |
| #: ../../../developer/protocol.md:218 |
| msgid "Using a text password" |
| msgstr "Sử dụng mật khẩu văn bản" |
| |
| #: ../../../developer/protocol.md:220 |
| msgid "" |
| "The password is stretched to generate a 256 bits key and a random salt of " |
| "128 bits." |
| msgstr "" |
| "Mật khẩu được kéo dài để tạo ra một khóa 256 bit và một muối ngẫu nhiên 128 " |
| "bit." |
| |
| #: ../../../developer/protocol.md:223 |
| msgid "" |
| "The input data is encrypted using AES-GCM (see above) and the salt is " |
| "appended at the beginning of the resulting cypher-text." |
| msgstr "" |
| "Dữ liệu nhập được mã hóa bằng cách sử dụng AES-GCM (xem trên) và muối được " |
| "thêm vào đầu văn bản mã hóa kết quả." |
| |
| #: ../../../developer/protocol.md:226 |
| msgid "During a call" |
| msgstr "Trong khi gọi điện" |
| |
| #: ../../../developer/protocol.md:228 |
| msgid "" |
| "Audio/video data are exchanged using encrypted RTP channels between peers." |
| msgstr "" |
| "Dữ liệu âm thanh / video được trao đổi bằng cách sử dụng các kênh RTP được " |
| "mã hóa giữa các đồng nghiệp." |
| |
| #: ../../../developer/protocol.md:231 |
| msgid "" |
| "The protocol is a classic SRTP, with following supported crypto suites:" |
| msgstr "Các giao thức là một SRTP cổ điển, với các bộ crypto được hỗ trợ sau:" |
| |
| #: ../../../developer/protocol.md:233 |
| msgid "Jami account force AES\\_CM\\_128\\_HMAC\\_SHA1\\_80" |
| msgstr "" |
| |
| #: ../../../developer/protocol.md:234 |
| msgid "SIP can use AES\\_CM\\_128\\_HMAC\\_SHA1\\_80 or AES\\_CM\\_128\\_HMAC\\_SHA1\\_32" |
| msgstr "" |
| "SIP có thể sử dụng AES\\_CM\\_128\\_HMAC\\_SHA1\\_80 hoặc " |
| "AES\\_CM\\_128\\_HMAC\\_SHA1\\_32" |
| |
| #: ../../../developer/protocol.md:237 |
| msgid "" |
| "The master key and salt is a random number, different for each call. On " |
| "call's master key is constant during the full live of a call." |
| msgstr "" |
| "Chìa khóa chủ và muối là một số ngẫu nhiên, khác nhau cho mỗi cuộc gọi. Chìa" |
| " khóa chủ của cuộc gọi là không đổi trong suốt cuộc gọi." |
| |
| #: ../../../developer/protocol.md:240 |
| msgid "" |
| "The keys are exchanged using SDES method: keys are written into the SIP SDP " |
| "messages during the SIP INVITE negotiation. When SDES is used, Ring forces " |
| "the underlaying transport to be secure (encrypted) to not disclose these " |
| "keys. Jami supports DTLS natively for SIP and Ring accounts for such. The " |
| "call cannot be done if this condition is not fulfilled." |
| msgstr "" |
| |
| #: ../../../developer/qt-qml-coding-style.md:1 |
| msgid "Qt and QML coding style" |
| msgstr "Thiết kế mã hóa Qt và QML" |
| |
| #: ../../../developer/qt-qml-coding-style.md:4 |
| msgid "Qt/c++" |
| msgstr "Qt/c++" |
| |
| #: ../../../developer/qt-qml-coding-style.md:5 |
| msgid "Signal and slot naming" |
| msgstr "Định nghĩa tín hiệu và khe cổng" |
| |
| #: ../../../developer/qt-qml-coding-style.md:6 |
| msgid "" |
| "Both signals and slots should use camelCase. A signal should use the simple " |
| "past tense or past participle of some verb, likely prefixed by a short " |
| "subject. A corresponding slot should be the signal prefixed with the word " |
| "\"on\" and not the word \"slot\". Here are some examples:" |
| msgstr "" |
| "Cả hai tín hiệu và khe nên sử dụng camelCase. Một tín hiệu nên sử dụng âm " |
| "điền quá khứ đơn giản hoặc phần tử quá khứ của một số động từ, có thể được " |
| "đặt trước bởi một đối tượng ngắn." |
| |
| #: ../../../developer/qt-qml-coding-style.md:29 |
| #: ../../../developer/qt-qml-testing-tools.md:4 |
| #: ../../../developer/qt-qml-testing-tools.md:105 |
| msgid "QML" |
| msgstr "QML" |
| |
| #: ../../../developer/qt-qml-coding-style.md:30 |
| msgid "Code formatting" |
| msgstr "Phân hợp mã" |
| |
| #: ../../../developer/qt-qml-coding-style.md:31 |
| msgid "" |
| "The Qt 5.15.0 version of qmlformat has some issues dealing with comment " |
| "sections and currently does not discriminate against max columns, so we will" |
| " continue to format using these guidelines for now. The following is a " |
| "comprehensive sample component, adapted from https://doc.qt.io/qt-5/qml-" |
| "codingconventions.html, that attempts to illustrate the ideally formatted " |
| "component." |
| msgstr "" |
| "Phiên bản Qt 5.15.0 của qmlformat có một số vấn đề liên quan đến các phần " |
| "bình luận và hiện không phân biệt đối xử với các cột max, vì vậy chúng tôi " |
| "sẽ tiếp tục định dạng bằng cách sử dụng các hướng dẫn này cho bây giờ. Sau " |
| "đây là một thành phần mẫu toàn diện, được chuyển đổi từ " |
| "https://doc.qt.io/qt-5/qml-codingconventions.html, cố gắng minh họa thành " |
| "phần định dạng lý tưởng." |
| |
| #: ../../../developer/qt-qml-testing-tools.md:1 |
| msgid "Qt and QML testing tools" |
| msgstr "Các công cụ kiểm tra Qt và QML" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:6 |
| msgid "" |
| "qml_tests launch all the tests related to the interface. The daemon and " |
| "libclient SHOULD be trusted in this part, we do not want to test scenarios " |
| "related to connectivity. Ideally, we should work on fake data to avoid " |
| "depending on network events. This may be difficult sometimes and some tools " |
| "may be missed because tests in this part are a work in progress. Here are " |
| "some tools/principles to be able to quickly write tests." |
| msgstr "" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:8 |
| msgid "Mocking Data" |
| msgstr "" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:10 |
| msgid "" |
| "Let's say I want to test the UI for an AccountComboBox depending on a list " |
| "of accounts. Instead of creating accounts, we should create a fake list. The" |
| " easy way to do this is to serialize/unserialize a real AccountComboBox " |
| "model. First, we need to get a serialized model:" |
| msgstr "" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:44 |
| msgid "" |
| "`saveModel()` will print the serialized structure whenever the developer " |
| "will click on the combobox. Here's the result:" |
| msgstr "" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:50 |
| msgid "" |
| "Now, the developper can easily use it in a test. The best way is to add this" |
| " data in a variable or a separated js file (cf https://doc.qt.io/qt-6/qtqml-" |
| "documents-networktransparency.html). And use it in a test e.g.:" |
| msgstr "" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:77 |
| msgid "C++" |
| msgstr "C++" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:79 |
| msgid "Google Test" |
| msgstr "Thử nghiệm Google" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:80 |
| msgid "Google's c++ test framework." |
| msgstr "Quadro kiểm tra c++ của Google." |
| |
| #: ../../../developer/qt-qml-testing-tools.md:82 |
| #: ../../../developer/qt-qml-testing-tools.md:109 |
| msgid "Installation" |
| msgstr "Thiết lập" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:83 |
| msgid "Ubuntu / Debian: `apt install googletest libgtest-dev`" |
| msgstr "Ubuntu / Debian: `apt cài đặt google test libgtest-dev`" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:86 |
| #: ../../../developer/qt-qml-testing-tools.md:112 |
| msgid "Example main.cpp" |
| msgstr "Ví dụ main.cpp" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:107 |
| msgid "QtQuickTest" |
| msgstr "QtQuickTest" |
| |
| #: ../../../developer/qt-qml-testing-tools.md:110 |
| msgid "Ubuntu / Debian: `apt install qml-module-qqtest libqt5quicktest5`" |
| msgstr "Ubuntu / Debian: `apt cài đặt qml-module-qqtest libqt5quicktest5`" |
| |
| #: ../../../developer/release-process.md:1 |
| msgid "Release process" |
| msgstr "Quá trình giải phóng" |
| |
| #: ../../../developer/release-process.md:4 |
| msgid "" |
| "Each Jami sub-project has its own repository, build process, integration " |
| "cycle and so on. More over the **Jami architecture is split into two " |
| "independent modules**: LibRing *(daemon)* and clients." |
| msgstr "" |
| |
| #: ../../../developer/release-process.md:8 |
| msgid "" |
| "Having a unique revision is not a solution in this situation. The retained " |
| "idea is having a global \"state\" and **various updates per module**." |
| msgstr "" |
| "Có một bản sửa đổi độc đáo không phải là giải pháp trong tình huống này. Ý " |
| "tưởng duy trì là có một \"thế trạng\" toàn cầu và ** các bản cập nhật khác " |
| "nhau cho mỗi mô-đun**." |
| |
| #: ../../../developer/release-process.md:12 |
| msgid "" |
| "For consistency, **each Jami module has to follow the same process** as " |
| "described in following points. But not all modules have to be modified in " |
| "same time." |
| msgstr "" |
| |
| #: ../../../developer/release-process.md:18 |
| msgid "**PROCESS FLOW:**" |
| msgstr "**TÔNG THƯC:**" |
| |
| #: ../../../developer/release-process.md:0 |
| msgid "1" |
| msgstr "1" |
| |
| #: ../../../developer/release-process.md:0 |
| msgid "2" |
| msgstr "2" |
| |
| #: ../../../developer/release-process.md:0 |
| msgid "3" |
| msgstr "3" |
| |
| #: ../../../developer/release-process.md:0 |
| msgid "4" |
| msgstr "4" |
| |
| #: ../../../developer/release-process.md:0 |
| msgid "5" |
| msgstr "5" |
| |
| #: ../../../developer/release-process.md:0 |
| msgid "6" |
| msgstr "6" |
| |
| #: ../../../developer/release-process.md:0 |
| #: ../../../developer/release-process.md:26 |
| msgid "Redmine Ticket" |
| msgstr "Vé Redmine" |
| |
| #: ../../../developer/release-process.md:0 |
| #: ../../../developer/release-process.md:33 |
| msgid "Repository Preparation" |
| msgstr "Chuẩn bị kho lưu trữ" |
| |
| #: ../../../developer/release-process.md:0 |
| #: ../../../developer/release-process.md:38 |
| msgid "Testing" |
| msgstr "Kiểm tra" |
| |
| #: ../../../developer/release-process.md:0 |
| #: ../../../developer/release-process.md:54 |
| msgid "Push tags" |
| msgstr "Đánh dấu đẩy" |
| |
| #: ../../../developer/release-process.md:0 |
| #: ../../../developer/release-process.md:178 |
| msgid "Advertisement" |
| msgstr "Tiếp thị" |
| |
| #: ../../../developer/release-process.md:29 |
| msgid "" |
| "Create a new Task on redmine attached to the release story, for the right " |
| "sub-module. Set the title to \"Release Major.Minor.Micro\", with the " |
| "appropriate version number." |
| msgstr "" |
| "Tạo một Task mới trên redmine gắn với câu chuyện phát hành, cho các phụ mô-" |
| "đun phải. Đặt tiêu đề để \"Release Major.Minor.Micro\", với số phiên bản " |
| "thích hợp." |
| |
| #: ../../../developer/release-process.md:36 |
| msgid "**This section was outdated and removed**" |
| msgstr "**Gụ này đã lỗi thời và bị xóa**" |
| |
| #: ../../../developer/release-process.md:41 |
| msgid "Remove any existing Jami installations from your machine." |
| msgstr "" |
| |
| #: ../../../developer/release-process.md:42 |
| msgid "" |
| "Start with clean git tree by running `git clean -d -f -x` from the top level" |
| " directory of the project." |
| msgstr "" |
| "Bắt đầu với cây git sạch bằng cách chạy `git sạch -d -f -x` từ thư mục cấp " |
| "trên của dự án." |
| |
| #: ../../../developer/release-process.md:44 |
| msgid "Build and install the daemon and client, see How\\\\\\_to\\\\\\_build" |
| msgstr "Xây dựng và cài đặt daemon và client, xem How\\\\\\_to\\\\\\_build" |
| |
| #: ../../../developer/release-process.md:45 |
| msgid "" |
| "Run the test suite in daemon and client, on different distributions and " |
| "machines." |
| msgstr "" |
| "Tiến bộ thử nghiệm trong daemon và client, trên các phân phối và máy khác " |
| "nhau." |
| |
| #: ../../../developer/release-process.md:47 |
| msgid "Run manual tests" |
| msgstr "Tiến hành các thử nghiệm thủ công" |
| |
| #: ../../../developer/release-process.md:48 |
| msgid "Try registering and using different accounts." |
| msgstr "Hãy thử đăng ký và sử dụng các tài khoản khác nhau." |
| |
| #: ../../../developer/release-process.md:49 |
| msgid "" |
| "Try making calls between Jami and other free softphones (Ekiga, Linphone), " |
| "as well as hardware VoIP phones." |
| msgstr "" |
| |
| #: ../../../developer/release-process.md:51 |
| msgid "" |
| "To catch uninitialized values being used, memory leaks, invalid frees, etc. " |
| "run `valgrind --track-origins=yes --db-attach=yes ./bin/dring`" |
| msgstr "" |
| "Để bắt được các giá trị không khởi tạo được sử dụng, rò rỉ bộ nhớ, không hợp" |
| " lệ, vv chạy `valgrind --track-origin=yes --db-attach=yes./bin/dring`" |
| |
| #: ../../../developer/release-process.md:57 |
| msgid "`git push --tags`" |
| msgstr "`git đẩy --tags`" |
| |
| #: ../../../developer/release-process.md:68 |
| #: ../../../developer/release-process.md:119 |
| msgid "RPM" |
| msgstr "RPM" |
| |
| #: ../../../developer/release-process.md:84 |
| #: ../../../developer/release-process.md:137 |
| msgid "DEB" |
| msgstr "DEB" |
| |
| #: ../../../developer/release-process.md:98 |
| #: ../../../developer/release-process.md:162 |
| msgid "Release" |
| msgstr "Tự phát hành" |
| |
| #: ../../../developer/release-process.md:100 |
| #: ../../../developer/release-process.md:165 |
| msgid "" |
| "You just have to launch release script. This script launch build, download " |
| "and update files and repositories..." |
| msgstr "Bạn chỉ cần khởi động bản phát hành." |
| |
| #: ../../../developer/release-process.md:121 |
| msgid "vim ring-daemon.spec" |
| msgstr "vim ring-daemon.spec" |
| |
| #: ../../../developer/release-process.md:181 |
| msgid "" |
| "When the packaging is finished, test that they are installable. Then " |
| "announce the release" |
| msgstr "" |
| "Khi đóng gói đã hoàn thành, kiểm tra xem chúng có thể lắp đặt được không." |
| |
| #: ../../../developer/release-process.md:184 |
| msgid "on the official website <https://ring.cx>" |
| msgstr "trên trang web chính thức <https://ring.cx>" |
| |
| #: ../../../developer/release-process.md:185 |
| msgid "on Twitter <https://twitter.com/JoinTheRing>" |
| msgstr "trên Twitter <https://twitter.com/JoinTheRing>" |
| |
| #: ../../../developer/release-process.md:186 |
| msgid "" |
| "by email to ring@lists.savoirfairelinux.net with the subject line: \"Ring " |
| "Major.Minor.Patch released\"" |
| msgstr "" |
| "bằng email đến ring@lists.savoirfairelinux.net với dòng chủ đề: \"Ring " |
| "Major.Minor.Patch được phát hành\"" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:1 |
| msgid "Setting up your own TURN server" |
| msgstr "Thiết lập máy chủ TURN của riêng bạn" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:4 |
| msgid "" |
| "Jami can be configured to use TURN or STUN servers ([RFC " |
| "5766](https://tools.ietf.org/html/rfc5766)) to establish a connection " |
| "between two peers." |
| msgstr "" |
| "Jami có thể được cấu hình để sử dụng máy chủ TURN hoặc STUN ([RFC " |
| "5766](https://tools.ietf.org/html/rfc5766)) để thiết lập kết nối giữa hai " |
| "người đồng nghiệp." |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:8 |
| msgid "" |
| "The default TURN server is \"turn.jami.net\", with username \"ring\", " |
| "password \"ring\", and realm \"ring\"." |
| msgstr "" |
| "Máy chủ TURN mặc định là \"turn.jami.net\", với tên người dùng \"ring\", mật" |
| " khẩu \"ring\" và realm \"ring\"." |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:11 |
| msgid "" |
| "In this guide, we will setup a [coturn](https://github.com/coturn/coturn) " |
| "server. There are other TURN/STUN server implementations available under a " |
| "free license, such as [TurnServer](http://turnserver.sourceforge.net/) and " |
| "[Restund](http://www.creytiv.com/restund.html)." |
| msgstr "" |
| "Trong hướng dẫn này, chúng tôi sẽ thiết lập một máy chủ " |
| "[coturn]https://github.com/coturn/coturn). Có các ứng dụng máy chủ TURN/STUN" |
| " khác có sẵn dưới giấy phép miễn phí, chẳng hạn như " |
| "[TurnServer](http://turnserver.sourceforge.net/) và " |
| "[Restund](http://www.creytiv.com/restund.html)." |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:17 |
| msgid "Installing" |
| msgstr "Thiết lập" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:19 |
| msgid "" |
| "COTURN is available in most Linux distributions. On Debian, install it with " |
| "the following command:" |
| msgstr "" |
| "COTURN có sẵn trong hầu hết các phân phối Linux. Trên Debian, cài đặt nó " |
| "bằng lệnh sau:" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:25 |
| msgid "Configuring" |
| msgstr "Thiết lập" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:27 |
| msgid "Here is a basic `turnserver.conf` file:" |
| msgstr "Đây là một tệp cơ bản `turnserver.conf`:" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:38 |
| msgid "" |
| "This also will function as a STUN server. The STUN server does not require a" |
| " username and password (STUN uses very little bandwidth)." |
| msgstr "" |
| "Đây cũng sẽ hoạt động như một máy chủ STUN. máy chủ STUN không yêu cầu tên " |
| "người dùng và mật khẩu (STUN sử dụng băng thông rất ít)." |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:41 |
| msgid "Creating users on your TURN server" |
| msgstr "Tạo người dùng trên máy chủ TURN của bạn" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:43 |
| msgid "" |
| "To create users on your TURN server, use the `turnadmin` binary (this might " |
| "require superuser permissions)." |
| msgstr "" |
| "Để tạo người dùng trên máy chủ TURN của bạn, sử dụng `turnadmin` nhị phân " |
| "(thì có thể yêu cầu quyền của người dùng siêu)." |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:50 |
| msgid "Launching the TURN server" |
| msgstr "Thỏa thuận máy chủ TURN" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:56 |
| msgid "Configuring Jami to authenticate with the TURN server" |
| msgstr "Thiết lập Jami để xác thực với máy chủ TURN" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:58 |
| msgid "" |
| "You can configure Jami to use your TURN server from the advanced section of " |
| "your account settings:" |
| msgstr "" |
| "Bạn có thể cấu hình Jami để sử dụng máy chủ TURN của bạn từ phần nâng cao " |
| "của cài đặt tài khoản của bạn:" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "Field" |
| msgstr "Vùng" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "Value" |
| msgstr "Giá trị" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "**server url**" |
| msgstr "** URL máy chủ**" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "host and port of your server" |
| msgstr "host và cổng của máy chủ của bạn" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "0.0.0.0:10000" |
| msgstr "0.0.0.0:10000" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "**username**" |
| msgstr "** Tên người dùng**" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "username" |
| msgstr "Username" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "bob" |
| msgstr "Bob" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "**password**" |
| msgstr "** mật khẩu**" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "password" |
| msgstr "mật khẩu" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "secretpassword" |
| msgstr "mật khẩu bí mật" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "**realm**" |
| msgstr "**trung địa**" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "realm" |
| msgstr "vương quốc" |
| |
| #: ../../../developer/setting-up-your-own-turn-server.md:0 |
| msgid "sfl" |
| msgstr "Sphl" |
| |
| #: ../../../developer/submitting-your-first-patch.md:1 |
| msgid "Submitting your first patch" |
| msgstr "Đưa ra bản vá đầu tiên của bạn" |
| |
| #: ../../../developer/submitting-your-first-patch.md:4 |
| msgid "Setting up git and ssh" |
| msgstr "Thiết lập git và ssh" |
| |
| #: ../../../developer/submitting-your-first-patch.md:6 |
| msgid "(**to work smoothly with Gerrit.**)" |
| msgstr "(** để làm việc một cách trơn tru với Gerrit.**)" |
| |
| #: ../../../developer/submitting-your-first-patch.md:9 |
| msgid "first see:" |
| msgstr "trước tiên xem:" |
| |
| #: ../../../developer/submitting-your-first-patch.md:11 |
| msgid "" |
| "{ref}`Creating a gerrit review <developer/working-with-gerrit:To Create the " |
| "Review>`" |
| msgstr "" |
| "{ref}`Tạo ra một đánh giá gerrit <developer/working-with-gerrit:To Create " |
| "the Review>`" |
| |
| #: ../../../developer/submitting-your-first-patch.md:13 |
| msgid "SSH setup" |
| msgstr "Thiết lập SSH" |
| |
| #: ../../../developer/submitting-your-first-patch.md:15 |
| msgid "https://review.jami.net/Documentation/user-upload.html#ssh" |
| msgstr "https://review.jami.net/Documentation/user-upload.html#ssh" |
| |
| #: ../../../developer/submitting-your-first-patch.md:17 |
| msgid "Generate a personal dedicated public / private key set." |
| msgstr "Tạo một bộ khóa công cộng / riêng tư riêng tư." |
| |
| #: ../../../developer/submitting-your-first-patch.md:22 |
| msgid "" |
| "Your identification has been saved in `jami_gerrit_review_rsa`. Your public " |
| "key has been saved in `jami_gerrit_review_rsa.pub.`" |
| msgstr "" |
| "Đơn vị nhận dạng của bạn đã được lưu trong `jami_gerrit_review_rsa`. Chìa " |
| "khóa công khai của bạn đã được lưu trong `jami_gerrit_review_rsa.pub.`" |
| |
| #: ../../../developer/submitting-your-first-patch.md:25 |
| msgid "Tell gerrit your public key" |
| msgstr "Nói Gerrit chìa khóa công khai của bạn" |
| |
| #: ../../../developer/submitting-your-first-patch.md:26 |
| msgid "" |
| "Login to [gerrit](https://review.jami.net) via your Gitlab account (Sign-" |
| "in=>OAuth Gitlab)" |
| msgstr "" |
| "Nhập vào [gerrit](https://review.jami.net) thông qua tài khoản Gitlab của " |
| "bạn (Làm đăng nhập=>OAuth Gitlab)" |
| |
| #: ../../../developer/submitting-your-first-patch.md:27 |
| msgid "" |
| "Follow the ssh key instructions found from (your) user options " |
| "[settings](https://review.jami.net/settings/)" |
| msgstr "" |
| "Theo hướng dẫn khóa ssh tìm thấy từ (các) tùy chọn người dùng " |
| "[settings](https://review.jami.net/settings/)" |
| |
| #: ../../../developer/submitting-your-first-patch.md:29 |
| msgid "Set up your local ssh (via `ssh-add` or in `~/.ssh/config`)" |
| msgstr "" |
| "Thiết lập ssh địa phương của bạn (via `ssh-add` hoặc trong `~/.ssh/config`)" |
| |
| #: ../../../developer/submitting-your-first-patch.md:30 |
| msgid "" |
| "Test all of the above (ssh on the service or just try to clone a repo on " |
| "gerrit via ssh)" |
| msgstr "" |
| "Kiểm tra tất cả các điều trên (ssh trên dịch vụ hoặc chỉ cần cố gắng nhân " |
| "bản một repo trên gerrit thông qua ssh)" |
| |
| #: ../../../developer/submitting-your-first-patch.md:33 |
| msgid "Your Repository" |
| msgstr "Đồ lưu trữ của bạn" |
| |
| #: ../../../developer/submitting-your-first-patch.md:35 |
| msgid "" |
| "This *assumes* you have moved any existing project clone out of the way." |
| msgstr "" |
| "Điều này * giả định* bạn đã di chuyển bất kỳ dự án hiện có clone ra khỏi con" |
| " đường." |
| |
| #: ../../../developer/submitting-your-first-patch.md:37 |
| msgid "" |
| "Clone a (fresh) copy of the project. `git clone " |
| "ssh://USERNAME@review.jami.net:29420/PROJECT_NAME_GOES_HERE.git`; e.g. `git " |
| "clone ssh://foo@review.jami.net:29420/jami-project.git`." |
| msgstr "" |
| "Tái sao (tươi) của dự án. `git clone " |
| "ssh://USERNAME@review.jami.net:29420/PROJECT_NAME_GOES_HERE.git`; ví dụ: " |
| "`git clone ssh://foo@review.jami.net:29420/jami-project.git`." |
| |
| #: ../../../developer/submitting-your-first-patch.md:38 |
| msgid "Configure this clones local .git/config (optional)" |
| msgstr "Thiết lập này sao chép địa phương.git/config (phải chọn)" |
| |
| #: ../../../developer/submitting-your-first-patch.md:39 |
| msgid "Generate commit Change-Ids aka: commit-msg hook script" |
| msgstr "Tạo commit Change-Ids aka: commit-msg hook script" |
| |
| #: ../../../developer/submitting-your-first-patch.md:42 |
| msgid "A shell script, to be installed to .git/hooks/commit-msg." |
| msgstr "Một kịch bản shell, được cài đặt vào.git/hooks/commit-msg." |
| |
| #: ../../../developer/submitting-your-first-patch.md:45 |
| msgid "" |
| "The script creates a unique Change_Id:hash for each commit made from your " |
| "repository." |
| msgstr "" |
| "Các kịch bản tạo ra một Change_ID:hash độc đáo cho mỗi commit được thực hiện" |
| " từ kho lưu trữ của bạn." |
| |
| #: ../../../developer/submitting-your-first-patch.md:48 |
| msgid "" |
| "The first time you attempt a _push_ to review `git push origin " |
| "HEAD:refs/for/master`, gerrit will notice a lack of Change-Id." |
| msgstr "" |
| "Lần đầu tiên bạn cố gắng _push_ để xem lại `git nguồn gốc đẩy " |
| "HEAD:refs/for/master`, gerrit sẽ nhận thấy thiếu Change-Id." |
| |
| #: ../../../developer/submitting-your-first-patch.md:51 |
| msgid "" |
| "Gerrit will also present a secure copy (scp) string. Use *that* to download " |
| "a copy of .git/hooks/commit-msg." |
| msgstr "" |
| "Gerrit cũng sẽ trình bày một chuỗi sao chép an toàn (scp). Sử dụng *that* để" |
| " tải xuống một bản sao của.git/hooks/commit-msg." |
| |
| #: ../../../developer/submitting-your-first-patch.md:55 |
| msgid "References" |
| msgstr "Các tham chiếu" |
| |
| #: ../../../developer/submitting-your-first-patch.md:58 |
| msgid "" |
| "[Some Gritty Details](https://review.jami.net/Documentation/user-" |
| "upload.html#_gritty_details)" |
| msgstr "" |
| "[Một số chi tiết Gritty](https://review.jami.net/Documentation/user-" |
| "upload.html#_gritty_details)" |
| |
| #: ../../../developer/submitting-your-first-patch.md:62 |
| msgid "Original author: *Peter Gossner*" |
| msgstr "Tác giả gốc: *Peter Gossner*" |
| |
| #: ../../../developer/swarm.md:1 |
| msgid "Swarm" |
| msgstr "Thủy" |
| |
| #: ../../../developer/swarm.md:3 |
| msgid "Synospis" |
| msgstr "Synospis" |
| |
| #: ../../../developer/swarm.md:5 |
| msgid "" |
| "The goal of this document is to describe how group chats (a.k.a. **swarm " |
| "chat**) will be implemented in Jami." |
| msgstr "" |
| "Mục tiêu của tài liệu này là mô tả cách trò chuyện nhóm (tên gọi là **swarm " |
| "chat**) sẽ được triển khai ở Jami." |
| |
| #: ../../../developer/swarm.md:7 |
| msgid "" |
| "A *swarm* is a group able to discuss without any central authority in a " |
| "resilient way. Indeed, if two person doesn't have any connectivity with the " |
| "rest of the group (ie Internet outage) but they can contact each other (in a" |
| " LAN for example or in a subnetwork), they will be able to send messages to " |
| "each other and then, will be able to sync with the rest of the group when " |
| "it's possible." |
| msgstr "" |
| "Một nhóm có thể thảo luận mà không có bất kỳ cơ quan trung ương nào theo " |
| "cách kiên cường. Thật vậy, nếu hai người không có bất kỳ kết nối nào với " |
| "phần còn lại của nhóm (ví dụ, mất điện Internet) nhưng họ có thể liên lạc " |
| "với nhau (trong một LAN ví dụ hoặc trong một mạng phụ), họ sẽ có thể gửi tin" |
| " nhắn cho nhau và sau đó, sẽ có thể đồng bộ với phần còn lại của nhóm khi có" |
| " thể." |
| |
| #: ../../../developer/swarm.md:9 |
| msgid "So, the *swarm* is defined by:" |
| msgstr "Vì vậy, \"swarm\" được định nghĩa bởi:" |
| |
| #: ../../../developer/swarm.md:10 |
| msgid "Ability to split and merge following the connectivity." |
| msgstr "Khả năng chia và hợp nhất theo kết nối." |
| |
| #: ../../../developer/swarm.md:11 |
| msgid "" |
| "Syncing of the history. Anyone must be able to send a message to the whole " |
| "group." |
| msgstr "Bất cứ ai cũng có thể gửi thông điệp cho toàn bộ nhóm." |
| |
| #: ../../../developer/swarm.md:12 |
| msgid "No central authority. Can not rely on any server." |
| msgstr "Không có cơ quan trung ương, không thể tin vào bất kỳ máy chủ nào." |
| |
| #: ../../../developer/swarm.md:13 |
| msgid "" |
| "Non-repudiation. Devices must be able to verify old messages' validity and " |
| "to replay the whole history." |
| msgstr "" |
| "Không phủ nhận. thiết bị phải có khả năng xác minh tính hợp lệ của tin nhắn " |
| "cũ và để chơi lại toàn bộ lịch sử." |
| |
| #: ../../../developer/swarm.md:14 |
| msgid "PFS on the transport. Storage is managed by the device." |
| msgstr "PFS trên vận chuyển." |
| |
| #: ../../../developer/swarm.md:16 |
| msgid "" |
| "The main idea is to get a synchronized Merkle tree with the participants." |
| msgstr "Ý tưởng chính là có được một cây Merkle đồng bộ với các thành viên." |
| |
| #: ../../../developer/swarm.md:18 |
| msgid "We identified four modes for swarm chat that we want to implement:" |
| msgstr "" |
| "Chúng tôi đã xác định bốn chế độ cho trò chuyện đám đông mà chúng tôi muốn " |
| "thực hiện:" |
| |
| #: ../../../developer/swarm.md:19 |
| msgid "" |
| "**ONE_TO_ONE**, basically the case we have today when you discuss to a " |
| "friend" |
| msgstr "" |
| "**Mỗi người, về cơ bản là trường hợp chúng ta có hôm nay khi bạn thảo luận " |
| "với một người bạn" |
| |
| #: ../../../developer/swarm.md:20 |
| msgid "" |
| "**ADMIN_INVITES_ONLY** generally a class where the teacher can invite " |
| "people, but not students" |
| msgstr "" |
| "**ADMIN_INVITES_ONLY** thường là một lớp học mà giáo viên có thể mời mọi " |
| "người, nhưng không phải là sinh viên" |
| |
| #: ../../../developer/swarm.md:21 |
| msgid "**INVITES_ONLY** a private group of friends" |
| msgstr "**Hãy mời một nhóm bạn riêng tư**" |
| |
| #: ../../../developer/swarm.md:22 |
| msgid "**PUBLIC** basically an opened forum" |
| msgstr "**Public** về cơ bản là một diễn đàn mở" |
| |
| #: ../../../developer/swarm.md:24 |
| msgid "Scenarios" |
| msgstr "Các kịch bản" |
| |
| #: ../../../developer/swarm.md:26 |
| msgid "Create a Swarm" |
| msgstr "Tạo một nhóm" |
| |
| #: ../../../developer/swarm.md:28 |
| msgid "*Bob wants to create a new swarm*" |
| msgstr "*Bob muốn tạo ra một đám đông mới*" |
| |
| #: ../../../developer/swarm.md:30 |
| msgid "Bob creates a local git repository." |
| msgstr "Bob tạo ra một kho lưu trữ Git địa phương." |
| |
| #: ../../../developer/swarm.md:31 |
| msgid "Then, he creates an initial signed commit with the following:" |
| msgstr "" |
| "Sau đó, ông ta tạo ra một cam kết ban đầu được ký kết với những điều sau:" |
| |
| #: ../../../developer/swarm.md:32 |
| msgid "His public key in `/admins`" |
| msgstr "Chìa khóa công khai của anh ấy trong `/admins`" |
| |
| #: ../../../developer/swarm.md:33 |
| msgid "His device certificate in ̀ /devices`" |
| msgstr "Giấy chứng nhận thiết bị của anh ta trong ̀ / thiết bị `" |
| |
| #: ../../../developer/swarm.md:34 |
| msgid "His CRL in ̀ /crls`" |
| msgstr "CRL của anh ta trong ̀ /crls`" |
| |
| #: ../../../developer/swarm.md:35 |
| msgid "The hash of the first commit becomes the **ID** of the conversation" |
| msgstr "Hash của commit đầu tiên trở thành **ID** của cuộc trò chuyện" |
| |
| #: ../../../developer/swarm.md:36 |
| msgid "" |
| "Bob announces to his other devices that he creates a new conversation. This " |
| "is done via an invite to join the swarm sent through the DHT to other " |
| "devices linked to that account." |
| msgstr "" |
| "Bob thông báo cho các thiết bị khác của mình rằng anh ta tạo ra một cuộc trò" |
| " chuyện mới. Điều này được thực hiện thông qua một lời mời để tham gia đám " |
| "đông được gửi qua DHT đến các thiết bị khác liên kết với tài khoản đó." |
| |
| #: ../../../developer/swarm.md:38 |
| msgid "Adding someone" |
| msgstr "Thêm ai đó" |
| |
| #: ../../../developer/swarm.md:40 |
| msgid "*Alice adds Bob*" |
| msgstr "* Alice thêm Bob*" |
| |
| #: ../../../developer/swarm.md:42 |
| msgid "Alice adds Bob to the repo:" |
| msgstr "Alice thêm Bob vào repo:" |
| |
| #: ../../../developer/swarm.md:43 |
| msgid "Adds the invited URI in `/invited`" |
| msgstr "Thêm URI được mời vào `/invited`" |
| |
| #: ../../../developer/swarm.md:44 |
| msgid "Adds the CRL into `/crls`" |
| msgstr "Thêm CRL vào `/crls`" |
| |
| #: ../../../developer/swarm.md:45 |
| msgid "Alice sends a request on the DHT" |
| msgstr "Alice gửi một yêu cầu về DHT" |
| |
| #: ../../../developer/swarm.md:47 |
| msgid "Receiving an invite" |
| msgstr "Nhận lời mời" |
| |
| #: ../../../developer/swarm.md:49 |
| msgid "*Alice gets the invite to join the previously create swarm*" |
| msgstr "* Alice được mời tham gia đám đông tạo ra trước đó *" |
| |
| #: ../../../developer/swarm.md:51 |
| msgid "" |
| "She accepts the invite (if decline, do nothing, it will just stay into " |
| "invited and Alice will never receive any message)" |
| msgstr "" |
| "Cô ấy chấp nhận lời mời (nếu từ chối, không làm gì, nó sẽ chỉ ở lại trong " |
| "mời và Alice sẽ không bao giờ nhận được bất kỳ tin nhắn nào)" |
| |
| #: ../../../developer/swarm.md:52 |
| msgid "A peer-to-peer connection between Alice and Bob is done." |
| msgstr "Một mối liên hệ giữa Alice và Bob đã được thực hiện." |
| |
| #: ../../../developer/swarm.md:53 |
| msgid "" |
| "Alice pull the git repo of Bob. **WARNING this means that messages need a " |
| "connection, not from the DHT like today**" |
| msgstr "" |
| "Alice rút lại thư viện của Bob. **Hãy cảnh báo rằng những tin nhắn cần một " |
| "kết nối, không phải từ DHT như ngày nay**" |
| |
| #: ../../../developer/swarm.md:54 |
| msgid "Alice validates commits from Bob" |
| msgstr "Alice xác nhận các cam kết từ Bob" |
| |
| #: ../../../developer/swarm.md:55 |
| msgid "" |
| "To validate that Alice is a member, she removes the invite from `/invited` " |
| "directory, then adds her certificate into the `/members` directory" |
| msgstr "" |
| "Để xác nhận rằng Alice là thành viên, cô ấy xóa lời mời từ thư mục " |
| "`/invited`, sau đó thêm chứng chỉ của mình vào thư mục `/members`" |
| |
| #: ../../../developer/swarm.md:56 |
| msgid "" |
| "Once all commits validated and on her device, other members of the group are" |
| " discovered by Alice. with these peers, she will construct the **DRT** " |
| "(explained below) with Bob as a bootstrap." |
| msgstr "" |
| "Khi tất cả các cam kết được xác nhận và trên thiết bị của mình, các thành " |
| "viên khác của nhóm được Alice phát hiện. Với những người đồng nghiệp này, cô" |
| " sẽ xây dựng **DRT** (được giải thích bên dưới) với Bob như một bootstrap." |
| |
| #: ../../../developer/swarm.md:58 |
| msgid "Sending a message" |
| msgstr "Gửi tin nhắn" |
| |
| #: ../../../developer/swarm.md:60 |
| msgid "*Alice sends a message*" |
| msgstr "* Alice gửi tin nhắn *" |
| |
| #: ../../../developer/swarm.md:62 |
| msgid "" |
| "Sending a message is pretty simple. Alice writes a commit-message in the " |
| "following format:" |
| msgstr "" |
| "Gửi tin nhắn khá đơn giản. Alice viết tin nhắn tham gia theo định dạng sau:" |
| |
| #: ../../../developer/swarm.md:64 |
| msgid "**TODO format unclear**" |
| msgstr "**Tình thức TODO không rõ **" |
| |
| #: ../../../developer/swarm.md:66 |
| msgid "" |
| "and adds her device and CRL to the repository if missing (others must be " |
| "able to verify the commit). Merge conflicts are avoided because we are " |
| "mostly based on commit messages, not files (unless CRLS + certificates but " |
| "they are located). then she announces the new commit via the **DRT** with a " |
| "service message (explained later) and pings the DHT for mobile devices (they" |
| " must receive a push notification)." |
| msgstr "" |
| "và thêm thiết bị và CRL của mình vào kho nếu thiếu (người khác phải có thể " |
| "xác minh sự tham gia). Các xung đột sáp nhập được tránh vì chúng tôi chủ yếu" |
| " dựa trên tin nhắn tham gia, không phải là các tệp (trừ khi các chứng chỉ " |
| "CRLS + nhưng chúng được tìm thấy). sau đó cô thông báo sự tham gia mới thông" |
| " qua **DRT** với một tin nhắn dịch vụ (được giải thích sau) và pings DHT cho" |
| " các thiết bị di động (bạn phải nhận được thông báo đẩy)." |
| |
| #: ../../../developer/swarm.md:68 |
| msgid "" |
| "For pinging other devices, the sender sends to other members a SIP message " |
| "with mimetype = \"application/im-gitmessage-id\" containing a JSON with the " |
| "\"deviceId\" which sends the message, the \"id\" of the conversation " |
| "related, and the \"commit\"" |
| msgstr "" |
| "Để ping các thiết bị khác, người gửi gửi gửi cho các thành viên khác một tin" |
| " nhắn SIP với mimetype = \"application/im-gitmessage-id\" chứa một JSON với " |
| "\"deviceId\" gửi tin nhắn, \"id\" của cuộc trò chuyện liên quan, và " |
| "\"commit\"" |
| |
| #: ../../../developer/swarm.md:70 |
| msgid "Receiving a message" |
| msgstr "Nhận tin nhắn" |
| |
| #: ../../../developer/swarm.md:72 |
| msgid "*Bob receives the message from Alice*" |
| msgstr "*Bob nhận được tin nhắn từ Alice*" |
| |
| #: ../../../developer/swarm.md:74 |
| msgid "*Bob* do a git pull on *Alice*" |
| msgstr "*Bob* làm một cú kéo trên *Alice*" |
| |
| #: ../../../developer/swarm.md:75 |
| msgid "Commits MUST be verified via a hook" |
| msgstr "Các cam kết phải được xác minh qua một cái nón" |
| |
| #: ../../../developer/swarm.md:76 |
| msgid "" |
| "If all commits are valid, commits are stored and displayed. Then *Bob* " |
| "announces the message via the DRT for other devices." |
| msgstr "" |
| "Nếu tất cả các commits là hợp lệ, các commits được lưu trữ và hiển thị. Sau " |
| "đó *Bob* thông báo thông điệp qua DRT cho các thiết bị khác." |
| |
| #: ../../../developer/swarm.md:77 |
| msgid "" |
| "If all commits are not valid, pull is canceled. *Alice* must reestablish her" |
| " state to a correct state. **TODO process*" |
| msgstr "" |
| "Nếu tất cả các cam kết không hợp lệ, kéo được hủy bỏ. *Alice* phải khôi phục" |
| " trạng thái của mình trở lại trạng thái chính xác. **TODO process*" |
| |
| #: ../../../developer/swarm.md:79 |
| msgid "Validating a commit" |
| msgstr "Đăng bằng một cam kết" |
| |
| #: ../../../developer/swarm.md:81 |
| msgid "" |
| "To avoid users pushing some unwanted commits (with conflicts, false " |
| "messages, etc), this is how each commit (from the oldest to the newest one) " |
| "MUST be validated before merging a remote branch:" |
| msgstr "" |
| "Để tránh người dùng đẩy một số cam kết không mong muốn (với xung đột, tin " |
| "nhắn sai, vv), đây là cách mỗi cam kết (từ cũ nhất đến mới nhất) MUST được " |
| "xác nhận trước khi sáp nhập một chi nhánh từ xa:" |
| |
| #: ../../../developer/swarm.md:83 |
| msgid "" |
| "Note: if the validation fails, the fetch is ignored and we do not merge the " |
| "branch (and remove the data), and the user should be notified Note2: If a " |
| "fetch is too big, it's not done (**TODO**)" |
| msgstr "" |
| "Lưu ý: nếu xác nhận thất bại, việc lấy được bỏ qua và chúng tôi không hợp " |
| "nhất chi nhánh (và loại bỏ dữ liệu), và người dùng nên được thông báo Lưu " |
| "ý2: Nếu một lấy quá lớn, nó không được thực hiện (** TODO**)" |
| |
| #: ../../../developer/swarm.md:86 |
| msgid "" |
| "For each commits, check that the device that tries to send the commit is " |
| "authorized at this moment and that the certificates are present (in /devices" |
| " for the device, and in /members or /admins for the issuer)." |
| msgstr "" |
| "Đối với mỗi giao dịch, hãy kiểm tra rằng thiết bị cố gắng gửi giao dịch đã " |
| "được ủy quyền tại thời điểm này và các chứng chỉ có mặt (trong các thiết bị " |
| "cho thiết bị và trong các thành viên hoặc người quản lý cho nhà phát hành)." |
| |
| #: ../../../developer/swarm.md:87 |
| msgid "" |
| "3 cases. The commit has 2 parents, so it's a merge, nothing more to validate" |
| " here" |
| msgstr "" |
| "3 trường hợp. Commit có 2 cha mẹ, vì vậy đó là một sự hợp nhất, không có gì " |
| "khác để xác nhận ở đây" |
| |
| #: ../../../developer/swarm.md:88 |
| msgid "The commit has 0 parents, it's the initial commit:" |
| msgstr "Commit có 0 cha mẹ, đó là commit ban đầu:" |
| |
| #: ../../../developer/swarm.md:89 |
| msgid "Check that admin cert is added" |
| msgstr "Kiểm tra rằng admin certificate đã được thêm vào" |
| |
| #: ../../../developer/swarm.md:90 |
| msgid "Check that device cert is added" |
| msgstr "Kiểm tra rằng thiết bị cert đã được thêm vào" |
| |
| #: ../../../developer/swarm.md:91 |
| msgid "Check CRLs added" |
| msgstr "Các CRL kiểm tra được thêm vào" |
| |
| #: ../../../developer/swarm.md:92 |
| msgid "Check that no other file is added" |
| msgstr "Kiểm tra rằng không có tệp nào khác được thêm vào" |
| |
| #: ../../../developer/swarm.md:93 |
| msgid "The commit has 1 parent, commit message is a JSON with a type:" |
| msgstr "Commit có 1 cha mẹ, tin nhắn commit là một JSON với một loại:" |
| |
| #: ../../../developer/swarm.md:94 |
| msgid "If text (or other mime-type that doesn't change files)" |
| msgstr "Nếu văn bản (hoặc loại mime khác không thay đổi các tệp)" |
| |
| #: ../../../developer/swarm.md:95 |
| msgid "Check signature from certificate in the repo" |
| msgstr "Kiểm tra chữ ký từ chứng chỉ trong repo" |
| |
| #: ../../../developer/swarm.md:96 |
| msgid "Check that no weird file is added outside device cert nor removed" |
| msgstr "" |
| "Kiểm tra rằng không có tập tin kỳ lạ được thêm bên ngoài thiết bị chứng chỉ " |
| "hoặc xóa" |
| |
| #: ../../../developer/swarm.md:97 |
| msgid "If vote" |
| msgstr "Nếu bỏ phiếu" |
| |
| #: ../../../developer/swarm.md:98 |
| msgid "Check that voteType is supported (ban, unban)" |
| msgstr "Kiểm tra voteType được hỗ trợ (banned, unban)" |
| |
| #: ../../../developer/swarm.md:99 |
| msgid "Check that vote is for the user that signs the commit" |
| msgstr "Kiểm tra rằng phiếu là cho người dùng ký kết cam kết" |
| |
| #: ../../../developer/swarm.md:100 |
| msgid "Check that vote is from an admin and device present & not banned" |
| msgstr "" |
| "Kiểm tra rằng bỏ phiếu là từ một admin và thiết bị hiện có & không bị cấm" |
| |
| #: ../../../developer/swarm.md:101 ../../../developer/swarm.md:106 |
| #: ../../../developer/swarm.md:113 ../../../developer/swarm.md:119 |
| msgid "Check that no weird file is added nor removed" |
| msgstr "Kiểm tra rằng không có tập tin kỳ lạ được thêm vào hoặc xóa" |
| |
| #: ../../../developer/swarm.md:102 |
| msgid "If member" |
| msgstr "Nếu thành viên" |
| |
| #: ../../../developer/swarm.md:103 |
| msgid "If adds" |
| msgstr "Nếu thêm" |
| |
| #: ../../../developer/swarm.md:104 ../../../developer/swarm.md:110 |
| msgid "Check that the commit is correctly signed" |
| msgstr "Kiểm tra rằng cam kết đã được ký đúng" |
| |
| #: ../../../developer/swarm.md:105 |
| msgid "Check that certificate is added in /invited" |
| msgstr "Kiểm tra chứng chỉ được thêm vào / mời" |
| |
| #: ../../../developer/swarm.md:107 |
| msgid "If ONE_TO_ONE, check that we only have one admin, one member" |
| msgstr "" |
| "Nếu ONE_TO_ONE, kiểm tra rằng chúng tôi chỉ có một admin, một thành viên" |
| |
| #: ../../../developer/swarm.md:108 |
| msgid "If ADMIN_INVITES_ONLY, check that invite is from an admin" |
| msgstr "Nếu ADMIN_INVITES_ONLY, kiểm tra rằng lời mời là từ một admin" |
| |
| #: ../../../developer/swarm.md:109 |
| msgid "If joins" |
| msgstr "Nếu gia nhập" |
| |
| #: ../../../developer/swarm.md:111 |
| msgid "Check that device is added" |
| msgstr "Kiểm tra thiết bị được thêm vào" |
| |
| #: ../../../developer/swarm.md:112 |
| msgid "Check that invitation is moved to members" |
| msgstr "Kiểm tra xem lời mời được chuyển đến các thành viên" |
| |
| #: ../../../developer/swarm.md:114 |
| msgid "If banned" |
| msgstr "Nếu bị cấm" |
| |
| #: ../../../developer/swarm.md:115 |
| msgid "Check that vote is valid" |
| msgstr "Kiểm tra phiếu bầu có hợp lệ" |
| |
| #: ../../../developer/swarm.md:116 |
| msgid "Check that the user is ban via an admin" |
| msgstr "Kiểm tra rằng người dùng bị cấm thông qua một admin" |
| |
| #: ../../../developer/swarm.md:117 |
| msgid "Check that member or device certificate is moved to banned/" |
| msgstr "" |
| "Kiểm tra xem chứng chỉ thành viên hoặc thiết bị đã được chuyển sang cấm/" |
| |
| #: ../../../developer/swarm.md:118 |
| msgid "Check that only files related to the vote are removed" |
| msgstr "Kiểm tra rằng chỉ có các tệp liên quan đến bỏ phiếu được xóa" |
| |
| #: ../../../developer/swarm.md:120 |
| msgid "" |
| "else fail. Notify the user that they may be with an old version or that peer" |
| " tried to submit unwanted commits" |
| msgstr "" |
| "thông báo cho người dùng rằng họ có thể là với một phiên bản cũ hoặc người " |
| "đồng nghiệp đã cố gắng gửi các commit không mong muốn" |
| |
| #: ../../../developer/swarm.md:123 |
| msgid "Ban a device" |
| msgstr "Thiết bị cấm" |
| |
| #: ../../../developer/swarm.md:125 |
| msgid "*Alice, Bob, Carla, Denys are in a swarm. Alice bans Denys*" |
| msgstr "Alice, Bob, Carla, Denys đang trong đám đông." |
| |
| #: ../../../developer/swarm.md:127 |
| msgid "" |
| "This is one of the most difficult scenarios in our context. Without central " |
| "authority we can not trust:" |
| msgstr "" |
| "Đây là một trong những kịch bản khó khăn nhất trong bối cảnh của chúng ta." |
| |
| #: ../../../developer/swarm.md:129 |
| msgid "Timestamps of generated commits" |
| msgstr "Các dấu thời gian của các cam kết được tạo ra" |
| |
| #: ../../../developer/swarm.md:130 |
| msgid "" |
| "Conflicts with banned devices. If multiple admin devices are present and if " |
| "Alice can speak with Bob but not Denys and Carla; Carla can speak with " |
| "Denys; Denys bans Alice, Alice bans Denys, what will be the state when the 4" |
| " members will merge the conversations." |
| msgstr "" |
| "Nếu có nhiều thiết bị quản trị và nếu Alice có thể nói chuyện với Bob nhưng " |
| "không phải Denys và Carla; Carla có thể nói chuyện với Denys; Denys cấm " |
| "Alice, Alice cấm Denys, điều gì sẽ xảy ra khi 4 thành viên kết hợp các cuộc " |
| "trò chuyện." |
| |
| #: ../../../developer/swarm.md:131 |
| msgid "" |
| "A device can be compromised, stolen or its certificate can expire. We should" |
| " be able to ban a device and avoid that it lies about its expiration or send" |
| " messages in the past (by changing its certificate or the timestamp of its " |
| "commit)." |
| msgstr "" |
| "Một thiết bị có thể bị xâm nhập, bị đánh cắp hoặc chứng chỉ của nó có thể " |
| "hết hạn. Chúng ta nên có thể cấm một thiết bị và tránh được việc nó nói dối " |
| "về hết hạn của nó hoặc gửi tin nhắn trong quá khứ (bằng cách thay đổi chứng " |
| "chỉ của nó hoặc dấu thời gian của cam kết của nó)." |
| |
| #: ../../../developer/swarm.md:133 |
| msgid "" |
| "Similar systems (with distributed group systems) are not so much, but these " |
| "are some examples:" |
| msgstr "" |
| "Các hệ thống tương tự (với hệ thống nhóm phân tán) không nhiều, nhưng đây là" |
| " một số ví dụ:" |
| |
| #: ../../../developer/swarm.md:135 |
| msgid "" |
| "[mpOTR doesn't define how to ban " |
| "someone](https://www.cypherpunks.ca/~iang/pubs/mpotr.pdf)" |
| msgstr "[mpOTR không định nghĩa cách cấm một người nào đó]" |
| |
| #: ../../../developer/swarm.md:136 |
| msgid "" |
| "Signal, without any central server for group chat (EDIT: they recently " |
| "change that point), doesn't give the ability to ban someone from a group." |
| msgstr "" |
| "Cấu hiệu, không có bất kỳ máy chủ trung tâm nào cho trò chuyện nhóm (EDIT: " |
| "họ gần đây thay đổi điểm đó), không cung cấp khả năng cấm ai đó từ một nhóm." |
| |
| #: ../../../developer/swarm.md:138 |
| msgid "" |
| "This voting system needs a human action to ban someone or must be based on " |
| "the CRLs info from the repository (because we can not trust external CRLs)" |
| msgstr "" |
| "Hệ thống bỏ phiếu này cần một hành động của con người để cấm một người hoặc " |
| "phải dựa trên thông tin về CRL từ kho lưu trữ (vì chúng ta không thể tin " |
| "tưởng vào CRL bên ngoài)" |
| |
| #: ../../../developer/swarm.md:140 |
| msgid "Remove a device from a conversation" |
| msgstr "Tắt một thiết bị từ cuộc trò chuyện" |
| |
| #: ../../../developer/swarm.md:142 |
| msgid "" |
| "This is the only part that MUST have a consensus to avoid conversation's " |
| "split, like if two members kick each other from the conversation, what will " |
| "see the third one?" |
| msgstr "" |
| "Đây là phần duy nhất mà CHÀO phải có sự đồng thuận để tránh chia rẽ cuộc trò" |
| " chuyện, như nếu hai thành viên đá nhau khỏi cuộc trò chuyện, cái gì sẽ thấy" |
| " thứ ba?" |
| |
| #: ../../../developer/swarm.md:144 |
| msgid "" |
| "This is needed to detect revoked devices, or simply avoid getting unwanted " |
| "people present in a public room. The process is pretty similar between a " |
| "member and a device:" |
| msgstr "" |
| "Điều này là cần thiết để phát hiện các thiết bị bị bị hủy bỏ, hoặc đơn giản " |
| "là tránh có những người không mong muốn ở trong một phòng công cộng." |
| |
| #: ../../../developer/swarm.md:146 |
| msgid "*Alice removes Bob*" |
| msgstr "* Alice đưa Bob ra*" |
| |
| #: ../../../developer/swarm.md:148 |
| msgid "Note: Alice MUST be admins to vote" |
| msgstr "Lưu ý: Alice phải là người quản trị để bỏ phiếu" |
| |
| #: ../../../developer/swarm.md:150 |
| msgid "" |
| "First, she votes for banning Bob. To do that, she creates the file in " |
| "/votes/ban/members/uri_bob/uri_alice (members can be replaced by devices for" |
| " a device, or invited for invites or admins for admins) and commits" |
| msgstr "" |
| "Trước tiên, cô bỏ phiếu cấm Bob. Để làm điều đó, cô tạo ra tệp trong " |
| "/votes/ban/members/uri_bob/uri_alice (những thành viên có thể được thay thế " |
| "bằng các thiết bị cho một thiết bị, hoặc được mời mời để mời hoặc quản trị " |
| "viên cho quản trị viên) và cam kết" |
| |
| #: ../../../developer/swarm.md:151 ../../../developer/swarm.md:157 |
| msgid "" |
| "Then she checks if the vote is resolved. This means that >50% of the admins " |
| "agree to ban Bob (if she is alone, it's sure it's more than 50%)." |
| msgstr "" |
| "Sau đó cô ấy kiểm tra xem phiếu bầu đã được giải quyết hay không. Điều này " |
| "có nghĩa là > 50% người quản trị đồng ý cấm Bob (nếu cô ấy là một mình, chắc" |
| " chắn đó là hơn 50%)." |
| |
| #: ../../../developer/swarm.md:152 |
| msgid "" |
| "If the vote is resolved, files into /votes/ban can be removed, all files for" |
| " Bob in /members, /admins, /invited, /CRLs, /devices can be removed (or only" |
| " in /devices if it's a device that is banned) and Bob's certificate can be " |
| "placed into /banned/members/bob_uri.crt (or /banned/devices/uri.crt if a " |
| "device is banned) and committed to the repo" |
| msgstr "" |
| "Nếu bỏ phiếu được giải quyết, các tập tin vào /votes/ban có thể được xóa, " |
| "tất cả các tập tin cho Bob trong /members, /admins, /invited, /CRLs, " |
| "/devices có thể được xóa (hoặc chỉ trong /devices nếu đó là một thiết bị bị " |
| "cấm) và chứng chỉ của Bob có thể được đặt vào /banned/members/bob_uri.crt " |
| "(hoặc /banned/devices/uri.crt nếu một thiết bị bị bị cấm) và được cam kết " |
| "với repo" |
| |
| #: ../../../developer/swarm.md:153 |
| msgid "Then, Alice informs other users (outside Bob)" |
| msgstr "Sau đó, Alice thông báo cho người dùng khác (ngoài Bob)" |
| |
| #: ../../../developer/swarm.md:155 |
| msgid "*Alice (admin) re-adds Bob (banned member)" |
| msgstr "*Alice (admin) thêm Bob (nhà bị cấm)" |
| |
| #: ../../../developer/swarm.md:156 |
| msgid "" |
| "Fir she votes for unbanning Bob. To do that, she creates the file in " |
| "/votes/unban/members/uri_bob/uri_alice (members can be replaced by devices " |
| "for a device, or invited for invites or admins for admins) and commits" |
| msgstr "" |
| "Trước khi bà bỏ phiếu cho việc cấm Bob. Để làm điều đó, bà tạo ra tệp trong " |
| "/votes/unban/members/uri_bob/uri_alice (những thành viên có thể được thay " |
| "thế bằng các thiết bị cho một thiết bị, hoặc được mời mời để mời hoặc quản " |
| "trị viên cho quản trị viên) và cam kết" |
| |
| #: ../../../developer/swarm.md:158 |
| msgid "" |
| "If the vote is resolved, files into /votes/unban can be removed, all files " |
| "for Bob in /members, /admins, /invited, /CRLs, can be re-added (or only in " |
| "/devices if it's a device that is unbanned) and committed to the repo" |
| msgstr "" |
| "Nếu bỏ phiếu được giải quyết, các tập tin vào /votes/unban có thể được xóa, " |
| "tất cả các tập tin cho Bob trong /members, /admins, /invited, /CRLs, có thể " |
| "được thêm lại (hoặc chỉ trong /devices nếu đó là một thiết bị không bị cấm) " |
| "và cam kết cho repo" |
| |
| #: ../../../developer/swarm.md:160 |
| msgid "Remove a conversation" |
| msgstr "Tháo cuộc trò chuyện" |
| |
| #: ../../../developer/swarm.md:162 |
| msgid "" |
| "Save in convInfos removed=time::now() (like removeContact saves in contacts)" |
| " that the conversation is removed and sync with other user's devices" |
| msgstr "" |
| "Cung cấp trong convInfos removed=time::now() (như removeContact save in " |
| "contacts) rằng cuộc trò chuyện được xóa và đồng bộ hóa với các thiết bị của " |
| "người dùng khác" |
| |
| #: ../../../developer/swarm.md:163 |
| msgid "Now, if a new commit is received for this conversation it's ignored" |
| msgstr "" |
| "Nếu nhận được một lời mời mới cho cuộc trò chuyện này thì nó sẽ bị bỏ qua." |
| |
| #: ../../../developer/swarm.md:164 |
| msgid "" |
| "Now, if Jami startup and the repo is still present, the conversation is not " |
| "announced to clients" |
| msgstr "" |
| "Bây giờ, nếu Jami khởi động và repo vẫn hiện diện, cuộc trò chuyện không " |
| "được công bố cho khách hàng" |
| |
| #: ../../../developer/swarm.md:165 |
| msgid "" |
| "Two cases: a. If no other member in the conversation we can immediately " |
| "remove the repository b. If still other members, commit that we leave the " |
| "conversation, and now wait that at least another device sync this message. " |
| "This avoids the fact that other members will still detect the user as a " |
| "valid member and still sends new message notifications." |
| msgstr "" |
| "Hai trường hợp: a. Nếu không có thành viên nào khác trong cuộc trò chuyện, " |
| "chúng tôi có thể ngay lập tức xóa kho b. Nếu vẫn còn các thành viên khác, " |
| "hãy cam kết chúng tôi rời khỏi cuộc trò chuyện, và bây giờ chờ ít nhất một " |
| "thiết bị khác đồng bộ hóa thông điệp này. Điều này tránh sự thật là các " |
| "thành viên khác vẫn sẽ phát hiện người dùng như một thành viên hợp lệ và vẫn" |
| " gửi thông báo thông báo mới." |
| |
| #: ../../../developer/swarm.md:168 |
| msgid "" |
| "When we are sure that someone is synched, remove erased=time::now() and sync" |
| " with other user's devices" |
| msgstr "" |
| "Khi chúng ta chắc chắn rằng ai đó đã đồng bộ hóa, xóa xóa=time::now() và " |
| "đồng bộ hóa với các thiết bị của người dùng khác" |
| |
| #: ../../../developer/swarm.md:169 |
| msgid "" |
| "All devices owned by the user can now erase the repository and related files" |
| msgstr "" |
| "Tất cả các thiết bị thuộc sở hữu của người dùng bây giờ có thể xóa kho và " |
| "các tập tin liên quan" |
| |
| #: ../../../developer/swarm.md:171 |
| msgid "How to specify a mode" |
| msgstr "Làm thế nào để xác định chế độ" |
| |
| #: ../../../developer/swarm.md:173 |
| msgid "" |
| "Modes can not be changed through time. Or it's another conversation. So, " |
| "this data is stored in the initial commit message. The commit message will " |
| "be the following:" |
| msgstr "" |
| "Các chế độ không thể thay đổi theo thời gian. hoặc đó là một cuộc trò chuyện" |
| " khác. Vì vậy, dữ liệu này được lưu trữ trong thông điệp commit ban đầu. " |
| "thông điệp commit sẽ như sau:" |
| |
| #: ../../../developer/swarm.md:184 |
| msgid "" |
| "For now, \"mode\" accepts values 0 (ONE_TO_ONE), 1 (ADMIN_INVITES_ONLY), 2 " |
| "(INVITES_ONLY), 3 (PUBLIC)" |
| msgstr "" |
| "Hiện tại, \"mode\" chấp nhận các giá trị 0 (ONE_TO_ONE), 1 " |
| "(ADMIN_INVITES_ONLY), 2 (INVITES_ONLY), 3 (PUBLIC)" |
| |
| #: ../../../developer/swarm.md:186 |
| msgid "Processus for 1:1 swarms" |
| msgstr "Quá trình cho các tổ 1:1" |
| |
| #: ../../../developer/swarm.md:188 |
| msgid "" |
| "The goal here is to keep the old API (addContact/removeContact, " |
| "sendTrustRequest/acceptTrustRequest/discardTrustRequest) to generate swarm " |
| "with a peer and its contact. This still implies some changes that we cannot " |
| "ignore:" |
| msgstr "" |
| "Mục tiêu ở đây là giữ cho API cũ (addContact/removeContact, " |
| "sendTrustRequest/acceptTrustRequest/discardTrustRequest) để tạo ra đám đông " |
| "với một người đồng nghiệp và liên lạc của nó. Điều này vẫn có nghĩa là một " |
| "số thay đổi mà chúng ta không thể bỏ qua:" |
| |
| #: ../../../developer/swarm.md:190 |
| msgid "" |
| "The process is still the same, an account can add a contact via addContact, " |
| "then send a TrustRequest via the DHT. But two changes are necessary:" |
| msgstr "" |
| "Quá trình vẫn giống nhau, một tài khoản có thể thêm một liên hệ thông qua " |
| "addContact, sau đó gửi TrustRequest thông qua DHT." |
| |
| #: ../../../developer/swarm.md:191 |
| msgid "" |
| "The TrustRequest embeds a \"conversationId\" to inform the peer what " |
| "conversation to clone when accepting the request" |
| msgstr "" |
| "TrustRequest nhúng một \"conversationId\" để thông báo cho người đồng nghiệp" |
| " cuộc trò chuyện nào để sao chép khi chấp nhận yêu cầu" |
| |
| #: ../../../developer/swarm.md:192 |
| msgid "" |
| "TrustRequest are retried when contact come backs online. It's not the case " |
| "today (as we don't want to generate a new TrustRequest if the peer discard " |
| "the first). So, if an account receives a trust request, it will be " |
| "automatically ignored if the request with a related conversation is declined" |
| " (as convRequests are synched)" |
| msgstr "" |
| "TrustRequest được thử lại khi liên lạc trở lại trực tuyến. Không phải là " |
| "trường hợp ngày nay (chẳng muốn tạo TrustRequest mới nếu người đồng nghiệp " |
| "loại bỏ thứ nhất). Vì vậy, nếu một tài khoản nhận được yêu cầu tin tưởng, nó" |
| " sẽ được tự động bỏ qua nếu yêu cầu với một cuộc trò chuyện liên quan bị từ " |
| "chối (vì convRequests được đồng bộ hóa)" |
| |
| #: ../../../developer/swarm.md:194 |
| msgid "" |
| "Then, when a contact accepts the request, a period of sync is necessary, " |
| "because the contact now needs to clone the conversation." |
| msgstr "" |
| "Sau đó, khi một liên lạc chấp nhận yêu cầu, một thời gian đồng bộ là cần " |
| "thiết, bởi vì liên lạc bây giờ cần phải nhân bản cuộc trò chuyện." |
| |
| #: ../../../developer/swarm.md:196 |
| msgid "" |
| "removeContact() will remove the contact and related 1:1 conversations (with " |
| "the same process as \"Remove a conversation\"). The only note here is that " |
| "if we ban a contact, we don't wait for sync, we just remove all related " |
| "files." |
| msgstr "" |
| "removeContact() sẽ xóa liên lạc và các cuộc trò chuyện 1: 1 liên quan (với " |
| "cùng một quy trình như \"Remove a conversation\")." |
| |
| #: ../../../developer/swarm.md:198 |
| msgid "Tricky scenarios" |
| msgstr "Các kịch bản khó khăn" |
| |
| #: ../../../developer/swarm.md:200 |
| msgid "" |
| "There are some cases where two conversations can be created. This is at " |
| "least two of those scenarios:" |
| msgstr "Có một số trường hợp có thể tạo ra hai cuộc trò chuyện." |
| |
| #: ../../../developer/swarm.md:202 ../../../developer/swarm.md:205 |
| msgid "Alice adds Bob" |
| msgstr "Alice thêm Bob vào" |
| |
| #: ../../../developer/swarm.md:203 |
| msgid "Bob accepts" |
| msgstr "Bob chấp nhận" |
| |
| #: ../../../developer/swarm.md:204 |
| msgid "Alice removes Bob" |
| msgstr "Alice đưa Bob ra" |
| |
| #: ../../../developer/swarm.md:207 |
| msgid "or" |
| msgstr "hoặc" |
| |
| #: ../../../developer/swarm.md:209 |
| msgid "" |
| "1, Alice adds Bob & Bob adds Alice at the same time, but both are not " |
| "connected together" |
| msgstr "" |
| "1, Alice thêm Bob & Bob thêm Alice cùng một lúc, nhưng cả hai không kết nối " |
| "với nhau" |
| |
| #: ../../../developer/swarm.md:211 |
| msgid "" |
| "In this case, two conversations are generated. We don't want to remove " |
| "messages from users or choose one conversation here. So, sometimes two 1:1 " |
| "swarm between the same members will be shown. It will generate some bugs " |
| "during the transition time (as we don't want to break API, the inferred " |
| "conversation will be one of the two shown conversations, but for now it's " |
| "\"ok-ish\", will be fixed when clients will fully handle conversationId for " |
| "all APIs (calls, file transfer, etc))." |
| msgstr "" |
| "Trong trường hợp này, hai cuộc trò chuyện được tạo ra. Chúng tôi không muốn " |
| "xóa tin nhắn từ người dùng hoặc chọn một cuộc trò chuyện ở đây. Vì vậy, đôi " |
| "khi sẽ được hiển thị hai đám 1:1 giữa cùng một thành viên. Nó sẽ tạo ra một " |
| "số lỗi trong thời gian chuyển đổi (vì chúng tôi không muốn phá vỡ API, cuộc " |
| "trò chuyện được suy luận sẽ là một trong hai cuộc trò chuyện được hiển thị, " |
| "nhưng cho đến bây giờ nó là \"ok-ish\", sẽ được sửa chữa khi khách hàng sẽ " |
| "xử lý đầy đủ cuộc trò chuyệnId cho tất cả API (call, chuyển tập tin, vv))." |
| |
| #: ../../../developer/swarm.md:213 |
| msgid "Note while syncing" |
| msgstr "Lưu ý trong khi đồng bộ hóa" |
| |
| #: ../../../developer/swarm.md:215 |
| msgid "" |
| "After accepting a conversation's request, there is a time the daemon needs " |
| "to retrieve the distant repository. During this time, clients MUST show a " |
| "syncing view to give informations to the user. Note, while syncing:" |
| msgstr "" |
| "Sau khi chấp nhận yêu cầu của cuộc trò chuyện, có một thời gian daemon cần " |
| "lấy kho lưu trữ từ xa. Trong thời gian này, khách hàng CHÀO hiển thị một " |
| "khung cảnh đồng bộ hóa để cung cấp thông tin cho người dùng. Lưu ý, trong " |
| "khi đồng bộ hóa:" |
| |
| #: ../../../developer/swarm.md:218 |
| msgid "" |
| "ConfigurationManager::getConversations() will return the conversation's id " |
| "even while syncing" |
| msgstr "" |
| "ConfigurationManager::getConversations() sẽ trả lại ID của cuộc trò chuyện " |
| "ngay cả khi đồng bộ hóa" |
| |
| #: ../../../developer/swarm.md:219 |
| msgid "" |
| "ConfigurationManager::conversationInfos() will return {{\"syncing\": " |
| "\"true\"}} if syncing." |
| msgstr "" |
| "ConfigurationManager::conversationInfos() sẽ trả lại {{\"syncing\": " |
| "\"true\"}} nếu đồng bộ hóa." |
| |
| #: ../../../developer/swarm.md:220 |
| msgid "" |
| "ConfigurationManager::getConversationMembers() will return a map of two URIs" |
| " (the current account and the peer who sent the request)" |
| msgstr "" |
| "ConfigurationManager::getConversationMembers() sẽ trả lại một bản đồ của hai" |
| " URI (tài khoản hiện tại và người đồng nghiệp đã gửi yêu cầu)" |
| |
| #: ../../../developer/swarm.md:222 |
| msgid "Conversations requests specification" |
| msgstr "Các cuộc trò chuyện yêu cầu thông số kỹ thuật" |
| |
| #: ../../../developer/swarm.md:224 |
| msgid "" |
| "Conversations requests are represented by a **Map<String, String>** with the" |
| " following keys:" |
| msgstr "" |
| "Các yêu cầu trò chuyện được đại diện bởi một **Map<String, String>** với các" |
| " phím sau:" |
| |
| #: ../../../developer/swarm.md:226 |
| msgid "id: the conversation id" |
| msgstr "ID: ID cuộc trò chuyện" |
| |
| #: ../../../developer/swarm.md:227 |
| msgid "from: uri of the sender" |
| msgstr "từ: uri của người gửi" |
| |
| #: ../../../developer/swarm.md:228 |
| msgid "received: timestamp" |
| msgstr "nhận: dấu thời gian" |
| |
| #: ../../../developer/swarm.md:229 |
| msgid "title: (optional) name for the conversation" |
| msgstr "Tiêu đề: (bắt buộc) tên cho cuộc trò chuyện" |
| |
| #: ../../../developer/swarm.md:230 |
| msgid "description: (optional)" |
| msgstr "mô tả: (không chọn lựa)" |
| |
| #: ../../../developer/swarm.md:231 |
| msgid "avatar: (optional)" |
| msgstr "avatar: (tự chọn)" |
| |
| #: ../../../developer/swarm.md:233 |
| msgid "Conversation's profile synchronization" |
| msgstr "Đồng bộ hóa hồ sơ của cuộc trò chuyện" |
| |
| #: ../../../developer/swarm.md:235 |
| msgid "" |
| "To be identifiable, a conversation generally needs some metadata, like a " |
| "title (eg: Jami), a description (eg: some links, what is the project, etc), " |
| "and an image (the logo of the project). Those metadata are optional but " |
| "shared across all members, so need to be synced and incorporated in the " |
| "requests." |
| msgstr "" |
| "Để được xác định, một cuộc trò chuyện thường cần một số siêu dữ liệu, chẳng " |
| "hạn như tiêu đề (ví dụ: Jami), mô tả (ví dụ: một số liên kết, dự án là gì, " |
| "v.v.), và một hình ảnh (chữ liệu biểu tượng của dự án)." |
| |
| #: ../../../developer/swarm.md:237 |
| msgid "Storage in the repository" |
| msgstr "Tạp lưu trữ trong kho" |
| |
| #: ../../../developer/swarm.md:239 |
| msgid "" |
| "The profile of the conversation is stored in a classic vCard file at the " |
| "root (`/profile.vcf`) like:" |
| msgstr "" |
| "Profile của cuộc trò chuyện được lưu trữ trong tệp vCard cổ điển ở gốc " |
| "(`/profile.vcf`) như:" |
| |
| #: ../../../developer/swarm.md:249 |
| msgid "Synchronization" |
| msgstr "Đồng bộ hóa" |
| |
| #: ../../../developer/swarm.md:251 |
| msgid "" |
| "To update the vCard, a user with enough permissions (by default: =ADMIN) " |
| "needs to edit `/profile.vcf`. and will commit the file with the mimetype " |
| "`application/update-profile`. The new message is sent via the same mechanism" |
| " and all peers will receive the **MessageReceived** signal from the daemon. " |
| "The branch is dropped if the commit contains other files or too big or if " |
| "done by a non-authorized member (by default: <ADMIN)." |
| msgstr "" |
| "Để cập nhật vCard, người dùng có đủ quyền (được mặc định: =ADMIN) cần chỉnh " |
| "sửa `/profile.vcf`. và sẽ cam kết tập tin với kiểu mimetype " |
| "`application/update-profile`. Thông điệp mới được gửi qua cùng một cơ chế và" |
| " tất cả các đồng nghiệp sẽ nhận tín hiệu **MessageReceived** từ con quỷ. Chi" |
| " nhánh bị bỏ nếu commit chứa các tập tin khác hoặc quá lớn hoặc nếu được " |
| "thực hiện bởi một thành viên không được ủy quyền (được mặc định: <ADMIN)." |
| |
| #: ../../../developer/swarm.md:253 |
| msgid "Last Displayed" |
| msgstr "Tiếp theo được hiển thị" |
| |
| #: ../../../developer/swarm.md:255 |
| msgid "" |
| "In the synchronized data, each devices sends to other devices the state of " |
| "the conversations. In this state, the last displayed is sent. However, " |
| "because each device can have its own state for each conversation, and " |
| "probably without the same last commit at some point, there is several " |
| "scenarios to take into account:" |
| msgstr "" |
| "Trong dữ liệu đồng bộ, mỗi thiết bị gửi đến các thiết bị khác trạng thái của" |
| " các cuộc trò chuyện. Trong trạng thái này, cuối cùng được hiển thị được " |
| "gửi. Tuy nhiên, vì mỗi thiết bị có thể có trạng thái riêng cho mỗi cuộc trò " |
| "chuyện, và có lẽ không có cùng một cam kết cuối cùng tại một thời điểm nào " |
| "đó, có một số kịch bản cần tính:" |
| |
| #: ../../../developer/swarm.md:257 |
| msgid "5 scenarios are supported:" |
| msgstr "5 kịch bản được hỗ trợ:" |
| |
| #: ../../../developer/swarm.md:258 |
| msgid "" |
| "if the last displayed sent by other devices is the same as the current one, " |
| "there is nothing to do." |
| msgstr "" |
| "nếu màn hình cuối cùng được gửi bởi các thiết bị khác giống như màn hình " |
| "hiện tại, không có gì để làm." |
| |
| #: ../../../developer/swarm.md:259 |
| msgid "" |
| "if there is no last displayed for the current device, the remote displayed " |
| "message is used." |
| msgstr "" |
| "Nếu không có hiển thị cuối cùng cho thiết bị hiện tại, thông điệp hiển thị " |
| "từ xa được sử dụng." |
| |
| #: ../../../developer/swarm.md:260 |
| msgid "" |
| "if the remote last displayed is not present in the repo, it means that the " |
| "commit will be fetched later, so cache the result" |
| msgstr "" |
| "nếu từ xa lần cuối được hiển thị không có mặt trong repo, nó có nghĩa là " |
| "commit sẽ được lấy sau đó, do đó cache kết quả" |
| |
| #: ../../../developer/swarm.md:261 |
| msgid "" |
| "if the remote is already fetched, we check that the local last displayed is " |
| "before in the history to replace it" |
| msgstr "" |
| "nếu điều khiển từ xa đã được lấy, chúng tôi kiểm tra rằng địa phương cuối " |
| "cùng hiển thị là trước trong lịch sử để thay thế nó" |
| |
| #: ../../../developer/swarm.md:262 |
| msgid "" |
| "Finally if a message is announced from the same author, it means that we " |
| "need to update the last displayed." |
| msgstr "" |
| "Cuối cùng, nếu một thông điệp được công bố từ cùng một tác giả, nó có nghĩa " |
| "là chúng ta cần phải cập nhật thông điệp cuối cùng được hiển thị." |
| |
| #: ../../../developer/swarm.md:264 |
| msgid "Preferences" |
| msgstr "Tự ưu tiên" |
| |
| #: ../../../developer/swarm.md:266 |
| msgid "" |
| "Every conversation has attached preferences set by the user. Those " |
| "preferences are synced across user's devices. This can be the color of the " |
| "conversation, if the user wants to ignore notifications, file transfer size " |
| "limit, etc. For now, the recognized keys are:" |
| msgstr "" |
| "Mỗi cuộc trò chuyện đều có tùy chọn được đặt bởi người dùng. Những tùy chọn " |
| "đó được đồng bộ hóa trên các thiết bị của người dùng. Đây có thể là màu của " |
| "cuộc trò chuyện, nếu người dùng muốn bỏ qua thông báo, giới hạn kích thước " |
| "chuyển tập tin, vv. Cho đến nay, các khóa được công nhận là:" |
| |
| #: ../../../developer/swarm.md:268 |
| msgid "\"color\" - the color of the conversation (#RRGGBB format)" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:269 |
| msgid "" |
| "\"ignoreNotifications\" - to ignore notifications for new messages in this " |
| "conversation" |
| msgstr "" |
| "\"ignoreNotifications\" - để bỏ qua các thông báo cho các tin nhắn mới trong" |
| " cuộc trò chuyện này" |
| |
| #: ../../../developer/swarm.md:270 |
| msgid "\"symbol\" - to define a default emoji." |
| msgstr "\"symbol\" - để xác định emoji mặc định." |
| |
| #: ../../../developer/swarm.md:272 |
| msgid "" |
| "Those preferences are stored in a packet MapStringString, stored in " |
| "`accountDir/conversation_data/conversationId/preferences` and only sent " |
| "across devices of the same user via SyncMsg." |
| msgstr "" |
| "Những sở thích đó được lưu trữ trong một gói MapStringString, được lưu trữ " |
| "trong `accountDir/conversation_data/conversationId/preferences` và chỉ được " |
| "gửi qua các thiết bị của cùng một người dùng thông qua SyncMsg." |
| |
| #: ../../../developer/swarm.md:274 |
| msgid "The API to interact with the preferences are:" |
| msgstr "API để tương tác với các sở thích là:" |
| |
| #: ../../../developer/swarm.md:294 |
| msgid "Merge conflicts management" |
| msgstr "Quản lý xung đột sáp nhập" |
| |
| #: ../../../developer/swarm.md:296 |
| msgid "" |
| "Because two admins can change the description at the same time, a merge " |
| "conflict can occur on `profile.vcf`. In this case, the commit with the " |
| "higher hash (eg ffffff > 000000) will be chosen." |
| msgstr "" |
| "Bởi vì hai người quản trị có thể thay đổi mô tả cùng một lúc, một xung đột " |
| "sáp nhập có thể xảy ra trên `profile.vcf`. Trong trường hợp này, commit với " |
| "hash cao hơn (ví dụ ffffff > 000000) sẽ được chọn." |
| |
| #: ../../../developer/swarm.md:298 |
| msgid "APIs" |
| msgstr "API" |
| |
| #: ../../../developer/swarm.md:300 |
| msgid "The user got 2 methods to get and set conversation's metadatas:" |
| msgstr "" |
| "Người dùng có 2 phương pháp để lấy và đặt metadata của cuộc trò chuyện:" |
| |
| #: ../../../developer/swarm.md:326 |
| msgid "where `infos` is a `map<str, str>` with the following keys:" |
| msgstr "nơi `infos` là một `map<str, str>` với các phím sau:" |
| |
| #: ../../../developer/swarm.md:328 |
| msgid "mode: READ-ONLY" |
| msgstr "chế độ: Đọc chỉ" |
| |
| #: ../../../developer/swarm.md:329 |
| msgid "title" |
| msgstr "tiêu đề" |
| |
| #: ../../../developer/swarm.md:330 |
| msgid "description" |
| msgstr "mô tả" |
| |
| #: ../../../developer/swarm.md:331 |
| msgid "avatar" |
| msgstr "avatar" |
| |
| #: ../../../developer/swarm.md:333 |
| msgid "Re-import an account (link/export)" |
| msgstr "Nhập lại tài khoản (link/export)" |
| |
| #: ../../../developer/swarm.md:335 |
| msgid "" |
| "The archive MUST contain conversationId to be able to retrieve conversations" |
| " on new commits after a re-import (because there is no invite at this " |
| "point). If a commit comes for a conversation not present there are two " |
| "possibilities:" |
| msgstr "" |
| "Các lưu trữ MUST chứa conversationId để có thể lấy lại các cuộc trò chuyện " |
| "trên các commit mới sau khi nhập lại (vì không có lời mời tại thời điểm " |
| "này)." |
| |
| #: ../../../developer/swarm.md:337 |
| msgid "" |
| "The conversationId is there, in this case, the daemon is able to re-clone " |
| "this conversation" |
| msgstr "" |
| "Cuộc trò chuyện có ở đó, trong trường hợp này, con quỷ có thể tái nhân bản " |
| "cuộc trò chuyện này" |
| |
| #: ../../../developer/swarm.md:338 |
| msgid "" |
| "The conversationId is missing, so the daemon asks (via a message " |
| "`{{\"application/invite\", conversationId}}`) a new invite that the user " |
| "needs to (re)accepts" |
| msgstr "" |
| "ConversationId bị mất tích, do đó, con quỷ yêu cầu (cứ qua tin nhắn `{{\" " |
| "ứng dụng/ mời\", conversationId}}`) một lời mời mới mà người dùng cần (tái) " |
| "chấp nhận" |
| |
| #: ../../../developer/swarm.md:340 |
| msgid "" |
| "Note, a conversation can only be retrieved if a contact or another device is" |
| " there, else it will be lost. There is no magic." |
| msgstr "" |
| "Lưu ý, cuộc trò chuyện chỉ có thể được lấy lại nếu có một liên lạc hoặc " |
| "thiết bị khác, nếu không nó sẽ bị mất." |
| |
| #: ../../../developer/swarm.md:342 |
| msgid "Used protocols" |
| msgstr "Các giao thức được sử dụng" |
| |
| #: ../../../developer/swarm.md:344 |
| msgid "Git" |
| msgstr "Git" |
| |
| #: ../../../developer/swarm.md:346 |
| msgid "Why this choice" |
| msgstr "Tại sao lựa chọn này" |
| |
| #: ../../../developer/swarm.md:348 |
| msgid "" |
| "Each conversation will be a git repository. This choice is motivated by:" |
| msgstr "Mỗi cuộc trò chuyện sẽ là một kho lưu trữ git." |
| |
| #: ../../../developer/swarm.md:350 |
| msgid "" |
| "We need to sync and order messages. The Merkle Tree is the perfect structure" |
| " to do that and can be linearized by merging branches. Moreover, because " |
| "it's massively used by Git, it's easy to sync between devices." |
| msgstr "" |
| "Chúng ta cần đồng bộ hóa và sắp xếp các tin nhắn. Cây Merkle là cấu trúc " |
| "hoàn hảo để làm điều đó và có thể được tuyến tính bằng cách sáp nhập các " |
| "nhánh. Hơn nữa, vì nó được sử dụng rộng rãi bởi Git, nó dễ dàng đồng bộ hóa " |
| "giữa các thiết bị." |
| |
| #: ../../../developer/swarm.md:351 |
| msgid "Distributed by nature. Massively used. Lots of backends and pluggable." |
| msgstr "" |
| "Được phân phối bởi tự nhiên, được sử dụng rộng rãi, nhiều backend và có thể " |
| "bật." |
| |
| #: ../../../developer/swarm.md:352 |
| msgid "Can verify commits via hooks and massively used crypto" |
| msgstr "" |
| "Có thể xác minh các cam kết thông qua các cái móng và tiền điện tử được sử " |
| "dụng rộng rãi" |
| |
| #: ../../../developer/swarm.md:353 |
| msgid "Can be stored in a database if necessary" |
| msgstr "Có thể được lưu trữ trong cơ sở dữ liệu nếu cần thiết" |
| |
| #: ../../../developer/swarm.md:354 |
| msgid "Conflicts are avoided by using commit messages, not files." |
| msgstr "" |
| "Các xung đột được tránh bằng cách sử dụng tin nhắn commit, không phải các " |
| "tệp." |
| |
| #: ../../../developer/swarm.md:356 |
| msgid "What we have to validate" |
| msgstr "Những gì chúng ta phải xác nhận" |
| |
| #: ../../../developer/swarm.md:358 |
| msgid "Performance? `git.lock` can be low" |
| msgstr "Hiệu suất? `git.lock` có thể thấp" |
| |
| #: ../../../developer/swarm.md:359 |
| msgid "Hooks in libgit2" |
| msgstr "Cây đập trong libgit2" |
| |
| #: ../../../developer/swarm.md:360 |
| msgid "Multiple pulls at the same time?" |
| msgstr "Nhiều lần kéo cùng một lúc?" |
| |
| #: ../../../developer/swarm.md:362 |
| msgid "Limits" |
| msgstr "Các giới hạn" |
| |
| #: ../../../developer/swarm.md:364 |
| msgid "" |
| "History can not be deleted. To delete a conversation, the device has to " |
| "leave the conversation and create another one." |
| msgstr "" |
| "Lịch sử không thể xóa. Để xóa một cuộc trò chuyện, thiết bị phải rời khỏi " |
| "cuộc trò chuyện và tạo một cuộc trò chuyện khác." |
| |
| #: ../../../developer/swarm.md:366 |
| msgid "" |
| "However, non-permanent messages (like messages readable only for some " |
| "minutes) can be sent via a special message via the DRT (like Typing or Read" |
| " notifications)." |
| msgstr "" |
| "Tuy nhiên, các thông điệp không thường xuyên (như thông điệp chỉ được đọc " |
| "trong vài phút) có thể được gửi qua một thông điệp đặc biệt thông qua DRT " |
| "(như thông báo nhập hoặc đọc)." |
| |
| #: ../../../developer/swarm.md:368 |
| msgid "Structure" |
| msgstr "Cấu trúc" |
| |
| #: ../../../developer/swarm.md:399 |
| msgid "" |
| "Swarm massively changes file transfer. Now, all the history is syncing, " |
| "allowing all devices in the conversation to easily retrieve old files. This " |
| "changes allow us to move from a logic where the sender pushed the file on " |
| "other devices, via trying to connect to their devices (This was bad because " |
| "not really resistant to connections changes/failures and needed a manual " |
| "retry) to a logic where the sender allow other devices to download. " |
| "Moreover, any device having the file can be the host for other devices, " |
| "allowing to retrieve files even if the sender is not there." |
| msgstr "" |
| "Swarm thay đổi chuyển giao tệp một cách lớn. Bây giờ, tất cả lịch sử đang " |
| "đồng bộ hóa, cho phép tất cả các thiết bị trong cuộc trò chuyện dễ dàng lấy " |
| "lại các tệp cũ. Những thay đổi này cho phép chúng ta chuyển từ một logic nơi" |
| " người gửi đẩy tệp trên các thiết bị khác, thông qua cố gắng kết nối với các" |
| " thiết bị của họ (Đây là xấu vì không thực sự kháng với các thay đổi / thất " |
| "bại kết nối và cần một thử lại thủ công) đến một logic nơi người gửi cho " |
| "phép các thiết bị khác tải xuống. Hơn nữa, bất kỳ thiết bị nào có tệp có thể" |
| " là chủ nhà cho các thiết bị khác, cho phép lấy tệp ngay cả khi người gửi " |
| "không có ở đó." |
| |
| #: ../../../developer/swarm.md:403 |
| msgid "" |
| "The sender adds a new commit in the conversation with the following format:" |
| msgstr "" |
| "Người gửi thêm một commit mới trong cuộc trò chuyện với định dạng sau:" |
| |
| #: ../../../developer/swarm.md:413 |
| msgid "" |
| "and creates a link in " |
| "`${data_path}/conversation_data/${conversation_id}/${file_id}` where " |
| "`file_id=${commitid}_${value[\"tid\"]}.${extension}`" |
| msgstr "" |
| "và tạo ra một liên kết trong " |
| "`${data_path}/conversation_data/${conversation_id}/${file_id}` nơi " |
| "`file_id=${commitid}_${value[\"tide\"]}.${extension}`" |
| |
| #: ../../../developer/swarm.md:415 |
| msgid "" |
| "Then, the receiver can now download the files by contacting the devices " |
| "hosting the file by opening a channel with `name=\"data-transfer://\" + " |
| "conversationId + \"/\" + currentDeviceId() + \"/\" + fileId` and store the " |
| "info that the file is waiting in " |
| "`${data_path}/conversation_data/${conversation_id}/waiting`" |
| msgstr "" |
| "Sau đó, người nhận có thể tải xuống các tệp bằng cách liên hệ với các thiết " |
| "bị lưu trữ tệp bằng cách mở kênh với `name=\"data-transfer://\" + " |
| "conversationId + \"/\" + currentDeviceId() + \"/\" + fileId` và lưu trữ " |
| "thông tin rằng tệp đang chờ đợi trong " |
| "`${data_path}/conversation_data/${conversation_id}/waiting`" |
| |
| #: ../../../developer/swarm.md:417 |
| msgid "" |
| "The device receiving the connection will accepts the channel by verifying if" |
| " the file can be sent (if sha3sum is correct and if file exists). The " |
| "receiver will keep the first opened channel, close the others and write into" |
| " a file (with the same path as the sender: " |
| "`${data_path}/conversation_data/${conversation_id}/${file_id}`) all incoming" |
| " data." |
| msgstr "" |
| "Thiết bị nhận kết nối sẽ chấp nhận kênh bằng cách xác minh liệu tệp có thể " |
| "được gửi (nếu sha3sum là đúng và tệp có). Người nhận sẽ giữ kênh mở đầu " |
| "tiên, đóng các kênh khác và ghi vào tệp (với cùng con đường như người gửi: " |
| "`${data_path}/conversation_data/${conversation_id}/${file_id}`) tất cả dữ " |
| "liệu nhập." |
| |
| #: ../../../developer/swarm.md:419 |
| msgid "" |
| "When the transfer is finished or the channel closed, the sha3sum is verified" |
| " to validate that the file is correct (else it's deleted). If valid, the " |
| "file will be removed from the waiting." |
| msgstr "" |
| "Khi chuyển giao hoàn thành hoặc kênh đóng, số lượng sha3 được xác minh để " |
| "xác minh rằng tệp là đúng (hoặc nó đã bị xóa). Nếu hợp lệ, tệp sẽ được xóa " |
| "khỏi chờ." |
| |
| #: ../../../developer/swarm.md:421 |
| msgid "" |
| "In case of failure, when a device of the conversation will be back online, " |
| "we will ask for all waiting files by the same way." |
| msgstr "" |
| "Trong trường hợp thất bại, khi thiết bị của cuộc trò chuyện sẽ trở lại trực " |
| "tuyến, chúng tôi sẽ yêu cầu tất cả các tệp chờ theo cùng một cách." |
| |
| #: ../../../developer/swarm.md:423 |
| msgid "Call in swarm" |
| msgstr "Đưa ra đám đông" |
| |
| #: ../../../developer/swarm.md:425 |
| msgid "TODO: nameserver part" |
| msgstr "TODO: phần máy chủ tên" |
| |
| #: ../../../developer/swarm.md:427 |
| msgid "Idea" |
| msgstr "Ý tưởng" |
| |
| #: ../../../developer/swarm.md:429 |
| msgid "" |
| "A swarm conversation can have multiple rendez-vous. A rendez-vous is defined" |
| " by the following uri:" |
| msgstr "Một cuộc trò chuyện đám đông có thể có nhiều cuộc hẹn." |
| |
| #: ../../../developer/swarm.md:431 |
| msgid "" |
| "\"accountUri/deviceId/conversationId/confId\" where accountUri/deviceId " |
| "describes the host." |
| msgstr "" |
| "\"accountUri/deviceId/conversationId/confId\" nơi accountUri/deviceId mô tả " |
| "máy chủ." |
| |
| #: ../../../developer/swarm.md:433 |
| msgid "The host can be determined via two ways:" |
| msgstr "Người chủ có thể được xác định bằng hai cách:" |
| |
| #: ../../../developer/swarm.md:435 |
| msgid "" |
| "In the swarm metadatas. Where it's stored like the title/desc/avatar of the " |
| "room" |
| msgstr "" |
| "Trong đám metadata, nơi nó được lưu trữ như tiêu đề/các bàn/tình ảnh của " |
| "phòng" |
| |
| #: ../../../developer/swarm.md:436 |
| msgid "Or the initial caller." |
| msgstr "Hoặc là người gọi đầu tiên." |
| |
| #: ../../../developer/swarm.md:438 |
| msgid "" |
| "When starting a call, the host will add a new commit to the swarm, with the " |
| "URI to join (accountUri/deviceId/conversationId/confId). This will be valid " |
| "till the end of the call (announced by a commit with the duration to show)" |
| msgstr "" |
| "Khi bắt đầu cuộc gọi, chủ nhà sẽ thêm một cam kết mới vào đám đông, với URI " |
| "để tham gia (accountUri/deviceId/conversationId/confId)." |
| |
| #: ../../../developer/swarm.md:441 |
| msgid "" |
| "So every part will receive the infos that a call has started and will be " |
| "able to join it by calling it." |
| msgstr "" |
| "Vì vậy, mỗi phần sẽ nhận được thông tin rằng một cuộc gọi đã bắt đầu và sẽ " |
| "có thể tham gia nó bằng cách gọi nó." |
| |
| #: ../../../developer/swarm.md:443 |
| msgid "Attacks?" |
| msgstr "Chuyện tấn công?" |
| |
| #: ../../../developer/swarm.md:445 |
| msgid "Avoid git bombs" |
| msgstr "Tránh những quả bom git" |
| |
| #: ../../../developer/swarm.md:447 |
| msgid "Notes" |
| msgstr "Các ghi chú" |
| |
| #: ../../../developer/swarm.md:449 |
| msgid "" |
| "The timestamp of a commit can be trusted because it's editable. Only the " |
| "user's timestamp can be trusted." |
| msgstr "" |
| "Bức timestamp của một commit có thể được tin cậy bởi vì nó có thể chỉnh sửa." |
| " Chỉ có timestamp của người dùng có thể được tin cậy." |
| |
| #: ../../../developer/swarm.md:451 |
| msgid "TLS" |
| msgstr "TLS" |
| |
| #: ../../../developer/swarm.md:453 |
| msgid "" |
| "Git operations, control messages, files, and other things will use a p2p TLS" |
| " v1.3 link with only ciphers which guaranty PFS. So each key is renegotiated" |
| " for each new connexion." |
| msgstr "" |
| "Các hoạt động Git, tin nhắn kiểm soát, tệp, và những thứ khác sẽ sử dụng một" |
| " liên kết TLS v1.3 p2p chỉ có mã hóa đảm bảo PFS. Vì vậy mỗi khóa được đàm " |
| "phán lại cho mỗi kết nối mới." |
| |
| #: ../../../developer/swarm.md:455 |
| msgid "DHT (udp)" |
| msgstr "DHT (udp)" |
| |
| #: ../../../developer/swarm.md:457 |
| msgid "" |
| "Used to send messages for mobiles (to trigger push notifications) and to " |
| "initiate TCP connexions." |
| msgstr "" |
| "Được sử dụng để gửi tin nhắn cho điện thoại di động (để kích hoạt thông báo " |
| "đẩy) và để khởi động kết nối TCP." |
| |
| #: ../../../developer/swarm.md:459 |
| msgid "Network activity" |
| msgstr "Hoạt động mạng" |
| |
| #: ../../../developer/swarm.md:461 |
| msgid "Process to invite someone" |
| msgstr "Quá trình mời ai đó" |
| |
| #: ../../../developer/swarm.md:463 |
| msgid "Alice wants to invite Bob:" |
| msgstr "Alice muốn mời Bob:" |
| |
| #: ../../../developer/swarm.md:465 |
| msgid "Alice adds bob to a conversation" |
| msgstr "Alice thêm Bob vào cuộc trò chuyện" |
| |
| #: ../../../developer/swarm.md:466 |
| msgid "" |
| "Alice generates an invite: { \"application/invite+json\" : { " |
| "\"conversationId\": \"$id\", \"members\": [{...}] }}" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:470 |
| msgid "" |
| "Two possibilities for sending the message a. If not connected, via the DHT" |
| " b. Else, Alice sends on the SIP channel" |
| msgstr "" |
| "Hai khả năng để gửi thông điệp a. Nếu không kết nối, qua DHT b. Nếu không, " |
| "Alice gửi trên kênh SIP" |
| |
| #: ../../../developer/swarm.md:473 |
| msgid "" |
| "Two possibilities for Bob a. Receives the invite, a signal is emitted for " |
| "the client b. Not connected, so will never receive the request cause Alice " |
| "must not know if Bob just ignored or blocked Alice. The only way is to " |
| "regenerate a new invite via a new message (cf. next scenario)" |
| msgstr "" |
| "Bob nhận được lời mời, một tín hiệu được phát ra cho khách hàng b. Không kết" |
| " nối, vì vậy sẽ không bao giờ nhận được yêu cầu vì Alice không thể biết nếu " |
| "Bob đã bỏ qua hoặc chặn Alice. Cách duy nhất là tái tạo lời mời mới thông " |
| "qua một tin nhắn mới (xem kịch bản tiếp theo)" |
| |
| #: ../../../developer/swarm.md:477 |
| msgid "Process to send a message to someone" |
| msgstr "Quá trình để gửi tin nhắn cho ai đó" |
| |
| #: ../../../developer/swarm.md:479 |
| msgid "Alice wants to send a message to Bob:" |
| msgstr "Alice muốn gửi tin nhắn cho Bob:" |
| |
| #: ../../../developer/swarm.md:481 |
| msgid "Alice adds a message in the repo, giving an ID" |
| msgstr "Alice thêm một tin nhắn vào repo, cho một ID" |
| |
| #: ../../../developer/swarm.md:482 |
| msgid "Alice gets a message received (from herself) if successful" |
| msgstr "Alice nhận được một tin nhắn (từ chính mình) nếu thành công" |
| |
| #: ../../../developer/swarm.md:483 |
| msgid "" |
| "Two possibilities, alice and bob are connected, or not. In both case a " |
| "message is crafted: { \"application/im-gitmessage-id\" : " |
| "\"{\"id\":\"$convId\", \"commit\":\"$commitId\", \"deviceId\": " |
| "\"$alice_device_hash\"}\"}. a. If not connected, via the DHT b. Else, " |
| "Alice sends on the SIP channel" |
| msgstr "" |
| "Hai khả năng, alice và bob có kết nối, hoặc không. Trong cả hai trường hợp " |
| "một thông điệp được tạo ra: { \"application/im-gitmessage-id\" : " |
| "\"{\"id\":\"$convId\", \"commit\":\"$commitId\", \"deviceId\": " |
| "\"$alice_device_hash\"}\"}." |
| |
| #: ../../../developer/swarm.md:486 |
| msgid "" |
| "Four possibilities for Bob: a. Bob is not connected to Alice, so if he " |
| "trusts Alice, ask for a new connection and go to b. b. If connected, fetch " |
| "from Alice and announce new messages c. Bob doesn't know that conversation." |
| " Ask through the DHT to get an invite first to be able to accept that " |
| "conversation ({\"application/invite\", conversationId}) d. Bob is " |
| "disconnected (no network, or just closed). He will not receive the new " |
| "message but will try to sync when the next connection will occur" |
| msgstr "" |
| "Bốn khả năng cho Bob: a. Bob không kết nối với Alice, vì vậy nếu ông tin " |
| "tưởng Alice, hãy yêu cầu kết nối mới và đi đến b. b. Nếu kết nối, hãy lấy từ" |
| " Alice và thông báo tin mới c. Bob không biết cuộc trò chuyện đó. Hãy yêu " |
| "cầu thông qua DHT để nhận được một lời mời trước tiên để có thể chấp nhận " |
| "cuộc trò chuyện đó ({\" ứng dụng/ mời\", cuộc trò chuyệnId}) d. Bob bị ngắt " |
| "kết nối (không có mạng, hoặc chỉ đóng)." |
| |
| #: ../../../developer/swarm.md:495 |
| msgid "![Diagram: swarm chat classes](images/swarm-chat-classes-diagram.jpg)" |
| msgstr "" |
| "! [Chương trình: lớp học trò chuyện đám đông](hình ảnh/chương trình trò " |
| "chuyện đám đông lớp học.jpg)" |
| |
| #: ../../../developer/swarm.md:495 |
| msgid "Diagram: swarm chat classes" |
| msgstr "Hình: lớp học trò chuyện đám đông" |
| |
| #: ../../../developer/swarm.md:497 |
| msgid "Supported messages" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:499 |
| msgid "Initial message" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:509 |
| msgid "Represents the first commit of a repository and contains the mode:" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:514 |
| msgid "and `invited` if mode = 0." |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:516 |
| msgid "Text message" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:526 |
| msgid "Or for an edition:" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:538 |
| msgid "Show the end of a call (duration in milliseconds):" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:547 |
| msgid "Or for hosting a call in a group (when it starts)" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:558 |
| msgid "" |
| "A second commit with the same JSON + `duration` is added at the end of the " |
| "call when hosted." |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:560 |
| msgid "Add a file" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:572 |
| msgid "`totalSize` is in bits," |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:574 |
| msgid "Updating profile" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:582 |
| msgid "Member event" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:592 |
| msgid "" |
| "When a member is invited, join or leave or is kicked from a conversation" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:594 |
| msgid "Vote event" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:596 |
| msgid "" |
| "Generated by administrators to add a vote for kicking or un-kicking someone." |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:608 |
| msgid "**!! OLD DRAFT !!**" |
| msgstr "**!! DRAFT LÀN!!**" |
| |
| #: ../../../developer/swarm.md:610 |
| msgid "" |
| "Note: Following notes are not organized yet. Just some line of thoughts." |
| msgstr "Lưu ý: Những ghi chú sau đây chưa được sắp xếp." |
| |
| #: ../../../developer/swarm.md:612 |
| msgid "Crypto improvements." |
| msgstr "Những cải tiến về tiền điện tử." |
| |
| #: ../../../developer/swarm.md:614 |
| msgid "" |
| "For a serious group chat feature, we also need serious crypto. With the " |
| "current design, if a certificate is stolen as the previous DHT values of a " |
| "conversation, the conversation can be decrypted. Maybe we need to go to " |
| "something like **Double ratchet**." |
| msgstr "" |
| "Đối với một tính năng trò chuyện nhóm nghiêm túc, chúng ta cũng cần mã hóa " |
| "nghiêm túc. Với thiết kế hiện tại, nếu một chứng chỉ bị đánh cắp như các giá" |
| " trị DHT trước của một cuộc trò chuyện, cuộc trò chuyện có thể được giải mã." |
| " Có lẽ chúng ta cần phải đi đến một cái gì đó như ** Double ratchet**." |
| |
| #: ../../../developer/swarm.md:616 |
| msgid "" |
| "Note: a lib might exist to implement group conversations. TODO, investigate." |
| msgstr "Lưu ý: có thể có một lib để thực hiện các cuộc trò chuyện nhóm." |
| |
| #: ../../../developer/swarm.md:618 |
| msgid "Needs ECC support in OpenDHT" |
| msgstr "Cần hỗ trợ ECC trong OpenDHT" |
| |
| #: ../../../developer/swarm.md:622 |
| msgid "Add Roles?" |
| msgstr "Thêm vai trò?" |
| |
| #: ../../../developer/swarm.md:624 |
| msgid "There is two major use case for group chats:" |
| msgstr "Có hai trường hợp sử dụng chính cho trò chuyện nhóm:" |
| |
| #: ../../../developer/swarm.md:626 |
| msgid "" |
| "Something like a Mattermost in a company, with private channels, and some " |
| "roles (admin/spectator/bot/etc) or for educations (where only a few are " |
| "active)." |
| msgstr "" |
| "Một cái gì đó như một Mattermost trong một công ty, với các kênh riêng, và " |
| "một số vai trò (admin/spectator/bot/etc) hoặc cho giáo dục (nơi chỉ có một " |
| "vài người hoạt động)." |
| |
| #: ../../../developer/swarm.md:627 |
| msgid "Horizontal conversations like a conversation between friends." |
| msgstr "" |
| "Những cuộc trò chuyện ngang ngang như một cuộc trò chuyện giữa bạn bè." |
| |
| #: ../../../developer/swarm.md:629 |
| msgid "Jami will be for which one?" |
| msgstr "" |
| |
| #: ../../../developer/swarm.md:631 |
| msgid "Implementation idea" |
| msgstr "Ý tưởng thực hiện" |
| |
| #: ../../../developer/swarm.md:633 |
| msgid "" |
| "A certificate for a group that sign user with a flag for a role. Adding or " |
| "revoking can also be done." |
| msgstr "Một chứng chỉ cho một nhóm ký tên người dùng với cờ cho một vai trò." |
| |
| #: ../../../developer/swarm.md:635 |
| msgid "Join a conversation" |
| msgstr "Tham gia cuộc trò chuyện" |
| |
| #: ../../../developer/swarm.md:637 |
| msgid "Only via a direct invite" |
| msgstr "Chỉ qua lời mời trực tiếp" |
| |
| #: ../../../developer/swarm.md:638 |
| msgid "Via a link/QR Code/whatever" |
| msgstr "Thông qua một liên kết/QR Code/ bất cứ điều gì" |
| |
| #: ../../../developer/swarm.md:639 |
| msgid "Via a room name? (a **hash** on the DHT)" |
| msgstr "Thông qua tên phòng?" |
| |
| #: ../../../developer/swarm.md:641 |
| msgid "What we need" |
| msgstr "Những gì chúng ta cần" |
| |
| #: ../../../developer/swarm.md:643 |
| msgid "" |
| "Confidentiality: members outside of the group chat should not be able to " |
| "read messages in the group" |
| msgstr "" |
| "Bảo mật: các thành viên bên ngoài trò chuyện nhóm không nên có thể đọc tin " |
| "nhắn trong nhóm" |
| |
| #: ../../../developer/swarm.md:644 |
| msgid "" |
| "Forward secrecy: if any key from the group is compromised, previous messages" |
| " should remain confidential (as much as possible)" |
| msgstr "" |
| "Sự bí mật tiếp theo: nếu bất kỳ khóa nào từ nhóm bị xâm nhập, tin nhắn trước" |
| " đó nên được giữ bí mật (tối đa khả năng)" |
| |
| #: ../../../developer/swarm.md:646 |
| msgid "Message ordering: There is a need to have messages in the right order" |
| msgstr "Định hướng thông điệp: Có nhu cầu có thông điệp theo thứ tự đúng" |
| |
| #: ../../../developer/swarm.md:647 |
| msgid "" |
| "Synchronization: There is also a need to be sure to have all messages at " |
| "soon as possible." |
| msgstr "" |
| "Đồng bộ hóa: Ngoài ra còn cần phải đảm bảo có tất cả các tin nhắn càng sớm " |
| "càng tốt." |
| |
| #: ../../../developer/swarm.md:648 |
| msgid "" |
| "Persistence: Actually, a message on the DHT lives only 10 minutes. Because " |
| "it's the best timing calculated for this kind of DHT. To persist data, the " |
| "node must re-put the value on the DHT every 10 minutes. Another way to do " |
| "when the node is offline is to let nodes re-put the data. But, if after 10 " |
| "minutes, 8 nodes are still here, they will do 64 requests (and it's " |
| "exponential). The current way to avoid spamming for that is queried. This " |
| "will still do 64 requests but limit the max redundancy to 8 nodes." |
| msgstr "" |
| "Sự kiên trì: Thực tế, một tin nhắn trên DHT chỉ tồn tại 10 phút. Bởi vì đó " |
| "là thời gian tốt nhất được tính toán cho loại DHT này. Để duy trì dữ liệu, " |
| "nút phải đặt lại giá trị trên DHT mỗi 10 phút. Một cách khác để làm khi nút " |
| "offline là để các nút đặt lại dữ liệu. Nhưng, nếu sau 10 phút, 8 nút vẫn ở " |
| "đây, họ sẽ thực hiện 64 yêu cầu (và nó là tăng trưởng). Cách hiện tại để " |
| "tránh spam cho điều đó là truy vấn. Điều này vẫn sẽ thực hiện 64 yêu cầu " |
| "nhưng giới hạn sự dư thừa tối đa đến 8 nút." |
| |
| #: ../../../developer/swarm.md:650 |
| msgid "Other distributed ways" |
| msgstr "Các phương thức phân phối khác" |
| |
| #: ../../../developer/swarm.md:652 |
| msgid "IPFS: Need some investigation" |
| msgstr "IPFS: cần một số điều tra" |
| |
| #: ../../../developer/swarm.md:653 |
| msgid "BitMessage: Need some investigation" |
| msgstr "Bắt đầu điều tra" |
| |
| #: ../../../developer/swarm.md:654 |
| msgid "Maidsafe: Need some investigation" |
| msgstr "Tôi cần điều tra." |
| |
| #: ../../../developer/swarm.md:656 |
| msgid "Based on current work we have" |
| msgstr "Dựa trên công việc hiện tại chúng ta có" |
| |
| #: ../../../developer/swarm.md:658 |
| msgid "" |
| "Group chat can be based on the same work we already have for multi-devices " |
| "(but here, with a group certificate). Problems to solve:" |
| msgstr "" |
| "Các trò chuyện nhóm có thể dựa trên cùng một công việc mà chúng ta đã có cho" |
| " nhiều thiết bị (nhưng ở đây, với một chứng chỉ nhóm)." |
| |
| #: ../../../developer/swarm.md:660 |
| msgid "" |
| "History sync. This needs to move the database from the client into the " |
| "daemon." |
| msgstr "Điều này cần phải di chuyển cơ sở dữ liệu từ khách hàng sang con quỷ." |
| |
| #: ../../../developer/swarm.md:661 |
| msgid "" |
| "If nobody is connected, the synchronization can not be done, and the person " |
| "will never see the conversation" |
| msgstr "" |
| "Nếu không ai kết nối, đồng bộ hóa không thể được thực hiện, và người đó sẽ " |
| "không bao giờ thấy cuộc trò chuyện" |
| |
| #: ../../../developer/swarm.md:663 |
| msgid "Another dedicated DHT" |
| msgstr "Một DHT chuyên dụng khác" |
| |
| #: ../../../developer/swarm.md:665 |
| msgid "Like a DHT with a superuser. (Not convinced)" |
| msgstr "Giống như một DHT với một người dùng siêu." |
| |
| #: ../../../developer/swarm.md:669 |
| msgid "" |
| "Currently, the file transfer algorithm is based on a TURN connection (See " |
| "{doc}`file-transfer`). In the case of a big group, this will be bad. We " |
| "first need a p2p implement for the file transfer. Implement the RFC for p2p " |
| "transfer." |
| msgstr "" |
| "Hiện tại, thuật toán chuyển giao tệp dựa trên kết nối TURN (xem {doc}`file-" |
| "transfer`). Trong trường hợp của một nhóm lớn, điều này sẽ không tốt. Chúng " |
| "ta cần đầu tiên một ứng dụng p2p cho chuyển giao tệp. Thực hiện RFC cho " |
| "chuyển giao p2p." |
| |
| #: ../../../developer/swarm.md:671 |
| msgid "" |
| "Other problem: currently there is no implementation for TCP support for ICE " |
| "in PJSIP. This is mandatory for this point (in pjsip or homemade)" |
| msgstr "" |
| "Vấn đề khác: hiện tại không có sự triển khai hỗ trợ TCP cho ICE trong PJSIP." |
| " Điều này là bắt buộc cho điểm này (trong pjsip hoặc tự làm)" |
| |
| #: ../../../developer/swarm.md:673 |
| msgid "Resources" |
| msgstr "Tài nguyên" |
| |
| #: ../../../developer/swarm.md:675 |
| msgid "https://eprint.iacr.org/2017/666.pdf" |
| msgstr "https://eprint.iacr.org/2017/666.pdf" |
| |
| #: ../../../developer/swarm.md:676 |
| msgid "" |
| "Robust distributed synchronization of networked linear systems with " |
| "intermittent information (Sean Phillips and Ricardo G.Sanfelice)" |
| msgstr "" |
| "Sự đồng bộ phân phối mạnh mẽ của các hệ thống tuyến tính được mạng hóa với " |
| "thông tin gián đoạn (Sean Phillips và Ricardo G.Sanfelice)" |
| |
| #: ../../../developer/synchronization-protocol.md:1 |
| msgid "Synchronization protocol" |
| msgstr "Phụ liệu đồng bộ hóa" |
| |
| #: ../../../developer/synchronization-protocol.md:4 |
| msgid "" |
| "The swarm chat provides new possibilities for every device. Now, it's " |
| "possible to sync history between devices by sharing the related repository. " |
| "Devices sync needs to be redefined to follow those changes." |
| msgstr "" |
| "Các trò chuyện đám cung cấp những khả năng mới cho mọi thiết bị. Bây giờ, nó" |
| " là có thể đồng bộ hóa lịch sử giữa các thiết bị bằng cách chia sẻ kho lưu " |
| "trữ liên quan. thiết bị đồng bộ hóa cần phải được định nghĩa lại để theo dõi" |
| " những thay đổi đó." |
| |
| #: ../../../developer/synchronization-protocol.md:6 |
| msgid "" |
| "A lot of scenarios are defined in the {doc}`Swarm design document <swarm>`, " |
| "however, this doesn't imply for syncing conversations between devices for " |
| "the same user. Some new scenarios must be written." |
| msgstr "" |
| "Nhiều kịch bản được định nghĩa trong tài liệu thiết kế {doc}`Swarm <swarm>`," |
| " tuy nhiên, điều này không có nghĩa là đồng bộ hóa các cuộc trò chuyện giữa " |
| "các thiết bị cho cùng một người dùng. Một số kịch bản mới phải được viết." |
| |
| #: ../../../developer/synchronization-protocol.md:8 |
| msgid "Old method" |
| msgstr "Phương pháp cũ" |
| |
| #: ../../../developer/synchronization-protocol.md:10 |
| msgid "" |
| "Device sync were done via the DHT. Because every value MUST NOT exceed 64k, " |
| "conversations were not sent in device sync, nor member profiles, because " |
| "it's too heavy. This is a problem and MUST be improved." |
| msgstr "" |
| "Các thiết bị đồng bộ đã được thực hiện thông qua DHT. Bởi vì mỗi giá trị " |
| "KHÔNG CHO vượt quá 64k, các cuộc trò chuyện không được gửi trong đồng bộ " |
| "thiết bị, hoặc hồ sơ thành viên, bởi vì nó quá nặng. Đây là một vấn đề và " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO " |
| "CHO CHO CHO CHO CHO CHO CHO CHO CHO CHO" |
| |
| #: ../../../developer/synchronization-protocol.md:12 |
| msgid "" |
| "In the old method, the daemon is listening on \"inbox:DEVICE_ID\" for " |
| "DeviceSync values which contains the contact list to sync (cf. " |
| "`AccountManager::startSync()`);" |
| msgstr "" |
| "Trong phương pháp cũ, daemon đang nghe trên \"inbox:DEVICE_ID\" cho các giá " |
| "trị DeviceSync chứa danh sách liên lạc để đồng bộ hóa (xem " |
| "`AccountManager::startSync() `);" |
| |
| #: ../../../developer/synchronization-protocol.md:14 |
| msgid "" |
| "**NOTE:** The current **DeviceSync** value present on the **DHT** is " |
| "deprecated with this draft." |
| msgstr "" |
| "** Lưu ý:** Giá trị **DeviceSync** hiện tại hiện có trên **DHT** đã bị lỗi " |
| "thời với dự thảo này." |
| |
| #: ../../../developer/synchronization-protocol.md:16 |
| msgid "New method" |
| msgstr "Phương pháp mới" |
| |
| #: ../../../developer/synchronization-protocol.md:18 |
| msgid "" |
| "Since Jami has the {doc}`ConnectionManager <connection-manager>`, using p2p " |
| "socket is possible to perform sync quickly with big values (cause the socket" |
| " is not limited in data)" |
| msgstr "" |
| "Vì Jami có {doc}`ConnectionManager <connection-manager>`, sử dụng socket p2p" |
| " có thể thực hiện đồng bộ hóa nhanh chóng với các giá trị lớn (vì socket " |
| "không bị giới hạn trong dữ liệu)" |
| |
| #: ../../../developer/synchronization-protocol.md:20 |
| msgid "Now, this is the scenario used to sync:" |
| msgstr "Đây là kịch bản được sử dụng để đồng bộ hóa:" |
| |
| #: ../../../developer/synchronization-protocol.md:22 |
| msgid "" |
| "When the device (*A*) goes online, it announces its presence via a " |
| "DeviceAnnouncement like the OldMethod" |
| msgstr "" |
| "Khi thiết bị (*A*) được bật lên, nó thông báo sự hiện diện của nó thông qua " |
| "một Thông báo thiết bị như OldMethod" |
| |
| #: ../../../developer/synchronization-protocol.md:23 |
| msgid "" |
| "Other devices (*!A*) will detect that announce and will ask this device " |
| "through the **ConnectionManager** to open a new channel named " |
| "\"sync://DEVICE_ID_A\". (Note: A will get announcement from other devices, " |
| "so it will asks for sync channels too)." |
| msgstr "" |
| "Các thiết bị khác (*!A*) sẽ phát hiện thông báo đó và sẽ yêu cầu thiết bị " |
| "này thông qua **ConnectionManager** để mở một kênh mới có tên là " |
| "\"sync://DEVICE_ID_A\". (Lưu ý: A sẽ nhận thông báo từ các thiết bị khác, vì" |
| " vậy nó sẽ yêu cầu các kênh đồng bộ hóa cũng vậy)." |
| |
| #: ../../../developer/synchronization-protocol.md:24 |
| msgid "" |
| "As soon as this channel is opened, the device which is asking this channel " |
| "will send a **DeviceSync** (cf. next part) value containing its known " |
| "conversations and contacts." |
| msgstr "" |
| "Ngay khi kênh này được mở, thiết bị yêu cầu kênh này sẽ gửi một giá trị " |
| "**DeviceSync** (xem phần tiếp theo) chứa các cuộc trò chuyện và liên lạc " |
| "được biết đến của nó." |
| |
| #: ../../../developer/synchronization-protocol.md:25 |
| msgid "*A* will check the **DeviceSync** value and:" |
| msgstr "*A* sẽ kiểm tra giá trị **DeviceSync** và:" |
| |
| #: ../../../developer/synchronization-protocol.md:26 |
| msgid "Remove contacts if it detects removed contacts" |
| msgstr "Xóa các liên lạc nếu nó phát hiện các liên lạc đã bị xóa" |
| |
| #: ../../../developer/synchronization-protocol.md:27 |
| msgid "Add contacts if it detects added contacts" |
| msgstr "Thêm liên lạc nếu nó phát hiện thêm liên lạc" |
| |
| #: ../../../developer/synchronization-protocol.md:28 |
| msgid "Remove conversations if it detects removed conversations" |
| msgstr "" |
| "Xóa các cuộc trò chuyện nếu nó phát hiện các cuộc trò chuyện đã bị xóa" |
| |
| #: ../../../developer/synchronization-protocol.md:29 |
| msgid "Add conversations if it detects added conversations" |
| msgstr "Thêm các cuộc trò chuyện nếu nó phát hiện thêm các cuộc trò chuyện" |
| |
| #: ../../../developer/synchronization-protocol.md:30 |
| msgid "" |
| "Remove conversation's requests if request is accepted (now in " |
| "conversations)/declined" |
| msgstr "" |
| "Xóa yêu cầu của cuộc trò chuyện nếu yêu cầu được chấp nhận (nay đang trong " |
| "cuộc trò chuyện) / từ chối" |
| |
| #: ../../../developer/synchronization-protocol.md:31 |
| msgid "Add conversation's requests if detected" |
| msgstr "Thêm yêu cầu của cuộc trò chuyện nếu phát hiện" |
| |
| #: ../../../developer/synchronization-protocol.md:33 |
| msgid "" |
| "Note: If *A* detects new conversations, it will asks the device which " |
| "announced that conversation to clone the repository through a git channel " |
| "(so like described in {doc}`Swarm chat design <swarm>`)" |
| msgstr "" |
| "Lưu ý: Nếu *A* phát hiện ra các cuộc trò chuyện mới, nó sẽ yêu cầu thiết bị " |
| "đã thông báo cuộc trò chuyện đó nhân bản kho thông qua kênh git (như mô tả " |
| "trong thiết kế trò chuyện {doc}`Swarm <swarm>`)" |
| |
| #: ../../../developer/synchronization-protocol.md:35 |
| msgid "Device Sync" |
| msgstr "Truy cập thiết bị" |
| |
| #: ../../../developer/synchronization-protocol.md:37 |
| msgid "This value is a JSON containing:" |
| msgstr "Giá trị này là một JSON chứa:" |
| |
| #: ../../../developer/synchronization-protocol.md:54 |
| msgid "User stories" |
| msgstr "Câu chuyện người dùng" |
| |
| #: ../../../developer/synchronization-protocol.md:56 |
| msgid "Sync when adding device" |
| msgstr "Đồng bộ khi thêm thiết bị" |
| |
| #: ../../../developer/synchronization-protocol.md:58 |
| #: ../../../developer/synchronization-protocol.md:65 |
| #: ../../../developer/synchronization-protocol.md:73 |
| msgid "Alice creates a conversation" |
| msgstr "Alice tạo ra một cuộc trò chuyện" |
| |
| #: ../../../developer/synchronization-protocol.md:59 |
| #: ../../../developer/synchronization-protocol.md:66 |
| msgid "(Optional) Alice add some messages" |
| msgstr "Alice thêm một số tin nhắn" |
| |
| #: ../../../developer/synchronization-protocol.md:60 |
| msgid "Alice adds another device" |
| msgstr "Alice thêm một thiết bị khác" |
| |
| #: ../../../developer/synchronization-protocol.md:61 |
| #: ../../../developer/synchronization-protocol.md:68 |
| msgid "" |
| "The other device should receives and sync the conversation previously " |
| "created" |
| msgstr "Thiết bị khác sẽ nhận và đồng bộ hóa cuộc trò chuyện đã tạo trước đó" |
| |
| #: ../../../developer/synchronization-protocol.md:63 |
| msgid "Sync when connect a device" |
| msgstr "Đồng bộ hóa khi kết nối thiết bị" |
| |
| #: ../../../developer/synchronization-protocol.md:67 |
| msgid "Alice connects another device" |
| msgstr "Alice kết nối một thiết bị khác" |
| |
| #: ../../../developer/synchronization-protocol.md:70 |
| msgid "Sync between multiple devices" |
| msgstr "Truyền hợp giữa nhiều thiết bị" |
| |
| #: ../../../developer/synchronization-protocol.md:72 |
| msgid "Alice got 2 devices" |
| msgstr "Alice có 2 thiết bị." |
| |
| #: ../../../developer/synchronization-protocol.md:74 |
| msgid "" |
| "The other device should receives and sync the conversation created on one of" |
| " the devices" |
| msgstr "" |
| "Thiết bị khác nên nhận và đồng bộ hóa cuộc trò chuyện được tạo trên một " |
| "trong các thiết bị" |
| |
| #: ../../../developer/synchronization-protocol.md:76 |
| msgid "Sync for detecting new requests" |
| msgstr "Đồng bộ hóa để phát hiện các yêu cầu mới" |
| |
| #: ../../../developer/synchronization-protocol.md:78 |
| msgid "Alice receives a conversation's request" |
| msgstr "Alice nhận được yêu cầu để trò chuyện" |
| |
| #: ../../../developer/synchronization-protocol.md:79 |
| msgid "Alice add a new device" |
| msgstr "Alice thêm một thiết bị mới" |
| |
| #: ../../../developer/synchronization-protocol.md:80 |
| msgid "The other device should retrieve the requests from device A" |
| msgstr "Thiết bị khác nên lấy lại các yêu cầu từ thiết bị A" |
| |
| #: ../../../developer/synchronization-protocol.md:82 |
| msgid "Sync for accepted requests" |
| msgstr "Đồng bộ hóa cho các yêu cầu được chấp nhận" |
| |
| #: ../../../developer/synchronization-protocol.md:84 |
| #: ../../../developer/synchronization-protocol.md:90 |
| msgid "Alice has 2 devices" |
| msgstr "Alice có 2 thiết bị." |
| |
| #: ../../../developer/synchronization-protocol.md:85 |
| msgid "Alice accepts a conversation's request" |
| msgstr "Alice chấp nhận yêu cầu của một cuộc trò chuyện" |
| |
| #: ../../../developer/synchronization-protocol.md:86 |
| msgid "The other device should detect the accepted request" |
| msgstr "Thiết bị khác sẽ phát hiện yêu cầu được chấp nhận" |
| |
| #: ../../../developer/synchronization-protocol.md:88 |
| msgid "Sync for decline requests" |
| msgstr "Đồng bộ hóa cho yêu cầu từ chối" |
| |
| #: ../../../developer/synchronization-protocol.md:91 |
| msgid "Alice declines a conversation's request" |
| msgstr "Alice từ chối yêu cầu để nói chuyện" |
| |
| #: ../../../developer/synchronization-protocol.md:92 |
| msgid "The other device should detect the declined request" |
| msgstr "Thiết bị khác nên phát hiện yêu cầu từ chối" |
| |
| #: ../../../developer/synchronization-protocol.md:94 |
| msgid "Current implementation" |
| msgstr "Thực hiện hiện hiện tại" |
| |
| #: ../../../developer/synchronization-protocol.md:96 |
| msgid "{gerrit}`15584` implements this page" |
| msgstr "{gerrit}`15584` thực hiện trang này" |
| |
| #: ../../../developer/synchronizing-profiles.md:1 |
| msgid "Profile synchronization" |
| msgstr "Tích hợp hồ sơ" |
| |
| #: ../../../developer/synchronizing-profiles.md:3 |
| msgid "" |
| "There is two types of profiles. The one for the current account, and the " |
| "ones from contacts. As this vcard contains infos, such as the avatar and the" |
| " display name, it should be synced as soon as possible. But, it must be sent" |
| " only when needed, to avoid un-necessary data transmissions. The format used" |
| " to store the profiles is a [vCard](https://en.wikipedia.org/wiki/VCard) " |
| "(https://datatracker.ietf.org/doc/html/rfc6350)" |
| msgstr "" |
| "Có hai loại hồ sơ. Một là cho tài khoản hiện tại, và những người từ các liên" |
| " hệ. Vì vcard này chứa thông tin, chẳng hạn như avatar và tên hiển thị, nó " |
| "nên được đồng bộ hóa càng sớm càng tốt. Nhưng, nó chỉ phải được gửi khi cần " |
| "thiết, để tránh việc truyền dữ liệu không cần thiết." |
| |
| #: ../../../developer/synchronizing-profiles.md:5 |
| msgid "Where are stored profiles?" |
| msgstr "Các hồ sơ được lưu trữ ở đâu?" |
| |
| #: ../../../developer/synchronizing-profiles.md:7 |
| msgid "Self" |
| msgstr "Tự" |
| |
| #: ../../../developer/synchronizing-profiles.md:9 |
| msgid "" |
| "It's in `${idPath_}/profile.vcf` e.g.: " |
| "`.local/share/jami/xxxxxx/profile.vcf` on GNU/Linux." |
| msgstr "" |
| "Nó nằm trong `${idPath_}/profile.vcf` ví dụ: " |
| "`.local/share/jami/xxxxxx/profile.vcf` trên GNU/Linux." |
| |
| #: ../../../developer/synchronizing-profiles.md:11 |
| msgid "Contacts" |
| msgstr "Liên hệ" |
| |
| #: ../../../developer/synchronizing-profiles.md:13 |
| msgid "" |
| "Because this logic is still managed per client, it depends on the client. " |
| "However, on Desktop, this is unified and stored into: " |
| "`${idPath_}/profiles/${base64(uri)}.vcf`" |
| msgstr "" |
| "Vì logic này vẫn được quản lý theo mỗi client, nó phụ thuộc vào client. Tuy " |
| "nhiên, trên Desktop, điều này được thống nhất và lưu trữ vào: " |
| "`${idPath_}/profiles/${base64(uri)}.vcf`" |
| |
| #: ../../../developer/synchronizing-profiles.md:16 |
| msgid "When a profile is sent" |
| msgstr "Khi một hồ sơ được gửi" |
| |
| #: ../../../developer/synchronizing-profiles.md:21 |
| msgid "" |
| "At the beginning of a call, generally client sends the vCard. However, this " |
| "method should be removed in favor of the other located in the daemon." |
| msgstr "" |
| "Vào đầu cuộc gọi, thường khách hàng gửi vCard. Tuy nhiên, phương pháp này " |
| "nên được loại bỏ để ủng hộ phương pháp khác nằm trong daemon." |
| |
| #: ../../../developer/synchronizing-profiles.md:23 |
| msgid "Send to contact's devices" |
| msgstr "Gửi đến thiết bị liên lạc" |
| |
| #: ../../../developer/synchronizing-profiles.md:25 |
| msgid "" |
| "When connecting to a new devices, a SIP or a sync channel is done. When this" |
| " channel is ready, we check if we need to send the profile. To do this, the " |
| "hash of the profile is compared to the one in the cache " |
| "(`${cacheDir}/${accId}/vcard/sha3` like `~/.cache/jami/xxxxx/vcard/sha3`on " |
| "GNU/Linux), and the file `${cacheDir}/${accId}/vcard/deviceId` is checked). " |
| "cf. `JamiAccount::needToSendProfile()`. If not present, the profile of the " |
| "account is sent. Typically, the name of the channel will be \"vcard://xxx\" " |
| "where the issuer is the one sending the profile." |
| msgstr "" |
| "Khi kết nối với một thiết bị mới, một kênh đồng bộ hóa hoặc SIP được thực " |
| "hiện. Khi kênh này sẵn sàng, chúng tôi kiểm tra xem chúng tôi cần gửi hồ sơ " |
| "hay không. Để làm điều này, hash của hồ sơ được so sánh với cái trong bộ nhớ" |
| " cache (`${cacheDir}/${accId}/vcard/sha3` như " |
| "`~/.cache/jami/xxxxx/vcard/sha3`on GNU/Linux), và tệp " |
| "`${cacheDir}/${accId}/vcard/deviceId` được kiểm tra." |
| |
| #: ../../../developer/synchronizing-profiles.md:27 |
| msgid "Multidevices" |
| msgstr "Máy đa thiết bị" |
| |
| #: ../../../developer/synchronizing-profiles.md:29 |
| msgid "" |
| "If the profile is sent and the device is from the same account, " |
| "conversations are checked and we send profiles of all members. The channel " |
| "name will be \"${conversationId}/profile/${memberUri}.vcf\". Behavior tested" |
| " in `daemon/test/unitTest/syncHistory/syncHistory.cpp`" |
| msgstr "" |
| "Nếu hồ sơ được gửi và thiết bị là từ cùng một tài khoản, các cuộc trò chuyện" |
| " được kiểm tra và chúng tôi gửi hồ sơ của tất cả các thành viên. Tên kênh sẽ" |
| " là \"${conversationId}/profile/${memberUri}.vcf\". Hành vi được kiểm tra " |
| "trong `daemon/test/unitTest/syncHistory/syncHistory.cpp`" |
| |
| #: ../../../developer/technical-overview.md:1 |
| msgid "Technical overview" |
| msgstr "Đánh giá kỹ thuật" |
| |
| #: ../../../developer/technical-overview.md:4 |
| msgid "Concepts" |
| msgstr "Các khái niệm" |
| |
| #: ../../../developer/technical-overview.md:7 |
| msgid "Jami Account" |
| msgstr "Tài khoản Jami" |
| |
| #: ../../../developer/technical-overview.md:9 |
| msgid "" |
| "A **Jami account** is defined by a cryptographic Jami Identity based of " |
| "**RSA asymmetric key-pair** and managed with **x.509 certificates** as " |
| "defined by *[RFC 5280](https://tools.ietf.org/html/rfc5280)*." |
| msgstr "" |
| "Tài khoản Jami** được xác định bởi một danh tính Jami mật mã dựa trên cặp " |
| "khóa không đối xứng **RSA** và được quản lý bằng các chứng chỉ **x.509** như" |
| " được xác định bởi *[RFC 5280](https://tools.ietf.org/html/rfc5280) *." |
| |
| #: ../../../developer/technical-overview.md:13 |
| msgid "" |
| "Jami uses the **gnutls** library to generate and manage RSA keys and " |
| "certificates." |
| msgstr "" |
| "Jami sử dụng thư viện **gnutls** để tạo và quản lý các khóa và chứng chỉ " |
| "RSA." |
| |
| #: ../../../developer/technical-overview.md:16 |
| msgid "Jami certificate" |
| msgstr "Giấy chứng nhận Jami" |
| |
| #: ../../../developer/technical-overview.md:18 |
| msgid "This represents the identify of a Jami user." |
| msgstr "Đây là danh tính của một người dùng Jami." |
| |
| #: ../../../developer/technical-overview.md:19 |
| msgid "Generated at account creation" |
| msgstr "Được tạo ra khi tạo tài khoản" |
| |
| #: ../../../developer/technical-overview.md:20 |
| msgid "Contains the Jami account public key." |
| msgstr "Có chứa chìa khóa công khai tài khoản Jami." |
| |
| #: ../../../developer/technical-overview.md:21 |
| msgid "" |
| "The SHA-1 fingerprint (160-bits) of this public certificate is the " |
| "**JamiId**." |
| msgstr "" |
| "Các dấu vân tay SHA-1 (160 bit) của chứng chỉ công khai này là **JamiId**." |
| |
| #: ../../../developer/technical-overview.md:23 |
| msgid "Signed by a CA (from an organization or self-signed)." |
| msgstr "Được ký bởi CA (từ một tổ chức hoặc tự ký)." |
| |
| #: ../../../developer/technical-overview.md:24 |
| msgid "The subject UID field must be the hexadecimal form of the JamiId." |
| msgstr "Các trường UID đối tượng phải là hình thức hexadecimal của JamiId." |
| |
| #: ../../../developer/technical-overview.md:25 |
| msgid "" |
| "The issuer UID field must be the hexadecimal form of the issuer public key " |
| "fingerprint (CA)." |
| msgstr "" |
| "Các trường UID của nhà phát hành phải là hình thức sáu thập kỷ của dấu vân " |
| "tay khóa công khai của nhà phát hành (CA)." |
| |
| #: ../../../developer/technical-overview.md:27 |
| msgid "Random RSA key-pair of at least 4096-bits long." |
| msgstr "Một cặp khóa RSA ngẫu nhiên dài ít nhất 4096 bit." |
| |
| #: ../../../developer/technical-overview.md:29 |
| msgid "Device certificate" |
| msgstr "Giấy chứng nhận thiết bị" |
| |
| #: ../../../developer/technical-overview.md:31 |
| msgid "This is the identity of one specific device used to run Jami." |
| msgstr "" |
| "Đây là danh tính của một thiết bị cụ thể được sử dụng để điều hành Jami." |
| |
| #: ../../../developer/technical-overview.md:32 |
| msgid "One per device." |
| msgstr "Một trên mỗi thiết bị." |
| |
| #: ../../../developer/technical-overview.md:33 |
| msgid "Random and 4096-bits long." |
| msgstr "Tự nhiên và dài 4096 bit." |
| |
| #: ../../../developer/technical-overview.md:34 |
| msgid "The SHA-1 fingerprint of the public key becomes the **DeviceId**." |
| msgstr "Nhận dạng chữ cái của khóa công cộng là SHA-1 trở thành **DeviceId**." |
| |
| #: ../../../developer/technical-overview.md:35 |
| msgid "Must be signed by the private key that created the Jami certificate." |
| msgstr "Phải được ký bởi khóa riêng tạo ra chứng chỉ Jami." |
| |
| #: ../../../developer/technical-overview.md:36 |
| msgid "The subject UID field must be the hexadecimal form of the DeviceId." |
| msgstr "Các trường UID đối tượng phải là hình thức hexadecimal của DeviceId." |
| |
| #: ../../../developer/technical-overview.md:37 |
| msgid "" |
| "The issuer UID field must be the hexadecimal form of the issuer public key " |
| "fingerprint (JamiId)." |
| msgstr "" |
| "Các trường UID của nhà phát hành phải là hình thức sáu thập kỷ của dấu vân " |
| "tay khóa công khai của nhà phát hành (JamiId)." |
| |
| #: ../../../developer/technical-overview.md:40 |
| msgid "Usages" |
| msgstr "Sử dụng" |
| |
| #: ../../../developer/technical-overview.md:42 |
| msgid "The JamiId:" |
| msgstr "Các Jamilid:" |
| |
| #: ../../../developer/technical-overview.md:43 |
| msgid "" |
| "It's the DHT key where the list of account devices are published and where " |
| "all devices listen to synchronize on account changes (i.e. adding or revoke " |
| "a device)." |
| msgstr "" |
| "Đó là khóa DHT nơi danh sách các thiết bị tài khoản được xuất bản và tất cả " |
| "các thiết bị nghe để đồng bộ hóa khi thay đổi tài khoản (ví dụ: thêm hoặc " |
| "hủy bỏ một thiết bị)." |
| |
| #: ../../../developer/technical-overview.md:46 |
| msgid "" |
| "The Jami certificate RSA keys are used as long-term keys to " |
| "sign/encrypt/decrypt messages sent over the DHT:" |
| msgstr "" |
| "Các khóa RSA của chứng chỉ Jami được sử dụng như là khóa dài hạn để ký/phí " |
| "mã/phí mã hóa các thông điệp được gửi qua DHT:" |
| |
| #: ../../../developer/technical-overview.md:48 |
| msgid "" |
| "private key to sign-off and decrypt incoming messages and device " |
| "certificates." |
| msgstr "" |
| "khóa riêng để ký kết và giải mã các tin nhắn và chứng chỉ thiết bị đến." |
| |
| #: ../../../developer/technical-overview.md:50 |
| msgid "" |
| "public key to encrypt messages (this is done by the message issuer using the" |
| " receiver public key)." |
| msgstr "" |
| "Key public để mã hóa tin nhắn (điều này được thực hiện bởi người phát hành " |
| "tin nhắn bằng cách sử dụng key public của người nhận)." |
| |
| #: ../../../developer/technical-overview.md:52 |
| msgid "" |
| "A device can be \"removed\" from a Jami account through revocation of the " |
| "device certificate:" |
| msgstr "" |
| "Một thiết bị có thể được \"tắt\" khỏi tài khoản Jami bằng cách hủy giấy " |
| "chứng nhận thiết bị:" |
| |
| #: ../../../developer/technical-overview.md:54 |
| msgid "" |
| "Revoked device certificates are added to one or more standard x509 " |
| "Certificate Revocation List (CRL)." |
| msgstr "" |
| "Các chứng chỉ thiết bị bị bị hủy bỏ được thêm vào một hoặc nhiều danh sách " |
| "hủy bỏ chứng chỉ x509 tiêu chuẩn (CRL)." |
| |
| #: ../../../developer/technical-overview.md:56 |
| msgid "" |
| "CRLs for revoked device must be valid and signed with the corresponding CA " |
| "key, which is the Jami account private key." |
| msgstr "" |
| "Các CRL cho thiết bị bị bị hủy bỏ phải là hợp lệ và được ký với khóa CA " |
| "tương ứng, đó là khóa riêng tư của tài khoản Jami." |
| |
| #: ../../../developer/technical-overview.md:59 |
| msgid "Long-term Storage" |
| msgstr "Chất giữ lâu dài" |
| |
| #: ../../../developer/technical-overview.md:61 |
| msgid "Why storing data?" |
| msgstr "Tại sao lưu trữ dữ liệu?" |
| |
| #: ../../../developer/technical-overview.md:65 |
| msgid "" |
| "Jami needs to load certificates and key-pairs each time the application is " |
| "started." |
| msgstr "" |
| "Jami cần phải tải giấy chứng nhận và cặp chìa khóa mỗi khi ứng dụng được bắt" |
| " đầu." |
| |
| #: ../../../developer/technical-overview.md:67 |
| msgid "" |
| "When Jami creates a new device, these information are also needed, shared " |
| "from another trusted device in a secure way." |
| msgstr "" |
| "Khi Jami tạo ra một thiết bị mới, thông tin này cũng cần thiết, được chia sẻ" |
| " từ một thiết bị đáng tin cậy khác theo cách an toàn." |
| |
| #: ../../../developer/technical-overview.md:69 |
| msgid "" |
| "All platforms doesn't provide secure way to store data, Jami supports this " |
| "fact by encrypting data stored outside the memory (i.e. on a file-system) " |
| "using a user defined password during the account creation." |
| msgstr "" |
| "Tất cả các nền tảng không cung cấp cách an toàn để lưu trữ dữ liệu, Jami hỗ " |
| "trợ thực tế này bằng cách mã hóa dữ liệu được lưu trữ bên ngoài bộ nhớ (tức " |
| "là trên một hệ thống tập tin) bằng cách sử dụng mật khẩu được người dùng xác" |
| " định trong quá trình tạo tài khoản." |
| |
| #: ../../../developer/technical-overview.md:76 |
| msgid "These files are stored on user device (see below for details):" |
| msgstr "" |
| "Các tệp này được lưu trữ trên thiết bị của người dùng (xem dưới đây để biết " |
| "chi tiết):" |
| |
| #: ../../../developer/technical-overview.md:77 |
| msgid "a compressed and encrypted archive with private account data." |
| msgstr "Một lưu trữ nén và mã hóa với dữ liệu tài khoản riêng." |
| |
| #: ../../../developer/technical-overview.md:78 |
| msgid "the public certificates chain as a CRT file" |
| msgstr "chuỗi chứng chỉ công cộng như một tệp CRT" |
| |
| #: ../../../developer/technical-overview.md:79 |
| msgid "the device private key." |
| msgstr "khóa riêng của thiết bị." |
| |
| #: ../../../developer/technical-overview.md:81 |
| msgid "Jami archive (export.gz)" |
| msgstr "Tệp Jami (export.gz)" |
| |
| #: ../../../developer/technical-overview.md:83 |
| msgid "Contains private account data." |
| msgstr "Có chứa dữ liệu tài khoản riêng." |
| |
| #: ../../../developer/technical-overview.md:84 |
| msgid "" |
| "Currently transmitted over the DHT network when device is created or " |
| "revoked." |
| msgstr "Hiện nay được truyền qua mạng DHT khi thiết bị được tạo hoặc hủy bỏ." |
| |
| #: ../../../developer/technical-overview.md:86 |
| msgid "It's a JSON compressed and encrypted file." |
| msgstr "Đó là một tệp JSON nén và mã hóa." |
| |
| #: ../../../developer/technical-overview.md:90 |
| msgid "The current format is (could change at any time):" |
| msgstr "Các định dạng hiện tại là (có thể thay đổi bất cứ lúc nào):" |
| |
| #: ../../../developer/technical-overview.md:103 |
| msgid "The JSON byte-stream is compressed using \\*gzip\\* algorithm." |
| msgstr "Nguồn byte JSON được nén bằng cách sử dụng thuật toán \\ * gzip \\ *." |
| |
| #: ../../../developer/technical-overview.md:107 |
| msgid "" |
| "Then the gzip-stream is encrypted using AES-GCM-256 symmetric cipher with a " |
| "256-bits key." |
| msgstr "" |
| "Sau đó, dòng gzip được mã hóa bằng cách sử dụng mã hóa đối xứng AES-GCM-256 " |
| "với khóa 256 bit." |
| |
| #: ../../../developer/technical-overview.md:109 |
| msgid "" |
| "This key is derived from the user provided password, a PIN and a timestamp, " |
| "using [Argon2](https://github.com/P-H-C/phc-winner-argon2) (a password " |
| "stretching and normalizer) as follow:" |
| msgstr "" |
| "Chìa khóa này được lấy từ mật khẩu, mã PIN và dấu thời gian được cung cấp " |
| "bởi người dùng, sử dụng [Argon2](https://github.com/P-H-C/phc-winner-argon2)" |
| " (một mã mở rộng mật khẩu và bình thường) như sau:" |
| |
| #: ../../../developer/technical-overview.md:124 |
| msgid "" |
| "The PIN should be shown to the user to be copied manually on the new " |
| "physical device along with the password to finish the device creation " |
| "process." |
| msgstr "" |
| "PIN nên được hiển thị cho người dùng để sao chép bằng tay trên thiết bị vật " |
| "lý mới cùng với mật khẩu để hoàn thành quá trình tạo thiết bị." |
| |
| #: ../../../developer/technical-overview.md:127 |
| msgid "" |
| "NOTE: when exporting a file on the DHT or anywhere else, the daemon update " |
| "the archive first, to write latest contacts. This is the reason why the " |
| "password is needed when exporting (it's not just a copy of the archive " |
| "somewhere else)" |
| msgstr "" |
| "Lưu ý: khi xuất khẩu một tập tin trên DHT hoặc bất cứ nơi nào khác, con quái" |
| " vật sẽ cập nhật lưu trữ trước tiên, để viết các liên lạc mới nhất. Đây là " |
| "lý do tại sao mật khẩu là cần thiết khi xuất khẩu (nó không chỉ là một bản " |
| "sao của lưu trữ ở nơi khác)" |
| |
| #: ../../../developer/technical-overview.md:129 |
| msgid "Jami device certificate chain (ring\\_device.crt)" |
| msgstr "Dòng chứng nhận thiết bị Jami (ring\\_device.crt)" |
| |
| #: ../../../developer/technical-overview.md:131 |
| #: ../../../developer/technical-overview.md:137 |
| msgid "PEM format" |
| msgstr "Phương thức PEM" |
| |
| #: ../../../developer/technical-overview.md:132 |
| msgid "" |
| "Includes the Device certificate and parent certificates (Jami device " |
| "certificate and parents)" |
| msgstr "" |
| "Bao gồm chứng chỉ thiết bị và chứng chỉ phụ huynh ( chứng chỉ thiết bị Jami " |
| "và phụ huynh)" |
| |
| #: ../../../developer/technical-overview.md:135 |
| msgid "Device private key (ring\\_device.key)" |
| msgstr "Chìa khóa riêng của thiết bị (ring\\_device.key)" |
| |
| #: ../../../developer/technical-overview.md:138 |
| msgid "not encrypted, we let the device file-system protect this file" |
| msgstr "" |
| "Không được mã hóa, chúng tôi để thiết bị hệ thống tập tin bảo vệ tập tin này" |
| |
| #: ../../../developer/technical-overview.md:140 |
| msgid "The DHT network" |
| msgstr "Mạng lưới DHT" |
| |
| #: ../../../developer/technical-overview.md:142 |
| msgid "" |
| "Dedicated [ Jami distributed network](Ring_distributed_network \"wikilink\")" |
| " page." |
| msgstr "" |
| "Dedicated [Jami phân phối mạng]Ring_distributed_network \"wikilink\") trang." |
| |
| #: ../../../developer/technical-overview.md:145 |
| msgid "Contact Request" |
| msgstr "Yêu cầu liên lạc" |
| |
| #: ../../../developer/technical-overview.md:147 |
| msgid "Deprecated in favor of \"Conversation requests\"" |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:149 |
| msgid "Conversation request" |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:151 |
| msgid "Max 64k (a DHT value)" |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:152 |
| msgid "Contains a conversation Id" |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:153 |
| msgid "Contains the sender URI" |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:154 |
| msgid "Can contains optional metadatas (avatar/profile)" |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:156 |
| msgid "Instant Message" |
| msgstr "Thông điệp tức thời" |
| |
| #: ../../../developer/technical-overview.md:158 |
| msgid "Mostly used to initiate connections with ICE candidates" |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:159 |
| msgid "Can transmit some SIP messages, however SIP channel is preferred" |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:160 |
| msgid "" |
| "SIP messages can be read status, location sharing, messages notifications." |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:162 |
| msgid "Outgoing and Incoming calls" |
| msgstr "Các cuộc gọi ra và ra" |
| |
| #: ../../../developer/technical-overview.md:164 |
| msgid "" |
| "Contactable addresses (i.e. IP addresses) of the user are given to peer " |
| "only:" |
| msgstr "" |
| "Các địa chỉ liên lạc (tức là địa chỉ IP) của người dùng chỉ được cung cấp " |
| "cho người ngang hàng:" |
| |
| #: ../../../developer/technical-overview.md:166 |
| msgid "When we call a peer (outgoing call)." |
| msgstr "Khi chúng ta gọi một người đồng nghiệp (đồng tiếng)." |
| |
| #: ../../../developer/technical-overview.md:167 |
| msgid "When a **trusted** peer is calling (incoming call)." |
| msgstr "Khi một ** tin tưởng ** đồng nghiệp đang gọi (câu lạc đang đến)." |
| |
| #: ../../../developer/technical-overview.md:168 |
| msgid "" |
| "All combination forms of how a specific device can be contacted is " |
| "summarized by a ICE message:" |
| msgstr "" |
| "Tất cả các hình thức kết hợp về cách liên lạc với một thiết bị cụ thể được " |
| "tóm tắt bằng một thông điệp ICE:" |
| |
| #: ../../../developer/technical-overview.md:170 |
| msgid "" |
| "*[RFC 5245](https://tools.ietf.org/html/rfc5245)* defines ICE (Interactive " |
| "Connectivity Establishment), a protocol for NAT traversal." |
| msgstr "" |
| "*[RFC 5245](https://tools.ietf.org/html/rfc5245) * xác định ICE (Interactive" |
| " Connectivity Establishment), một giao thức cho việc đi qua NAT." |
| |
| #: ../../../developer/technical-overview.md:176 |
| msgid "Making an outgoing call" |
| msgstr "Làm một cuộc gọi ra ngoài" |
| |
| #: ../../../developer/technical-overview.md:178 |
| msgid "" |
| "The calling device gathers candidates and build an **Initial Offer** " |
| "according to the ICE specifications." |
| msgstr "" |
| "Thiết bị gọi thu thập ứng cử viên và xây dựng ** Đề xuất ban đầu** theo các " |
| "thông số kỹ thuật của ICE." |
| |
| #: ../../../developer/technical-overview.md:180 |
| msgid "" |
| "The calling device puts the encrypted ICE offer (the *Initial Offer*) on the" |
| " DHT at: `h(\"`[`callto:\"+DeviceID`](callto:%22+DeviceID)`)` where *h* is " |
| "SHA1, *+* is the string concatenation, *DeviceID* is in hexadecimal form." |
| msgstr "" |
| "Thiết bị gọi đặt lời đề nghị ICE mã hóa (the *Initial Offer*) trên DHT tại: " |
| "`h(\"`[callto:\"+DeviceID`](callto:%22+DeviceID)`)` nơi *h* là SHA1, *+* là " |
| "chuỗi kết nối, *DeviceID* là hình dạng sáu thập kỷ." |
| |
| #: ../../../developer/technical-overview.md:185 |
| msgid "" |
| "The calling device waits on the peer answer, with its own ICE candidates " |
| "lists." |
| msgstr "" |
| "Máy gọi chờ đợi câu trả lời của người đồng nghiệp, với danh sách ứng cử viên" |
| " ICE của riêng nó." |
| |
| #: ../../../developer/technical-overview.md:187 |
| msgid "" |
| "At peer answer reception, the calling device starts the ICE negotiation." |
| msgstr "" |
| "Tại phòng nhận câu trả lời của người đồng nghiệp, thiết bị gọi bắt đầu đàm " |
| "phán ICE." |
| |
| #: ../../../developer/technical-overview.md:189 |
| msgid "" |
| "If the negotiation succeed, the process continues on a client-side DTLS " |
| "session establishment over the created ICE socket (see below)." |
| msgstr "" |
| "Nếu đàm phán thành công, quá trình tiếp tục trên một cơ sở phiên DTLS bên " |
| "khách hàng trên ổ ICE được tạo ra (xem bên dưới)." |
| |
| #: ../../../developer/technical-overview.md:192 |
| msgid "Listening for incoming calls" |
| msgstr "Nghe các cuộc gọi tiếp theo" |
| |
| #: ../../../developer/technical-overview.md:194 |
| msgid "" |
| "A device listens for incoming calls by performing a listen OpenDHT operation" |
| " on `h(\"`[`callto:\"+DeviceID`](callto:%22+DeviceID)`)` where *h* is SHA1, " |
| "*+* is the string concatenation and *DeviceID* is in hexadecimal form." |
| msgstr "" |
| "Một thiết bị nghe cho các cuộc gọi tiếp nhận bằng cách thực hiện một hoạt " |
| "động OpenDHT nghe trên `h(\"`[`callto:\"+DeviceID`](callto:%22+DeviceID)`)` " |
| "nơi *h* là SHA1, *+* là chuỗi kết nối và *DeviceID* có hình dạng sáu thập " |
| "kỷ." |
| |
| #: ../../../developer/technical-overview.md:198 |
| msgid "" |
| "At ICE *Initial Offer* reception, the called device **must** do a security " |
| "validation of the peer (see below)." |
| msgstr "" |
| "Tại phòng tiếp nhận ICE *Thiết xuất ban đầu*, thiết bị gọi ** phải** thực " |
| "hiện xác thực bảo mật của đồng nghiệp (xem dưới đây)." |
| |
| #: ../../../developer/technical-overview.md:200 |
| msgid "" |
| "If the security validation succeed, the called device starts the ICE " |
| "negotiation." |
| msgstr "Nếu xác nhận an ninh thành công, thiết bị gọi bắt đầu đàm phán ICE." |
| |
| #: ../../../developer/technical-overview.md:202 |
| msgid "" |
| "If the negotiation succeed, the process continues on a server-side DTLS " |
| "session establishment over the created ICE socket (see below)." |
| msgstr "" |
| "Nếu đàm phán thành công, quá trình tiếp tục trên một thiết lập phiên DTLS " |
| "bên máy chủ trên ổ ICE được tạo ra (xem dưới đây)." |
| |
| #: ../../../developer/technical-overview.md:205 |
| msgid "" |
| "*Note: OpenDHT drops values that are not properly encrypted or signed, as " |
| "specified by OpenDHT protocol.*" |
| msgstr "" |
| "*Lưu ý: OpenDHT giảm các giá trị không được mã hóa hoặc ký hiệu đúng cách, " |
| "theo quy định của giao thức OpenDHT.*" |
| |
| #: ../../../developer/technical-overview.md:208 |
| msgid "ICE serialization format" |
| msgstr "Phương thức phân tích hàng loạt ICE" |
| |
| #: ../../../developer/technical-overview.md:210 |
| msgid "" |
| "ICE messages exchanged between peers during a call set up use following " |
| "format." |
| msgstr "" |
| "Các tin nhắn ICE được trao đổi giữa các bạn đồng nghiệp trong một cuộc gọi " |
| "thiết lập sử dụng theo định dạng sau." |
| |
| #: ../../../developer/technical-overview.md:212 |
| msgid "" |
| "An ICE message is a chunk of binary data, following " |
| "[msgpack](http://msgpack.org/) data format." |
| msgstr "" |
| "Thông điệp ICE là một khối dữ liệu nhị phân, theo định dạng dữ liệu " |
| "[msgpack](http://msgpack.org/)." |
| |
| #: ../../../developer/technical-overview.md:222 |
| msgid "**Current defined protocol is 1**:" |
| msgstr "**Nói định hiện tại là 1**:" |
| |
| #: ../../../developer/technical-overview.md:224 |
| msgid "Security Validation of the Peer" |
| msgstr "Sự xác nhận an ninh của người đồng nghiệp" |
| |
| #: ../../../developer/technical-overview.md:226 |
| msgid "" |
| "Upon reception of the encrypted and signed Initial ICE Offer (through the " |
| "listen operation), a called device should perform authorization checks of " |
| "the calling device, identified as the Initial Offer signer." |
| msgstr "" |
| "Khi nhận được Thỏa thuận ICE ban đầu được mã hóa và ký (thông qua hoạt động " |
| "nghe), một thiết bị gọi phải thực hiện kiểm tra ủy quyền của thiết bị gọi, " |
| "được xác định là người ký Thỏa thuận ban đầu." |
| |
| #: ../../../developer/technical-overview.md:230 |
| msgid "" |
| "Authorization rules are implementation defined, but a typical implementation" |
| " would authorize known or trusted contacts." |
| msgstr "" |
| "Các quy tắc ủy quyền được xác định thực hiện, nhưng một thực hiện điển hình " |
| "sẽ ủy quyền cho các liên lạc được biết hoặc tin cậy." |
| |
| #: ../../../developer/technical-overview.md:243 |
| msgid "" |
| "Once a peer-to-peer communication channel has been established by ICE " |
| "protocol, the called device starts a server-side DTLS session on the ICE " |
| "socket, while the caller starts a client-side DTLS session on the other side" |
| " of the ICE socket." |
| msgstr "" |
| "Một khi một kênh truyền thông ngang hàng đã được thiết lập bởi giao thức " |
| "ICE, thiết bị được gọi bắt đầu một phiên DTLS bên máy chủ trên ổ ICE, trong " |
| "khi người gọi bắt đầu một phiên DTLS bên khách hàng ở phía bên kia của ổ " |
| "ICE." |
| |
| #: ../../../developer/technical-overview.md:247 |
| msgid "" |
| "The DTLS communication is [RFC6347](https://tools.ietf.org/html/rfc6347) " |
| "compliant using gnutls library." |
| msgstr "" |
| "Truyền thông DTLS là [RFC6347](https://tools.ietf.org/html/rfc6347) phù hợp " |
| "sử dụng thư viện gnutls." |
| |
| #: ../../../developer/technical-overview.md:250 |
| msgid "" |
| "To prevent peer certificates to be displayed in plain-text for the call " |
| "anonymity, the session handshake is done twice:" |
| msgstr "" |
| "Để ngăn chặn các chứng chỉ đối tác được hiển thị bằng văn bản đơn để ẩn danh" |
| " cuộc gọi, việc nắm tay phiên được thực hiện hai lần:" |
| |
| #: ../../../developer/technical-overview.md:253 |
| msgid "" |
| "A first handshake in **anonymous mode** to create a secure but anonymous " |
| "transport." |
| msgstr "" |
| "Một cú tay đầu tiên trong chế độ ẩn danh để tạo ra một vận chuyển an toàn " |
| "nhưng ẩn danh." |
| |
| #: ../../../developer/technical-overview.md:255 |
| msgid "" |
| "A second handshake in **certificate mode**, over the first one, to prove the" |
| " identity of peers." |
| msgstr "" |
| "Một cú tay thứ hai trong chế độ chứng chỉ, thay vì lần đầu tiên, để chứng " |
| "minh danh tính của người đồng nghiệp." |
| |
| #: ../../../developer/technical-overview.md:258 |
| msgid "Only PFS cipher suites are supported:" |
| msgstr "Chỉ có các bộ mã hóa PFS được hỗ trợ:" |
| |
| #: ../../../developer/technical-overview.md:259 |
| msgid "" |
| "The set of supported cipher suites is implementation defined but should " |
| "include at least ECDHE-AES-GCM." |
| msgstr "" |
| "Bộ bộ mã được hỗ trợ được xác định thực hiện nhưng nên bao gồm ít nhất " |
| "ECDHE-AES-GCM." |
| |
| #: ../../../developer/technical-overview.md:261 |
| msgid "The actual cipher suites (in gnutls form) is:" |
| msgstr "Các bộ mã hóa thực tế (trong dạng gnutls) là:" |
| |
| #: ../../../developer/technical-overview.md:262 |
| msgid "" |
| "anonymous step: `SECURE192:-KX-ALL:+ANON-ECDH:+ANON-DH:+SECURE192:-VERS-TLS-" |
| "ALL:+VERS-DTLS-ALL:-RSA:%SERVER_PRECEDENCE:%SAFE_RENEGOTIATION`" |
| msgstr "" |
| "bước ẩn danh: `SECURE192:-KX-ALL:+ANON-ECDH:+ANON-DH:+SECURE192:-VERS-TLS-" |
| "ALL:+VERS-DTLS-ALL:-RSA:%SERVER_PRECEDENCE:%SAFE_RENEGOTIATION`" |
| |
| #: ../../../developer/technical-overview.md:264 |
| msgid "" |
| "certificate step: `SECURE192:-VERS-TLS-ALL:+VERS-DTLS-" |
| "ALL:-RSA:%SERVER_PRECEDENCE:%SAFE_RENEGOTIATION`" |
| msgstr "" |
| "bước chứng nhận: `SECURE192:-VERS-TLS-ALL: +VERS-DTLS-" |
| "ALL:-RSA:%SERVER_PRECEDENCE:%SAFE_RENEGOTIATION" |
| |
| #: ../../../developer/technical-overview.md:267 |
| msgid "SIP signaling" |
| msgstr "SIP tín hiệu" |
| |
| #: ../../../developer/technical-overview.md:269 |
| msgid "" |
| "Used over the DTLS session to signaling the call (vcard, media negotiation, " |
| "hangup, instant messaging, ...)" |
| msgstr "" |
| "Được sử dụng qua phiên DTLS để báo hiệu cuộc gọi (vcard, đàm phán truyền " |
| "thông, hangup, nhắn tin tức thời,...)" |
| |
| #: ../../../developer/technical-overview.md:271 |
| msgid "" |
| "Once an encrypted and authenticated peer-to-peer communication channel is " |
| "available, the [SIP protocol](https://tools.ietf.org/html/rfc3261) must be " |
| "used to place a call and send messages." |
| msgstr "" |
| "Một khi một kênh truyền thông ngang hàng được mã hóa và xác thực có sẵn, " |
| "[SIP protocol](https://tools.ietf.org/html/rfc3261) phải được sử dụng để " |
| "thực hiện cuộc gọi và gửi tin nhắn." |
| |
| #: ../../../developer/technical-overview.md:275 |
| msgid "" |
| "The caller might send a SIP INVITE as soon as the DTLS channel is " |
| "established." |
| msgstr "Người gọi có thể gửi SIP INVITE ngay khi kênh DTLS được thiết lập." |
| |
| #: ../../../developer/technical-overview.md:284 |
| msgid "Presence" |
| msgstr "Sự hiện diện" |
| |
| #: ../../../developer/technical-overview.md:286 |
| msgid "Sent on the DHT" |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:287 |
| msgid "DeviceAnnouncement (contains device hash + public key)" |
| msgstr "" |
| |
| #: ../../../developer/technical-overview.md:290 |
| msgid "Security / Privacy" |
| msgstr "An ninh / Bảo mật" |
| |
| #: ../../../developer/technical-overview.md:292 |
| msgid "" |
| "Jami provides perfect forward secrecy for calls and in call text messages " |
| "with different Eliptic Curve Diffie-Hellman key negociation at every call. " |
| "For out of call messaging single RSA-4096 is used. The cryptography library " |
| "used is GNUTLS" |
| msgstr "" |
| "Jami cung cấp sự bí mật chuyển tiếp hoàn hảo cho các cuộc gọi và trong tin " |
| "nhắn văn bản cuộc gọi với các giao dịch phím Diffie-Hellman khác nhau ở mỗi " |
| "cuộc gọi." |
| |
| #: ../../../developer/technical-overview.md:297 |
| msgid "More informations:" |
| msgstr "Thông tin thêm:" |
| |
| #: ../../../developer/technical-overview.md:299 |
| msgid "" |
| "[Technical overview](technical/Technical-overview) of concepts and protocols" |
| " inside Jami" |
| msgstr "" |
| "[Tình tổng quan kỹ thuật](Tình tổng quan kỹ thuật) của các khái niệm và giao" |
| " thức bên trong Jami" |
| |
| #: ../../../developer/working-with-gerrit.md:1 |
| msgid "Working with Gerrit" |
| msgstr "Làm việc với Gerrit" |
| |
| #: ../../../developer/working-with-gerrit.md:4 |
| msgid "Account Setup" |
| msgstr "Thiết lập tài khoản" |
| |
| #: ../../../developer/working-with-gerrit.md:6 |
| msgid "Gerrit server: <https://review.jami.net>" |
| msgstr "Gerrit server: <https://review.jami.net>" |
| |
| #: ../../../developer/working-with-gerrit.md:7 |
| msgid "" |
| "User documentation: <https://review.jami.net/Documentation/intro-user.html>" |
| msgstr "" |
| "Tài liệu người dùng: <https://review.jami.net/Documentation/intro-user.html>" |
| |
| #: ../../../developer/working-with-gerrit.md:8 |
| msgid "Jami projects on Gerrit: <https://review.jami.net/admin/repos/>" |
| msgstr "Các dự án Jami trên Gerrit: <https://review.jami.net/admin/repos/>" |
| |
| #: ../../../developer/working-with-gerrit.md:10 |
| msgid "Sign-in with your google or github account or git.jami.net account" |
| msgstr "Đăng nhập với tài khoản google hoặc github hoặc git.jami.net của bạn" |
| |
| #: ../../../developer/working-with-gerrit.md:11 |
| msgid "" |
| "You'll also need to [upload an SSH " |
| "key](https://review.jami.net/settings/#SSHKeys) to be able to commit changes" |
| " for review." |
| msgstr "" |
| "Bạn cũng cần phải [upload một khóa " |
| "SSH]https://review.jami.net/settings/#SSHKeys) để có thể thực hiện thay đổi " |
| "để xem xét." |
| |
| #: ../../../developer/working-with-gerrit.md:12 |
| msgid "Don't forget to select a username." |
| msgstr "Đừng quên chọn tên người dùng." |
| |
| #: ../../../developer/working-with-gerrit.md:13 |
| msgid "" |
| "Finally, the email address specified in your git config must match one the " |
| "email address registered with your Gerrit account." |
| msgstr "" |
| "Cuối cùng, địa chỉ email được chỉ định trong cấu hình git của bạn phải phù " |
| "hợp với địa chỉ email được đăng ký với tài khoản Gerrit của bạn." |
| |
| #: ../../../developer/working-with-gerrit.md:15 |
| msgid "" |
| "*Note for Savoir-faire Linux employees: please continue to use your " |
| "@savoirfairelinux.com email address.*" |
| msgstr "" |
| "*Lưu ý cho nhân viên Savoir-faire Linux: xin vui lòng tiếp tục sử dụng địa " |
| "chỉ email @savoirfairelinux.com của bạn.*" |
| |
| #: ../../../developer/working-with-gerrit.md:17 |
| msgid "To Know your Git Config" |
| msgstr "Để biết cấu hình Git của bạn" |
| |
| #: ../../../developer/working-with-gerrit.md:19 |
| msgid "`git config --list`" |
| msgstr "`git config --list`" |
| |
| #: ../../../developer/working-with-gerrit.md:21 |
| msgid "To Test your SSH Access" |
| msgstr "Để kiểm tra truy cập SSH của bạn" |
| |
| #: ../../../developer/working-with-gerrit.md:23 |
| msgid "" |
| "To check that your SSH access is properly setup, run the following command:" |
| msgstr "" |
| "Để kiểm tra rằng truy cập SSH của bạn được thiết lập đúng cách, chạy lệnh " |
| "sau:" |
| |
| #: ../../../developer/working-with-gerrit.md:25 |
| msgid "`ssh -p 29420 <username>@review.jami.net`" |
| msgstr "`ssh -p 29420 <username>@review.jami.net`" |
| |
| #: ../../../developer/working-with-gerrit.md:27 |
| msgid "" |
| "<username> is your Gerrit username, that you should have set during the " |
| "account creation. If not, you can do that here." |
| msgstr "" |
| "<username> là tên người dùng Gerrit của bạn, mà bạn nên đặt trong quá trình " |
| "tạo tài khoản. Nếu không, bạn có thể làm điều đó ở đây." |
| |
| #: ../../../developer/working-with-gerrit.md:44 |
| msgid "Git Configuration" |
| msgstr "Sửa đổi Git" |
| |
| #: ../../../developer/working-with-gerrit.md:46 |
| msgid "Gerrit is the official git repository." |
| msgstr "Gerrit là kho lưu trữ Git chính thức." |
| |
| #: ../../../developer/working-with-gerrit.md:48 |
| msgid "To update the configuration" |
| msgstr "Để cập nhật cấu hình" |
| |
| #: ../../../developer/working-with-gerrit.md:50 |
| msgid "" |
| "You must update your remote information to use now the Gerrit repository. To" |
| " do that, update your origin url:" |
| msgstr "" |
| "Bạn phải cập nhật thông tin từ xa của bạn để sử dụng kho lưu trữ Gerrit. Để " |
| "làm điều đó, cập nhật URL nguồn gốc của bạn:" |
| |
| #: ../../../developer/working-with-gerrit.md:52 |
| msgid "" |
| "`git remote set-url origin " |
| "ssh://<username>@review.jami.net:29420/<project_name>`" |
| msgstr "" |
| "`git từ xa đặt url nguồn gốc " |
| "ssh://<username>@review.jami.net:29420/<project_name>`" |
| |
| #: ../../../developer/working-with-gerrit.md:54 |
| msgid "Replace `<project_name>` by the correct project (example: jami-daemon)" |
| msgstr "Thay thế `<project_name>` bằng đúng dự án (ví dụ: jami-daemon)" |
| |
| #: ../../../developer/working-with-gerrit.md:56 |
| msgid "Or clone the existing repository if you want to start fresh." |
| msgstr "Hoặc sao chép kho lưu trữ hiện có nếu bạn muốn bắt đầu từ đầu." |
| |
| #: ../../../developer/working-with-gerrit.md:58 |
| msgid "To Push by Default in refs/for/master" |
| msgstr "To Push by Default in ref/for/master" |
| |
| #: ../../../developer/working-with-gerrit.md:60 |
| msgid "" |
| "You can configure git to automatically create a review when a change is " |
| "pushed." |
| msgstr "" |
| "Bạn có thể cấu hình git để tự động tạo một đánh giá khi thay đổi được đẩy." |
| |
| #: ../../../developer/working-with-gerrit.md:62 |
| msgid "`git config remote.origin.push HEAD:refs/for/master`" |
| msgstr "`git config remote.origin.push HEAD:refs/for/master`" |
| |
| #: ../../../developer/working-with-gerrit.md:64 |
| msgid "To Create the Review" |
| msgstr "Để tạo ra bài xem xét" |
| |
| #: ../../../developer/working-with-gerrit.md:66 |
| msgid "" |
| "When pushing to this magic branch, a review will automatically be created on" |
| " Gerrit." |
| msgstr "" |
| "Khi đẩy sang chi nhánh ma thuật này, một đánh giá sẽ tự động được tạo ra về " |
| "Gerrit." |
| |
| #: ../../../developer/working-with-gerrit.md:68 |
| msgid "`git push origin HEAD:refs/for/master`" |
| msgstr "`git đẩy nguồn gốc HEAD:refs/for/master`" |
| |
| #: ../../../developer/working-with-gerrit.md:70 |
| msgid "" |
| "If you configured the default to refs/for/master as described above, simply" |
| msgstr "" |
| "Nếu bạn đã cấu hình mặc định để refs/for/master như đã mô tả ở trên, chỉ cần" |
| |
| #: ../../../developer/working-with-gerrit.md:72 |
| msgid "`git push`" |
| msgstr "`git đẩy `" |
| |
| #: ../../../developer/working-with-gerrit.md:74 |
| msgid "" |
| "If HEAD currently points to the branch with the commits you'd like to push. " |
| "Ideally, you should work in a feature/bug branch for the issue at hand. Then" |
| " you can do:" |
| msgstr "" |
| "Nếu HEAD hiện đang chỉ ra chi nhánh với các commit bạn muốn đẩy. lý tưởng " |
| "nhất, bạn nên làm việc trong một feature / bug branch cho vấn đề đang xảy " |
| "ra." |
| |
| #: ../../../developer/working-with-gerrit.md:76 |
| msgid "`git push origin <bugfix_branchname>:refs/for/master`" |
| msgstr "`git nguồn gốc <bugfix_branchname>:refs/for/master`" |
| |
| #: ../../../developer/working-with-gerrit.md:78 |
| msgid "" |
| "If this is the first time you've pushed, you will be prompted to install a " |
| "post-commit Hook to insert a Change-ID in your commit message. Gerrit needs " |
| "this to track patchsets and will reject pushes until you install it. Simply " |
| "copy paste the command to install the hook as instructed by Gerrit, and " |
| "amend your commits." |
| msgstr "" |
| "Nếu đây là lần đầu tiên bạn nhấn, bạn sẽ được yêu cầu cài đặt Hook sau khi " |
| "commit để chèn một Change-ID trong thông điệp commit của bạn. Gerrit cần " |
| "điều này để theo dõi các bộ vá và sẽ từ chối nhấn cho đến khi bạn cài đặt " |
| "nó. Chỉ cần sao chép dán lệnh để cài đặt hook theo hướng dẫn của Gerrit, và " |
| "sửa đổi các commit của bạn." |
| |
| #: ../../../developer/working-with-gerrit.md:80 |
| msgid "To Push a Private patch" |
| msgstr "Để đẩy một bản vá riêng" |
| |
| #: ../../../developer/working-with-gerrit.md:82 |
| msgid "" |
| "You can push a work in progress (a.k.a draft) by pushing to " |
| "refs/for/master%private" |
| msgstr "" |
| "Bạn có thể đẩy một công việc đang được tiến hành (tên gọi là dự thảo) bằng " |
| "cách đẩy đến refs/for/master%private" |
| |
| #: ../../../developer/working-with-gerrit.md:84 |
| msgid "" |
| "For instance, you may want a \"private\" remote to push to; open " |
| "<project_dir>/.git/config and add:" |
| msgstr "" |
| "Ví dụ, bạn có thể muốn một bộ điều khiển từ xa \"tự do\" để nhấn vào; mở " |
| "<project_dir>/.git/config và thêm:" |
| |
| #: ../../../developer/working-with-gerrit.md:93 |
| msgid "Then:" |
| msgstr "Sau đó:" |
| |
| #: ../../../developer/working-with-gerrit.md:95 |
| msgid "`git push private`" |
| msgstr "`git đẩy riêng `" |
| |
| #: ../../../developer/working-with-gerrit.md:97 |
| msgid "" |
| "Private work the same way as patchsets, except they are not visible to " |
| "others by default and don't trigger any Jenkins builds. A draft can then be " |
| "shared or published." |
| msgstr "" |
| "Công việc riêng cũng giống như các bộ vá, ngoại trừ chúng không hiển thị cho" |
| " người khác theo mặc định và không kích hoạt bất kỳ cấu trúc nào của " |
| "Jenkins." |