blob: c5a205116f012dc3a28a4284e1a234e5ecee01e6 [file] [log] [blame]
# 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 &lt; 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 &lt; 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."