diff --git a/src/i18n.min/zh-TW.json b/src/i18n.min/zh-TW.json index 70aa369a..40689c81 100644 --- a/src/i18n.min/zh-TW.json +++ b/src/i18n.min/zh-TW.json @@ -1 +1 @@ -{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話\n¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 ''{query}'' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人","label_user_id":"ID:","label_wire_transport":"線路傳輸:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"已發送一封帶有安全代碼的電子郵件。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"斷開連接","label_use_secure_connection":"使用安全連接","cred_confirmed_successfully":"確認成功","menu_item_edit":"編輯","editing_message":"編輯","message_edited_marker":",編輯","icon_title_add_image":"添加圖片","icon_title_attach_file":"附加文件","icon_title_delete":"刪除錄音","icon_title_pause":"暫停播放","icon_title_play":"播放錄音","icon_title_record_voice":"錄製語音消息","icon_title_resume":"恢復播放","icon_title_send":"發信息","drag_file":"將文件拖到這裡","drafty_video":"視頻錄製","call_in_progress":"通話中","menu_item_audio_call":"稱呼","unrecognized_video_format":"無法識別此視頻的格式","loading_note":"加載中...","password_i_have_code":"我有代碼","label_reset_password_tel":"發送短信重置密碼","mobile_phone_number":"手機號碼","password_reset_sms_sent":"已發送帶有安全代碼的短信。","mobile_number_required":"需要手機號","current_email":"當前郵箱","current_phone":"當前電話號碼","new_email":"新電子郵件地址","new_phone_number":"新電話號碼","change_email":"更改郵箱","change_phone":"更改電話號碼","call_busy":"忙碌的","pin_message":"置頂消息","unpin_message":"取消置頂消息","failed_to_init_audio":"初始化錄音失敗","password_reset_success":"密碼重置成功","scan_qr_code":"掃描二維碼","self_topic_comment":"為後代所儲存的註解、訊息、連結、檔案","self_topic_name":"已儲存的訊息","message_not_found":"未找到訊息","message_deleted":"訊息已刪除","alias_editing_placeholder":"別名(可選)","label_alias":"別名:","alias_already_taken":"(已採取)","alias_invalid":"(無效)","label_alias_edit":"別名","select_country":"選擇國家","text_copied":"已複製到剪貼簿","color_schema_dark":"深色","color_schema_light":"淺色","color_schema_system":"系統預設","label_color_schema":"主題:","label_text_size":"文字大小:","incognito_mode_description":"隱藏您的線上狀態和正在輸入指示器。","send_command":"按 {key} 傳送","send_command_explained":"按 Enter 換行","send_plain":"按 Enter 傳送","send_plain_explained":"按 Shift + Enter 換行","sidepanel_title_acc_general":"一般","label_keyboard":"鍵盤:","pin_chat":"置頂","unpin_chat":"取消置頂","subscriber_count":"{count, plural, other {{count, number} 位訂閱者}}","label_member_count":"成員:","label_subscriber_count":"訂閱者:","member_count":"{count, plural, other {{count, number} 位成員}}","tabtitle_image":"圖片","tabtitle_pattern":"圖案","button_restore":"恢復預設","wallpapers":"桌布","label_blur_wallpaper":"模糊:","label_scan_id":"掃描我的 ID:","unknown_name":"未知","save_action":"儲存","cannot_parse_vcard":"無法解析 vCard 檔案。","chat_now":"聊天","find_user":"尋找","label_contact_card":"聯絡人卡片","label_contacts":"聯絡人","add_members_prompt":"新增成員"} \ No newline at end of file +{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話\n¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 ''{query}'' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人","label_user_id":"ID:","label_wire_transport":"線路傳輸:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"已發送一封帶有安全代碼的電子郵件。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"斷開連接","label_use_secure_connection":"使用安全連接","cred_confirmed_successfully":"確認成功","menu_item_edit":"編輯","editing_message":"編輯","message_edited_marker":",編輯","icon_title_add_image":"添加圖片","icon_title_attach_file":"附加文件","icon_title_delete":"刪除錄音","icon_title_pause":"暫停播放","icon_title_play":"播放錄音","icon_title_record_voice":"錄製語音消息","icon_title_resume":"恢復播放","icon_title_send":"發信息","drag_file":"將文件拖到這裡","drafty_video":"視頻錄製","call_in_progress":"通話中","menu_item_audio_call":"語音電話","unrecognized_video_format":"無法識別此視頻的格式","loading_note":"加載中...","password_i_have_code":"我有代碼","label_reset_password_tel":"發送短信重置密碼","mobile_phone_number":"手機號碼","password_reset_sms_sent":"已發送帶有安全代碼的短信。","mobile_number_required":"需要手機號","current_email":"當前郵箱","current_phone":"當前電話號碼","new_email":"新電子郵件地址","new_phone_number":"新電話號碼","change_email":"更改郵箱","change_phone":"更改電話號碼","call_busy":"忙碌的","pin_message":"置頂消息","unpin_message":"取消置頂消息","failed_to_init_audio":"初始化錄音失敗","password_reset_success":"密碼重置成功","scan_qr_code":"掃描二維碼","self_topic_comment":"為後代所儲存的註解、訊息、連結、檔案","self_topic_name":"已儲存的訊息","message_not_found":"未找到訊息","message_deleted":"訊息已刪除","alias_editing_placeholder":"別名(可選)","label_alias":"別名:","alias_already_taken":"(已採取)","alias_invalid":"(無效)","label_alias_edit":"別名","select_country":"選擇國家","text_copied":"已複製到剪貼簿","color_schema_dark":"深色","color_schema_light":"淺色","color_schema_system":"系統預設","label_color_schema":"主題:","label_text_size":"文字大小:","incognito_mode_description":"隱藏您的線上狀態和正在輸入指示器。","send_command":"按 {key} 傳送","send_command_explained":"按 Enter 換行","send_plain":"按 Enter 傳送","send_plain_explained":"按 Shift + Enter 換行","sidepanel_title_acc_general":"一般","label_keyboard":"鍵盤:","pin_chat":"置頂","unpin_chat":"取消置頂","subscriber_count":"{count, plural, other {{count, number} 位訂閱者}}","label_member_count":"成員:","label_subscriber_count":"訂閱者:","member_count":"{count, plural, other {{count, number} 位成員}}","tabtitle_image":"圖片","tabtitle_pattern":"圖案","button_restore":"恢復預設","wallpapers":"桌布","label_blur_wallpaper":"模糊:","label_scan_id":"掃描我的 ID:","unknown_name":"未知","save_action":"儲存","cannot_parse_vcard":"無法解析 vCard 檔案。","chat_now":"聊天","find_user":"尋找","label_contact_card":"聯絡人卡片","label_contacts":"聯絡人","add_members_prompt":"新增成員"} \ No newline at end of file diff --git a/src/i18n.min/zh.json b/src/i18n.min/zh.json index bd00f55e..a1011c12 100644 --- a/src/i18n.min/zh.json +++ b/src/i18n.min/zh.json @@ -1 +1 @@ -{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话\n¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配''{query}''","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"默认访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后在线:{timestamp}","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"对方已关闭消息。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索无结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"已发送一封带有安全代码的电子邮件。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"转发","forward_to":"转发给","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"断开连接","label_use_secure_connection":"使用安全连接","cred_confirmed_successfully":"确认成功","menu_item_edit":"编辑","editing_message":"编辑","message_edited_marker":",编辑","icon_title_add_image":"添加图片","icon_title_attach_file":"附加文件","icon_title_delete":"删除录音","icon_title_pause":"暂停播放","icon_title_play":"播放录音","icon_title_record_voice":"录制语音信息","icon_title_resume":"恢复播放","icon_title_send":"发送消息","drag_file":"将文件拖到这里","drafty_video":"视频录制","call_in_progress":"通话中","menu_item_audio_call":"称呼","unrecognized_video_format":"无法识别此视频的格式","loading_note":"加载中...","password_i_have_code":"我有代码","label_reset_password_tel":"发送短信重置密码","mobile_phone_number":"手机号","password_reset_sms_sent":"已发送带有安全代码的短信。","mobile_number_required":"需要手机号","current_email":"当前邮箱","current_phone":"当前电话号码","new_email":"新电子邮件地址","new_phone_number":"新电话号码","change_email":"更改邮箱","change_phone":"更改电话号码","call_busy":"忙碌的","pin_message":"置顶消息","unpin_message":"取消置顶消息","failed_to_init_audio":"初始化录音失败","password_reset_success":"密码重置成功","scan_qr_code":"扫描二维码","self_topic_comment":"为后人保存的注释、消息、链接、文件","self_topic_name":"已保存的消息","message_not_found":"未找到消息","message_deleted":"消息已删除","alias_editing_placeholder":"别名(可选)","label_alias":"别名:","alias_already_taken":"(已占用)","alias_invalid":"(无效)","label_alias_edit":"别名","select_country":"选择国家","text_copied":"已复制到剪贴板","color_schema_dark":"深色","color_schema_light":"浅色","color_schema_system":"系统默认","label_color_schema":"主题:","label_text_size":"文字大小:","incognito_mode_description":"隐藏您的在线状态和正在输入指示器。","send_command":"按 {key} 发送","send_command_explained":"按 Enter 换行","send_plain":"按 Enter 发送","send_plain_explained":"按 Shift + Enter 换行","sidepanel_title_acc_general":"常规","label_keyboard":"键盘:","pin_chat":"置顶","unpin_chat":"取消置顶","subscriber_count":"{count, plural, other {{count, number} 位订阅者}}","label_member_count":"成员:","label_subscriber_count":"订阅者:","member_count":"{count, plural, other {{count, number} 位成员}}","tabtitle_image":"图片","tabtitle_pattern":"图案","button_restore":"恢复默认","wallpapers":"壁纸","label_blur_wallpaper":"模糊:","label_scan_id":"扫描我的 ID:","unknown_name":"未知","save_action":"保存","cannot_parse_vcard":"无法解析 vCard 文件。","chat_now":"聊天","find_user":"查找","label_contact_card":"联系人卡片","label_contacts":"联系人","add_members_prompt":"添加成员"} \ No newline at end of file +{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话\n¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配''{query}''","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"默认访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后在线:{timestamp}","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"对方已关闭消息。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索无结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"已发送一封带有安全代码的电子邮件。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"转发","forward_to":"转发给","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"断开连接","label_use_secure_connection":"使用安全连接","cred_confirmed_successfully":"确认成功","menu_item_edit":"编辑","editing_message":"编辑","message_edited_marker":",编辑","icon_title_add_image":"添加图片","icon_title_attach_file":"附加文件","icon_title_delete":"删除录音","icon_title_pause":"暂停播放","icon_title_play":"播放录音","icon_title_record_voice":"录制语音信息","icon_title_resume":"恢复播放","icon_title_send":"发送消息","drag_file":"将文件拖到这里","drafty_video":"视频录制","call_in_progress":"通话中","menu_item_audio_call":"语音电话","unrecognized_video_format":"无法识别此视频的格式","loading_note":"加载中...","password_i_have_code":"我有代码","label_reset_password_tel":"发送短信重置密码","mobile_phone_number":"手机号","password_reset_sms_sent":"已发送带有安全代码的短信。","mobile_number_required":"需要手机号","current_email":"当前邮箱","current_phone":"当前电话号码","new_email":"新电子邮件地址","new_phone_number":"新电话号码","change_email":"更改邮箱","change_phone":"更改电话号码","call_busy":"忙碌的","pin_message":"置顶消息","unpin_message":"取消置顶消息","failed_to_init_audio":"初始化录音失败","password_reset_success":"密码重置成功","scan_qr_code":"扫描二维码","self_topic_comment":"为后人保存的注释、消息、链接、文件","self_topic_name":"已保存的消息","message_not_found":"未找到消息","message_deleted":"消息已删除","alias_editing_placeholder":"别名(可选)","label_alias":"别名:","alias_already_taken":"(已占用)","alias_invalid":"(无效)","label_alias_edit":"别名","select_country":"选择国家","text_copied":"已复制到剪贴板","color_schema_dark":"深色","color_schema_light":"浅色","color_schema_system":"系统默认","label_color_schema":"主题:","label_text_size":"文字大小:","incognito_mode_description":"隐藏您的在线状态和正在输入指示器。","send_command":"按 {key} 发送","send_command_explained":"按 Enter 换行","send_plain":"按 Enter 发送","send_plain_explained":"按 Shift + Enter 换行","sidepanel_title_acc_general":"常规","label_keyboard":"键盘:","pin_chat":"置顶","unpin_chat":"取消置顶","subscriber_count":"{count, plural, other {{count, number} 位订阅者}}","label_member_count":"成员:","label_subscriber_count":"订阅者:","member_count":"{count, plural, other {{count, number} 位成员}}","tabtitle_image":"图片","tabtitle_pattern":"图案","button_restore":"恢复默认","wallpapers":"壁纸","label_blur_wallpaper":"模糊:","label_scan_id":"扫描我的 ID:","unknown_name":"未知","save_action":"保存","cannot_parse_vcard":"无法解析 vCard 文件。","chat_now":"聊天","find_user":"查找","label_contact_card":"联系人卡片","label_contacts":"联系人","add_members_prompt":"添加成员"} \ No newline at end of file diff --git a/umd/src_i18n_min_zh-TW_json.dev.js b/umd/src_i18n_min_zh-TW_json.dev.js index fc316327..4f3cb451 100644 --- a/umd/src_i18n_min_zh-TW_json.dev.js +++ b/umd/src_i18n_min_zh-TW_json.dev.js @@ -7,7 +7,7 @@ \*********************************/ /***/ (function(module) { -module.exports = /*#__PURE__*/JSON.parse('{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話\\n¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 \'\'{query}\'\' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人","label_user_id":"ID:","label_wire_transport":"線路傳輸:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"已發送一封帶有安全代碼的電子郵件。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"斷開連接","label_use_secure_connection":"使用安全連接","cred_confirmed_successfully":"確認成功","menu_item_edit":"編輯","editing_message":"編輯","message_edited_marker":",編輯","icon_title_add_image":"添加圖片","icon_title_attach_file":"附加文件","icon_title_delete":"刪除錄音","icon_title_pause":"暫停播放","icon_title_play":"播放錄音","icon_title_record_voice":"錄製語音消息","icon_title_resume":"恢復播放","icon_title_send":"發信息","drag_file":"將文件拖到這裡","drafty_video":"視頻錄製","call_in_progress":"通話中","menu_item_audio_call":"稱呼","unrecognized_video_format":"無法識別此視頻的格式","loading_note":"加載中...","password_i_have_code":"我有代碼","label_reset_password_tel":"發送短信重置密碼","mobile_phone_number":"手機號碼","password_reset_sms_sent":"已發送帶有安全代碼的短信。","mobile_number_required":"需要手機號","current_email":"當前郵箱","current_phone":"當前電話號碼","new_email":"新電子郵件地址","new_phone_number":"新電話號碼","change_email":"更改郵箱","change_phone":"更改電話號碼","call_busy":"忙碌的","pin_message":"置頂消息","unpin_message":"取消置頂消息","failed_to_init_audio":"初始化錄音失敗","password_reset_success":"密碼重置成功","scan_qr_code":"掃描二維碼","self_topic_comment":"為後代所儲存的註解、訊息、連結、檔案","self_topic_name":"已儲存的訊息","message_not_found":"未找到訊息","message_deleted":"訊息已刪除","alias_editing_placeholder":"別名(可選)","label_alias":"別名:","alias_already_taken":"(已採取)","alias_invalid":"(無效)","label_alias_edit":"別名","select_country":"選擇國家","text_copied":"已複製到剪貼簿","color_schema_dark":"深色","color_schema_light":"淺色","color_schema_system":"系統預設","label_color_schema":"主題:","label_text_size":"文字大小:","incognito_mode_description":"隱藏您的線上狀態和正在輸入指示器。","send_command":"按 {key} 傳送","send_command_explained":"按 Enter 換行","send_plain":"按 Enter 傳送","send_plain_explained":"按 Shift + Enter 換行","sidepanel_title_acc_general":"一般","label_keyboard":"鍵盤:","pin_chat":"置頂","unpin_chat":"取消置頂","subscriber_count":"{count, plural, other {{count, number} 位訂閱者}}","label_member_count":"成員:","label_subscriber_count":"訂閱者:","member_count":"{count, plural, other {{count, number} 位成員}}","tabtitle_image":"圖片","tabtitle_pattern":"圖案","button_restore":"恢復預設","wallpapers":"桌布","label_blur_wallpaper":"模糊:","label_scan_id":"掃描我的 ID:","unknown_name":"未知","save_action":"儲存","cannot_parse_vcard":"無法解析 vCard 檔案。","chat_now":"聊天","find_user":"尋找","label_contact_card":"聯絡人卡片","label_contacts":"聯絡人","add_members_prompt":"新增成員"}'); +module.exports = /*#__PURE__*/JSON.parse('{"action_block_contact":"封鎖聯絡人","action_cancel":"取消","action_clear_messages":"清除訊息","action_delete_messages":"為所有人清除訊息","action_leave_chat":"離開對話","action_report_chat":"檢舉對話","archived_contacts":"已封存的聯絡人 ({count})","badge_danger":"不可信","badge_owner":"擁有者","badge_staff":"員工管理","badge_verified":"已驗證/官方","badge_you":"您","block_contact_warning":"您確定要封鎖此聯絡人嗎?","blocked_contacts_link":"已封鎖的聯絡人 ({count})","button_add_members":"新增成員","button_cancel":"取消","button_confirm":"確認","button_create":"建立","button_delete_account":"刪除帳號","button_edit":"編輯","button_logout":"登出","button_ok":"OK","button_reset":"重設","button_send_request":"傳送要求","button_sign_in":"登入","button_sign_up":"註冊","button_subscribe":"訂閱","button_update":"更新","cannot_initiate_file_upload":"無法為檔案上傳初始化。","channel":"頻道","channel_prompt":"這是頻道","chat_invitation":"您已被邀請開始新對話。您接下來要做什麼呢?","chat_invitation_accept":"接受","chat_invitation_block":"封鎖","chat_invitation_ignore":"忽略","clear_messages_warning":"您確定要清除所有訊息嗎?此操作無法復原。","code_doesnot_match":"代碼不相符","contacts_not_found":"您沒有任何對話\\n¯∖_(ツ)_/¯","contacts_not_found_short":"沒有符合 \'\'{query}\'\' 的聯絡人","credential_email_prompt":"您的註冊電子郵件地址","delete_account":"刪除帳號","delete_account_warning":"您確定要刪除您的帳戶嗎?此操作無法撤消。","delete_messages_warning":"您確定要為所有人刪除所有訊息嗎?此操作無法復原。","download_action":"下載","drafty_attachment":"附加檔案","drafty_form":"表單:","drafty_image":"圖片","email_dative":"電子郵件地址","email_prompt":"電子郵件地址,例如:jdoe@example.com","enable_peers_messaging":"啟用","enter_confirmation_code_prompt":"輸入透過 {method} 傳送給您的確認碼:","error_invalid_id":"ID 無效","file_attachment_too_large":"檔案大小 {size} 超出 {limit} 限制。","forgot_password_link":"忘記密碼?","full_name_prompt":"全名,例如:王小明","granted_permissions":"已授權","group_has_no_members":"無成員","group_user_id_prompt":"群組或使用者 ID","image_caption_prompt":"圖片說明","invalid_content":"內容無效","invalid_security_token":"安全權杖無效","label_client":"客戶端:","label_content_type":"類型:","label_default_access_mode":"預設存取模式:","label_file_name":"檔名:","label_group_members":"群組成員:","label_incognito_mode":"無痕模式:","label_message_sound":"訊息提示聲:","label_muting_topic":"靜音:","label_other_user":"其他","label_password":"密碼","label_permissions":"權限:","label_private":"私人留言","label_push_notifications":"通知:","label_push_notifications_disabled":"通知 (需要 HTTPS):","label_reset_password":"傳送重設密碼郵件:","label_sdk":"SDK:","label_server":"伺服器:","label_server_address":"伺服器位址:","label_server_to_use":"使用的伺服器:","label_size":"大小:","label_topic_name":"名稱","label_user_contacts":"聯絡人","label_user_id":"ID:","label_wire_transport":"線路傳輸:","label_you":"您:","label_your_name":"您的名字","label_your_permissions":"您的權限:","last_seen_timestamp":"最後上線","leave_chat_warning":"您確定要離開此對話嗎?","link_contact_us":"聯絡我們","link_privacy_policy":"隱私權政策","link_terms_of_service":"服務條款","login_prompt":"登入","menu_item_archive_topic":"封存","menu_item_block":"封鎖","menu_item_clear_messages":"清除訊息","menu_item_clear_messages_for_all":"為所有人清除訊息","menu_item_delete":"刪除","menu_item_delete_for_all":"為所有人刪除","menu_item_delete_topic":"刪除","menu_item_edit_permissions":"編輯權限","menu_item_info":"Info","menu_item_member_delete":"移除","menu_item_mute":"靜音","menu_item_restore_topic":"恢復","menu_item_send_retry":"重試","menu_item_unblock":"解除封鎖","menu_item_unmute":"解除靜音","message_sending":"正在傳送...","message_sending_failed":"失敗","messages_not_readable":"沒有存取訊息的權限","messaging_disabled_prompt":"停用訊息","more_online_members":"+{overflow}","new_message_prompt":"新訊息","new_password_placeholder":"輸入新的密碼","no_connection":"無連線","no_contacts":"您沒有任何聯絡人 :-(","numeric_confirmation_code_prompt":"僅數字","online_now":"上線中","password_prompt":"密碼","password_unchanged_prompt":"未修改","peers_messaging_disabled":"Peer 已停用訊息。","permission_admin":"核可 ({val})","permission_delete":"刪除 ({val})","permission_join":"加入 ({val})","permission_owner":"擁有者 ({val})","permission_pres":"收到通知 ({val})","permission_read":"讀取 ({val})","permission_share":"分享 ({val})","permission_write":"撰寫 ({val})","phone_dative":"phone","private_editing_placeholder":"僅您可見","push_init_failed":"初始化通知失敗。","reconnect_countdown":"已斷線。將在 {seconds} 秒後重新連線…","reconnect_now":"現在重試","reload_update":"重新載入","report_chat_warning":"您確定要封鎖並檢舉此對話嗎?","requested_permissions":"重新請求","save_attachment":"儲存","search_for_contacts":"使用搜尋來尋找聯絡人","search_no_results":"搜尋無結果","search_placeholder":"例如 email:alice@example.com, tel:17025550003... 的清單","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支援","sidepanel_title_account_settings":"帳號設定","sidepanel_title_archive":"已封存的對話","sidepanel_title_blocked":"已封鎖的對話","sidepanel_title_cred":"確認認證","sidepanel_title_login":"登入","sidepanel_title_newtpk":"開始新對話","sidepanel_title_register":"建立帳號","sidepanel_title_reset":"重設密碼","sidepanel_title_settings":"設定","stay_logged_in":"保持登入","tabtitle_find_user":"尋找","tabtitle_group_by_id":"以 id","tabtitle_new_group":"新群組","tags_editor_no_tags":"新增一些標籤","tags_not_found":"未定義任何標籤。請新增一些標籤。","title_all_contacts":"所有聯絡人","title_group_members":"群組成員","title_manage_tags":"管理","title_not_found":"找不到","title_permissions":"權限","title_tag_manager":"標籤 (使用者探索)","topic_block_warning":"您確定要封鎖此對話嗎?","topic_delete_warning":"您確定要刪除此對話嗎?","topic_name_editing_placeholder":"群組的任意名稱","unnamed_topic":"未命名","update_available":"有可用的更新。","upload_finishing":"正在完成...","user_not_found":"找不到","description_editing_placeholder":"說明(可選)","label_description":"說明","button_security":"安全性","panel_title_crop":"拖動調整","panel_title_general":"一般","panel_title_members":"成員","panel_title_security":"安全性","panel_title_info":"資訊","permissions_anonymous":"匿名","permissions_authenticated":"已認證","topic_delete":"刪除聊天","permissions_user":"用戶權限","password_reset_email_sent":"已發送一封帶有安全代碼的電子郵件。","label_unarchive_topic":"存檔聊天:","menu_item_reply":"回答","menu_item_forward":"重定向","forward_to":"重定向消息","forward_to_search_placeholder":"搜索聯繫人","label_new_password":"新密碼","drafty_unknown":"不支持","calls_incoming":"來電","calls_outgoing":"撥出電話","calls_you_label":"你","menu_item_video_call":"視頻電話","already_in_call":"你已經在說話了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"斷開連接","label_use_secure_connection":"使用安全連接","cred_confirmed_successfully":"確認成功","menu_item_edit":"編輯","editing_message":"編輯","message_edited_marker":",編輯","icon_title_add_image":"添加圖片","icon_title_attach_file":"附加文件","icon_title_delete":"刪除錄音","icon_title_pause":"暫停播放","icon_title_play":"播放錄音","icon_title_record_voice":"錄製語音消息","icon_title_resume":"恢復播放","icon_title_send":"發信息","drag_file":"將文件拖到這裡","drafty_video":"視頻錄製","call_in_progress":"通話中","menu_item_audio_call":"語音電話","unrecognized_video_format":"無法識別此視頻的格式","loading_note":"加載中...","password_i_have_code":"我有代碼","label_reset_password_tel":"發送短信重置密碼","mobile_phone_number":"手機號碼","password_reset_sms_sent":"已發送帶有安全代碼的短信。","mobile_number_required":"需要手機號","current_email":"當前郵箱","current_phone":"當前電話號碼","new_email":"新電子郵件地址","new_phone_number":"新電話號碼","change_email":"更改郵箱","change_phone":"更改電話號碼","call_busy":"忙碌的","pin_message":"置頂消息","unpin_message":"取消置頂消息","failed_to_init_audio":"初始化錄音失敗","password_reset_success":"密碼重置成功","scan_qr_code":"掃描二維碼","self_topic_comment":"為後代所儲存的註解、訊息、連結、檔案","self_topic_name":"已儲存的訊息","message_not_found":"未找到訊息","message_deleted":"訊息已刪除","alias_editing_placeholder":"別名(可選)","label_alias":"別名:","alias_already_taken":"(已採取)","alias_invalid":"(無效)","label_alias_edit":"別名","select_country":"選擇國家","text_copied":"已複製到剪貼簿","color_schema_dark":"深色","color_schema_light":"淺色","color_schema_system":"系統預設","label_color_schema":"主題:","label_text_size":"文字大小:","incognito_mode_description":"隱藏您的線上狀態和正在輸入指示器。","send_command":"按 {key} 傳送","send_command_explained":"按 Enter 換行","send_plain":"按 Enter 傳送","send_plain_explained":"按 Shift + Enter 換行","sidepanel_title_acc_general":"一般","label_keyboard":"鍵盤:","pin_chat":"置頂","unpin_chat":"取消置頂","subscriber_count":"{count, plural, other {{count, number} 位訂閱者}}","label_member_count":"成員:","label_subscriber_count":"訂閱者:","member_count":"{count, plural, other {{count, number} 位成員}}","tabtitle_image":"圖片","tabtitle_pattern":"圖案","button_restore":"恢復預設","wallpapers":"桌布","label_blur_wallpaper":"模糊:","label_scan_id":"掃描我的 ID:","unknown_name":"未知","save_action":"儲存","cannot_parse_vcard":"無法解析 vCard 檔案。","chat_now":"聊天","find_user":"尋找","label_contact_card":"聯絡人卡片","label_contacts":"聯絡人","add_members_prompt":"新增成員"}'); /***/ }) diff --git a/umd/src_i18n_min_zh_json.dev.js b/umd/src_i18n_min_zh_json.dev.js index 03eca096..780afe9f 100644 --- a/umd/src_i18n_min_zh_json.dev.js +++ b/umd/src_i18n_min_zh_json.dev.js @@ -7,7 +7,7 @@ \******************************/ /***/ (function(module) { -module.exports = /*#__PURE__*/JSON.parse('{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话\\n¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"默认访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后在线:{timestamp}","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"对方已关闭消息。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索无结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"已发送一封带有安全代码的电子邮件。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"转发","forward_to":"转发给","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"断开连接","label_use_secure_connection":"使用安全连接","cred_confirmed_successfully":"确认成功","menu_item_edit":"编辑","editing_message":"编辑","message_edited_marker":",编辑","icon_title_add_image":"添加图片","icon_title_attach_file":"附加文件","icon_title_delete":"删除录音","icon_title_pause":"暂停播放","icon_title_play":"播放录音","icon_title_record_voice":"录制语音信息","icon_title_resume":"恢复播放","icon_title_send":"发送消息","drag_file":"将文件拖到这里","drafty_video":"视频录制","call_in_progress":"通话中","menu_item_audio_call":"称呼","unrecognized_video_format":"无法识别此视频的格式","loading_note":"加载中...","password_i_have_code":"我有代码","label_reset_password_tel":"发送短信重置密码","mobile_phone_number":"手机号","password_reset_sms_sent":"已发送带有安全代码的短信。","mobile_number_required":"需要手机号","current_email":"当前邮箱","current_phone":"当前电话号码","new_email":"新电子邮件地址","new_phone_number":"新电话号码","change_email":"更改邮箱","change_phone":"更改电话号码","call_busy":"忙碌的","pin_message":"置顶消息","unpin_message":"取消置顶消息","failed_to_init_audio":"初始化录音失败","password_reset_success":"密码重置成功","scan_qr_code":"扫描二维码","self_topic_comment":"为后人保存的注释、消息、链接、文件","self_topic_name":"已保存的消息","message_not_found":"未找到消息","message_deleted":"消息已删除","alias_editing_placeholder":"别名(可选)","label_alias":"别名:","alias_already_taken":"(已占用)","alias_invalid":"(无效)","label_alias_edit":"别名","select_country":"选择国家","text_copied":"已复制到剪贴板","color_schema_dark":"深色","color_schema_light":"浅色","color_schema_system":"系统默认","label_color_schema":"主题:","label_text_size":"文字大小:","incognito_mode_description":"隐藏您的在线状态和正在输入指示器。","send_command":"按 {key} 发送","send_command_explained":"按 Enter 换行","send_plain":"按 Enter 发送","send_plain_explained":"按 Shift + Enter 换行","sidepanel_title_acc_general":"常规","label_keyboard":"键盘:","pin_chat":"置顶","unpin_chat":"取消置顶","subscriber_count":"{count, plural, other {{count, number} 位订阅者}}","label_member_count":"成员:","label_subscriber_count":"订阅者:","member_count":"{count, plural, other {{count, number} 位成员}}","tabtitle_image":"图片","tabtitle_pattern":"图案","button_restore":"恢复默认","wallpapers":"壁纸","label_blur_wallpaper":"模糊:","label_scan_id":"扫描我的 ID:","unknown_name":"未知","save_action":"保存","cannot_parse_vcard":"无法解析 vCard 文件。","chat_now":"聊天","find_user":"查找","label_contact_card":"联系人卡片","label_contacts":"联系人","add_members_prompt":"添加成员"}'); +module.exports = /*#__PURE__*/JSON.parse('{"action_block_contact":"屏蔽联系人","action_cancel":"取消","action_clear_messages":"删除讯息","action_delete_messages":"删除所有帖子","action_leave_chat":"离开","action_report_chat":"检举垃圾邮件","archived_contacts":"已归档联系人 ({count})","badge_danger":"可疑的","badge_owner":"所有者","badge_staff":"在员工管理下","badge_verified":"值得信赖","badge_you":"你","block_contact_warning":"您确定要阻止此联系人吗?","blocked_contacts_link":"封锁的联络人 ({count})","button_add_members":"添加成员","button_cancel":"取消","button_confirm":"确认","button_create":"创建","button_delete_account":"删除帐户","button_edit":"编辑","button_logout":"登出","button_ok":"好","button_reset":"重置","button_send_request":"发送请求","button_sign_in":"登录","button_sign_up":"注册","button_subscribe":"订阅","button_update":"更新","cannot_initiate_file_upload":"无法初始化文件上传。","channel":"频道","channel_prompt":"这是一个频道","chat_invitation":"你受邀开始新会话。你想怎么做?","chat_invitation_accept":"接受","chat_invitation_block":"屏蔽","chat_invitation_ignore":"忽略","clear_messages_warning":"您确定要清除所有消息吗?无法撤消。","code_doesnot_match":"代码不匹配","contacts_not_found":"你尚无会话\\n¯∖_(ツ)_/¯","contacts_not_found_short":"无联系人匹配\'\'{query}\'\'","credential_email_prompt":"你的注册邮箱","delete_account":"删除帐户","delete_account_warning":"您确定要删除您的帐户吗?无法撤消。","delete_messages_warning":"您确定要删除所有消息吗?无法撤消。","download_action":"下载","drafty_attachment":"附件","drafty_form":"形式:","drafty_image":"图像","email_dative":"电子邮件","email_prompt":"电子邮件,例如 zhang@example.com","enable_peers_messaging":"启用","enter_confirmation_code_prompt":"输入通过{method}发送的验证码:","error_invalid_id":"无效 ID","file_attachment_too_large":"文件大小 {size} 超过 {limit} 限制。","forgot_password_link":"忘记密码?","full_name_prompt":"全名,例如张伟","granted_permissions":"已授予","group_has_no_members":"无成员","group_user_id_prompt":"群组或用户 ID","image_caption_prompt":"图片标题","invalid_content":"无效内容","invalid_security_token":"无效的安全令牌","label_client":"客户端:","label_content_type":"内容类型:","label_default_access_mode":"默认访问模式:","label_file_name":"文件名:","label_group_members":"群组成员:","label_incognito_mode":"无痕模式:","label_message_sound":"消息提示音:","label_muting_topic":"已静音:","label_other_user":"其他","label_password":"密码","label_permissions":"权限:","label_private":"私人评论","label_push_notifications":"通知提醒:","label_push_notifications_disabled":"通知提醒(需要 HTTPS):","label_reset_password":"发送密码重置邮件:","label_sdk":"开发包:","label_server":"服务器:","label_server_address":"服务器地址:","label_server_to_use":"使用的服务器:","label_size":"大小:","label_topic_name":"名称","label_user_contacts":"往来","label_user_id":"地址:","label_wire_transport":"线路传输:","label_you":"你:","label_your_name":"你的姓名","label_your_permissions":"你的权限:","last_seen_timestamp":"最后在线:{timestamp}","leave_chat_warning":"您确定要退出此对话吗?","link_contact_us":"联系我们","link_privacy_policy":"隐私政策","link_terms_of_service":"条款和条件","login_prompt":"登录","menu_item_archive_topic":"归档","menu_item_block":"屏蔽","menu_item_clear_messages":"清空消息","menu_item_clear_messages_for_all":"全部清除","menu_item_delete":"删除","menu_item_delete_for_all":"全部删除","menu_item_delete_topic":"删除","menu_item_edit_permissions":"编辑权限","menu_item_info":"信息","menu_item_member_delete":"移除","menu_item_mute":"静音","menu_item_restore_topic":"从存档中恢复","menu_item_send_retry":"重试","menu_item_unblock":"取消屏蔽","menu_item_unmute":"取消静音","message_sending":"正在发送...","message_sending_failed":"发送失败","messages_not_readable":"无消息访问权限","messaging_disabled_prompt":"消息已禁用","more_online_members":"还有{overflow}个","new_message_prompt":"新消息","new_password_placeholder":"输入新密码","no_connection":"无连接","no_contacts":"你尚无联系人 (._.)","numeric_confirmation_code_prompt":"仅数字","online_now":"在线","password_prompt":"密码","password_unchanged_prompt":"未改变","peers_messaging_disabled":"对方已关闭消息。","permission_admin":"批准 ({val})","permission_delete":"删除 ({val})","permission_join":"加入 ({val})","permission_owner":"所有者 ({val})","permission_pres":"获取通知 ({val})","permission_read":"读取 ({val})","permission_share":"分享 ({val})","permission_write":"写入 ({val})","phone_dative":"电话","private_editing_placeholder":"仅自己可见","push_init_failed":"初始化推送通知失败","reconnect_countdown":"连接已断开。{seconds} 秒后重新连接…","reconnect_now":"立即尝试","reload_update":"重新载入","report_chat_warning":"您确定要停止并报告此对话吗?","requested_permissions":"已请求","save_attachment":"保存","search_for_contacts":"使用搜索寻找联系人","search_no_results":"搜索无结果","search_placeholder":"列表如 email:alice@example.com, tel:+17025550003...","sidepanel_title_acc_notifications":"通知","sidepanel_title_acc_support":"支持","sidepanel_title_account_settings":"帐号设定","sidepanel_title_archive":"已存档会话","sidepanel_title_blocked":"被阻止的聊天","sidepanel_title_cred":"确认凭据","sidepanel_title_login":"登录","sidepanel_title_newtpk":"开始新会话","sidepanel_title_register":"创建账户","sidepanel_title_reset":"重置密码","sidepanel_title_settings":"设置","stay_logged_in":"保持登录","tabtitle_find_user":"搜索","tabtitle_group_by_id":"通过 id","tabtitle_new_group":"新群组","tags_editor_no_tags":"添加一些标签","tags_not_found":"尚未定义标签。添加一些。","title_all_contacts":"全部联系人","title_group_members":"群组成员","title_manage_tags":"管理标签","title_not_found":"无法找到","title_permissions":"权限","title_tag_manager":"标签(用户发现)","topic_block_warning":"您确定要阻止此对话吗?","topic_delete_warning":"您确定要删除此对话吗?","topic_name_editing_placeholder":"群组自由格式名称","unnamed_topic":"未命名","update_available":"更新可用。","upload_finishing":"正在结束...","user_not_found":"未找到","description_editing_placeholder":"说明(可选)","label_description":"说明","button_security":"安全","panel_title_crop":"拖动调整","panel_title_general":"常用设定","panel_title_members":"成员","panel_title_security":"安全","panel_title_info":"信息","permissions_anonymous":"匿名","permissions_authenticated":"已认证","topic_delete":"删除聊天","permissions_user":"用户权限","password_reset_email_sent":"已发送一封带有安全代码的电子邮件。","label_unarchive_topic":"存档:","menu_item_reply":"回复","menu_item_forward":"转发","forward_to":"转发给","forward_to_search_placeholder":"搜索联系人","label_new_password":"新密码","drafty_unknown":"不支持","calls_incoming":"来电","calls_outgoing":"拨出电话","calls_you_label":"你","menu_item_video_call":"视频电话","already_in_call":"你已经在说话了!","call_cancelled":"取消","call_missed":"未接","call_declined":"被拒","call_disconnected":"断开连接","label_use_secure_connection":"使用安全连接","cred_confirmed_successfully":"确认成功","menu_item_edit":"编辑","editing_message":"编辑","message_edited_marker":",编辑","icon_title_add_image":"添加图片","icon_title_attach_file":"附加文件","icon_title_delete":"删除录音","icon_title_pause":"暂停播放","icon_title_play":"播放录音","icon_title_record_voice":"录制语音信息","icon_title_resume":"恢复播放","icon_title_send":"发送消息","drag_file":"将文件拖到这里","drafty_video":"视频录制","call_in_progress":"通话中","menu_item_audio_call":"语音电话","unrecognized_video_format":"无法识别此视频的格式","loading_note":"加载中...","password_i_have_code":"我有代码","label_reset_password_tel":"发送短信重置密码","mobile_phone_number":"手机号","password_reset_sms_sent":"已发送带有安全代码的短信。","mobile_number_required":"需要手机号","current_email":"当前邮箱","current_phone":"当前电话号码","new_email":"新电子邮件地址","new_phone_number":"新电话号码","change_email":"更改邮箱","change_phone":"更改电话号码","call_busy":"忙碌的","pin_message":"置顶消息","unpin_message":"取消置顶消息","failed_to_init_audio":"初始化录音失败","password_reset_success":"密码重置成功","scan_qr_code":"扫描二维码","self_topic_comment":"为后人保存的注释、消息、链接、文件","self_topic_name":"已保存的消息","message_not_found":"未找到消息","message_deleted":"消息已删除","alias_editing_placeholder":"别名(可选)","label_alias":"别名:","alias_already_taken":"(已占用)","alias_invalid":"(无效)","label_alias_edit":"别名","select_country":"选择国家","text_copied":"已复制到剪贴板","color_schema_dark":"深色","color_schema_light":"浅色","color_schema_system":"系统默认","label_color_schema":"主题:","label_text_size":"文字大小:","incognito_mode_description":"隐藏您的在线状态和正在输入指示器。","send_command":"按 {key} 发送","send_command_explained":"按 Enter 换行","send_plain":"按 Enter 发送","send_plain_explained":"按 Shift + Enter 换行","sidepanel_title_acc_general":"常规","label_keyboard":"键盘:","pin_chat":"置顶","unpin_chat":"取消置顶","subscriber_count":"{count, plural, other {{count, number} 位订阅者}}","label_member_count":"成员:","label_subscriber_count":"订阅者:","member_count":"{count, plural, other {{count, number} 位成员}}","tabtitle_image":"图片","tabtitle_pattern":"图案","button_restore":"恢复默认","wallpapers":"壁纸","label_blur_wallpaper":"模糊:","label_scan_id":"扫描我的 ID:","unknown_name":"未知","save_action":"保存","cannot_parse_vcard":"无法解析 vCard 文件。","chat_now":"聊天","find_user":"查找","label_contact_card":"联系人卡片","label_contacts":"联系人","add_members_prompt":"添加成员"}'); /***/ }) diff --git a/umd/src_widgets_call-panel_jsx.dev.js b/umd/src_widgets_call-panel_jsx.dev.js index 6dbed5ad..80326e72 100644 --- a/umd/src_widgets_call-panel_jsx.dev.js +++ b/umd/src_widgets_call-panel_jsx.dev.js @@ -140,7 +140,7 @@ class CallPanel extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCompon this.dragTarget = 'container'; return; } - if (!this.props.minimized && !this.state.audioOnly && this.selfBoxRef.current && event.target.closest('.call-party.self')) { + if (!this.props.minimized && !this.state.audioOnly && this.state.remoteStream && this.selfBoxRef.current && event.target.closest('.call-party.self')) { event.stopPropagation(); const el = this.selfBoxRef.current; this.containerRef.current.setPointerCapture(event.pointerId); @@ -825,7 +825,7 @@ class CallPanel extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCompon children: [(0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxDEV)("div", { className: "call-party self", ref: this.selfBoxRef, - disabled: this.state.audioOnly || this.props.minimized, + disabled: this.state.audioOnly || this.props.minimized || !connected, children: [(0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxDEV)("video", { ref: this.localRef, autoPlay: true, diff --git a/umd/src_widgets_call-panel_jsx.dev.js.map b/umd/src_widgets_call-panel_jsx.dev.js.map index b17e47d4..855c3783 100644 --- a/umd/src_widgets_call-panel_jsx.dev.js.map +++ b/umd/src_widgets_call-panel_jsx.dev.js.map @@ -1 +1 @@ -{"version":3,"file":"src_widgets_call-panel_jsx.dev.js","mappings":"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","sources":["webpack://tinode-webapp/./src/widgets/call-panel.jsx"],"sourcesContent":["// CallPanel displays call in progress: local and remote viewports and controls.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\nimport { truncateString } from '../lib/strformat.js';\n\nconst RING_SOUND = new Audio('audio/call-out.m4a');\nRING_SOUND.loop = true;\nconst CALL_ENDED_SOUND = new Audio('audio/call-end.m4a');\nCALL_ENDED_SOUND.loop = true;\nconst DIALING_SOUND = new Audio('audio/dialing.m4a');\n\nconst VIDEO_MUTED_EVENT = 'video:muted';\nconst VIDEO_UNMUTED_EVENT = 'video:unmuted';\n// See handleVideoOfferMsg's use of this below.\nconst UNMOUNTED_DURING_OFFER = Symbol('unmounted-during-offer');\n\nfunction formatElapsedTime(totalSeconds) {\n const h = Math.floor(totalSeconds / 3600);\n const m = Math.floor((totalSeconds % 3600) / 60);\n const s = totalSeconds % 60;\n const pad = n => String(n).padStart(2, '0');\n return h > 0 ? `${h}:${pad(m)}:${pad(s)}` : `${pad(m)}:${pad(s)}`;\n}\n\nconst messages = defineMessages({\n already_in_call: {\n id: 'already_in_call',\n defaultMessage: 'You already in an ongoing call!',\n description: 'Error message when the user tried to accept a new call without finishing pervious one',\n }\n});\n\nclass CallPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n localStream: undefined,\n remoteStream: undefined,\n pc: undefined,\n dataChannel: undefined,\n\n previousOnInfo: undefined,\n waitingForPeer: false,\n // If true, the client has received a remote SDP from the peer and has sent a local SDP to the peer.\n callInitialSetupComplete: false,\n audioOnly: props.callAudioOnly,\n // Video mute/unmute in progress.\n videoToggleInProgress: false,\n // Indicates if the remote peer has informed us that their camera is on.\n remoteVideoLive: false,\n // Seconds elapsed since the call was connected (remote media received).\n elapsedSeconds: 0,\n // Whether remote audio is routed to the loud speaker output (best-effort, see handleToggleSpeakerClick).\n speakerOn: true,\n };\n this.callStartedAt = null;\n this.elapsedTimerId = null;\n\n this.localStreamConstraints = {\n audio: true,\n video: !props.callAudioOnly\n };\n this.isOutgoingCall = props.callState == CALL_STATE_OUTGOING_INITATED;\n\n this.containerRef = React.createRef();\n this.selfBoxRef = React.createRef();\n this.localRef = React.createRef();\n this.remoteRef = React.createRef();\n\n // Cache for remote ice candidates until initial setup gets completed.\n this.remoteIceCandidatesCache = [];\n\n this.onInfo = this.onInfo.bind(this);\n this.start = this.start.bind(this);\n this.stop = this.stop.bind(this);\n\n this.createPeerConnection = this.createPeerConnection.bind(this);\n this.canSendOffer = this.canSendOffer.bind(this);\n this.drainRemoteIceCandidatesCache = this.drainRemoteIceCandidatesCache.bind(this);\n\n this.handleNegotiationNeededEvent = this.handleNegotiationNeededEvent.bind(this);\n this.handleICECandidateEvent = this.handleICECandidateEvent.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n this.handleICEConnectionStateChangeEvent = this.handleICEConnectionStateChangeEvent.bind(this);\n this.handleSignalingStateChangeEvent = this.handleSignalingStateChangeEvent.bind(this);\n this.handleICEGatheringStateChangeEvent = this.handleICEGatheringStateChangeEvent.bind(this);\n this.handleIceCandidateErrorEvent = this.handleIceCandidateErrorEvent.bind(this);\n this.handleTrackEvent = this.handleTrackEvent.bind(this);\n\n this.handleVideoOfferMsg = this.handleVideoOfferMsg.bind(this);\n this.handleVideoAnswerMsg = this.handleVideoAnswerMsg.bind(this);\n this.handleNewICECandidateMsg = this.handleNewICECandidateMsg.bind(this);\n\n this.reportError = this.reportError.bind(this);\n this.handleGetUserMediaError = this.handleGetUserMediaError.bind(this);\n\n this.stopTracks = this.stopTracks.bind(this);\n this.disconnectMedia = this.disconnectMedia.bind(this);\n\n this.handleCloseClick = this.handleCloseClick.bind(this);\n this.handleToggleCameraClick = this.handleToggleCameraClick.bind(this);\n this.handleToggleMicClick = this.handleToggleMicClick.bind(this);\n this.handleToggleSpeakerClick = this.handleToggleSpeakerClick.bind(this);\n this.handleSwitchCameraClick = this.handleSwitchCameraClick.bind(this);\n\n this.startElapsedTimer = this.startElapsedTimer.bind(this);\n this.stopElapsedTimer = this.stopElapsedTimer.bind(this);\n\n this.handleRemoteHangup = this.handleRemoteHangup.bind(this);\n this.handleVideoCallAccepted = this.handleVideoCallAccepted.bind(this);\n\n this.muteVideo = this.muteVideo.bind(this);\n this.unmuteVideo = this.unmuteVideo.bind(this);\n this.emptyVideoTrack = this.emptyVideoTrack.bind(this);\n\n this.handleDataChannelEvent = this.handleDataChannelEvent.bind(this);\n this.handleDataChannelError = this.handleDataChannelError.bind(this);\n this.handleDataChannelMessage = this.handleDataChannelMessage.bind(this);\n this.handleDataChannelOpen = this.handleDataChannelOpen.bind(this);\n this.handleDataChannelClose = this.handleDataChannelClose.bind(this);\n\n this.bounds = {};\n // Which element the in-progress drag is moving: 'container' for the whole minimized bubble,\n // 'self' for just the local self-view preview box inside a fullscreen connected video call.\n // Null when no drag is in progress (also doubles as the pointermove/pointerup no-op guard).\n this.dragTarget = null;\n\n this.dragStart = (event) => {\n if (!event.target.closest('.draggable')) {\n // Prevent dragging when clicking on buttons or other non-draggable elements.\n return;\n }\n if (window.matchMedia('(width<=640px)').matches) {\n // No dragging on small screens.\n return;\n }\n if (this.props.minimized && this.containerRef) {\n event.stopPropagation();\n const el = this.containerRef.current;\n el.setPointerCapture(event.pointerId);\n el.style.cursor = 'grabbing';\n this.bounds.left = el.offsetLeft;\n this.bounds.top = el.offsetTop;\n this.bounds.width = el.offsetWidth;\n this.bounds.height = el.offsetHeight;\n // Switch from right/auto-left CSS positioning to explicit left/top so drag() can move the element freely.\n el.style.right = 'auto';\n el.style.left = `${this.bounds.left}px`;\n el.style.top = `${this.bounds.top}px`;\n\n const parent = el.offsetParent;\n this.bounds.maxX = parent.offsetWidth;\n this.bounds.maxY = parent.offsetHeight;\n this.dragTarget = 'container';\n return;\n }\n // Fullscreen connected video call: let the user drag their own small self-view preview\n // out of the way instead of it being stuck wherever it defaults to (spec 8.9 \"双方视频\n // 通话中\": \"小窗应支持拖动且不能遮挡关键按钮\"). Only relevant when the box actually exists\n // (base.css hides it entirely for audio-only calls / while minimized via\n // .call-party.self[disabled]) and only when the drag actually starts on that box, not on\n // the peer's video/avatar card behind it.\n if (!this.props.minimized && !this.state.audioOnly && this.selfBoxRef.current &&\n event.target.closest('.call-party.self')) {\n event.stopPropagation();\n const el = this.selfBoxRef.current;\n // Pointer events are captured on the outer container (same element the listeners below\n // are attached to) rather than the box itself, purely so drag()/dragEnd() below have one\n // consistent place to check hasPointerCapture() regardless of which element is moving.\n this.containerRef.current.setPointerCapture(event.pointerId);\n el.style.cursor = 'grabbing';\n this.bounds.left = el.offsetLeft;\n this.bounds.top = el.offsetTop;\n this.bounds.width = el.offsetWidth;\n this.bounds.height = el.offsetHeight;\n // Switch from right/bottom CSS positioning to explicit left/top so drag() can move it freely.\n el.style.right = 'auto';\n el.style.bottom = 'auto';\n el.style.left = `${this.bounds.left}px`;\n el.style.top = `${this.bounds.top}px`;\n\n const parent = el.offsetParent;\n this.bounds.maxX = parent.offsetWidth;\n this.bounds.maxY = parent.offsetHeight;\n this.dragTarget = 'self';\n }\n };\n this.drag = (event) => {\n event.stopPropagation();\n const container = this.containerRef.current;\n if (!this.dragTarget || !container.hasPointerCapture(event.pointerId)) {\n return;\n }\n const el = this.dragTarget == 'self' ? this.selfBoxRef.current : container;\n if (!el) {\n return;\n }\n // Calculate new position. Restrict to the visible area of the parent element.\n this.bounds.left = Math.min(Math.max(this.bounds.left + event.movementX, 0),\n this.bounds.maxX - this.bounds.width);\n this.bounds.top = Math.min(Math.max(this.bounds.top + event.movementY, 0),\n this.bounds.maxY - this.bounds.height);\n\n el.style.left = `${this.bounds.left}px`;\n el.style.top = `${this.bounds.top}px`;\n };\n this.dragEnd = (event) => {\n event.stopPropagation();\n const container = this.containerRef.current;\n if (!this.dragTarget) {\n return;\n }\n const el = this.dragTarget == 'self' ? this.selfBoxRef.current : container;\n if (container && container.hasPointerCapture(event.pointerId)) {\n container.releasePointerCapture(event.pointerId);\n }\n if (el) {\n el.style.cursor = 'grab';\n }\n this.dragTarget = null;\n };\n // dragStart's inline left/top/right (set the first time the minimized bubble is dragged, see\n // above) always win over base.css's #video-container.minimized:not(.audio-minimized) mobile\n // rule -- inline style beats any stylesheet selector regardless of media query. A desktop user\n // who drags the bubble somewhere and then narrows the window below 640px (a real everyday\n // action -- snapping the browser to half the screen, say) would otherwise be stuck with the\n // bubble pinned at its old desktop-width position/size instead of docking as the intended\n // mobile full-width strip. Clearing the manual offsets once the mobile breakpoint applies lets\n // the stylesheet rule take back over; harmless (a no-op) whenever nothing was ever dragged.\n // Same idea for the self-view box's own drag above, keyed off its own (768px) breakpoint\n // (base.css \".call-party.self\" mobile rule only ever touches `bottom`, but a stale inline\n // left/top from a desktop-width drag would still leave it sitting at the wrong height once\n // that rule's extra bottom clearance was meant to apply).\n this.handleWindowResize = () => {\n if (this.props.minimized && this.containerRef.current &&\n window.matchMedia('(width<=640px)').matches) {\n const el = this.containerRef.current;\n el.style.removeProperty('left');\n el.style.removeProperty('right');\n el.style.removeProperty('top');\n }\n if (!this.props.minimized && this.selfBoxRef.current &&\n window.matchMedia('(width<=768px)').matches) {\n const el = this.selfBoxRef.current;\n el.style.removeProperty('left');\n el.style.removeProperty('right');\n el.style.removeProperty('top');\n el.style.removeProperty('bottom');\n }\n };\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnInfo = topic.onInfo;\n topic.onInfo = this.onInfo;\n if ((this.props.callState == CALL_STATE_OUTGOING_INITATED ||\n this.props.callState == CALL_STATE_IN_PROGRESS) && this.localRef.current) {\n this.start();\n }\n\n if (this.containerRef) {\n this.containerRef.current.addEventListener('pointerdown', this.dragStart);\n this.containerRef.current.addEventListener('pointermove', this.drag);\n this.containerRef.current.addEventListener('pointerup', this.dragEnd);\n }\n window.addEventListener('resize', this.handleWindowResize);\n }\n\n componentWillUnmount() {\n this._unmounted = true;\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onInfo = this.previousOnInfo;\n this.stop();\n\n window.removeEventListener('resize', this.handleWindowResize);\n if (this.containerRef) {\n this.containerRef.current.removeEventListener('pointerdown', this.dragStart);\n this.containerRef.current.removeEventListener('pointermove', this.drag);\n this.containerRef.current.removeEventListener('pointerup', this.dragEnd);\n }\n }\n\n handleVideoCallAccepted(info) {\n RING_SOUND.pause();\n // Create peer connection with a data channel.\n const pc = this.createPeerConnection(true);\n const stream = this.state.localStream;\n stream.getTracks().forEach(track => {\n pc.addTrack(track, stream);\n\n if (track.kind == 'video' && this.state.audioOnly) {\n // This is an audio-only call.\n // Remove dummy video track (placeholder remains).\n track.enabled = false;\n track.stop();\n stream.removeTrack(track);\n }\n });\n }\n\n onInfo(info) {\n if (info.what != 'call') {\n // This call panel takes over topic.onInfo wholesale for the lifetime of the call (including\n // while minimized -- the product lets messaging continue during a call), but was only ever\n // handling 'call' events itself and dropping everything else on the floor instead of forwarding\n // to the handler it displaced (messages-view.jsx's handleInfoReceipt, which drives the \"typing\"\n // indicator and read/received checkmarks). Real-time {info} isn't replayed later, so every\n // typing/read/recv update for this topic was silently lost for as long as the panel stayed\n // mounted.\n if (this.previousOnInfo) {\n this.previousOnInfo(info);\n }\n return;\n }\n switch (info.event) {\n case 'accept':\n this.handleVideoCallAccepted(info);\n break;\n case 'answer':\n this.handleVideoAnswerMsg(info);\n break;\n case 'ice-candidate':\n this.handleNewICECandidateMsg(info);\n break;\n case 'hang-up':\n this.handleRemoteHangup(info);\n break;\n case 'offer':\n this.handleVideoOfferMsg(info);\n break;\n case 'ringing':\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n break;\n default:\n console.warn(\"Unknown call event\", info.event);\n break;\n }\n }\n\n // Creates an empty video track placeholder.\n emptyVideoTrack() {\n const width = 640;\n const height = 480;\n const canvas = Object.assign(document.createElement(\"canvas\"), {width, height});\n canvas.getContext('2d').fillRect(0, 0, width, height);\n const stream = canvas.captureStream(0);\n return Object.assign(stream.getVideoTracks()[0], {enabled: false});\n }\n\n start() {\n if (this.state.localStream) {\n this.props.onError(this.props.intl.formatMessage(messages.already_in_call), 'info');\n return;\n }\n\n if (this.props.callState == CALL_STATE_IN_PROGRESS) {\n // We apparently just accepted the call.\n this.props.onInvite(this.props.topic, this.props.seq, CALL_STATE_IN_PROGRESS, this.props.callAudioOnly);\n return;\n }\n\n // This is an outgoing call waiting for the other side to pick up.\n // Start local video.\n navigator.mediaDevices.getUserMedia(this.localStreamConstraints)\n .then(stream => {\n // The permission prompt this getUserMedia call triggers can still be pending when the call\n // is torn down from elsewhere (the ring-timeout hangup, a hangup note from the peer, or the\n // messages-view.jsx componentWillUnmount hangup added this round) -- resolving after that\n // touches this.localRef.current (already null post-unmount, so the srcObject assignment\n // below would throw) and would otherwise go on to announce an invite for a call nothing is\n // showing anymore.\n if (this._unmounted) {\n stream.getTracks().forEach(t => t.stop());\n return;\n }\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create a dummy video track\n // (so video can be enabled during the call if the user desires).\n stream.addTrack(this.emptyVideoTrack());\n }\n this.setState({localStream: stream, waitingForPeer: true});\n this.localRef.current.srcObject = stream;\n\n DIALING_SOUND.play();\n\n // Send call invitation.\n this.props.onInvite(this.props.topic, this.props.seq, this.props.callState, this.props.callAudioOnly);\n })\n .catch(this.handleGetUserMediaError);\n }\n\n stop() {\n CALL_ENDED_SOUND.pause();\n CALL_ENDED_SOUND.currentTime = 0;\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n this.stopElapsedTimer();\n\n this.stopTracks(this.state.localStream);\n this.stopTracks(this.state.remoteStream);\n this.disconnectMedia(this.localRef.current);\n this.disconnectMedia(this.remoteRef.current);\n if (this.state.pc) {\n this.state.pc.ontrack = null;\n this.state.pc.onremovetrack = null;\n this.state.pc.onremovestream = null;\n this.state.pc.onicecandidate = null;\n this.state.pc.oniceconnectionstatechange = null;\n this.state.pc.onsignalingstatechange = null;\n this.state.pc.onicegatheringstatechange = null;\n this.state.pc.onnegotiationneeded = null;\n this.state.pc.onicecandidateerror = null;\n this.state.pc.ondatachannel = null;\n\n if (this.state.dataChannel && (this.state.dataChannel.readyState == 'open' || this.state.dataChannel.readyState == 'connecting')) {\n this.state.dataChannel.close();\n }\n this.state.pc.close();\n }\n this.setState({pc: null, waitingForPeer: false});\n }\n\n disconnectMedia(el) {\n if (!el) {\n return;\n }\n\n el.srcObject = null;\n el.src = '';\n }\n\n stopTracks(stream) {\n if (!stream) {\n return;\n }\n\n let tracks = stream.getTracks();\n if (tracks) {\n tracks.forEach(track => {\n track.stop();\n track.enabled = false;\n });\n }\n }\n\n handleDataChannelError(error) {\n console.error('data channel error', error);\n }\n\n handleDataChannelMessage(event) {\n switch (event.data) {\n case VIDEO_MUTED_EVENT:\n this.setState({remoteVideoLive: false}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n case VIDEO_UNMUTED_EVENT:\n this.setState({remoteVideoLive: true}, _ => { this.remoteRef.current.srcObject = this.state.remoteStream; });\n break;\n default:\n break;\n }\n }\n\n handleDataChannelOpen(event) {\n if (!this.state.audioOnly) {\n event.target.send(VIDEO_UNMUTED_EVENT);\n }\n }\n\n handleDataChannelClose(event) {\n console.info('close data channel:', event);\n }\n\n handleDataChannelEvent(event) {\n console.info('data channel event:', event);\n const channel = event.channel;\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n this.setState({dataChannel: channel});\n }\n\n createPeerConnection(withDataChannel) {\n const iceServers = this.props.tinode.getServerParam('iceServers', null);\n const pc = iceServers ? new RTCPeerConnection({iceServers: iceServers}) : new RTCPeerConnection();\n\n pc.onicecandidate = this.handleICECandidateEvent;\n pc.oniceconnectionstatechange = this.handleICEConnectionStateChangeEvent;\n pc.onicegatheringstatechange = this.handleICEGatheringStateChangeEvent;\n pc.onsignalingstatechange = this.handleSignalingStateChangeEvent;\n pc.onnegotiationneeded = this.handleNegotiationNeededEvent;\n pc.onicecandidateerror = this.handleIceCandidateErrorEvent;\n pc.ontrack = this.handleTrackEvent;\n pc.ondatachannel = this.handleDataChannelEvent;\n\n let stateUpdate = {pc: pc, waitingForPeer: false};\n if (withDataChannel) {\n // Create data channel for exchanging events.\n const channel = pc.createDataChannel(\"events\", {ordered: true});\n channel.onerror = this.handleDataChannelError;\n channel.onmessage = this.handleDataChannelMessage;\n channel.onopen = this.handleDataChannelOpen;\n channel.onclose = this.handleDataChannelClose;\n stateUpdate.dataChannel = channel;\n }\n this.setState(stateUpdate);\n return pc;\n }\n\n handleVideoAnswerMsg(info) {\n // Configure the remote description, which is the SDP payload\n // in 'info' message.\n const desc = new RTCSessionDescription(info.payload);\n this.state.pc.setRemoteDescription(desc)\n .then(_ => {\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(err => this.reportError(err));\n }\n\n reportError(err) {\n this.props.onError(err.message, 'err');\n }\n\n canSendOffer() {\n return this.isOutgoingCall || this.state.callInitialSetupComplete;\n }\n\n handleNegotiationNeededEvent(event) {\n const pc = event.target;\n if (!this.canSendOffer()) {\n return;\n }\n pc.createOffer().then(offer => {\n return pc.setLocalDescription(offer);\n })\n .then(_ => {\n this.props.onSendOffer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n })\n .catch(err => this.reportError(err));\n }\n\n handleIceCandidateErrorEvent(event) {\n console.warn(\"ICE candidate error:\", event);\n }\n\n handleICECandidateEvent(event) {\n if (event.candidate) {\n this.props.onIceCandidate(this.props.topic, this.props.seq, event.candidate.toJSON());\n }\n }\n\n handleNewICECandidateMsg(info) {\n const candidate = new RTCIceCandidate(info.payload);\n if (this.state.callInitialSetupComplete) {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding new ice candidate\", candidate, err);\n });\n } else {\n this.remoteIceCandidatesCache.push(candidate);\n }\n }\n\n drainRemoteIceCandidatesCache() {\n this.remoteIceCandidatesCache.forEach(candidate => {\n this.state.pc.addIceCandidate(candidate)\n .catch(err => {\n if (candidate.candidate) {\n this.reportError(err);\n }\n console.warn(\"Error adding cached ice candidate\", candidate, err);\n });\n });\n this.remoteIceCandidatesCache = [];\n }\n\n handleICEConnectionStateChangeEvent(event) {\n switch (event.target.iceConnectionState) {\n case 'closed':\n case 'failed':\n this.handleCloseClick();\n break;\n }\n }\n\n handleSignalingStateChangeEvent(event) {\n if (event.target.signalingState == 'closed') {\n this.handleCloseClick();\n }\n }\n\n handleICEGatheringStateChangeEvent(event) {\n // ICE gathering change state\n }\n\n handleTrackEvent(event) {\n // Remote video becomes available.\n this.remoteRef.current.srcObject = event.streams[0];\n this.setState({remoteStream: event.streams[0]});\n // First remote media (audio or video) means the call is actually connected.\n this.startElapsedTimer();\n }\n\n startElapsedTimer() {\n if (this.elapsedTimerId) {\n // Already running.\n return;\n }\n this.callStartedAt = Date.now();\n this.elapsedTimerId = setInterval(_ => {\n this.setState({elapsedSeconds: Math.floor((Date.now() - this.callStartedAt) / 1000)});\n }, 1000);\n }\n\n stopElapsedTimer() {\n if (this.elapsedTimerId) {\n clearInterval(this.elapsedTimerId);\n this.elapsedTimerId = null;\n }\n this.callStartedAt = null;\n }\n\n handleGetUserMediaError(e) {\n console.error(\"Error opening camera and/or microphone\", e);\n switch(e.name) {\n case 'NotFoundError':\n // Cannot start the call b/c no camera and/or microphone found.\n this.reportError(e);\n break;\n case 'SecurityError':\n case 'PermissionDeniedError':\n // Do nothing; this is the same as the user canceling the call.\n break;\n default:\n this.reportError(e);\n break;\n }\n\n // Make sure we shut down our end of the RTCPeerConnection so we're\n // ready to try again.\n this.handleCloseClick();\n }\n\n handleVideoOfferMsg(info) {\n let localStream = null;\n // If needed, create peer connection.\n // Not creating data channel since it should be created by the peer.\n const pc = this.state.pc ? this.state.pc : this.createPeerConnection(false);\n const desc = new RTCSessionDescription(info.payload);\n\n pc.setRemoteDescription(desc).then(_ => {\n return navigator.mediaDevices.getUserMedia(this.localStreamConstraints);\n })\n .then(stream => {\n // Same permission-prompt-outlives-the-call race as start()/unmuteVideo()/\n // handleSwitchCameraClick() -- this is the callee-side counterpart (answering an offer),\n // a separate getUserMedia call this round's fix missed: start() takes an early-return\n // branch for an already-in-progress call and never reaches its own getUserMedia here.\n // A bare `return` wouldn't be enough on its own to bail out of the rest of *this* chain\n // (createAnswer/setLocalDescription/onSendAnswer below still run on the next tick with\n // `undefined`) -- rejecting with the sentinel skips straight past all of those (none of\n // them pass an onRejected handler to .then()) to the .catch() at the end, which checks for\n // it explicitly so this cancellation isn't reported as a real getUserMedia failure.\n if (this._unmounted) {\n stream.getTracks().forEach(t => t.stop());\n return Promise.reject(UNMOUNTED_DURING_OFFER);\n }\n let dummyVideo;\n if (!this.localStreamConstraints.video) {\n // Starting an audio-only call. Create an empty video track so\n // so the user can enable the video during the call.\n dummyVideo = this.emptyVideoTrack();\n stream.addTrack(dummyVideo);\n }\n localStream = stream;\n this.localRef.current.srcObject = stream;\n this.setState({localStream: stream});\n\n localStream.getTracks().forEach(track => {\n pc.addTrack(track, localStream);\n });\n\n if (dummyVideo) {\n dummyVideo.enabled = false;\n dummyVideo.stop();\n stream.removeTrack(dummyVideo);\n }\n })\n .then(_ => {\n return pc.createAnswer();\n })\n .then(answer => {\n return pc.setLocalDescription(answer);\n })\n .then(_ => {\n this.props.onSendAnswer(this.props.topic, this.props.seq, pc.localDescription.toJSON());\n this.setState({ callInitialSetupComplete: true }, _ => this.drainRemoteIceCandidatesCache());\n })\n .catch(err => { if (err !== UNMOUNTED_DURING_OFFER) { this.handleGetUserMediaError(err); } });\n }\n\n // Call disconnected by remote.\n handleRemoteHangup() {\n if (!this.state.waitingForPeer) {\n // This is live call, just hang up.\n this.handleCloseClick();\n } else {\n // This is a call which is not yet connected.\n // Stop pulse animation.\n this.setState({waitingForPeer: false});\n // Change sound and wait a bit before ending it.\n RING_SOUND.pause();\n RING_SOUND.currentTime = 0;\n CALL_ENDED_SOUND.loop = true;\n CALL_ENDED_SOUND.play().catch(_ => {});\n setTimeout(_ => {\n this.handleCloseClick();\n }, 2000);\n }\n }\n\n handleCloseClick() {\n this.stop();\n this.props.onHangup(this.props.topic, this.props.seq);\n }\n\n // Ends video track and turns off the camera. Also usable before the peer connection\n // exists yet (e.g. caller previewing/toggling their camera while waiting for pickup) --\n // in that case there is no peer to notify, so the data channel send is skipped.\n muteVideo() {\n const stream = this.state.localStream;\n const t = stream.getVideoTracks()[0];\n if (!t) {\n this.setState({videoToggleInProgress: false});\n return;\n }\n t.enabled = false;\n t.stop();\n stream.removeTrack(t);\n\n this.sendOnDataChannel(VIDEO_MUTED_EVENT);\n this.setState({videoToggleInProgress: false});\n }\n\n // Swaps in a fresh local video track (new camera, or re-enabling after mute), hot-swapping\n // the peer connection's sender if one exists, or adding one if the call never negotiated\n // video (e.g. started audio-only, or was muted before the peer connection was created --\n // handleVideoCallAccepted/handleVideoOfferMsg will pick up whatever is in localStream when\n // they run). Returns a promise that resolves once the local preview is updated.\n replaceLocalVideoTrack(track) {\n this.localRef.current.srcObject = null;\n // Drop any existing video track (e.g. the disabled placeholder from an audio-only\n // call, or the camera being switched away from) before adding the fresh one.\n this.state.localStream.getVideoTracks().forEach(old => this.state.localStream.removeTrack(old));\n this.state.localStream.addTrack(track);\n\n let result = Promise.resolve();\n if (this.state.pc) {\n const sender = this.state.pc.getSenders().find(s => s.track && s.track.kind == 'video');\n if (sender) {\n result = sender.replaceTrack(track);\n } else {\n // No video sender was ever negotiated -- add one now; triggers renegotiation.\n this.state.pc.addTrack(track, this.state.localStream);\n }\n }\n return result.then(_ => { this.localRef.current.srcObject = this.state.localStream; });\n }\n\n // Turns the camera back on. Works both before the peer connection exists (the fresh\n // track is picked up later by handleVideoCallAccepted/handleVideoOfferMsg when they add\n // all current local tracks to the new pc) and mid-call (hot-swaps or adds a sender).\n unmuteVideo() {\n navigator.mediaDevices.getUserMedia({ video: true })\n .then(stream => {\n const track = stream.getVideoTracks()[0];\n stream.removeTrack(track);\n // Same permission-prompt-outlives-the-call race as start() above -- replaceLocalVideoTrack\n // touches this.localRef.current/this.state.localStream, both invalid once unmounted.\n if (this._unmounted) {\n track.stop();\n return;\n }\n return this.replaceLocalVideoTrack(track);\n })\n .then(_ => { this.sendOnDataChannel(VIDEO_UNMUTED_EVENT); })\n .catch(err => this.handleGetUserMediaError(err))\n // Make sure we redraw the mute/unmute icons (e.g. camera -> camera_off).\n .finally(_ => { if (!this._unmounted) { this.setState({videoToggleInProgress: false}); } });\n }\n\n // Data channel exists as soon as the peer connection is created, but isn't actually usable\n // until the underlying handshake completes -- sending before then throws InvalidStateError.\n sendOnDataChannel(message) {\n if (this.state.dataChannel && this.state.dataChannel.readyState == 'open') {\n this.state.dataChannel.send(message);\n }\n }\n\n // Cycles to the next available camera (front/back on mobile, or the next webcam on desktop).\n handleSwitchCameraClick() {\n if (this.state.videoToggleInProgress || this.state.audioOnly) {\n return;\n }\n const currentTrack = this.state.localStream.getVideoTracks()[0];\n const currentDeviceId = currentTrack && currentTrack.getSettings && currentTrack.getSettings().deviceId;\n this.setState({videoToggleInProgress: true}, _ => {\n navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n const cameras = devices.filter(d => d.kind == 'videoinput');\n if (cameras.length < 2) {\n // Nothing to switch to.\n return null;\n }\n const idx = cameras.findIndex(d => d.deviceId == currentDeviceId);\n const next = cameras[(idx + 1) % cameras.length];\n return navigator.mediaDevices.getUserMedia({ video: { deviceId: { exact: next.deviceId } } });\n })\n .then(stream => {\n if (!stream) {\n return null;\n }\n const track = stream.getVideoTracks()[0];\n stream.removeTrack(track);\n // Same permission/device-enumeration-outlives-the-call race as start()/unmuteVideo().\n if (this._unmounted) {\n track.stop();\n return null;\n }\n return this.replaceLocalVideoTrack(track);\n })\n .catch(err => this.handleGetUserMediaError(err))\n .finally(_ => { if (!this._unmounted) { this.setState({videoToggleInProgress: false}); } });\n });\n }\n\n handleToggleCameraClick() {\n if (this.state.videoToggleInProgress) {\n // Toggle currently in progress.\n return;\n }\n const tracks = this.state.localStream.getVideoTracks();\n this.setState({videoToggleInProgress: true}, _ => {\n if (tracks && tracks.length > 0 && tracks[0].enabled && tracks[0].readyState == 'live') {\n this.muteVideo();\n } else {\n this.unmuteVideo();\n }\n this.setState({audioOnly: !this.state.audioOnly});\n });\n }\n\n handleToggleMicClick() {\n const stream = this.state.localStream;\n const t = stream.getAudioTracks()[0];\n t.enabled = !t.enabled;\n // Make sure we redraw the mute/unmute icons (e.g. mic -> mic_off).\n this.forceUpdate();\n }\n\n static speakerSwitchingSupported() {\n return typeof HTMLMediaElement !== 'undefined' && 'setSinkId' in HTMLMediaElement.prototype;\n }\n\n handleToggleSpeakerClick() {\n if (!CallPanel.speakerSwitchingSupported() || !this.remoteRef.current) {\n return;\n }\n const nextOn = !this.state.speakerOn;\n navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n const outputs = devices.filter(d => d.kind == 'audiooutput');\n // Best-effort: look for a device labeled as the loud speaker vs. the earpiece/default output.\n // Device labels are not standardized, so fall back to the system default sink when no match is found.\n const match = nextOn ?\n outputs.find(d => /speaker/i.test(d.label)) :\n outputs.find(d => /earpiece|receiver/i.test(d.label));\n // Same unmount race as the gUM-based methods -- enumerateDevices can still be pending\n // after the call ends. Currently silent either way (the .catch below only logs), so this\n // just avoids a pointless TypeError in the console rather than fixing a visible symptom.\n if (this._unmounted || !this.remoteRef.current) {\n return null;\n }\n return this.remoteRef.current.setSinkId(match ? match.deviceId : '');\n })\n .then(_ => { if (!this._unmounted) { this.setState({speakerOn: nextOn}); } })\n .catch(err => console.error('Failed to switch audio output device', err));\n }\n\n render() {\n const audioTracks = this.state.localStream && this.state.localStream.getAudioTracks();\n const videoTracks = !this.state.audioOnly && this.state.localStream && this.state.localStream.getVideoTracks();\n // Mic/camera/speaker only need a local stream to exist -- toggling doesn't require a\n // peer connection (e.g. caller previewing their camera while waiting for pickup).\n const disabled = !(audioTracks && audioTracks[0]);\n const micOn = !!(audioTracks && audioTracks[0] && audioTracks[0].enabled);\n const audioIcon = micOn ? 'mic' : 'mic_off';\n const videoOn = !!(videoTracks && videoTracks[0] && videoTracks[0].enabled && videoTracks[0].readyState == 'live');\n const videoIcon = videoOn ? 'videocam' : 'videocam_off';\n const speakerSupported = CallPanel.speakerSwitchingSupported();\n const speakerIcon = this.state.speakerOn ? 'volume_up' : 'volume_off';\n const peerTitle = truncateString(this.props.title, MAX_PEER_TITLE_LENGTH);\n const pulseAnimation = this.state.waitingForPeer ? ' pulse' : '';\n const connected = !!this.state.remoteStream;\n\n let remoteActive = false;\n if (this.remoteRef.current && this.remoteRef.current.srcObject && this.state.remoteVideoLive) {\n const rstream = this.remoteRef.current.srcObject;\n if (rstream.getVideoTracks().length > 0) {\n const t = rstream.getVideoTracks()[0];\n remoteActive = t.enabled && t.readyState == 'live';\n }\n }\n\n const minimizedClass = this.props.minimized ? 'minimized' : null;\n const fullScreen = this.props.minimized ? 'fullscreen' : 'fullscreen_exit';\n\n if (this.props.minimized && this.state.audioOnly) {\n // Voice calls minimize to a small pill (icon + timer), not the video-shaped box.\n return (\n // The restore button used to live inside .call-pill.draggable -- dragStart only checks\n // event.target.closest('.draggable') before calling setPointerCapture() on the whole\n // container, and once a pointer is captured, Pointer Events retargets subsequent events\n // (including the click) to the capturing element instead of the button underneath it. The\n // video-minimized layout below already keeps its own restore button as a sibling of the\n // draggable region for exactly this reason; this pill just hadn't followed the same rule.\n
正在等待对方接受邀请…
: null}\n正在等待对方接受邀请…
: null}\n