From ebac747422e0c585f5cd67e205600fb51291cb2a Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Mon, 7 Jul 2025 12:23:59 +0100 Subject: [PATCH 01/18] ios: update library --- apps/ios/SimpleX.xcodeproj/project.pbxproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index c02bfdcae5..4b68bf8acc 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -178,8 +178,8 @@ 64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; }; 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829982D54AEED006B9E89 /* libgmp.a */; }; 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829992D54AEEE006B9E89 /* libffi.a */; }; - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ-ghc9.6.3.a */; }; - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ.a */; }; + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a */; }; + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a */; }; 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */; }; 64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; }; 64D0C2C229FA57AB00B38D5F /* UserAddressLearnMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */; }; @@ -543,8 +543,8 @@ 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = ""; }; 64C829982D54AEED006B9E89 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; 64C829992D54AEEE006B9E89 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ-ghc9.6.3.a"; sourceTree = ""; }; - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ.a"; sourceTree = ""; }; + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a"; sourceTree = ""; }; + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a"; sourceTree = ""; }; 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = ""; }; 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressLearnMore.swift; sourceTree = ""; }; @@ -704,8 +704,8 @@ 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */, 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */, 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */, - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ-ghc9.6.3.a in Frameworks */, - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ.a in Frameworks */, + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a in Frameworks */, + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a in Frameworks */, CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -790,8 +790,8 @@ 64C829992D54AEEE006B9E89 /* libffi.a */, 64C829982D54AEED006B9E89 /* libgmp.a */, 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */, - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ-ghc9.6.3.a */, - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5-B9nBut3z2uE2oMf1gYzlJ.a */, + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a */, + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a */, ); path = Libraries; sourceTree = ""; From 9a48505a38ed3f7c656aba6a03372f807a0aba2d Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 7 Jul 2025 13:13:40 +0100 Subject: [PATCH 02/18] website: translations (#6047) * Translated using Weblate (Hebrew) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/he/ * Translated using Weblate (Hebrew) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/he/ --------- Co-authored-by: elid --- website/langs/he.json | 44 +++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/website/langs/he.json b/website/langs/he.json index 4a61999896..9673bea871 100644 --- a/website/langs/he.json +++ b/website/langs/he.json @@ -14,7 +14,7 @@ "terminal-cli": "ממשק שורת פקודה", "terms-and-privacy-policy": "מדיניות הפרטיות", "hero-header": "פרטיות מוגדרת מחדש", - "hero-subheader": "מערכת העברת ההודעות הראשונה
ללא מזהי שתמש", + "hero-subheader": "מערכת העברת ההודעות הראשונה
ללא מזהי משתמש", "hero-overlay-1-textlink": "מדוע מזהי משתמש מזיקים לפרטיות?", "hero-overlay-2-textlink": "איך SimpleX עובד?", "hero-2-header": "יצירת חיבור פרטי", @@ -35,7 +35,7 @@ "simplex-private-card-3-point-2": "טביעת אצבע של שרת ואיגוד ערוצים מונעים התקפת אדם בתווך (MITM) והתקפת שליחה מחדש (Replay attack).", "simplex-private-card-5-point-1": "SimpleX משתמש בריווח התוכן עבור כל שכבת הצפנה כדי לסכל התקפות על גודל הודעה.", "simplex-private-card-5-point-2": "זה גורם להודעות בגדלים שונים להיראות זהים לשרתים ולמשקיפים ברשת.", - "simplex-private-card-6-point-1": "פלטפורמות תקשורת רבות חשופות להתקפות אדם בתווך (MITM) על ידי שרתים או ספקי רשת.", + "simplex-private-card-6-point-1": "רשתות תקשורת רבות פגיעות להתקפות MITM על ידי שרתים או ספקי רשת.", "simplex-private-card-9-point-2": "זה מפחית את וקטורי ההתקפה, בהשוואה למתווכי הודעות מסורתיים, ואת המטא-נתונים הזמינים.", "simplex-private-card-10-point-2": "זה מאפשר להעביר הודעות ללא מזהי פרופיל משתמש, ומספק פרטיות מטא-נתונים טובה יותר מאשר חלופות אחרות.", "privacy-matters-1-title": "פרסום ואפליית מחירים", @@ -45,7 +45,7 @@ "privacy-matters-3-overlay-1-title": "פרטיות מגנה על החופש שלכם", "simplex-explained-tab-3-text": "3. מה השרתים רואים", "simplex-explained-tab-2-p-1": "עבור כל חיבור, שני תורי העברת הודעות נפרדים משמשים לשליחה וקבלה של הודעות דרך שרתים שונים.", - "simplex-explained-tab-2-p-2": "שרתים מעבירים הודעות רק בכיוון אחד, מבלי לקבל את התמונה המלאה של השיחה או החיבורים של המשתמש.", + "simplex-explained-tab-2-p-2": "שרתים מעבירים הודעות רק בכיוון אחד, מבלי לקבל את התמונה המלאה של השיחות או החיבורים של המשתמש.", "simplex-explained-tab-3-p-1": "לשרתים יש אישורים אנונימיים נפרדים לכל תור, ואינם יודעים לאילו משתמשים הם שייכים.", "simplex-explained-tab-1-p-2": "איך זה יכול לעבוד עם תורים חד-כיווניים וללא מזהי פרופיל משתמש?", "simplex-explained-tab-3-p-2": "משתמשים יכולים לשפר עוד יותר את פרטיות המטא-נתונים על ידי שימוש ב- Tor כדי לגשת לשרתים, ולמנוע קורלציה לפי כתובת IP.", @@ -92,7 +92,7 @@ "hero-overlay-card-2-p-1": "כאשר למשתמשים יש זהויות מתמשכות, גם אם זה רק מספר אקראי, כמו מזהה הפעלה, קיים סיכון שהספק או התוקף יוכלו לראות כיצד המשתמשים מחוברים וכמה הודעות הם שולחים.", "hero-overlay-card-1-p-5": "רק מכשירי לקוח מאחסנים פרופילי משתמשים, אנשי קשר וקבוצות; ההודעות נשלחות עם הצפנה דו-שכבתית מקצה לקצה.", "privacy-matters-overlay-card-1-p-2": "קמעונאים מקוונים יודעים שאנשים עם הכנסה נמוכה יותר נוטים יותר לבצע רכישות דחופות, ולכן הם עשויים לגבות מחירים גבוהים יותר או להסיר הנחות.", - "hero-overlay-card-1-p-2": "כדי להעביר הודעות, במקום מזהי משתמש המשמשים את כל הפלטפורמות האחרות, SimpleX משתמש במזהים אנונימיים זמניים זוגיים של תורי הודעות, נפרדים עבור כל אחד מהחיבורים שלך — אין מזהים לטווח ארוך.", + "hero-overlay-card-1-p-2": "כדי להעביר הודעות, במקום מזהי משתמש המשמשים את כל הרשתות האחרות, SimpleX משתמש במזהים זמניים אנונימיים של תורי הודעות, נפרדים לכל אחד מהחיבורים שלך - אין מזהים ארוכי טווח.", "hero-overlay-card-2-p-2": "לאחר מכן הם יוכלו לקשר מידע זה עם הרשתות החברתיות הציבוריות הקיימות, ולקבוע כמה זהויות אמיתיות.", "privacy-matters-overlay-card-1-p-3": "חלק מחברות פיננסיות וביטוח משתמשות בגרפים חברתיים כדי לקבוע שיעורי ריבית ופרמיות. לעתים קרובות זה גורם לאנשים עם הכנסה נמוכה יותר לשלם יותר — זה ידוע בתור 'פרמיית עוני'.", "hero-overlay-card-1-p-4": "עיצוב זה מונע דליפה כלשהי של משתמשים' מטא נתונים ברמת האפליקציה. כדי לשפר עוד יותר את הפרטיות ולהגן על כתובת ה-IP שלך, תוכל להתחבר לשרתי הודעות באמצעות Tor.", @@ -117,11 +117,11 @@ "tap-to-close": "הקישו כדי לסגור", "simplex-unique-card-4-p-2": "אתם יכולים להשתמש ב-SimpleX עם השרתים שלכם או עם השרתים שסופקו על ידינו — ועדיין להתחבר לכל משתמש.", "comparison-point-4-text": "רשת בודדת או מרכזית", - "privacy-matters-overlay-card-2-p-2": "כדי להיות אובייקטיבי ולקבל החלטות עצמאיות אתם צריכים להיות בשליטה על מרחב המידע שלכם. זה אפשרי רק אם אתם משתמשים בפלטפורמת תקשורת פרטית שאין לה גישה לגרף החברתי שלכם.", - "simplex-unique-overlay-card-4-p-1": "אתם יכולים להשתמש ב-SimpleX עם השרתים שלכם ועדיין לתקשר עם אנשים שמשתמשים בשרתים המוגדרים מראש שסופקו על ידינו.", + "privacy-matters-overlay-card-2-p-2": "כדי להיות אובייקטיבי ולקבל החלטות עצמאיות, עליך לשלוט במרחב המידע שלך. זה אפשרי רק אם אתה משתמש ברשת תקשורת פרטית שאין לה גישה לגרף החברתי שלך.", + "simplex-unique-overlay-card-4-p-1": "ניתן להשתמש ב-SimpleX עם השרתים שלכם ועדיין לתקשר עם אנשים המשתמשים בשרתים שתצורתם נקבעה מראש באפליקציות.", "simplex-chat-for-the-terminal": "SimpleX Chat עבור מסוף שורת הפקודה", "simplex-network-overlay-card-1-li-3": "P2P אינו פותר את בעיית התקפת MITM, ורוב ההטמעות הקיימות אינן משתמשות בהודעות out-of-band עבור החלפת המפתחות הראשונית. SimpleX משתמש בהודעות out-of-band או, במקרים מסוימים, בחיבורים מאובטחים ומהימנים קיימים מראש לצורך החלפת המפתחות הראשונית.", - "the-instructions--source-code": "ההוראות כיצד להוריד או לקמפל אותו מקוד המקור.", + "the-instructions--source-code": "לקבלת ההוראות כיצד להוריד או לקמפל אותו מקוד המקור.", "simplex-network-section-desc": "Simplex Chat מספק את הפרטיות הטובה ביותר על ידי שילוב היתרונות של P2P ורשתות מאוחדות.", "privacy-matters-section-subheader": "שמירה על פרטיות המטא נתונים שלכם — עם מי אתם מדברים — מגנה עליכם מפני:", "if-you-already-installed": "אם כבר התקנתם", @@ -151,48 +151,48 @@ "simplex-unique-card-3-p-1": "SimpleX מאחסן את כל נתוני המשתמש במכשירי הלקוח בפורמט מסד נתונים מוצפן נייד — ניתן להעביר אותו למכשיר אחר.", "contact-hero-p-3": "השתמשו בקישורים למטה כדי להוריד את האפליקציה.", "simplex-network-1-desc": "כל ההודעות נשלחות דרך השרתים, שמספקים פרטיות טובה יותר של מטא נתונים וגם מסירת הודעות אסינכרונית אמינה, תוך הימנעות מהרבה", - "simplex-unique-overlay-card-1-p-2": "על מנת להעביר הודעות SimpleX משתמש בכתובות אנונימיות בזוגות של תורי הודעות חד-כיווניים, נפרדים עבור הודעות שהתקבלו ונשלחו, בדרך כלל דרך שרתים שונים . השימוש ב-SimpleX דומה לשימוש בדוא\"ל או טלפון ”חד-פעמי“ עבור כל איש קשר, וללא טרחה לנהל אותם.", + "simplex-unique-overlay-card-1-p-2": "כדי להעביר הודעות, SimpleX משתמשת ב-כתובות אנונימיות זוגיות של תורי הודעות חד-כיווניים, נפרדים להודעות נכנסות ויוצאות, בדרך כלל דרך שרתים שונים.", "simplex-unique-overlay-card-3-p-4": "אין מזהים או טקסט מוצפן משותף בין תעבורת שרת שנשלחה ומתקבלת — אם מישהו צופה בזה, הם לא יכולים לקבוע בקלות מי מתקשר עם מי, גם אם ה-TLS נפרץ.", "get-simplex": "הורידו את אפליקציית שולחן העבודה SimpleX", "privacy-matters-overlay-card-3-p-1": "לכולם צריך להיות אכפת מהפרטיות והאבטחה של התקשורת שלהם — שיחות לא מזיקות עלולות להעמיד אתכם בסכנה, גם אם אין לכם מה להסתיר.", - "simplex-unique-overlay-card-4-p-3": "אם אתם שוקלים לפתח עבור פלטפורמת SimpleX, למשל, את הצ'אט בוט עבור משתמשי אפליקציית SimpleX, או שילוב של ספריית SimpleX Chat באפליקציות לנייד שלכם, אנא צרו קשר לכל עצה ותמיכה.", + "simplex-unique-overlay-card-4-p-3": "אם אתם שוקלים לפתח עבור רשת SimpleX, למשל, את הצ'אט בוט עבור משתמשי אפליקציית SimpleX, או שילוב של ספריית SimpleX Chat באפליקציות לנייד שלכם, אנא צרו קשר לכל עצה ותמיכה.", "simplex-network-3-header": "רשת SimpleX", - "simplex-unique-card-2-p-1": "מכיוון שאין לכם מזהה או כתובת קבועה בפלטפורמת SimpleX, אף אחד לא יכול ליצור איתכם קשר אלא אם כן אתם חולקים כתובת משתמש חד פעמית או זמנית, כקוד QR או קישור.", + "simplex-unique-card-2-p-1": "מכיוון שאין לך מזהה או כתובת קבועה ברשת SimpleX, אף אחד לא יכול ליצור איתך קשר אלא אם כן אתה משתף כתובת משתמש חד-פעמית או זמנית, כקוד QR או קישור.", "join-the-REDDIT-community": "הצטרפו לקהילת REDDIT", "privacy-matters-overlay-card-3-p-3": "אנשים רגילים נעצרים על מה שהם משתפים באינטרנט, אפילו דרך החשבונות ה'אנונימיים' שלהם, אפילו במדינות דמוקרטיות.", "simplex-unique-overlay-card-3-p-2": "ההודעות המוצפנות מקצה לקצה מוחזקות באופן זמני בשרתי ממסר של SimpleX עד שמתקבלות, ואז הן נמחקות לצמיתות.", - "simplex-unique-overlay-card-4-p-2": "פלטפורמת SimpleX משתמשת בפרוטוקול פתוח ומספקת SDK ליצירת צ'אט בוטים, המאפשר הטמעה של שירותים שמשתמשים יכולים לתקשר איתם באמצעות אפליקציות SimpleX Chat — אנחנו ממש מצפים לראות אילו שירותי SimpleX אתם יכולים לבנות.", + "simplex-unique-overlay-card-4-p-2": "רשת SimpleX משתמשת בפרוטוקול פתוח ומספקת SDK ליצירת צ'אט בוטים, המאפשר הטמעה של שירותים שמשתמשים יכולים לתקשר איתם באמצעות אפליקציות SimpleX Chat — אנחנו ממש מצפים לראות אילו שירותי SimpleX אתם יכולים לבנות.", "contact-hero-p-2": "עדיין לא הורדתם את ה-SimpleX Chat?", "why-simplex-is-unique": "מדוע SimpleX הוא ייחודי", "simplex-network-section-header": "רשת SimpleX", "tap-the-connect-button-in-the-app": "הקישו על הלחצן 'התחבר' באפליקציה", "simplex-network-1-overlay-linktext": "בעיות של רשתות P2P", "protocol-2-text": "XMPP, Matrix", - "simplex-network-overlay-card-1-li-4": "יישומי P2P יכולים להיחסם על ידי ספקי אינטרנט מסוימים (כמו BitTorrent). SimpleX הוא אגנוסטי לתעבורה - הוא יכול לעבוד על פרוטוקולי אינטרנט סטנדרטיים, למשל WebSockets.", + "simplex-network-overlay-card-1-li-4": "יישומי P2P עלולים להיחסם על ידי ספקי אינטרנט מסוימים (כמו BitTorrent). SimpleX אינו תלוי בתעבורה - הוא יכול לעבוד על פרוטוקולי אינטרנט סטנדרטיים, למשל WebSockets.", "privacy-matters-overlay-card-2-p-1": "לפני זמן לא רב ראינו את הבחירות הראשיות שעברו מניפולציות על ידי חברת ייעוץ מכובדת שהשתמשה בגרפים החברתיים שלנו כדי לעוות את השקפתנו על העולם האמיתי ולתמרן את ההצבעות שלנו.", - "privacy-matters-overlay-card-2-p-3": "SimpleX היא הפלטפורמה הראשונה שאין לה מזהי משתמש על פי עיצובה , בדרך זו מגינה על גרף החיבורים שלך טוב יותר מכל חלופה ידועה.", + "privacy-matters-overlay-card-2-p-3": "SimpleX היא הרשת הראשונה שאין לה מזהי משתמש מטבעה, ובכך מגינה על גרף החיבורים שלך טוב יותר מכל חלופה מוכרת.", "learn-more": "למדו עוד", "scan-qr-code-from-mobile-app": "סרקו קוד QR באפליקציה לנייד", "more-info": "עוד מידע", "protocol-1-text": "Signal, פלטפורמות גדולות", "simplex-network-overlay-card-1-li-6": "רשתות P2P עשויות להיות פגיעות להתקפת DRDoS , כאשר הלקוחות יכולים לשדר מחדש ולהגביר את התעבורה, וכתוצאה מכך מניעת שירות בכל הרשת. לקוחות SimpleX מעבירים רק תעבורה מחיבור ידוע ואינם יכולים להיות בשימוש על ידי תוקף כדי להגביר את התעבורה בכל הרשת.", "if-you-already-installed-simplex-chat-for-the-terminal": "אם כבר התקנתם את SimpleX Chat עבור מסוף שורת הפקודה", - "simplex-unique-overlay-card-2-p-1": "מכיוון שבפלטפורמת SimpleX אין לכם מזהים, אף אחד לא יכול ליצור איתכם קשר אלא אם כן אתם משתפים כתובת משתמש חד פעמית או זמנית, כקוד QR או קישור.", + "simplex-unique-overlay-card-2-p-1": "מכיוון שברשת SimpleX אין לכם מזהים, אף אחד לא יכול ליצור איתכם קשר אלא אם כן אתם משתפים כתובת משתמש חד פעמית או זמנית, כקוד QR או קישור.", "sign-up-to-receive-our-updates": "הירשמו כדי לקבל את העדכונים שלנו", "simplex-private-section-header": "מה הופך את SimpleX לפרטי", "we-invite-you-to-join-the-conversation": "אנו מזמינים אתכם להצטרף לשיחה", - "simplex-unique-overlay-card-1-p-3": "עיצוב זה מגן על הפרטיות של מי שאתה מתקשר איתו, מסתיר אותה משרתי פלטפורמת SimpleX ומכל צופה. כדי להסתיר את כתובת ה-IP שלך מהשרתים, אתה יכוללהתחבר לשרתי SimpleX באמצעות Tor.", + "simplex-unique-overlay-card-1-p-3": "עיצוב זה מגן על הפרטיות של מי שאתה מתקשר איתו, מסתיר אותה משרתי רשת SimpleX ומכל צופה. כדי להסתיר את כתובת ה-IP שלך מהשרתים, אתה יכוללהתחבר לשרתי SimpleX באמצעות Tor.", "privacy-matters-section-label": "ודאו שהמסנג'ר שלכם לא יכול לגשת לנתונים שלכם!", "simplex-unique-overlay-card-3-p-1": "SimpleX Chat מאחסן את כל נתוני המשתמש רק במכשירי הלקוח באמצעות פורמט מסד נתונים מוצפן נייד שניתן לייצא ולהעביר לכל מכשיר נתמך.", "simplex-network-3-desc": "השרתים מספקים תורים חד-כיווניים לחיבור המשתמשים, אך הם לא יכול לראות את גרף חיבור הרשת — רק המשתמשים יכולים לראות זאת.", - "simplex-unique-card-1-p-1": "SimpleX מגן על פרטיות הפרופיל, אנשי הקשר והמטא נתונים שלכם, מסתיר אותם משרתי פלטפורמת SimpleX ומכל משקיף.", - "simplex-unique-card-4-p-1": "רשת SimpleX מבוזרת לחלוטין ובלתי תלויה במטבעות קריפטוגרפיים כלשהם או כל פלטפורמה אחרת, מלבד האינטרנט.", + "simplex-unique-card-1-p-1": "SimpleX מגן על פרטיות הפרופיל, אנשי הקשר והמטא נתונים שלכם, מסתיר אותם משרתי רשת SimpleX ומכל צופה.", + "simplex-unique-card-4-p-1": "רשת SimpleX מבוזרת לחלוטין ואינה תלויה בכל מטבע קריפטוגרפי או בכל רשת אחרת, מלבד האינטרנט.", "guide-dropdown-5": "ניהול נתונים", "no-federated": "לא - פדרלית", - "comparison-section-list-point-6": "למרות ש-P2P מופץ, הוא אינו פדרלי - הוא פועל כרשת אחת", + "comparison-section-list-point-6": "בעוד שרשתות עמית לעמית (P2P) מבוזרות, הן אינן מאוחדות (פדרטיביות) — הן פועלות כרשת יחידה", "guide-dropdown-9": "יצירת קשרים", "comparison-section-list-point-7": "לרשתות P2P יש רשות מרכזית או שכל הרשת יכולה להיפגע", - "docs-dropdown-1": "פלטפורמת SimpleX", + "docs-dropdown-1": "רשת SimpleX", "simplex-private-card-6-point-2": "כדי למנוע זאת, אפליקציות SimpleX מעבירות מפתחות חד-פעמיים מחוץ לפס, כאשר אתם משתפים כתובת כקישור או כקוד QR.", "no": "לא", "no-secure": "לא - מאובטח", @@ -204,7 +204,7 @@ "guide-dropdown-8": "הגדרות אפליקציה", "comparison-section-list-point-1": "בדרך כלל מבוססת על מספר טלפון, במקרים מסוימים על שמות משתמש", "comparison-point-5-text": "רכיב מרכזי או מתקפת רשת רחבה", - "simplex-unique-card-1-p-2": "בניגוד לכל פלטפורמת הודעות קיימת אחרת, ל- SimpleX אין מזהים שהוקצו למשתמשים — אפילו לא מספרים אקראיים.", + "simplex-unique-card-1-p-2": "בניגוד לכל רשת הודעות קיימת אחרת, ל-SimpleX אין מזהים המשויכים למשתמשים — אפילו לא מספרים אקראיים.", "guide-dropdown-2": "שליחת הודעות", "simplex-network-overlay-card-1-li-5": "כל רשתות ה-P2P המוכרות עשויות להיות פגיעות להתקפת Sybil, מכיוון שכל צומת ניתן לגילוי, והרשת פועלת כמכלול. אמצעים ידועים כדי למתן את זה דורשים רכיב ריכוזי או מערכת הוכחת עבודה יקרה. לרשת SimpleX אין יכולת גילוי של שרת, היא מפוצלת ופועלת כמספר תת-רשתות מבודדות, מה שהופך התקפות ברחבי הרשת לבלתי אפשריות.", "guide-dropdown-4": "פרופילי צ'אט", @@ -222,9 +222,9 @@ "simplex-private-card-1-point-1": "פרוטוקול ראצ'ט כפול —
העברת הודעות OTR עם סודיות מושלמת קדימה ושחזור פריצה.", "simplex-private-card-8-point-1": "שרתי SimpleX פועלים כצמתי ערבוב עם זמן השהיה נמוך — להודעות הנכנסות והיוצאות יש סדר שונה.", "guide-dropdown-1": "התחלה מהירה", - "privacy-matters-overlay-card-1-p-4": "פלטפורמת SimpleX מגנה על פרטיות החיבורים שלכם טוב יותר מכל חלופה, ומונעת באופן מלא את הפיכת הגרף החברתי להיות זמין לחברות או ארגונים כלשהם. גם כאשר אנשים משתמשים בשרתים המסופקים על ידי SimpleX Chat, איננו יודעים את מספר המשתמשים או החיבורים שלהם.", + "privacy-matters-overlay-card-1-p-4": "רשת SimpleX מגנה על פרטיות החיבורים שלך טוב יותר מכל אלטרנטיבה, ומונעת לחלוטין את זמינות הגרף החברתי שלך לחברות או ארגונים. אפילו כאשר אנשים משתמשים בשרתים שתצורתם נקבעה מראש באפליקציות SimpleX Chat, מפעילי השרת אינם יודעים את מספר המשתמשים או את החיבורים שלהם.", "simplex-network-overlay-card-1-li-1": "רשתות P2P מסתמכות על גרסה כלשהי של DHT כדי לנתב הודעות. עיצובי DHT צריכים לאזן בין אחריות מסירה לבין זמן השהיה. ל- SimpleX יש גם אחריות מסירה טובה יותר וגם השהיה נמוכה יותר מאשר P2P, מכיוון שניתן להעביר את ההודעה כיתירות דרך מספר שרתים במקביל, באמצעות השרתים שנבחרו על ידי הנמען. ברשתות P2P ההודעה מועברת דרך O(log N) צמתים ברצף, תוך שימוש בצמתים שנבחרו על ידי האלגוריתם.", - "simplex-unique-overlay-card-1-p-1": "בניגוד לפלטפורמות הודעות אחרות, ל- SimpleX אין מזהים שהוקצו למשתמשים. הוא אינו מסתמך על מספרי טלפון, כתובות מבוססות דומיין (כמו דואר אלקטרוני או XMPP), שמות משתמש, מפתחות ציבוריים או אפילו מספרים אקראיים כדי לזהות את המשתמשים שלו — אנחנו לא יודעים כמה אנשים משתמשים בשרתי SimpleX שלנו.", + "simplex-unique-overlay-card-1-p-1": "בניגוד לרשתות הודעות אחרות, ב-SimpleX אין מזהים המשויכים למשתמשים. אנחנו לא מסתמכים על מספרי טלפון, כתובות מבוססות דומיין (כמו אימייל או XMPP), שמות משתמש, מפתחות ציבוריים או אפילו מספרים אקראיים כדי לזהות את המשתמשים שלנו — מפעילי שרתי SimpleX אינם יודעים כמה אנשים משתמשים בשרתים שלהם.", "docs-dropdown-5": "כיצד לארח שרת XFTP", "docs-dropdown-3": "כיצד לגשת למסד הנתונים של צ'אט", "on-this-page": "בעמוד זה", From 54503ade246feb182b6f366bdae2a13c1c07148a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 7 Jul 2025 13:15:03 +0100 Subject: [PATCH 03/18] ui: translations (#6046) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translated using Weblate (German) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Italian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Hebrew) Currently translated at 86.8% (2088 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/he/ * Translated using Weblate (Hebrew) Currently translated at 32.0% (667 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/he/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 97.9% (2356 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Portuguese) Currently translated at 39.4% (949 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt/ * Translated using Weblate (Hebrew) Currently translated at 86.8% (2089 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/he/ * Translated using Weblate (Hebrew) Currently translated at 32.1% (670 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/he/ * Translated using Weblate (Vietnamese) Currently translated at 99.6% (2396 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/vi/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * Translated using Weblate (Vietnamese) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/vi/ * Translated using Weblate (Turkish) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Japanese) Currently translated at 81.5% (1961 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ja/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Persian) Currently translated at 78.5% (1890 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ * Translated using Weblate (Hindi) Currently translated at 11.4% (280 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hi/ * Translated using Weblate (Malayalam) Currently translated at 16.7% (409 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ml/ * Translated using Weblate (Polish) Currently translated at 87.2% (2125 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (German) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Italian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Persian) Currently translated at 77.4% (1886 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Polish) Currently translated at 87.2% (2125 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/ * Translated using Weblate (Romanian) Currently translated at 98.6% (2403 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Romanian) Currently translated at 98.6% (2403 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Romanian) Currently translated at 98.6% (2403 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (German) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Polish) Currently translated at 87.4% (2130 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/ * Translated using Weblate (German) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Italian) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2108 of 2108 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2108 of 2108 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Catalan) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ca/ * Translated using Weblate (Catalan) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ca/ * Translated using Weblate (Catalan) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ca/ * Translated using Weblate (Catalan) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ca/ * Translated using Weblate (German) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2108 of 2108 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Romanian) Currently translated at 98.6% (2403 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2108 of 2108 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2108 of 2108 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (German) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Italian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Hebrew) Currently translated at 86.8% (2088 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/he/ * Translated using Weblate (Hebrew) Currently translated at 32.0% (667 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/he/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 97.9% (2356 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/ * Translated using Weblate (Portuguese) Currently translated at 39.4% (949 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pt/ * Translated using Weblate (Hebrew) Currently translated at 86.8% (2089 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/he/ * Translated using Weblate (Hebrew) Currently translated at 32.1% (670 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/he/ * Translated using Weblate (Vietnamese) Currently translated at 99.6% (2396 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/vi/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * Translated using Weblate (Vietnamese) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/vi/ * Translated using Weblate (Turkish) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Japanese) Currently translated at 81.5% (1961 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ja/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Persian) Currently translated at 78.5% (1890 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Romanian) Currently translated at 100.0% (2405 of 2405 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2083 of 2083 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ * Translated using Weblate (Hindi) Currently translated at 11.4% (280 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hi/ * Translated using Weblate (Malayalam) Currently translated at 16.7% (409 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ml/ * Translated using Weblate (Polish) Currently translated at 87.2% (2125 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (German) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Italian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Persian) Currently translated at 77.4% (1886 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Polish) Currently translated at 87.2% (2125 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/ * Translated using Weblate (Romanian) Currently translated at 98.6% (2403 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Romanian) Currently translated at 98.6% (2403 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Romanian) Currently translated at 98.6% (2403 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (German) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2435 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Polish) Currently translated at 87.4% (2130 of 2435 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/pl/ * Translated using Weblate (German) Currently translated at 100.0% (2106 of 2106 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Italian) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2108 of 2108 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2108 of 2108 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Catalan) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ca/ * Translated using Weblate (Catalan) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ca/ * Translated using Weblate (Catalan) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ca/ * Translated using Weblate (Catalan) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ca/ * Translated using Weblate (German) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2108 of 2108 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2437 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Romanian) Currently translated at 98.6% (2403 of 2437 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ro/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2108 of 2108 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2108 of 2108 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * process localizations --------- Co-authored-by: mlanp Co-authored-by: Raphael Das Gupta Co-authored-by: Random Co-authored-by: elid Co-authored-by: summoner001 Co-authored-by: Fernando Figaro Co-authored-by: tuananh-ng <158744840+tuananh-ng@users.noreply.github.com> Co-authored-by: No name Co-authored-by: U.S <86528784+usnetim@users.noreply.github.com> Co-authored-by: NicolaeFericitu Co-authored-by: Miyu Sakatsuki Co-authored-by: jonnysemon Co-authored-by: Ghost of Sparta Co-authored-by: Ar Co-authored-by: Hosted Weblate Co-authored-by: Deleted User Co-authored-by: Raman Co-authored-by: paboum Co-authored-by: 大王叫我来巡山 Co-authored-by: firmfox Co-authored-by: TheFirstMonster Co-authored-by: fran secs --- apps/ios/Shared/Model/SimpleXAPI.swift | 2 +- .../bg.xcloc/Localized Contents/bg.xliff | 32 +- .../cs.xcloc/Localized Contents/cs.xliff | 32 +- .../de.xcloc/Localized Contents/de.xliff | 67 +- .../en.xcloc/Localized Contents/en.xliff | 38 +- .../es.xcloc/Localized Contents/es.xliff | 37 +- .../fi.xcloc/Localized Contents/fi.xliff | 32 +- .../fr.xcloc/Localized Contents/fr.xliff | 32 +- .../he.xcloc/Localized Contents/he.xliff | 112 ++- .../hu.xcloc/Localized Contents/hu.xliff | 181 +++-- .../it.xcloc/Localized Contents/it.xliff | 65 +- .../ja.xcloc/Localized Contents/ja.xliff | 32 +- .../nl.xcloc/Localized Contents/nl.xliff | 32 +- .../pl.xcloc/Localized Contents/pl.xliff | 32 +- .../ru.xcloc/Localized Contents/ru.xliff | 32 +- .../th.xcloc/Localized Contents/th.xliff | 32 +- .../tr.xcloc/Localized Contents/tr.xliff | 32 +- .../uk.xcloc/Localized Contents/uk.xliff | 32 +- .../Localized Contents/zh-Hans.xliff | 32 +- apps/ios/bg.lproj/Localizable.strings | 33 +- apps/ios/cs.lproj/Localizable.strings | 25 +- apps/ios/de.lproj/Localizable.strings | 140 +++- apps/ios/es.lproj/Localizable.strings | 56 +- apps/ios/fi.lproj/Localizable.strings | 22 +- apps/ios/fr.lproj/Localizable.strings | 41 +- apps/ios/hu.lproj/Localizable.strings | 250 ++++--- apps/ios/it.lproj/Localizable.strings | 138 +++- apps/ios/ja.lproj/Localizable.strings | 22 +- apps/ios/nl.lproj/Localizable.strings | 41 +- apps/ios/pl.lproj/Localizable.strings | 41 +- apps/ios/ru.lproj/Localizable.strings | 43 +- apps/ios/th.lproj/Localizable.strings | 22 +- apps/ios/tr.lproj/Localizable.strings | 41 +- apps/ios/uk.lproj/Localizable.strings | 41 +- apps/ios/zh-Hans.lproj/Localizable.strings | 39 +- .../commonMain/resources/MR/ar/strings.xml | 213 +++--- .../commonMain/resources/MR/ca/strings.xml | 41 +- .../commonMain/resources/MR/de/strings.xml | 41 +- .../commonMain/resources/MR/fa/strings.xml | 105 ++- .../commonMain/resources/MR/hi/strings.xml | 2 +- .../commonMain/resources/MR/hu/strings.xml | 181 +++-- .../commonMain/resources/MR/it/strings.xml | 45 +- .../commonMain/resources/MR/iw/strings.xml | 77 ++- .../commonMain/resources/MR/ja/strings.xml | 8 +- .../commonMain/resources/MR/ml/strings.xml | 2 +- .../commonMain/resources/MR/pl/strings.xml | 11 +- .../resources/MR/pt-rBR/strings.xml | 14 +- .../commonMain/resources/MR/pt/strings.xml | 4 + .../commonMain/resources/MR/ro/strings.xml | 653 +++++++++--------- .../commonMain/resources/MR/tr/strings.xml | 139 +++- .../commonMain/resources/MR/vi/strings.xml | 53 +- .../resources/MR/zh-rCN/strings.xml | 41 +- 52 files changed, 2414 insertions(+), 1097 deletions(-) diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 5e926a9392..d9cd2a0dc6 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -205,7 +205,7 @@ func proxyErrorAlertMessage(_ addr: String) -> String { } func proxyDestinationErrorAlertMessage(proxyServer: String, destServer: String) -> String { - String.localizedStringWithFormat(NSLocalizedString("Forwarding server %1$@ failed to connect to destination server %2$@. Please try later.", comment: "alert message"), serverHostname(proxyServer), serverHostname(destServer)) + String.localizedStringWithFormat(NSLocalizedString("Forwarding server %@ failed to connect to destination server %@. Please try later.", comment: "alert message"), serverHostname(proxyServer), serverHostname(destServer)) } @inline(__always) diff --git a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff index a36ca4472a..5aff4e8c37 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -1880,7 +1880,7 @@ This is your own one-time link! Connection error Грешка при свързване - No comment provided by engineer. + alert title Connection error (AUTH) @@ -1921,7 +1921,7 @@ This is your own one-time link! Connection timeout Времето на изчакване за установяване на връзката изтече - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3090,7 +3090,7 @@ chat item action Error connecting to forwarding server %@. Please try later. - No comment provided by engineer. + alert message Error creating address @@ -3707,8 +3707,8 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. - No comment provided by engineer. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. + alert message Forwarding server address is incompatible with network settings: %@. @@ -5121,6 +5121,10 @@ This is your link for group %@! Няма разрешение за запис на гласово съобщение No comment provided by engineer. + + No private routing session + alert title + No push server Локално @@ -5571,7 +5575,7 @@ Please share any other issues with the developers. Please check your network connection with %@ and try again. Моля, проверете мрежовата си връзка с %@ и опитайте отново. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -5733,7 +5737,11 @@ Error: %@ Private routing error - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -5836,6 +5844,10 @@ Enable in *Network & servers* settings. Защитете чат профилите с парола! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Време за изчакване на протокола @@ -6256,7 +6268,7 @@ swipe action Retry Опитай отново - No comment provided by engineer. + alert action Reveal @@ -7290,6 +7302,10 @@ report reason TCP connection No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout Времето на изчакване за установяване на TCP връзка diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index a8c5abae88..8d4b87d7d2 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -1788,7 +1788,7 @@ This is your own one-time link! Connection error Chyba připojení - No comment provided by engineer. + alert title Connection error (AUTH) @@ -1828,7 +1828,7 @@ This is your own one-time link! Connection timeout Časový limit připojení - No comment provided by engineer. + alert title Connection with desktop stopped @@ -2966,7 +2966,7 @@ chat item action Error connecting to forwarding server %@. Please try later. - No comment provided by engineer. + alert message Error creating address @@ -3566,8 +3566,8 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. - No comment provided by engineer. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. + alert message Forwarding server address is incompatible with network settings: %@. @@ -4934,6 +4934,10 @@ This is your link for group %@! Nemáte oprávnění nahrávat hlasové zprávy No comment provided by engineer. + + No private routing session + alert title + No push server Místní @@ -5369,7 +5373,7 @@ Please share any other issues with the developers. Please check your network connection with %@ and try again. Zkontrolujte síťové připojení pomocí %@ a zkuste to znovu. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -5527,7 +5531,11 @@ Error: %@ Private routing error - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -5628,6 +5636,10 @@ Enable in *Network & servers* settings. Chraňte své chat profily heslem! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Časový limit protokolu @@ -6039,7 +6051,7 @@ swipe action Retry - No comment provided by engineer. + alert action Reveal @@ -7053,6 +7065,10 @@ report reason TCP connection No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout Časový limit připojení TCP diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index a9c28f9154..2e486db78d 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -588,6 +588,7 @@ swipe action Accept contact request + Kontaktanfrage akzeptieren alert title @@ -648,6 +649,7 @@ swipe action Add message + Nachricht hinzufügen placeholder for sending contact request @@ -667,6 +669,7 @@ swipe action Add short link + Verkürzten Link hinzufügen No comment provided by engineer. @@ -1301,7 +1304,7 @@ swipe action Blur media - Medium verpixeln + Medien verpixeln No comment provided by engineer. @@ -1395,6 +1398,7 @@ swipe action Can't change profile + Änderung des Profils nicht möglich alert title @@ -1962,7 +1966,7 @@ Das ist Ihr eigener Einmal-Link! Connection error Verbindungsfehler - No comment provided by engineer. + alert title Connection error (AUTH) @@ -2009,7 +2013,7 @@ Das ist Ihr eigener Einmal-Link! Connection timeout Verbindungszeitüberschreitung - No comment provided by engineer. + alert title Connection with desktop stopped @@ -2943,6 +2947,7 @@ chat item action Empty message! + Leere Nachricht! No comment provided by engineer. @@ -3187,6 +3192,7 @@ chat item action Error adding address short link + Fehler beim Hinzufügen eines verkürzten Adresslinks No comment provided by engineer. @@ -3201,6 +3207,7 @@ chat item action Error adding short link + Fehler beim Hinzufügen eines verkürzten Links No comment provided by engineer. @@ -3210,6 +3217,7 @@ chat item action Error changing chat profile + Fehler beim Wechseln des Chat-Profils alert title @@ -3240,7 +3248,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Fehler beim Verbinden mit dem Weiterleitungsserver %@. Bitte versuchen Sie es später erneut. - No comment provided by engineer. + alert message Error creating address @@ -3384,10 +3392,12 @@ chat item action Error preparing contact + Fehler bei der Kontaktaufnahme No comment provided by engineer. Error preparing group + Fehler beim Vorbereiten der Gruppe No comment provided by engineer. @@ -3412,6 +3422,7 @@ chat item action Error rejecting contact request + Fehler bei der Ablehnung der Kontaktanfrage alert title @@ -3901,9 +3912,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. Weiterleitungsserver %@ konnte sich nicht mit dem Zielserver %@ verbinden. Bitte versuchen Sie es später erneut. - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -4066,6 +4077,7 @@ Fehler: %2$@ Group profile was changed. If you save it, the updated profile will be sent to group members. + Das Gruppenprofil wurde geändert. Wenn Sie es speichern, wird das aktualisierte Profil an die Gruppenmitglieder gesendet. alert message @@ -4997,6 +5009,7 @@ Das ist Ihr Link für die Gruppe %@! Messages are protected by **end-to-end encryption**. + Nachrichten sind durch **Ende-zu-Ende-Verschlüsselung** geschützt. No comment provided by engineer. @@ -5399,6 +5412,10 @@ Das ist Ihr Link für die Gruppe %@! Keine Berechtigung für das Aufnehmen von Sprachnachrichten No comment provided by engineer. + + No private routing session + alert title + No push server Lokal @@ -5681,22 +5698,27 @@ Dies erfordert die Aktivierung eines VPNs. Open new chat + Neuen Chat eröffnen new chat action Open new group + Neue Gruppe eröffnen new chat action Open to accept + Zum Akzeptieren öffnen No comment provided by engineer. Open to connect + Zum Verbinden öffnen No comment provided by engineer. Open to join + Zum Beitreten öffnen No comment provided by engineer. @@ -5881,7 +5903,7 @@ Bitte teilen Sie weitere mögliche Probleme den Entwicklern mit. Please check your network connection with %@ and try again. Bitte überprüfen Sie Ihre Netzwerkverbindung mit %@ und versuchen Sie es erneut. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -6058,7 +6080,11 @@ Fehler: %@ Private routing error Fehler beim privaten Routing - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6092,6 +6118,7 @@ Fehler: %@ Profile will be shared via the address link. + Das Profil wird über den Adress-Link geteilt. alert message @@ -6166,6 +6193,10 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Ihre Chat-Profile mit einem Passwort schützen! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Protokollzeitüberschreitung @@ -6621,7 +6652,7 @@ swipe action Retry Wiederholen - No comment provided by engineer. + alert action Reveal @@ -6701,6 +6732,7 @@ chat item action Save (and notify members) + Speichern (und Mitglieder benachrichtigen) alert button @@ -6735,6 +6767,7 @@ chat item action Save group profile? + Gruppenprofil speichern? alert title @@ -6934,6 +6967,7 @@ chat item action Send contact request? + Kontakt-Anfrage senden? No comment provided by engineer. @@ -7003,10 +7037,12 @@ chat item action Send request + Anfrage senden No comment provided by engineer. Send request without message + Anfrage ohne Nachricht senden No comment provided by engineer. @@ -7111,6 +7147,7 @@ chat item action Sent to your contact after connection. + Wird nach der Verbindung an Ihren Kontakt gesendet. No comment provided by engineer. @@ -7336,6 +7373,7 @@ chat item action Share group profile via link + Gruppenprofil über einen Link teilen No comment provided by engineer. @@ -7350,6 +7388,7 @@ chat item action Share profile via link + Profil über einen Link teilen alert title @@ -7735,6 +7774,10 @@ report reason TCP-Verbindung No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout Timeout der TCP-Verbindung @@ -8166,6 +8209,7 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt To use another profile after connection attempt, delete the chat and use the link again. + Wenn Sie nach dem Verbindungsversuch ein anderes Profil verwenden möchten, löschen Sie den Chat und verwenden Sie den Link erneut. alert message @@ -9096,6 +9140,7 @@ Verbindungsanfrage wiederholen? You will be able to send messages **only after your request is accepted**. + Sie können erst dann Nachrichten versenden, **sobald Ihre Anfrage akzeptiert wurde**. No comment provided by engineer. @@ -9190,6 +9235,7 @@ Verbindungsanfrage wiederholen? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. + Ihr Chat wurde nach %@ verschoben, aber es ist ein unerwarteter Fehler aufgetreten, als Sie zum Profil weitergeleitet wurden. alert message @@ -9580,6 +9626,7 @@ marked deleted chat item preview text contact should accept… + Kontakt sollte akzeptieren… No comment provided by engineer. @@ -9750,6 +9797,7 @@ pref value group + Gruppe shown on group welcome message @@ -10082,6 +10130,7 @@ time to disappear request is sent + Anfrage wurde gesendet No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index b7d7d24ee5..49f6d335ef 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -1966,7 +1966,7 @@ This is your own one-time link! Connection error Connection error - No comment provided by engineer. + alert title Connection error (AUTH) @@ -2013,7 +2013,7 @@ This is your own one-time link! Connection timeout Connection timeout - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3248,7 +3248,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Error connecting to forwarding server %@. Please try later. - No comment provided by engineer. + alert message Error creating address @@ -3912,9 +3912,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. - Forwarding server %@ failed to connect to destination server %@. Please try later. - No comment provided by engineer. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. + alert message Forwarding server address is incompatible with network settings: %@. @@ -5412,6 +5412,11 @@ This is your link for group %@! No permission to record voice message No comment provided by engineer. + + No private routing session + No private routing session + alert title + No push server No push server @@ -5899,7 +5904,7 @@ Please share any other issues with the developers. Please check your network connection with %@ and try again. Please check your network connection with %@ and try again. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -6076,7 +6081,12 @@ Error: %@ Private routing error Private routing error - No comment provided by engineer. + alert title + + + Private routing timeout + Private routing timeout + alert title Profile and server connections @@ -6185,6 +6195,11 @@ Enable in *Network & servers* settings. Protect your chat profiles with a password! No comment provided by engineer. + + Protocol background timeout + Protocol background timeout + No comment provided by engineer. + Protocol timeout Protocol timeout @@ -6640,7 +6655,7 @@ swipe action Retry Retry - No comment provided by engineer. + alert action Reveal @@ -7762,6 +7777,11 @@ report reason TCP connection No comment provided by engineer. + + TCP connection bg timeout + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout TCP connection timeout diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff index 09ad3d74b1..cdd7908dee 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -667,6 +667,7 @@ swipe action Add short link + Añadir enlace corto No comment provided by engineer. @@ -1962,7 +1963,7 @@ This is your own one-time link! Connection error Error conexión - No comment provided by engineer. + alert title Connection error (AUTH) @@ -2009,7 +2010,7 @@ This is your own one-time link! Connection timeout Tiempo de conexión agotado - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3201,6 +3202,7 @@ chat item action Error adding short link + Error al añadir enlace corto No comment provided by engineer. @@ -3240,7 +3242,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Error al conectar con el servidor de reenvío %@. Por favor, inténtalo más tarde. - No comment provided by engineer. + alert message Error creating address @@ -3901,9 +3903,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. El servidor de reenvío %@ no ha podido conectarse al servidor de destino %@. Por favor, intentalo más tarde. - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -4066,6 +4068,7 @@ Error: %2$@ Group profile was changed. If you save it, the updated profile will be sent to group members. + El perfil del grupo ha cambiado. Si lo guardas, el perfil actualizado se enviará a los miembros del grupo. alert message @@ -5399,6 +5402,10 @@ This is your link for group %@! Sin permiso para grabar mensajes de voz No comment provided by engineer. + + No private routing session + alert title + No push server Sin servidores push @@ -5881,7 +5888,7 @@ Por favor, comparte cualquier otro problema con los desarrolladores. Please check your network connection with %@ and try again. Comprueba tu conexión de red con %@ e inténtalo de nuevo. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -6058,7 +6065,11 @@ Error: %@ Private routing error Error de enrutamiento privado - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6166,6 +6177,10 @@ Actívalo en ajustes de *Servidores y Redes*. ¡Protege tus perfiles con contraseña! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Timeout protocolo @@ -6621,7 +6636,7 @@ swipe action Retry Reintentar - No comment provided by engineer. + alert action Reveal @@ -6701,6 +6716,7 @@ chat item action Save (and notify members) + Guardar (y notificar miembros) alert button @@ -6735,6 +6751,7 @@ chat item action Save group profile? + ¿Guardar perfil del grupo? alert title @@ -7735,6 +7752,10 @@ report reason Conexión TCP No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout Timeout de la conexión TCP diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index 0f2169ad05..c064120eea 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -1767,7 +1767,7 @@ This is your own one-time link! Connection error Yhteysvirhe - No comment provided by engineer. + alert title Connection error (AUTH) @@ -1807,7 +1807,7 @@ This is your own one-time link! Connection timeout Yhteyden aikakatkaisu - No comment provided by engineer. + alert title Connection with desktop stopped @@ -2944,7 +2944,7 @@ chat item action Error connecting to forwarding server %@. Please try later. - No comment provided by engineer. + alert message Error creating address @@ -3542,8 +3542,8 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. - No comment provided by engineer. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. + alert message Forwarding server address is incompatible with network settings: %@. @@ -4909,6 +4909,10 @@ This is your link for group %@! Ei lupaa ääniviestin tallentamiseen No comment provided by engineer. + + No private routing session + alert title + No push server Paikallinen @@ -5343,7 +5347,7 @@ Please share any other issues with the developers. Please check your network connection with %@ and try again. Tarkista verkkoyhteytesi %@:lla ja yritä uudelleen. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -5501,7 +5505,11 @@ Error: %@ Private routing error - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -5602,6 +5610,10 @@ Enable in *Network & servers* settings. Suojaa keskusteluprofiilisi salasanalla! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Protokollan aikakatkaisu @@ -6013,7 +6025,7 @@ swipe action Retry - No comment provided by engineer. + alert action Reveal @@ -7025,6 +7037,10 @@ report reason TCP connection No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout TCP-yhteyden aikakatkaisu diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff index 235441e46c..aba30295a0 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -1954,7 +1954,7 @@ Il s'agit de votre propre lien unique ! Connection error Erreur de connexion - No comment provided by engineer. + alert title Connection error (AUTH) @@ -2001,7 +2001,7 @@ Il s'agit de votre propre lien unique ! Connection timeout Délai de connexion - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3230,7 +3230,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Erreur de connexion au serveur de redirection %@. Veuillez réessayer plus tard. - No comment provided by engineer. + alert message Error creating address @@ -3888,9 +3888,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. Le serveur de redirection %@ n'a pas réussi à se connecter au serveur de destination %@. Veuillez réessayer plus tard. - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -5357,6 +5357,10 @@ Voici votre lien pour le groupe %@ ! Pas l'autorisation d'enregistrer un message vocal No comment provided by engineer. + + No private routing session + alert title + No push server No push server @@ -5830,7 +5834,7 @@ Veuillez faire part de tout autre problème aux développeurs. Please check your network connection with %@ and try again. Veuillez vérifier votre connexion réseau avec %@ et réessayer. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -6000,7 +6004,11 @@ Erreur : %@ Private routing error Erreur de routage privé - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6107,6 +6115,10 @@ Activez-le dans les paramètres *Réseau et serveurs*. Protégez vos profils de chat par un mot de passe ! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Délai du protocole @@ -6547,7 +6559,7 @@ swipe action Retry Réessayer - No comment provided by engineer. + alert action Reveal @@ -7649,6 +7661,10 @@ report reason Connexion TCP No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout Délai de connexion TCP diff --git a/apps/ios/SimpleX Localizations/he.xcloc/Localized Contents/he.xliff b/apps/ios/SimpleX Localizations/he.xcloc/Localized Contents/he.xliff index c40880b3aa..2f135593e6 100644 --- a/apps/ios/SimpleX Localizations/he.xcloc/Localized Contents/he.xliff +++ b/apps/ios/SimpleX Localizations/he.xcloc/Localized Contents/he.xliff @@ -5405,7 +5405,7 @@ SimpleX servers cannot see your profile. Apply to - החל ל + החל על Background @@ -5579,6 +5579,108 @@ This is your own one-time link! File error שגיאה בקובץ + + Corner + קצוות + + + Use for messages + שימוש בהודעות + + + Pending + ממתין + + + Protect your IP address from the messaging relays chosen by your contacts. +Enable in *Network & servers* settings. + הגן על כתובת ה-IP שלך מפני ממסרי הודעות שנבחרו על ידי אנשי הקשר שלך. +הפעל בהגדרות *רשת ושרתים*. + + + To send + לשליחה + + + Do NOT send messages directly, even if your or destination server does not support private routing. + אל תשלח הודעות ישירות, גם אם שרת היעד שלך או שרת היעד אינו תומך בניתוב פרטי. + + + Servers statistics will be reset - this cannot be undone! + סטטיסטיקות השרתים יאופסו - לא ניתן לבטל פעולה זו! + + + Detailed statistics + סטטיסטיקות מפורטות + + + Reachable chat toolbar + סרגל כלים נגיש לצ'אט + + + Configure server operators + הגדרת מפעילי שרת + + + Private chats, groups and your contacts are not accessible to server operators. + צ'אטים פרטיים, קבוצות ואנשי הקשר שלך אינם נגישים למפעילי השרת. + + + pending + ממתין + + + Save and reconnect + שמור וחבר מחדש + + + Customizable message shape. + צורת הודעה הניתנת להתאמה אישית. + + + All data is kept private on your device. + כל הנתונים נשמרים פרטיים במכשיר שלך. + + + Downloading link details + הורדת פרטי קישור + + + Message shape + צורת ההודעה + + + No chats in list %@ + אין צ'אטים ברשימה %@ + + + Privacy policy and conditions of use. + מדיניות פרטיות ותנאי שימוש. + + + pending review + ממתין לסקירה + + + Save list + שמור רשימה + + + pending approval + ממתין לאישור + + + %@ downloaded + %@ יורד + + + %@ server + %@ שרת + + + %@ connected + %@ מחובר + @@ -5627,4 +5729,12 @@ This is your own one-time link! + + + + New messages + הודעות חדשות + + + diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index 4af99d6724..51c68e2507 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -518,14 +518,14 @@ time interval A separate TCP connection will be used **for each chat profile you have in the app**. - **Az összes csevegési profiljához az alkalmazásban** külön TCP-kapcsolat (és SOCKS-hitelesítőadat) lesz használva. + **Az összes csevegési profiljához az alkalmazásban** külön TCP-kapcsolat lesz használva. No comment provided by engineer. A separate TCP connection will be used **for each contact and group member**. **Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail. - **Az összes partneréhez és csoporttaghoz** külön TCP-kapcsolat (és SOCKS-hitelesítőadat) lesz használva. -**Megjegyzés:** ha sok kapcsolata van, az akkumulátor-használat és az adatforgalom jelentősen megnövekedhet, és néhány kapcsolódási kísérlet sikertelen lehet. + **Az összes partneréhez és csoporttaghoz** külön TCP-kapcsolat lesz használva. +**Megjegyzés:** ha sok kapcsolata van, akkor az akkumulátor-használat és az adatforgalom jelentősen megnövekedhet, és néhány kapcsolódási kísérlet sikertelen lehet. No comment provided by engineer. @@ -583,16 +583,17 @@ swipe action Accept connection request? - Elfogadja a meghívási kérést? + Elfogadja a meghívót? No comment provided by engineer. Accept contact request + Meghívó elfogadása alert title Accept contact request from %@? - Elfogadja %@ meghívási kérését? + Elfogadja %@ meghívóját? notification body @@ -648,6 +649,7 @@ swipe action Add message + Üzenet hozzáadása placeholder for sending contact request @@ -667,6 +669,7 @@ swipe action Add short link + Rövid hivatkozás hozzáadása No comment provided by engineer. @@ -1036,7 +1039,7 @@ swipe action App passcode is replaced with self-destruct passcode. - Az alkalmazás-jelkód helyettesítve lesz egy önmegsemmisítő-jelkóddal. + Az alkalmazásjelkód helyettesítve lesz egy önmegsemmisítő jelkóddal. No comment provided by engineer. @@ -1066,7 +1069,7 @@ swipe action Apply to - Alkalmazás erre + Használat ehhez No comment provided by engineer. @@ -1171,7 +1174,7 @@ swipe action Auto-accept contact requests - Meghívási kérések automatikus elfogadása + Meghívók automatikus elfogadása No comment provided by engineer. @@ -1395,6 +1398,7 @@ swipe action Can't change profile + Nem lehet módosítani a profilt alert title @@ -1506,7 +1510,7 @@ new chat action Change self-destruct passcode - Önmegsemmisítő-jelkód módosítása + Önmegsemmisítő jelkód módosítása authentication reason set passcode view @@ -1567,7 +1571,7 @@ set passcode view Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. - A csevegés megállt. Ha már használta ezt az adatbázist egy másik eszközön, úgy visszaállítás szükséges a csevegés elindítása előtt. + A csevegés megállt. Ha ezt az adatbázist már használta egy másik eszközön, akkor a csevegés elindítása előtt vissza kell állítania azt. No comment provided by engineer. @@ -1962,7 +1966,7 @@ Ez a saját egyszer használható meghívója! Connection error Kapcsolódási hiba - No comment provided by engineer. + alert title Connection error (AUTH) @@ -1988,7 +1992,7 @@ Ez a saját egyszer használható meghívója! Connection request sent! - Meghívási kérés elküldve! + Meghívó elküldve! No comment provided by engineer. @@ -2009,7 +2013,7 @@ Ez a saját egyszer használható meghívója! Connection timeout Időtúllépés kapcsolódáskor - No comment provided by engineer. + alert title Connection with desktop stopped @@ -2178,7 +2182,7 @@ Ez a saját egyszer használható meghívója! Create your profile - Saját profil létrehozása + Profil létrehozása No comment provided by engineer. @@ -2366,7 +2370,7 @@ Ez a saját egyszer használható meghívója! Decryption error - Titkosításvisszafejtési hiba + Titkosítás-visszafejtési hiba message decrypt error item @@ -2417,7 +2421,7 @@ swipe action Delete chat messages from your device. - Csevegési üzenetek törlése a saját eszközéről. + Csevegési üzenetek törlése az eszközről. No comment provided by engineer. @@ -2832,7 +2836,7 @@ swipe action Do not use credentials with proxy. - Ne használja a hitelesítőadatokat proxyval. + Ne használja a hitelesítési adatokat proxyval. No comment provided by engineer. @@ -2943,6 +2947,7 @@ chat item action Empty message! + Üres üzenet! No comment provided by engineer. @@ -3017,7 +3022,7 @@ chat item action Enable self-destruct passcode - Önmegsemmisítő-jelkód engedélyezése + Önmegsemmisítő jelkód engedélyezése set passcode view @@ -3137,7 +3142,7 @@ chat item action Enter server manually - Adja meg a kiszolgálót kézzel + Kiszolgáló megadása kézzel No comment provided by engineer. @@ -3177,7 +3182,7 @@ chat item action Error accepting contact request - Hiba történt a meghívási kérés elfogadásakor + Hiba történt a meghívó elfogadásakor No comment provided by engineer. @@ -3187,6 +3192,7 @@ chat item action Error adding address short link + Hiba a rövid címhivatkozás hozzáadásakor No comment provided by engineer. @@ -3201,6 +3207,7 @@ chat item action Error adding short link + Hiba történt a rövid hivatkozás hozzáadásakor No comment provided by engineer. @@ -3210,6 +3217,7 @@ chat item action Error changing chat profile + Hiba a csevegési profil módosításakor alert title @@ -3240,7 +3248,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Hiba történt a(z) %@ továbbítókiszolgálóhoz való kapcsolódáskor. Próbálja meg később. - No comment provided by engineer. + alert message Error creating address @@ -3384,10 +3392,12 @@ chat item action Error preparing contact + Hiba a kapcsolat előkészítésekor No comment provided by engineer. Error preparing group + Hiba a csoport előkészítésekor No comment provided by engineer. @@ -3412,6 +3422,7 @@ chat item action Error rejecting contact request + Hiba történt a meghívó elutasításakor alert title @@ -3901,9 +3912,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. A(z) %@ továbbítókiszolgáló nem tudott kapcsolódni a(z) %@ célkiszolgálóhoz. Próbálja meg később. - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -4061,11 +4072,12 @@ Hiba: %2$@ Group profile is stored on members' devices, not on the servers. - A csoport profilja a tagok eszközein tárolódik, nem a kiszolgálókon. + A csoportprofil a tagok eszközein tárolódik, nem a kiszolgálókon. No comment provided by engineer. Group profile was changed. If you save it, the updated profile will be sent to group members. + Csoportprofil módosítva. Ha menti, akkor a frissített profil el lesz küldve a csoporttagoknak. alert message @@ -4205,7 +4217,7 @@ Hiba: %2$@ If you enter your self-destruct passcode while opening the app: - Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő-jelkódot: + Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő jelkódot: No comment provided by engineer. @@ -4997,6 +5009,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Messages are protected by **end-to-end encryption**. + Az üzenetek **végpontok közötti titkosítással** vannak védve. No comment provided by engineer. @@ -5211,12 +5224,12 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! New SOCKS credentials will be used every time you start the app. - Minden alkalommal, amikor elindítja az alkalmazást, új SOCKS-hitelesítő-adatokat fog használni. + Minden alkalommal, amikor elindítja az alkalmazást, új SOCKS-hitelesítési adatok lesznek használva. No comment provided by engineer. New SOCKS credentials will be used for each server. - Az összes kiszolgálóhoz új, SOCKS-hitelesítő-adatok legyenek használva. + Az összes kiszolgálóhoz új, SOCKS-hitelesítési adatok lesznek használva. No comment provided by engineer. @@ -5231,7 +5244,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! New contact request - Új meghívási kérés + Új meghívó notification @@ -5399,6 +5412,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Nincs engedély a hangüzenet rögzítésére No comment provided by engineer. + + No private routing session + alert title + No push server Helyi @@ -5681,22 +5698,27 @@ VPN engedélyezése szükséges. Open new chat + Új csevegés megnyitása new chat action Open new group + Új csoport megnyitása new chat action Open to accept + Megnyitás az elfogadáshoz No comment provided by engineer. Open to connect + Megnyitás a kapcsolódáshoz No comment provided by engineer. Open to join + Megnyitás a csatlakozáshoz No comment provided by engineer. @@ -5881,7 +5903,7 @@ Minden további problémát osszon meg a fejlesztőkkel. Please check your network connection with %@ and try again. Ellenőrizze a hálózati kapcsolatát a vele: %@, és próbálja újra. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -5947,7 +5969,7 @@ Hiba: %@ Please wait for group moderators to review your request to join the group. - Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérelmét. + Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérését. snd group event chat item @@ -6058,7 +6080,11 @@ Hiba: %@ Private routing error Privát útválasztási hiba - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6092,6 +6118,7 @@ Hiba: %@ Profile will be shared via the address link. + A profil meg lesz osztva a címhivatkozáson keresztül. alert message @@ -6166,6 +6193,10 @@ Engedélyezze a *Hálózat és kiszolgálók* menüben. Védje meg a csevegési profiljait egy jelszóval! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Protokoll időtúllépése @@ -6213,7 +6244,7 @@ Engedélyezze a *Hálózat és kiszolgálók* menüben. Reachable chat toolbar - Könnyen elérhető eszköztár + Könnyen elérhető csevegési eszköztár No comment provided by engineer. @@ -6405,7 +6436,7 @@ swipe action Reject contact request - Meghívási kérés elutasítása + Meghívó elutasítása alert title @@ -6621,7 +6652,7 @@ swipe action Retry Újrapróbálkozás - No comment provided by engineer. + alert action Reveal @@ -6701,11 +6732,12 @@ chat item action Save (and notify members) + Mentés (és a tagok értesítése) alert button Save admission settings? - Elmenti a befogadási beállításokat? + Menti a befogadási beállításokat? alert title @@ -6735,6 +6767,7 @@ chat item action Save group profile? + Menti a csoportprofilt? alert title @@ -6794,7 +6827,7 @@ chat item action Saved from - Elmentve innen + Mentve innen No comment provided by engineer. @@ -6839,7 +6872,7 @@ chat item action Scan server QR code - A kiszolgáló QR-kódjának beolvasása + Kiszolgáló QR-kódjának beolvasása No comment provided by engineer. @@ -6909,17 +6942,17 @@ chat item action Self-destruct passcode - Önmegsemmisítő-jelkód + Önmegsemmisítő jelkód No comment provided by engineer. Self-destruct passcode changed! - Az önmegsemmisítő-jelkód módosult! + Az önmegsemmisítő jelkód módosult! No comment provided by engineer. Self-destruct passcode enabled! - Az önmegsemmisítő-jelkód engedélyezve! + Az önmegsemmisítő jelkód engedélyezve! No comment provided by engineer. @@ -6934,6 +6967,7 @@ chat item action Send contact request? + Elküldi a meghívót? No comment provided by engineer. @@ -7003,10 +7037,12 @@ chat item action Send request + Kérés küldése No comment provided by engineer. Send request without message + Kérés küldése üzenet nélkül No comment provided by engineer. @@ -7026,7 +7062,7 @@ chat item action Sender may have deleted the connection request. - A küldője törölhette a meghívási kérést. + A küldője törölhette a meghívót. No comment provided by engineer. @@ -7111,6 +7147,7 @@ chat item action Sent to your contact after connection. + Elküldés a partnernek a kapcsolódást követően. No comment provided by engineer. @@ -7160,7 +7197,7 @@ chat item action Server protocol changed. - A kiszolgáló-protokoll módosult. + A kiszolgálóprotokoll módosult. alert title @@ -7336,6 +7373,7 @@ chat item action Share group profile via link + Csoportprofil megosztása hivatkozáson keresztül No comment provided by engineer. @@ -7350,6 +7388,7 @@ chat item action Share profile via link + Profil megosztása hivatkozáson keresztül alert title @@ -7514,12 +7553,12 @@ chat item action SimpleX one-time invitation - Egyszer használható SimpleX-meghívó + Egyszer használható SimpleX meghívó simplex link type SimpleX protocols reviewed by Trail of Bits. - A SimpleX-protokollokat a Trail of Bits auditálta. + A SimpleX protokollokat a Trail of Bits auditálta. No comment provided by engineer. @@ -7735,6 +7774,10 @@ report reason TCP-kapcsolat No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout TCP-kapcsolat időtúllépése @@ -7864,7 +7907,7 @@ Ez valamilyen hiba vagy sérült kapcsolat esetén fordulhat elő. The app can notify you when you receive messages or contact requests - please open settings to enable. - Az alkalmazás értesíteni fogja, amikor üzeneteket vagy meghívási kéréseket kap – ezt a beállítások menüben engedélyezheti. + Az alkalmazás értesíteni fogja, amikor üzeneteket vagy meghívókat kap – ezt a beállítások menüben engedélyezheti. No comment provided by engineer. @@ -7894,7 +7937,7 @@ Ez valamilyen hiba vagy sérült kapcsolat esetén fordulhat elő. The connection you accepted will be cancelled! - Az Ön által elfogadott kérelem vissza lesz vonva! + Az Ön által elfogadott kapcsolat vissza lesz vonva! No comment provided by engineer. @@ -8166,6 +8209,7 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll To use another profile after connection attempt, delete the chat and use the link again. + Másik profil használatához a kapcsolatfelvételi kísérlet után törölje a csevegést, és használja újra a hivatkozást. alert message @@ -8180,12 +8224,12 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll Toggle chat list: - Csevegési lista átváltása: + Csevegési lista ki/be: No comment provided by engineer. Toggle incognito when connecting. - Inkognitóra váltás kapcsolódáskor. + Inkognitó profil használata kapcsolódáskor ki/be. No comment provided by engineer. @@ -8492,7 +8536,7 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso Use for new connections - Alkalmazás új kapcsolatokhoz + Használat új kapcsolatokhoz No comment provided by engineer. @@ -8889,7 +8933,7 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso You are already joining the group! Repeat join request? A csatlakozás már folyamatban van a csoporthoz! -Megismétli a meghívási kérést? +Megismétli a csatlakozási kérést? new chat sheet title @@ -8909,7 +8953,7 @@ Megismétli a meghívási kérést? You can accept calls from lock screen, without device and app authentication. - Hívásokat fogadhat a lezárási képernyőről, eszköz- és alkalmazás-hitelesítés nélkül. + A lezárási képernyőről is fogadhat hívásokat, eszköz- és alkalmazáshitelesítés nélkül. No comment provided by engineer. @@ -8929,7 +8973,7 @@ Megismétli a meghívási kérést? You can enable later via Settings - Később engedélyezheti a „Beállításokban” + Később engedélyezheti a beállításokban No comment provided by engineer. @@ -8949,7 +8993,7 @@ Megismétli a meghívási kérést? You can make it visible to your SimpleX contacts via Settings. - Láthatóvá teheti a SimpleXbeli partnerei számára a „Beállításokban”. + Láthatóvá teheti a SimpleXbeli partnerei számára a beállításokban. No comment provided by engineer. @@ -9030,8 +9074,8 @@ Megismétli a meghívási kérést? You have already requested connection! Repeat connection request? - Ön már küldött egy meghívási kérést! -Megismétli a meghívási kérést? + Ön már küldött egy meghívót! +Újra elküldi a meghívót? new chat sheet title @@ -9061,7 +9105,7 @@ Megismétli a meghívási kérést? You may save the exported archive. - Az exportált archívumot elmentheti. + Mentheti az exportált archívumot. No comment provided by engineer. @@ -9096,6 +9140,7 @@ Megismétli a meghívási kérést? You will be able to send messages **only after your request is accepted**. + Csak azután tud üzeneteket küldeni, **miután a kérését elfogadták**. No comment provided by engineer. @@ -9110,7 +9155,7 @@ Megismétli a meghívási kérést? You will be connected when your connection request is accepted, please wait or check later! - Akkor lesz kapcsolódva, ha a meghívási kérése el lesz fogadva, várjon, vagy ellenőrizze később! + Akkor lesz kapcsolódva, ha a meghívóját a partnere elfogadja, várjon, vagy ellenőrizze később! No comment provided by engineer. @@ -9190,6 +9235,7 @@ Megismétli a meghívási kérést? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. + A csevegés át lett helyezve ide: %@, de egy váratlan hiba történt a profilra való átirányításkor. alert message @@ -9214,7 +9260,7 @@ Megismétli a meghívási kérést? Your credentials may be sent unencrypted. - A hitelesítőadatai titkosítatlanul is elküldhetők. + A hitelesítési adati titkosítatlanul is elküldhetők. No comment provided by engineer. @@ -9259,7 +9305,7 @@ Megismétli a meghívási kérést? Your profile was changed. If you save it, the updated profile will be sent to all your contacts. - A profilja módosult. Ha elmenti, a profilfrissítés el lesz küldve a partnerei számára. + A profilja módosult. Ha menti, akkor a profilfrissítés el lesz küldve a partnerei számára. alert message @@ -9379,7 +9425,7 @@ Megismétli a meghívási kérést? attempts - próbálkozások + kísérletek No comment provided by engineer. @@ -9580,6 +9626,7 @@ marked deleted chat item preview text contact should accept… + a partnernek el kell fogadnia… No comment provided by engineer. @@ -9685,7 +9732,7 @@ pref value encryption agreed - titkosítás elfogadva + titkosítása elfogadva chat item text @@ -9695,7 +9742,7 @@ pref value encryption ok - titkosítás rendben + titkosítása rendben van chat item text @@ -9750,6 +9797,7 @@ pref value group + csoport shown on group welcome message @@ -10082,16 +10130,17 @@ time to disappear request is sent + kérés elküldve No comment provided by engineer. request to join rejected - csatlakozási kérelem elutasítva + csatlakozási kérés elutasítva No comment provided by engineer. requested to connect - Függőben lévő meghívási kérelem + Függőben lévő meghívó chat list item title @@ -10111,7 +10160,7 @@ time to disappear saved from %@ - elmentve innen: %@ + mentve innen: %@ No comment provided by engineer. @@ -10205,7 +10254,7 @@ utoljára fogadott üzenet: %2$@ updated group profile - frissítette a csoport profilját + frissítette a csoportprofilt rcv group event chat item diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff index 8ed9ed2e7c..e111c97085 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -588,6 +588,7 @@ swipe action Accept contact request + Accetta la richiesta di contatto alert title @@ -648,6 +649,7 @@ swipe action Add message + Aggiungi un messaggio placeholder for sending contact request @@ -667,6 +669,7 @@ swipe action Add short link + Aggiungi link breve No comment provided by engineer. @@ -1395,6 +1398,7 @@ swipe action Can't change profile + Impossibile cambiare profilo alert title @@ -1962,7 +1966,7 @@ Questo è il tuo link una tantum! Connection error Errore di connessione - No comment provided by engineer. + alert title Connection error (AUTH) @@ -2009,7 +2013,7 @@ Questo è il tuo link una tantum! Connection timeout Connessione scaduta - No comment provided by engineer. + alert title Connection with desktop stopped @@ -2943,6 +2947,7 @@ chat item action Empty message! + Messaggio vuoto! No comment provided by engineer. @@ -3187,6 +3192,7 @@ chat item action Error adding address short link + Errore di aggiunta del link breve dell'indirizzo No comment provided by engineer. @@ -3201,6 +3207,7 @@ chat item action Error adding short link + Errore di aggiunta link breve No comment provided by engineer. @@ -3210,6 +3217,7 @@ chat item action Error changing chat profile + Errore cambiando il profilo di chat alert title @@ -3240,7 +3248,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Errore di connessione al server di inoltro %@. Riprova più tardi. - No comment provided by engineer. + alert message Error creating address @@ -3384,10 +3392,12 @@ chat item action Error preparing contact + Errore di preparazione del contatto No comment provided by engineer. Error preparing group + Errore di preparazione del gruppo No comment provided by engineer. @@ -3412,6 +3422,7 @@ chat item action Error rejecting contact request + Errore nel rifiuto della richiesta di contatto alert title @@ -3901,9 +3912,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. Il server di inoltro %@ non è riuscito a connettersi al server di destinazione %@. Riprova più tardi. - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -4066,6 +4077,7 @@ Errore: %2$@ Group profile was changed. If you save it, the updated profile will be sent to group members. + Il profilo del gruppo è stato cambiato. Se lo salvi, il profilo aggiornato verrà inviato ai membri del gruppo. alert message @@ -4997,6 +5009,7 @@ Questo è il tuo link per il gruppo %@! Messages are protected by **end-to-end encryption**. + I messaggi sono protetti da **crittografia end-to-end**. No comment provided by engineer. @@ -5399,6 +5412,10 @@ Questo è il tuo link per il gruppo %@! Nessuna autorizzazione per registrare messaggi vocali No comment provided by engineer. + + No private routing session + alert title + No push server Locale @@ -5681,22 +5698,27 @@ Richiede l'attivazione della VPN. Open new chat + Apri una chat nuova new chat action Open new group + Apri un gruppo nuovo new chat action Open to accept + Apri per accettare No comment provided by engineer. Open to connect + Apri per connettere No comment provided by engineer. Open to join + Apri per entrare No comment provided by engineer. @@ -5881,7 +5903,7 @@ Si prega di condividere qualsiasi altro problema con gli sviluppatori. Please check your network connection with %@ and try again. Controlla la tua connessione di rete con %@ e riprova. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -6058,7 +6080,11 @@ Errore: %@ Private routing error Errore di instradamento privato - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6092,6 +6118,7 @@ Errore: %@ Profile will be shared via the address link. + Il profilo verrà condiviso tramite il link dell'indirizzo. alert message @@ -6166,6 +6193,10 @@ Attivalo nelle impostazioni *Rete e server*. Proteggi i tuoi profili di chat con una password! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Scadenza del protocollo @@ -6621,7 +6652,7 @@ swipe action Retry Riprova - No comment provided by engineer. + alert action Reveal @@ -6701,6 +6732,7 @@ chat item action Save (and notify members) + Salva (e informa i membri) alert button @@ -6735,6 +6767,7 @@ chat item action Save group profile? + Salvare il profilo del gruppo? alert title @@ -6934,6 +6967,7 @@ chat item action Send contact request? + Inviare una richiesta di contatto? No comment provided by engineer. @@ -7003,10 +7037,12 @@ chat item action Send request + Invia richiesta No comment provided by engineer. Send request without message + Invia richiesta senza messaggio No comment provided by engineer. @@ -7111,6 +7147,7 @@ chat item action Sent to your contact after connection. + Inviato al tuo contatto dopo la connessione. No comment provided by engineer. @@ -7336,6 +7373,7 @@ chat item action Share group profile via link + Condividi il profilo del gruppo via link No comment provided by engineer. @@ -7350,6 +7388,7 @@ chat item action Share profile via link + Condividi il profilo via link alert title @@ -7735,6 +7774,10 @@ report reason Connessione TCP No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout Scadenza connessione TCP @@ -8166,6 +8209,7 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio To use another profile after connection attempt, delete the chat and use the link again. + Per usare un altro profilo dopo il tentativo di connessione, elimina la chat e usa di nuovo il link. alert message @@ -9096,6 +9140,7 @@ Ripetere la richiesta di connessione? You will be able to send messages **only after your request is accepted**. + Potrai inviare messaggi **solo dopo che la tua richiesta verrà accettata**. No comment provided by engineer. @@ -9190,6 +9235,7 @@ Ripetere la richiesta di connessione? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. + La tua chat è stata spostata su %@ , ma si è verificato un errore imprevisto mentre venivi reindirizzato/a al profilo. alert message @@ -9580,6 +9626,7 @@ marked deleted chat item preview text contact should accept… + il contatto dovrebbe accettare… No comment provided by engineer. @@ -9750,6 +9797,7 @@ pref value group + gruppo shown on group welcome message @@ -10082,6 +10130,7 @@ time to disappear request is sent + richiesta inviata No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index 3ff281d1e6..3fc6010279 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -1833,7 +1833,7 @@ This is your own one-time link! Connection error 接続エラー - No comment provided by engineer. + alert title Connection error (AUTH) @@ -1874,7 +1874,7 @@ This is your own one-time link! Connection timeout 接続タイムアウト - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3017,7 +3017,7 @@ chat item action Error connecting to forwarding server %@. Please try later. - No comment provided by engineer. + alert message Error creating address @@ -3615,8 +3615,8 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. - No comment provided by engineer. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. + alert message Forwarding server address is incompatible with network settings: %@. @@ -4985,6 +4985,10 @@ This is your link for group %@! 音声メッセージを録音する権限がありません No comment provided by engineer. + + No private routing session + alert title + No push server 自分のみ @@ -5420,7 +5424,7 @@ Please share any other issues with the developers. Please check your network connection with %@ and try again. %@ を使用してネットワーク接続を確認し、再試行してください。 - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -5579,7 +5583,11 @@ Error: %@ Private routing error - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -5680,6 +5688,10 @@ Enable in *Network & servers* settings. チャットのプロフィールをパスワードで保護します! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout プロトコル・タイムアウト @@ -6090,7 +6102,7 @@ swipe action Retry - No comment provided by engineer. + alert action Reveal @@ -7096,6 +7108,10 @@ report reason TCP connection No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout TCP接続タイムアウト diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff index 02c6ae36df..0ff19632f0 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -1962,7 +1962,7 @@ Dit is uw eigen eenmalige link! Connection error Verbindingsfout - No comment provided by engineer. + alert title Connection error (AUTH) @@ -2009,7 +2009,7 @@ Dit is uw eigen eenmalige link! Connection timeout Timeout verbinding - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3240,7 +3240,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Fout bij het verbinden met doorstuurserver %@. Probeer het later opnieuw. - No comment provided by engineer. + alert message Error creating address @@ -3901,9 +3901,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. De doorstuurserver %@ kon geen verbinding maken met de bestemmingsserver %@. Probeer het later opnieuw. - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -5399,6 +5399,10 @@ Dit is jouw link voor groep %@! Geen toestemming om spraakbericht op te nemen No comment provided by engineer. + + No private routing session + alert title + No push server Lokaal @@ -5881,7 +5885,7 @@ Deel eventuele andere problemen met de ontwikkelaars. Please check your network connection with %@ and try again. Controleer uw netwerkverbinding met %@ en probeer het opnieuw. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -6058,7 +6062,11 @@ Fout: %@ Private routing error Fout in privéroutering - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6166,6 +6174,10 @@ Schakel dit in in *Netwerk en servers*-instellingen. Bescherm je chatprofielen met een wachtwoord! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Protocol timeout @@ -6621,7 +6633,7 @@ swipe action Retry Opnieuw proberen - No comment provided by engineer. + alert action Reveal @@ -7735,6 +7747,10 @@ report reason TCP verbinding No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout Timeout van TCP-verbinding diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index 3c7f894acc..892079f30f 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -1940,7 +1940,7 @@ To jest twój jednorazowy link! Connection error Błąd połączenia - No comment provided by engineer. + alert title Connection error (AUTH) @@ -1982,7 +1982,7 @@ To jest twój jednorazowy link! Connection timeout Czas połączenia minął - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3187,7 +3187,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Błąd połączenia z serwerem przekierowania %@. Spróbuj ponownie później. - No comment provided by engineer. + alert message Error creating address @@ -3824,9 +3824,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. Serwer przekazujący %@ nie mógł połączyć się z serwerem docelowym %@. Spróbuj ponownie później. - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -5277,6 +5277,10 @@ To jest twój link do grupy %@! Brak uprawnień do nagrywania wiadomości głosowej No comment provided by engineer. + + No private routing session + alert title + No push server Lokalnie @@ -5738,7 +5742,7 @@ Proszę podzielić się innymi problemami z deweloperami. Please check your network connection with %@ and try again. Sprawdzić połączenie sieciowe z %@ i spróbować ponownie. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -5906,7 +5910,11 @@ Błąd: %@ Private routing error Błąd prywatnego trasowania - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6013,6 +6021,10 @@ Włącz w ustawianiach *Sieć i serwery* . Chroń swoje profile czatu hasłem! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Limit czasu protokołu @@ -6453,7 +6465,7 @@ swipe action Retry Ponów - No comment provided by engineer. + alert action Reveal @@ -7539,6 +7551,10 @@ report reason Połączenie TCP No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout Limit czasu połączenia TCP diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index c76fa2c379..1de284368e 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -1963,7 +1963,7 @@ This is your own one-time link! Connection error Ошибка соединения - No comment provided by engineer. + alert title Connection error (AUTH) @@ -2010,7 +2010,7 @@ This is your own one-time link! Connection timeout Превышено время соединения - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3241,7 +3241,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Ошибка подключения к пересылающему серверу %@. Попробуйте позже. - No comment provided by engineer. + alert message Error creating address @@ -3902,9 +3902,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. Пересылающий сервер %@ не смог подключиться к серверу назначения %@. Попробуйте позже. - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -5399,6 +5399,10 @@ This is your link for group %@! Нет разрешения для записи голосового сообщения No comment provided by engineer. + + No private routing session + alert title + No push server Без сервера нотификаций @@ -5881,7 +5885,7 @@ Please share any other issues with the developers. Please check your network connection with %@ and try again. Пожалуйста, проверьте Ваше соединение с %@ и попробуйте еще раз. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -6058,7 +6062,11 @@ Error: %@ Private routing error Ошибка конфиденциальной доставки - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6166,6 +6174,10 @@ Enable in *Network & servers* settings. Защитите Ваши профили чата паролем! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Таймаут протокола @@ -6621,7 +6633,7 @@ swipe action Retry Повторить - No comment provided by engineer. + alert action Reveal @@ -7738,6 +7750,10 @@ report reason TCP-соединение No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout Таймаут TCP соединения diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index 1d9c2455dc..0d3139ded9 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -1758,7 +1758,7 @@ This is your own one-time link! Connection error การเชื่อมต่อผิดพลาด - No comment provided by engineer. + alert title Connection error (AUTH) @@ -1798,7 +1798,7 @@ This is your own one-time link! Connection timeout หมดเวลาการเชื่อมต่อ - No comment provided by engineer. + alert title Connection with desktop stopped @@ -2930,7 +2930,7 @@ chat item action Error connecting to forwarding server %@. Please try later. - No comment provided by engineer. + alert message Error creating address @@ -3527,8 +3527,8 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. - No comment provided by engineer. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. + alert message Forwarding server address is incompatible with network settings: %@. @@ -4890,6 +4890,10 @@ This is your link for group %@! ไม่อนุญาตให้บันทึกข้อความเสียง No comment provided by engineer. + + No private routing session + alert title + No push server ในเครื่อง @@ -5322,7 +5326,7 @@ Please share any other issues with the developers. Please check your network connection with %@ and try again. โปรดตรวจสอบการเชื่อมต่อเครือข่ายของคุณกับ %@ แล้วลองอีกครั้ง - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -5480,7 +5484,11 @@ Error: %@ Private routing error - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -5581,6 +5589,10 @@ Enable in *Network & servers* settings. ปกป้องโปรไฟล์การแชทของคุณด้วยรหัสผ่าน! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout หมดเวลาโปรโตคอล @@ -5990,7 +6002,7 @@ swipe action Retry - No comment provided by engineer. + alert action Reveal @@ -6998,6 +7010,10 @@ report reason TCP connection No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout หมดเวลาการเชื่อมต่อ TCP diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff index ca18f03de9..41868b8ea3 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -1934,7 +1934,7 @@ Bu senin kendi tek kullanımlık bağlantın! Connection error Bağlantı hatası - No comment provided by engineer. + alert title Connection error (AUTH) @@ -1977,7 +1977,7 @@ Bu senin kendi tek kullanımlık bağlantın! Connection timeout Bağlantı süresi geçmiş - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3192,7 +3192,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Yönlendirme sunucusu %@'ya bağlanırken hata oluştu. Lütfen daha sonra deneyin. - No comment provided by engineer. + alert message Error creating address @@ -3838,9 +3838,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. Yönlendirme sunucusu %@, hedef sunucu %@'ya bağlanamadı. Lütfen daha sonra deneyin. - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -5299,6 +5299,10 @@ Bu senin grup için bağlantın %@! Sesli mesaj kaydetmek için izin yok No comment provided by engineer. + + No private routing session + alert title + No push server Yerel @@ -5760,7 +5764,7 @@ Lütfen diğer herhangi bir sorunu geliştiricilerle paylaşın. Please check your network connection with %@ and try again. Lütfen ağ bağlantınızı %@ ile kontrol edin ve tekrar deneyin. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -5928,7 +5932,11 @@ Hata: %@ Private routing error Gizli yönlendirme hatası - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6035,6 +6043,10 @@ Enable in *Network & servers* settings. Bir parolayla birlikte sohbet profillerini koru! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Protokol zaman aşımı @@ -6475,7 +6487,7 @@ swipe action Retry Yeniden dene - No comment provided by engineer. + alert action Reveal @@ -7564,6 +7576,10 @@ report reason TCP bağlantısı No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout TCP bağlantı zaman aşımı diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff index d17fbbbbe2..f77e6a984b 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -1962,7 +1962,7 @@ This is your own one-time link! Connection error Помилка підключення - No comment provided by engineer. + alert title Connection error (AUTH) @@ -2009,7 +2009,7 @@ This is your own one-time link! Connection timeout Тайм-аут з'єднання - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3240,7 +3240,7 @@ chat item action Error connecting to forwarding server %@. Please try later. Помилка підключення до сервера переадресації %@. Спробуйте пізніше. - No comment provided by engineer. + alert message Error creating address @@ -3899,9 +3899,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. Серверу переадресації %@ не вдалося з'єднатися з сервером призначення %@. Спробуйте пізніше. - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -5381,6 +5381,10 @@ This is your link for group %@! Немає дозволу на запис голосового повідомлення No comment provided by engineer. + + No private routing session + alert title + No push server Локально @@ -5854,7 +5858,7 @@ Please share any other issues with the developers. Please check your network connection with %@ and try again. Будь ласка, перевірте підключення до мережі за допомогою %@ і спробуйте ще раз. - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -6024,7 +6028,11 @@ Error: %@ Private routing error Помилка приватної маршрутизації - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6131,6 +6139,10 @@ Enable in *Network & servers* settings. Захистіть свої профілі чату паролем! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout Тайм-аут протоколу @@ -6571,7 +6583,7 @@ swipe action Retry Спробуйте ще раз - No comment provided by engineer. + alert action Reveal @@ -7673,6 +7685,10 @@ report reason TCP-з'єднання No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout Тайм-аут TCP-з'єднання diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index 33e1811e74..71ee0f716a 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -1956,7 +1956,7 @@ This is your own one-time link! Connection error 连接错误 - No comment provided by engineer. + alert title Connection error (AUTH) @@ -2002,7 +2002,7 @@ This is your own one-time link! Connection timeout 连接超时 - No comment provided by engineer. + alert title Connection with desktop stopped @@ -3230,7 +3230,7 @@ chat item action Error connecting to forwarding server %@. Please try later. 连接到转发服务器 %@ 时出错。请稍后尝试。 - No comment provided by engineer. + alert message Error creating address @@ -3890,9 +3890,9 @@ snd error text No comment provided by engineer. - Forwarding server %@ failed to connect to destination server %@. Please try later. + Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. 转发服务器 %@ 无法连接到目标服务器 %@。请稍后尝试。 - No comment provided by engineer. + alert message Forwarding server address is incompatible with network settings: %@. @@ -5384,6 +5384,10 @@ This is your link for group %@! 没有录制语音消息的权限 No comment provided by engineer. + + No private routing session + alert title + No push server 本地 @@ -5863,7 +5867,7 @@ Please share any other issues with the developers. Please check your network connection with %@ and try again. 请检查您与%@的网络连接,然后重试。 - No comment provided by engineer. + alert message Please check yours and your contact preferences. @@ -6032,7 +6036,11 @@ Error: %@ Private routing error 专用路由错误 - No comment provided by engineer. + alert title + + + Private routing timeout + alert title Profile and server connections @@ -6139,6 +6147,10 @@ Enable in *Network & servers* settings. 使用密码保护您的聊天资料! No comment provided by engineer. + + Protocol background timeout + No comment provided by engineer. + Protocol timeout 协议超时 @@ -6577,7 +6589,7 @@ swipe action Retry 重试 - No comment provided by engineer. + alert action Reveal @@ -7665,6 +7677,10 @@ report reason TCP 连接 No comment provided by engineer. + + TCP connection bg timeout + No comment provided by engineer. + TCP connection timeout TCP 连接超时 diff --git a/apps/ios/bg.lproj/Localizable.strings b/apps/ios/bg.lproj/Localizable.strings index fab71c9d1c..3057d87e35 100644 --- a/apps/ios/bg.lproj/Localizable.strings +++ b/apps/ios/bg.lproj/Localizable.strings @@ -309,6 +309,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Приеми"; @@ -321,7 +322,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "Приемане на заявка за контакт от %@?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Приеми инкогнито"; @@ -643,9 +644,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "Автоматично приемане на изображения"; -/* alert title */ -"SimpleX address settings" = "Автоматично приемане на настройки"; - /* No comment provided by engineer. */ "Back" = "Назад"; @@ -1043,7 +1041,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection" = "Връзка"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Грешка при свързване"; /* No comment provided by engineer. */ @@ -1058,7 +1056,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "Връзката е прекратена"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Времето на изчакване за установяване на връзката изтече"; /* connection information */ @@ -2817,7 +2815,7 @@ new chat action */ /* alert action */ "Open" = "Отвори"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Отвори чат"; /* authentication reason */ @@ -2913,7 +2911,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Моля, проверете дали сте използвали правилния линк или поискайте вашия контакт, за да ви изпрати друг."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Моля, проверете мрежовата си връзка с %@ и опитайте отново."; /* No comment provided by engineer. */ @@ -3120,14 +3118,15 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "Намалена консумация на батерията"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Отхвърляне"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Отхвърляне (подателят НЕ бива уведомен)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Отхвърли заявката за контакт"; /* call status */ @@ -3217,7 +3216,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Грешка при възстановяване на базата данни"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Опитай отново"; /* chat item action */ @@ -3368,9 +3367,6 @@ chat item action */ /* No comment provided by engineer. */ "Send delivery receipts to" = "Изпращайте потвърждениe за доставка на"; -/* No comment provided by engineer. */ -"send to connect" = "изпрати лично съобщение"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Изпрати лично съобщение за свързване"; @@ -3543,6 +3539,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX Address" = "SimpleX Адрес"; +/* alert title */ +"SimpleX address settings" = "Автоматично приемане на настройки"; + /* No comment provided by engineer. */ "SimpleX Chat security was audited by Trail of Bits." = "Сигурността на SimpleX Chat беше одитирана от Trail of Bits."; @@ -3762,7 +3761,7 @@ chat item action */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Втората отметка, която пропуснахме! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "Подателят НЯМА да бъде уведомен"; /* No comment provided by engineer. */ @@ -4215,9 +4214,6 @@ chat item action */ /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "Вие сте свързани към сървъра, използван за получаване на съобщения от този контакт."; -/* No comment provided by engineer. */ -"You are invited to group" = "вие сте поканени в групата"; - /* No comment provided by engineer. */ "You are invited to group" = "Поканени сте в групата"; @@ -4427,3 +4423,4 @@ chat item action */ /* No comment provided by engineer. */ "Your SimpleX address" = "Вашият адрес в SimpleX"; + diff --git a/apps/ios/cs.lproj/Localizable.strings b/apps/ios/cs.lproj/Localizable.strings index 8e6c42bc31..364e4caa24 100644 --- a/apps/ios/cs.lproj/Localizable.strings +++ b/apps/ios/cs.lproj/Localizable.strings @@ -291,6 +291,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Přijmout"; @@ -300,7 +301,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "Přijmout žádost o kontakt od %@?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Přijmout inkognito"; @@ -754,7 +755,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection" = "Připojení"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Chyba připojení"; /* No comment provided by engineer. */ @@ -766,7 +767,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection request sent!" = "Požadavek na připojení byl odeslán!"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Časový limit připojení"; /* connection information */ @@ -2227,7 +2228,7 @@ new chat action */ /* alert action */ "Open" = "Otevřít"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Otevřete chat"; /* authentication reason */ @@ -2281,7 +2282,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Zkontrolujte, zda jste použili správný odkaz, nebo požádejte kontakt, aby vám poslal jiný."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Zkontrolujte síťové připojení pomocí %@ a zkuste to znovu."; /* No comment provided by engineer. */ @@ -2455,14 +2456,15 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "Snížení spotřeby baterie"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Odmítnout"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Odmítnout kontakt (odesílatel NEBUDE upozorněn)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Odmítnout žádost o kontakt"; /* call status */ @@ -2658,9 +2660,6 @@ chat item action */ /* No comment provided by engineer. */ "Send delivery receipts to" = "Potvrzení o doručení zasílat na"; -/* No comment provided by engineer. */ -"send to connect" = "odeslat přímou zprávu"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Odeslat přímou zprávu pro připojení"; @@ -2995,7 +2994,7 @@ chat item action */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Druhé zaškrtnutí jsme přehlédli! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "Odesílatel NEBUDE informován"; /* No comment provided by engineer. */ @@ -3301,9 +3300,6 @@ chat item action */ /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "Jste připojeni k serveru, který se používá k přijímání zpráv od tohoto kontaktu."; -/* No comment provided by engineer. */ -"You are invited to group" = "jste pozváni do skupiny"; - /* No comment provided by engineer. */ "You are invited to group" = "Jste pozváni do skupiny"; @@ -3489,3 +3485,4 @@ chat item action */ /* No comment provided by engineer. */ "Your SimpleX address" = "Vaše SimpleX adresa"; + diff --git a/apps/ios/de.lproj/Localizable.strings b/apps/ios/de.lproj/Localizable.strings index 524bbac90e..c57af773a5 100644 --- a/apps/ios/de.lproj/Localizable.strings +++ b/apps/ios/de.lproj/Localizable.strings @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Annehmen"; @@ -357,10 +358,13 @@ swipe action */ /* No comment provided by engineer. */ "Accept connection request?" = "Kontaktanfrage annehmen?"; +/* alert title */ +"Accept contact request" = "Kontaktanfrage akzeptieren"; + /* notification body */ "Accept contact request from %@?" = "Die Kontaktanfrage von %@ annehmen?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Inkognito akzeptieren"; @@ -403,6 +407,9 @@ swipe action */ /* No comment provided by engineer. */ "Add list" = "Liste hinzufügen"; +/* placeholder for sending contact request */ +"Add message" = "Nachricht hinzufügen"; + /* No comment provided by engineer. */ "Add profile" = "Profil hinzufügen"; @@ -412,6 +419,9 @@ swipe action */ /* No comment provided by engineer. */ "Add servers by scanning QR codes." = "Server durch Scannen von QR Codes hinzufügen."; +/* No comment provided by engineer. */ +"Add short link" = "Verkürzten Link hinzufügen"; + /* No comment provided by engineer. */ "Add team members" = "Team-Mitglieder aufnehmen"; @@ -754,9 +764,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "Bilder automatisch akzeptieren"; -/* alert title */ -"SimpleX address settings" = "Einstellungen automatisch akzeptieren"; - /* No comment provided by engineer. */ "Back" = "Zurück"; @@ -846,7 +853,7 @@ marked deleted chat item preview text */ "Blur for better privacy." = "Für bessere Privatsphäre verpixeln."; /* No comment provided by engineer. */ -"Blur media" = "Medium verpixeln"; +"Blur media" = "Medien verpixeln"; /* No comment provided by engineer. */ "bold" = "fett"; @@ -914,6 +921,9 @@ marked deleted chat item preview text */ /* No comment provided by engineer. */ "Can't call member" = "Mitglied kann nicht angerufen werden"; +/* alert title */ +"Can't change profile" = "Änderung des Profils nicht möglich"; + /* No comment provided by engineer. */ "Can't invite contact!" = "Kontakt kann nicht eingeladen werden!"; @@ -1307,7 +1317,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection blocked" = "Verbindung blockiert"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Verbindungsfehler"; /* No comment provided by engineer. */ @@ -1337,7 +1347,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "Verbindung beendet"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Verbindungszeitüberschreitung"; /* No comment provided by engineer. */ @@ -1391,6 +1401,9 @@ set passcode view */ /* No comment provided by engineer. */ "Contact preferences" = "Kontakt-Präferenzen"; +/* No comment provided by engineer. */ +"contact should accept…" = "Kontakt sollte akzeptieren…"; + /* No comment provided by engineer. */ "Contact will be deleted - this cannot be undone!" = "Kontakt wird gelöscht. Dies kann nicht rückgängig gemacht werden!"; @@ -1967,6 +1980,9 @@ chat item action */ /* No comment provided by engineer. */ "Edit group profile" = "Gruppenprofil bearbeiten"; +/* No comment provided by engineer. */ +"Empty message!" = "Leere Nachricht!"; + /* No comment provided by engineer. */ "Enable" = "Aktivieren"; @@ -2153,15 +2169,24 @@ chat item action */ /* alert title */ "Error accepting member" = "Fehler beim Übernehmen des Mitglieds"; +/* No comment provided by engineer. */ +"Error adding address short link" = "Fehler beim Hinzufügen eines verkürzten Adresslinks"; + /* No comment provided by engineer. */ "Error adding member(s)" = "Fehler beim Hinzufügen von Mitgliedern"; /* alert title */ "Error adding server" = "Fehler beim Hinzufügen des Servers"; +/* No comment provided by engineer. */ +"Error adding short link" = "Fehler beim Hinzufügen eines verkürzten Links"; + /* No comment provided by engineer. */ "Error changing address" = "Fehler beim Wechseln der Empfängeradresse"; +/* alert title */ +"Error changing chat profile" = "Fehler beim Wechseln des Chat-Profils"; + /* No comment provided by engineer. */ "Error changing connection profile" = "Fehler beim Wechseln des Verbindungs-Profils"; @@ -2177,7 +2202,7 @@ chat item action */ /* No comment provided by engineer. */ "Error checking token status" = "Fehler beim Überprüfen des Token-Status"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "Fehler beim Verbinden mit dem Weiterleitungsserver %@. Bitte versuchen Sie es später erneut."; /* No comment provided by engineer. */ @@ -2264,6 +2289,12 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Fehler beim Öffnen des Chats"; +/* No comment provided by engineer. */ +"Error preparing contact" = "Fehler bei der Kontaktaufnahme"; + +/* No comment provided by engineer. */ +"Error preparing group" = "Fehler beim Vorbereiten der Gruppe"; + /* alert title */ "Error receiving file" = "Fehler beim Herunterladen der Datei"; @@ -2276,6 +2307,9 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Fehler beim Registrieren für Benachrichtigungen"; +/* alert title */ +"Error rejecting contact request" = "Fehler bei der Ablehnung der Kontaktanfrage"; + /* alert title */ "Error removing member" = "Fehler beim Entfernen des Mitglieds"; @@ -2330,7 +2364,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "Fehler beim Beenden des Chats"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "Fehler beim Wechseln des Profils"; /* alertTitle */ @@ -2620,6 +2654,9 @@ snd error text */ /* message preview */ "Good morning!" = "Guten Morgen!"; +/* shown on group welcome message */ +"group" = "Gruppe"; + /* No comment provided by engineer. */ "Group" = "Gruppe"; @@ -2677,6 +2714,9 @@ snd error text */ /* snd group event chat item */ "group profile updated" = "Gruppenprofil aktualisiert"; +/* alert message */ +"Group profile was changed. If you save it, the updated profile will be sent to group members." = "Das Gruppenprofil wurde geändert. Wenn Sie es speichern, wird das aktualisierte Profil an die Gruppenmitglieder gesendet."; + /* No comment provided by engineer. */ "Group welcome message" = "Gruppen-Begrüßungsmeldung"; @@ -3304,6 +3344,9 @@ snd error text */ /* No comment provided by engineer. */ "Messages & files" = "Nachrichten"; +/* No comment provided by engineer. */ +"Messages are protected by **end-to-end encryption**." = "Nachrichten sind durch **Ende-zu-Ende-Verschlüsselung** geschützt."; + /* No comment provided by engineer. */ "Messages from %@ will be shown!" = "Die Nachrichten von %@ werden angezeigt!"; @@ -3741,7 +3784,7 @@ new chat action */ /* No comment provided by engineer. */ "Open changes" = "Änderungen öffnen"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Chat öffnen"; /* authentication reason */ @@ -3759,9 +3802,24 @@ new chat action */ /* authentication reason */ "Open migration to another device" = "Migration auf ein anderes Gerät öffnen"; +/* new chat action */ +"Open new chat" = "Neuen Chat eröffnen"; + +/* new chat action */ +"Open new group" = "Neue Gruppe eröffnen"; + /* No comment provided by engineer. */ "Open Settings" = "Geräte-Einstellungen öffnen"; +/* No comment provided by engineer. */ +"Open to accept" = "Zum Akzeptieren öffnen"; + +/* No comment provided by engineer. */ +"Open to connect" = "Zum Verbinden öffnen"; + +/* No comment provided by engineer. */ +"Open to join" = "Zum Beitreten öffnen"; + /* No comment provided by engineer. */ "Opening app…" = "App wird geöffnet…"; @@ -3891,7 +3949,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Überprüfen Sie bitte, ob Sie den richtigen Link genutzt haben oder bitten Sie Ihren Kontakt nochmal darum, Ihnen einen Link zuzusenden."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Bitte überprüfen Sie Ihre Netzwerkverbindung mit %@ und versuchen Sie es erneut."; /* No comment provided by engineer. */ @@ -3996,7 +4054,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "Privates Routing"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "Fehler beim privaten Routing"; /* No comment provided by engineer. */ @@ -4017,6 +4075,9 @@ new chat action */ /* alert message */ "Profile update will be sent to your contacts." = "Profil-Aktualisierung wird an Ihre Kontakte gesendet."; +/* alert message */ +"Profile will be shared via the address link." = "Das Profil wird über den Adress-Link geteilt."; + /* No comment provided by engineer. */ "Prohibit audio/video calls." = "Audio-/Video-Anrufe nicht erlauben."; @@ -4203,14 +4264,15 @@ new chat action */ /* token status text */ "Registered" = "Registriert"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Ablehnen"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Kontakt ablehnen (der Absender wird NICHT benachrichtigt)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Kontaktanfrage ablehnen"; /* alert title */ @@ -4318,6 +4380,9 @@ swipe action */ /* No comment provided by engineer. */ "Reports" = "Meldungen"; +/* No comment provided by engineer. */ +"request is sent" = "Anfrage wurde gesendet"; + /* No comment provided by engineer. */ "request to join rejected" = "Beitrittsanfrage abgelehnt"; @@ -4369,7 +4434,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Fehler bei der Wiederherstellung der Datenbank"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Wiederholen"; /* chat item action */ @@ -4418,6 +4483,9 @@ chat item action */ /* alert button */ "Save (and notify contacts)" = "Speichern (und Kontakte benachrichtigen)"; +/* alert button */ +"Save (and notify members)" = "Speichern (und Mitglieder benachrichtigen)"; + /* alert title */ "Save admission settings?" = "Speichern der Aufnahme-Einstellungen?"; @@ -4436,6 +4504,9 @@ chat item action */ /* No comment provided by engineer. */ "Save group profile" = "Gruppenprofil speichern"; +/* alert title */ +"Save group profile?" = "Gruppenprofil speichern?"; + /* No comment provided by engineer. */ "Save list" = "Liste speichern"; @@ -4575,10 +4646,10 @@ chat item action */ "Send a live message - it will update for the recipient(s) as you type it" = "Eine Live Nachricht senden - der/die Empfänger sieht/sehen Nachrichtenaktualisierungen, während Sie sie eingeben"; /* No comment provided by engineer. */ -"Send delivery receipts to" = "Empfangsbestätigungen senden an"; +"Send contact request?" = "Kontakt-Anfrage senden?"; /* No comment provided by engineer. */ -"send to connect" = "Direktnachricht senden"; +"Send delivery receipts to" = "Empfangsbestätigungen senden an"; /* No comment provided by engineer. */ "Send direct message to connect" = "Eine Direktnachricht zum Verbinden senden"; @@ -4616,6 +4687,12 @@ chat item action */ /* No comment provided by engineer. */ "Send receipts" = "Bestätigungen senden"; +/* No comment provided by engineer. */ +"Send request" = "Anfrage senden"; + +/* No comment provided by engineer. */ +"Send request without message" = "Anfrage ohne Nachricht senden"; + /* No comment provided by engineer. */ "Send them from gallery or custom keyboards." = "Senden Sie diese aus dem Fotoalbum oder von individuellen Tastaturen."; @@ -4676,6 +4753,9 @@ chat item action */ /* No comment provided by engineer. */ "Sent reply" = "Gesendete Antwort"; +/* No comment provided by engineer. */ +"Sent to your contact after connection." = "Wird nach der Verbindung an Ihren Kontakt gesendet."; + /* No comment provided by engineer. */ "Sent total" = "Summe aller gesendeten Nachrichten"; @@ -4816,11 +4896,17 @@ chat item action */ "Share from other apps." = "Aus anderen Apps heraus teilen."; /* No comment provided by engineer. */ -"Share link" = "Link teilen"; +"Share group profile via link" = "Gruppenprofil über einen Link teilen"; /* No comment provided by engineer. */ +"Share link" = "Link teilen"; + +/* alert button */ "Share profile" = "Profil teilen"; +/* alert title */ +"Share profile via link" = "Profil über einen Link teilen"; + /* No comment provided by engineer. */ "Share SimpleX address on social media." = "Die SimpleX-Adresse auf sozialen Medien teilen."; @@ -4878,6 +4964,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX address or 1-time link?" = "SimpleX-Adresse oder Einmal-Link?"; +/* alert title */ +"SimpleX address settings" = "Einstellungen automatisch akzeptieren"; + /* simplex link type */ "SimpleX channel link" = "SimpleX-Kanal-Link"; @@ -5200,7 +5289,7 @@ report reason */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Wir haben das zweite Häkchen vermisst! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "Der Absender wird NICHT benachrichtigt"; /* No comment provided by engineer. */ @@ -5323,6 +5412,9 @@ report reason */ /* No comment provided by engineer. */ "To support instant push notifications the chat database has to be migrated." = "Um sofortige Push-Benachrichtigungen zu unterstützen, muss die Chat-Datenbank migriert werden."; +/* alert message */ +"To use another profile after connection attempt, delete the chat and use the link again." = "Wenn Sie nach dem Verbindungsversuch ein anderes Profil verwenden möchten, löschen Sie den Chat und verwenden Sie den Link erneut."; + /* No comment provided by engineer. */ "To use the servers of **%@**, accept conditions of use." = "Um die Server von **%@** zu nutzen, müssen Sie dessen Nutzungsbedingungen akzeptieren."; @@ -5830,9 +5922,6 @@ report reason */ /* No comment provided by engineer. */ "You are invited to group" = "Sie sind zu der Gruppe eingeladen"; -/* No comment provided by engineer. */ -"You are invited to group" = "Sie sind zu der Gruppe eingeladen"; - /* No comment provided by engineer. */ "You are not connected to these servers. Private routing is used to deliver messages to them." = "Sie sind nicht mit diesen Servern verbunden. Zur Auslieferung von Nachrichten an diese Server wird privates Routing genutzt."; @@ -5980,6 +6069,9 @@ report reason */ /* snd group event chat item */ "you unblocked %@" = "Sie haben %@ freigegeben"; +/* No comment provided by engineer. */ +"You will be able to send messages **only after your request is accepted**." = "Sie können erst dann Nachrichten versenden, **sobald Ihre Anfrage akzeptiert wurde**."; + /* No comment provided by engineer. */ "You will be connected to group when the group host's device is online, please wait or check later!" = "Sie werden mit der Gruppe verbunden, sobald das Endgerät des Gruppen-Hosts online ist. Bitte warten oder schauen Sie später nochmal nach!"; @@ -6031,6 +6123,9 @@ report reason */ /* No comment provided by engineer. */ "Your chat profiles" = "Ihre Chat-Profile"; +/* alert message */ +"Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Ihr Chat wurde nach %@ verschoben, aber es ist ein unerwarteter Fehler aufgetreten, als Sie zum Profil weitergeleitet wurden."; + /* No comment provided by engineer. */ "Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Ihre Verbindung wurde auf %@ verschoben. Während Sie auf das Profil weitergeleitet wurden trat aber ein unerwarteter Fehler auf."; @@ -6090,3 +6185,4 @@ report reason */ /* No comment provided by engineer. */ "Your SimpleX address" = "Ihre SimpleX-Adresse"; + diff --git a/apps/ios/es.lproj/Localizable.strings b/apps/ios/es.lproj/Localizable.strings index 05f2179ac4..1ff4b22ecc 100644 --- a/apps/ios/es.lproj/Localizable.strings +++ b/apps/ios/es.lproj/Localizable.strings @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Aceptar"; @@ -360,7 +361,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "¿Aceptar solicitud de contacto de %@?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Aceptar incógnito"; @@ -412,6 +413,9 @@ swipe action */ /* No comment provided by engineer. */ "Add servers by scanning QR codes." = "Añadir servidores mediante el escaneo de códigos QR."; +/* No comment provided by engineer. */ +"Add short link" = "Añadir enlace corto"; + /* No comment provided by engineer. */ "Add team members" = "Añadir miembros del equipo"; @@ -754,9 +758,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "Aceptar imágenes automáticamente"; -/* alert title */ -"SimpleX address settings" = "Auto aceptar configuración"; - /* No comment provided by engineer. */ "Back" = "Volver"; @@ -1307,7 +1308,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection blocked" = "Conexión bloqueada"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Error conexión"; /* No comment provided by engineer. */ @@ -1337,7 +1338,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "Conexión finalizada"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Tiempo de conexión agotado"; /* No comment provided by engineer. */ @@ -2159,6 +2160,9 @@ chat item action */ /* alert title */ "Error adding server" = "Error al añadir servidor"; +/* No comment provided by engineer. */ +"Error adding short link" = "Error al añadir enlace corto"; + /* No comment provided by engineer. */ "Error changing address" = "Error al cambiar servidor"; @@ -2177,7 +2181,7 @@ chat item action */ /* No comment provided by engineer. */ "Error checking token status" = "Error al verificar el estado del token"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "Error al conectar con el servidor de reenvío %@. Por favor, inténtalo más tarde."; /* No comment provided by engineer. */ @@ -2330,7 +2334,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "Error al parar SimpleX"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "Error al cambiar perfil"; /* alertTitle */ @@ -2677,6 +2681,9 @@ snd error text */ /* snd group event chat item */ "group profile updated" = "perfil de grupo actualizado"; +/* alert message */ +"Group profile was changed. If you save it, the updated profile will be sent to group members." = "El perfil del grupo ha cambiado. Si lo guardas, el perfil actualizado se enviará a los miembros del grupo."; + /* No comment provided by engineer. */ "Group welcome message" = "Mensaje de bienvenida en grupos"; @@ -3741,7 +3748,7 @@ new chat action */ /* No comment provided by engineer. */ "Open changes" = "Abrir cambios"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Abrir chat"; /* authentication reason */ @@ -3891,7 +3898,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Comprueba que has usado el enlace correcto o pide a tu contacto que te envíe otro."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Comprueba tu conexión de red con %@ e inténtalo de nuevo."; /* No comment provided by engineer. */ @@ -3996,7 +4003,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "Enrutamiento privado"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "Error de enrutamiento privado"; /* No comment provided by engineer. */ @@ -4203,14 +4210,15 @@ new chat action */ /* token status text */ "Registered" = "Registrado"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Rechazar"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Rechazar contacto (NO se notifica al remitente)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Rechazar solicitud de contacto"; /* alert title */ @@ -4369,7 +4377,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Error al restaurar base de datos"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Reintentar"; /* chat item action */ @@ -4418,6 +4426,9 @@ chat item action */ /* alert button */ "Save (and notify contacts)" = "Guardar (y notificar contactos)"; +/* alert button */ +"Save (and notify members)" = "Guardar (y notificar miembros)"; + /* alert title */ "Save admission settings?" = "¿Guardar configuración?"; @@ -4436,6 +4447,9 @@ chat item action */ /* No comment provided by engineer. */ "Save group profile" = "Guardar perfil de grupo"; +/* alert title */ +"Save group profile?" = "¿Guardar perfil del grupo?"; + /* No comment provided by engineer. */ "Save list" = "Guardar lista"; @@ -4577,9 +4591,6 @@ chat item action */ /* No comment provided by engineer. */ "Send delivery receipts to" = "Enviar confirmaciones de entrega a"; -/* No comment provided by engineer. */ -"send to connect" = "Enviar mensaje directo"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Envía un mensaje para conectar"; @@ -4818,7 +4829,7 @@ chat item action */ /* No comment provided by engineer. */ "Share link" = "Compartir enlace"; -/* No comment provided by engineer. */ +/* alert button */ "Share profile" = "Perfil a compartir"; /* No comment provided by engineer. */ @@ -4878,6 +4889,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX address or 1-time link?" = "¿Dirección SimpleX o enlace de un uso?"; +/* alert title */ +"SimpleX address settings" = "Auto aceptar configuración"; + /* simplex link type */ "SimpleX channel link" = "Enlace de canal SimpleX"; @@ -5200,7 +5214,7 @@ report reason */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "¡El doble check que nos faltaba! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "El remitente NO será notificado"; /* No comment provided by engineer. */ @@ -5827,9 +5841,6 @@ report reason */ /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "Estás conectado al servidor usado para recibir mensajes de este contacto."; -/* No comment provided by engineer. */ -"You are invited to group" = "has sido invitado a un grupo"; - /* No comment provided by engineer. */ "You are invited to group" = "Has sido invitado a un grupo"; @@ -6090,3 +6101,4 @@ report reason */ /* No comment provided by engineer. */ "Your SimpleX address" = "Mi dirección SimpleX"; + diff --git a/apps/ios/fi.lproj/Localizable.strings b/apps/ios/fi.lproj/Localizable.strings index 2ab926587d..e22baa5caf 100644 --- a/apps/ios/fi.lproj/Localizable.strings +++ b/apps/ios/fi.lproj/Localizable.strings @@ -240,6 +240,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Hyväksy"; @@ -249,7 +250,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "Hyväksy kontaktipyyntö %@:ltä?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Hyväksy tuntematon"; @@ -694,7 +695,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection" = "Yhteys"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Yhteysvirhe"; /* No comment provided by engineer. */ @@ -706,7 +707,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection request sent!" = "Yhteyspyyntö lähetetty!"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Yhteyden aikakatkaisu"; /* connection information */ @@ -2152,7 +2153,7 @@ new chat action */ /* No comment provided by engineer. */ "Only your contact can send voice messages." = "Vain kontaktisi voi lähettää ääniviestejä."; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Avaa keskustelu"; /* authentication reason */ @@ -2206,7 +2207,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Tarkista, että käytit oikeaa linkkiä tai pyydä kontaktiasi lähettämään sinulle uusi linkki."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Tarkista verkkoyhteytesi %@:lla ja yritä uudelleen."; /* No comment provided by engineer. */ @@ -2380,14 +2381,15 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "Pienempi akun käyttö"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Hylkää"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Hylkää (lähettäjälle EI ilmoiteta)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Hylkää yhteyspyyntö"; /* call status */ @@ -2911,7 +2913,7 @@ chat item action */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Toinen kuittaus, joka uupui! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "Lähettäjälle EI ilmoiteta"; /* No comment provided by engineer. */ @@ -3214,9 +3216,6 @@ chat item action */ /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "Olet yhteydessä palvelimeen, jota käytetään vastaanottamaan viestejä tältä kontaktilta."; -/* No comment provided by engineer. */ -"You are invited to group" = "sinut on kutsuttu ryhmään"; - /* No comment provided by engineer. */ "You are invited to group" = "Sinut on kutsuttu ryhmään"; @@ -3402,3 +3401,4 @@ chat item action */ /* No comment provided by engineer. */ "Your SimpleX address" = "SimpleX-osoitteesi"; + diff --git a/apps/ios/fr.lproj/Localizable.strings b/apps/ios/fr.lproj/Localizable.strings index 3c5656c408..4ec270e58e 100644 --- a/apps/ios/fr.lproj/Localizable.strings +++ b/apps/ios/fr.lproj/Localizable.strings @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Accepter"; @@ -354,7 +355,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "Accepter la demande de contact de %@ ?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Accepter en incognito"; @@ -727,9 +728,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "Images auto-acceptées"; -/* alert title */ -"SimpleX address settings" = "Paramètres de réception automatique"; - /* No comment provided by engineer. */ "Back" = "Retour"; @@ -1268,7 +1266,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection blocked" = "Connexion bloquée"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Erreur de connexion"; /* No comment provided by engineer. */ @@ -1298,7 +1296,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "Connexion terminée"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Délai de connexion"; /* No comment provided by engineer. */ @@ -2123,7 +2121,7 @@ chat item action */ /* No comment provided by engineer. */ "Error checking token status" = "Erreur lors de la vérification de l'état du jeton (token)"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "Erreur de connexion au serveur de redirection %@. Veuillez réessayer plus tard."; /* No comment provided by engineer. */ @@ -2273,7 +2271,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "Erreur lors de l'arrêt du chat"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "Erreur lors du changement de profil"; /* alertTitle */ @@ -3558,7 +3556,7 @@ new chat action */ /* No comment provided by engineer. */ "Open changes" = "Ouvrir les modifications"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Ouvrir le chat"; /* authentication reason */ @@ -3693,7 +3691,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Veuillez vérifier que vous avez utilisé le bon lien ou demandez à votre contact de vous en envoyer un autre."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Veuillez vérifier votre connexion réseau avec %@ et réessayer."; /* No comment provided by engineer. */ @@ -3777,7 +3775,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "Routage privé"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "Erreur de routage privé"; /* No comment provided by engineer. */ @@ -3972,14 +3970,15 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "Réduction de la consommation de batterie"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Rejeter"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Rejeter le contact (l'expéditeur N'en est PAS informé)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Rejeter la demande de contact"; /* call status */ @@ -4093,7 +4092,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Erreur de restauration de la base de données"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Réessayer"; /* chat item action */ @@ -4283,9 +4282,6 @@ chat item action */ /* No comment provided by engineer. */ "Send delivery receipts to" = "Envoyer les accusés de réception à"; -/* No comment provided by engineer. */ -"send to connect" = "envoyer un message direct"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Envoyer un message direct pour vous connecter"; @@ -4512,7 +4508,7 @@ chat item action */ /* No comment provided by engineer. */ "Share link" = "Partager le lien"; -/* No comment provided by engineer. */ +/* alert button */ "Share profile" = "Partager le profil"; /* No comment provided by engineer. */ @@ -4569,6 +4565,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX address or 1-time link?" = "Adresse SimpleX ou lien unique ?"; +/* alert title */ +"SimpleX address settings" = "Paramètres de réception automatique"; + /* No comment provided by engineer. */ "SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." = "SimpleX Chat et Flux ont conclu un accord pour inclure les serveurs exploités par Flux dans l'application."; @@ -4875,7 +4874,7 @@ chat item action */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Le deuxième coche que nous avons manqué ! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "L'expéditeur N'en sera PAS informé"; /* No comment provided by engineer. */ @@ -5472,9 +5471,6 @@ chat item action */ /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "Vous êtes connecté·e au serveur utilisé pour recevoir les messages de ce contact."; -/* No comment provided by engineer. */ -"You are invited to group" = "vous êtes invité·e au groupe"; - /* No comment provided by engineer. */ "You are invited to group" = "Vous êtes invité·e au groupe"; @@ -5729,3 +5725,4 @@ chat item action */ /* No comment provided by engineer. */ "Your SimpleX address" = "Votre adresse SimpleX"; + diff --git a/apps/ios/hu.lproj/Localizable.strings b/apps/ios/hu.lproj/Localizable.strings index b6b0f438d0..96d1e4e0be 100644 --- a/apps/ios/hu.lproj/Localizable.strings +++ b/apps/ios/hu.lproj/Localizable.strings @@ -314,10 +314,10 @@ time interval */ "A new random profile will be shared." = "Egy új, véletlenszerű profil lesz megosztva."; /* No comment provided by engineer. */ -"A separate TCP connection will be used **for each chat profile you have in the app**." = "**Az összes csevegési profiljához az alkalmazásban** külön TCP-kapcsolat (és SOCKS-hitelesítőadat) lesz használva."; +"A separate TCP connection will be used **for each chat profile you have in the app**." = "**Az összes csevegési profiljához az alkalmazásban** külön TCP-kapcsolat lesz használva."; /* No comment provided by engineer. */ -"A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." = "**Az összes partneréhez és csoporttaghoz** külön TCP-kapcsolat (és SOCKS-hitelesítőadat) lesz használva.\n**Megjegyzés:** ha sok kapcsolata van, az akkumulátor-használat és az adatforgalom jelentősen megnövekedhet, és néhány kapcsolódási kísérlet sikertelen lehet."; +"A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." = "**Az összes partneréhez és csoporttaghoz** külön TCP-kapcsolat lesz használva.\n**Megjegyzés:** ha sok kapcsolata van, akkor az akkumulátor-használat és az adatforgalom jelentősen megnövekedhet, és néhány kapcsolódási kísérlet sikertelen lehet."; /* No comment provided by engineer. */ "Abort" = "Megszakítás"; @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Elfogadás"; @@ -355,12 +356,15 @@ swipe action */ "Accept conditions" = "Feltételek elfogadása"; /* No comment provided by engineer. */ -"Accept connection request?" = "Elfogadja a meghívási kérést?"; +"Accept connection request?" = "Elfogadja a meghívót?"; + +/* alert title */ +"Accept contact request" = "Meghívó elfogadása"; /* notification body */ -"Accept contact request from %@?" = "Elfogadja %@ meghívási kérését?"; +"Accept contact request from %@?" = "Elfogadja %@ meghívóját?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Elfogadás inkognitóban"; @@ -403,6 +407,9 @@ swipe action */ /* No comment provided by engineer. */ "Add list" = "Lista hozzáadása"; +/* placeholder for sending contact request */ +"Add message" = "Üzenet hozzáadása"; + /* No comment provided by engineer. */ "Add profile" = "Profil hozzáadása"; @@ -412,6 +419,9 @@ swipe action */ /* No comment provided by engineer. */ "Add servers by scanning QR codes." = "Kiszolgáló hozzáadása QR-kód beolvasásával."; +/* No comment provided by engineer. */ +"Add short link" = "Rövid hivatkozás hozzáadása"; + /* No comment provided by engineer. */ "Add team members" = "Munkatársak hozzáadása"; @@ -656,7 +666,7 @@ swipe action */ "App passcode" = "Alkalmazás jelkód"; /* No comment provided by engineer. */ -"App passcode is replaced with self-destruct passcode." = "Az alkalmazás-jelkód helyettesítve lesz egy önmegsemmisítő-jelkóddal."; +"App passcode is replaced with self-destruct passcode." = "Az alkalmazásjelkód helyettesítve lesz egy önmegsemmisítő jelkóddal."; /* No comment provided by engineer. */ "App session" = "Alkalmazás munkamenete"; @@ -674,7 +684,7 @@ swipe action */ "Apply" = "Alkalmaz"; /* No comment provided by engineer. */ -"Apply to" = "Alkalmazás erre"; +"Apply to" = "Használat ehhez"; /* No comment provided by engineer. */ "Archive" = "Archívum"; @@ -713,7 +723,7 @@ swipe action */ "Attach" = "Mellékelés"; /* No comment provided by engineer. */ -"attempts" = "próbálkozások"; +"attempts" = "kísérletek"; /* No comment provided by engineer. */ "Audio & video calls" = "Hang- és videóhívások"; @@ -749,14 +759,11 @@ swipe action */ "Auto-accept" = "Automatikus elfogadás"; /* No comment provided by engineer. */ -"Auto-accept contact requests" = "Meghívási kérések automatikus elfogadása"; +"Auto-accept contact requests" = "Meghívók automatikus elfogadása"; /* No comment provided by engineer. */ "Auto-accept images" = "Képek automatikus elfogadása"; -/* alert title */ -"SimpleX address settings" = "Beállítások automatikus elfogadása"; - /* No comment provided by engineer. */ "Back" = "Vissza"; @@ -914,6 +921,9 @@ marked deleted chat item preview text */ /* No comment provided by engineer. */ "Can't call member" = "Nem lehet felhívni a tagot"; +/* alert title */ +"Can't change profile" = "Nem lehet módosítani a profilt"; + /* No comment provided by engineer. */ "Can't invite contact!" = "Nem lehet meghívni a partnert!"; @@ -987,7 +997,7 @@ new chat action */ /* authentication reason set passcode view */ -"Change self-destruct passcode" = "Önmegsemmisítő-jelkód módosítása"; +"Change self-destruct passcode" = "Önmegsemmisítő jelkód módosítása"; /* chat item text */ "changed address for you" = "módosította a címet az Ön számára"; @@ -1038,7 +1048,7 @@ set passcode view */ "Chat is stopped" = "A csevegés megállt"; /* No comment provided by engineer. */ -"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "A csevegés megállt. Ha már használta ezt az adatbázist egy másik eszközön, úgy visszaállítás szükséges a csevegés elindítása előtt."; +"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "A csevegés megállt. Ha ezt az adatbázist már használta egy másik eszközön, akkor a csevegés elindítása előtt vissza kell állítania azt."; /* No comment provided by engineer. */ "Chat list" = "Csevegési lista"; @@ -1307,7 +1317,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection blocked" = "A kapcsolat le van tiltva"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Kapcsolódási hiba"; /* No comment provided by engineer. */ @@ -1326,7 +1336,7 @@ set passcode view */ "Connection notifications" = "Kapcsolódási értesítések"; /* No comment provided by engineer. */ -"Connection request sent!" = "Meghívási kérés elküldve!"; +"Connection request sent!" = "Meghívó elküldve!"; /* No comment provided by engineer. */ "Connection requires encryption renegotiation." = "A kapcsolat titkosítása újraegyeztetést igényel."; @@ -1337,7 +1347,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "Kapcsolat megszakítva"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Időtúllépés kapcsolódáskor"; /* No comment provided by engineer. */ @@ -1391,6 +1401,9 @@ set passcode view */ /* No comment provided by engineer. */ "Contact preferences" = "Partnerbeállítások"; +/* No comment provided by engineer. */ +"contact should accept…" = "a partnernek el kell fogadnia…"; + /* No comment provided by engineer. */ "Contact will be deleted - this cannot be undone!" = "A partner törölve lesz – ez a művelet nem vonható vissza!"; @@ -1461,7 +1474,7 @@ set passcode view */ "Create SimpleX address" = "SimpleX-cím létrehozása"; /* No comment provided by engineer. */ -"Create your profile" = "Saját profil létrehozása"; +"Create your profile" = "Profil létrehozása"; /* No comment provided by engineer. */ "Created" = "Létrehozva"; @@ -1581,7 +1594,7 @@ set passcode view */ "Decentralized" = "Decentralizált"; /* message decrypt error item */ -"Decryption error" = "Titkosításvisszafejtési hiba"; +"Decryption error" = "Titkosítás-visszafejtési hiba"; /* No comment provided by engineer. */ "decryption errors" = "visszafejtési hibák"; @@ -1625,7 +1638,7 @@ swipe action */ "Delete chat" = "Csevegés törlése"; /* No comment provided by engineer. */ -"Delete chat messages from your device." = "Csevegési üzenetek törlése a saját eszközéről."; +"Delete chat messages from your device." = "Csevegési üzenetek törlése az eszközről."; /* No comment provided by engineer. */ "Delete chat profile" = "Csevegési profil törlése"; @@ -1886,7 +1899,7 @@ swipe action */ "Do NOT send messages directly, even if your or destination server does not support private routing." = "NE küldjön üzeneteket közvetlenül, még akkor sem, ha a saját kiszolgálója vagy a célkiszolgáló nem támogatja a privát útválasztást."; /* No comment provided by engineer. */ -"Do not use credentials with proxy." = "Ne használja a hitelesítőadatokat proxyval."; +"Do not use credentials with proxy." = "Ne használja a hitelesítési adatokat proxyval."; /* No comment provided by engineer. */ "Do NOT use private routing." = "NE használjon privát útválasztást."; @@ -1967,6 +1980,9 @@ chat item action */ /* No comment provided by engineer. */ "Edit group profile" = "Csoportprofil szerkesztése"; +/* No comment provided by engineer. */ +"Empty message!" = "Üres üzenet!"; + /* No comment provided by engineer. */ "Enable" = "Engedélyezés"; @@ -2004,7 +2020,7 @@ chat item action */ "Enable self-destruct" = "Önmegsemmisítés engedélyezése"; /* set passcode view */ -"Enable self-destruct passcode" = "Önmegsemmisítő-jelkód engedélyezése"; +"Enable self-destruct passcode" = "Önmegsemmisítő jelkód engedélyezése"; /* authentication reason */ "Enable SimpleX Lock" = "SimpleX-zár bekapcsolása"; @@ -2064,13 +2080,13 @@ chat item action */ "Encrypted message: unexpected error" = "Titkosított üzenet: váratlan hiba"; /* chat item text */ -"encryption agreed" = "titkosítás elfogadva"; +"encryption agreed" = "titkosítása elfogadva"; /* chat item text */ "encryption agreed for %@" = "titkosítás elfogadva %@ számára"; /* chat item text */ -"encryption ok" = "titkosítás rendben"; +"encryption ok" = "titkosítása rendben van"; /* chat item text */ "encryption ok for %@" = "titkosítás rendben %@ számára"; @@ -2121,7 +2137,7 @@ chat item action */ "Enter password above to show!" = "Adja meg a jelszót fentebb a megjelenítéshez!"; /* No comment provided by engineer. */ -"Enter server manually" = "Adja meg a kiszolgálót kézzel"; +"Enter server manually" = "Kiszolgáló megadása kézzel"; /* No comment provided by engineer. */ "Enter this device name…" = "Adja meg ennek az eszköznek a nevét…"; @@ -2148,20 +2164,29 @@ chat item action */ "Error accepting conditions" = "Hiba történt a feltételek elfogadásakor"; /* No comment provided by engineer. */ -"Error accepting contact request" = "Hiba történt a meghívási kérés elfogadásakor"; +"Error accepting contact request" = "Hiba történt a meghívó elfogadásakor"; /* alert title */ "Error accepting member" = "Hiba a tag befogadásakor"; +/* No comment provided by engineer. */ +"Error adding address short link" = "Hiba a rövid címhivatkozás hozzáadásakor"; + /* No comment provided by engineer. */ "Error adding member(s)" = "Hiba történt a tag(ok) hozzáadásakor"; /* alert title */ "Error adding server" = "Hiba történt a kiszolgáló hozzáadásakor"; +/* No comment provided by engineer. */ +"Error adding short link" = "Hiba történt a rövid hivatkozás hozzáadásakor"; + /* No comment provided by engineer. */ "Error changing address" = "Hiba történt a cím módosításakor"; +/* alert title */ +"Error changing chat profile" = "Hiba a csevegési profil módosításakor"; + /* No comment provided by engineer. */ "Error changing connection profile" = "Hiba történt a kapcsolati profilra való váltáskor"; @@ -2177,7 +2202,7 @@ chat item action */ /* No comment provided by engineer. */ "Error checking token status" = "Hiba történt a token állapotának ellenőrzésekor"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "Hiba történt a(z) %@ továbbítókiszolgálóhoz való kapcsolódáskor. Próbálja meg később."; /* No comment provided by engineer. */ @@ -2264,6 +2289,12 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Hiba történt a csevegés megnyitásakor"; +/* No comment provided by engineer. */ +"Error preparing contact" = "Hiba a kapcsolat előkészítésekor"; + +/* No comment provided by engineer. */ +"Error preparing group" = "Hiba a csoport előkészítésekor"; + /* alert title */ "Error receiving file" = "Hiba történt a fájl fogadásakor"; @@ -2276,6 +2307,9 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Hiba történt az értesítések regisztrálásakor"; +/* alert title */ +"Error rejecting contact request" = "Hiba történt a meghívó elutasításakor"; + /* alert title */ "Error removing member" = "Hiba történt a tag eltávolításakor"; @@ -2330,7 +2364,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "Hiba történt a csevegés megállításakor"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "Hiba történt a profilváltáskor"; /* alertTitle */ @@ -2620,6 +2654,9 @@ snd error text */ /* message preview */ "Good morning!" = "Jó reggelt!"; +/* shown on group welcome message */ +"group" = "csoport"; + /* No comment provided by engineer. */ "Group" = "Csoport"; @@ -2672,11 +2709,14 @@ snd error text */ "Group profile" = "Csoportprofil"; /* No comment provided by engineer. */ -"Group profile is stored on members' devices, not on the servers." = "A csoport profilja a tagok eszközein tárolódik, nem a kiszolgálókon."; +"Group profile is stored on members' devices, not on the servers." = "A csoportprofil a tagok eszközein tárolódik, nem a kiszolgálókon."; /* snd group event chat item */ "group profile updated" = "csoportprofil frissítve"; +/* alert message */ +"Group profile was changed. If you save it, the updated profile will be sent to group members." = "Csoportprofil módosítva. Ha menti, akkor a frissített profil el lesz küldve a csoporttagoknak."; + /* No comment provided by engineer. */ "Group welcome message" = "A csoport üdvözlőüzenete"; @@ -2759,7 +2799,7 @@ snd error text */ "If you enter this passcode when opening the app, all app data will be irreversibly removed!" = "Ha az alkalmazás megnyitásakor megadja ezt a jelkódot, az összes alkalmazásadat véglegesen el lesz távolítva!"; /* No comment provided by engineer. */ -"If you enter your self-destruct passcode while opening the app:" = "Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő-jelkódot:"; +"If you enter your self-destruct passcode while opening the app:" = "Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő jelkódot:"; /* No comment provided by engineer. */ "If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." = "Ha most kell használnia a csevegést, koppintson alább a **Befejezés később** lehetőségre (az alkalmazás újraindításakor fel lesz ajánlva az adatbázis átköltöztetése)."; @@ -3304,6 +3344,9 @@ snd error text */ /* No comment provided by engineer. */ "Messages & files" = "Üzenetek és fájlok"; +/* No comment provided by engineer. */ +"Messages are protected by **end-to-end encryption**." = "Az üzenetek **végpontok közötti titkosítással** vannak védve."; + /* No comment provided by engineer. */ "Messages from %@ will be shown!" = "%@ összes üzenete meg fog jelenni!"; @@ -3455,7 +3498,7 @@ snd error text */ "New chat experience 🎉" = "Új csevegési élmény 🎉"; /* notification */ -"New contact request" = "Új meghívási kérés"; +"New contact request" = "Új meghívó"; /* notification */ "New contact:" = "Új kapcsolat:"; @@ -3497,10 +3540,10 @@ snd error text */ "New server" = "Új kiszolgáló"; /* No comment provided by engineer. */ -"New SOCKS credentials will be used every time you start the app." = "Minden alkalommal, amikor elindítja az alkalmazást, új SOCKS-hitelesítő-adatokat fog használni."; +"New SOCKS credentials will be used every time you start the app." = "Minden alkalommal, amikor elindítja az alkalmazást, új SOCKS-hitelesítési adatok lesznek használva."; /* No comment provided by engineer. */ -"New SOCKS credentials will be used for each server." = "Az összes kiszolgálóhoz új, SOCKS-hitelesítő-adatok legyenek használva."; +"New SOCKS credentials will be used for each server." = "Az összes kiszolgálóhoz új, SOCKS-hitelesítési adatok lesznek használva."; /* pref value */ "no" = "nem"; @@ -3741,7 +3784,7 @@ new chat action */ /* No comment provided by engineer. */ "Open changes" = "Módosítások megtekintése"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Csevegés megnyitása"; /* authentication reason */ @@ -3759,9 +3802,24 @@ new chat action */ /* authentication reason */ "Open migration to another device" = "Átköltöztetés indítása egy másik eszközre"; +/* new chat action */ +"Open new chat" = "Új csevegés megnyitása"; + +/* new chat action */ +"Open new group" = "Új csoport megnyitása"; + /* No comment provided by engineer. */ "Open Settings" = "Beállítások megnyitása"; +/* No comment provided by engineer. */ +"Open to accept" = "Megnyitás az elfogadáshoz"; + +/* No comment provided by engineer. */ +"Open to connect" = "Megnyitás a kapcsolódáshoz"; + +/* No comment provided by engineer. */ +"Open to join" = "Megnyitás a csatlakozáshoz"; + /* No comment provided by engineer. */ "Opening app…" = "Az alkalmazás megnyitása…"; @@ -3891,7 +3949,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Ellenőrizze, hogy a megfelelő hivatkozást használta-e, vagy kérje meg a partnerét, hogy küldjön egy másikat."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Ellenőrizze a hálózati kapcsolatát a vele: %@, és próbálja újra."; /* No comment provided by engineer. */ @@ -3931,7 +3989,7 @@ new chat action */ "Please try to disable and re-enable notfications." = "Próbálja meg letiltani és újra engedélyezni az értesítéseket."; /* snd group event chat item */ -"Please wait for group moderators to review your request to join the group." = "Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérelmét."; +"Please wait for group moderators to review your request to join the group." = "Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérését."; /* token info */ "Please wait for token activation to complete." = "Várjon, amíg a token aktiválása befejeződik."; @@ -3996,7 +4054,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "Privát útválasztás"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "Privát útválasztási hiba"; /* No comment provided by engineer. */ @@ -4017,6 +4075,9 @@ new chat action */ /* alert message */ "Profile update will be sent to your contacts." = "A profilfrissítés el lesz küldve a partnerei számára."; +/* alert message */ +"Profile will be shared via the address link." = "A profil meg lesz osztva a címhivatkozáson keresztül."; + /* No comment provided by engineer. */ "Prohibit audio/video calls." = "A hívások kezdeményezése le van tiltva."; @@ -4090,7 +4151,7 @@ new chat action */ "Rate the app" = "Értékelje az alkalmazást"; /* No comment provided by engineer. */ -"Reachable chat toolbar" = "Könnyen elérhető eszköztár"; +"Reachable chat toolbar" = "Könnyen elérhető csevegési eszköztár"; /* chat item menu */ "React…" = "Reagálj…"; @@ -4203,15 +4264,16 @@ new chat action */ /* token status text */ "Registered" = "Regisztrálva"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Elutasítás"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Elutasítás (a feladó NEM kap értesítést)"; -/* No comment provided by engineer. */ -"Reject contact request" = "Meghívási kérés elutasítása"; +/* alert title */ +"Reject contact request" = "Meghívó elutasítása"; /* alert title */ "Reject member?" = "Elutasítja a tagot?"; @@ -4319,10 +4381,13 @@ swipe action */ "Reports" = "Jelentések"; /* No comment provided by engineer. */ -"request to join rejected" = "csatlakozási kérelem elutasítva"; +"request is sent" = "kérés elküldve"; + +/* No comment provided by engineer. */ +"request to join rejected" = "csatlakozási kérés elutasítva"; /* chat list item title */ -"requested to connect" = "Függőben lévő meghívási kérelem"; +"requested to connect" = "Függőben lévő meghívó"; /* No comment provided by engineer. */ "Required" = "Szükséges"; @@ -4369,7 +4434,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Hiba történt az adatbázis visszaállításakor"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Újrapróbálkozás"; /* chat item action */ @@ -4418,8 +4483,11 @@ chat item action */ /* alert button */ "Save (and notify contacts)" = "Mentés (és a partnerek értesítése)"; +/* alert button */ +"Save (and notify members)" = "Mentés (és a tagok értesítése)"; + /* alert title */ -"Save admission settings?" = "Elmenti a befogadási beállításokat?"; +"Save admission settings?" = "Menti a befogadási beállításokat?"; /* alert button */ "Save and notify contact" = "Mentés és a partner értesítése"; @@ -4436,6 +4504,9 @@ chat item action */ /* No comment provided by engineer. */ "Save group profile" = "Csoportprofil mentése"; +/* alert title */ +"Save group profile?" = "Menti a csoportprofilt?"; + /* No comment provided by engineer. */ "Save list" = "Lista mentése"; @@ -4470,10 +4541,10 @@ chat item action */ "Saved" = "Mentett"; /* No comment provided by engineer. */ -"Saved from" = "Elmentve innen"; +"Saved from" = "Mentve innen"; /* No comment provided by engineer. */ -"saved from %@" = "elmentve innen: %@"; +"saved from %@" = "mentve innen: %@"; /* message info title */ "Saved message" = "Mentett üzenet"; @@ -4503,7 +4574,7 @@ chat item action */ "Scan security code from your contact's app." = "Biztonsági kód beolvasása a partnere alkalmazásából."; /* No comment provided by engineer. */ -"Scan server QR code" = "A kiszolgáló QR-kódjának beolvasása"; +"Scan server QR code" = "Kiszolgáló QR-kódjának beolvasása"; /* No comment provided by engineer. */ "search" = "keresés"; @@ -4560,13 +4631,13 @@ chat item action */ "Self-destruct" = "Önmegsemmisítés"; /* No comment provided by engineer. */ -"Self-destruct passcode" = "Önmegsemmisítő-jelkód"; +"Self-destruct passcode" = "Önmegsemmisítő jelkód"; /* No comment provided by engineer. */ -"Self-destruct passcode changed!" = "Az önmegsemmisítő-jelkód módosult!"; +"Self-destruct passcode changed!" = "Az önmegsemmisítő jelkód módosult!"; /* No comment provided by engineer. */ -"Self-destruct passcode enabled!" = "Az önmegsemmisítő-jelkód engedélyezve!"; +"Self-destruct passcode enabled!" = "Az önmegsemmisítő jelkód engedélyezve!"; /* No comment provided by engineer. */ "Send" = "Küldés"; @@ -4575,10 +4646,10 @@ chat item action */ "Send a live message - it will update for the recipient(s) as you type it" = "Élő üzenet küldése – az üzenet a címzett(ek) számára valós időben frissül, ahogy Ön beírja az üzenetet"; /* No comment provided by engineer. */ -"Send delivery receipts to" = "A kézbesítési jelentéseket a következő címre kell küldeni"; +"Send contact request?" = "Elküldi a meghívót?"; /* No comment provided by engineer. */ -"send to connect" = "közvetlen üzenet küldése"; +"Send delivery receipts to" = "A kézbesítési jelentéseket a következő címre kell küldeni"; /* No comment provided by engineer. */ "Send direct message to connect" = "Közvetlen üzenet küldése a kapcsolódáshoz"; @@ -4616,6 +4687,12 @@ chat item action */ /* No comment provided by engineer. */ "Send receipts" = "Kézbesítési jelentések küldése"; +/* No comment provided by engineer. */ +"Send request" = "Kérés küldése"; + +/* No comment provided by engineer. */ +"Send request without message" = "Kérés küldése üzenet nélkül"; + /* No comment provided by engineer. */ "Send them from gallery or custom keyboards." = "Küldje el őket a galériából vagy az egyéni billentyűzetekről."; @@ -4626,7 +4703,7 @@ chat item action */ "Sender cancelled file transfer." = "A fájl küldője visszavonta az átvitelt."; /* No comment provided by engineer. */ -"Sender may have deleted the connection request." = "A küldője törölhette a meghívási kérést."; +"Sender may have deleted the connection request." = "A küldője törölhette a meghívót."; /* No comment provided by engineer. */ "Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "A kézbesítési jelentések küldése engedélyezve lesz az összes látható csevegési profilban lévő összes partnere számára."; @@ -4676,6 +4753,9 @@ chat item action */ /* No comment provided by engineer. */ "Sent reply" = "Válaszüzenet-buborék színe"; +/* No comment provided by engineer. */ +"Sent to your contact after connection." = "Elküldés a partnernek a kapcsolódást követően."; + /* No comment provided by engineer. */ "Sent total" = "Összes elküldött üzenet"; @@ -4704,7 +4784,7 @@ chat item action */ "Server operators" = "Kiszolgálóüzemeltetők"; /* alert title */ -"Server protocol changed." = "A kiszolgáló-protokoll módosult."; +"Server protocol changed." = "A kiszolgálóprotokoll módosult."; /* queue info */ "server queue info: %@\n\nlast received msg: %@" = "a kiszolgáló sorbaállítási információi: %1$@\n\nutoljára fogadott üzenet: %2$@"; @@ -4816,11 +4896,17 @@ chat item action */ "Share from other apps." = "Megosztás más alkalmazásokból."; /* No comment provided by engineer. */ -"Share link" = "Megosztás"; +"Share group profile via link" = "Csoportprofil megosztása hivatkozáson keresztül"; /* No comment provided by engineer. */ +"Share link" = "Megosztás"; + +/* alert button */ "Share profile" = "Profil megosztása"; +/* alert title */ +"Share profile via link" = "Profil megosztása hivatkozáson keresztül"; + /* No comment provided by engineer. */ "Share SimpleX address on social media." = "SimpleX-cím megosztása a közösségi médiában."; @@ -4878,6 +4964,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX address or 1-time link?" = "SimpleX-cím vagy egyszer használható meghívó?"; +/* alert title */ +"SimpleX address settings" = "Beállítások automatikus elfogadása"; + /* simplex link type */ "SimpleX channel link" = "SimpleX-csatornahivatkozás"; @@ -4918,10 +5007,10 @@ chat item action */ "SimpleX Lock turned on" = "SimpleX-zár bekapcsolva"; /* simplex link type */ -"SimpleX one-time invitation" = "Egyszer használható SimpleX-meghívó"; +"SimpleX one-time invitation" = "Egyszer használható SimpleX meghívó"; /* No comment provided by engineer. */ -"SimpleX protocols reviewed by Trail of Bits." = "A SimpleX-protokollokat a Trail of Bits auditálta."; +"SimpleX protocols reviewed by Trail of Bits." = "A SimpleX protokollokat a Trail of Bits auditálta."; /* No comment provided by engineer. */ "Simplified incognito mode" = "Egyszerűsített inkognitómód"; @@ -5138,7 +5227,7 @@ report reason */ "Thanks to the users – contribute via Weblate!" = "Köszönet a felhasználóknak a Weblate-en való közreműködésért!"; /* No comment provided by engineer. */ -"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Az alkalmazás értesíteni fogja, amikor üzeneteket vagy meghívási kéréseket kap – ezt a beállítások menüben engedélyezheti."; +"The app can notify you when you receive messages or contact requests - please open settings to enable." = "Az alkalmazás értesíteni fogja, amikor üzeneteket vagy meghívókat kap – ezt a beállítások menüben engedélyezheti."; /* No comment provided by engineer. */ "The app protects your privacy by using different operators in each conversation." = "Az alkalmazás úgy védi az adatait, hogy minden egyes beszélgetéshez más-más üzemeltetőt használ."; @@ -5156,7 +5245,7 @@ report reason */ "The connection reached the limit of undelivered messages, your contact may be offline." = "A kapcsolat elérte a kézbesítetlen üzenetek számának határát, a partnere lehet, hogy offline állapotban van."; /* No comment provided by engineer. */ -"The connection you accepted will be cancelled!" = "Az Ön által elfogadott kérelem vissza lesz vonva!"; +"The connection you accepted will be cancelled!" = "Az Ön által elfogadott kapcsolat vissza lesz vonva!"; /* No comment provided by engineer. */ "The contact you shared this link with will NOT be able to connect!" = "A partnere, akivel megosztotta ezt a hivatkozást, NEM fog tudni kapcsolódni!"; @@ -5200,7 +5289,7 @@ report reason */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "A második jelölés, amit kihagytunk! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "A feladó NEM fog értesítést kapni"; /* No comment provided by engineer. */ @@ -5323,6 +5412,9 @@ report reason */ /* No comment provided by engineer. */ "To support instant push notifications the chat database has to be migrated." = "Az azonnali push-értesítések támogatásához a csevegési adatbázis átköltöztetése szükséges."; +/* alert message */ +"To use another profile after connection attempt, delete the chat and use the link again." = "Másik profil használatához a kapcsolatfelvételi kísérlet után törölje a csevegést, és használja újra a hivatkozást."; + /* No comment provided by engineer. */ "To use the servers of **%@**, accept conditions of use." = "A(z) **%@** kiszolgálóinak használatához fogadja el a használati feltételeket."; @@ -5330,10 +5422,10 @@ report reason */ "To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "A végpontok közötti titkosítás hitelesítéséhez hasonlítsa össze (vagy olvassa be a QR-kódot) a partnere eszközén lévő kóddal."; /* No comment provided by engineer. */ -"Toggle chat list:" = "Csevegési lista átváltása:"; +"Toggle chat list:" = "Csevegési lista ki/be:"; /* No comment provided by engineer. */ -"Toggle incognito when connecting." = "Inkognitóra váltás kapcsolódáskor."; +"Toggle incognito when connecting." = "Inkognitó profil használata kapcsolódáskor ki/be."; /* token status */ "Token status: %@." = "Token állapota: %@."; @@ -5477,7 +5569,7 @@ report reason */ "Updated conditions" = "Frissített feltételek"; /* rcv group event chat item */ -"updated group profile" = "frissítette a csoport profilját"; +"updated group profile" = "frissítette a csoportprofilt"; /* profile update event chat item */ "updated profile" = "frissített profil"; @@ -5525,7 +5617,7 @@ report reason */ "Use for messages" = "Használat az üzenetekhez"; /* No comment provided by engineer. */ -"Use for new connections" = "Alkalmazás új kapcsolatokhoz"; +"Use for new connections" = "Használat új kapcsolatokhoz"; /* No comment provided by engineer. */ "Use from desktop" = "Társítás számítógéppel"; @@ -5822,7 +5914,7 @@ report reason */ "You are already joining the group via this link." = "A csatlakozás már folyamatban van a csoporthoz ezen a hivatkozáson keresztül."; /* new chat sheet title */ -"You are already joining the group!\nRepeat join request?" = "A csatlakozás már folyamatban van a csoporthoz!\nMegismétli a meghívási kérést?"; +"You are already joining the group!\nRepeat join request?" = "A csatlakozás már folyamatban van a csoporthoz!\nMegismétli a csatlakozási kérést?"; /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "Ön már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott partnerétől érkező üzenetek fogadására szolgál."; @@ -5830,9 +5922,6 @@ report reason */ /* No comment provided by engineer. */ "You are invited to group" = "Ön meghívást kapott a csoportba"; -/* No comment provided by engineer. */ -"You are invited to group" = "Ön meghívást kapott a csoportba"; - /* No comment provided by engineer. */ "You are not connected to these servers. Private routing is used to deliver messages to them." = "Ön nem kapcsolódik ezekhez a kiszolgálókhoz. A privát útválasztás az üzenetek kézbesítésére szolgál."; @@ -5843,7 +5932,7 @@ report reason */ "you blocked %@" = "Ön letiltotta őt: %@"; /* No comment provided by engineer. */ -"You can accept calls from lock screen, without device and app authentication." = "Hívásokat fogadhat a lezárási képernyőről, eszköz- és alkalmazás-hitelesítés nélkül."; +"You can accept calls from lock screen, without device and app authentication." = "A lezárási képernyőről is fogadhat hívásokat, eszköz- és alkalmazáshitelesítés nélkül."; /* No comment provided by engineer. */ "You can change it in Appearance settings." = "Ezt a „Megjelenés” menüben módosíthatja."; @@ -5855,7 +5944,7 @@ report reason */ "You can create it later" = "Létrehozás később"; /* No comment provided by engineer. */ -"You can enable later via Settings" = "Később engedélyezheti a „Beállításokban”"; +"You can enable later via Settings" = "Később engedélyezheti a beállításokban"; /* No comment provided by engineer. */ "You can enable them later via app Privacy & Security settings." = "Később engedélyezheti őket az „Adatvédelem és biztonság” menüben."; @@ -5867,7 +5956,7 @@ report reason */ "You can hide or mute a user profile - swipe it to the right." = "Elrejtheti vagy lenémíthatja a felhasználó -profiljait – csúsztassa jobbra a profilt."; /* No comment provided by engineer. */ -"You can make it visible to your SimpleX contacts via Settings." = "Láthatóvá teheti a SimpleXbeli partnerei számára a „Beállításokban”."; +"You can make it visible to your SimpleX contacts via Settings." = "Láthatóvá teheti a SimpleXbeli partnerei számára a beállításokban."; /* notification body */ "You can now chat with %@" = "Mostantól küldhet üzeneteket %@ számára"; @@ -5927,7 +6016,7 @@ report reason */ "You decide who can connect." = "Ön dönti el, hogy kivel beszélget."; /* new chat sheet title */ -"You have already requested connection!\nRepeat connection request?" = "Ön már küldött egy meghívási kérést!\nMegismétli a meghívási kérést?"; +"You have already requested connection!\nRepeat connection request?" = "Ön már küldött egy meghívót!\nÚjra elküldi a meghívót?"; /* No comment provided by engineer. */ "You have to enter passphrase every time the app starts - it is not stored on the device." = "A jelmondatot minden alkalommal meg kell adnia, amikor az alkalmazás elindul – nem az eszközön van tárolva."; @@ -5948,7 +6037,7 @@ report reason */ "You may migrate the exported database." = "Az exportált adatbázist átköltöztetheti."; /* No comment provided by engineer. */ -"You may save the exported archive." = "Az exportált archívumot elmentheti."; +"You may save the exported archive." = "Mentheti az exportált archívumot."; /* No comment provided by engineer. */ "You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." = "A csevegési adatbázis legfrissebb verzióját CSAK egy eszközön kell használnia, ellenkező esetben előfordulhat, hogy az üzeneteket nem fogja megkapni valamennyi partnerétől."; @@ -5980,6 +6069,9 @@ report reason */ /* snd group event chat item */ "you unblocked %@" = "Ön feloldotta %@ letiltását"; +/* No comment provided by engineer. */ +"You will be able to send messages **only after your request is accepted**." = "Csak azután tud üzeneteket küldeni, **miután a kérését elfogadták**."; + /* No comment provided by engineer. */ "You will be connected to group when the group host's device is online, please wait or check later!" = "Akkor lesz kapcsolódva a csoporthoz, amikor a csoport tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!"; @@ -5987,7 +6079,7 @@ report reason */ "You will be connected when group link host's device is online, please wait or check later!" = "Akkor lesz kapcsolódva, amikor a csoporthivatkozás tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később!"; /* No comment provided by engineer. */ -"You will be connected when your connection request is accepted, please wait or check later!" = "Akkor lesz kapcsolódva, ha a meghívási kérése el lesz fogadva, várjon, vagy ellenőrizze később!"; +"You will be connected when your connection request is accepted, please wait or check later!" = "Akkor lesz kapcsolódva, ha a meghívóját a partnere elfogadja, várjon, vagy ellenőrizze később!"; /* No comment provided by engineer. */ "You will be connected when your contact's device is online, please wait or check later!" = "Akkor lesz kapcsolódva, amikor a partnerének az eszköze online lesz, várjon, vagy ellenőrizze később!"; @@ -6031,6 +6123,9 @@ report reason */ /* No comment provided by engineer. */ "Your chat profiles" = "Csevegési profilok"; +/* alert message */ +"Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "A csevegés át lett helyezve ide: %@, de egy váratlan hiba történt a profilra való átirányításkor."; + /* No comment provided by engineer. */ "Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "A kapcsolata át lett helyezve ide: %@, de egy váratlan hiba történt a profilra való átirányításkor."; @@ -6044,7 +6139,7 @@ report reason */ "Your contacts will remain connected." = "A partnerei továbbra is kapcsolódva maradnak."; /* No comment provided by engineer. */ -"Your credentials may be sent unencrypted." = "A hitelesítőadatai titkosítatlanul is elküldhetők."; +"Your credentials may be sent unencrypted." = "A hitelesítési adati titkosítatlanul is elküldhetők."; /* No comment provided by engineer. */ "Your current chat database will be DELETED and REPLACED with the imported one." = "A jelenlegi csevegési adatbázis TÖRÖLVE és CSERÉLVE lesz az importáltra."; @@ -6074,7 +6169,7 @@ report reason */ "Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." = "A profilja az eszközén van tárolva és csak a partnereivel van megosztva. A SimpleX kiszolgálók nem láthatják a profilját."; /* alert message */ -"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "A profilja módosult. Ha elmenti, a profilfrissítés el lesz küldve a partnerei számára."; +"Your profile was changed. If you save it, the updated profile will be sent to all your contacts." = "A profilja módosult. Ha menti, akkor a profilfrissítés el lesz küldve a partnerei számára."; /* No comment provided by engineer. */ "Your random profile" = "Véletlenszerű profil"; @@ -6090,3 +6185,4 @@ report reason */ /* No comment provided by engineer. */ "Your SimpleX address" = "Profil SimpleX-címe"; + diff --git a/apps/ios/it.lproj/Localizable.strings b/apps/ios/it.lproj/Localizable.strings index e8a1494d41..dd9eeb106d 100644 --- a/apps/ios/it.lproj/Localizable.strings +++ b/apps/ios/it.lproj/Localizable.strings @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Accetta"; @@ -357,10 +358,13 @@ swipe action */ /* No comment provided by engineer. */ "Accept connection request?" = "Accettare la richiesta di connessione?"; +/* alert title */ +"Accept contact request" = "Accetta la richiesta di contatto"; + /* notification body */ "Accept contact request from %@?" = "Accettare la richiesta di contatto da %@?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Accetta in incognito"; @@ -403,6 +407,9 @@ swipe action */ /* No comment provided by engineer. */ "Add list" = "Aggiungi elenco"; +/* placeholder for sending contact request */ +"Add message" = "Aggiungi un messaggio"; + /* No comment provided by engineer. */ "Add profile" = "Aggiungi profilo"; @@ -412,6 +419,9 @@ swipe action */ /* No comment provided by engineer. */ "Add servers by scanning QR codes." = "Aggiungi server scansionando codici QR."; +/* No comment provided by engineer. */ +"Add short link" = "Aggiungi link breve"; + /* No comment provided by engineer. */ "Add team members" = "Aggiungi membri del team"; @@ -754,9 +764,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "Auto-accetta le immagini"; -/* alert title */ -"SimpleX address settings" = "Accetta automaticamente le impostazioni"; - /* No comment provided by engineer. */ "Back" = "Indietro"; @@ -914,6 +921,9 @@ marked deleted chat item preview text */ /* No comment provided by engineer. */ "Can't call member" = "Impossibile chiamare il membro"; +/* alert title */ +"Can't change profile" = "Impossibile cambiare profilo"; + /* No comment provided by engineer. */ "Can't invite contact!" = "Impossibile invitare il contatto!"; @@ -1307,7 +1317,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection blocked" = "Connessione bloccata"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Errore di connessione"; /* No comment provided by engineer. */ @@ -1337,7 +1347,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "Connessione terminata"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Connessione scaduta"; /* No comment provided by engineer. */ @@ -1391,6 +1401,9 @@ set passcode view */ /* No comment provided by engineer. */ "Contact preferences" = "Preferenze del contatto"; +/* No comment provided by engineer. */ +"contact should accept…" = "il contatto dovrebbe accettare…"; + /* No comment provided by engineer. */ "Contact will be deleted - this cannot be undone!" = "Il contatto verrà eliminato - non è reversibile!"; @@ -1967,6 +1980,9 @@ chat item action */ /* No comment provided by engineer. */ "Edit group profile" = "Modifica il profilo del gruppo"; +/* No comment provided by engineer. */ +"Empty message!" = "Messaggio vuoto!"; + /* No comment provided by engineer. */ "Enable" = "Attiva"; @@ -2153,15 +2169,24 @@ chat item action */ /* alert title */ "Error accepting member" = "Errore di accettazione del membro"; +/* No comment provided by engineer. */ +"Error adding address short link" = "Errore di aggiunta del link breve dell'indirizzo"; + /* No comment provided by engineer. */ "Error adding member(s)" = "Errore di aggiunta membro/i"; /* alert title */ "Error adding server" = "Errore di aggiunta del server"; +/* No comment provided by engineer. */ +"Error adding short link" = "Errore di aggiunta link breve"; + /* No comment provided by engineer. */ "Error changing address" = "Errore nella modifica dell'indirizzo"; +/* alert title */ +"Error changing chat profile" = "Errore cambiando il profilo di chat"; + /* No comment provided by engineer. */ "Error changing connection profile" = "Errore nel cambio di profilo di connessione"; @@ -2177,7 +2202,7 @@ chat item action */ /* No comment provided by engineer. */ "Error checking token status" = "Errore di controllo dello stato del token"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "Errore di connessione al server di inoltro %@. Riprova più tardi."; /* No comment provided by engineer. */ @@ -2264,6 +2289,12 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Errore di apertura della chat"; +/* No comment provided by engineer. */ +"Error preparing contact" = "Errore di preparazione del contatto"; + +/* No comment provided by engineer. */ +"Error preparing group" = "Errore di preparazione del gruppo"; + /* alert title */ "Error receiving file" = "Errore nella ricezione del file"; @@ -2276,6 +2307,9 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Errore di registrazione per le notifiche"; +/* alert title */ +"Error rejecting contact request" = "Errore nel rifiuto della richiesta di contatto"; + /* alert title */ "Error removing member" = "Errore nella rimozione del membro"; @@ -2330,7 +2364,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "Errore nell'interruzione della chat"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "Errore nel cambio di profilo"; /* alertTitle */ @@ -2620,6 +2654,9 @@ snd error text */ /* message preview */ "Good morning!" = "Buongiorno!"; +/* shown on group welcome message */ +"group" = "gruppo"; + /* No comment provided by engineer. */ "Group" = "Gruppo"; @@ -2677,6 +2714,9 @@ snd error text */ /* snd group event chat item */ "group profile updated" = "profilo del gruppo aggiornato"; +/* alert message */ +"Group profile was changed. If you save it, the updated profile will be sent to group members." = "Il profilo del gruppo è stato cambiato. Se lo salvi, il profilo aggiornato verrà inviato ai membri del gruppo."; + /* No comment provided by engineer. */ "Group welcome message" = "Messaggio di benvenuto del gruppo"; @@ -3304,6 +3344,9 @@ snd error text */ /* No comment provided by engineer. */ "Messages & files" = "Messaggi"; +/* No comment provided by engineer. */ +"Messages are protected by **end-to-end encryption**." = "I messaggi sono protetti da **crittografia end-to-end**."; + /* No comment provided by engineer. */ "Messages from %@ will be shown!" = "I messaggi da %@ verranno mostrati!"; @@ -3741,7 +3784,7 @@ new chat action */ /* No comment provided by engineer. */ "Open changes" = "Apri le modifiche"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Apri chat"; /* authentication reason */ @@ -3759,9 +3802,24 @@ new chat action */ /* authentication reason */ "Open migration to another device" = "Apri migrazione ad un altro dispositivo"; +/* new chat action */ +"Open new chat" = "Apri una chat nuova"; + +/* new chat action */ +"Open new group" = "Apri un gruppo nuovo"; + /* No comment provided by engineer. */ "Open Settings" = "Apri le impostazioni"; +/* No comment provided by engineer. */ +"Open to accept" = "Apri per accettare"; + +/* No comment provided by engineer. */ +"Open to connect" = "Apri per connettere"; + +/* No comment provided by engineer. */ +"Open to join" = "Apri per entrare"; + /* No comment provided by engineer. */ "Opening app…" = "Apertura dell'app…"; @@ -3891,7 +3949,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Controlla di aver usato il link giusto o chiedi al tuo contatto di inviartene un altro."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Controlla la tua connessione di rete con %@ e riprova."; /* No comment provided by engineer. */ @@ -3996,7 +4054,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "Instradamento privato"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "Errore di instradamento privato"; /* No comment provided by engineer. */ @@ -4017,6 +4075,9 @@ new chat action */ /* alert message */ "Profile update will be sent to your contacts." = "L'aggiornamento del profilo verrà inviato ai tuoi contatti."; +/* alert message */ +"Profile will be shared via the address link." = "Il profilo verrà condiviso tramite il link dell'indirizzo."; + /* No comment provided by engineer. */ "Prohibit audio/video calls." = "Proibisci le chiamate audio/video."; @@ -4203,14 +4264,15 @@ new chat action */ /* token status text */ "Registered" = "Registrato"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Rifiuta"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Rifiuta contatto (mittente NON avvisato)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Rifiuta la richiesta di contatto"; /* alert title */ @@ -4318,6 +4380,9 @@ swipe action */ /* No comment provided by engineer. */ "Reports" = "Segnalazioni"; +/* No comment provided by engineer. */ +"request is sent" = "richiesta inviata"; + /* No comment provided by engineer. */ "request to join rejected" = "richiesta di entrare rifiutata"; @@ -4369,7 +4434,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Errore di ripristino del database"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Riprova"; /* chat item action */ @@ -4418,6 +4483,9 @@ chat item action */ /* alert button */ "Save (and notify contacts)" = "Salva (e avvisa i contatti)"; +/* alert button */ +"Save (and notify members)" = "Salva (e informa i membri)"; + /* alert title */ "Save admission settings?" = "Salvare le impostazioni di ammissione?"; @@ -4436,6 +4504,9 @@ chat item action */ /* No comment provided by engineer. */ "Save group profile" = "Salva il profilo del gruppo"; +/* alert title */ +"Save group profile?" = "Salvare il profilo del gruppo?"; + /* No comment provided by engineer. */ "Save list" = "Salva elenco"; @@ -4575,10 +4646,10 @@ chat item action */ "Send a live message - it will update for the recipient(s) as you type it" = "Invia un messaggio in diretta: si aggiornerà per i destinatari mentre lo digiti"; /* No comment provided by engineer. */ -"Send delivery receipts to" = "Invia ricevute di consegna a"; +"Send contact request?" = "Inviare una richiesta di contatto?"; /* No comment provided by engineer. */ -"send to connect" = "invia messaggio diretto"; +"Send delivery receipts to" = "Invia ricevute di consegna a"; /* No comment provided by engineer. */ "Send direct message to connect" = "Invia messaggio diretto per connetterti"; @@ -4616,6 +4687,12 @@ chat item action */ /* No comment provided by engineer. */ "Send receipts" = "Invia ricevute"; +/* No comment provided by engineer. */ +"Send request" = "Invia richiesta"; + +/* No comment provided by engineer. */ +"Send request without message" = "Invia richiesta senza messaggio"; + /* No comment provided by engineer. */ "Send them from gallery or custom keyboards." = "Inviali dalla galleria o dalle tastiere personalizzate."; @@ -4676,6 +4753,9 @@ chat item action */ /* No comment provided by engineer. */ "Sent reply" = "Risposta inviata"; +/* No comment provided by engineer. */ +"Sent to your contact after connection." = "Inviato al tuo contatto dopo la connessione."; + /* No comment provided by engineer. */ "Sent total" = "Totale inviato"; @@ -4816,11 +4896,17 @@ chat item action */ "Share from other apps." = "Condividi da altre app."; /* No comment provided by engineer. */ -"Share link" = "Condividi link"; +"Share group profile via link" = "Condividi il profilo del gruppo via link"; /* No comment provided by engineer. */ +"Share link" = "Condividi link"; + +/* alert button */ "Share profile" = "Condividi il profilo"; +/* alert title */ +"Share profile via link" = "Condividi il profilo via link"; + /* No comment provided by engineer. */ "Share SimpleX address on social media." = "Condividi l'indirizzo SimpleX sui social media."; @@ -4878,6 +4964,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX address or 1-time link?" = "Indirizzo SimpleX o link una tantum?"; +/* alert title */ +"SimpleX address settings" = "Accetta automaticamente le impostazioni"; + /* simplex link type */ "SimpleX channel link" = "Link del canale SimpleX"; @@ -5200,7 +5289,7 @@ report reason */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Il secondo segno di spunta che ci mancava! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "Il mittente NON verrà avvisato"; /* No comment provided by engineer. */ @@ -5323,6 +5412,9 @@ report reason */ /* No comment provided by engineer. */ "To support instant push notifications the chat database has to be migrated." = "Per supportare le notifiche push istantanee, il database della chat deve essere migrato."; +/* alert message */ +"To use another profile after connection attempt, delete the chat and use the link again." = "Per usare un altro profilo dopo il tentativo di connessione, elimina la chat e usa di nuovo il link."; + /* No comment provided by engineer. */ "To use the servers of **%@**, accept conditions of use." = "Per usare i server di **%@**, accetta le condizioni d'uso."; @@ -5827,9 +5919,6 @@ report reason */ /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "Sei connesso/a al server usato per ricevere messaggi da questo contatto."; -/* No comment provided by engineer. */ -"You are invited to group" = "sei stato/a invitato/a al gruppo"; - /* No comment provided by engineer. */ "You are invited to group" = "Sei stato/a invitato/a al gruppo"; @@ -5980,6 +6069,9 @@ report reason */ /* snd group event chat item */ "you unblocked %@" = "hai sbloccato %@"; +/* No comment provided by engineer. */ +"You will be able to send messages **only after your request is accepted**." = "Potrai inviare messaggi **solo dopo che la tua richiesta verrà accettata**."; + /* No comment provided by engineer. */ "You will be connected to group when the group host's device is online, please wait or check later!" = "Verrai connesso/a al gruppo quando il dispositivo dell'host del gruppo sarà in linea, attendi o controlla più tardi!"; @@ -6031,6 +6123,9 @@ report reason */ /* No comment provided by engineer. */ "Your chat profiles" = "I tuoi profili di chat"; +/* alert message */ +"Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "La tua chat è stata spostata su %@ , ma si è verificato un errore imprevisto mentre venivi reindirizzato/a al profilo."; + /* No comment provided by engineer. */ "Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "La tua connessione è stata spostata a %@, ma si è verificato un errore imprevisto durante il reindirizzamento al profilo."; @@ -6090,3 +6185,4 @@ report reason */ /* No comment provided by engineer. */ "Your SimpleX address" = "Il tuo indirizzo SimpleX"; + diff --git a/apps/ios/ja.lproj/Localizable.strings b/apps/ios/ja.lproj/Localizable.strings index 9a3f0d4d1e..d0639caf95 100644 --- a/apps/ios/ja.lproj/Localizable.strings +++ b/apps/ios/ja.lproj/Localizable.strings @@ -330,6 +330,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "承諾"; @@ -339,7 +340,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "%@ からの連絡要求を受け入れますか?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "シークレットモードで承諾"; @@ -880,7 +881,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection and servers status." = "接続とサーバーのステータス。"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "接続エラー"; /* No comment provided by engineer. */ @@ -895,7 +896,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "接続停止"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "接続タイムアウト"; /* connection information */ @@ -2371,7 +2372,7 @@ new chat action */ /* alert action */ "Open" = "開く"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "チャットを開く"; /* authentication reason */ @@ -2425,7 +2426,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "リンクが正しいかどうかご確認ください。または、連絡相手にもう一度リンクをお求めください。"; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "%@ を使用してネットワーク接続を確認し、再試行してください。"; /* No comment provided by engineer. */ @@ -2599,14 +2600,15 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "電池使用量低減"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "拒否"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "連絡を拒否(送信者には通知されません)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "連絡要求を拒否する"; /* call status */ @@ -3112,7 +3114,7 @@ chat item action */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "長らくお待たせしました! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "送信者には通知されません"; /* No comment provided by engineer. */ @@ -3415,9 +3417,6 @@ chat item action */ /* No comment provided by engineer. */ "You are invited to group" = "グループ招待が届きました"; -/* No comment provided by engineer. */ -"You are invited to group" = "グループ招待が届きました"; - /* No comment provided by engineer. */ "you are observer" = "あなたはオブザーバーです"; @@ -3603,3 +3602,4 @@ chat item action */ /* No comment provided by engineer. */ "Your SimpleX address" = "あなたのSimpleXアドレス"; + diff --git a/apps/ios/nl.lproj/Localizable.strings b/apps/ios/nl.lproj/Localizable.strings index 6ea2afaaad..1e5572db2d 100644 --- a/apps/ios/nl.lproj/Localizable.strings +++ b/apps/ios/nl.lproj/Localizable.strings @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Accepteer"; @@ -360,7 +361,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "Accepteer contactverzoek van %@?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Accepteer incognito"; @@ -754,9 +755,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "Afbeeldingen automatisch accepteren"; -/* alert title */ -"SimpleX address settings" = "Instellingen automatisch accepteren"; - /* No comment provided by engineer. */ "Back" = "Terug"; @@ -1307,7 +1305,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection blocked" = "Verbinding geblokkeerd"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Verbindingsfout"; /* No comment provided by engineer. */ @@ -1337,7 +1335,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "Verbinding beëindigd"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Timeout verbinding"; /* No comment provided by engineer. */ @@ -2177,7 +2175,7 @@ chat item action */ /* No comment provided by engineer. */ "Error checking token status" = "Fout bij het controleren van de tokenstatus"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "Fout bij het verbinden met doorstuurserver %@. Probeer het later opnieuw."; /* No comment provided by engineer. */ @@ -2330,7 +2328,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "Fout bij het stoppen van de chat"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "Fout bij wisselen van profiel"; /* alertTitle */ @@ -3741,7 +3739,7 @@ new chat action */ /* No comment provided by engineer. */ "Open changes" = "Wijzigingen openen"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Chat openen"; /* authentication reason */ @@ -3891,7 +3889,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Controleer of u de juiste link heeft gebruikt of vraag uw contact om u een andere te sturen."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Controleer uw netwerkverbinding met %@ en probeer het opnieuw."; /* No comment provided by engineer. */ @@ -3996,7 +3994,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "Privéroutering"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "Fout in privéroutering"; /* No comment provided by engineer. */ @@ -4203,14 +4201,15 @@ new chat action */ /* token status text */ "Registered" = "Geregistreerd"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Afwijzen"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Contact afwijzen (afzender NIET op de hoogte)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Contactverzoek afwijzen"; /* alert title */ @@ -4369,7 +4368,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Database fout herstellen"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Opnieuw proberen"; /* chat item action */ @@ -4577,9 +4576,6 @@ chat item action */ /* No comment provided by engineer. */ "Send delivery receipts to" = "Stuur ontvangstbewijzen naar"; -/* No comment provided by engineer. */ -"send to connect" = "stuur een direct bericht"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Stuur een direct bericht om verbinding te maken"; @@ -4818,7 +4814,7 @@ chat item action */ /* No comment provided by engineer. */ "Share link" = "Deel link"; -/* No comment provided by engineer. */ +/* alert button */ "Share profile" = "Profiel delen"; /* No comment provided by engineer. */ @@ -4878,6 +4874,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX address or 1-time link?" = "SimpleX adres of eenmalige link?"; +/* alert title */ +"SimpleX address settings" = "Instellingen automatisch accepteren"; + /* simplex link type */ "SimpleX channel link" = "SimpleX channel link"; @@ -5200,7 +5199,7 @@ report reason */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "De tweede vink die we gemist hebben! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "De afzender wordt NIET op de hoogte gebracht"; /* No comment provided by engineer. */ @@ -5827,9 +5826,6 @@ report reason */ /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "U bent verbonden met de server die wordt gebruikt om berichten van dit contact te ontvangen."; -/* No comment provided by engineer. */ -"You are invited to group" = "je bent uitgenodigd voor de groep"; - /* No comment provided by engineer. */ "You are invited to group" = "Je bent uitgenodigd voor de groep"; @@ -6090,3 +6086,4 @@ report reason */ /* No comment provided by engineer. */ "Your SimpleX address" = "Uw SimpleX adres"; + diff --git a/apps/ios/pl.lproj/Localizable.strings b/apps/ios/pl.lproj/Localizable.strings index 77c0df47a7..b0387a32cd 100644 --- a/apps/ios/pl.lproj/Localizable.strings +++ b/apps/ios/pl.lproj/Localizable.strings @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Akceptuj"; @@ -354,7 +355,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "Zaakceptuj prośbę o kontakt od %@?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Akceptuj incognito"; @@ -727,9 +728,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "Automatyczne akceptowanie obrazów"; -/* alert title */ -"SimpleX address settings" = "Ustawienia automatycznej akceptacji"; - /* No comment provided by engineer. */ "Back" = "Wstecz"; @@ -1229,7 +1227,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection and servers status." = "Stan połączenia i serwerów."; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Błąd połączenia"; /* No comment provided by engineer. */ @@ -1247,7 +1245,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "Połączenie zakończone"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Czas połączenia minął"; /* No comment provided by engineer. */ @@ -2000,7 +1998,7 @@ chat item action */ /* No comment provided by engineer. */ "Error changing to incognito!" = "Błąd zmiany na incognito!"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "Błąd połączenia z serwerem przekierowania %@. Spróbuj ponownie później."; /* No comment provided by engineer. */ @@ -2129,7 +2127,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "Błąd zatrzymania czatu"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "Błąd zmiany profilu"; /* alertTitle */ @@ -3309,7 +3307,7 @@ new chat action */ /* alert action */ "Open" = "Otwórz"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Otwórz czat"; /* authentication reason */ @@ -3429,7 +3427,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Sprawdź, czy użyłeś prawidłowego linku lub poproś Twój kontakt o przesłanie innego."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Sprawdzić połączenie sieciowe z %@ i spróbować ponownie."; /* No comment provided by engineer. */ @@ -3507,7 +3505,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "Prywatne trasowanie"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "Błąd prywatnego trasowania"; /* No comment provided by engineer. */ @@ -3702,14 +3700,15 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "Zmniejszone zużycie baterii"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Odrzuć"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Odrzuć kontakt (nadawca NIE został powiadomiony)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Odrzuć prośbę kontaktu"; /* call status */ @@ -3820,7 +3819,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Błąd przywracania bazy danych"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Ponów"; /* chat item action */ @@ -4007,9 +4006,6 @@ chat item action */ /* No comment provided by engineer. */ "Send delivery receipts to" = "Wyślij potwierdzenia dostawy do"; -/* No comment provided by engineer. */ -"send to connect" = "wyślij wiadomość bezpośrednią"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Wyślij wiadomość bezpośrednią aby połączyć"; @@ -4218,7 +4214,7 @@ chat item action */ /* No comment provided by engineer. */ "Share link" = "Udostępnij link"; -/* No comment provided by engineer. */ +/* alert button */ "Share profile" = "Udostępnij profil"; /* No comment provided by engineer. */ @@ -4266,6 +4262,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX Address" = "Adres SimpleX"; +/* alert title */ +"SimpleX address settings" = "Ustawienia automatycznej akceptacji"; + /* No comment provided by engineer. */ "SimpleX Chat security was audited by Trail of Bits." = "Bezpieczeństwo SimpleX Chat zostało zaudytowane przez Trail of Bits."; @@ -4542,7 +4541,7 @@ chat item action */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Drugi tik, który przegapiliśmy! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "Nadawca NIE zostanie powiadomiony"; /* No comment provided by engineer. */ @@ -5094,9 +5093,6 @@ chat item action */ /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "Jesteś połączony z serwerem używanym do odbierania wiadomości od tego kontaktu."; -/* No comment provided by engineer. */ -"You are invited to group" = "jesteś zaproszony do grupy"; - /* No comment provided by engineer. */ "You are invited to group" = "Jesteś zaproszony do grupy"; @@ -5342,3 +5338,4 @@ chat item action */ /* No comment provided by engineer. */ "Your SimpleX address" = "Twój adres SimpleX"; + diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings index e0c7255b18..dafb75c0a0 100644 --- a/apps/ios/ru.lproj/Localizable.strings +++ b/apps/ios/ru.lproj/Localizable.strings @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Принять"; @@ -360,7 +361,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "Принять запрос на соединение от %@?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Принять инкогнито"; @@ -403,7 +404,7 @@ swipe action */ /* No comment provided by engineer. */ "Add list" = "Добавить список"; -/* No comment provided by engineer. */ +/* placeholder for sending contact request */ "Add message" = "Добавить cообщение"; /* No comment provided by engineer. */ @@ -757,9 +758,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "Автоприем изображений"; -/* alert title */ -"SimpleX address settings" = "Настройки автоприема"; - /* No comment provided by engineer. */ "Back" = "Назад"; @@ -1310,7 +1308,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection blocked" = "Соединение заблокировано"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Ошибка соединения"; /* No comment provided by engineer. */ @@ -1340,7 +1338,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "Подключение прервано"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Превышено время соединения"; /* No comment provided by engineer. */ @@ -2180,7 +2178,7 @@ chat item action */ /* No comment provided by engineer. */ "Error checking token status" = "Ошибка проверки статуса токена"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "Ошибка подключения к пересылающему серверу %@. Попробуйте позже."; /* No comment provided by engineer. */ @@ -2333,7 +2331,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "Ошибка при остановке чата"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "Ошибка переключения профиля"; /* alertTitle */ @@ -3744,7 +3742,7 @@ new chat action */ /* No comment provided by engineer. */ "Open changes" = "Открыть изменения"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Открыть чат"; /* authentication reason */ @@ -3894,7 +3892,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Пожалуйста, проверьте, что Вы использовали правильную ссылку или попросите, чтобы Ваш контакт отправил Вам другую ссылку."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Пожалуйста, проверьте Ваше соединение с %@ и попробуйте еще раз."; /* No comment provided by engineer. */ @@ -3999,7 +3997,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "Конфиденциальная доставка"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "Ошибка конфиденциальной доставки"; /* No comment provided by engineer. */ @@ -4206,14 +4204,15 @@ new chat action */ /* token status text */ "Registered" = "Зарегистрирован"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Отклонить"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Отклонить (не уведомляя отправителя)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Отклонить запрос"; /* alert title */ @@ -4372,7 +4371,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Ошибка при восстановлении базы данных"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Повторить"; /* chat item action */ @@ -4583,9 +4582,6 @@ chat item action */ /* No comment provided by engineer. */ "Send delivery receipts to" = "Отправка отчётов о доставке"; -/* No comment provided by engineer. */ -"send to connect" = "отправьте сообщение"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Отправьте сообщение чтобы соединиться"; @@ -4830,7 +4826,7 @@ chat item action */ /* No comment provided by engineer. */ "Share link" = "Поделиться ссылкой"; -/* No comment provided by engineer. */ +/* alert button */ "Share profile" = "Поделиться профилем"; /* No comment provided by engineer. */ @@ -4890,6 +4886,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX address or 1-time link?" = "Адрес SimpleX или одноразовая ссылка?"; +/* alert title */ +"SimpleX address settings" = "Настройки автоприема"; + /* simplex link type */ "SimpleX channel link" = "SimpleX ссылка канала"; @@ -5212,7 +5211,7 @@ report reason */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Вторая галочка - знать, что доставлено! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "Отправитель не будет уведомлён"; /* No comment provided by engineer. */ @@ -5842,9 +5841,6 @@ report reason */ /* No comment provided by engineer. */ "You are invited to group" = "Вы приглашены в группу"; -/* No comment provided by engineer. */ -"You are invited to group" = "Вы приглашены в группу"; - /* No comment provided by engineer. */ "You are not connected to these servers. Private routing is used to deliver messages to them." = "Вы не подключены к этим серверам. Для доставки сообщений на них используется конфиденциальная доставка."; @@ -6102,3 +6098,4 @@ report reason */ /* No comment provided by engineer. */ "Your SimpleX address" = "Ваш адрес SimpleX"; + diff --git a/apps/ios/th.lproj/Localizable.strings b/apps/ios/th.lproj/Localizable.strings index 189c15359b..bfd127665e 100644 --- a/apps/ios/th.lproj/Localizable.strings +++ b/apps/ios/th.lproj/Localizable.strings @@ -219,13 +219,14 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "รับ"; /* notification body */ "Accept contact request from %@?" = "รับการขอติดต่อจาก %@?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "ยอมรับโหมดไม่ระบุตัวตน"; @@ -667,7 +668,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection" = "การเชื่อมต่อ"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "การเชื่อมต่อผิดพลาด"; /* No comment provided by engineer. */ @@ -679,7 +680,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection request sent!" = "ส่งคําขอเชื่อมต่อแล้ว!"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "หมดเวลาการเชื่อมต่อ"; /* connection information */ @@ -2092,7 +2093,7 @@ new chat action */ /* No comment provided by engineer. */ "Only your contact can send voice messages." = "ผู้ติดต่อของคุณเท่านั้นที่สามารถส่งข้อความเสียงได้"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "เปิดแชท"; /* authentication reason */ @@ -2146,7 +2147,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "โปรดตรวจสอบว่าคุณใช้ลิงก์ที่ถูกต้องหรือขอให้ผู้ติดต่อของคุณส่งลิงก์ใหม่ให้คุณ"; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "โปรดตรวจสอบการเชื่อมต่อเครือข่ายของคุณกับ %@ แล้วลองอีกครั้ง"; /* No comment provided by engineer. */ @@ -2317,11 +2318,12 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "ลดการใช้แบตเตอรี่"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "ปฏิเสธ"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "ปฏิเสธคำขอติดต่อ"; /* call status */ @@ -2833,7 +2835,7 @@ chat item action */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "ขีดที่สองที่เราพลาด! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "ผู้ส่งจะไม่ได้รับแจ้ง"; /* No comment provided by engineer. */ @@ -3127,9 +3129,6 @@ chat item action */ /* No comment provided by engineer. */ "You are invited to group" = "คุณได้รับเชิญให้เข้าร่วมกลุ่ม"; -/* No comment provided by engineer. */ -"You are invited to group" = "คุณได้รับเชิญให้เข้าร่วมกลุ่ม"; - /* No comment provided by engineer. */ "you are observer" = "คุณเป็นผู้สังเกตการณ์"; @@ -3306,3 +3305,4 @@ chat item action */ /* No comment provided by engineer. */ "Your SimpleX address" = "ที่อยู่ SimpleX ของคุณ"; + diff --git a/apps/ios/tr.lproj/Localizable.strings b/apps/ios/tr.lproj/Localizable.strings index 3c2a5c4316..5891e33d42 100644 --- a/apps/ios/tr.lproj/Localizable.strings +++ b/apps/ios/tr.lproj/Localizable.strings @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Kabul et"; @@ -360,7 +361,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "%@ 'den gelen iletişim isteği kabul edilsin mi?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Takma adla kabul et"; @@ -703,9 +704,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "Fotoğrafları otomatik kabul et"; -/* alert title */ -"SimpleX address settings" = "Ayarları otomatik olarak kabul et"; - /* No comment provided by engineer. */ "Back" = "Geri"; @@ -1211,7 +1209,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection and servers status." = "Bağlantı ve sunucuların durumu."; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Bağlantı hatası"; /* No comment provided by engineer. */ @@ -1232,7 +1230,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "Bağlantı sonlandırılmış"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Bağlantı süresi geçmiş"; /* No comment provided by engineer. */ @@ -2015,7 +2013,7 @@ chat item action */ /* No comment provided by engineer. */ "Error changing to incognito!" = "Gizli moduna geçerken hata oluştu!"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "Yönlendirme sunucusu %@'ya bağlanırken hata oluştu. Lütfen daha sonra deneyin."; /* No comment provided by engineer. */ @@ -2150,7 +2148,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "Sohbet durdurulurken hata oluştu"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "Profil değiştirme sırasında hata oluştu"; /* alertTitle */ @@ -3372,7 +3370,7 @@ new chat action */ /* alert action */ "Open" = "Aç"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Sohbeti aç"; /* authentication reason */ @@ -3492,7 +3490,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Lütfen doğru bağlantıyı kullandığınızı kontrol edin veya kişiden size başka bir bağlantı göndermesini isteyin."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Lütfen ağ bağlantınızı %@ ile kontrol edin ve tekrar deneyin."; /* No comment provided by engineer. */ @@ -3570,7 +3568,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "Gizli yönlendirme"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "Gizli yönlendirme hatası"; /* No comment provided by engineer. */ @@ -3765,14 +3763,15 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "Azaltılmış pil kullanımı"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Reddet"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Reddet (göndericiye bildirim GİTMEYECEKTİR)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Bağlanma isteğini reddet"; /* call status */ @@ -3883,7 +3882,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Veritabanını geri yüklerken hata oluştu"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Yeniden dene"; /* chat item action */ @@ -4070,9 +4069,6 @@ chat item action */ /* No comment provided by engineer. */ "Send delivery receipts to" = "Görüldü bilgilerini şuraya gönder"; -/* No comment provided by engineer. */ -"send to connect" = "doğrudan mesaj gönder"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Bağlanmak için doğrudan mesaj gönder"; @@ -4281,7 +4277,7 @@ chat item action */ /* No comment provided by engineer. */ "Share link" = "Bağlantıyı paylaş"; -/* No comment provided by engineer. */ +/* alert button */ "Share profile" = "Profil paylaş"; /* No comment provided by engineer. */ @@ -4329,6 +4325,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX Address" = "SimpleX Adresi"; +/* alert title */ +"SimpleX address settings" = "Ayarları otomatik olarak kabul et"; + /* No comment provided by engineer. */ "SimpleX Chat security was audited by Trail of Bits." = "SimpleX Chat güvenliği Trails of Bits tarafından denetlenmiştir."; @@ -4614,7 +4613,7 @@ chat item action */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Özlediğimiz ikinci tik! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "Gönderene BİLDİRİLMEYECEKTİR"; /* No comment provided by engineer. */ @@ -5166,9 +5165,6 @@ chat item action */ /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "Bu kişiden mesaj almak için kullanılan sunucuya bağlısınız."; -/* No comment provided by engineer. */ -"You are invited to group" = "gruba davet edildiniz"; - /* No comment provided by engineer. */ "You are invited to group" = "Gruba davet edildiniz"; @@ -5411,3 +5407,4 @@ chat item action */ /* No comment provided by engineer. */ "Your SimpleX address" = "SimpleX adresin"; + diff --git a/apps/ios/uk.lproj/Localizable.strings b/apps/ios/uk.lproj/Localizable.strings index c8ae6ed2a6..ef65d87fa5 100644 --- a/apps/ios/uk.lproj/Localizable.strings +++ b/apps/ios/uk.lproj/Localizable.strings @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "Прийняти"; @@ -360,7 +361,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "Прийняти запит на контакт від %@?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "Прийняти інкогніто"; @@ -742,9 +743,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "Автоматичне прийняття зображень"; -/* alert title */ -"SimpleX address settings" = "Автоприйняття налаштувань"; - /* No comment provided by engineer. */ "Back" = "Назад"; @@ -1292,7 +1290,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection blocked" = "Підключення заблоковано"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "Помилка підключення"; /* No comment provided by engineer. */ @@ -1322,7 +1320,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "З'єднання розірвано"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "Тайм-аут з'єднання"; /* No comment provided by engineer. */ @@ -2153,7 +2151,7 @@ chat item action */ /* No comment provided by engineer. */ "Error checking token status" = "Помилка перевірки статусу токена"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "Помилка підключення до сервера переадресації %@. Спробуйте пізніше."; /* No comment provided by engineer. */ @@ -2306,7 +2304,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "Помилка зупинки чату"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "Помилка перемикання профілю"; /* alertTitle */ @@ -3633,7 +3631,7 @@ new chat action */ /* No comment provided by engineer. */ "Open changes" = "Відкриті зміни"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "Відкритий чат"; /* authentication reason */ @@ -3768,7 +3766,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "Будь ласка, перевірте, чи ви скористалися правильним посиланням, або попросіть контактну особу надіслати вам інше."; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "Будь ласка, перевірте підключення до мережі за допомогою %@ і спробуйте ще раз."; /* No comment provided by engineer. */ @@ -3852,7 +3850,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "Приватна маршрутизація"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "Помилка приватної маршрутизації"; /* No comment provided by engineer. */ @@ -4047,14 +4045,15 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "Зменшення використання акумулятора"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "Відхилити"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "Відхилити (відправника НЕ повідомлено)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "Відхилити запит на контакт"; /* call status */ @@ -4168,7 +4167,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "Відновлення помилки бази даних"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "Спробуйте ще раз"; /* chat item action */ @@ -4358,9 +4357,6 @@ chat item action */ /* No comment provided by engineer. */ "Send delivery receipts to" = "Надсилання звітів про доставку"; -/* No comment provided by engineer. */ -"send to connect" = "надіслати пряме повідомлення"; - /* No comment provided by engineer. */ "Send direct message to connect" = "Надішліть пряме повідомлення, щоб підключитися"; @@ -4587,7 +4583,7 @@ chat item action */ /* No comment provided by engineer. */ "Share link" = "Поділіться посиланням"; -/* No comment provided by engineer. */ +/* alert button */ "Share profile" = "Поділіться профілем"; /* No comment provided by engineer. */ @@ -4644,6 +4640,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX address or 1-time link?" = "SimpleX адреса або одноразове посилання?"; +/* alert title */ +"SimpleX address settings" = "Автоприйняття налаштувань"; + /* No comment provided by engineer. */ "SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." = "SimpleX Chat і Flux уклали угоду про включення серверів, керованих Flux, у додаток."; @@ -4950,7 +4949,7 @@ chat item action */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Другу галочку ми пропустили! ✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "Відправник НЕ буде повідомлений"; /* No comment provided by engineer. */ @@ -5547,9 +5546,6 @@ chat item action */ /* No comment provided by engineer. */ "You are connected to the server used to receive messages from this contact." = "Ви підключені до сервера, який використовується для отримання повідомлень від цього контакту."; -/* No comment provided by engineer. */ -"You are invited to group" = "вас запрошують до групи"; - /* No comment provided by engineer. */ "You are invited to group" = "Запрошуємо вас до групи"; @@ -5804,3 +5800,4 @@ chat item action */ /* No comment provided by engineer. */ "Your SimpleX address" = "Ваша адреса SimpleX"; + diff --git a/apps/ios/zh-Hans.lproj/Localizable.strings b/apps/ios/zh-Hans.lproj/Localizable.strings index 9a2fe7f0e6..1122dcbc95 100644 --- a/apps/ios/zh-Hans.lproj/Localizable.strings +++ b/apps/ios/zh-Hans.lproj/Localizable.strings @@ -342,6 +342,7 @@ time interval */ /* accept contact request via notification accept incoming call via notification +alert action swipe action */ "Accept" = "接受"; @@ -354,7 +355,7 @@ swipe action */ /* notification body */ "Accept contact request from %@?" = "接受来自 %@ 的联系人请求?"; -/* accept contact request via notification +/* alert action swipe action */ "Accept incognito" = "接受隐身聊天"; @@ -730,9 +731,6 @@ swipe action */ /* No comment provided by engineer. */ "Auto-accept images" = "自动接受图片"; -/* alert title */ -"SimpleX address settings" = "自动接受设置"; - /* No comment provided by engineer. */ "Back" = "返回"; @@ -1271,7 +1269,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection blocked" = "连接被阻止"; -/* No comment provided by engineer. */ +/* alert title */ "Connection error" = "连接错误"; /* No comment provided by engineer. */ @@ -1301,7 +1299,7 @@ set passcode view */ /* No comment provided by engineer. */ "Connection terminated" = "连接被终止"; -/* No comment provided by engineer. */ +/* alert title */ "Connection timeout" = "连接超时"; /* No comment provided by engineer. */ @@ -2123,7 +2121,7 @@ chat item action */ /* No comment provided by engineer. */ "Error changing to incognito!" = "切换至隐身聊天出错!"; -/* No comment provided by engineer. */ +/* alert message */ "Error connecting to forwarding server %@. Please try later." = "连接到转发服务器 %@ 时出错。请稍后尝试。"; /* No comment provided by engineer. */ @@ -2273,7 +2271,7 @@ chat item action */ /* No comment provided by engineer. */ "Error stopping chat" = "停止聊天错误"; -/* No comment provided by engineer. */ +/* alert title */ "Error switching profile" = "切换配置文件出错"; /* alertTitle */ @@ -3660,7 +3658,7 @@ new chat action */ /* No comment provided by engineer. */ "Open changes" = "打开更改"; -/* No comment provided by engineer. */ +/* new chat action */ "Open chat" = "打开聊天"; /* authentication reason */ @@ -3795,7 +3793,7 @@ new chat action */ /* No comment provided by engineer. */ "Please check that you used the correct link or ask your contact to send you another one." = "请检查您使用的链接是否正确,或者让您的联系人给您发送另一个链接。"; -/* No comment provided by engineer. */ +/* alert message */ "Please check your network connection with %@ and try again." = "请检查您与%@的网络连接,然后重试。"; /* No comment provided by engineer. */ @@ -3876,7 +3874,7 @@ new chat action */ /* No comment provided by engineer. */ "Private routing" = "专用路由"; -/* No comment provided by engineer. */ +/* alert title */ "Private routing error" = "专用路由错误"; /* No comment provided by engineer. */ @@ -4068,14 +4066,15 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "减少电池使用量"; -/* reject incoming call via notification +/* alert action +reject incoming call via notification swipe action */ "Reject" = "拒绝"; /* No comment provided by engineer. */ "Reject (sender NOT notified)" = "拒绝联系人(发送者不会被通知)"; -/* No comment provided by engineer. */ +/* alert title */ "Reject contact request" = "拒绝联系人请求"; /* call status */ @@ -4183,7 +4182,7 @@ swipe action */ /* No comment provided by engineer. */ "Restore database error" = "恢复数据库错误"; -/* No comment provided by engineer. */ +/* alert action */ "Retry" = "重试"; /* chat item action */ @@ -4373,9 +4372,6 @@ chat item action */ /* No comment provided by engineer. */ "Send delivery receipts to" = "将送达回执发送给"; -/* No comment provided by engineer. */ -"send to connect" = "发送私信"; - /* No comment provided by engineer. */ "Send direct message to connect" = "发送私信来连接"; @@ -4629,6 +4625,9 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX address or 1-time link?" = "SimpleX 地址或一次性链接?"; +/* alert title */ +"SimpleX address settings" = "自动接受设置"; + /* simplex link type */ "SimpleX channel link" = "SimpleX 频道链接"; @@ -4908,7 +4907,7 @@ chat item action */ /* No comment provided by engineer. */ "The second tick we missed! ✅" = "我们错过的第二个\"√\"!✅"; -/* No comment provided by engineer. */ +/* alert message */ "The sender will NOT be notified" = "发送者将不会收到通知"; /* No comment provided by engineer. */ @@ -5448,9 +5447,6 @@ chat item action */ /* No comment provided by engineer. */ "You are invited to group" = "您被邀请加入群组"; -/* No comment provided by engineer. */ -"You are invited to group" = "您被邀请加入群组"; - /* No comment provided by engineer. */ "You are not connected to these servers. Private routing is used to deliver messages to them." = "您未连接到这些服务器。私有路由用于向他们发送消息。"; @@ -5678,3 +5674,4 @@ chat item action */ /* No comment provided by engineer. */ "Your SimpleX address" = "您的 SimpleX 地址"; + diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml index 85a089ab48..4e08994b62 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml @@ -31,21 +31,21 @@ أضِف إلى جهاز آخر سيتم حذف جميع الدردشات والرسائل - لا يمكن التراجع عن هذا! الوصول إلى الخوادم عبر وسيط SOCKS على المنفذ %d؟ يجب بدء تشغيل الوسيط قبل تفعيل هذا الخيار. - أضِف خادم + أضف خادم إعدادات الشبكة المتقدمة سيبقى جميع أعضاء المجموعة على اتصال. السماح باختفاء الرسائل فقط إذا سمحت جهة اتصالك بذلك. السماح بحذف الرسائل بشكل لا رجوع فيه فقط إذا سمحت لك جهة الاتصال بذلك. (24 ساعة) المُدير - أضِف ملف التعريف + أضف ملف التعريف السماح بإرسال رسائل مباشرة إلى الأعضاء. - قبول التخفي + اقبل التخفي أضِف رسالة ترحيب أضف الخوادم عن طريق مسح رموز QR. يمكن للمُدراء إنشاء روابط للانضمام إلى المجموعات. قبول طلب الاتصال؟ سيتم حذف جميع الرسائل - لا يمكن التراجع عن هذا! سيتم حذف الرسائل فقط من أجلك. - مكالمة مقبولة + قُبلت المكالمة السماح بالمكالمات فقط إذا سمحت جهة اتصالك بذلك. اسمح بردود الفعل على الرسائل فقط إذا سمحت جهة اتصالك بذلك. يتم استخدام Android Keystore لتخزين عبارة المرور بشكل آمن - فهو يسمح لخدمة الإشعارات بالعمل. @@ -143,7 +143,7 @@ قبول تلقائي المكالمات لا يمكن دعوة جهات الاتصال! - تم تغيير العنوان من أجلك + غُيِّر العنوان من أجلك طلب لاستلام الفيديو مكالمتك تحت الإجراء تغيير عبارة مرور قاعدة البيانات؟ @@ -175,13 +175,13 @@ نٌسخت إلى الحافظة مسح امسح الدردشة - إنشاء عنوان + أنشئ عنوان الدردشات تأكيد عبارة المرور الجديدة… تعمية قاعدة البيانات؟ قاعدة البيانات مُعمّاة غيرت دور %s إلى %s - تغيير عنوان الاستلام + غيّر عنوان الاستلام خطأ في إنشاء ملف التعريف! خطأ في الإتصال انتهت مهلة الاتصال @@ -189,11 +189,11 @@ خطأ في حذف طلب جهة الاتصال خطأ في حذف المجموعة اتصل - إنشاء ملف - إنشاء قائمة انتظار + أنشئ ملف + أنشئ قائمة انتظار قارن الملف خطأ - إنشاء مجموعة سرية + أنشئ مجموعة سرية خطأ في إحباط تغيير العنوان تفعيل قفل SimpleX تأكد من بيانات اعتمادك @@ -210,7 +210,7 @@ الاتصال ملف تعريف الدردشة الإصدار الأساسي: v%s - إنشاء ملف تعريف + أنشئ ملف تعريف جار الاتصال… انتهى متصل @@ -224,7 +224,7 @@ جاري الاتصال (أعلن) الاتصال إحباط تغيير العنوان - إنشاء مجموعة سرية + أنشئ مجموعة سرية قارن رموز الأمان مع جهات اتصالك. الواجهة الصينية والاسبانية مسح @@ -253,8 +253,8 @@ جار الاتصال (قُبِل) فُحصت جهة الاتصال %1$s أعضاء - إنشاء رابط المجموعة - إنشاء رابط + أنشئ رابط المجموعة + أنشئ رابط تأكيد كلمة المرور توقفت الدردشة قاعدة بيانات الدردشة @@ -306,14 +306,14 @@ سيتم حذف جهة الاتصال وجميع الرسائل - لا يمكن التراجع عن هذا! الحد الأقصى لحجم الملف المدعوم حاليًا هو %1$s. تواصل عبر الرابط / رمز QR - إنشاء رابط دعوة لمرة واحدة + أنشئ رابط دعوة لمرة واحدة تحقق من عنوان الخادم وحاول مرة أخرى. امسح التحقُّق أنشئ عنوانًا للسماح للأشخاص بالتواصل معك. أدخل الخادم يدويًا ملون لدى جهة الاتصال التعمية بين الطريفين - إنشاء + أنشئ أنشئ ملف تعريفك مكالمة جارية... تفعيل التدمير الذاتي @@ -332,27 +332,27 @@ سمة داكنة حُذفت عبارة مرور قاعدة البيانات وتصديرها - حذف جميع الملفات - حذف بعد - حذف الملف + احذف جميع الملفات + احذف بعد + احذف الملف حذف حذف رسالة العضو؟ - حذف - حذف الرسائل - حذف الرسائل بعد + احذف + احذف الرسائل + احذف الرسائل بعد قاعدة البيانات مُعمّاة! تختلف عبارة مرور قاعدة البيانات عن تلك المحفوظة في Keystore. خطأ في قاعدة البيانات ترقية قاعدة البيانات حُددت %d جهة اتصال - حذف المجموعة + احذف المجموعة حذف المجموعة؟ - حذف الرابط + احذف الرابط حُذفت في: %s المجموعة حُذفت - حذف الصورة + احذف الصورة تخصيص السمات - حذف قاعدة البيانات + احذف قاعدة البيانات حذف ملف تعريف الدردشة؟ حذف الملفات لجميع ملفات تعريف الدردشة قاعدة البيانات مُعمّاة باستخدام عبارة مرور عشوائية، يمكنك تغييرها. @@ -361,31 +361,31 @@ إصدار قاعدة البيانات أحدث من التطبيق، ولكن لا يوجد ترحيل لأسفل ل%s معرّف قاعدة البيانات: %d حذف ملف تعريف الدردشة؟ - حذف ملف تعريف الدردشة ل - حذف للجميع + احذف ملف تعريف الدردشة ل + احذف للجميع أيام - حذف العنوان + احذف العنوان سيتم تحديث عبارة مرور تعمية قاعدة البيانات. حذف الرابط؟ الرجوع إلى إصدار سابق من قاعدة البيانات قاعدة البيانات مُعمّاة باستخدام عبارة مرور عشوائية. يُرجى تغييره قبل التصدير. %d يوم سيتم تعمية قاعدة البيانات. - حذف + احذف حذف الملفات والوسائط؟ - حذف جهة الاتصال + احذف جهة الاتصال تخصيص السمة داكن الافتراضي %s حذف الاتصال قيد الانتظار؟ - حذف ملف تعريف الدردشة + احذف ملف تعريف الدردشة خطأ في فك التعمية حذف الرسالة؟ معرفات قاعدة البيانات وخيار عزل النقل. حذف العنوان؟ خطأ في فك الترميز حذف جهة الاتصال؟ - حذف بالنسبة لي + احذف بالنسبة لي وقت مخصّص لامركزي عبارة مرور قاعدة البيانات @@ -399,11 +399,11 @@ تخصيص ومشاركة سمات الألوان. الخروج بدون حفظ أدوات المطور - حذف قائمة الانتظار + احذف قائمة الانتظار خطأ في تحديث خصوصية المستخدم مسح رمز QR.]]> - حذف ملف التعريف - حذف الخادم + احذف ملف التعريف + احذف الخادم خطأ في تحديث رابط المجموعة الوصف توسيع تحديد الدور @@ -547,18 +547,18 @@ \n3. اُخترق الاتصال. واجهة أستخدام يابانية وبرتغالية يمكن أن يحدث ذلك عندما تستخدم أنت أو اتصالك النُسخة الاحتياطية القديمة لقاعدة البيانات. - انضمام ك%s + انضم ك%s رمز QR غير صالح الواجهة الإيطالية الرابط غير صالح! دعوة الأصدقاء خطأ في Keychain دعوة للمجموعة - يٌمنع حذف الرسائل بشكل لا رجعة فيه. + يُمنع حذف الرسائل بشكل لا رجعة فيه. تنسيق الرسالة غير صالح البيانات غير صالحة بيانات ملف التعريف المحلية فقط - يٌمنع حذف الرسائل بشكل لا رجعة فيه في هذه الدردشة. + يُمنع حذف الرسائل بشكل لا رجعة فيه في هذه الدردشة. دعوة الأعضاء غادِر المجموعة الاسم المحلي: @@ -669,7 +669,7 @@ تأكد من أن الملف يحتوي على بناء جملة YAML الصحيح. تصدير النسق للحصول على مثال لهيكل ملف النسق. 40 ثانية كحد أقصى، يتم استلامها على الفور. خطأ في حفظ خوادم ICE - إجراء اتصال خاص + أجري اتصال خاص خطأ في إيقاف الدردشة خطأ في تحميل التفاصيل تفعيل المكالمات من شاشة القفل عبر الإعدادات. @@ -793,8 +793,8 @@ جهة اتصالك فقط يمكنها حذف الرسائل بشكل لا رجعة فيه (يمكنك تعليم الرسالة للحذف). (24 ساعة) أنت فقط يمكنك إرسال رسائل صوتية. افتح - لم يتم تغيير رمز المرور! - تم تغيير رمز المرور + لم يُغيّر رمز المرور! + غُيّر رمز المرور! جارِ فتح قاعدة البيانات… جهة اتصالك فقط يمكنها إرسال رسائل صوتية. ألصق @@ -836,20 +836,20 @@ رفض قيم التطبيق منفذ - حفظ إعدادات القبول التلقائي + احفظ إعدادات عنوان SimpleX إعادة تعريف الخصوصية الرجاء الإبلاغ للمطورين. الخصوصية والأمان - إزالة + أزل إزالة عبارة المرور من Keystore؟ الرجاء إدخال عبارة المرور الحالية الصحيحة. يُرجى تخزين عبارة المرور بشكل آمن، فلن تتمكن من الوصول إلى الدردشة إذا فقدتها. - منع مكالمات الصوت/الفيديو. - منع حذف الرسائل التي لا رجعة فيها. + امنع مكالمات الصوت/الفيديو. + امنع حذف الرسائل التي لا رجعة فيها. استلام الملفات غير معتمد حتى الآن الرجاء التحقق من اتصالك بالشبكة مع %1$s وحاول مرة أخرى. ستتم إزالة خوادم WebRTC ICE المحفوظة. - منع إرسال الملفات والوسائط. + امنع إرسال الملفات والوسائط. استلمت إجابة… مستودع GitHub.]]> رفض @@ -858,9 +858,9 @@ استعادة النسخة الاحتياطية لقاعدة البيانات؟ حفظ اتصالات ملف التعريف والخادم - منع ردود فعل الرسالة. - منع إرسال الرسائل الصوتية. - منع ردود فعل الرسائل. + امنع ردود فعل الرسالة. + امنع إرسال الرسائل الصوتية. + امنع ردود فعل الرسائل. قراءة المزيد انخفاض استخدام البطارية سجل رسالة صوتية @@ -888,26 +888,26 @@ تشغيل الدردشة استعادة النسخة الاحتياطية لقاعدة البيانات خطأ في استعادة قاعدة البيانات - أُزيلت %1$s - أزالتك + أُزيل %1$s + أزالك استلمت في - إزالة العضو - إزالة + أزل العضو + أزل صفّر إلى الإعدادات الافتراضية بينج الفاصل الزمني كلمة مرور ملف التعريف - منع إرسال الرسائل التي تختفي. + امنع إرسال الرسائل التي تختفي. مهلة البروتوكول مهلة البروتوكول لكل كيلوبايت - منع إرسال الرسائل الصوتية. - منع إرسال رسائل مباشرة إلى الأعضاء. - منع إرسال الرسائل التي تختفي. + امنع إرسال الرسائل الصوتية. + امنع إرسال رسائل مباشرة إلى الأعضاء. + امنع إرسال الرسائل التي تختفي. الاحتفاظ بمسودة الرسالة الأخيرة، مع المرفقات. أسماء ملفات خاصة احمِ ملفات تعريف دردشتك بكلمة مرور! رُفضت المكالمة حماية شاشة التطبيق - أُزيلت + أُزيل يُرجى تذكرها أو تخزينها بأمان - لا توجد طريقة لاستعادة كلمة المرور المفقودة! معاينة من المحتمل أن الملف المرجعي للشهادة في عنوان الخادم غير صحيح @@ -955,7 +955,7 @@ الرسائل المرسلة سيتم حذفها بعد المدة المحدّدة. تعيين رسالة تظهر للأعضاء الجدد! عيّن رمز المرور - تم إرساله في: %s + أُرسلت في: %s %s (الحالي) رسالة مرسلة عيّن تفضيلات المجموعة @@ -973,7 +973,7 @@ مسح الرمز أرسل أسئلة وأفكار مشاركة العنوان مع جهات الاتصال؟ - مشاركة العنوان + شارك العنوان حفظ رسالة الترحيب؟ احفظ الخوادم أرسل إيصالات التسليم إلى @@ -982,7 +982,7 @@ عيّن عبارة المرور للتصدير تم تغيير رمز الأمان إيصالات الإرسال - تم إرساله في + أُرسلت في حدد سيتم تفعيل إرسال إيصالات التسليم لجميع جهات الاتصال. سيتم تفعيل إرسال إيصالات التسليم لجميع جهات الاتصال في جميع ملفات تعريف الدردشة المرئية. @@ -1004,7 +1004,7 @@ فعّلت رمز المرور للتدمير الذاتي! الإعدادات دعوة SimpleX لمرة واحدة - عرض جهة الاتصال والرسالة + أظهر جهة الاتصال والرسالة قفل SimpleX لم يتحقق من %s قفل SimpleX @@ -1017,18 +1017,18 @@ مشاركة الملف… شعار SimpleX فريق SimpleX - عرض رمز QR + أظهر رمز QR تم التحقق %s فشلت بعض الخوادم في الاختبار: إرسال معاينات الرابط تخطي دعوة الأعضاء إيقاف الدردشة؟ - عرض + أظهر حدثت بعض الأخطاء غير الفادحة أثناء الاستيراد: وسيط SOCKS تم تدقيق أمان SimpleX Chat بواسطة Trail of Bits. إيقاف - عرض المعاينة + أظهر المعاينة السماعة متوقفة SimpleX وضع القفل مشاركة الرابط @@ -1046,13 +1046,13 @@ أوقف الدردشة لتصدير أو استيراد أو حذف قاعدة بيانات الدردشة. لن تتمكّن من استلام الرسائل وإرسالها أثناء إيقاف الدردشة. %s ثانية/ثواني يبدأ… - تم تشغيل القفل SimpleX - عرض: - عرض خيارات المطور + شُغّل قفل SimpleX + أظهر: + أظهر خيارات المطور simplexmq: v%s (%2s) يتطلب الخادم إذنًا لإنشاء قوائم انتظار، تحقق من كلمة المرور يتطلب الخادم إذنًا للرفع، تحقق من كلمة المرور - عرض جهة الاتصال فقط + أظهر جهة الاتصال فقط مكالمات SimpleX Chat خدمة SimpleX Chat يبدأ بشكل دوري @@ -1127,7 +1127,7 @@ تجزئة الرسالة السابقة مختلفة. معرف الرسالة التالية غير صحيح (أقل أو يساوي السابق). \nيمكن أن يحدث ذلك بسبب بعض العلل أو عندما يُخترق الاتصال. - إزالة من المفضلة + أزل من المفضلة محاولة الاتصال بالخادم المستخدم لاستلام الرسائل من جهة الاتصال هذه. اختيار ملف إرسال غير مصرح به @@ -1205,7 +1205,7 @@ يجب عليك استخدام أحدث إصدار من قاعدة بيانات دردشتك على جهاز واحد فقط، وإلا فقد تتوقف عن تلقي الرسائل من بعض جهات الاتصال. سيتم استلام الفيديو عندما تكون جهة اتصالك متصلة بالإنترنت، يُرجى الانتظار أو التحقق لاحقًا! يمكنك مشاركة هذا العنوان مع جهات اتصالك للسماح لهم بالاتصال بـ%s. - أُزيلت %1$s + أزلت %1$s حدّث قاعدة بيانات دردشتك غير مُعمّاة - عيّن عبارة مرور لحمايتها. عبارة مرور قاعدة بيانات خاطئة @@ -1271,7 +1271,7 @@ لقد شاركت رابط لمرة واحدة متخفي عبر المتصفح يجب عليك إدخال عبارة المرور في كل مرة يبدأ فيها التطبيق - لا يتم تخزينها على الجهاز. - قم بالترقية وفتح الدردشة + رقِّ وافتح الدردشة رسالة الترحيب عبر رابط عنوان الاتصال ما لم يحذف جهة الاتصال الاتصال أو استُخدم هذا الرابط بالفعل، فقد يكون خطأ - الرجاء الإبلاغ عنه. @@ -1335,7 +1335,7 @@ أنت دعوت جهة اتصال مسودة الرسالة %s و %s متصل - إظهار الرسائل الأخيرة + أظهر الرسائل الأخيرة %s، %s و %d أعضاء آخرين متصلون %s، %s و %s متصل سيتم تعمية قاعدة البيانات وتخزين عبارة المرور في الإعدادات. @@ -1364,7 +1364,7 @@ أرسل رسالة مباشرة للاتصال وضع التخفي اصبح أسهل فعّل وضع التخفي عند الاتصال. - أرسل رسالة مباشرة + أرسل لاتصال متصل مباشرةً جارٍ الاتصال بالفعل! مجموعات أفضل @@ -1396,7 +1396,7 @@ %d رسالة محظورة حظر العضو الجوّال متصل - حذف وإشعار جهة الاتصال + احذف وإشعار جهة الاتصال انتهى الاتصال اتصل بسطح المكتب قطع الاتصال @@ -1450,7 +1450,7 @@ فشلت إعادة التفاوض على التعمية. غير متوافق! ربط الجوّال - إزالة العضو + أزل العضو إلغاء حظر العضو؟ استخدم من سطح المكتب رمز الجلسة @@ -1468,7 +1468,7 @@ خطأ لقد شاركت مسار ملف غير صالح. أبلغ عن المشكلة لمطوري التطبيق. اسم غير صالح! - لصق عنوان سطح المكتب + ألصق عنوان سطح المكتب %1$s!]]> تحقق من الرمز مع سطح المكتب مسح رمز QR من سطح المكتب @@ -1476,7 +1476,7 @@ - إشعار اختياريًا جهات الاتصال المحذوفة.\n- أسماء الملفات التعريفية بمسافات.\n- و اكثر! مسار الملف غير صالح لقد طلبت بالفعل الاتصال عبر هذا العنوان! - إظهار وحدة التحكم في نافذة جديدة + أظهر وحدة التحكم في نافذة جديدة المسح من الجوّال تحقق من الاتصالات من فضلك، انتظر حتى يتم تحميل الملف من الجوّال المرتبط @@ -1523,7 +1523,7 @@ ابحث أو ألصِق رابط SimpleX بدء الدردشة؟ توقفت الدردشة. إذا كنت قد استخدمت قاعدة البيانات هذه بالفعل على جهاز آخر، فيجب عليك نقلها مرة أخرى قبل بدء الدردشة. - اعرض الأخطاء الداخلية + أظهر الأخطاء الداخلية خطأ فادح خطأ داخلي يُرجى إبلاغ المطورين بذلك: @@ -1614,8 +1614,8 @@ طبّق يُرجى ملاحظة: استخدام نفس قاعدة البيانات على جهازين سيؤدي إلى كسر فك تعمية الرسائل من اتصالاتك، كحماية أمنية.]]> تحذير: سيتم حذف الأرشيف.]]> - التعمية بين الطرفين مع توفير السرية التامة لإعادة التوجيه والرفض واستعادة عمليات الاقتحام.]]> - التعمية بين الطرفين المقاوم للكم مع توفير السرية التامة لإعادة التوجيه والرفض واستعادة عمليات الاقتحام.]]> + التعمية بين الطرفين مع توفير السرية التامة لإعادة التوجيه والرفض واستعادة عمليات الاقتحام.]]> + التعمية بين الطرفين المقاوم للكم مع توفير السرية التامة لإعادة التوجيه والرفض واستعادة عمليات الاقتحام.]]> هذه الدردشة محمية بالتعمية بين الطرفين. هذه الدردشة محمية بالتعمية بين الطرفين المقاوم للكم. افتح شاشة الترحيل @@ -1702,7 +1702,7 @@ الرسائل الصوتية غير مسموح بها روابط SimpleX السماح بإرسال روابط SimpleX. - منع إرسال روابط SimpleX + امنع إرسال روابط SimpleX كل الأعضاء يمكن للأعضاء إرسال روابط SimpleX. روابط SimpleX محظورة. @@ -1739,7 +1739,7 @@ عنوان الخادم غير متوافق مع إعدادات الشبكة. إصدار الخادم غير متوافق مع إعدادات الشبكة. مفتاح خاطئ أو اتصال غير معروف - على الأرجح حُذف هذا الاتصال. - تم تجاوز السعة - لم يتلق المُستلم الرسائل المُرسلة مسبقًا. + تجاوزت السعة - لم يتلق المُستلم الرسائل المُرسلة مسبقًا. خطأ في خادم الوجهة: %1$s خطأ: %1$s خادم التحويل: %1$s\nخطأ في خادم الوجهة: %2$s @@ -1833,7 +1833,7 @@ حالة الملف: %s حالة الرسالة: %s خطأ في النسخ - تم استخدام هذا الرابط مع جهاز محمول آخر، يُرجى إنشاء رابط جديد على سطح المكتب. + استُخدم هذا الرابط مع جوّال آخر، يُرجى إنشاء رابط جديد على سطح المكتب. يُرجى التحقق من اتصال الهاتف المحمول وسطح المكتب بنفس الشبكة المحلية، وأن جدار حماية سطح المكتب يسمح بالاتصال. \nيُرجى مشاركة أي مشاكل أُخرى مع المطورين. لا يمكن إرسال الرسالة @@ -1870,7 +1870,7 @@ مُعطَّل غير نشط معلومات الخوادم - عرض المعلومات ل + يُظهر معلومات ل الأخطاء الرسائل المُرسلة الإجمالي @@ -1948,7 +1948,7 @@ أعِد توصيل الخوادم؟ عنوان الخادم الإحصائيات - تم تجاهل الاشتراكات + تجاهلت الاشتراكات جلسات النقل لكي يتم إعلامك بالإصدارات الجديدة، شغّل الفحص الدوري للإصدارات المستقرة أو التجريبية. أنت غير متصل بهذه الخوادم. يتم استخدام التوجيه الخاص لتسليم الرسائل إليهم. @@ -2058,7 +2058,7 @@ خطأ في تحويل الرسائل خطأ في تبديل ملف التعريف حدد ملف تعريف الدردشة - لقد تم نقل اتصالك إلى %s ولكن حدث خطأ غير متوقع أثناء إعادة توجيهك إلى ملف التعريف. + نُقلت اتصالك إلى %s ولكن حدث خطأ غير متوقع أثناء إعادة توجيهك إلى ملف التعريف. تحويل %1$s رسالة؟ لم يحوّل %1$s من الرسائل جارِ تحويل %1$s رسالة @@ -2181,7 +2181,7 @@ شارك عنوان SimpleX على وسائل التواصل الاجتماعي. عنوان SimpleX والروابط لمرة واحدة آمنة للمشاركة عبر أي برنامج مُراسلة. انقر فوق أنشئ عنوان SimpleX في القائمة لإنشائه لاحقًا. - حُذفت هذه الرسالة أو لم يتم استلامها بعد. + حُذفت هذه الرسالة أو لم تُستلم بعد. استخدم للرسائل يحمي التطبيق خصوصيتك من خلال استخدام مُشغلين مختلفين في كل محادثة. %s.]]> @@ -2319,7 +2319,7 @@ ذّكورات غير مقروءة يمكنك ذكر ما يصل إلى %1$s من الأعضاء في الرسالة الواحدة! السماح بالإبلاغ عن الرسائل إلى المشرفين. - منع الإبلاغ عن الرسائل للمشرفين. + امنع الإبلاغ عن الرسائل للمشرفين. أرشفة كافة البلاغات؟ أرشف البلاغات لكل المشرفين @@ -2420,4 +2420,37 @@ لا دردشات مع الأعضاء العضو لديه نُسخة قديمة أضف رابط قصير + اقبل طلب جهة الاتصال + أضف رسالة + التعمية بين الطرفين.]]> + إلا بعد قبول طلبك.]]> + اتصل + يجب أن يقبل جهة الاتصال… + خطأ في تغيير مستخدم جهة الاتصال + خطأ في تغيير مستخدم المجموعة + خطأ في إعداد جهة الاتصال + خطأ في إعداد المجموعة + خطأ في رفض طلب جهة الاتصال + انضم للمجموعة + افتح الدردشة + افتح دردشة جديدة + افتح مجموعة جديدة + افتح للقبول + افتح لاتصال + افتح لانضمام + سيتم مشاركة الملف التعريف عبر رابط العنوان. + ارفض طلب جهة الاتصال + أُرسل الطلب + إرسال طلب جهة اتصال؟ + أرسل طلب + أرسل طلب دون رسالة + أُرسل إلى جهة اتصالك بعد الاتصال. + شارك ملف تعريف المجموعة عبر الرابط + شارك ملف التعريف + شارك ملف التعريف عبر رابط + لن يتم إشعار المرسل. + رسالة الترحيب + ملف تعريفك + لا يمكن تغيير ملف التعريف + لاستخدام ملف تعريف آخر بعد محاولة الاتصال، احذف الدردشة واستخدم الرابط مرة أخرى. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml index 274778a2f2..56d54b593b 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml @@ -1185,7 +1185,7 @@ Els teus contactes romandran connectats. Compartir l\'adreça amb els contactes? Compartir enllaç - Desa la configuració d\'acceptació automàtica + Desar la configuració d\'adreça SimpleX Deixar de compartir O per compartir en privat Podeu crear-la més tard @@ -1692,8 +1692,8 @@ enviament no autoritzat Aquest text està disponible a la configuració Benvingut %1$s! - unir-te com a %s - enviar missatge directe + Entrar com a %s + enviar per connectar Toca per iniciar un xat nou Carregant xats… No hi ha xats filtrats @@ -2169,7 +2169,7 @@ "Invitació d\'un sol ús per SimpleX" Sense Tor o una VPN, la vostra adreça serà visible per als següents relays XFTP: %1$s. Funció lenta - heu estat convidat a un grup + Estat convidats(des) a un grup cerca (escaneja o enganxa del porta-retalls) Escaneja un codi QR @@ -2401,4 +2401,37 @@ %d xats amb membres tots(es) Afegir enllaç curt + Acceptar la sol·licitud de contacte + Afegir un missatge + No es pot canviar el perfil + xifratge extrem a extrem.]]> + després que la sol·licitud sigui acceptada.]]> + Connectar + el contacte hauria d\'acceptar… + Error en canviar el contacte + Error en canviar el compte del grup + Error en preparar el contacte + Error en preparar el grup + Error en rebutjar la sol·licitud de contacte + Entrar al grup + Obrir xat + Obrir nou xat + Obrir nou grup + Obrir per acceptar + Obrir per connectar + Obrir per entrar + El perfil es compartirà a través de l\'enllaç d\'adreça. + Rebutjar la sol·licitud de contacte + sol·licitud enviada + Enviar sol·licitud de contacte? + Enviar sol·licitud + Enviar sol·licitud sense missatge + Enviat al contacte després de la connexió. + Compartir el perfil del grup mitjançant un enllaç + Compartir el perfil + Compartir el perfil mitjançant un enllaç + L\'emissor(a) NO serà notificat(da). + Per utilitzar un altre perfil després d\'un intent de connexió, suprimiu el xat i torneu a utilitzar l\'enllaç. + Missatge de benvinguda + El vostre perfil diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml index 47fa31274d..2e406fc9df 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml @@ -1202,7 +1202,7 @@ Freunde einladen Lassen Sie uns über SimpleX Chat schreiben Profil-Aktualisierung wird an Ihre Kontakte gesendet. - Einstellungen von „automatisch akzeptieren“ speichern + SimpleX-Adress-Einstellungen speichern Einstellungen speichern\? Die Adresse mit Kontakten teilen\? Teilen beenden @@ -1453,7 +1453,7 @@ Erstellen eines neuen Profils in der Desktop-App. 💻 Inkognito beim Verbinden einschalten. - Verbindung mit dem Directory-Service (BETA)!\n- Empfangsbestätigungen (für bis zu 20 Mitglieder).\n- Schneller und stabiler. - Direktnachricht senden + Zum Verbinden senden Direkt miteinander verbunden Erweitern Verbindungsanfrage wiederholen? @@ -2050,7 +2050,7 @@ Die Weiterleitungs-Server-Version ist nicht kompatibel mit den Netzwerkeinstellungen: %1$s. Die Ziel-Server-Adresse von %1$s ist nicht mit den Einstellungen des Weiterleitungs-Servers %2$s kompatibel. Fehler beim Verbinden zum Weiterleitungs-Server %1$s. Bitte versuchen Sie es später erneut. - Medium verpixeln + Medien verpixeln Weich Stark Mittel @@ -2288,7 +2288,7 @@ Geschäftliche Adresse Geschäftliche Chats Nehmen Sie Team-Mitglieder in Ihre Unterhaltungen auf. - Die App läuft immer im Hintergrund ab + App läuft dauerhaft im Hintergrund In diesem Chat sind Direktnachrichten zwischen Mitgliedern nicht erlaubt. Kein Hintergrund-Service Nachrichten alle 10 Minuten überprüfen @@ -2510,4 +2510,37 @@ Kontakt gelöscht Das Mitglied hat eine alte App-Version Verkürzten Link hinzufügen + Kontaktanfrage akzeptieren + Nachricht hinzufügen + Ende-zu-Ende-Verschlüsselung geschützt.]]> + sobald Ihre Anfrage akzeptiert wurde.]]> + Verbinden + Kontakt sollte akzeptieren… + Fehler beim Ändern des Benutzer-Kontakts + Fehler beim Wechseln der Benutzer-Gruppe + Fehler bei der Kontaktaufnahme + Fehler beim Vorbereiten der Gruppe + Fehler bei der Ablehnung der Kontaktanfrage + Der Gruppe beitreten + Chat öffnen + Neuen Chat eröffnen + Neue Gruppe eröffnen + Zum Akzeptieren öffnen + Zum Verbinden öffnen + Zum Beitreten öffnen + Das Profil wird über den Adress-Link geteilt. + Kontakt-Anfrage ablehnen + Anfrage wurde gesendet + Kontakt-Anfrage senden? + Anfrage senden + Anfrage ohne Nachricht senden + Wird nach der Verbindung an Ihren Kontakt gesendet. + Gruppenprofil über einen Link teilen + Profil teilen + Profil über einen Link teilen + Der Absender wird NICHT benachrichtigt. + Begrüßungsmeldung + Ihr Profil + Änderung des Profils nicht möglich + Wenn Sie nach dem Verbindungsversuch ein anderes Profil verwenden möchten, löschen Sie den Chat und verwenden Sie den Link erneut. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml index b8e99587f7..394dbcfc54 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml @@ -626,7 +626,7 @@ نمایه گپ اتصال ساختار برنامه: %s - تنظیمات شبکه + تنظیمات پیشرفته نمایش: لطفا توجه داشته باشید: واسطه‌های پیام و پرونده از طریق پروکسی SOCKS متصل می‌شوند. تماس‌ها و ارسال پیش‌نمایش‌های لینک از اتصال مستقیم استفاده می‌کنند.]]> گزینه‌های توسعه‌دهنده @@ -917,7 +917,7 @@ اعطای اجازه‌ها در تنظیمات این مجوز را در تنظیمات اندروید پیدا و به صورت دستی آن را اعطا کنید. باز کردن تنظیمات - پروتکل و کد متن‌باز - هر کسی می‌تواند سرورها را راه‌اندازی کند. + هر کسی می‌تواند سرویس‌دهنده میزبانی کند. رسیدها غیرفعال شوند؟ فعال کردن (نگه‌داشتن مقدارهای جایگزین شده) اعطای اجازه‌ها @@ -1851,4 +1851,105 @@ این لینک توسط موبایل دیگری استفاده شده است، لطفا لینک جدیدی در کامپیوتر بسازید. خطای سرور پرونده:%1$s %1$d خطای پرونده:\n%2$s + %1$d پرونده هنوز در حال بارگیری هستند + %1$d پرونده پاک شدند. + %1$d پرونده بارگیری نشدند. + %1$d خطای دیگر در پرونده. + %1$s پیام باز ارسال نشدند. + گفتگو با یک عضو + یک گزارش + یک سال + a + b + درباره عملگرها + پذیرفتن + پذیرفتن + پذیرفتن به عنوان عضو + پذیرفتن به عنوان ناظر + پذیرفتن شرایط + %1$s پذیرفته شد + دعوت پذیرفته شد + شما پذیرفته شدید + پذیرفتن عضو + تأیید شد + خطاهای تأیید + ارتباطات فعال + سرویس‌دهنده‌های رسانه و پرونده اضافه شدند + سرویس‌دهنده‌های پیام اضافه شدند + %1$d پرونده هنوز در حال بارگیری هستند. + شرایط پذیرفته شد + افزودن دوستان + افزودن فهرست + نشانی یا پیوند یک‌بار مصرف؟ + تنظیمات نشانی + افزودن پیوند کوتاه + اضافه کردن اعضای تیم + افزودن به فهرست + اعضای تیم خود را به گفتگوها اضافه کنید. + همه + همه + همه گفتگوها از فهرست %s پاک خواهند شد و فهرست حذف می‌شود. + همه پیام‌های جدید از این اعضا پنهان خواهند شد! + اجازه تماس‌ها؟ + اجازه گزارش پیام‌ها به ناظران. + همه نمایه‌ها + همه گزارش‌ها برای شما بایگانی خواهند شد. + همه سرویس‌دهنده‌ها + دلیلی دیگر + برنامه همیشه در پس‌زمینه اجرا می‌شود + نشست برنامه + نوارهای ابزار برنامه + به‌روزرسانی برنامه بارگیری شد + بایگانی + همه گزارش‌ها بایگانی شوند؟ + بایگانی کردن گفتگوها برای چت بعدی. + مخاطبین بایگانی شده + گزارش بایگانی شده + گزارش بایگانی شده توسط %s + بایگانی %d گزارش؟ + بایگانی گزارش + گزارش بایگانی شود؟ + پیوند نامعتبر + لطفاً بررسی کنید که پیوند سیمپلکس درست است. + فقط شما و ناظران آن را می‌بینید + فقط فرستنده و ناظران آن را می‌بینند + درخواست اتصال + پیوند کانال سیمپلکس + هرزنامه + محتوای نامناسب + نقض دستورالعمل‌های انجمن + نمایه نامناسب + خطا در ذخیره سرویس‌دهنده‌ها + بدون سرویس‌دهنده پیام. + هیچ سرویس‌دهنده‌ای برای دریافت پیام وجود ندارد. + هیچ سرویس‌دهنده‌ای برای مسیردهی پیام خصوصی وجود ندارد. + بدون سرویس‌دهنده رسانه و پرونده. + هیچ سرویس‌دهنده‌ای برای ارسال پرونده وجود ندارد. + هیچ سرویس‌دهنده‌ای برای دریافت پرونده وجود ندارد. + برای نمایه گفتگو %s: + خطاها در پیکربندی سرویس‌دهنده‌ها. + خطا در پذیرفتن شرایط + هرزنامه + محتوا شرایط استفاده را نقض می‌کند + نشانی سرویس‌دهنده با تنظیمات شبکه سازگار نیست: %1$s. + نسخه سرویس‌دهنده با برنامه شما سازگار نیست: %1$s. + خطای مسیردهی خصوصی + خطا در اتصال به سرویس‌دهنده فورواردینگ %1$s. لطفاً بعداً تلاش کنید. + نشانی سرویس‌دهنده فورواردینگ با تنظیمات شبکه سازگار نیست: %1$s. + نسخه سرویس‌دهنده فورواردینگ با تنظیمات شبکه سازگار نیست: %1$s. + سرویس‌دهنده فورواردینگ %1$s نتوانست به سرویس‌دهنده مقصد %2$s متصل شود. لطفاً بعداً تلاش کنید. + نشانی سرویس‌دهنده مقصد %1$s با تنظیمات سرویس‌دهنده فورواردینگ %2$s سازگار نیست. + نسخه سرویس‌دهنده مقصد %1$s با سرویس‌دهنده فورواردینگ %2$s سازگار نیست. + لطفاً بعداً تلاش کنید. + خطا در فوروارد کردن پیام‌ها + خطا در ایجاد گزارش + خطا در پذیرفتن عضو + خطا در پاک کردن گفتگوی با عضو + پیوند اتصال پشتیبانی‌نشده + این پیوند به نسخه جدیدتری از برنامه نیاز دارد. لطفاً برنامه را به‌روزرسانی کنید یا از مخاطب خود بخواهید پیوند سازگاری بفرستد. + اتصال مسدود شد + اتصال توسط گرداننده سرویس‌دهنده مسدود شده است:\n%1$s. + پیام‌های نرسیده + ارتباط به حد نصاب پیام‌های نرسیده رسید، ممکن است مخاطب شما آفلاین باشد. + خطا در به‌روزرسانی فهرست گفتگو + افزودن پیام diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hi/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hi/strings.xml index 9e0d476dc1..e6f02f34f2 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hi/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hi/strings.xml @@ -285,4 +285,4 @@ सदस्य खोजें बंद है - \ No newline at end of file + diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml index 6bba8acc88..30cf5a05c7 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml @@ -26,7 +26,7 @@ Elfogadás gombra fent, majd: Elfogadás inkognitóban - Elfogadja a meghívási kérést? + Elfogadja a meghívót? Elfogadás Elfogadás Cím hozzáadása a profilhoz, hogy a partnerei megoszthassák másokkal. A profilfrissítés el lesz küldve partnerei számára. @@ -38,9 +38,9 @@ %s visszavonva Előre beállított kiszolgálók hozzáadása A hívások kezdeményezése le van tiltva ebben a csevegésben. - Az összes partneréhez és csoporttaghoz külön TCP-kapcsolat (és SOCKS-hitelesítőadat) lesz használva.\nMegjegyzés: ha sok kapcsolata van, az akkumulátor-használat és az adatforgalom jelentősen megnövekedhet, és néhány kapcsolódási kísérlet sikertelen lehet.]]> + Az összes partneréhez és csoporttaghoz külön TCP-kapcsolat (és SOCKS-hitelesítési adat) lesz használva.\nMegjegyzés: ha sok kapcsolata van, akkor az akkumulátor-használat és az adatforgalom jelentősen megnövekedhet, és néhány kapcsolódási kísérlet sikertelen lehet.]]> hivatkozás előnézetének visszavonása - Az összes csevegési profiljához az alkalmazásban külön TCP-kapcsolat (és SOCKS-hitelesítőadat) lesz használva.]]> + Az összes csevegési profiljához az alkalmazásban külön TCP-kapcsolat (és SOCKS-hitelesítési adat) lesz használva.]]> Mindkét fél küldhet eltűnő üzeneteket. Az Android Keystore-t a jelmondat biztonságos tárolására használják – lehetővé teszi az értesítési szolgáltatás működését. Érvénytelen az üzenet hasítóértéke @@ -90,7 +90,7 @@ titkosítás elfogadása… Nem lehet meghívni a partnert! téves üzenet ID - Meghívási kérések automatikus elfogadása + Meghívók automatikus elfogadása Megjegyzés: NEM fogja tudni helyreállítani, vagy módosítani a jelmondatot abban az esetben, ha elveszíti.]]> hívás… További másodlagos szín @@ -111,7 +111,7 @@ Az összes csevegés és üzenet törölve lesz – ez a művelet nem vonható vissza! hanghívás félkövér - Az alkalmazás-jelkód helyettesítve lesz egy önmegsemmisítő-jelkóddal. + Az alkalmazásjelkód helyettesítve lesz egy önmegsemmisítő jelkóddal. Arab, bolgár, finn, héber, thai és ukrán – köszönet a felhasználóknak és a Weblate-nek. Engedélyezi a hangüzeneteket? Mindig használjon továbbítókiszolgálót @@ -185,7 +185,7 @@ kapcsolódva Szerepkör módosítása Kapcsolódva - Hitelesítőadatok megerősítése + Hitelesítési adat megerősítése Módosítja a fogadási címet? módosította a címet az Ön számára Önmegsemmisítő-mód módosítása @@ -213,7 +213,7 @@ Partner ellenőrizve Kapcsolódik saját magához? Kimásolva a vágólapra - Meghívási kérés elküldve! + Meghívó elküldve! Kapcsolódás a számítógéphez Kapcsolat Helyesbíti a nevet a következőre: %s? @@ -294,14 +294,14 @@ Kiszolgáló címének ellenőrzése és újrapróbálkozás. Törli a csoportot? Adatbázis fejlesztésének megerősítése - Saját profil létrehozása + Profil létrehozása cím módosítása… kapcsolódás… Hívás kapcsolása Törli a fájl- és a médiatartalmakat? befejezett CSEVEGÉSI ADATBÁZIS - Önmegsemmisítő-jelkód módosítása + Önmegsemmisítő jelkód módosítása Sorba állítás létrehozása színezett kapcsolódás… @@ -366,7 +366,7 @@ %dmp Kézbesítési jelentések! Az eszközön nincs beállítva a képernyőzár. A SimpleX-zár az „Adatvédelem és biztonság” menüben kapcsolható be, miután beállította a képernyőzárat az eszközén. - Titkosításvisszafejtési hiba + Titkosítás-visszafejtési hiba Eltűnik: %s szerkesztve Törlés @@ -492,7 +492,7 @@ Csoporthivatkozások Végre, megvannak! 🚀 Hiba történt a csevegés elindításakor - A csoport profilja a tagok eszközein tárolódik, nem a kiszolgálókon. + A csoportprofil a tagok eszközein tárolódik, nem a kiszolgálókon. Adja meg a jelmondatot… Hiba történt a felhasználói adatvédelem frissítésekor Titkosít @@ -513,8 +513,8 @@ Adja meg a helyes jelmondatot. A csoport törölve lesz az Ön számára – ez a művelet nem vonható vissza! Titkosítja az adatbázist? - A zárolási képernyőn megjelenő hívások engedélyezése a Beállításokban. - titkosítás elfogadva + A zárolási képernyőn megjelenő hívások engedélyezése a beállításokban. + titkosítása elfogadva Engedélyezi a kézbesítési jelentéseket? Hiba történt a csoportprofil mentésekor hiba @@ -527,7 +527,7 @@ Fájl: %s Hívás befejezése Hiba történt a csoporthivatkozás törlésekor - Fájl elmentve + Fájl mentve Kapcsolat javítása? Fájlok és médiatartalmak KONZOLHOZ @@ -540,7 +540,7 @@ A fájl akkor érkezik meg, amikor a küldője befejezte annak feltöltését. Fájl letöltése Nem sikerült betölteni a csevegést - Adja meg a kiszolgálót kézzel + Kiszolgáló megadása kézzel A fájl akkor érkezik meg, amikor a küldője elérhető lesz, várjon, vagy ellenőrizze később! Hiba történt a csoporthivatkozás létrehozásakor A galériából @@ -578,12 +578,12 @@ A csoportmeghívó már nem érvényes, a küldője eltávolította. A csoport teljes neve: súgó - Önmegsemmisítő-jelkód engedélyezése + Önmegsemmisítő jelkód engedélyezése KÍSÉRLETI Hiba történt a cím módosításának megszakításakor Hiba történt a fájl fogadásakor - titkosítás rendben - Hiba történt a meghívási kérés törlésekor + titkosítása rendben van + Hiba történt a meghívó törlésekor Engedélyezi a kézbesítési jelentéseket a csoportok számára? Partner általi javítás nem támogatott Fájl nem található @@ -608,12 +608,12 @@ Hiba történt a cím létrehozásakor engedélyezve Hiba történt a részletek betöltésekor - Hiba történt a meghívási kérés elfogadásakor + Hiba történt a meghívó elfogadásakor a titkosítás újraegyeztetése engedélyezve van %s számára a titkosítás újraegyeztetése szükséges Rejtett csevegési profilok Fájlok és médiatartalmak - A kép elmentve a „Galériába” + Kép mentve a galériába Elrejtés Azonnal A fájlok- és a médiatartalmak küldése le van tiltva! @@ -669,7 +669,7 @@ A kép akkor érkezik meg, amikor a küldője befejezte annak feltöltését. QR-kód beolvasásával.]]> A kapott SimpleX Chat-meghívási hivatkozását megnyithatja a böngészőjében: - Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő-jelkódot: + Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő jelkódot: Megtalált számítógép Számítógépek A markdown használata @@ -737,7 +737,7 @@ Az onion kiszolgálók nem lesznek használva. perc Tudjon meg többet - Új meghívási kérés + Új meghívó Csatlakozás a csoporthoz Társított számítógép beállítások meghíva a saját csoporthivatkozásán keresztül @@ -801,7 +801,7 @@ ÉLŐ Megjelölés olvasatlanként Továbbiak - Bejelentkezés hitelesítőadatokkal + Bejelentkezés hitelesítési adatokkal érvénytelen üzenetformátum Csatlakozás Az értesítések az alkalmazás elindításáig nem fognak működni @@ -817,7 +817,7 @@ Barátok meghívása Menük és figyelmeztetések Tagok meghívása - csatlakozás mint %s + Csatlakozás mint %s Nincs csevegés kijelölve Csak helyi profiladatok inkognitó egy egyszer használható meghívón keresztül @@ -871,7 +871,7 @@ elutasított hívás Időszakos fogadott, tiltott - Megismétli a meghívási kérést? + Újra elküldi a meghívót? Véglegesen csak Ön törölhet üzeneteket (partnere csak törlésre jelölheti meg őket ). (24 óra) Szerepkör SimpleX kapcsolattartási cím @@ -888,7 +888,7 @@ a csoporthivatkozáson keresztül Időtartam a PING-ek között Eltűnő üzenet küldése - Önmegsemmisítő-jelkód + Önmegsemmisítő jelkód Mentés és a csoportprofil frissítése Adatvédelem Profil SimpleX-címe @@ -899,7 +899,7 @@ Frissítés Videó elküldve Az adatbázis jelmondatának módosítása - Alkalmazás beállítások megnyitása + Alkalmazásbeállítások megnyitása A jelkód nem módosult! Frissítés Kijelölés @@ -922,7 +922,7 @@ TÉMÁK Túl sok videó! Üdvözöljük! - Önmegsemmisítő-jelkód + Önmegsemmisítő jelkód (beolvasás, vagy beillesztés a vágólapról) Várakozás a videóra Válasz @@ -951,7 +951,7 @@ Eltávolítás Keresés Újraegyezteti a titkosítást? - Az önmegsemmisítő-jelkód engedélyezve! + Az önmegsemmisítő jelkód engedélyezve! Biztonsági kiértékelés Cím Üzenet elküldése @@ -1023,7 +1023,7 @@ Kapott hivatkozás beillesztése Menti a kiszolgálókat? A SimpleX Chat biztonsága a Trail of Bits által lett auditálva. - frissítette a csoport profilját + frissítette a csoportprofilt SIMPLEX CHAT TÁMOGATÁSA SimpleX Chat szolgáltatás Ön megfigyelő @@ -1070,7 +1070,7 @@ tulajdonos Bekapcsolás %s, %s és %s kapcsolódott - Egyszer használható SimpleX-meghívó + Egyszer használható SimpleX meghívó Hívások nem sikerült elküldeni KEZELŐFELÜLET SZÍNEI @@ -1081,7 +1081,7 @@ Újraindítás SMP-kiszolgálók Videó - Automatikus elfogadási beállítások mentése + SimpleX-cím beállításainak mentése Újraegyeztetés Várakozás a videóra Saját XFTP-kiszolgálók @@ -1096,7 +1096,7 @@ Adatbázis-jelmondat beállítása Biztonsági kód megtekintése Feloldja a tag letiltását? - A küldője törölhette a meghívási kérést. + A küldője törölhette a meghívót. Érvénytelen adatbázis-jelmondat Saját SMP-kiszolgálók A kézbesítési jelentések le vannak tiltva @@ -1111,11 +1111,11 @@ %d-s port Kapcsolódás egy hivatkozáson keresztül Cím megosztása - A kiszolgáló QR-kódjának beolvasása + Kiszolgáló QR-kódjának beolvasása Megállítás Megállítja a címmegosztást? Csevegési profilok módosítása - Megismétli a meghívási kérést? + Megismétli a csatlakozási kérést? Várakozás a képre Hangüzenetek Eltávolítja a tagot? @@ -1237,7 +1237,7 @@ Ön elhagyta a csoportot Hangüzenet rögzítése SimpleX-zár bekapcsolva - közvetlen üzenet küldése + elküldés a partnernek Beolvasás hordozható eszközről Kapcsolatok hitelesítése Üzenet megosztása… @@ -1257,7 +1257,7 @@ Felfedés Fogadott üzenetbuborék színe Csak a partnere tudja az üzeneteket véglegesen törölni (Ön csak törlésre jelölheti meg azokat). (24 óra) - Az önmegsemmisítő-jelkód módosult! + Az önmegsemmisítő jelkód módosult! SimpleX Chat kiszolgálók használatban. SimpleX Chat kiszolgálók használata? Csevegési profil felfedése @@ -1281,12 +1281,12 @@ Visszaállítás alapértelmezettre Hacsak a partnere nem törölte a kapcsolatot, vagy ez a hivatkozás már használatban volt egyszer, lehet hogy ez egy hiba – jelentse a problémát.\nA kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcsolattartási hivatkozást, és ellenőrizze, hogy a hálózati kapcsolat stabil-e. videóhívás (nem e2e titkosított) - Alkalmazás új kapcsolatokhoz + Használat új kapcsolatokhoz Az új üzeneteket az alkalmazás időszakosan lekéri – naponta néhány százalékot használ az akkumulátorból. Az alkalmazás nem használ push-értesítéseket – az eszközről származó adatok nem lesznek elküldve a kiszolgálóknak. Számítógép címének beillesztése a kapcsolattartási címhivatkozáson keresztül a SimpleX a háttérben fut a push értesítések használata helyett.]]> - A partnereinek online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.\nVisszavonhatja ezt a partnerkérelmet és eltávolíthatja a partnert (ezt később ismét megpróbálhatja egy új hivatkozással). + A partnereinek online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.\nVisszavonhatja ezt a kapcsolatot és eltávolíthatja a partnert (ezt később ismét megpróbálhatja egy új hivatkozással). A jelmondat nem található a Keystore-ban, ezért kézzel szükséges megadni. Ez akkor történhetett meg, ha visszaállította az alkalmazás adatait egy biztonsági mentési eszközzel. Ha nem így történt, akkor lépjen kapcsolatba a fejlesztőkkel. A partnerei továbbra is kapcsolódva maradnak. A kiszolgálónak hitelesítésre van szüksége a feltöltéshez, ellenőrizze jelszavát @@ -1300,7 +1300,7 @@ Az alkalmazás elindításához vagy 30 másodpercnyi háttérben töltött idő után, az alkalmazáshoz való visszatéréshez hitelesítésre lesz szükség. Az üzenet az összes tag számára törölve lesz. A videó nem dekódolható. Próbálja ki egy másik videóval, vagy lépjen kapcsolatba a fejlesztőkkel. - Ez a szöveg a „Beállításokban” érhető el + Ez a szöveg a beállításokban érhető el A profilja el lesz küldve a partnere számára, akitől ezt a hivatkozást kapta. Az alkalmazás 1 perc után bezárható a háttérben. Ön meghívást kapott a csoportba @@ -1323,7 +1323,7 @@ A videó akkor érkezik meg, amikor a küldője befejezte annak feltöltését. Ön egy egyszer használható meghívót osztott meg inkognitóban Ön már kapcsolódott ahhoz a kiszolgálóhoz, amely az adott partnerétől érkező üzenetek fogadására szolgál. - Később engedélyezheti a „Beállításokban” + Később engedélyezheti a beállításokban Akkor lesz kapcsolódva a csoporthoz, amikor a csoport tulajdonosának eszköze online lesz, várjon, vagy ellenőrizze később! különböző átköltöztetés az alkalmazásban/adatbázisban: %s / %s %1$s.]]> @@ -1346,7 +1346,7 @@ Amikor az alkalmazás fut Inkognitóprofilt használ ehhez a csoporthoz – fő profilja megosztásának elkerülése érdekében a meghívók küldése le van tiltva Átvitelelkülönítés - Akkor lesz kapcsolódva, ha a meghívási kérése el lesz fogadva, várjon, vagy ellenőrizze később! + Akkor lesz kapcsolódva, ha a meghívóját a partnere elfogadja, várjon, vagy ellenőrizze később! A hangüzenetek küldése le van tiltva. Alkalmazás akkumulátor-használata / Korlátlan módot az alkalmazás beállításaiban.]]> Biztonságos kvantumbiztos protokollon keresztül. @@ -1380,7 +1380,7 @@ A partnerei engedélyezhetik a teljes üzenet törlését. A jelmondatot minden alkalommal meg kell adnia, amikor az alkalmazás elindul – nem az eszközön van tárolva. Ha engedélyezni szeretné a hordozható eszköz-alkalmazás társítását a számítógéphez, akkor nyissa meg ezt a portot a tűzfalában, miután engedélyezte azt - A profilja, a partnerei és az elküldött üzenetei a saját eszközén vannak tárolva. + A profilja, a partnerei és az elküldött üzenetei az eszközön vannak tárolva. Alkalmazás akkumulátor-használata / Korlátlan módot az alkalmazás beállításaiban.]]> Ez a karakterlánc nem egy meghívási hivatkozás! Új csevegés indításához @@ -1396,7 +1396,7 @@ Nem kötelező üdvözlőüzenettel. Ismeretlen adatbázishiba: %s Elrejtheti vagy lenémíthatja a felhasználóprofiljait – koppintson (vagy számítógép-alkalmazásban kattintson) hosszan a profilra a felugró menühöz. - Inkognitóra váltás kapcsolódáskor. + Inkognitó profil használata kapcsolódáskor ki/be. Megoszthat egy hivatkozást vagy QR-kódot – így bárki csatlakozhat a csoporthoz. Ha a csoportot Ön később törli, akkor nem fogja elveszíteni annak tagjait. Ön csatlakozott ehhez a csoporthoz %1$s nevű csoporthoz!]]> @@ -1404,9 +1404,9 @@ Ön irányítja csevegését! Kód hitelesítése a számítógépen Az időzóna védelmének érdekében a kép-/hangfájlok UTC-t használnak. - A meghívási kérés el lesz küldve ezen csoporttag számára. + A kapcsokatkérés el lesz küldve ezen csoporttag számára. Inkognitóprofil megosztása esetén a rendszer azt a profilt fogja használni azokhoz a csoportokhoz, amelyekbe meghívást kapott. - Már küldött egy meghívási kérést ezen a címen keresztül! + Már küldött egy meghívót ezen a címen keresztül! Megoszthatja ezt a SimpleX-címet a partnereivel, hogy kapcsolatba léphessenek vele: %s. Amikor az emberek meghívót küldenek, Ön elfogadhatja vagy elutasíthatja azokat. Megjelenítendő üzenet beállítása az új tagok számára! @@ -1456,7 +1456,7 @@ Munkamenet kód Köszönet a felhasználóknak a Weblate-en való közreműködésért! Kis csoportok (max. 20 tag) - Az Ön által elfogadott kérelem vissza lesz vonva! + Az Ön által elfogadott kapcsolat vissza lesz vonva! Élő üzenet küldése – az üzenet a címzett(ek) számára valós időben frissül, ahogy Ön beírja az üzenetet A KÉZBESÍTÉSI JELENTÉSEKET A KÖVETKEZŐ CÍMRE KELL KÜLDENI A következő üzenet azonosítója érvénytelen (kisebb vagy egyenlő az előzővel).\nEz valamilyen hiba vagy sérült kapcsolat esetén fordulhat elő. @@ -1481,7 +1481,7 @@ GitHub tárolónkban.]]> Hiba történt a tartalom megjelenítésekor Hiba történt az üzenet megjelenítésekor - Láthatóvá teheti a SimpleXbeli partnerei számára a „Beállításokban”. + Láthatóvá teheti a SimpleXbeli partnerei számára a beállításokban. Legfeljebb az utolsó 100 üzenet lesz elküldve az új tagok számára. A beolvasott QR-kód nem egy SimpleX-hivatkozás. A beillesztett szöveg nem egy SimpleX-hivatkozás. @@ -1494,7 +1494,7 @@ Koppintson ide a hivatkozás beillesztéséhez Partner hozzáadása: új meghívási hivatkozás létrehozásához, vagy egy kapott hivatkozáson keresztül történő kapcsolódáshoz.]]> Csoport létrehozása: új csoport létrehozásához.]]> - A csevegés megállt. Ha már használta ezt az adatbázist egy másik eszközön, úgy visszaállítás szükséges a csevegés elindítása előtt. + A csevegés megállt. Ha ezt az adatbázist már használta egy másik eszközön, akkor a csevegés elindítása előtt vissza kell állítania azt. Az előzmények nem lesznek elküldve az új tagok számára. Újrapróbálkozás A kamera nem elérhető @@ -1695,11 +1695,11 @@ A SimpleX-hivatkozások küldése engedélyezve van. Számukra engedélyezve mentett - elmentve innen: %s + mentve innen: %s Továbbítva innen A címzett(ek) nem látja(k), hogy kitől származik ez az üzenet. Mentett - Elmentve innen + Mentve innen Letöltés Továbbítás Továbbított @@ -1767,7 +1767,7 @@ Jó napot! Jó reggelt! Speciális beállítások - Alkalmazás erre + Használat ehhez Csevegés színei Csevegés témája Kitöltés @@ -1786,7 +1786,7 @@ Háttérkép kiemelőszíne Háttérkép háttérszíne További kiemelőszín 2 - Alkalmazás téma + Alkalmazás témája Perzsa kezelőfelület Védje az IP-címét a partnerei által kiválasztott üzenetváltási továbbítókiszolgálókkal szemben.\nEngedélyezze a *Hálózat és kiszolgálók* menüben. Ismeretlen kiszolgálókról származó fájlok megerősítése. @@ -1877,7 +1877,7 @@ Feltöltési hibák Visszaigazolt Visszaigazolási hibák - próbálkozások + kísérletek Törölt töredékek Összes profil Feltöltött töredékek @@ -1964,7 +1964,7 @@ Beszélgetés megtartása Biztosan törli a partnert? kapcsolódás - Könnyen elérhető alkalmazás-eszköztárak + Könnyen elérhető eszköztárak Törlés értesítés nélkül Beállítások keresés @@ -1991,7 +1991,7 @@ Média- és fájlkiszolgálók Legfeljebb 20 üzenet egyszerre való törlése. Védi az IP-címét és a kapcsolatait. - Könnyen elérhető eszköztár + Könnyen elérhető csevegési eszköztár Üzenetkiszolgálók SOCKS proxy Néhány fájl nem lett exportálva @@ -2000,14 +2000,14 @@ Használja az alkalmazást egy kézzel. A partnerek archiválása a későbbi csevegéshez. TCP-kapcsolat - Az exportált archívumot elmentheti. + Mentheti az exportált archívumot. Tippek visszaállítása - Csevegési lista átváltása: + Csevegési lista ki/be: Ezt a „Megjelenés” menüben módosíthatja. Új médiabeállítások Lejátszás a csevegési listából. Elhomályosítás a jobb adatvédelemért. - Automatikus alkalmazás-frissítés + Automatikus alkalmazásfrissítés Létrehozás Új verziók letöltése a GitHubról. Betűméret növelése. @@ -2025,16 +2025,16 @@ Profil megosztása Rendszerbeállítások használata Csevegési profil kijelölése - Ne használja a hitelesítőadatokat proxyval. - Különböző proxy-hitelesítőadatok használata az összes profilhoz. - Különböző proxy-hitelesítőadatok használata az összes kapcsolathoz. + Ne használja a hitelesítési adatokat proxyval. + Különböző proxy-hitelesítési adatok használata az összes profilhoz. + Különböző proxy-hitelesítési adatok használata az összes kapcsolathoz. Jelszó Felhasználónév - A hitelesítőadatai titkosítatlanul is elküldhetők. + A hitelesítési adatai titkosítatlanul is elküldhetők. Hiba történt a proxy mentésekor Győződjön meg arról, hogy a proxy konfigurációja helyes. Proxyhitelesítés - Véletlenszerű hitelesítőadatok használata + Véletlenszerű hitelesítési adatok használata %1$d egyéb fájlhiba. Nincs mit továbbítani! %1$d fájl letöltése még folyamatban van. @@ -2057,9 +2057,9 @@ Üzenetbuborék alakja Farok Kiszolgáló - Minden alkalommal, amikor elindítja az alkalmazást, új SOCKS-hitelesítő-adatokat fog használni. + Minden alkalommal, amikor elindítja az alkalmazást, új SOCKS-hitelesítési adatokat fog használni. Alkalmazás munkamenete - Az összes kiszolgálóhoz új, SOCKS-hitelesítő-adatok legyenek használva. + Az összes kiszolgálóhoz új, SOCKS-hitelesítési adatok lesznek használva. Kattintson a címmező melletti info gombra a mikrofon használatának engedélyezéséhez. Nyissa meg a Safari Beállítások / Weboldalak / Mikrofon menüt, majd válassza a helyi kiszolgálók engedélyezése lehetőséget. Hívások kezdeményezéséhez engedélyezze a mikrofon használatát. Fejezze be a hívást, és próbálja meg a hívást újra. @@ -2072,7 +2072,7 @@ Hang/Videó váltása hívás közben. Csevegési profilváltás az egyszer használható meghívókhoz. Továbbfejlesztett biztonság ✅ - A SimpleX-protokollokat a Trail of Bits auditálta. + A SimpleX protokollokat a Trail of Bits auditálta. Hiba történt a kiszolgálók mentésekor Nincsenek üzenetkiszolgálók. Nincsenek üzenetfogadási kiszolgálók. @@ -2150,7 +2150,7 @@ Feltételek megnyitása Módosítások megtekintése Hiba történt a kiszolgáló frissítésekor - A kiszolgáló-protokoll módosult. + A kiszolgálóprotokoll módosult. A kiszolgáló üzemeltetője módosult. Kiszolgáló-üzemeltető Kiszolgáló hozzáadva a következő üzemeltetőhöz: %s. @@ -2160,7 +2160,7 @@ Hálózati decentralizáció A második előre beállított üzemeltető az alkalmazásban! A Flux kiszolgálókat engedélyezheti a beállításokban, a „Hálózat és kiszolgálók” menüben, a metaadatok jobb védelme érdekében. - Alkalmazás-eszköztárak + Eszköztárak a metaadatok jobb védelme érdekében. Javított csevegési navigáció - Csevegés megnyitása az első olvasatlan üzenetnél.\n- Ugrás az idézett üzenetekre. @@ -2205,7 +2205,7 @@ A tagok közötti közvetlen üzenetek le vannak tiltva ebben a csevegésben. Amikor egynél több üzemeltető van engedélyezve, akkor egyik sem rendelkezik olyan metaadatokkal, amelyekből megtudható, hogy ki kivel kommunikál. elfogadott meghívó - Függőben lévő meghívási kérelem + Függőben lévő meghívó Az üzemeltetőkről A SimpleX Chat és a Flux megállapodást kötött arról, hogy a Flux által üzemeltetett kiszolgálókat beépítik az alkalmazásba. A titkosítás újraegyeztetése folyamatban van. @@ -2291,7 +2291,7 @@ Az ebben a csevegésben lévő üzenetek soha nem lesznek törölve. 1 év alapértelmezett (%s) - Csevegési üzenetek törlése a saját eszközéről. + Csevegési üzenetek törlése az eszközről. Módosítja az automatikus üzenettörlést? Ez a művelet nem vonható vissza – a kijelölt üzenettől korábban küldött és fogadott üzenetek törölve lesznek a csevegésből. A következő TCP-port használata, amikor nincs port megadva: %1$s. @@ -2378,10 +2378,10 @@ Új tag szeretne csatlakozni a csoporthoz. kikapcsolva Befogadás megfigyelőként - Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérelmét. + Várja meg, amíg a csoport moderátorai áttekintik a csoporthoz való csatlakozási kérését. befogadta Önt Tagbefogadás beállítása - Elmenti a befogadási beállításokat? + Menti a befogadási beállításokat? Ön befogadta ezt a tagot Befogadás tagként befogadta őt: %1$s @@ -2390,7 +2390,7 @@ partner letiltva csoport törölve eltávolítva a csoportból - csatlakozási kérelem elutasítva + csatlakozási kérés elutasítva Ön elhagyta a csoportot a tag régi verziót használ Hiba a taggal való csevegés törlésekor @@ -2403,4 +2403,37 @@ Elutasítás Elutasítja a tagot? Rövid hivatkozás hozzáadása + Csevegés megnyitása + Új csevegés megnyitása + Új csoport megnyitása + végpontok közötti titkosítással vannak védve.]]> + Hiba történt a meghívó elutasításakor + Hiba a kapcsolat előkészítésekor + Hiba a csoport előkészítésekor + Hiba a partner módosításakor + Hiba a csoportfelhasználó módosításakor + Megnyitás a csatlakozáshoz + Megnyitás a kapcsolódáshoz + Megnyitás az elfogadáshoz + a partnernek el kell fogadnia… + Csatlakozás a csoporthoz + Üzenet hozzáadása + Kapcsolódás + Elküldi a meghívót? + miután a kérését elfogadták.]]> + Kérés küldése üzenet nélkül + Kérés küldése + kérés elküldve + Meghívó elfogadása + Meghívó elutasítása + A feladó NEM lesz értesítve. + Saját profil + Elküldés a partnernek a kapcsolódást követően. + Üdvözlőüzenet + Profil megosztása hivatkozáson keresztül + A profil meg lesz osztva a címhivatkozáson keresztül. + Profil megosztása + Csoportprofil megosztása hivatkozáson keresztül + Nem lehet módosítani a profilt + Másik profil használatához a kapcsolatfelvételi kísérlet után törölje a csevegést, és használja újra a hivatkozást. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml index e29b4fa3e8..f3ff19b293 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml @@ -71,7 +71,7 @@ Errore di eliminazione del gruppo Errore di eliminazione della richiesta di contatto Errore di eliminazione della connessione del contatto in attesa - Errore di modifica dell\'indirizzo + Errore cambiando l\'indirizzo Test fallito al passo %s. Il server richiede l\'autorizzazione di creare code, controlla la password Connetti @@ -146,8 +146,8 @@ Benvenuto/a! Questo testo è disponibile nelle impostazioni Сhat - sei stato invitato in un gruppo - entra come %s + Sei stato/a invitato/a in un gruppo + Entra come %s in connessione… Tocca per iniziare una conversazione Scrivi agli sviluppatori @@ -513,7 +513,7 @@ Attivare l\'eliminazione automatica dei messaggi\? Crittografare il database\? Crittografare - Errore nella modifica dell\'impostazione + Errore cambiando l\'impostazione Errore nella crittografia del database Le tue impostazioni Verrai connesso/a al gruppo quando il dispositivo dell\'host del gruppo sarà in linea, attendi o controlla più tardi! @@ -1115,7 +1115,7 @@ Ciao! \nConnettiti a me tramite SimpleX Chat: %s Invita amici - Salva le impostazioni di accettazione automatica + Salva le impostazioni dell\'indirizzo SimpleX Puoi crearlo più tardi Condividi indirizzo Inserisci il messaggio di benvenuto… @@ -1379,7 +1379,7 @@ Apri Errore di creazione del contatto Invia messaggio diretto per connetterti - invia messaggio diretto + invia per connettere si è connesso/a direttamente Espandi Ripetere la richiesta di connessione? @@ -2439,4 +2439,37 @@ Elimina chat Errore di eliminazione della chat con il membro Aggiungi link breve + Accetta la richiesta di contatto + Aggiungi un messaggio + crittografia end-to-end.]]> + solo dopo che la tua richiesta verrà accettata.]]> + Connetti + il contatto dovrebbe accettare… + Errore cambiando il contatto + Errore cambiando l\'utente del gruppo + Errore di preparazione del contatto + Errore di preparazione del gruppo + Errore nel rifiuto della richiesta di contatto + Entra nel gruppo + Apri la chat + Apri una chat nuova + Apri un gruppo nuovo + Apri per accettare + Apri per connettere + Apri per entrare + Il profilo verrà condiviso tramite il link dell\'indirizzo. + Rifiuta la richiesta di contatto + richiesta inviata + Inviare una richiesta di contatto? + Invia richiesta + Invia richiesta senza messaggio + Inviato al tuo contatto dopo la connessione. + Condividi il profilo del gruppo via link + Condividi il profilo + Condividi il profilo via link + Il mittente NON verrà avvisato. + Messaggio di benvenuto + Il tuo profilo + Impossibile cambiare profilo + Per usare un altro profilo dopo il tentativo di connessione, elimina la chat e usa di nuovo il link. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml index 1103e3a0e6..760bc3cc17 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml @@ -559,10 +559,7 @@ מחיקת הודעות בלתי הפיכה אסורה. להצטרף בתור %s זה מאפשר חיבורים אנונימיים רבים ללא שום נתונים משותפים ביניהם בפרופיל צ׳אט יחיד. - זה יכול לקרות כאשר: -\n1. פג תוקפן של ההודעות בלקוח השולח לאחר 2 ימים או בשרת לאחר 30 ימים. -\n2. פיענוח הצפנת הודעה נכשל, מכיוון שאתם או איש הקשר שלכם השתמשתם בגיבוי ישן של מסד הנתונים. -\n3. החיבור נפגע. + זה יכול לקרות כאשר:\n1. פג תוקפן של ההודעות בלקוח השולח לאחר 2 ימים או בשרת לאחר 30 ימים.\n2. פיענוח הצפנת הודעה נכשל, מכיוון שאתם או איש הקשר שלכם השתמשתם בגיבוי ישן של מסד הנתונים.\n3. החיבור נפגע. איך זה משפיע על הסוללה זה יכול לקרות כאשר אתם או איש הקשר שלכם השתמשתם בגיבוי ישן של מסד הנתונים. להצטרף לקבוצה\? @@ -1088,7 +1085,7 @@ בטל השתקה ממתין לאישור… ממתין למענה… - איננו מאחסנים אף אחד מאנשי הקשר או ההודעות שלך (לאחר המסירה) בשרתים. + איננו מאחסנים את אנשי הקשר או ההודעות שלך (לאחר המסירה) בשרתים. SimpleX אתם באמצעות קישור לכתובת איש קשר @@ -1189,8 +1186,7 @@ אנשי הקשר שלך יכולים לאפשר מחיקת הודעות מלאה. הצ׳אטים איש הקשר שלך שלח קובץ גדול יותר מהגודל המרבי הנתמך כעת (%1$s). - איש הקשר שלך צריך להיות מקוון כדי שהחיבור יושלם. -\nניתן לבטל חיבור זה ולהסיר את איש הקשר (ולנסות מאוחר יותר עם קישור חדש). + איש הקשר שלך צריך להיות מקוון כדי שהחיבור יושלם.\nניתן לבטל חיבור זה ולהסיר את איש הקשר (ולנסות מאוחר יותר עם קישור חדש). פרופיל הצ׳אט שלך יישלח \nלאיש הקשר שלך מסד הנתונים שלך @@ -1222,8 +1218,7 @@ לא תאבדו את אנשי הקשר שלכם אם תמחקו מאוחר יותר את הכתובת שלכם. כתובת SimpleX שלך שרתי SMP שלך - הפרופיל שלך מאוחסן במכשירך ומשותף רק עם אנשי הקשר שלך. -\nשרתי SimpleX אינם יכולים לראות את הפרופיל שלך. + הפרופיל שלך מאוחסן במכשירך ומשותף רק עם אנשי הקשר שלך.\nשרתי SimpleX אינם יכולים לראות את הפרופיל שלך. הפרופיל, אנשי הקשר וההודעות שנמסרו מאוחסנים במכשיר שלך. אתם תפסיקו לקבל הודעות מקבוצה זו. היסטוריית הצ׳אט תישמר. הינך מנסה להזמין איש קשר איתו שיתפת פרופיל זהות נסתרת לקבוצה בה ישנו שימוש בפרופיל הראשי שלך @@ -1360,8 +1355,7 @@ אפליקציה חדשה למחשב השולחני! 6 שפות ממשק חדשות האפליקציה מצפינה קבצים מקומיים חדשים (למעט סרטונים). - ביטוי סיסמה אקראי מאוחסן בהגדרות כטקסט רגיל. -\nאתה יכול לשנות את זה מאוחר יותר. + ביטוי סיסמה אקראי מאוחסן בהגדרות כטקסט רגיל.\nאתה יכול לשנות את זה מאוחר יותר. שלח הודעה ישירה כדי להתחבר גלה והצטרף לקבוצות ביטוי הסיסמה להצפנת מסד הנתונים יעודכן ויישמר בהגדרות. @@ -1703,7 +1697,7 @@ מתי שהIP מוסתר השתמש במסלול פרטי עם שרתים לא ידועים אזהרה על אופן שליחת ההודעה - הראה סטטוס הודעה + הצג מצב הודעה מסלול פרטי להודעה 🚀 סטטוס הודעה:%s אנא וודא שהמכשיר והמחשב מחוברים לאותה רשת מקומית, ושהפיירוול של המחשב מאפשר את החיבור. @@ -1742,7 +1736,7 @@ אוזניות ערכת נושא לפרופיל צבעי הצא\'ט - הראה רשימת צא\'טים בחלון חדש + הצג רשימת שיחות בחלון חדש מצב הקובץ סטטוס הודעה מצב הקובץ:%s @@ -1766,7 +1760,7 @@ הגדרות מתקדמות הגדר ערכת נושא ברירת מחדל אפס ערכת נושא למשתמש - החל ל + החל על ערכת נושא משתמשים יכולים לשלוח קישורי SimpleXצ עשה שהצאט\'ים שלך יראו אחרת! @@ -1785,7 +1779,7 @@ ערכת נושא צבעי מצב כהה שגיאה בשרת היעד:%1$s - "אל תשלח הודעות ישירות אפילו אם שרת היעד לא תומך במסלול פרטי" + אל תשלח הודעות ישירות אפילו אם שרת היעד לא תומך במסלול פרטי שיפור בשליחת הודעות מצלמה אפשר שליחת קישורי SimpleX @@ -1828,7 +1822,7 @@ אין עדיין חיבור ישיר, ההודעה תעובר ע"י מנהל. חבר לא פעיל שרתי XFTP אחרים - הראה אחוזים + הצג אחוזים מושבת יציבה הותקן בהצלחה @@ -1924,7 +1918,7 @@ %1$d הקבצים עדיין בהורדה. הסכם לתנאים %1$d ההורדה של הקובץ/ים עדיין לא הסתיימה. - התנאים המקובלים עלי + התנאים שקיבלתי שנה סיבה אחרת כתובת עסקית @@ -2091,4 +2085,53 @@ איש הקשר יימחק - לא ניתן לבטל זאת! איש הקשר נמחק. ספאם + ניתן לשנות זאת בהגדרות המראה. + אין שרתי הודעות. + חיבור נחסם + ממתין לאישור + ממתין + סרגל כלים נגיש לצ\'אט + שימוש בפורט אינטרנט + לשליחה + צ\'אט אחד עם חבר + הודעה חדשה + הגדרת מפעילי שרת + ניתן להגדיר שרתים דרך הגדרות. + אישר אותך + ממתין לסקירה + אשר + אישור חבר + הוסף קישור קצר + קצוות + צורת ההודעה + סקירה + ממתין + אין צ\'אטים ברשימה %s. + שמור רשימה + גרסת השרת אינה תואמת לאפליקציה שלך: %1$s. + סרגלי כלים נגישים לאפליקציות + כל + דחיה + אשר כחבר + לדחות את החבר? + החבר יצטרף לקבוצה, לקבל אותו? + קבל כצופה + שימוש באפליקציה ביד אחת. + החל מ-%s.\nכל הנתונים נשמרים פרטיים במכשיר שלך. + כל השרתים + צ\'אטים פרטיים, קבוצות ואנשי הקשר שלך אינם נגישים למפעילי השרת. + לדוגמה, אם איש הקשר שלך מקבל הודעות דרך שרת SimpleX Chat, האפליקציה שלך תעביר אותן דרך שרת Flux. + מדיניות פרטיות ותנאי שימוש. + ניתן להגדיר מפעילים בהגדרות רשת ושרתים. + לא + זנב לבועה + סרגל כלים נגיש לצ\'אט + %1$s אושר + חבר חדש רוצה להצטרף לקבוצה. + אנא המתן עד שמנהלי הקבוצה יבדקו את בקשתך להצטרף לקבוצה. + שימוש בהודעות + צורת הודעה הניתנת להתאמה אישית. + שמור וחבר מחדש + שקיפות + אנא בדוק שקישור SimpleX תקין. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml index abb9f8e473..dc15648e64 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ja/strings.xml @@ -1989,7 +1989,7 @@ リストを作成 サーバオペレータ 利用条件を開く - バックグラウンドサービスを使用しない + バックグラウンドサービスを使用しません 利用条件の承諾 %s の利用条件に承諾しています。]]> 後で作成する場合はメニューから「SimpleXのアドレスを作成」を選択してください。 @@ -2012,4 +2012,10 @@ グループのパフォーマンス向上 選択 プライバシーとセキュリティの向上 + 承諾 + プライバシーポリシーと利用条件 + サーバオペレータの設定 + 承諾 + サーバオペレータは、プライベートチャット・グループ・連絡先にはアクセスできません。 + SimpleX Chat を利用することで、以下の事項に同意したものと見なされます:\n- パブリックグループでは合法なコンテンツのみを送信すること。\n- 他のユーザを尊重すること、またスパムメッセージを送信しないこと。 diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml index dc692c1968..d21b8b8f83 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ml/strings.xml @@ -416,4 +416,4 @@ %s വാഗ്ദാനം ചെയ്തു തിരയുക ഓഫാണ് - \ No newline at end of file + diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml index 5102c98563..a7862ffcf1 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pl/strings.xml @@ -641,7 +641,7 @@ Zaproszenie do grupy wygasło zaktualizowano profil grupy zaproszony przez Twój link grupy - zaproszony %1$s + zaprosił %1$s opuścił opuścił członek @@ -1878,7 +1878,7 @@ Połączony Bieżący profil Otrzymane wiadomości - Odebranie wiadomości + Odbiór wiadomości Błąd resetowania statystyk duplikaty Zakończono @@ -2166,7 +2166,7 @@ Treść narusza warunki użytkowania Połączenie zablokowane Połączenie jest zablokowane przez operatora serwera:\n%1$s. - Lista zmian + Zmień listę Utwórz listę Usuń Nie można załadować tekstu aktualnych warunków, możesz przejrzeć warunki za pomocą tego linku: @@ -2184,4 +2184,9 @@ Warunki będą akceptowane dla operatorów włączonych po 30 dniach. Zmień kolejność Połączenie wymaga renegocjacji szyfrowania. + przyjął %1$s + przyjął cię + Nowy członek chce dołączyć do grupy. + 1 rok + Akceptuj diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml index 0c82bc4a33..285d6f3802 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pt-rBR/strings.xml @@ -2268,7 +2268,7 @@ Aprimorada a navegação de bate-papo - Abra o chat na primeira mensagem não lida.\n- Pule para mensagens citadas. Os membros serão removidos do chat. Essa ação não pode ser desfeita! - Said do chat + Sair do chat Os membros serão removidos do grupo. Essa ação não pode ser desfeita! Nove servidor Nenhum chat encontrado @@ -2382,4 +2382,16 @@ Aceitar Ao usar o SimpleX Chat, você concorda em:\n- enviar apenas conteúdo legal em grupos públicos.\n- respeitar outros usuários – sem spam. Política de privacidade e condições de uso. + Aceitar como membro + Adicionar link curto + 1 conversa com um membro + Todos servidores + %1$s aceito + aceitou você + Aceitar + não pode enviar mensagens + Aceitar como observador + Aceitar membro + todos + Conversas com membros diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml index 544ee8af89..5d113ecb46 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/pt/strings.xml @@ -971,4 +971,8 @@ Todos os perfis Já conectando! Já entrando no grupo! + %1$d arquivo(s) falharam o download. + %1$d erro(s) no arquivo:\n%2$s + %1$d arquivo(s) estão sendo baixados. + %1$d arquivo(s) foram deletados. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml index da12b51839..eeaf778d44 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ro/strings.xml @@ -1,68 +1,68 @@ %1$d mesaje moderate de %2$s - Întrerupi schimbarea adresei? + Anulezi schimbarea adresei? 30 secunde Acceptă Acceptă incognito Adaugă server - Reglări avansate de rețea - %1$s dorește să se conecteze cu tine prin + Setări avansate de rețea + %1$s dorește să se conecteze cu dvs. prin Acceptă %1$d mesaje omise. 1 lună 1 săptămână administrator - Accent adițional - Adițional secundar + Accent suplimentar + Suplimentar secundar Acceptă 6 limbi noi pentru interfață - %1$d mesaje nu au putut fi descifrate. + %1$d mesaje nu au putut fi decriptate. %1$d mesaj(e) omis(e) %1$s MEMBRI 1 zi 1 minut - link de unică folosință + Link unic 5 minute Despre SimpleX Despre adresa SimpleX Despre SimpleX Chat - deasupra, apoi: + mai sus, apoi: Accent Acceptă - Accepți cererea de conexiune? + Accepți cererea de conectare? Adaugă contact apel acceptat - Adaugă servere prestabilite + Adaugă servere presetate Adaugă profil Adresă - Adaugă servere prin scanare de coduri QR. - Adaugă la un alt dispozitiv - Adaugă mesaj de întâmpinare - se acceptă cifrarea… - se acceptă cifrarea pentru %s… - Administratorii pot crea linkuri de participare la grupuri. - Câteva lucruri în plus + Adaugă servere prin scanarea codurilor QR. + Adaugă pe alt dispozitiv + Adaugă mesaj de bun venit + se agreează criptarea… + se agreează criptarea pentru %s… + Administratorii pot crea linkurile pentru a se alătura grupurilor. + Încă câteva lucruri Toate datele aplicației sunt șterse. - Schimbarea de adresă va fi întreruptă. Se va folosi vechea adresa de primire. - Adaugă adresa la profil, astfel încât contactele să o poată partaja cu alte persoane. Profilul reînoit va fi comunicat contactelor. - Accesezi serverele prin proxy SOCKS cu portul %d? Proxyul trebuie pornit înaintea activării acestei opțiuni. - Întrerupe schimbarea adresei - Întrerupe - Toate conversațiile și mesajele vor fi șterse - operațiunea este definitivă! - Toate mesajele vor fi șterse - acest lucru nu poate fi anulat! + Schimbarea adresei va fi anulată. Vechea adresă de primire va fi folosită. + Adaugă adresa în profilul dvs., astfel încât contactele dvs. să o poată partaja cu alte persoane. Actualizarea profilului va fi trimisă contactelor dvs. + Accesați serverele via proxy SOCKS pe portul %d? Proxy-ul trebuie pornit înainte de a activa această opțiune. + Anulează schimbarea adresei + Anulează + Toate conversațiile și mesajele vor fi șterse – această acțiune nu poate fi anulată! + Toate mesajele vor fi șterse - această acțiune nu poate fi anulată! Permite reacții la mesaje doar dacă și contactul tău le permite. Permite ștergerea ireversibilă a mesajelor trimise. (24 ore) Permite trimiterea de fișiere și media. - Toate datele sunt șterse când este introdusă. + Toate datele sunt șterse la introducerea lor. Toți membrii grupului vor rămâne conectați. - Toate mesajele vor fi șterse - operațiunea este definitivă! Mesajele vor fi șterse DOAR pentru tine. + Toate mesajele vor fi șterse - această acțiune nu poate fi anulată! Mesajele vor fi șterse NUMAI pentru dvs. Toate mesajele noi de la %s vor fi ascunse! Permite Permite Permite apeluri doar dacă le permite contactul tău. - Permiți mesaje vocale? - Permite mesajele vocale numai dacă le permite și contactul tău. + Permiteți mesaje vocale? + Permiteți mesaje vocale doar dacă contactul dvs. le permite. Permite ștergerea mesajelor ireversibile doar dacă și contactul tău îți permite ție. (24 ore) Permite reacții la mesaje. Permite trimiterea de mesaje directe membrilor. @@ -88,32 +88,32 @@ Camera și microfon Atenție: arhiva va fi ștearsă.]]> Anulează previzualizarea fișierului - Un profil de conversație gol cu numele furnizat este creat, și aplicația se deschide ca de obicei. + Un profil de chat gol cu numele furnizat este creat, iar aplicația se deschide ca de obicei. Se conectează deja! Aplicația poate primi notificări doar când rulează, niciun serviciu în fundal nu va fi lansat. Se alătură deja grupului! Mereu pornit Un nou profil aleatoriu va fi distribuit. - Android Keystore este folosit pentru a stoca în siguranță fraza de acces - permite serviciului de notificare să funcționeze. + Android Keystore este utilizat pentru a stoca în siguranță fraza de acces – acest lucru permite funcționarea serviciului de notificare. și %d alte evenimente Răspunde la apel - Android Keystore va fi folosit pentru a stoca în siguranță fraza de acces după ce repornești aplicația sau schimbi fraza de acces - va permite primirea notificărilor. + Android Keystore va fi utilizat pentru a stoca în siguranță fraza de acces după ce reporniți aplicația sau schimbați fraza de acces – acest lucru va permite primirea notificărilor. APLICAȚIE Creează grup Apeluri audio și video Arhivează și încarcă Bază de date de arhivare Se creează un link de arhivare - Creează un link de invitație unic. + Creează link de invitație de unică folosință Acceptă automat imagini Apel audio - Apel audio + apel audio Audio oprit PICTOGRAMĂ APLICAȚIE Cod de acces aplicație Creează grup secret Creează coadă - Serviciul în fundal rulează mereu - notificările vor fi afișate imediat ce sunt disponibile. + Serviciul de fundal rulează permanent – notificările vor fi afișate imediat ce mesajele sunt disponibile. Autentificare Autentificare eșuată Codul de acces actual @@ -121,15 +121,14 @@ Atașează Înapoi Creează grup secret - Se creează link… - apel audio (necifrat e2e) + Se creează linkul… + apel audio (necriptat e2e) Creează fișier Adaugă contact: pentru a crea un nou link de invitare, sau a te conecta printr-un link pe care l-ai primit.]]> Autentificare anulată Cod de acces aplicație este înlocuit cu cod de acces de autodistrugere. Apeluri audio/video - " -\nDisponibil în v5.1" + \nDisponibil în v5.1 Cod de acces aplicație Migrare date aplicație Eroare critică @@ -139,13 +138,13 @@ Acceptă automat cererile de contactare personalizat În prezent dimensiunea maximă pentru fișiere este %1$s. - Creează o adresă SimpleX + Creează adresă SimpleX Acceptare automată Creează-ți profilul Apeluri audio și video Audio pornit Frază de acces actuală… - Creează link pentru grup + Creează link de grup Creează link creator Fundal @@ -171,10 +170,10 @@ Elimină Elimină membru Eliminați membrul? - Resetați la valorile implicite + Resetează la valorile implicite Resetați culoarea Resetați culorile - Elimină imagine + Elimină imaginea Repetă încărcarea apel respins Eliminați fraza de acces din Keystore? @@ -235,7 +234,7 @@ Repetă Trimiteți previzualizări de linkuri Setați frază de acces - Distribuie adresă + Partajează adresă Trimis la Secundar Mesaj trimis @@ -245,53 +244,53 @@ Versiunea serverului este incompatibilă cu setările de rețea. Trimitere prin trimiterea de fișiere nu este încă acceptată - Scanați codul de securitate din aplicația persoanei de contact. + Scanați codul de securitate din aplicația contactului dvs. Selectați contactele Autodistrugere Răspuns trimis - Distribuie media… - Distribuie mesaj… - Arată lista conversațiilor într-o fereastră nouă - Arată consola într-o fereastră nouă - Configurați fraza de acces la baza de date + Partajează media… + Partajează mesaj… + Afișează lista de chat în fereastră nouă + Afișează consola în fereastră nouă + Configurați fraza de acces a bazei de date Setați parola bazei de date setați adresă de contact nouă %s (actual) Codul sesiunii Expeditorul a anulat transferul de fișiere. Serverul necesită autorizare pentru a crea cozi, verificați parola - Distribuie + Partajează trimitere eșuată - Căutați sau lipiți linkul SimpleX - Setați numele contactului + Căută sau lipește linkul SimpleX + Setează numele contactului Salvați mesajul de bun venit? Evaluarea securității - Scanați codul QR de pe desktop + Scanează codul QR de pe desktop Caută Trimiteți un mesaj live - acesta se va actualiza pentru destinatar(i) pe măsură ce îl tastați - Distribuie link + Partajează link Trimiteți până la 100 de mesaje recente noilor membri. Bara de căutare acceptă linkuri de invitație. secunde - Scanare de pe mobil + Scanează de pe mobil Mesaj trimis - Scanați codul QR + Scanează cod QR Trimite Trimiteți întrebări și idei - Arată opțiuni dezvoltator + Afișează opțiunile pentru dezvoltatori sec Mesajele trimise vor fi șterse după ora setată. Serverul necesită autorizare pentru încărcare, verificați parola - Arată contact și mesaje - Distribuie fișier… - Setați numele contactului… + Afișează contactul și mesajul + Partajează fișier… + Nume contact… Trimite mesaj Trimiteți un mesaj care dispare - (scanați sau lipiți din clipboard) - Arată codul QR + (scanează sau lipește din clipboard) + Afișează codul QR Testul serverului a eșuat! - Arată: - Afișați erorile interne + Afișează: + Afișează erorile interne secret SETĂRI %s conectat @@ -301,28 +300,28 @@ Trimiteți mesaj live %s descărcat Partajați adresa cu contactele? - Arată previzualizarea + Afișează previzualizare trimiteți un mesaj direct Trimiteți mesaj direct pentru a vă conecta Selectați Trimiterea fișierului va fi oprită. Trimite Setări - Scanați codul + Scanează codul Cod de securitate Trimiteți-ne un e-mail Scanați codul QR al serverului - Distribuie persoanelor de contact - Arată + Partajează cu contactele + Afișează codul de securitate a fost schimbat - Arată ultimul mesaj + Afișează ultimele mesaje Trimiteți un mesaj direct Setați tema implicită SimpleX SimpleX nu poate rula în fundal. Vei primi notificări doar atunci când aplicația rulează. - Serviciu SimpleX Chat + Serviciul SimpleX Chat Adresă SimpleX - Închide + Oprește Link-uri SimpleX Link-urile SimpleX sunt interzise. Securitatea chatului SimpleX a fost auditată de Trail of Bits. @@ -332,11 +331,11 @@ simplexmq: v%s (%2s) Link-uri SimpleX nepermise Echipa SimpleX - Oprire? + Opriți? Adresă de contact SimpleX Link pentru grup SimpleX Link-uri SimpleX - Invitație unică SimpleX + Invitație de unică folosință SimpleX Logo SimpleX Grupuri mici (max 20) Mod incognito simplificat @@ -369,12 +368,12 @@ pornire… %s secundă(e) Începi conversația? - Reglări avansate - Adresă desktop rea - ID de mesaj incorect - Hash de mesaj incorect - ID de mesaj incorect - Hash de mesaj incorect + Setări avansate + Adresă desktop incorectă + ID mesaj incorect + hash mesaj incorect + ID mesaj incorect + Hash mesaj incorect Schimbă adresa de primire Conversația este oprită. Dacă ai folosit deja această bază de date pe alt dispozitiv, ar trebui să o transferi înapoi înainte de a porni conversația. APELURI @@ -385,9 +384,9 @@ se schimbă adresa… Contact verificat Creat la - Migrează de pe alt dispozitiv pe dispozitivul nou și scanează codul QR.]]> + Migrează de pe alt dispozitiv pe noul dispozitiv și scanați codul QR.]]> Te conectezi prin adresa de contact? - Te conectezi printr-un link unic? + Doriți să vă conectați printr-un link de unică folosință? Conectare incognito Contactul deja există Schimbă codul de acces @@ -400,18 +399,18 @@ Schimbă Schimbă rolul Contactul permite - Grupuri mai bune + Grupuri îmbunătățite Desktop conectat Preferințe contact Te conectezi cu %1$s? Anulează previzualizarea imaginii Discută cu dezvoltatorii - Trebuie să introduceți o frază de acces de fiecare dată când pornește aplicația - nu este stocată pe dispozitiv. + Trebuie să introduceți fraza de acces de fiecare dată când porniți aplicația – aceasta nu este stocată pe dispozitiv. blocat Preferințe conversație Mod întunecat Interfață chineză și spaniolă - Crează un grup folosind un profil aleatoriu. + Creează un grup folosind un profil aleatoriu. Blochează membrii grupului Mobil conectat Conectat la desktop @@ -423,20 +422,20 @@ Conectare prin link Puteți vedea din nou linkul de invitație în detaliile conexiunii. Profilurile tale de chat - Crează profil de conversație - apel terminat %1$s - Crează + Creează profil de chat + apel încheiat %1$s + Creează Bluetooth Camera Apeluri pe ecranul blocat: - contactul are cifrare e2e - contactul nu are cifrare e2e + contactul are criptare e2e + contactul nu are criptare e2e Contacte - DISCUȚII + CONVERSAȚII BAZĂ DE DATE CONVERSAȚIE Baza de date a conversației ștearsă Conversația rulează - Baza ta de date a conversațiilor + Baza dvs. de date a chatului Baza de date a conversațiilor tale nu este criptată - setează o parolă pentru a o proteja. Parola pentru criptarea bazei de date va fi actualizată și stocată în setări. ați schimbat rolul %s în %s @@ -451,7 +450,7 @@ Profilul tău de chat va fi trimis membrilor grupului Întunecat Culori mod întunecat - Și tu și contactul tău puteți face apeluri. + Atât dvs., cât și contactul dvs. puteți efectua apeluri. %s anulat Conectat la mobil Eroare copiere @@ -464,16 +463,16 @@ Parola pentru criptarea bazei de date va fi actualizată. Contactele tale pot permite ștergerea totală a mesajelor. Trebuie să îi permiți contactului tău să trimită mesaje vocale pentru a le putea trimite. - Versiunede bază: v%s + Versiunea de bază: v%s Creează o adresă pentru a permite oamenilor să se conecteze cu tine. %s blocat ați schimbat adresa ați schimbat adresa pentru %s se schimbă adresa… se schimbă adresa pentru %s… - Și tu și contactul tău puteți trimite mesaje temporare. + Atât dvs., cât și contactul dvs. puteți trimite mesaje autodistructive. Nu se pot primi fișiere - Poate fi dezactivat din reglări – notificările vor fi afișate dacă aplicația este în funcțiune.]]> + Poate fi dezactivat din setări – notificările vor fi afișate dacă aplicația este în funcțiune.]]> Verifică mesajele noi la fiecare 10 minute timp de până la 1 minut Nu aveți conversații Contactul și toate mesajele vor fi șterse - acest lucru nu poate fi anulat! @@ -494,28 +493,28 @@ Continuă apel în curs Apel în curs - Și tu și contactul tău puteți trimite mesaje vocale. + Atât dvs., cât și contactul dvs. puteți trimite mesaje vocale. Contact ascuns: Nume contact - Crează adresă + Creează adresă Bază de date criptată! - Schimbi fraza de acces a bazei de date? + Schimbați fraza de acces a bazei de date? Conversația este oprită Puteți porni discuția din Setările aplicației / Baza de date sau repornind aplicația. ați ieșit - Blochezi membrul? + Blocați membrul? Blocat de admin - Și tu și contactul tău puteți adăuga reacții la mesaje. - Mesaje mai bune + Atât dvs., cât și contactul dvs. puteți adăuga reacții la mesaje. + Mesaje îmbunătățite blocat blocat de admin Nu se poate inițializa baza de date Contactul tău a trimis un fișier care este mai mare decât dimensiunea maximă acceptată în prezent (%1$s). - anulează previzualizarea link-ului + anulează previzualizarea linkului Verifică adresa serverului și încearcă din nou. Tu îți controlezi chatul! - Apel deja terminat! - Apel terminat + Apelul s-a încheiat deja! + Apel încheiat Blochează pentru toți Ați solicitat deja conexiunea prin această adresă! Te conectezi la tine? @@ -524,12 +523,12 @@ Aspectul discuției Bun pentru baterie. Aplicația verifică mesajele la fiecare 10 minute. Pot fi pierdute apeluri sau mesaje urgente.]]> Negru - Blochezi membrul pentru toți? - Și tu și contactul tău puteți șterge ireversibil mesajele trimise. (24 de ore) + Blocați membrul pentru toți? + Atât dvs., cât și contactul dvs. puteți șterge ireversibil mesajele trimise. (24 de ore) Folosește mai multă baterie! \nServiciul în fundal rulează mereu – notificările sunt afișate imediat ce mesajele sunt disponibile. Nu se poate trimite mesajul - Ștergeți + Șterge Confirmați fișiere de la servere necunoscute. schimbat adresa pentru dumneavoastră Confirmați parola nouă… @@ -538,7 +537,7 @@ conexiune stabilită Eroare de conexiune Conexiune expirată - se conectează + se conectează… Confirmare În curând! se conectează… @@ -549,7 +548,7 @@ pentru fiecare contact și membru de grup \nVa rugăm considerați că: dacă aveți prea multe conexiuni, consumul dumneavoastră de baterie și trafic de internet pot fi considerabil mai mari, iar unele conexiuni pot eșua.]]> Conexiune terminată Se conectează la desktop - Rugat să primească imaginea + S-a solicitat primirea imaginii Cerere de conexiune trimisă! De reținut: releele de mesaje și fișiere sunt conectate prin proxy SOCKS. Apelurile și trimiterea de previzualizări ale adreselor web utilizează conexiunea directă.]]> conectat @@ -562,35 +561,35 @@ se conectează Schimbați rolul de grup? Modul color - Prin profil de conversație (implicit) sau prin conexiune (BETA). - Comparați codurile de securitate cu contactele dumneavoastră. + După profilul de chat (implicit) sau după conexiune (BETA). + Compară codurile de securitate cu contactele tale. Conexiune oprită Conexiune oprită Conectare la desktop Conexiunea la desktop este într-o stare proastă Conectare Conexiune - Ștergi notițele private? + Ștergeți notele private? Conectare automată se conectează apelul… - se conectează (invetație la introducere) + se conectează (invitație de introducere) se conectează… %s este într-o stare proastă]]> - Confirmă reglările rețelei + Confirmă setările de rețea se conectează… Eroare de conexiune (AUTENTIFICARE) - Optimizarea bateriei este activă, dezactivând serviciul de funcționare în ascuns și solicitările periodice pentru mesaje noi. Pot fi reactivate din reglări. + Optimizarea bateriei este activă, dezactivând serviciul de fundal și cererile periodice pentru mesaje noi. Le puteți reactiva din setări. conectat - Crează un grup: pentru a crea un nou grup.]]> + Creează grup:: pentru a crea un nou grup.]]> Ștergeți conversația? - Ștergeți - Ștergeți conversația + Șterge + Șterge conversația Conectare Consolă conversație Confirmați parola colorat - Toate contactele, conversațiile și fișierele tale vor fi cifrate într-un mod sigur și încărcate pe bucăți pe releurile XFTP configurate. - Rugat să primească videoclipul + Toate contactele, conversațiile și fișierele dvs. vor fi criptate securizat și încărcate în fragmente către releele XFTP configurate. + S-a solicitat primirea videoclipului Comparați fișierul Vă rugăm să rețineți: nu veți putea recupera sau schimba parola dacă o veți pierde.]]> schimbat rolul dumneavoastră la %s @@ -617,15 +616,15 @@ Șterge contact Șters la Versiunea aplicației desktop %s nu este compatibilă cu această aplicație. - Ștergi mesajul membrului? - Șterge grup + Ștergeți mesajul membrului? + Șterge grupul Șterge și notifică contactele - Decentralizat + Descentralizat grup șters %d contact(e) selectat(e) Șters la: %s Ștergi profilul de conversație? - Șterge profil + Ștergeți profilul implicit (%s) Confirmări de livrare! Confirmările de livrare sunt dezactivate! @@ -633,37 +632,37 @@ Dispozitive desktop Desktop Eroare de decriptare - Șterge imagine + Șterge imaginea Șterge după - Șterge pentru toată lumea + Ștergeți pentru toată lumea Descriere Șterge fișier - Șterge coadă - Ștergi contactul? + Ștergeți coada + Ștergeți contactul? Șterge Șterge Ștergi fișiere și media? %d zile %d zi Șterge adresa - Șterge mesaje - Ștergi %d mesaje? + Ștergeți mesajele + Ștergeți %d mesaje? Ștergi adresa? Șterge toate fișierele - Șterge link - Ștergi link? + Șterge linkul + Ștergeți linkul? zile Șterge - Ștergi mesajul? + Ștergeți mesajul? Livrare - Ștergi conexiunea în așteptare? - Șterge server + Ștergeți conexiunea în așteptare? + Ștergeți serverul Șterge baza de date contact șters - Ștergi grupul? + Ștergeți grupul? Șterge baza de date de pe acest dispozitiv Șterge profil de conversație - Șterge fișiere pentru toate profilurile de conversație + Șterge fișierele pentru toate profilurile de chat Oricine poate găzdui servere. Contacte arhivate Beta @@ -671,7 +670,7 @@ Nu se poate apela membrul grupului Bază de date conversație exportată Verifică pentru actualizări - Contactul %1$s a schimbat la %2$s + contactul %1$s s-a schimbat în %2$s Contactul este șters. Controlează-ți rețeaua Parola pentru criptarea bazei de date va fi actualizată și stocată în Keystore. @@ -695,12 +694,12 @@ ID bază de date: %d Conexiuni Creat - Estompează pentru intimitate mai bună. - Stare conexiune și servere + Estompează pentru o mai bună confidențialitate. + Statusul conexiunii și al serverelor. Eroare bază de date - Contactele pot marca mesajele pentru ștergere; tu le vei putea vedea. + Contactele pot marca mesaje pentru ștergere; dvs. le veți putea vizualiza. Downgrade al bazei de date - Migrarea bazei de date este în curs. \nPoate dura câteva minute. + Migrarea bazei de date este în curs.\nAceasta poate dura câteva minute. Parola bazei de date și export Toate profilurile Profil actual @@ -715,11 +714,11 @@ Se conectează Servere conectate Nu se poate apela contactul - Se conectează la contact, așteaptă sau verifică mai târziu! - Reglări avansate + Se conectează la contact, vă rugăm să așteptați sau să verificați mai târziu! + Setări avansate Setări Setările tale - apel vocal criptat e2e + apel audio criptat e2e apel video criptat e2e DISPOZITIV EXPERIMENTAL @@ -731,18 +730,18 @@ Apel video primit Dezactivează Permiți apeluri? - terminat + încheiat Sunete la apel Apeluri îmbunătățite Apel audio primit - Termină apelul + Încheie apelul marcajele şterse %d mesaje marcate șterse moderat de %s %1$d alte erori de fișier. - %1$s mesaje netransmise - ai distribuit un link uic - ai distribuit linkul unic în mod incognito + %1$s mesaje nu au fost redirecționate + ai partajat linkul de unică folosință + ai partajat linkul de unică folosință incognito prin link de grup incognito prin link de grup Prin browser @@ -755,7 +754,7 @@ Asigurați-vă că adresele serverelor XFTP sunt în format corect, separate pe linii și nu sunt duplicate. Eroare la încărcarea serverlor XFTP Eroare la actualizarea configurației de rețea - Conversațiile nu au putut fi încărcate + Nu s-au putut încărca conversațiile Vă rugăm să actualizați aplicația și contactați dezvoltatorii. Eroare la crearea profilului! %d mesaje blocate @@ -776,16 +775,16 @@ a + b prin %1$s Eroare la încărcarea serverlor SMP - %1$d fișier(e) șterse. + %1$d fișier(e) au fost șterse. raport arhivat de %s - invitație acceptată + Invitație acceptată Asigurați-vă că adresele serverelor SMP sunt în format corect, separate pe linii și nu sunt duplicate. Eroare la salvarea serverelor XFTP - %1$d fișier(e) încă în descărcare. - %1$d fișier(e) a eșuat să se descărcarce. + %1$d fișier(e) sunt încă în curs de descărcare. + %1$d fișier(e) nu au putut fi descărcate. %1$d fișier(e) nu au fost descărcate. prin linkul adresei de contact - Deschiderea link-ului în browser poate reduce confidențialitatea și securitatea conexiunii. Link-urile SimpleX de nesigure vor fi roșii. + Deschiderea linkului în browser poate reduce confidențialitatea și securitatea conexiunii. Linkurile SimpleX nesigure vor fi afișate cu roșu. solicitat să se conecteze Conversația nu a putut fi încărcată Doar tu și moderatorii vedeți asta @@ -801,13 +800,13 @@ conversație nevalidă date nevalide Acest chat este protejat prin criptare end-to-end rezistentă la detecții cuantice. - Notițe private + Note private Eroare la citirea parolei bazei de date Versiunea bazei de date este incompatibilă Invitația la grup nu mai este validă, a fost eliminată de expeditor. - Alăturare la grup în curs + Se alătură grupului Părăsiți grupul - Eroare la ștergerea link-ului grupului + Eroare la ștergerea linkului de grup Eroare la trimiterea invitației dezactivat Membrii pot trimite mesaje vocale. @@ -818,10 +817,10 @@ Incompatibil! Cum să utilizați serverele dvs. Importați baza de date de chat? - Șterge raport + Ștergeți raportul Redirecționați mesajele… Ștergeți doar conversația - Păstrați invitația neutilizată? + Păstrezi invitația nefolosită? Introduceți numele dumneavoastră: Acordați permisiunea (permisiunile) de a efectua apeluri Notificări și baterie @@ -843,7 +842,7 @@ dezactivat direct Fișiere și media - Alăturați-vă grupului? + Vrei să te alături grupului? k Se deschide baza de date… Cale de fișier nevalidă @@ -864,7 +863,7 @@ Configurație îmbunătățită a serverului Mesaj de bun venit pentru grup Reducerea suplimentară a consumului de baterie - Alăturați-vă conversațiilor de grup + Alătură-te conversațiilor de grup Livrarea mesajelor îmbunătățită Interfață lituaniană Faceți conversațiile să arate diferit! @@ -883,7 +882,7 @@ Autentificarea dispozitivului este dezactivată. Se dezactivează SimpleX Lock. Invitația a expirat! Grup - Invitați la grup + Invitați în grup Deconectați telefoanele mobile Nume afișat nevalid! Eroare la schimbarea profilului! @@ -898,11 +897,11 @@ Notificările instantanee sunt dezactivate! Dezactivare notificări Migrați de pe un alt dispozitiv - Eroare la ștergerea bazei de date de conversații + Eroare la ștergerea bazei de date a chatului Actualizarea bazei de date este necesară renegocierea criptării membru - Șterge conversația? + Ștergeți conversația? eroare Link nevalid Fișierul va fi primit după ce persoana de contact va finaliza încărcarea. @@ -925,7 +924,7 @@ oprit` %ds Remediați criptarea după restaurarea copiilor de rezervă. - Șterge sau moderează pana la 200 de mesaje. + Ștergeți sau moderați până la 200 de mesaje. Primirea mesajelor Eroare la resetarea statisticilor Eroare la crearea mesajului @@ -946,7 +945,7 @@ Serviciu de notificare Redirecționare server: %1$s\nEroare server destinatar: %2$s Fișierul este blocat de operatorul serverului:\n%1$s. - Editați + Editează Info Redirecționat de la Șterge %d mesaje de la membri? @@ -958,14 +957,14 @@ Draft de mesaje Parola a fost schimbată! Activare (păstrați suprascrierile grupului) - Dezactivare (păstrare suprascrieri grup) + Dezactivează (păstrează suprascrierile pentru grupuri) Activează pentru toate grupurile Versiunea bazei de date este mai nouă decât app, dar nu există migrare ulterioară pentru: %s - Alăturați-vă anonim + Alătură-te anonim Deschide Pentru rutare privată Activați funcția TCP keep-alive - Mut cand este inactiv! + Fără sunet când este inactiv! Teme noi de chat Descentralizarea rețelei altul @@ -974,17 +973,17 @@ Imaginea va fi primită când contactul dvs. va fi online, vă rugăm să așteptați sau să verificați mai târziu! Șterge mesajele din conversație de pe dispozitiv. Dacă alegeți să respingeți, expeditorul NU va fi notificat. - Cum se folosește + Cum să o utilizezi Marcare în mesaje Eroare la salvarea proxy-ului Dacă confirmi, serverele de mesagerie vor putea vedea adresa ta IP, iar furnizorul tău - la ce servere te conectezi. Cum ajută la confidențialitate mesaj duplicat Invitați prietenii - Să vorbim în chat -ul simplex + Să vorbim în SimpleX Chat Salut!\nConectează-te cu mine prin SimpleX Chat: %s Pentru social media - Ascundeți profilul + Ascunde profilul Numele afișat nu poate conține spații albe. Nume nevalid! Eroare la deschiderea browserului @@ -995,7 +994,7 @@ Opțiuni dezvoltator Notificările vor înceta să funcționeze până când nu redeschideți aplicația. Eroare la salvarea setărilor - Șterge mesaje după + Ștergeți mesajele după %d sec Email Eroare la salvarea parolei utilizatorului @@ -1018,7 +1017,7 @@ Doar proprietarii grupului pot modifica preferințele grupului. Introdu mesajul de bun venit… Doar contactul tău poate adăuga reacții la mesaje. - Erori de ștergere + Erori la ștergere Dezactivați ștergerea mesajelor Păstrează conversația Cod QR nevalid @@ -1063,11 +1062,11 @@ Mesajele vor fi marcate pentru ștergere. Destinatarul (destinatarii) va (vor) putea dezvălui aceste mesaje. Descărcare Fișierul va fi șters de pe servere. - Alăturați-vă ca %s + Alătură-te ca %s Nicio conversație selectată Încărcarea fișierului Eroare la salvarea fișierului - Șterge fără notificare + Ștergeți fără notificare Deconectat Remediați conexiunea? Mesaj care dispare @@ -1083,8 +1082,8 @@ Mod de blocare Cod de acces nou Caracteristici experimentale - Pentru a deschide chatul este necesară o parolă pentru baza de date. - Introduceți parola… + Fraza de acces a bazei de date este necesară pentru a deschide chatul. + Introduceți fraza de acces… Downgrade și deschide chatul Vor fi afișate mesaje de la acești membri! nici unul @@ -1110,7 +1109,7 @@ Statistici detaliate Descărcat Eroare la reconectarea serverelor - Ectivat pentru + Activat pentru %d evenimente de grup %d conversații cu membri activat @@ -1167,10 +1166,10 @@ Membrul %1$s schimbat la %2$s Niciun contact de adăugat Extindeți selecția de roluri - Invitați să discutați + Invitați la conversație Nou rol de membru Invitați membrii - Editați profilul grupului + Editați profilul de grup Grupul va fi șters pentru dvs. - această acțiune nu poate fi anulată! Membrul va fi eliminat din grup - acest lucru nu poate fi anulat! Membrii vor fi eliminați din chat - acest lucru nu poate fi anulat! @@ -1184,7 +1183,7 @@ Eroare la actualizarea serverului Serverul operator Ștergeți profilul de chat pentru - Introduceți parola în căutare + Introdu parola în câmpul de căutare Incognito Modul incognito vă protejează confidențialitatea utilizând un nou profil aleatoriu pentru fiecare contact. Numai date despre profilul local @@ -1193,7 +1192,7 @@ Mesaje directe Mesaje care dispar Doar contactul dvs. poate șterge ireversibil mesajele (le puteți marca pentru ștergere). (24 de ore) - Ștergerea ireversibilă a mesajelor este interzisă în acest chat. + Ștergerea ireversibilă a mesajelor este interzisă în această conversație. Numai tu poți trimite mesaje vocale. Reacțiile la mesaje sunt interzise în această conversație. Numai tu poți efectua apeluri. @@ -1209,8 +1208,8 @@ Șterge conversația Ștergeți conversația cu membrul? Membru se va alătura grupului, acceptați membru? - Ascundeți ecranul aplicației în aplicațiile recente. - Nume diferite, avatare și izolare transport. + Ascunde ecranul aplicației din aplicațiile recente. + Nume, avatare și izolare transport diferite. Interfață franceză Draft de mesaje În sfârșit, le avem! 🚀 @@ -1222,16 +1221,16 @@ pentru o mai bună confidențialitate a metadatelor. Redirecționați până la 20 de mesaje simultan. Nu rata mesajele importante. - Organizați conversațiie în liste + Organizează conversațiile în liste Trimitere mai rapidă a mesajelor. Ștergere mai rapidă a grupurilor. ore Activați - Telefoane conectate + Dispozitive mobile conectate Introduceți numele acestui dispozitiv… Eroare Versiune incompatibilă - Nou dispozitiv mobil + Dispozitiv mobil nou Descoperibil prin rețeaua locală Descoperiți prin intermediul rețelei locale Deschideți portul în firewall @@ -1240,7 +1239,7 @@ Desktopul are codul de invitație greșit Descărcarea a eșuat Importul a eșuat - Introduceți parola + Introduceți fraza de acces Eroare la descărcarea arhivei Migrați către un alt dispozitiv duplicate @@ -1271,19 +1270,19 @@ Fișierul va fi primit când contactul dvs. va fi online, vă rugăm să așteptați sau să verificați mai târziu! niciun detaliu Deschide cu %s - Link invitație unică - Șterge lista? + Link de invitație unic + Ștergeți lista? Marchează ca verificat Activează pentru toți grup șters criptare ok invitat - Mut + Fără sunet ajutor niciun text Membrii pot trimite mesaje directe. - opțional, notificați contactele șterse.\n- nume de profil cu spații.\n- și multe altele! - Activează în chat-urile directe (BETA)! + Activează în conversațiile directe (BETA)! Navigare îmbunătățită în chat Noile acreditări SOCKS vor fi utilizate de fiecare dată când porniți aplicația. Vă protejează adresa și conexiunile IP. @@ -1328,7 +1327,7 @@ mesaj Favorit Marchează ca citit - Mut + Fără sunet Nume listă... Numele listei și emoji ar trebui să fie diferite pentru toate listele. Află mai multe @@ -1382,16 +1381,16 @@ Servere media și fișiere Alte servere XFTP NU utilizați rutare privată. - Activează apelurile de pe ecranul de blocare prin Setări. - Dezactivare (păstrare suprascrieri) + Activați apelurile de pe ecranul de blocare prin Setări. + Dezactivează (păstrează suprascrierile) Dacă introduceți parola de autodistrugere în timp ce deschideți aplicația: Mediu Părăsiți conversația Fără conversații cu membrii Confirmare de primire a mesajelor! minute - Adaugă un mobil - Creează o listă + Conectează un dispozitiv mobil + Creează listă Șterge Instalați SimpleX Chat pentru terminal Eroare la salvarea serverelor ICE @@ -1408,7 +1407,7 @@ Se descarcă detaliile linkului Eroare internă Sau importați fișierul de arhivă - Sau lipiți linkul arhivei + Sau lipește linkul arhivei Eroare la inițializarea WebView. Actualizați sistemul la noua versiune. Vă rugăm să contactați dezvoltatorii.\nEroare: %s Grupul va fi șters pentru toți membrii - această acțiune nu poate fi anulată! Nume local @@ -1418,16 +1417,16 @@ expirat Descărcați %s (%s) Instalați update - Nu creați adresa + Nu crea adresă De exemplu, dacă persoana de contact primește mesaje prin intermediul unui server SimpleX Chat, aplicația le va livra prin intermediul unui server Flux. Deschideți Setări Safari / Site-uri web / Microfon, apoi alegeți Permiteți pentru localhost. Apel ratat Renegocierea criptării a eșuat. Oprit Dezactivați confirmări pentru grupuri? - Dezactivați pentru toate grupurile - Dezactivați pentru tot - Deshideți link-ul + Dezactivează pentru toate grupurile + Dezactivează pentru toți + Deschide linkul Baza de date va fi criptată, iar parola va fi stocată în setări. Eroare: %s Părăsiți grupul? @@ -1455,8 +1454,8 @@ - livrare mai stabilă a mesajelor.\n- grupuri mai bune.\n- și multe altele! Face ca un mesaj să dispară Migrați către un alt dispozitiv prin codul QR. - Șterge până la 20 de mesaje simultan. - Alăturați-vă grupului dvs.? + Ștergeți până la 20 de mesaje odată. + Vrei să te alături grupului tău? Fără conexiune la rețea Notificări instant! Deschide setările aplicației @@ -1472,7 +1471,7 @@ Ca răspuns la Mesaj redirecționat Grupuri - Mesajele au fost șterse după ce le -ați selectat. + Mesajele au fost șterse după ce le-ați selectat. Fără conversații Nimic de redirecționat! %d conversație(i) @@ -1489,7 +1488,7 @@ Doar proprietarii grupului pot activa mesajele vocale. Editați Mesaj live! - Mut pentru toate + Fără sunet toate OK Previzualizare imagine din link Conversație nouă @@ -1509,20 +1508,20 @@ Cum funcționează SimpleX Fără identificatori de utilizator. Se poate întâmpla când:\n1. Mesajele au expirat în clientul care trimite după 2 zile sau pe server după 30 de zile.\n2. Decriptarea mesajelor a eșuat, deoarece tu sau contactul dvs. ați folosit o copie de rezervă a bazei de date vechi.\n3. Conexiunea a fost compromisă. - Eroare la exportarea bazei de date de conversații + Eroare la exportul bazei de date a chatului Eroare la oprirea conversației niciodată Niciun fișier primit sau trimis Frază de acces nouă… Criptați baza de date? - Introduceți parola corectă. - Alăturați-vă grupului? + Introduceți fraza de acces corectă. + Vrei să te alături grupului? Migrații: %s - Alătură -te + Alătură-te Părăsiți Părăsiți conversația? ieșit - Invitat prin link-ul dvs. de grup + invitat prin linkul dvs. de grup Un membru nou vrea să se alăture grupului. criptare agreată renegocierea criptării este permisă @@ -1545,8 +1544,8 @@ proprietari Admiterea membrilor oprit - Link-urile grupului - Ștergerea ireversibilă a mesajelor + Linkuri de grup + Ștergere ireversibilă a mesajului Măriți dimensiunea fontului. Deconectați-vă Deconectat din motivul: %s @@ -1555,7 +1554,7 @@ Detalii alte erori Eroare la ștergerea conversației cu membrul - Link-ul grupului + Link grup Remediați conexiunea? %d săptămâni Redirecţionează @@ -1563,15 +1562,15 @@ Mesajul va fi marcat pentru ștergere. Destinatarul (destinatarii) va (vor) putea dezvălui acest mesaj. Doar proprietarii grupului pot activa fișiere și media. Imagine - Activează accesul la cameră + Activați accesul la cameră Cum să Ignoră Informații despre coada de mesaje - Complet descentralizat – vizibil doar membrilor. + Complet descentralizat – vizibil doar pentru membri. Introduceți numele grupului: Umple Descărcați noi versiuni de pe GitHub. - Dacă ați primit linkul de invitație la SimpleX Chat, îl puteți deschide în browser: + Dacă ați primit un link de invitație SimpleX Chat, îl puteți deschide în browser-ul dvs.: Link nevalid! Nu Invitați membrii @@ -1597,7 +1596,7 @@ în așteptarea aprobării Notificări periodice Notificările periodice sunt dezactivate! - Lipiți linkul arhivei + Lipește linkul arhivei Se pregătește descărcarea Lipește Vă rugăm să rugați persoana de contact să activeze apelurile. @@ -1641,7 +1640,7 @@ Politica de confidențialitate și condițiile de utilizare. RUTAREA MESAJELOR PRIVATE Vă rugăm să păstrați parola în siguranță, NU o veți putea schimba dacă o pierdeți. - Parolă negăsită în Keystore, vă rugăm să o introduceți manual. Acest lucru s-ar fi putut întâmpla dacă ați restaurat datele aplicației folosind un instrument de backup. Dacă nu este cazul, vă rugăm să contactați dezvoltatorii. + Fraza de acces nu a fost găsită în Keystore, vă rugăm să o introduceți manual. Acest lucru se poate fi întâmplat dacă ați restaurat datele aplicației utilizând un instrument de backup. Dacă nu este cazul, vă rugăm să contactați dezvoltatorii. Parola din Keystore nu poate fi citită. Acest lucru s-ar fi putut întâmpla după o actualizare de sistem incompatibilă cu aplicația. Dacă nu este cazul, vă rugăm să contactați dezvoltatorii. Fost membru %1$s în așteptare @@ -1659,12 +1658,12 @@ Păstrează ultima schiță a mesajului, cu atașamente. Nume de fișiere private Criptare rezistentă cuantic - Confidențialitate pentru clienții dumneavoastră. + Confidențialitate pentru clienții dvs. Nume de fișiere media private. Aleatoriu Vă rugăm să raportați dezvoltatorilor:\n%s\n\nSe recomandă repornirea aplicației. Vă rugăm să confirmați că setările de rețea sunt corecte pentru acest dispozitiv. - Este necesară o parolă + Fraza de acces este necesară Parolă Servere presetate Lipiți adresa desktopului @@ -1683,11 +1682,11 @@ Note private Bara de instrumente de chat accesibilă Temă de profil - Lipiți linkul primit + Lipește linkul pe care l-ai primit Parola nu a fost modificată! Parolă setată! - Parola din Keystore nu poate fi citită, vă rugăm să o introduceți manual. Acest lucru s-ar fi putut întâmpla după o actualizare de sistem incompatibilă cu aplicația. Dacă nu este cazul, vă rugăm să contactați dezvoltatorii. - Bare de instrumente accesibile ale aplicațiilor + Fraza de acces din Keystore nu poate fi citită, vă rugăm să o introduceți manual. Acest lucru se poate fi întâmplat după o actualizare de sistem incompatibilă cu aplicația. Dacă nu este cazul, vă rugăm să contactați dezvoltatorii. + Bare de instrumente accesibile Vă rugăm să așteptați ca moderatorii grupului să vă examineze cererea de alăturare. Interziceți trimiterea de mesaje care dispar. Interziceți trimiterea de fișiere și fișiere media. @@ -1702,28 +1701,28 @@ Interfață poloneză Protejați-vă adresa IP de retransmiterile de mesagerie alese de contactele dvs.\nActivați în setările *Rețea și servere*. Mesaj primit - Vă rugăm să așteptați în timp ce fișierul este încărcat de pe mobilul conectat. + Vă rugăm să așteptați cât timp fișierul se încarcă de pe dispozitivul mobil conectat imagine de profil substituent pentru imaginea de profil - Lipiți linkul + Lipește linkul Adresa prestabilită a serverului Server presetat Evaluează aplicația Port Conversațiile private, grupurile și contactele dvs. nu sunt accesibile operatorilor serverului. Parola aleatorie este stocată în setări ca text simplu.\nO puteți modifica ulterior. - Vă rugăm să introduceți parola curentă corectă. + Vă rugăm să introduceți fraza de acces curentă corectă. Previzualizare Verificați dacă dispozitivul mobil și desktopul sunt conectate la aceeași rețea locală și dacă firewall-ul desktopului permite conexiunea.\nVă rugăm să comunicați orice alte probleme dezvoltatorilor. Servere conectate anterior În așteptare - am primit confirmarea… + confirmare primită… Protejează-ți profilurile de chat cu o parolă! Vă rugăm să verificați dacă ați folosit linkul corect sau cereți contactului dumneavoastră să vă trimită altul. Eroare de rutare privată respins Răspuns primit - Destinatarul(ii) nu pot vedea de la cine este acest mesaj. + Destinatarul/Destinatarii nu pot vedea de la cine provine acest mesaj. Trimiterea confirmărilor este dezactivată pentru %d contacte primit, interzis Reamintește mai târziu @@ -1734,7 +1733,7 @@ Raportați conținutul: doar moderatorii grupului îl vor vedea. Adresa serverului Primirea fișierului va fi oprită. - Resetați la tema aplicației + Resetează la tema aplicației Înregistrare actualizată la: %s Trimiteți un mesaj pentru a activa apelurile. Resetare @@ -1742,7 +1741,7 @@ informații despre coada serverului: %1$s\n\nultimul mesaj primit: %2$s Salvați și reconectați Raportați altceva: doar moderatorii grupului îl vor vedea. - căutare + caută Setați numele chatului… Serverul de retransmisie este utilizat doar dacă este necesar. O altă parte poate observa adresa dvs. IP. Resetați toate statisticile? @@ -1758,7 +1757,7 @@ Trimiterea confirmărilor este dezactivată pentru %d grupuri recenzie Operatorul serverului s-a schimbat. - Scala + Scalare Utilizare redusă a bateriei Mesaje trimise Primit total @@ -1775,13 +1774,13 @@ %s la %s Protocolul serverului a fost modificat. Recepție simultană - Resetați la tema utilizatorului + Resetează la tema utilizatorului Setați admiterea membrilor Respinge Respingeți membrul? Destinatarii văd actualizările pe măsură ce le tastați. Istoric recent și bot de directoare îmbunătățit. - Setați expirarea mesajului în chat-uri. + Setează expirarea mesajelor în conversații. Trimiterea confirmărilor de livrare va fi activată pentru toate contactele. Trimiterea confirmărilor de livrare va fi activată pentru toate contactele din toate profilurile de chat vizibile. Securizat @@ -1808,7 +1807,7 @@ Înregistrare actualizată la Selectați operatorii de rețea pe care îi veți utiliza. Telefoane mobile la distanță - Trimiteți confirmări de primire + Trimite confirmări de citire Setați 1 zi Parolă de autodistrugere Reconectați toate serverele conectate pentru a forța livrarea mesajelor. Aceasta utilizează trafic suplimentar. @@ -1822,7 +1821,7 @@ Raportați profilul membrului: numai moderatorii grupului îl vor vedea. Raportați încălcarea: numai moderatorii grupului o vor vedea. Înregistrați mesajul vocal - Scanare / Lipire link + Scanează / Lipește link Server Reporniți aplicația pentru a utiliza baza de date de chat importată. Eliminați membri? @@ -1841,13 +1840,13 @@ Deblocare Încărcarea a eșuat Aplicația se poate închide după 1 minut în fundal. - Activează sunetul + Cu sunet Această setare se aplică mesajelor din profilul tău de chat actual Folosiți servere SimpleX Chat? Proxy SOCKS Nume de utilizator SimpleX Chat și Flux au ajuns la un acord pentru a include în aplicație servere operate de Flux. - Aplicația preia mesaje noi periodic — consumă doar câteva procente din baterie pe zi. Aplicația nu folosește notificări push — datele de pe dispozitivul tău nu sunt trimise către servere. + Aplicația preia mesaje noi periodic — folosește câteva procente din baterie pe zi. Aplicația nu utilizează notificări push — datele de pe dispozitivul dvs. nu sunt trimise către servere. Blocare SimpleX Cheie greșită sau adresă necunoscută a fragmentului de fișier - cel mai probabil fișierul este șters. Prea multe videoclipuri! @@ -1871,7 +1870,7 @@ Cu un consum redus de energie al bateriei. Cu un consum redus de energie al bateriei. Începând de la %s.\nToate datele sunt păstrate private pe dispozitivul dvs. - Abonat/ă + Abonat Erori de încărcare Apel video Pentru a vă conecta prin link @@ -1893,8 +1892,8 @@ Video Mesaj vocal (%1$s) Trimite - Comutare listă de chat: - Pentru a primi notificări, vă rugăm să introduceți parola bazei de date + Comută lista de conversații: + Pentru a primi notificări, vă rugăm să introduceți fraza de acces a bazei de date Se așteaptă videoclipul Mesaje nelivrate Testul a eșuat la pasul %s. @@ -1914,10 +1913,10 @@ Videoclipul va fi primit după ce persoana de contact termină de încărcat. Videoclipul va fi recepționat când contactul dvs. va fi online, vă rugăm să așteptați sau să verificați mai târziu! video - Utilizarea serverelor de chat SimpleX. + Utilizarea serverelor SimpleX Chat. Folosiți proxy SOCKS? Browserul web implicit este necesar pentru apeluri. Vă rugăm să configurați browserul implicit în sistem și să partajați mai multe informații cu dezvoltatorii. - Afișează starea mesajului + Afișează statusul mesajului Port TCP pentru mesagerie Descărcarea actualizării a fost anulată Omiteți invitarea membrilor @@ -1927,14 +1926,14 @@ Această acțiune nu poate fi anulată - profilul, contactele, mesajele și fișierele dvs. vor fi pierdute iremediabil. Sistem Deblocați membrul? - Activează sunetul + Cu sunet Mesaje vocale Statistici - Opriți conversația? + Opriți chatul? necunoscut - Puteți ascunde sau dezactiva un profil de utilizator - țineți apăsat pentru meniu. + Poți ascunde sau dezactiva notificările unui profil de utilizator – ține apăsat pentru meniu. Ați permis - Distribuie linkul unic unui prieten + Partajează link cu utilizare unică cu un prieten Mesaje vocale Mesaj vocal… Setări proxy SOCKS @@ -1946,9 +1945,9 @@ Atingeți pentru conectare Mesajele vocale sunt interzise! Ați acceptat conexiunea - Distribuiți adresa public - Distribuie acest link cu invitație unică - Pentru a verifica criptarea end-to-end cu persoana de contact, comparați (sau scanați) codul de pe dispozitivele dvs. + Partajează adresa public + Partajează acest link de invitație cu utilizare unică + Pentru a verifica criptarea end-to-end cu contactul dvs., comparați (sau scanați) codul de pe dispozitivele dvs. Utilizare pentru conexiuni noi Utilizați proxy SOCKS Opriți partajarea adresei? @@ -1958,7 +1957,7 @@ Afișează doar contactul Deblocare Porniți - Oprește conversația + Oprește chatul Acest mesaj a fost șters sau nu a fost încă primit. Mesajul va fi marcat ca moderat pentru toți membrii. Stop @@ -1966,7 +1965,7 @@ Se așteaptă fișierul Această acțiune nu poate fi anulată - mesajele trimise și primite în acest chat anterior celei selectate vor fi șterse. Vizualizați codul de securitate - Atingeți pentru a lipi linkul + Atinge pentru a lipi linkul Textul pe care l-ai lipit nu este un link SimpleX. Stabil Puteți configura operatorii în setările Rețea și servere. @@ -1974,10 +1973,10 @@ apel video (necriptat e2e) ID-ul următorului mesaj este incorect (mai mic sau egal cu precedentul).\nSe poate întâmpla din cauza unei erori sau când conexiunea este compromisă. Fără Tor sau VPN, adresa ta IP va fi vizibilă pentru serverele de fișiere. - Aplicația va solicita confirmarea descărcărilor de pe servere de fișiere necunoscute (cu excepția .onion sau când este activat proxy-ul SOCKS). + Aplicația va cere să confirmați descărcările de pe servere de fișiere necunoscute (cu excepția celor .onion sau când proxy-ul SOCKS este activat). Sistem Acestea pot fi ignorate în setările de contact și de grup. - ASISTENȚĂ CHAT SIMPLEX + SUPORT SIMPLEX CHAT PROXY SOCKS TEME În timpul importului au apărut câteva erori non-fatale: @@ -1990,10 +1989,10 @@ Videoclipuri și fișiere de până la 1 GB Comută modul incognito la conectare. Formă imagine de profil - Schimbă profilul de chat pentru invitații unice. + Comutați profilul de chat pentru invitațiile unice. Puteți activa mai târziu prin Setări săptămâni - Acesta este link-ul tău unic! + Acesta este linkul tău unic, valabil o singură dată! Servere necunoscute! Fără Tor sau VPN, adresa ta IP va fi vizibilă pentru aceste retransmiteri XFTP:\n%1$s. Actualizați parola bazei de date @@ -2005,9 +2004,9 @@ Video pornit Aceste setări sunt pentru profilul tău actual Da - Urmă + Coada Utilizare de pe desktop - Oprește chatul pentru a exporta, importa sau șterge baza de date a chatului. Nu vei putea primi și trimite mesaje cât timp chatul este oprit. + Opriți chatul pentru a exporta, importa sau șterge baza de date a chatului. Nu veți putea primi și trimite mesaje în timp ce chatul este oprit. Unele fișiere nu au fost exportate Parola este stocată în setări ca text simplu. deblocat %s @@ -2016,7 +2015,7 @@ Mesaj de bun venit Deblocați membrul Deblocați membrul pentru toate? - Comutator + Comută Rolul va fi schimbat în %s. Toți participanții la chat vor fi notificați. Rolul va fi schimbat în %s. Toți membrii grupului vor fi notificați. Folosește %s @@ -2032,12 +2031,12 @@ - mesaje vocale de până la 5 minute.\n- timp personalizat de dispariție.\n- istoricul modificărilor. Pentru a ascunde mesajele nedorite. Prin protocol securizat de rezistență cuantică. - Cu fișiere și suporturi media criptate. - Va fi activat în chat-urile directe! + Cu fișiere și media criptate. + Va fi activat în conversațiile directe! Al doilea operator presetat din aplicație! Vizualizați condițiile actualizate Verificați conexiunea - Le poți activa ulterior prin setările de Confidențialitate și Securitate ale aplicației. + Le poți activa mai târziu din setările de Confidențialitate și securitate ale aplicației. Verificați codul pe mobil Numele acestui dispozitiv Acest dispozitiv @@ -2053,23 +2052,23 @@ Mărime Poți menționa până la %1$s membri per mesaj! Blocarea SimpleX este activată - Verificați codul de securitate + Verifică codul de securitate Criptarea funcționează și noul acord de criptare nu este necesar. Poate duce la erori de conexiune! Expirare conexiune TCP Afișează - Afișează informații pentru + Se afișează informații pentru Mesajul va fi șters pentru toți membrii. Vă mulțumim pentru instalarea SimpleX Chat! - Distribuiți profilul + Partajează profil Eroare necunoscută Sesiuni de transport Când IP-ul este ascuns - Sunet dezactivat + Sunet oprit Reafișează profilul Accent imagine de fundal Arhiva bazei de date încărcată va fi eliminată definitiv de pe servere. WiFi - Stop + Oprire Mesaje ignorate Parola va fi stocată în setări ca text simplu după ce o modificați sau reporniți aplicația. Conexiune TCP @@ -2084,7 +2083,7 @@ S-a atins timpul de expirare la conectarea la desktop Pentru a te proteja împotriva înlocuirii linkului tău, poți compara codurile de securitate ale contactelor. Pentru a vă proteja informațiile, activați SimpleX Lock.\nVi se va solicita să finalizați autentificarea înainte ca această funcție să fie activată. - Dacă nu cumva contactul dvs. a șters conexiunea sau acest link era deja utilizat, ar putea fi o eroare - vă rugăm să o raportați.\nPentru a vă conecta, rugați contactul dvs. să creeze un alt link de conexiune și verificați dacă aveți o conexiune stabilă la rețea. + Dacă contactul dvs. a șters conexiunea sau acest link a fost deja utilizat, ar putea fi o eroare – vă rugăm să o raportați.\nPentru a vă conecta, vă rugăm să rugați contactul dvs. să creeze un alt link de conexiune și să verificați dacă aveți o conexiune la rețea stabilă. Când partajezi un profil incognito cu cineva, acest profil va fi folosit pentru grupurile în care te invită. Mesaj vocal La conectarea apelurilor audio și video. @@ -2095,12 +2094,12 @@ Se așteaptă desktopul… Prea multe imagini! Încărcați fișierul - Atingeți butonul + Atinge butonul Atingeți pentru a scana (pentru a partaja cu persoana de contact) Pentru a începe o nouă conversație Video - Distribuiți linkul unic + Partajează link cu utilizare unică Acest link nu este un link de conectare valid! Acest cod QR nu este un link! Link scurt @@ -2118,7 +2117,7 @@ Afișează procentul Serverele pentru conexiuni noi ale profilului dvs. de chat actual Afișează apeluri API lente - Pentru a fi notificat despre noile lansări, activează verificarea periodică pentru versiunile stabile sau beta. + Pentru a fi notificat despre noile versiuni, activați verificarea periodică pentru versiunile Stabile sau Beta. Folosește o parolă aleatorie Această acțiune nu poate fi anulată - toate fișierele și fișierele media primite și trimise vor fi șterse. Imaginile cu rezoluție mică vor rămâne. Îl poți modifica în setările Aspect. @@ -2132,11 +2131,11 @@ Încărcat Folosiți portul TCP 443 doar pentru serverele presetate. Omiteți această versiune - Îl poți crea mai târziu - Îl poți face vizibil pentru contactele tale SimpleX prin Setări. + O poți crea mai târziu + O poți face vizibilă contactelor tale SimpleX din Setări. Platforma de mesagerie și aplicații care vă protejează confidențialitatea și securitatea. Profilul este partajat doar cu contactele tale. - Pentru a dezvălui profilul ascuns, introduceți o parolă completă într-un câmp de căutare din pagina Profilurile dvs. de chat. + Pentru a-ți afișa profilul ascuns, introdu o parolă completă într-un câmp de căutare din pagina ta profiluri de chat. Puteți configura serverele prin intermediul setărilor. apel video Video dezactivat @@ -2152,15 +2151,15 @@ Mesajele vocale sunt interzise în acest chat. Cu mesaj opțional de bun venit. Suportă Bluetooth și alte îmbunătățiri. - Aceasta este adresa ta SimpleX! + Aceasta este propria ta adresă SimpleX! Se încarcă arhiva %s a fost încărcat Verificați parola Blocarea SimpleX nu este activă! - Autentificare de sistem + Autentificare sistem Baza de date nu funcționează corect. Atingeți pentru a afla mai multe. Raportul va fi arhivat pentru dvs. - Atingeți Creare adresă SimpleX din meniu pentru a o crea mai târziu. + Atingeți Creează o adresă SimpleX în meniu pentru a o crea mai târziu. Acest text este disponibil în setări ești invitat în grup Se așteaptă imaginea @@ -2170,13 +2169,13 @@ Eliminare favorit Mențiuni necitite Conexiunea pe care ați acceptat-o va fi anulată! - Contactul cu care ai distribuit acest link NU se va putea conecta! + Contactul cu care ați partajat acest link NU se va putea conecta! vrea să se conecteze cu tine! - Distribuiți adresa SimpleX pe rețelele de socializare. + Partajează adresa SimpleX pe rețelele de socializare. Pentru a se conecta, contactul dvs. poate scana codul QR sau poate folosi linkul din aplicație. Puteți seta numele conexiunii, pentru a vă aminti cu cine a fost partajat linkul. Adresa SimpleX și linkurile unice pot fi partajate în siguranță prin orice serviciu de mesagerie. - Codul pe care l-ați scanat nu este un cod QR SimpleX link. + Codul scanat nu este un cod QR de tip link SimpleX. Server de testare Servere de testare Folosește acreditări aleatorii @@ -2184,15 +2183,15 @@ Folosește chatul Hash-ul mesajului anterior este diferit. Această acțiune nu poate fi anulată - mesajele trimise și primite anterior celei selectate vor fi șterse. Poate dura câteva minute. - Fraza de acces greșită! - Încercarea de modificare a parolei bazei de date nu a fost finalizată. - Ești invitat(ă) în grup. Alătură-te pentru a te conecta cu membrii grupului. + Frază de acces greșită! + Încercarea de a schimba fraza de acces a bazei de date nu a fost finalizată. + Ai fost invitat(ă) în grup. Alătură-te pentru a te conecta cu membrii grupului. profil de grup actualizat Condiții actualizate Utilizați pentru mesaje Mesajele vocale sunt interzise. Protocoalele SimpleX analizate de Trail of Bits. - Acest link a fost folosit cu un alt dispozitiv mobil, vă rugăm să creați un link nou pe desktop. + Acest link a fost utilizat cu un alt dispozitiv mobil, vă rugăm să creați un link nou pe desktop. Verificați conexiunile Poți să încerci încă o dată. Nu ești conectat la aceste servere. Rutarea privată este utilizată pentru a livra mesaje către ele. @@ -2231,24 +2230,24 @@ %s are o versiune neacceptată. Asigurați-vă că utilizați aceeași versiune pe ambele dispozitive]]> %1$s.]]> Conexiuni active - Discuții de afaceri + Conversații de afaceri l-ai blocat pe %s Bucăți șterse Serverele tale ICE ai eliminat %1$s Preferințele dumneavoastră - Adăugați o listă - Totul - Puteți vedea în continuare conversația cu %1$s în lista de chaturi. + Adaugă listă + Toate + Puteți vizualiza în continuare conversația cu %1$s în lista de conversații. Condiții acceptate %s.]]> - %1$d eroare(i) de fișier:\n%2$s + %1$d eroare(erori) de fișier:\n%2$s Conexiune blocată Conexiunea este blocată de operatorul serverului:\n%1$s. criptate end-to-end, cu securitate post-cuantică în mesajele directe.]]> Bare de instrumente ale aplicației - Securitate mai bună ✅ - Toate chat-urile vor fi eliminate din lista %s, iar lista va fi ștearsă. + Securitate îmbunătățită ✅ + Toate conversațiile vor fi eliminate din lista %s, iar lista va fi ștearsă Conexiunea dvs. a fost mutată la %s, dar a apărut o eroare neașteptată la redirecționarea către profil. Puteți migra baza de date exportată. Serverele tale XFTP @@ -2258,43 +2257,43 @@ Întreabă %s.]]> Schimbați ștergerea automată a mesajelor? - Adresă sau link unic? + Adresă sau link de unică folosință? Sesiune de aplicație Contactele dvs. Este posibil ca datele dumneavoastră de autentificare să fie trimise necriptate. - Adresa firmei - Adaugă membrii echipei tale la conversații. + Adresă de afaceri + Adăugați membrii echipei dvs. la conversații. Verifică mesajele la fiecare 10 minute %s, acceptați condițiile de utilizare.]]> Confirmați autentificarea dvs - Schimbați profilurile de chat + Schimbă profilurile de chat Contacte Conexiunea necesită renegocierea criptării. Adresa ta SimpleX - Creați un link unic + Creează link de unică folosință Profilul tău actual Aplicația rulează întotdeauna în fundal acceptat %1$s %s.]]> Condițiile vor fi acceptate pe: %s. Servere media și de fișiere adăugate - Încețoșare + Estompare - conectare la serviciul de directoare (BETA)!\n- confirmări de livrare (până la 20 de membri).\n- mai rapid și mai stabil. Arhivează contactele pentru a discuta mai târziu. %1$s.]]> Ai partajat o cale de fișier nevalidă. Raportează problema dezvoltatorilor aplicației. Deschideți în aplicația mobilă, apoi atingeți Conectați-vă în aplicație.]]> - Adăugați un link scurt + Adaugă link scurt Configurați operatorii serverului Condițiile vor fi acceptate pentru operatorii activați după 30 de zile. Faceți clic pe butonul de informații de lângă câmpul de adresă pentru a permite utilizarea microfonului. Colţ Puteți salva arhiva exportată. - Vei înceta să mai primești mesaje din acest chat. Istoricul chatului va fi păstrat. - Vei înceta să mai primești mesaje de la acest grup. Istoricul chatului va fi păstrat. + Nu veți mai primi mesaje de la acest chat. Istoricul conversației va fi păstrat. + Nu veți mai primi mesaje de la acest grup. Istoricul conversației va fi păstrat. Încercați să invitați persoana de contact cu care ați partajat un profil incognito în grupul în care utilizați profilul principal Poți partaja un link sau un cod QR - oricine se va putea alătura grupului. Nu vei pierde membrii grupului dacă îl ștergi ulterior. - Blochezi membrii pentru tot? + Blocați membrii pentru toți? Chat %s.]]> Condiții acceptate pe: %s. @@ -2306,20 +2305,20 @@ Permite raportarea mesajelor către moderatori. Conversează cu membrii Discută cu administratorii - Accepta + Acceptă Acceptă membru - Date mai bune pentru mesaje. - Performanță mai bună a grupurilor - Confidențialitate și securitate mai bune + Date de mesaj îmbunătățite. + Performanță îmbunătățită a grupurilor + Confidențialitate și securitate îmbunătățite %s este inactiv]]> %s lipsește]]> %1$s!]]> - Recunoscut - Erori de recunoaștere + Confirmat + Erori de confirmare Vi se va solicita să vă autentificați când porniți sau reluați aplicația după 30 de secunde în fundal. - conecta cu dezvoltatorii SimpleX Chat pentru a pune întrebări și pentru a primi actualizări.]]> + conecta la dezvoltatorii SimpleX Chat pentru a adresa orice întrebări și pentru a primi actualizări.]]> Adaugă prieteni - Adăugați membri în echipă + Adaugă membri echipei Chatul există deja! Deschideți în aplicația mobilă.]]> Continuă @@ -2328,20 +2327,20 @@ %s este ocupat]]> Nu puteți trimite mesaje! ați ieșit - nu pot trimite mesaje + nu se pot trimite mesaje contact șters contact dezactivat contactul nu este gata Profilul, contactele și mesajele livrate sunt stocate pe dispozitiv. Serverele tale ICE - Adaugă în listă + Adaugă la listă Modificați lista - te-a acceptat + invitație acceptată Puteți să vă împărtășiți adresa ca link sau cod QR - oricine se poate conecta la dvs. - Accepta + Acceptă Confidențialitatea dumneavoastră - Acceptați condițiile - Măriți + Acceptă condițiile + Zoom %1$s.]]> %1$s.]]> Bucăți încărcate @@ -2353,7 +2352,7 @@ Pictogramă de context Puteți vizualiza rapoartele dvs. în Chat cu administratorii. Schimbați ordinea - Vei fi conectat când dispozitivul contactului tău va fi online, te rugăm să aștepți sau să verifici mai târziu! + Vei fi conectat(ă) atunci când dispozitivul contactului tău este online, te rugăm să aștepți sau să verifici mai târziu! scana codul QR în apelul video sau contactul dvs. poate partaja un link de invitație.]]> Profilul tău %1$s va fi distribuit. Nu îți vei pierde contactele dacă ulterior îți ștergi adresa. @@ -2364,7 +2363,7 @@ Baza ta de date actuală de chat va fi ȘTERSĂ și ÎNLOCUITĂ cu cea importată.\nAceastă acțiune nu poate fi anulată - profilul, contactele, mesajele și fișierele tale vor fi pierdute iremediabil. Discută cu administratorii Poți partaja această adresă cu contactele tale pentru a le permite să se conecteze cu %s. - Discută cu emmbrul + Conversează cu membrul Cererea de conectare va fi trimisă acestui membru al grupului. Servere de mesaje adăugate %s cu motivul: %s]]> @@ -2378,7 +2377,7 @@ Tu decizi cine se poate conecta. Vei fi conectat când cererea ta de conectare va fi acceptată, te rugăm să aștepți sau să verifici mai târziu! Acceptați ca observator - O experiență mai bună pentru utilizator + Experiență de utilizare îmbunătățită 1 chat cu un membru Toate rapoartele vor fi arhivate pentru dvs. repozitoriul nostru GitHub.]]> @@ -2386,13 +2385,13 @@ Setări adresă Arhivare rapoarte Acceptă ca membru - totul - Întreprinderi - Prin utilizarea SimpleX Chat, sunteți de acord să:\n- trimiteți doar conținut legal în grupuri publice.\n- respectați ceilalți utilizatori – fără spam. + toți + Afaceri + Prin utilizarea SimpleX Chat sunteți de acord să:\n- trimiteți doar conținut legal în grupurile publice.\n- respectați ceilalți utilizatori – fără spam. cu un singur contact - partajați personal sau prin orice mesagerie.]]> Nu trebuie să utilizați aceeași bază de date pe două dispozitive. arătați codul QR în apelul video sau distribuiți linkul.]]> - Utilizare de pe desktop în aplicația mobilă și scanați codul QR.]]> + Utilizează de pe desktop în aplicația mobilă și scanați codul QR.]]> SimpleX rulează în fundal în loc să utilizeze notificări push.]]> Utilizarea bateriei aplicației / Nerestricționat în setările aplicației.]]> Bucăți descărcate @@ -2403,4 +2402,6 @@ Ai trimis o invitație la grup Ați respins invitația de grup Scanare cod QR.]]> - \ No newline at end of file + cererea a fost trimisă + Alătură-te grupului + diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml index 5920c311ac..42affa7a68 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml @@ -843,7 +843,7 @@ gruba davet edildiniz Hiç sohbetiniz yok Gözlemcisiniz - Mesajlar gönderemezsiniz! + sen gözlemcisin Güvenlik kodunu görüntüle Sesli mesaj gönderebilmeniz için kişinizin de sesli mesaj göndermesine izin vermeniz gerekir. XFTP sunucuları @@ -1201,7 +1201,7 @@ Mobilden tara Bağlantıları onayla Mesaj paylaş… - Önceki mesajın hash\'i farklı.\" + Önceki mesajın özeti veya karması farklı. SimpleX Kilit aktif değil! SimpleX Kilit Doğrudan bağlanılsın mı? @@ -2306,4 +2306,139 @@ Özel mesaj yönlendirmesi için sunucu yok. mesajlar gönderilemiyor Medya ve dosya sunucuları yok. + Anahtar deposundaki parola okunamıyor. Bu, uygulamayla uyumsuz bir sistem güncellemesinden sonra gerçekleşmiş olabilir. Eğer durum bu değilse, lütfen geliştiricilerle iletişime geçin. + reddedildi + %s sunucuları + Güncellenen koşullar + Sadece siz ve moderatörler görebilir. + Sadece gönderen ve moderatörler görebilir. + Daha sonra oluşturmak için menüden SimpleX adresi oluştur seçeneğine dokunun. + Operatör + Dosyalar için kullanın + Sohbetlerde mesajların geçerlilik süresini ayarlayın. + İstenmeyen + Dosya göndermek için sunucu yok. + Dosyaları alacak sunucu yok. + Teslim edilmeyen mesajlar + Bağlantınızın değiştirilmesini önlemek için, iletişim güvenlik kodlarını karşılaştırabilirsiniz. + gruptan çıkarıldı + Notlar + senkronize değil + Özel medya dosya adları. + bağlanmak için talep edildi + Tek seferlik bağlantıyı bir arkadaşınızla paylaşın + Mesaj gönderemezsiniz! + uyarı + %s Kullanın + -İlk okunmamış mesaja sohbeti aç.\n- Alıntılanan mesajlara git. + Güncellenen koşulları görüntüleyin + Veya arşiv dosyasını içe aktarın + İstenmeyen + Uygulama, her konuşmada farklı operatörler kullanarak gizliliğinizi korur. + Rol %s olarak değiştirilecek. Sohbetteki herkes bilgilendirilecek. + Okunmamış bahsetmeler + Koşulları gözden geçirin + Sohbet profiliniz sohbet üyelerine gönderilecektir. + Sunucularınız + Açık koşullar + Bu işlem geri alınamaz - seçilen tarihten önce bu sohbette gönderilen ve alınan mesajlar silinecektir. + Bağlantının kimlerle paylaşıldığını hatırlamak için bağlantı adını ayarlayabilirsiniz. + SimpleX adresini sosyal medyada paylaşın. + Web sitesi + Desteklenmeyen bağlantı bağlantısı + Rapor + SimpleX adresi ve tek kullanımlık bağlantılar herhangi bir mesajlaşma uygulaması üzerinden güvenle paylaşılabilir. + Kısa bağlantı + Giriş ayarlarını kaydetmek ister misiniz? + Özel sohbetler, gruplar ve kişileriniz sunucu operatörleri tarafından erişilemez. + Birden fazla operatör etkinleştirildiğinde, hiçbirinin kimin kiminle iletişim kurduğunu öğrenmek için meta verisi yoktur. + Kullanılacak ağ operatörlerini seçin. + Güncelleme + Ağ ve sunucular ayarlarında operatörleri yapılandırabilirsiniz. + Bağlantıyı aç + Anahtar deposundaki parola okunamıyor, lütfen elle girin. Bu, uygulamayla uyumsuz bir sistem güncellemesinden sonra meydana gelmiş olabilir. Eğer durum bu değilse, lütfen geliştiricilerle iletişime geçin. + Bu üyeyi kabul ettiniz. + Lütfen grup moderatörlerinin gruba katılma isteğinizi incelemesini bekleyin. + Açık değişiklikler + Koşulları görüntüle + Üye kabulü + Uygulamadaki ikinci önceden ayarlanmış operatör! + Kısa bağlantı ekle + Gizlilik politikası ve kullanım koşulları. + Daha sonra incele + Sunucu operatörleri + SimpleX Chat ve Flux, Flux tarafından işletilen sunucuların uygulamaya dahil edilmesi konusunda bir anlaşma yaptı. + Sohbet listesinden bağlantıları aç + Evet + Web bağlantısını açmak ister misiniz? + beklemede + onay bekliyor + inceleme + Üyeleri kaldırmak mı? + Tüm üyeler için engellemeyi kaldırmak mı? + Sunucu protokolü değiştirildi. + Sunucuları kullanın + Operatör sunucusu + Sunucu operatöre %s eklendi. + Sunucu operatörü değişti. + Moderatörlere mesaj gönderilmesini yasaklayın. + Üyeyi reddetmek mi? + Özel raporlar gönder + %s ile aç + Şeffaflık + Ulaşılabilir sohbet araç çubuğu + Bu sohbetten mesaj almayı durduracaksınız. Sohbet geçmişi korunacaktır. + Alıcı + Müşterilerinizin gizliliği. + reddedildi + Sohbet adını ayarla… + Her mesajda en fazla %1$s üyeye atıfta bulunabilirsiniz! + İletileri alacak sunucu yok. + Bu mesaj silindi veya henüz alınmadı. + Lütfen mesaj boyutunu küçültün ve tekrar gönderin. + Lütfen mesaj boyutunu küçültün veya medyayı kaldırın ve tekrar gönderin. + Üye profilini bildir: yalnızca grup moderatörleri görebilir. + Spam bildir: Yalnızca grup moderatörleri bunu görebilir. + İhlali bildir: Yalnızca grup moderatörleri bunu görebilir. + Mesajı kopyalayıp boyutunu küçülterek gönderebilirsiniz. + Rapor içeriği: Yalnızca grup moderatörleri görebilir. + Diğerlerini bildir: Yalnızca grup moderatörleri bunu görebilir. + Moderatörlere gönderilen rapor + Raporlarınızı yöneticilerle sohbet bölümünde görüntüleyebilirsiniz. + Ayarlar aracılığıyla sunucuları yapılandırabilirsiniz. + Uzaktan kumandalı cep telefonları + kapalı + İnceleme üyeleri + Kabul etmeden önce üyeleri inceleyin (kapıyı çalın). + Bildirimler ve pil + inceleme bekliyor + Kapalı + Önceden ayarlanmış sunucular + Önceden ayarlanmış sunucular için yalnızca TCP bağlantı noktası 443\'ü kullanın. + Sohbet sahipleri tercihleri değiştirebilir. + Sohbetleri listeler halinde düzenleyin + Önceden ayarlanmış sunucular + Mesajlar için kullanın + Mevcut sohbet profilinizin yeni dosyaları için sunucular + Bu grupta mesajların bildirilmesi yasaktır. + Reddet + Bağlantı, teslim edilemeyen mesajların sınırına ulaştı, bağlantınız çevrimdışı olabilir. + Bu bağlantı için daha yeni bir uygulama sürümü gereklidir. Lütfen uygulamayı güncelleyin veya irtibat kişinizden uyumlu bir bağlantı göndermesini isteyin. + Rapor nedeni? + Rapor sizin için arşivlenecektir. + Okunmamış sohbet yok + Rapor: %s + Raporlar + katılma talebi reddedildi + yöneticiler tarafından incelenmiştir + sen ayrıldın + Adresi herkese açık olarak paylaş + Port belirtilmediğinde TCP portu %1$s kullanın. + Veya özel olarak paylaşmak için + SimpleX adresi mi yoksa tek kullanımlık bağlantı mı? + Listeyi kaydet + Göndermek için + SimpleX kanal bağlantısı + Mesajlaşma için TCP bağlantı noktası + Web bağlantı noktasını kullan diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml index 2904d2d8ca..b71350ea50 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/vi/strings.xml @@ -1944,7 +1944,7 @@ Ứng dụng tìm nhận tin nhắn mới một cách định kỳ - nó tiêu tốn một vài phần trăm pin mỗi ngày. Ứng dụng không sử dụng thông báo đẩy - dữ liệu ở thiết bị của bạn không được gửi đi tới máy chủ nào. Mã mà bạn đã quét không phải là một mã QR dẫn SimpleX. Chủ đề - Mã băm của tin nhắn trước có sự khác biệt.\" + Mã băm của tin nhắn trước có sự khác biệt. ID của tin nhắn tiếp theo là không chính xác (nhỏ hơn hoặc bằng với cái trước).\nViệc này có thể xảy ra do một vài lỗi hoặc khi kết nối bị xâm phạm. Nỗ lực đổi mật khẩu cơ sở dữ liệu đã không được hoàn thành. Tên thiết bị sẽ được chia sẻ với thiết bị di động đã được kết nối. @@ -2243,7 +2243,7 @@ Bạn có thể chia sẻ địa chỉ của mình dưới dạng một đường dẫn hoặc mã QR - bất kỳ ai cũng có thể kết nối với bạn. Bạn có thể xem đường dẫn mời lần nữa trong chi tiết kết nối. Bạn kiểm soát cuộc trò chuyện của mình! - Bạn không thể gửi tin nhắn! + bạn là quan sát viên Bạn có thể chia sẻ địa chỉ này với các liên hệ của mình để họ kết nối với %s. Bạn cần cho phép liên hệ của mình gửi tin nhắn thoại để có thể gửi cho họ. Bạn có thể di chuyển cơ sở dữ liệu đã được xuất. @@ -2361,4 +2361,53 @@ Các máy chủ cài sẵn Chỉ sử dụng cổng TCP 443 cho các máy chủ cài sẵn. Tất cả máy chủ + Lỗi chấp nhận thành viên + %d cuộc trò chuyện với thành viên + %d tin nhắn + đã chấp nhận %1$s + đã chấp nhận bạn + Vui lòng đợi các kiểm duyệt viên nhóm xem xét yêu cầu tham gia nhóm của bạn. + Thành viên mới muốn tham gia nhóm. + tất cả + Thu nạp thành viên + tắt + Xem xét các thành viên + Thêm đường dẫn ngắn + Trò chuyện với các quản trị viên + Trò chuyện với thành viên + Chấp nhận thành viên + Chấp nhận là thành viên + Thành viên sẽ tham gia nhóm, chấp nhận thành viên? + Chấp nhận là quan sát viên + đã được xem xét bởi các quản trị viên + Chấp nhận + đang chờ xem xét + xem xét + Không có cuộc trò chuyện nào với thành viên + Các cuộc trò chuyện với thành viên + 1 cuộc trò chuyện với 1 thành viên + %d cuộc trò chuyện + liên hệ đã bị xóa + liên hệ chưa sẵn sàng + chưa được đồng bộ hóa + Báo cáo đã được gửi cho các kiểm duyệt viên + không thể gửi tin nhắn + liên hệ đã bị vô hiệu hóa + nhóm đã bị xóa + đã xóa khỏi nhóm + yêu cầu tham gia đã bị từ chối + thành viên có phiên bản cũ + Xóa cuộc trò chuyện + Xóa cuộc trò chuyện với thành viên? + Trò chuyện với các quản trị viên + Từ chối + Từ chối thành viên? + Lỗi xóa cuộc trò chuyện với thành viên + bạn đã chấp nhận thành viên này + Xem xét các thành viên trước khi chấp nhận (knocking). + Lưu cài đặt thu nạp? + Đặt thu nạp thành viên + Bạn không thể gửi tin nhắn! + Bạn có thể xem các báo cáo của mình trong Cuộc trò chuyện với các quản trị viên. + bạn đã rời đi diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml index bdcb89b161..40293c4ddb 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -861,7 +861,7 @@ %1$d 条已跳过消息 %ds 更新内容 - 你被邀请加入群 + 你受邀加入群 你没有聊天记录 等待图像中 语音消息 @@ -1173,7 +1173,7 @@ 与你的联系人保持连接。 与联系人分享 邀请朋友 - 保存自动接受设置 + 保存 SimpleX 地址设置 保存设置? 停止分享 你好! @@ -1365,7 +1365,7 @@ 打开 创建成员联系人时出错 发送私信来连接 - 发送私信 + 发送私信来连接 已直连 展开 重复连接请求吗? @@ -2059,7 +2059,7 @@ 你的凭据可能以未经加密的方式被发送。 使用随机凭据 用户名 - 分享配置文件 + 分享资料 转发消息出错 在你选中消息后这些消息已被删除。 %1$d 个文件错误:\n%2$s @@ -2423,4 +2423,37 @@ 联系人未就绪 拒绝成员? 添加短链接 + 接受联络请求 + 添加消息 + 端到端加密.]]> + 仅在你的请求被接收后.]]> + 连接 + 联系人应当接受… + 更改联系用户出错 + 更改群用户出错 + 准备联系时出错 + 准备群时出错 + 拒绝联络请求出错 + 加群 + 打开聊天 + 打开新聊天 + 打开新群 + 打开以接受 + 打开以连接 + 打开以加入 + 个人资料将通过地址链接分享。 + 拒绝联络请求 + 发送了请求 + 发送联络请求? + 发送请求 + 发送无消息请求 + 连接后发送给你的联系人。 + 通过链接分享群资料 + 分享资料 + 通过链接分享资料 + 不会通知发送者。 + 欢迎消息 + 你的个人资料 + 无法更改个人资料 + 要在连接尝试后使用不同的个人资料,请删除聊天并再次使用该链接。 From fa5927ddaa6a0cfed3cee6250a7f00658f27e472 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 7 Jul 2025 17:44:29 +0100 Subject: [PATCH 04/18] ui: whats new v6.4 (#6049) --- apps/ios/Shared/Views/Chat/ChatInfoView.swift | 6 +-- .../Views/Chat/Group/GroupChatInfoView.swift | 3 +- .../Views/Helpers/CustomTimePicker.swift | 16 +++++--- .../Views/Onboarding/WhatsNewView.swift | 31 ++++++++++++++ .../AdvancedNetworkSettings.swift | 6 +-- .../Views/UserSettings/PrivacySettings.swift | 3 +- .../bg.xcloc/Localized Contents/bg.xliff | 32 +++++++++++++++ .../cs.xcloc/Localized Contents/cs.xliff | 32 +++++++++++++++ .../de.xcloc/Localized Contents/de.xliff | 32 +++++++++++++++ .../en.xcloc/Localized Contents/en.xliff | 40 +++++++++++++++++++ .../es.xcloc/Localized Contents/es.xliff | 32 +++++++++++++++ .../fi.xcloc/Localized Contents/fi.xliff | 32 +++++++++++++++ .../fr.xcloc/Localized Contents/fr.xliff | 32 +++++++++++++++ .../hu.xcloc/Localized Contents/hu.xliff | 32 +++++++++++++++ .../it.xcloc/Localized Contents/it.xliff | 32 +++++++++++++++ .../ja.xcloc/Localized Contents/ja.xliff | 32 +++++++++++++++ .../nl.xcloc/Localized Contents/nl.xliff | 32 +++++++++++++++ .../pl.xcloc/Localized Contents/pl.xliff | 32 +++++++++++++++ .../ru.xcloc/Localized Contents/ru.xliff | 34 +++++++++++++++- .../th.xcloc/Localized Contents/th.xliff | 32 +++++++++++++++ .../tr.xcloc/Localized Contents/tr.xliff | 32 +++++++++++++++ .../uk.xcloc/Localized Contents/uk.xliff | 32 +++++++++++++++ .../Localized Contents/zh-Hans.xliff | 32 +++++++++++++++ apps/ios/SimpleXChat/ChatTypes.swift | 2 +- apps/ios/ru.lproj/Localizable.strings | 2 +- .../chat/simplex/common/model/ChatModel.kt | 2 +- .../common/views/onboarding/WhatsNewView.kt | 32 +++++++++++++++ .../commonMain/resources/MR/base/strings.xml | 9 +++++ .../resources/MR/images/ic_chat_person.svg | 1 + .../MR/images/ic_contact_support.svg | 1 + 30 files changed, 647 insertions(+), 21 deletions(-) create mode 100644 apps/multiplatform/common/src/commonMain/resources/MR/images/ic_chat_person.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/MR/images/ic_contact_support.svg diff --git a/apps/ios/Shared/Views/Chat/ChatInfoView.swift b/apps/ios/Shared/Views/Chat/ChatInfoView.swift index c8cb131e2e..1cf017d8ea 100644 --- a/apps/ios/Shared/Views/Chat/ChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatInfoView.swift @@ -493,14 +493,13 @@ struct ChatInfoView: View { } private func sendReceiptsOption() -> some View { - Picker(selection: $sendReceipts) { + WrappedPicker(selection: $sendReceipts) { ForEach([.yes, .no, .userDefault(sendReceiptsUserDefault)]) { (opt: SendReceipts) in Text(opt.text) } } label: { Label("Send receipts", systemImage: "checkmark.message") } - .frame(height: 36) .onChange(of: sendReceipts) { _ in setSendReceipts() } @@ -663,7 +662,7 @@ struct ChatTTLOption: View { @State private var chatItemTTL: ChatTTL = ChatTTL.chat(.seconds(0)) var body: some View { - Picker("Delete messages after", selection: $chatItemTTL) { + WrappedPicker("Delete messages after", selection: $chatItemTTL) { ForEach(ChatItemTTL.values) { ttl in Text(ttl.deleteAfterText).tag(ChatTTL.chat(ttl)) } @@ -675,7 +674,6 @@ struct ChatTTLOption: View { } } .disabled(progressIndicator) - .frame(height: 36) .onChange(of: chatItemTTL) { ttl in if ttl == currentChatItemTTL { return } setChatTTL( diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index 9f5b687b8a..2f36e5fa93 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -746,14 +746,13 @@ struct GroupChatInfoView: View { } private func sendReceiptsOption() -> some View { - Picker(selection: $sendReceipts) { + WrappedPicker(selection: $sendReceipts) { ForEach([.yes, .no, .userDefault(sendReceiptsUserDefault)]) { (opt: SendReceipts) in Text(opt.text) } } label: { Label("Send receipts", systemImage: "checkmark.message") } - .frame(height: 36) .onChange(of: sendReceipts) { _ in setSendReceipts() } diff --git a/apps/ios/Shared/Views/Helpers/CustomTimePicker.swift b/apps/ios/Shared/Views/Helpers/CustomTimePicker.swift index 32fc541604..edb10ef87d 100644 --- a/apps/ios/Shared/Views/Helpers/CustomTimePicker.swift +++ b/apps/ios/Shared/Views/Helpers/CustomTimePicker.swift @@ -220,20 +220,26 @@ struct DropdownCustomTimePicker: View { } } -struct WrappedPicker: View { - var title: LocalizedStringKey +struct WrappedPicker: View { var selection: Binding @ViewBuilder var content: () -> Content + @ViewBuilder var label: () -> Label - init(_ title: LocalizedStringKey, selection: Binding, @ViewBuilder content: @escaping () -> Content) { - self.title = title + init(_ title: LocalizedStringKey, selection: Binding, @ViewBuilder content: @escaping () -> Content) where Label == Text { self.selection = selection self.content = content + self.label = { Text(title) } + } + + init(selection: Binding, @ViewBuilder content: @escaping () -> Content, @ViewBuilder label: @escaping () -> Label) { + self.selection = selection + self.content = content + self.label = label } var body: some View { HStack(alignment: .firstTextBaseline) { - Text(title).lineLimit(2) + label() Spacer() Picker(selection: selection, content: content) { EmptyView() diff --git a/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift b/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift index f65a21623a..2d15a89e13 100644 --- a/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift +++ b/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift @@ -579,6 +579,37 @@ private let versionDescriptions: [VersionDescription] = [ )), ] ), + VersionDescription( + version: "v6.4", + post: URL(string: "https://simplex.chat/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html"), + features: [ + .feature(Description( + icon: "person", + title: "Connect faster! 🚀", + description: "Message instantly once you tap Connect." + )), + .feature(Description( + icon: { if #available(iOS 17, *) {"person.bubble"} else {"person.crop.square"} }(), + title: "Review group members", + description: "Chat with members before they join." + )), + .feature(Description( + icon: { if #available(iOS 16, *) {"questionmark.bubble"} else {"questionmark.square"} }(), + title: "Chat with admins", + description: "Send your private feedback to groups." + )), + .feature(Description( + icon: "flag", + title: "New group role: moderator", + description: "Removes messages and blocks members." + )), + .feature(Description( + icon: "battery.50", + title: "Improved message delivery", + description: "Less traffic on mobile networks." + )), + ] + ), ] private let lastVersion = versionDescriptions.last!.version diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AdvancedNetworkSettings.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AdvancedNetworkSettings.swift index 7bcf542701..3a536c7b17 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AdvancedNetworkSettings.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AdvancedNetworkSettings.swift @@ -195,13 +195,12 @@ struct AdvancedNetworkSettings: View { if developerTools { Section { - Picker("Transport isolation", selection: $netCfg.sessionMode) { + WrappedPicker("Transport isolation", selection: $netCfg.sessionMode) { let modes = TransportSessionMode.values.contains(netCfg.sessionMode) ? TransportSessionMode.values : TransportSessionMode.values + [netCfg.sessionMode] ForEach(modes, id: \.self) { Text($0.text) } } - .frame(height: 36) } footer: { sessionModeInfo(netCfg.sessionMode) .foregroundColor(theme.colors.secondary) @@ -209,10 +208,9 @@ struct AdvancedNetworkSettings: View { } Section { - Picker("Use web port", selection: $netCfg.smpWebPortServers) { + WrappedPicker("Use web port", selection: $netCfg.smpWebPortServers) { ForEach(SMPWebPortServers.allCases, id: \.self) { Text($0.text) } } - .frame(height: 36) } header: { Text("TCP port for messaging") } footer: { diff --git a/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift b/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift index 0d34242569..5a9ffe5c8b 100644 --- a/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift +++ b/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift @@ -119,7 +119,7 @@ struct PrivacySettings: View { } } settingsRow("circle.filled.pattern.diagonalline.rectangle", color: theme.colors.secondary) { - Picker("Blur media", selection: $privacyMediaBlurRadius) { + WrappedPicker("Blur media", selection: $privacyMediaBlurRadius) { let values = [0, 12, 24, 48] + ([0, 12, 24, 48].contains(privacyMediaBlurRadius) ? [] : [privacyMediaBlurRadius]) ForEach(values, id: \.self) { radius in let text: String = switch radius { @@ -133,7 +133,6 @@ struct PrivacySettings: View { } } } - .frame(height: 36) settingsRow("network.badge.shield.half.filled", color: theme.colors.secondary) { Toggle("Protect IP address", isOn: $askToApproveRelays) } diff --git a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff index 5aff4e8c37..dc844a0e22 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -1568,6 +1568,10 @@ set passcode view Chat with member No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Чатове @@ -1780,6 +1784,10 @@ set passcode view Автоматично свъзрване No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Свързване с настолно устройство @@ -4444,6 +4452,10 @@ This is your link for group %@! Напусни групата? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Нека да поговорим в SimpleX Chat @@ -4678,6 +4690,10 @@ This is your link for group %@! Message forwarded item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. item status description @@ -4990,6 +5006,10 @@ This is your link for group %@! New events notification + + New group role: moderator + No comment provided by engineer. + New in %@ Ново в %@ @@ -6116,6 +6136,10 @@ swipe action Премахване на паролата от keychain? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Предоговоряне @@ -6279,6 +6303,10 @@ swipe action Review conditions No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members admission stage @@ -6643,6 +6671,10 @@ chat item action Изпращане до последните 100 съобщения на нови членове. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Подателят отмени прехвърлянето на файла. diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index 8d4b87d7d2..b432237bfe 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -1492,6 +1492,10 @@ set passcode view Chat with member No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Chaty @@ -1698,6 +1702,10 @@ set passcode view Connect automatically No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop No comment provided by engineer. @@ -4278,6 +4286,10 @@ This is your link for group %@! Opustit skupinu? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Promluvme si v SimpleX Chatu @@ -4508,6 +4520,10 @@ This is your link for group %@! Message forwarded item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. item status description @@ -4804,6 +4820,10 @@ This is your link for group %@! New events notification + + New group role: moderator + No comment provided by engineer. + New in %@ Nový V %@ @@ -5903,6 +5923,10 @@ swipe action Odstranit přístupovou frázi z klíčenek? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Znovu vyjednat @@ -6062,6 +6086,10 @@ swipe action Review conditions No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members admission stage @@ -6418,6 +6446,10 @@ chat item action Send up to 100 last messages to new members. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Odesílatel zrušil přenos souboru. diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index 2e486db78d..1f826d6405 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -1624,6 +1624,10 @@ set passcode view Chat mit einem Mitglied No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Chats @@ -1859,6 +1863,10 @@ set passcode view Automatisch verbinden No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Mit dem Desktop verbinden @@ -4682,6 +4690,10 @@ Das ist Ihr Link für die Gruppe %@! Die Gruppe verlassen? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Lassen Sie uns in SimpleX Chat kommunizieren @@ -4932,6 +4944,10 @@ Das ist Ihr Link für die Gruppe %@! Nachricht weitergeleitet item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. Die Nachricht kann später zugestellt werden, wenn das Mitglied aktiv wird. @@ -5267,6 +5283,10 @@ Das ist Ihr Link für die Gruppe %@! Neue Ereignisse notification + + New group role: moderator + No comment provided by engineer. + New in %@ Neu in %@ @@ -6484,6 +6504,10 @@ swipe action Passwort aus dem Schlüsselbund entfernen? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Neu aushandeln @@ -6664,6 +6688,10 @@ swipe action Nutzungsbedingungen einsehen No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members Überprüfung der Mitglieder @@ -7055,6 +7083,10 @@ chat item action Bis zu 100 der letzten Nachrichten an neue Gruppenmitglieder senden. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Der Absender hat die Dateiübertragung abgebrochen. diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index 49f6d335ef..e64bc191c5 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -1624,6 +1624,11 @@ set passcode view Chat with member No comment provided by engineer. + + Chat with members before they join. + Chat with members before they join. + No comment provided by engineer. + Chats Chats @@ -1859,6 +1864,11 @@ set passcode view Connect automatically No comment provided by engineer. + + Connect faster! 🚀 + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Connect to desktop @@ -4682,6 +4692,11 @@ This is your link for group %@! Leave group? No comment provided by engineer. + + Less traffic on mobile networks. + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Let's talk in SimpleX Chat @@ -4932,6 +4947,11 @@ This is your link for group %@! Message forwarded item status text + + Message instantly once you tap Connect. + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. Message may be delivered later if member becomes active. @@ -5267,6 +5287,11 @@ This is your link for group %@! New events notification + + New group role: moderator + New group role: moderator + No comment provided by engineer. + New in %@ New in %@ @@ -6487,6 +6512,11 @@ swipe action Remove passphrase from keychain? No comment provided by engineer. + + Removes messages and blocks members. + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Renegotiate @@ -6667,6 +6697,11 @@ swipe action Review conditions No comment provided by engineer. + + Review group members + Review group members + No comment provided by engineer. + Review members Review members @@ -7058,6 +7093,11 @@ chat item action Send up to 100 last messages to new members. No comment provided by engineer. + + Send your private feedback to groups. + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Sender cancelled file transfer. diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff index cdd7908dee..2a26525e27 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -1621,6 +1621,10 @@ set passcode view Chat con miembro No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Chats @@ -1856,6 +1860,10 @@ set passcode view Conectar automáticamente No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Conectar con ordenador @@ -4673,6 +4681,10 @@ This is your link for group %@! ¿Salir del grupo? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Hablemos en SimpleX Chat @@ -4923,6 +4935,10 @@ This is your link for group %@! Mensaje reenviado item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. El mensaje podría ser entregado más tarde si el miembro vuelve a estar activo. @@ -5257,6 +5273,10 @@ This is your link for group %@! Eventos nuevos notification + + New group role: moderator + No comment provided by engineer. + New in %@ Nuevo en %@ @@ -6468,6 +6488,10 @@ swipe action ¿Eliminar contraseña de Keychain? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Renegociar @@ -6648,6 +6672,10 @@ swipe action Revisar condiciones No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members Revisar miembros @@ -7036,6 +7064,10 @@ chat item action Se envían hasta 100 mensajes más recientes a los miembros nuevos. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. El remitente ha cancelado la transferencia de archivos. diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index c064120eea..ba0db40e64 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -1471,6 +1471,10 @@ set passcode view Chat with member No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Keskustelut @@ -1677,6 +1681,10 @@ set passcode view Connect automatically No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop No comment provided by engineer. @@ -4254,6 +4262,10 @@ This is your link for group %@! Poistu ryhmästä? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Jutellaan SimpleX Chatissa @@ -4484,6 +4496,10 @@ This is your link for group %@! Message forwarded item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. item status description @@ -4779,6 +4795,10 @@ This is your link for group %@! New events notification + + New group role: moderator + No comment provided by engineer. + New in %@ Uutta %@ @@ -5877,6 +5897,10 @@ swipe action Poista tunnuslause avainnipusta? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Neuvottele uudelleen @@ -6036,6 +6060,10 @@ swipe action Review conditions No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members admission stage @@ -6391,6 +6419,10 @@ chat item action Send up to 100 last messages to new members. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Lähettäjä peruutti tiedoston siirron. diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff index aba30295a0..091d7e428c 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -1613,6 +1613,10 @@ set passcode view Chat with member No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Discussions @@ -1847,6 +1851,10 @@ set passcode view Connexion automatique No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Connexion au bureau @@ -4646,6 +4654,10 @@ Voici votre lien pour le groupe %@ ! Quitter le groupe ? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Discutons sur SimpleX Chat @@ -4888,6 +4900,10 @@ Voici votre lien pour le groupe %@ ! Message transféré item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. Le message peut être transmis plus tard si le membre devient actif. @@ -5218,6 +5234,10 @@ Voici votre lien pour le groupe %@ ! Nouveaux événements notification + + New group role: moderator + No comment provided by engineer. + New in %@ Nouveautés de la %@ @@ -6402,6 +6422,10 @@ swipe action Supprimer la phrase secrète de la keychain ? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Renégocier @@ -6571,6 +6595,10 @@ swipe action Vérifier les conditions No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members admission stage @@ -6952,6 +6980,10 @@ chat item action Envoi des 100 derniers messages aux nouveaux membres. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. L'expéditeur a annulé le transfert de fichiers. diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index 51c68e2507..f38d13a37f 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -1624,6 +1624,10 @@ set passcode view Csevegés a taggal No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Csevegések @@ -1859,6 +1863,10 @@ set passcode view Kapcsolódás automatikusan No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Társítás számítógéppel @@ -4682,6 +4690,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Elhagyja a csoportot? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Beszélgessünk a SimpleX Chatben @@ -4932,6 +4944,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Továbbított üzenet item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. Az üzenet később is kézbesíthető, ha a tag aktívvá válik. @@ -5267,6 +5283,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Új események notification + + New group role: moderator + No comment provided by engineer. + New in %@ Újdonságok a(z) %@ verzióban @@ -6484,6 +6504,10 @@ swipe action Eltávolítja a jelmondatot a kulcstartóból? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Újraegyeztetés @@ -6664,6 +6688,10 @@ swipe action Feltételek felülvizsgálata No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members Tagok áttekintése @@ -7055,6 +7083,10 @@ chat item action Legfeljebb az utolsó 100 üzenet elküldése az új tagok számára. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. A fájl küldője visszavonta az átvitelt. diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff index e111c97085..3ece2bb4c7 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -1624,6 +1624,10 @@ set passcode view Chatta con il membro No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Chat @@ -1859,6 +1863,10 @@ set passcode view Connetti automaticamente No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Connetti al desktop @@ -4682,6 +4690,10 @@ Questo è il tuo link per il gruppo %@! Uscire dal gruppo? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Parliamo in SimpleX Chat @@ -4932,6 +4944,10 @@ Questo è il tuo link per il gruppo %@! Messaggio inoltrato item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. Il messaggio può essere consegnato più tardi se il membro diventa attivo. @@ -5267,6 +5283,10 @@ Questo è il tuo link per il gruppo %@! Nuovi eventi notification + + New group role: moderator + No comment provided by engineer. + New in %@ Novità nella %@ @@ -6484,6 +6504,10 @@ swipe action Rimuovere la password dal portachiavi? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Rinegoziare @@ -6664,6 +6688,10 @@ swipe action Leggi le condizioni No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members Revisiona i membri @@ -7055,6 +7083,10 @@ chat item action Invia fino a 100 ultimi messaggi ai nuovi membri. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Il mittente ha annullato il trasferimento del file. diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index 3fc6010279..8aab64e0a0 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -1522,6 +1522,10 @@ set passcode view Chat with member No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats チャット @@ -1733,6 +1737,10 @@ set passcode view Connect automatically No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop デスクトップに接続 @@ -4327,6 +4335,10 @@ This is your link for group %@! グループを脱退しますか? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat SimpleXチャットで会話しよう @@ -4556,6 +4568,10 @@ This is your link for group %@! Message forwarded item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. item status description @@ -4855,6 +4871,10 @@ This is your link for group %@! New events notification + + New group role: moderator + No comment provided by engineer. + New in %@ %@ の新機能 @@ -5954,6 +5974,10 @@ swipe action キーチェーンからパスフレーズを削除しますか? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate 再ネゴシエート @@ -6113,6 +6137,10 @@ swipe action Review conditions No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members admission stage @@ -6467,6 +6495,10 @@ chat item action Send up to 100 last messages to new members. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. 送信者がファイル転送をキャンセルしました。 diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff index 0ff19632f0..f93a25ada9 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -1620,6 +1620,10 @@ set passcode view Chat met lid No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Chats @@ -1855,6 +1859,10 @@ set passcode view Automatisch verbinden No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Verbinden met desktop @@ -4670,6 +4678,10 @@ Dit is jouw link voor groep %@! Groep verlaten? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Laten we praten in SimpleX Chat @@ -4920,6 +4932,10 @@ Dit is jouw link voor groep %@! Bericht doorgestuurd item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. Het bericht kan later worden bezorgd als het lid actief wordt. @@ -5254,6 +5270,10 @@ Dit is jouw link voor groep %@! Nieuwe gebeurtenissen notification + + New group role: moderator + No comment provided by engineer. + New in %@ Nieuw in %@ @@ -6465,6 +6485,10 @@ swipe action Wachtwoord van de keychain verwijderen? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Opnieuw onderhandelen @@ -6645,6 +6669,10 @@ swipe action Voorwaarden bekijken No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members Leden beoordelen @@ -7031,6 +7059,10 @@ chat item action Stuur tot 100 laatste berichten naar nieuwe leden. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Afzender heeft bestandsoverdracht geannuleerd. diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index 892079f30f..e126ae7af6 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -1608,6 +1608,10 @@ set passcode view Chat with member No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Czaty @@ -1834,6 +1838,10 @@ set passcode view Łącz automatycznie No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Połącz do komputera @@ -4575,6 +4583,10 @@ To jest twój link do grupy %@! Opuścić grupę? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Porozmawiajmy w SimpleX Chat @@ -4815,6 +4827,10 @@ To jest twój link do grupy %@! Wiadomość przekazana item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. Wiadomość może zostać dostarczona później jeśli członek stanie się aktywny. @@ -5141,6 +5157,10 @@ To jest twój link do grupy %@! New events notification + + New group role: moderator + No comment provided by engineer. + New in %@ Nowość w %@ @@ -6308,6 +6328,10 @@ swipe action Usunąć hasło z pęku kluczy? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Renegocjuj @@ -6476,6 +6500,10 @@ swipe action Review conditions No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members admission stage @@ -6857,6 +6885,10 @@ chat item action Wysyłaj do 100 ostatnich wiadomości do nowych członków. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Nadawca anulował transfer pliku. diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index 1de284368e..4c88190193 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -1621,6 +1621,10 @@ set passcode view Чат с членом группы No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Чаты @@ -1856,6 +1860,10 @@ set passcode view Соединяться автоматически No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Подключиться к компьютеру @@ -4670,6 +4678,10 @@ This is your link for group %@! Выйти из группы? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Давайте поговорим в SimpleX Chat @@ -4920,6 +4932,10 @@ This is your link for group %@! Сообщение переслано item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. Сообщение может быть доставлено позже, если член группы станет активным. @@ -5254,6 +5270,10 @@ This is your link for group %@! Новые события notification + + New group role: moderator + No comment provided by engineer. + New in %@ Новое в %@ @@ -6465,6 +6485,10 @@ swipe action Удалить пароль из Keychain? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Пересогласовать @@ -6645,6 +6669,10 @@ swipe action Посмотреть условия No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members Одобрять членов @@ -7011,7 +7039,7 @@ chat item action Send receipts - Отправлять отчёты о доставке + Отчёты о доставке No comment provided by engineer. @@ -7034,6 +7062,10 @@ chat item action Отправить до 100 последних сообщений новым членам. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Отправитель отменил передачу файла. diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index 0d3139ded9..beb95dce15 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -1463,6 +1463,10 @@ set passcode view Chat with member No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats แชท @@ -1669,6 +1673,10 @@ set passcode view Connect automatically No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop No comment provided by engineer. @@ -4237,6 +4245,10 @@ This is your link for group %@! ออกจากกลุ่ม? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat มาคุยกันใน SimpleX Chat @@ -4467,6 +4479,10 @@ This is your link for group %@! Message forwarded item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. item status description @@ -4761,6 +4777,10 @@ This is your link for group %@! New events notification + + New group role: moderator + No comment provided by engineer. + New in %@ ใหม่ใน %@ @@ -5854,6 +5874,10 @@ swipe action ลบรหัสผ่านออกจาก keychain หรือไม่? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate เจรจาใหม่ @@ -6013,6 +6037,10 @@ swipe action Review conditions No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members admission stage @@ -6368,6 +6396,10 @@ chat item action Send up to 100 last messages to new members. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. ผู้ส่งยกเลิกการโอนไฟล์ diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff index 41868b8ea3..fd119353f1 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -1599,6 +1599,10 @@ set passcode view Chat with member No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Sohbetler @@ -1828,6 +1832,10 @@ set passcode view Otomatik olarak bağlan No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Bilgisayara bağlan @@ -4596,6 +4604,10 @@ Bu senin grup için bağlantın %@! Gruptan çıkılsın mı? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Hadi SimpleX Chat'te konuşalım @@ -4837,6 +4849,10 @@ Bu senin grup için bağlantın %@! Mesaj iletildi item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. Kullanıcı aktif olursa mesaj iletilebilir. @@ -5163,6 +5179,10 @@ Bu senin grup için bağlantın %@! New events notification + + New group role: moderator + No comment provided by engineer. + New in %@ %@ da yeni @@ -6330,6 +6350,10 @@ swipe action Anahtar Zinciri'ndeki parola silinsin mi? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Yeniden müzakere @@ -6498,6 +6522,10 @@ swipe action Review conditions No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members admission stage @@ -6879,6 +6907,10 @@ chat item action Yeni üyelere 100 adete kadar son mesajları gönderin. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Gönderici dosya gönderimini iptal etti. diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff index f77e6a984b..8bb674bb8a 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -1620,6 +1620,10 @@ set passcode view Чат з учасником No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats Чати @@ -1855,6 +1859,10 @@ set passcode view Підключення автоматично No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop Підключення до комп'ютера @@ -4668,6 +4676,10 @@ This is your link for group %@! Покинути групу? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat Поговоримо в чаті SimpleX @@ -4912,6 +4924,10 @@ This is your link for group %@! Повідомлення переслано item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. Повідомлення може бути доставлене пізніше, якщо користувач стане активним. @@ -5242,6 +5258,10 @@ This is your link for group %@! Нові події notification + + New group role: moderator + No comment provided by engineer. + New in %@ Нове в %@ @@ -6426,6 +6446,10 @@ swipe action Видалити парольну фразу з брелока? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate Переузгодьте @@ -6595,6 +6619,10 @@ swipe action Умови перегляду No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members admission stage @@ -6976,6 +7004,10 @@ chat item action Надішліть до 100 останніх повідомлень новим користувачам. No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. Відправник скасував передачу файлу. diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index 71ee0f716a..c02b633e9a 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -1615,6 +1615,10 @@ set passcode view Chat with member No comment provided by engineer. + + Chat with members before they join. + No comment provided by engineer. + Chats 聊天 @@ -1849,6 +1853,10 @@ set passcode view 自动连接 No comment provided by engineer. + + Connect faster! 🚀 + No comment provided by engineer. + Connect to desktop 连接到桌面 @@ -4659,6 +4667,10 @@ This is your link for group %@! 离开群组? No comment provided by engineer. + + Less traffic on mobile networks. + No comment provided by engineer. + Let's talk in SimpleX Chat 让我们一起在 SimpleX Chat 里聊天 @@ -4907,6 +4919,10 @@ This is your link for group %@! 消息已转发 item status text + + Message instantly once you tap Connect. + No comment provided by engineer. + Message may be delivered later if member becomes active. 如果 member 变为活动状态,则稍后可能会发送消息。 @@ -5241,6 +5257,10 @@ This is your link for group %@! 新事件 notification + + New group role: moderator + No comment provided by engineer. + New in %@ %@ 的新内容 @@ -6432,6 +6452,10 @@ swipe action 从钥匙串中删除密码? No comment provided by engineer. + + Removes messages and blocks members. + No comment provided by engineer. + Renegotiate 重新协商 @@ -6601,6 +6625,10 @@ swipe action 审阅条款 No comment provided by engineer. + + Review group members + No comment provided by engineer. + Review members admission stage @@ -6981,6 +7009,10 @@ chat item action 给新成员发送最多 100 条历史消息。 No comment provided by engineer. + + Send your private feedback to groups. + No comment provided by engineer. + Sender cancelled file transfer. 发送人已取消文件传输。 diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index daf7364a9b..cab0e3bda6 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -2447,7 +2447,7 @@ public enum GroupMemberRole: String, Identifiable, CaseIterable, Comparable, Cod public var id: Self { self } - public static var supportedRoles: [GroupMemberRole] = [.observer, .member, .admin, .owner] + public static var supportedRoles: [GroupMemberRole] = [.observer, .member, .moderator, .admin, .owner] public var text: String { switch self { diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings index dafb75c0a0..d131dcc641 100644 --- a/apps/ios/ru.lproj/Localizable.strings +++ b/apps/ios/ru.lproj/Localizable.strings @@ -4616,7 +4616,7 @@ chat item action */ "Send questions and ideas" = "Отправьте вопросы и идеи"; /* No comment provided by engineer. */ -"Send receipts" = "Отправлять отчёты о доставке"; +"Send receipts" = "Отчёты о доставке"; /* No comment provided by engineer. */ "Send request" = "Отправить запрос"; diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 5cd9f51f75..0a27cdddbf 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -2291,7 +2291,7 @@ enum class GroupMemberRole(val memberRole: String) { @SerialName("owner") Owner("owner"); companion object { - val selectableRoles: List = listOf(Observer, Member, Admin, Owner) + val selectableRoles: List = listOf(Observer, Member, Moderator, Admin, Owner) } val text: String get() = when (this) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt index 52eea3dd9d..8c88a04ded 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/onboarding/WhatsNewView.kt @@ -817,7 +817,39 @@ private val versionDescriptions: List = listOf( ) ), ) + ), + VersionDescription( + version = "v6.4", + post = "https://simplex.chat/blog/20250703-simplex-network-protocol-extension-for-securely-connecting-people.html", + features = listOf( + VersionFeature.FeatureDescription( + icon = MR.images.ic_person, + titleId = MR.strings.v6_4_connect_faster, + descrId = MR.strings.v6_4_connect_faster_descr + ), + VersionFeature.FeatureDescription( + icon = MR.images.ic_chat_person, + titleId = MR.strings.v6_4_review_members, + descrId = MR.strings.v6_4_review_members_descr + ), + VersionFeature.FeatureDescription( + icon = MR.images.ic_contact_support, + titleId = MR.strings.v6_4_support_chat, + descrId = MR.strings.v6_4_support_chat_descr + ), + VersionFeature.FeatureDescription( + icon = MR.images.ic_flag, + titleId = MR.strings.v6_4_role_moderator, + descrId = MR.strings.v6_4_role_moderator_descr + ), + VersionFeature.FeatureDescription( + icon = MR.images.ic_battery_3_bar, + titleId = MR.strings.v5_8_message_delivery, + descrId = MR.strings.v6_4_message_delivery_descr + ), + ) ) + ) private val lastVersion = versionDescriptions.last().version diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 00419c6703..f027fb2a6b 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -2418,6 +2418,15 @@ Better groups performance Faster sending messages. Faster deletion of groups. + Connect faster! 🚀 + Message instantly once you tap Connect. + Review group members + Chat with members before they join. + Chat with admins + Send your private feedback to groups. + New group role: moderator + Removes messages and blocks members. + Less traffic on mobile networks. View updated conditions diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_chat_person.svg b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_chat_person.svg new file mode 100644 index 0000000000..adfc09bd4a --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_chat_person.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_contact_support.svg b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_contact_support.svg new file mode 100644 index 0000000000..b06e925603 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_contact_support.svg @@ -0,0 +1 @@ + \ No newline at end of file From 9ff29f3afd0440e4884a412c25b0636e5f71d33d Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Mon, 7 Jul 2025 20:20:55 +0100 Subject: [PATCH 05/18] 6.4-beta.5: ios 288, android 301, desktop 110 --- .../Views/Onboarding/WhatsNewView.swift | 2 +- .../bg.xcloc/Localized Contents/bg.xliff | 4 ++-- .../cs.xcloc/Localized Contents/cs.xliff | 4 ++-- .../de.xcloc/Localized Contents/de.xliff | 4 ++-- .../en.xcloc/Localized Contents/en.xliff | 6 +++--- .../es.xcloc/Localized Contents/es.xliff | 4 ++-- .../fi.xcloc/Localized Contents/fi.xliff | 4 ++-- .../fr.xcloc/Localized Contents/fr.xliff | 4 ++-- .../hu.xcloc/Localized Contents/hu.xliff | 4 ++-- .../it.xcloc/Localized Contents/it.xliff | 4 ++-- .../ja.xcloc/Localized Contents/ja.xliff | 4 ++-- .../nl.xcloc/Localized Contents/nl.xliff | 4 ++-- .../pl.xcloc/Localized Contents/pl.xliff | 4 ++-- .../ru.xcloc/Localized Contents/ru.xliff | 4 ++-- .../th.xcloc/Localized Contents/th.xliff | 4 ++-- .../tr.xcloc/Localized Contents/tr.xliff | 4 ++-- .../uk.xcloc/Localized Contents/uk.xliff | 4 ++-- .../Localized Contents/zh-Hans.xliff | 4 ++-- apps/ios/SimpleX.xcodeproj/project.pbxproj | 20 +++++++++---------- .../commonMain/resources/MR/base/strings.xml | 2 +- apps/multiplatform/gradle.properties | 8 ++++---- 21 files changed, 51 insertions(+), 51 deletions(-) diff --git a/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift b/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift index 2d15a89e13..5327a5e796 100644 --- a/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift +++ b/apps/ios/Shared/Views/Onboarding/WhatsNewView.swift @@ -600,7 +600,7 @@ private let versionDescriptions: [VersionDescription] = [ )), .feature(Description( icon: "flag", - title: "New group role: moderator", + title: "New group role: Moderator", description: "Removes messages and blocks members." )), .feature(Description( diff --git a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff index dc844a0e22..4fc9a7de98 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -5006,8 +5006,8 @@ This is your link for group %@! New events notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index b432237bfe..7588714922 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -4820,8 +4820,8 @@ This is your link for group %@! New events notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index 1f826d6405..122bfe3d3c 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -5283,8 +5283,8 @@ Das ist Ihr Link für die Gruppe %@! Neue Ereignisse notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index e64bc191c5..033c349609 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -5287,9 +5287,9 @@ This is your link for group %@! New events notification - - New group role: moderator - New group role: moderator + + New group role: Moderator + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff index 2a26525e27..52ba64a4ac 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -5273,8 +5273,8 @@ This is your link for group %@! Eventos nuevos notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index ba0db40e64..d320b429cb 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -4795,8 +4795,8 @@ This is your link for group %@! New events notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff index 091d7e428c..053dc803fb 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -5234,8 +5234,8 @@ Voici votre lien pour le groupe %@ ! Nouveaux événements notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index f38d13a37f..9fba98af31 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -5283,8 +5283,8 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Új események notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff index 3ece2bb4c7..0db1dcf4c5 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -5283,8 +5283,8 @@ Questo è il tuo link per il gruppo %@! Nuovi eventi notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index 8aab64e0a0..8378d9ce05 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -4871,8 +4871,8 @@ This is your link for group %@! New events notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff index f93a25ada9..275c521b05 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -5270,8 +5270,8 @@ Dit is jouw link voor groep %@! Nieuwe gebeurtenissen notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index e126ae7af6..e797362e5e 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -5157,8 +5157,8 @@ To jest twój link do grupy %@! New events notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index 4c88190193..a47a619438 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -5270,8 +5270,8 @@ This is your link for group %@! Новые события notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index beb95dce15..eb2ca322a9 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -4777,8 +4777,8 @@ This is your link for group %@! New events notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff index fd119353f1..9bb5df2ac6 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -5179,8 +5179,8 @@ Bu senin grup için bağlantın %@! New events notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff index 8bb674bb8a..de20729f90 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -5258,8 +5258,8 @@ This is your link for group %@! Нові події notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index c02b633e9a..fab1b8d1dc 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -5257,8 +5257,8 @@ This is your link for group %@! 新事件 notification - - New group role: moderator + + New group role: Moderator No comment provided by engineer. diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 4b68bf8acc..2582eb43bc 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -1995,7 +1995,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 287; + CURRENT_PROJECT_VERSION = 288; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2045,7 +2045,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 287; + CURRENT_PROJECT_VERSION = 288; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2087,7 +2087,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 287; + CURRENT_PROJECT_VERSION = 288; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2107,7 +2107,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 287; + CURRENT_PROJECT_VERSION = 288; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2132,7 +2132,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 287; + CURRENT_PROJECT_VERSION = 288; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GCC_OPTIMIZATION_LEVEL = s; @@ -2169,7 +2169,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 287; + CURRENT_PROJECT_VERSION = 288; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_CODE_COVERAGE = NO; @@ -2206,7 +2206,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 287; + CURRENT_PROJECT_VERSION = 288; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2257,7 +2257,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 287; + CURRENT_PROJECT_VERSION = 288; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2308,7 +2308,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 287; + CURRENT_PROJECT_VERSION = 288; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -2342,7 +2342,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 287; + CURRENT_PROJECT_VERSION = 288; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index f027fb2a6b..db1bb5d74d 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -2424,7 +2424,7 @@ Chat with members before they join. Chat with admins Send your private feedback to groups. - New group role: moderator + New group role: Moderator Removes messages and blocks members. Less traffic on mobile networks. View updated conditions diff --git a/apps/multiplatform/gradle.properties b/apps/multiplatform/gradle.properties index 2a4d2de6c2..506d47d36b 100644 --- a/apps/multiplatform/gradle.properties +++ b/apps/multiplatform/gradle.properties @@ -24,13 +24,13 @@ android.nonTransitiveRClass=true kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.jvm.target=11 -android.version_name=6.4-beta.4 -android.version_code=300 +android.version_name=6.4-beta.5 +android.version_code=301 android.bundle=false -desktop.version_name=6.4-beta.4 -desktop.version_code=109 +desktop.version_name=6.4-beta.5 +desktop.version_code=110 kotlin.version=1.9.23 gradle.plugin.version=8.2.0 From 3a532f2e31917a536d3454766fce83ab255a435d Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 7 Jul 2025 20:30:24 +0100 Subject: [PATCH 06/18] website: translations (#6050) * Translated using Weblate (Italian) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/it/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/hu/ --------- Co-authored-by: Random Co-authored-by: summoner001 --- website/langs/hu.json | 8 ++++---- website/langs/it.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/website/langs/hu.json b/website/langs/hu.json index 91dbe94cb1..a7f6df0c58 100644 --- a/website/langs/hu.json +++ b/website/langs/hu.json @@ -21,7 +21,7 @@ "chat-protocol": "Csevegési protokoll", "donate": "Adományozás", "copyright-label": "© 2020-2025 SimpleX | Nyílt forráskódú projekt", - "simplex-chat-protocol": "A SimpleX Chat-protokoll", + "simplex-chat-protocol": "A SimpleX Chat protokoll", "terminal-cli": "Terminál CLI", "terms-and-privacy-policy": "Adatvédelmi irányelvek", "hero-header": "Újraértelmezett adatvédelem", @@ -64,9 +64,9 @@ "simplex-private-card-6-point-2": "Ennek megakadályozása érdekében a SimpleX-alkalmazások egyszeri kulcsokat adnak át sávon kívül, amikor egy címet hivatkozásként vagy QR-kódként oszt meg.", "simplex-private-card-7-point-1": "Az integritás garantálása érdekében az üzenetek sorszámozással vannak ellátva, és tartalmazzák az előző üzenet hasítóértékét.", "simplex-private-card-7-point-2": "Ha bármilyen üzenetet hozzáadnak, eltávolítanak vagy módosítanak, a címzett értesítést kap róla.", - "simplex-private-card-8-point-1": "A SimpleX-kiszolgálók alacsony késleltetésű keverési csomópontokként működnek — a bejövő és kimenő üzenetek sorrendje eltérő.", + "simplex-private-card-8-point-1": "A SimpleX kiszolgálók alacsony késleltetésű keverési csomópontokként működnek — a bejövő és kimenő üzenetek sorrendje eltérő.", "simplex-private-card-9-point-1": "Minden üzenetsorbaállítás egy irányba továbbítja az üzeneteket, a különböző küldési és vételi címekkel.", - "simplex-private-card-9-point-2": "Kevesebb támadási felülettel rendelkezik, mint a hagyományos üzenetváltó alkalmazások, és kevesebb metaadatot tesz elérhetővé.", + "simplex-private-card-9-point-2": "Kevesebb támadási felülettel rendelkezik, mint a hagyományos üzenetváltó-alkalmazások, és kevesebb metaadatot tesz elérhetővé.", "simplex-private-card-10-point-1": "A SimpleX ideiglenes, névtelen, páros címeket és hitelesítő adatokat használ minden egyes felhasználói kapcsolathoz vagy csoporttaghoz.", "simplex-private-card-10-point-2": "Lehetővé teszi az üzenetek felhasználói profilazonosítók nélküli kézbesítését, ami az alternatíváknál jobb metaadat-védelmet biztosít.", "privacy-matters-1-overlay-1-title": "Az adatvédelemmel pénzt spórol meg", @@ -99,7 +99,7 @@ "simplex-network-overlay-card-1-li-1": "A P2P hálózatok az üzenetek továbbítására a DHT valamelyik változatát használják. A DHT kialakításakor egyensúlyt kell teremteni a kézbesítési garancia és a késleltetés között. A SimpleX jobb kézbesítési garanciával és alacsonyabb késleltetéssel rendelkezik, mint a P2P, mivel az üzenet redundánsan, a címzett által kiválasztott kiszolgálók segítségével több kiszolgálón keresztül párhuzamosan továbbítható. A P2P hálózatokban az üzenet O(log N) csomóponton halad át szekvenciálisan, az algoritmus által kiválasztott csomópontok segítségével.", "simplex-network-overlay-card-1-li-2": "A SimpleX kialakítása a legtöbb P2P hálózattól eltérően nem rendelkezik semmiféle globális felhasználói azonosítóval, még ideiglenessel sem, és csak az üzenetekhez használ ideiglenes, páros azonosítókat, ami jobb névtelenséget és metaadatvédelmet biztosít.", "simplex-network-overlay-card-1-li-3": "A P2P nem oldja meg a MITM-támadás problémát, és a legtöbb létező implementáció nem használ sávon kívüli üzeneteket a kezdeti kulcscseréhez. A SimpleX a kezdeti kulcscseréhez sávon kívüli üzeneteket, vagy bizonyos esetekben már meglévő biztonságos és megbízható kapcsolatokat használ.", - "simplex-network-overlay-card-1-li-6": "A P2P hálózatok sebezhetőek lehetnek a DRDoS-támadással szemben, amikor a kliensek képesek a forgalmat újraközvetíteni és felerősíteni, ami az egész hálózatra kiterjedő szolgáltatásmegtagadást eredményez. A SimpleX kliensek csak az ismert kapcsolatból származó forgalmat továbbítják, és a támadó nem használhatja őket arra, hogy az egész hálózatban felerősítse a forgalmat.", + "simplex-network-overlay-card-1-li-6": "A P2P-hálózatok sebezhetőek lehetnek a DRDoS-támadással szemben, amikor a kliensek képesek a forgalmat újraközvetíteni és felerősíteni, ami az egész hálózatra kiterjedő szolgáltatásmegtagadást eredményez. A SimpleX kliensek csak az ismert kapcsolatból származó forgalmat továbbítják, és a támadó nem használhatja őket arra, hogy az egész hálózatban felerősítse a forgalmat.", "simplex-network-overlay-card-1-li-5": "Minden ismert P2P hálózat sebezhető Sybil támadással, mert minden egyes csomópont felderíthető, és a hálózat egészként működik. A támadások enyhítésére szolgáló ismert intézkedés lehet egy központi kiszolgáló (pl.: tracker), vagy egy drága tanúsítvány. A SimpleX hálózat nem ismeri fel a kiszolgálókat, töredezett és több elszigetelt alhálózatként működik, ami lehetetlenné teszi az egész hálózatra kiterjedő támadásokat.", "privacy-matters-overlay-card-1-p-1": "Sok nagyvállalat arra használja fel az önnel kapcsolatban álló személyek adatait, hogy megbecsülje az ön jövedelmét, hogy olyan termékeket adjon el önnek, amelyekre valójában nincs is szüksége, és hogy meghatározza az árakat.", "privacy-matters-overlay-card-1-p-2": "Az online kiskereskedők tudják, hogy az alacsonyabb jövedelműek nagyobb valószínűséggel vásárolnak azonnal, ezért magasabb árakat számíthatnak fel, vagy eltörölhetik a kedvezményeket.", diff --git a/website/langs/it.json b/website/langs/it.json index 18a47bfe9f..7fdea37909 100644 --- a/website/langs/it.json +++ b/website/langs/it.json @@ -79,9 +79,9 @@ "simplex-unique-card-2-p-1": "Poiché non hai un identificatore o un indirizzo fisso sulla rete SimpleX, nessuno può contattarti a meno che tu non condivida un indirizzo utente una tantum o temporaneo, come codice un QR o un link.", "simplex-unique-card-3-p-1": "SimpleX conserva tutti i dati utente sui dispositivi client in un formato trasferibile di database crittografato — può essere trasferito su un altro dispositivo.", "join": "Unisciti a", - "we-invite-you-to-join-the-conversation": "Ti invitiamo a unirti alla conversazione", + "we-invite-you-to-join-the-conversation": "Ti invitiamo ad unirti alla conversazione", "enter-your-email-address": "Inserisci il tuo indirizzo email", - "get-simplex": "Ottieni SimpleX desktop app", + "get-simplex": "Ottieni l'app desktop di SimpleX", "why-simplex-is-unique": "Perché SimpleX è unico", "learn-more": "Maggiori informazioni", "more-info": "Mostra info", @@ -112,7 +112,7 @@ "simplex-network-1-header": "A differenza delle reti P2P", "simplex-network-1-overlay-linktext": "problemi delle reti P2P", "simplex-network-2-header": "A differenza delle reti federate", - "simplex-network-2-desc": "I server di inoltro SimpleX NON conservano i profili utente, i contatti e i messaggi consegnati, NON si connettono tra loro e NON esiste una directory dei server.", + "simplex-network-2-desc": "i server di inoltro SimpleX NON conservano i profili utente, i contatti e i messaggi consegnati, NON si connettono tra loro e NON esiste una directory dei server.", "comparison-section-header": "Confronto con altri protocolli", "protocol-1-text": "Signal, grandi piattaforme", "protocol-2-text": "XMPP, Matrix", @@ -203,7 +203,7 @@ "privacy-matters-section-header": "Perché la privacy è importante", "simplex-private-section-header": "Cosa rende SimpleX privato", "tap-to-close": "Tocca per chiudere", - "simplex-network-1-desc": "Tutti i messaggi vengono inviati tramite i server, garantendo una migliore privacy dei metadati e una consegna asincrona dei messaggi affidabile, evitando molti", + "simplex-network-1-desc": "tutti i messaggi vengono inviati tramite i server, garantendo una migliore privacy dei metadati e una consegna asincrona dei messaggi affidabile, evitando molti", "simplex-network-3-desc": "i server forniscono code unidirezionali per connettere gli utenti, ma non hanno visibilità del grafo delle connessioni di rete — solo gli utenti.", "comparison-point-5-text": "Componente centrale o altro attacco a livello di rete", "comparison-section-list-point-5": "Non protegge la privacy dei metadati degli utenti", From 7c86810de07d2b82a767d4ade4b950b55ea5e7fd Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Mon, 7 Jul 2025 20:41:01 +0100 Subject: [PATCH 07/18] ui: remove duplicate translations string --- .../common/src/commonMain/resources/MR/base/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index db1bb5d74d..c518c088fb 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -2542,7 +2542,6 @@ You have already requested connection via this address! Join your group? %1$s!]]> - Open group Repeat join request? Group already exists! Chat already exists! From f283c5f93c83d4053f0390df58762141432761f6 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 8 Jul 2025 12:22:20 +0100 Subject: [PATCH 08/18] core: fix API of websocket server, fix example in TS client API definition (#6051) --- apps/simplex-chat/Server.hs | 11 ++++++----- .../typescript/src/client.ts | 19 ++++++++++++++----- .../typescript/src/response.ts | 15 +++++++++------ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/apps/simplex-chat/Server.hs b/apps/simplex-chat/Server.hs index 0906d14536..0b18546609 100644 --- a/apps/simplex-chat/Server.hs +++ b/apps/simplex-chat/Server.hs @@ -18,7 +18,6 @@ import Control.Monad.Reader import Data.Aeson (FromJSON, ToJSON (..)) import qualified Data.Aeson as J import qualified Data.Aeson.TH as JQ -import Data.Bifunctor (first) import Data.Text (Text) import Data.Text.Encoding (encodeUtf8) import GHC.Generics (Generic) @@ -51,13 +50,15 @@ $(JQ.deriveToJSON (taggedObjectJSON $ dropPrefix "Obj") ''ObjChatCmdError) $(JQ.deriveToJSON (taggedObjectJSON $ dropPrefix "Obj") ''ObjChatError) +-- this encoding preserves the websocket API format when ChatError was sent either with type: "chatError" or type: "chatCmdError" instance ToJSON (CSRBody ChatResponse) where - toJSON = toJSON . first ObjChatCmdError . csrBody - toEncoding = toEncoding . first ObjChatCmdError . csrBody + toJSON = either (toJSON . ObjChatCmdError) toJSON . csrBody + toEncoding = either (toEncoding . ObjChatCmdError) toEncoding . csrBody +-- this encoding preserves the websocket API format when ChatError was sent either with type: "chatError" or type: "chatCmdError" instance ToJSON (CSRBody ChatEvent) where - toJSON = toJSON . first ObjChatError . csrBody - toEncoding = toEncoding . first ObjChatError . csrBody + toJSON = either (toJSON . ObjChatError) toJSON . csrBody + toEncoding = either (toEncoding . ObjChatError) toEncoding . csrBody data AChatSrvResponse = forall r. ToJSON (ChatSrvResponse r) => ACR (ChatSrvResponse r) diff --git a/packages/simplex-chat-client/typescript/src/client.ts b/packages/simplex-chat-client/typescript/src/client.ts index 3600147ba7..f908e6a7e3 100644 --- a/packages/simplex-chat-client/typescript/src/client.ts +++ b/packages/simplex-chat-client/typescript/src/client.ts @@ -79,8 +79,9 @@ export class ChatClient { sendChatCmdStr(cmd: string): Promise { const corrId = `${++this.clientCorrId}` const t: ChatSrvRequest = {corrId, cmd} + const p = new Promise((resolve, reject) => this.sentCommands.set(corrId, {resolve, reject})) this.transport.write(t).then(noop, noop) - return new Promise((resolve, reject) => this.sentCommands.set(corrId, {resolve, reject})) + return p } sendChatCommand(command: ChatCommand): Promise { @@ -189,7 +190,10 @@ export class ChatClient { async apiCreateLink(): Promise { const r = await this.sendChatCommand({type: "addContact"}) - if (r.type === "invitation") return r.connReqInvitation + if (r.type === "invitation") { + const link = r.connLinkInvitation + return link.connShortLink || link.connFullLink + } throw new ChatCommandError("error creating link", r) } @@ -247,7 +251,10 @@ export class ChatClient { async apiCreateUserAddress(): Promise { const r = await this.sendChatCommand({type: "createMyAddress"}) - if (r.type === "userContactLinkCreated") return r.connReqContact + if (r.type === "userContactLinkCreated") { + const link = r.connLinkContact + return link.connShortLink || link.connFullLink + } throw new ChatCommandError("error creating user address", r) } @@ -260,8 +267,10 @@ export class ChatClient { async apiGetUserAddress(): Promise { const r = await this.sendChatCommand({type: "showMyAddress"}) switch (r.type) { - case "userContactLink": - return r.contactLink.connReqContact + case "userContactLink": { + const link = r.contactLink.connLinkContact + return link.connShortLink || link.connFullLink + } default: if (r.type === "chatCmdError" && r.chatError.type === "errorStore" && r.chatError.storeError.type === "userContactLinkNotFound") { return undefined diff --git a/packages/simplex-chat-client/typescript/src/response.ts b/packages/simplex-chat-client/typescript/src/response.ts index 5f91baa7db..95eac89249 100644 --- a/packages/simplex-chat-client/typescript/src/response.ts +++ b/packages/simplex-chat-client/typescript/src/response.ts @@ -299,9 +299,7 @@ export interface CRUserContactLink extends CR { export interface CRUserContactLinkUpdated extends CR { type: "userContactLinkUpdated" user: User - connReqContact: string - autoAccept: boolean - autoReply?: MsgContent + contactLink: UserContactLink } export interface CRContactRequestRejected extends CR { @@ -337,7 +335,7 @@ export interface CRContactAliasUpdated extends CR { export interface CRInvitation extends CR { type: "invitation" user: User - connReqInvitation: string + connLinkInvitation: CreatedConnLink } export interface CRSentConfirmation extends CR { @@ -379,7 +377,7 @@ export interface CRChatCleared extends CR { export interface CRUserContactLinkCreated extends CR { type: "userContactLinkCreated" user: User - connReqContact: string + connLinkContact: CreatedConnLink } export interface CRUserContactLinkDeleted extends CR { @@ -994,10 +992,15 @@ interface FileTransferMeta { } interface UserContactLink { - connReqContact: string + connLinkContact: CreatedConnLink autoAccept?: AutoAccept } +interface CreatedConnLink { + connFullLink: string + connShortLink?: string +} + interface AutoAccept { acceptIncognito: boolean autoReply?: MsgContent From 6b1c202b3fec888e4dfa2bcdfd9e08fb8ec50545 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 8 Jul 2025 21:05:23 +0100 Subject: [PATCH 09/18] build: fix desktop (#6052) --- .../common/src/commonMain/cpp/desktop/simplex-api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/multiplatform/common/src/commonMain/cpp/desktop/simplex-api.c b/apps/multiplatform/common/src/commonMain/cpp/desktop/simplex-api.c index adb29e0cc2..2614b1a561 100644 --- a/apps/multiplatform/common/src/commonMain/cpp/desktop/simplex-api.c +++ b/apps/multiplatform/common/src/commonMain/cpp/desktop/simplex-api.c @@ -115,7 +115,7 @@ Java_chat_simplex_common_platform_CoreKt_chatCloseStore(JNIEnv *env, jclass claz } JNIEXPORT jstring JNICALL -Java_chat_simplex_common_platform_CoreKt_chatSendCmdRetry(JNIEnv *env, __unused jclass clazz, jlong controller, jstring msg, jint retryNum) { +Java_chat_simplex_common_platform_CoreKt_chatSendCmdRetry(JNIEnv *env, jclass clazz, jlong controller, jstring msg, jint retryNum) { const char *_msg = encode_to_utf8_chars(env, msg); jstring res = decode_to_utf8_string(env, chat_send_cmd_retry((void*)controller, _msg, retryNum)); (*env)->ReleaseStringUTFChars(env, msg, _msg); @@ -123,7 +123,7 @@ Java_chat_simplex_common_platform_CoreKt_chatSendCmdRetry(JNIEnv *env, __unused } JNIEXPORT jstring JNICALL -Java_chat_simplex_common_platform_CoreKt_chatSendRemoteCmdRetry(JNIEnv *env, __unused jclass clazz, jlong controller, jint rhId, jstring msg, jint retryNum) { +Java_chat_simplex_common_platform_CoreKt_chatSendRemoteCmdRetry(JNIEnv *env, jclass clazz, jlong controller, jint rhId, jstring msg, jint retryNum) { const char *_msg = encode_to_utf8_chars(env, msg); jstring res = decode_to_utf8_string(env, chat_send_remote_cmd_retry((void*)controller, rhId, _msg, retryNum)); (*env)->ReleaseStringUTFChars(env, msg, _msg); From ca22cd43673dd639c62d0b02a1390c9fab1944dc Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Thu, 10 Jul 2025 10:27:40 +0100 Subject: [PATCH 10/18] core: update simplexmq (fix message delivery to groups when the first member connection is broken) --- cabal.project | 2 +- scripts/nix/sha256map.nix | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cabal.project b/cabal.project index b348bfa741..5ab8aeda55 100644 --- a/cabal.project +++ b/cabal.project @@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: 1062ccc5c3d915fc620a4c0080e82d28a401839b + tag: 99e59b73a32400067a8ac630ca4ad27f27bba0ef source-repository-package type: git diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index 2037838194..1cfb937dea 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."1062ccc5c3d915fc620a4c0080e82d28a401839b" = "0r2m7sq1dibcvngg3k6dyja5sp046910wbgmks1arrxxyxzni6k3"; + "https://github.com/simplex-chat/simplexmq.git"."99e59b73a32400067a8ac630ca4ad27f27bba0ef" = "04cj3m5ykw0gaqhnj2i25ny8zi312zng5nlya30ia4dr2wz2n0rz"; "https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38"; "https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d"; "https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; From a7f8866360075b699c29efe67ba03b18d052a494 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Thu, 10 Jul 2025 09:29:39 +0000 Subject: [PATCH 11/18] ui: plan and connect spinners (#6048) * ios: plan and connect spinners * fix cleanup * remove redundant check * revert diff * progress by timeout for join and connect buttons * accept in progress * connect in progress by timeout wip * fix observable * fix cleanup * kotlin wip * decrease delay * ios: spinner as overlay * remove duplicate stop progress, remove cleanupOnCancel * contact request progress * plan in progress wip * fix cleanup * search * fix ios * scanner * desktop paste * spinner in chat * ios: don't repeat scan while in progress * spinner in paste field * cancellable plan * cancel in more scenarios * fix cancellation * move progress to search * remove task var * pause scanner when processing qr code * kotlin * improvements * layout * layout * move spinner --------- Co-authored-by: Evgeny Poberezkin --- apps/ios/Shared/Model/ChatModel.swift | 35 ++ apps/ios/Shared/Model/SimpleXAPI.swift | 11 +- apps/ios/Shared/Views/Chat/ChatView.swift | 31 ++ .../Chat/ComposeMessage/ComposeView.swift | 28 +- .../ContextContactRequestActionsView.swift | 19 +- .../Chat/ComposeMessage/SendMessageView.swift | 14 +- .../Shared/Views/ChatList/ChatListView.swift | 7 + .../Views/NewChat/NewChatMenuButton.swift | 11 +- .../Shared/Views/NewChat/NewChatView.swift | 453 ++++++++++-------- .../chat/simplex/common/model/ChatModel.kt | 33 ++ .../chat/simplex/common/model/SimpleXAPI.kt | 63 +-- .../simplex/common/views/chat/ChatView.kt | 48 ++ ...ComposeContextContactRequestActionsView.kt | 130 +++-- .../simplex/common/views/chat/ComposeView.kt | 29 +- .../simplex/common/views/chat/SendMsgView.kt | 15 +- .../views/chatlist/ChatListNavLinkView.kt | 12 +- .../common/views/chatlist/ChatListView.kt | 108 +++-- .../common/views/newchat/ConnectPlan.kt | 26 +- .../common/views/newchat/NewChatSheet.kt | 21 +- .../common/views/newchat/NewChatView.kt | 27 +- .../commonMain/resources/MR/base/strings.xml | 1 + 21 files changed, 743 insertions(+), 379 deletions(-) diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 2c139f8fbc..33b3fd8009 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -314,6 +314,41 @@ class ChatItemDummyModel: ObservableObject { func sendUpdate() { objectWillChange.send() } } +class ConnectProgressManager: ObservableObject { + @Published private var connectInProgress: String? = nil + @Published private var connectProgressByTimeout: Bool = false + private var onCancel: (() -> Void)? + + static let shared = ConnectProgressManager() + + func startConnectProgress(_ text: String, onCancel: (() -> Void)? = nil) { + connectInProgress = text + self.onCancel = onCancel + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.connectProgressByTimeout = self.connectInProgress != nil + } + } + + func stopConnectProgress() { + connectInProgress = nil + onCancel = nil + connectProgressByTimeout = false + } + + func cancelConnectProgress() { + onCancel?() + stopConnectProgress() + } + + var showConnectProgress: String? { + connectProgressByTimeout ? connectInProgress : nil + } + + var isInProgress: Bool { + connectInProgress != nil + } +} + final class ChatModel: ObservableObject { @Published var onboardingStage: OnboardingStage? @Published var setDeliveryReceipts = false diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index d9cd2a0dc6..f184e048cc 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -120,9 +120,10 @@ func chatSendCmd(_ cmd: ChatCommand, bgTask: Bool = true, bgDe return try apiResult(res) } -func chatApiSendCmdWithRetry(_ cmd: ChatCommand, bgTask: Bool = true, bgDelay: Double? = nil, retryNum: Int32 = 0) async -> APIResult? { +func chatApiSendCmdWithRetry(_ cmd: ChatCommand, bgTask: Bool = true, bgDelay: Double? = nil, inProgress: BoxedValue? = nil, retryNum: Int32 = 0) async -> APIResult? { let r: APIResult = await chatApiSendCmd(cmd, bgTask: bgTask, bgDelay: bgDelay, retryNum: retryNum) - if case let .error(e) = r, let alert = retryableNetworkErrorAlert(e) { + if inProgress == nil || inProgress?.boxedValue == true, + case let .error(e) = r, let alert = retryableNetworkErrorAlert(e) { return await withCheckedContinuation { cont in showRetryAlert( alert, @@ -130,7 +131,7 @@ func chatApiSendCmdWithRetry(_ cmd: ChatCommand, bgTask: Bool cont.resume(returning: nil) }, onRetry: { - let r1: APIResult? = await chatApiSendCmdWithRetry(cmd, bgTask: bgTask, bgDelay: bgDelay, retryNum: retryNum + 1) + let r1: APIResult? = await chatApiSendCmdWithRetry(cmd, bgTask: bgTask, bgDelay: bgDelay, inProgress: inProgress, retryNum: retryNum + 1) cont.resume(returning: r1) } ) @@ -980,12 +981,12 @@ func apiChangeConnectionUser(connId: Int64, userId: Int64) async throws -> Pendi if let r { throw r.unexpected } else { return nil } } -func apiConnectPlan(connLink: String) async -> ((CreatedConnLink, ConnectionPlan)?, Alert?) { +func apiConnectPlan(connLink: String, inProgress: BoxedValue) async -> ((CreatedConnLink, ConnectionPlan)?, Alert?) { guard let userId = ChatModel.shared.currentUser?.userId else { logger.error("apiConnectPlan: no current user") return (nil, nil) } - let r: APIResult? = await chatApiSendCmdWithRetry(.apiConnectPlan(userId: userId, connLink: connLink)) + let r: APIResult? = await chatApiSendCmdWithRetry(.apiConnectPlan(userId: userId, connLink: connLink), inProgress: inProgress) if case let .result(.connectionPlan(_, connLink, connPlan)) = r { return ((connLink, connPlan), nil) } let alert: Alert? = if let r { apiConnectResponseAlert(r) } else { nil } return (nil, alert) diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 64166929aa..ed0c0aa432 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -15,6 +15,7 @@ private let memberImageSize: CGFloat = 34 struct ChatView: View { @EnvironmentObject var chatModel: ChatModel + @StateObject private var connectProgressManager = ConnectProgressManager.shared @State var revealedItems: Set = Set() @State var theme: AppTheme = buildTheme() @Environment(\.dismiss) var dismiss @@ -114,6 +115,9 @@ struct ChatView: View { } ) } + if let connectInProgressText = connectProgressManager.showConnectProgress { + connectInProgressView(connectInProgressText) + } if let connectingText { Text(connectingText) .font(.caption) @@ -262,6 +266,7 @@ struct ChatView: View { } } .onAppear { + ConnectProgressManager.shared.cancelConnectProgress() scrollView.listState.onUpdateListener = onChatItemsUpdated selectedChatItems = nil revealedItems = Set() @@ -286,6 +291,7 @@ struct ChatView: View { } } .onChange(of: chatModel.chatId) { cId in + ConnectProgressManager.shared.cancelConnectProgress() showChatInfoSheet = false selectedChatItems = nil revealedItems = Set() @@ -341,6 +347,7 @@ struct ChatView: View { } } .onDisappear { + ConnectProgressManager.shared.cancelConnectProgress() VideoPlayerView.players.removeAll() stopAudioPlayer() if chatModel.chatId == cInfo.id && !presentationMode.wrappedValue.isPresented { @@ -386,6 +393,30 @@ struct ChatView: View { } } + private func connectInProgressView(_ s: String) -> some View { + VStack(spacing: 0) { + Divider() + + HStack(spacing: 12) { + ProgressView() + Text(s) + + Spacer() + + Button { + ConnectProgressManager.shared.cancelConnectProgress() + } label: { + Image(systemName: "multiply") + } + .tint(theme.colors.primary) + } + .padding(12) + .frame(minHeight: 54) + .frame(maxWidth: .infinity, alignment: .leading) + .background(ToolbarMaterial.material(toolbarMaterial)) + } + } + @inline(__always) @ViewBuilder private func primaryPrincipalToolbarContent() -> some View { let cInfo = chat.chatInfo diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift index cc31ec1855..53ce9f9bfc 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift @@ -44,6 +44,7 @@ struct ComposeState { var contextItem: ComposeContextItem var voiceMessageRecordingState: VoiceMessageRecordingState var inProgress = false + var progressByTimeout = false var useLinkPreviews: Bool = UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_LINK_PREVIEWS) var mentions: MentionedMembers = [:] @@ -410,7 +411,14 @@ struct ComposeView: View { if chat.chatInfo.groupInfo?.nextConnectPrepared == true { if chat.chatInfo.groupInfo?.businessChat == nil { Button(action: connectPreparedGroup) { - Label("Join group", systemImage: "person.2.fill") + ZStack(alignment: .trailing) { + Label("Join group", systemImage: "person.2.fill") + .frame(maxWidth: .infinity) + if composeState.progressByTimeout { + ProgressView() + .padding() + } + } } .frame(height: 60) .disabled(composeState.inProgress) @@ -429,7 +437,14 @@ struct ComposeView: View { switch linkType { case .inv: Button(action: sendConnectPreparedContact) { - Label("Connect", systemImage: "person.fill.badge.plus") + ZStack(alignment: .trailing) { + Label("Connect", systemImage: "person.fill.badge.plus") + .frame(maxWidth: .infinity) + if composeState.progressByTimeout { + ProgressView() + .padding() + } + } } .frame(height: 60) .disabled(composeState.inProgress) @@ -474,6 +489,15 @@ struct ComposeView: View { clearState() } } + .onChange(of: composeState.inProgress) { inProgress in + if inProgress { + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + composeState.progressByTimeout = composeState.inProgress + } + } else { + composeState.progressByTimeout = false + } + } .confirmationDialog("Attach", isPresented: $showChooseSource, titleVisibility: .visible) { Button("Take picture") { showTakePhoto = true diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextContactRequestActionsView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextContactRequestActionsView.swift index 9c299ebc42..7835576eb7 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextContactRequestActionsView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextContactRequestActionsView.swift @@ -14,6 +14,7 @@ struct ContextContactRequestActionsView: View { var contactRequestId: Int64 @UserDefault(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial @State private var inProgress = false + @State private var progressByTimeout = false var body: some View { HStack(spacing: 0) { @@ -21,7 +22,7 @@ struct ContextContactRequestActionsView: View { Label("Reject", systemImage: "multiply") } .frame(maxWidth: .infinity, minHeight: 60) - + Button { if ChatModel.shared.addressShortLinkDataSet { acceptRequest() @@ -36,6 +37,22 @@ struct ContextContactRequestActionsView: View { .disabled(inProgress) .frame(maxWidth: .infinity) .background(ToolbarMaterial.material(toolbarMaterial)) + .opacity(progressByTimeout ? 0.4 : 1) + .overlay { + if progressByTimeout { + ProgressView() + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + } + .onChange(of: inProgress) { inPrgrs in + if inPrgrs { + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + progressByTimeout = inProgress + } + } else { + progressByTimeout = false + } + } } private func showRejectRequestAlert() { diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift index ea19e20591..07cd61583b 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/SendMessageView.swift @@ -44,7 +44,6 @@ struct SendMessageView: View { @State private var showCustomDisappearingMessageDialogue = false @State private var showCustomTimePicker = false @State private var selectedDisappearingMessageTime: Int? = customDisappearingMessageTimeDefault.get() - @State private var progressByTimeout = false @UserDefault(DEFAULT_LIVE_MESSAGE_ALERT_SHOWN) private var liveMessageAlertShown = false var body: some View { @@ -76,12 +75,12 @@ struct SendMessageView: View { } } .overlay(alignment: .topTrailing, content: { - if !progressByTimeout && teHeight > 100 && !composeState.inProgress { + if !composeState.progressByTimeout && teHeight > 100 && !composeState.inProgress { deleteTextButton() } }) .overlay(alignment: .bottomTrailing) { - if progressByTimeout { + if composeState.progressByTimeout { ProgressView() .scaleEffect(1.4) .frame(width: 31, height: 31, alignment: .center) @@ -97,15 +96,6 @@ struct SendMessageView: View { .clipShape(composeShape) .overlay(composeShape.strokeBorder(.secondary, lineWidth: 0.5).opacity(0.7)) .onChange(of: composeState.message, perform: { text in updateFont(text) }) - .onChange(of: composeState.inProgress) { inProgress in - if inProgress { - DispatchQueue.main.asyncAfter(deadline: .now() + 3) { - progressByTimeout = composeState.inProgress - } - } else { - progressByTimeout = false - } - } .padding(.vertical, 8) } diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index 24b057275a..9f453f1aa3 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -137,6 +137,7 @@ struct UserPickerSheetView: View { struct ChatListView: View { @EnvironmentObject var chatModel: ChatModel + @StateObject private var connectProgressManager = ConnectProgressManager.shared @EnvironmentObject var theme: AppTheme @Binding var activeUserPickerSheet: UserPickerSheet? @State private var searchMode = false @@ -572,6 +573,7 @@ struct ChatListSearchBar: View { @EnvironmentObject var m: ChatModel @EnvironmentObject var theme: AppTheme @EnvironmentObject var chatTagsModel: ChatTagsModel + @StateObject private var connectProgressManager = ConnectProgressManager.shared @Binding var searchMode: Bool @FocusState.Binding var searchFocussed: Bool @Binding var searchText: String @@ -591,6 +593,9 @@ struct ChatListSearchBar: View { .disabled(searchShowingSimplexLink) .focused($searchFocussed) .frame(maxWidth: .infinity) + if connectProgressManager.showConnectProgress != nil { + ProgressView() + } if !searchText.isEmpty { Image(systemName: "xmark.circle.fill") .onTapGesture { @@ -634,6 +639,8 @@ struct ChatListSearchBar: View { } else { if t != "" { // if some other text is pasted, enter search mode searchFocussed = true + } else { + ConnectProgressManager.shared.cancelConnectProgress() } searchShowingSimplexLink = false searchChatFilteredBySimplexLink = nil diff --git a/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift b/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift index a64f865fc8..c009bf0d35 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift @@ -16,7 +16,8 @@ struct NewChatMenuButton: View { @State private var alert: SomeAlert? = nil var body: some View { - Button { + Button { + ConnectProgressManager.shared.cancelConnectProgress() showNewChatSheet = true } label: { Image(systemName: "square.and.pencil") @@ -65,6 +66,8 @@ struct NewChatSheet: View { .alert(item: $alert) { a in return a.alert } + }.onDisappear { + ConnectProgressManager.shared.cancelConnectProgress() } if #available(iOS 16.0, *), oneHandUI { let sheetHeight: CGFloat = showArchive ? 575 : 500 @@ -315,6 +318,7 @@ struct ContactsList: View { struct ContactsListSearchBar: View { @EnvironmentObject var m: ChatModel + @StateObject private var connectProgressManager = ConnectProgressManager.shared @EnvironmentObject var theme: AppTheme @Binding var searchMode: Bool @FocusState.Binding var searchFocussed: Bool @@ -338,6 +342,9 @@ struct ContactsListSearchBar: View { .disabled(searchShowingSimplexLink) .focused($searchFocussed) .frame(maxWidth: .infinity) + if connectProgressManager.showConnectProgress != nil { + ProgressView() + } if !searchText.isEmpty { Image(systemName: "xmark.circle.fill") .resizable() @@ -384,6 +391,8 @@ struct ContactsListSearchBar: View { } else { if t != "" { // if some other text is pasted, enter search mode searchFocussed = true + } else { + connectProgressManager.cancelConnectProgress() } searchShowingSimplexLink = false searchChatFilteredBySimplexLink = nil diff --git a/apps/ios/Shared/Views/NewChat/NewChatView.swift b/apps/ios/Shared/Views/NewChat/NewChatView.swift index cadd551147..19e0d4180d 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatView.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatView.swift @@ -585,11 +585,13 @@ private struct ActiveProfilePicker: View { } private struct ConnectView: View { + @StateObject private var connectProgressManager = ConnectProgressManager.shared @Environment(\.dismiss) var dismiss: DismissAction @EnvironmentObject var theme: AppTheme @Binding var showQRCodeScanner: Bool @Binding var pastedLink: String @Binding var alert: NewChatViewAlert? + @State var scannerPaused: Bool = false @State private var pasteboardHasStrings = UIPasteboard.general.hasStrings var body: some View { @@ -598,36 +600,49 @@ private struct ConnectView: View { pasteLinkView() } Section(header: Text("Or scan QR code").foregroundColor(theme.colors.secondary)) { - ScannerInView(showQRCodeScanner: $showQRCodeScanner, processQRCode: processQRCode) + ScannerInView(showQRCodeScanner: $showQRCodeScanner, scannerPaused: $scannerPaused, processQRCode: processQRCode) } } + .onDisappear { + connectProgressManager.cancelConnectProgress() + } } @ViewBuilder private func pasteLinkView() -> some View { if pastedLink == "" { - Button { - if let str = UIPasteboard.general.string { - if let link = strHasSingleSimplexLink(str.trimmingCharacters(in: .whitespaces)) { - pastedLink = link.text - // It would be good to hide it, but right now it is not clear how to release camera in CodeScanner - // https://github.com/twostraws/CodeScanner/issues/121 - // No known tricks worked (changing view ID, wrapping it in another view, etc.) - // showQRCodeScanner = false - connect(pastedLink) - } else { - alert = .newChatSomeAlert(alert: SomeAlert( - alert: mkAlert(title: "Invalid link", message: "The text you pasted is not a SimpleX link."), - id: "pasteLinkView: code is not a SimpleX link" - )) + ZStack(alignment: .trailing) { + Button { + if let str = UIPasteboard.general.string { + if let link = strHasSingleSimplexLink(str.trimmingCharacters(in: .whitespaces)) { + pastedLink = link.text + // It would be good to hide it, but right now it is not clear how to release camera in CodeScanner + // https://github.com/twostraws/CodeScanner/issues/121 + // No known tricks worked (changing view ID, wrapping it in another view, etc.) + // showQRCodeScanner = false + connect(pastedLink) + } else { + alert = .newChatSomeAlert(alert: SomeAlert( + alert: mkAlert(title: "Invalid link", message: "The text you pasted is not a SimpleX link."), + id: "pasteLinkView: code is not a SimpleX link" + )) + } } + } label: { + Text("Tap to paste link") + } + .disabled(!pasteboardHasStrings) + .frame(maxWidth: .infinity, alignment: .center) + if connectProgressManager.showConnectProgress != nil { + ProgressView() } - } label: { - Text("Tap to paste link") } - .disabled(!pasteboardHasStrings) - .frame(maxWidth: .infinity, alignment: .center) } else { - linkTextView(pastedLink) + HStack { + linkTextView(pastedLink) + if connectProgressManager.showConnectProgress != nil { + ProgressView() + } + } } } @@ -653,16 +668,22 @@ private struct ConnectView: View { } private func connect(_ link: String) { + scannerPaused = true planAndConnect( link, theme: theme, - dismiss: true + dismiss: true, + cleanup: { + pastedLink = "" + scannerPaused = false + } ) } } struct ScannerInView: View { @Binding var showQRCodeScanner: Bool + var scannerPaused: Binding? = nil let processQRCode: (_ resp: Result) -> Void @State private var cameraAuthorizationStatus: AVAuthorizationStatus? var scanMode: ScanMode = .continuous @@ -670,7 +691,7 @@ struct ScannerInView: View { var body: some View { Group { if showQRCodeScanner, case .authorized = cameraAuthorizationStatus { - CodeScannerView(codeTypes: [.qr], scanMode: scanMode, completion: processQRCode) + CodeScannerView(codeTypes: [.qr], scanMode: scanMode, isPaused: scannerPaused?.wrappedValue ?? false, completion: processQRCode) .aspectRatio(1, contentMode: .fit) .cornerRadius(12) .listRowBackground(Color.clear) @@ -1148,231 +1169,249 @@ func planAndConnect( filterKnownContact: ((Contact) -> Void)? = nil, filterKnownGroup: ((GroupInfo) -> Void)? = nil ) { - Task { - let (result, alert) = await apiConnectPlan(connLink: shortOrFullLink) - if let (connectionLink, connectionPlan) = result { - switch connectionPlan { - case let .invitationLink(ilp): - switch ilp { - case let .ok(contactSLinkData_): - if let contactSLinkData = contactSLinkData_ { - logger.debug("planAndConnect, .invitationLink, .ok, short link data present") - await MainActor.run { - showPrepareContactAlert( - connectionLink: connectionLink, - contactShortLinkData: contactSLinkData, - theme: theme, - dismiss: dismiss, - cleanup: cleanup - ) + ConnectProgressManager.shared.cancelConnectProgress() + let inProgress = BoxedValue(true) + connectTask(inProgress) + ConnectProgressManager.shared.startConnectProgress(NSLocalizedString("Loading profile…", comment: "in progress text")) { + inProgress.boxedValue = false + cleanup?() + } + + func connectTask(_ inProgress: BoxedValue) { + Task { + let (result, alert) = await apiConnectPlan(connLink: shortOrFullLink, inProgress: inProgress) + await MainActor.run { + ConnectProgressManager.shared.stopConnectProgress() + } + if !inProgress.boxedValue { return } + if let (connectionLink, connectionPlan) = result { + switch connectionPlan { + case let .invitationLink(ilp): + switch ilp { + case let .ok(contactSLinkData_): + if let contactSLinkData = contactSLinkData_ { + logger.debug("planAndConnect, .invitationLink, .ok, short link data present") + await MainActor.run { + showPrepareContactAlert( + connectionLink: connectionLink, + contactShortLinkData: contactSLinkData, + theme: theme, + dismiss: dismiss, + cleanup: cleanup + ) + } + } else { + logger.debug("planAndConnect, .invitationLink, .ok, no short link data") + await MainActor.run { + showAskCurrentOrIncognitoProfileSheet( + title: NSLocalizedString("Connect via one-time link", comment: "new chat sheet title"), + connectionLink: connectionLink, + connectionPlan: connectionPlan, + dismiss: dismiss, + cleanup: cleanup + ) + } } - } else { - logger.debug("planAndConnect, .invitationLink, .ok, no short link data") + case .ownLink: + logger.debug("planAndConnect, .invitationLink, .ownLink") await MainActor.run { showAskCurrentOrIncognitoProfileSheet( - title: NSLocalizedString("Connect via one-time link", comment: "new chat sheet title"), + title: NSLocalizedString("Connect to yourself?\nThis is your own one-time link!", comment: "new chat sheet title"), + actionStyle: .destructive, connectionLink: connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, cleanup: cleanup ) } - } - case .ownLink: - logger.debug("planAndConnect, .invitationLink, .ownLink") - await MainActor.run { - showAskCurrentOrIncognitoProfileSheet( - title: NSLocalizedString("Connect to yourself?\nThis is your own one-time link!", comment: "new chat sheet title"), - actionStyle: .destructive, - connectionLink: connectionLink, - connectionPlan: connectionPlan, - dismiss: dismiss, - cleanup: cleanup - ) - } - case let .connecting(contact_): - logger.debug("planAndConnect, .invitationLink, .connecting") - await MainActor.run { - if let contact = contact_ { + case let .connecting(contact_): + logger.debug("planAndConnect, .invitationLink, .connecting") + await MainActor.run { + if let contact = contact_ { + if let f = filterKnownContact { + f(contact) + } else { + showOpenKnownContactAlert(contact, theme: theme, dismiss: dismiss) + } + } else { + showInvitationLinkConnectingAlert(cleanup: cleanup) + } + } + case let .known(contact): + logger.debug("planAndConnect, .invitationLink, .known") + await MainActor.run { if let f = filterKnownContact { f(contact) } else { showOpenKnownContactAlert(contact, theme: theme, dismiss: dismiss) } - } else { - showInvitationLinkConnectingAlert(cleanup: cleanup) } } - case let .known(contact): - logger.debug("planAndConnect, .invitationLink, .known") - await MainActor.run { - if let f = filterKnownContact { - f(contact) + case let .contactAddress(cap): + switch cap { + case let .ok(contactSLinkData_): + if let contactSLinkData = contactSLinkData_ { + logger.debug("planAndConnect, .contactAddress, .ok, short link data present") + await MainActor.run { + showPrepareContactAlert( + connectionLink: connectionLink, + contactShortLinkData: contactSLinkData, + theme: theme, + dismiss: dismiss, + cleanup: cleanup + ) + } } else { - showOpenKnownContactAlert(contact, theme: theme, dismiss: dismiss) + logger.debug("planAndConnect, .contactAddress, .ok, no short link data") + await MainActor.run { + showAskCurrentOrIncognitoProfileSheet( + title: NSLocalizedString("Connect via contact address", comment: "new chat sheet title"), + connectionLink: connectionLink, + connectionPlan: connectionPlan, + dismiss: dismiss, + cleanup: cleanup + ) + } } - } - } - case let .contactAddress(cap): - switch cap { - case let .ok(contactSLinkData_): - if let contactSLinkData = contactSLinkData_ { - logger.debug("planAndConnect, .contactAddress, .ok, short link data present") - await MainActor.run { - showPrepareContactAlert( - connectionLink: connectionLink, - contactShortLinkData: contactSLinkData, - theme: theme, - dismiss: dismiss, - cleanup: cleanup - ) - } - } else { - logger.debug("planAndConnect, .contactAddress, .ok, no short link data") + case .ownLink: + logger.debug("planAndConnect, .contactAddress, .ownLink") await MainActor.run { showAskCurrentOrIncognitoProfileSheet( - title: NSLocalizedString("Connect via contact address", comment: "new chat sheet title"), + title: NSLocalizedString("Connect to yourself?\nThis is your own SimpleX address!", comment: "new chat sheet title"), + actionStyle: .destructive, connectionLink: connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, cleanup: cleanup ) } - } - case .ownLink: - logger.debug("planAndConnect, .contactAddress, .ownLink") - await MainActor.run { - showAskCurrentOrIncognitoProfileSheet( - title: NSLocalizedString("Connect to yourself?\nThis is your own SimpleX address!", comment: "new chat sheet title"), - actionStyle: .destructive, - connectionLink: connectionLink, - connectionPlan: connectionPlan, - dismiss: dismiss, - cleanup: cleanup - ) - } - case .connectingConfirmReconnect: - logger.debug("planAndConnect, .contactAddress, .connectingConfirmReconnect") - await MainActor.run { - showAskCurrentOrIncognitoProfileSheet( - title: NSLocalizedString("You have already requested connection!\nRepeat connection request?", comment: "new chat sheet title"), - actionStyle: .destructive, - connectionLink: connectionLink, - connectionPlan: connectionPlan, - dismiss: dismiss, - cleanup: cleanup - ) - } - case let .connectingProhibit(contact): - logger.debug("planAndConnect, .contactAddress, .connectingProhibit") - await MainActor.run { - if let f = filterKnownContact { - f(contact) - } else { - showOpenKnownContactAlert(contact, theme: theme, dismiss: dismiss) - } - } - case let .known(contact): - logger.debug("planAndConnect, .contactAddress, .known") - await MainActor.run { - if let f = filterKnownContact { - f(contact) - } else { - showOpenKnownContactAlert(contact, theme: theme, dismiss: dismiss) - } - } - case let .contactViaAddress(contact): - logger.debug("planAndConnect, .contactAddress, .contactViaAddress") - await MainActor.run { - showAskCurrentOrIncognitoProfileConnectContactViaAddressSheet( - contact: contact, - dismiss: dismiss, - cleanup: cleanup - ) - } - } - case let .groupLink(glp): - switch glp { - case let .ok(groupSLinkData_): - if let groupSLinkData = groupSLinkData_ { - logger.debug("planAndConnect, .groupLink, .ok, short link data present") - await MainActor.run { - showPrepareGroupAlert( - connectionLink: connectionLink, - groupShortLinkData: groupSLinkData, - theme: theme, - dismiss: dismiss, - cleanup: cleanup - ) - } - } else { - logger.debug("planAndConnect, .groupLink, .ok, no short link data") + case .connectingConfirmReconnect: + logger.debug("planAndConnect, .contactAddress, .connectingConfirmReconnect") await MainActor.run { showAskCurrentOrIncognitoProfileSheet( - title: NSLocalizedString("Join group", comment: "new chat sheet title"), + title: NSLocalizedString("You have already requested connection!\nRepeat connection request?", comment: "new chat sheet title"), + actionStyle: .destructive, connectionLink: connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, cleanup: cleanup ) } - } - case let .ownLink(groupInfo): - logger.debug("planAndConnect, .groupLink, .ownLink") - await MainActor.run { - if let f = filterKnownGroup { - f(groupInfo) + case let .connectingProhibit(contact): + logger.debug("planAndConnect, .contactAddress, .connectingProhibit") + await MainActor.run { + if let f = filterKnownContact { + f(contact) + } else { + showOpenKnownContactAlert(contact, theme: theme, dismiss: dismiss) + } + } + case let .known(contact): + logger.debug("planAndConnect, .contactAddress, .known") + await MainActor.run { + if let f = filterKnownContact { + f(contact) + } else { + showOpenKnownContactAlert(contact, theme: theme, dismiss: dismiss) + } + } + case let .contactViaAddress(contact): + logger.debug("planAndConnect, .contactAddress, .contactViaAddress") + await MainActor.run { + showAskCurrentOrIncognitoProfileConnectContactViaAddressSheet( + contact: contact, + dismiss: dismiss, + cleanup: cleanup + ) } - showOwnGroupLinkConfirmConnectSheet( - groupInfo: groupInfo, - connectionLink: connectionLink, - connectionPlan: connectionPlan, - dismiss: dismiss, - cleanup: cleanup - ) } - case .connectingConfirmReconnect: - logger.debug("planAndConnect, .groupLink, .connectingConfirmReconnect") - await MainActor.run { - showAskCurrentOrIncognitoProfileSheet( - title: NSLocalizedString("You are already joining the group!\nRepeat join request?", comment: "new chat sheet title"), - actionStyle: .destructive, - connectionLink: connectionLink, - connectionPlan: connectionPlan, - dismiss: dismiss, - cleanup: cleanup - ) - } - case let .connectingProhibit(groupInfo_): - logger.debug("planAndConnect, .groupLink, .connectingProhibit") - await MainActor.run { - showGroupLinkConnectingAlert(groupInfo: groupInfo_, cleanup: cleanup) - } - case let .known(groupInfo): - logger.debug("planAndConnect, .groupLink, .known") - await MainActor.run { - if let f = filterKnownGroup { - f(groupInfo) + case let .groupLink(glp): + switch glp { + case let .ok(groupSLinkData_): + if let groupSLinkData = groupSLinkData_ { + logger.debug("planAndConnect, .groupLink, .ok, short link data present") + await MainActor.run { + showPrepareGroupAlert( + connectionLink: connectionLink, + groupShortLinkData: groupSLinkData, + theme: theme, + dismiss: dismiss, + cleanup: cleanup + ) + } } else { - showOpenKnownGroupAlert(groupInfo, theme: theme, dismiss: dismiss) + logger.debug("planAndConnect, .groupLink, .ok, no short link data") + await MainActor.run { + showAskCurrentOrIncognitoProfileSheet( + title: NSLocalizedString("Join group", comment: "new chat sheet title"), + connectionLink: connectionLink, + connectionPlan: connectionPlan, + dismiss: dismiss, + cleanup: cleanup + ) + } + } + case let .ownLink(groupInfo): + logger.debug("planAndConnect, .groupLink, .ownLink") + await MainActor.run { + if let f = filterKnownGroup { + f(groupInfo) + } + showOwnGroupLinkConfirmConnectSheet( + groupInfo: groupInfo, + connectionLink: connectionLink, + connectionPlan: connectionPlan, + dismiss: dismiss, + cleanup: cleanup + ) + } + case .connectingConfirmReconnect: + logger.debug("planAndConnect, .groupLink, .connectingConfirmReconnect") + await MainActor.run { + showAskCurrentOrIncognitoProfileSheet( + title: NSLocalizedString("You are already joining the group!\nRepeat join request?", comment: "new chat sheet title"), + actionStyle: .destructive, + connectionLink: connectionLink, + connectionPlan: connectionPlan, + dismiss: dismiss, + cleanup: cleanup + ) + } + case let .connectingProhibit(groupInfo_): + logger.debug("planAndConnect, .groupLink, .connectingProhibit") + await MainActor.run { + showGroupLinkConnectingAlert(groupInfo: groupInfo_, cleanup: cleanup) + } + case let .known(groupInfo): + logger.debug("planAndConnect, .groupLink, .known") + await MainActor.run { + if let f = filterKnownGroup { + f(groupInfo) + } else { + showOpenKnownGroupAlert(groupInfo, theme: theme, dismiss: dismiss) + } } } + case let .error(chatError): + logger.debug("planAndConnect, .error \(chatErrorString(chatError))") + showAskCurrentOrIncognitoProfileSheet( + title: NSLocalizedString("Connect via link", comment: "new chat sheet title"), + connectionLink: connectionLink, + connectionPlan: nil, + dismiss: dismiss, + cleanup: cleanup + ) } - case let .error(chatError): - logger.debug("planAndConnect, .error \(chatErrorString(chatError))") - showAskCurrentOrIncognitoProfileSheet( - title: NSLocalizedString("Connect via link", comment: "new chat sheet title"), - connectionLink: connectionLink, - connectionPlan: nil, - dismiss: dismiss, - cleanup: cleanup - ) - } - } else if let alert { - await MainActor.run { - dismissAllSheets(animated: true) { - AlertManager.shared.showAlert(alert) - cleanup?() + } else { + await MainActor.run { + if let alert { + dismissAllSheets(animated: true) { + AlertManager.shared.showAlert(alert) + cleanup?() + } + } else { + cleanup?() + } } } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 0a27cdddbf..87f6069cfe 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -43,6 +43,39 @@ import kotlin.collections.ArrayList import kotlin.random.Random import kotlin.time.* +object ConnectProgressManager { + private val connectInProgress = mutableStateOf(null) + private val connectProgressByTimeout = mutableStateOf(false) + private var onCancel: (() -> Unit)? = null + + private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) + + fun startConnectProgress(text: String, onCancel: (() -> Unit)? = null) { + connectInProgress.value = text + this.onCancel = onCancel + coroutineScope.launch { + delay(1000) + connectProgressByTimeout.value = connectInProgress.value != null + } + } + + fun stopConnectProgress() { + connectInProgress.value = null + onCancel = null + connectProgressByTimeout.value = false + } + + fun cancelConnectProgress() { + onCancel?.invoke() + stopConnectProgress() + } + + val showConnectProgress: String? get() = + if (connectProgressByTimeout.value) connectInProgress.value else null +} + +val connectProgressManager = ConnectProgressManager + /* * Without this annotation an animation from ChatList to ChatView has 1 frame per the whole animation. Don't delete it * */ diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index 53f58bba0b..136d38e215 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -673,32 +673,35 @@ object ChatController { } } - private suspend fun sendCmdWithRetry(rhId: Long?, cmd: CC, retryNum: Int = 0): API? { + private suspend fun sendCmdWithRetry(rhId: Long?, cmd: CC, inProgress: MutableState? = null, retryNum: Int = 0): API? { val r = sendCmd(rhId, cmd, retryNum = retryNum) val alert = if (r is API.Error) retryableNetworkErrorAlert(r.err) else null - if (alert == null) return r - else return suspendCancellableCoroutine { cont -> - showRetryAlert( - alert, - onCancel = { - cont.resumeWith(Result.success(null)) - }, - onRetry = { - withLongRunningApi { - cont.resumeWith( - runCatching { - coroutineScope { - sendCmdWithRetry(rhId, cmd, retryNum = retryNum + 1) + if ((inProgress == null || inProgress.value) && alert != null) { + return suspendCancellableCoroutine { cont -> + showRetryAlert( + alert, + onCancel = { + cont.resumeWith(Result.success(null)) + }, + onRetry = { + withLongRunningApi { + cont.resumeWith( + runCatching { + coroutineScope { + sendCmdWithRetry(rhId, cmd, inProgress = inProgress, retryNum = retryNum + 1) + } } - } - ) + ) + } } - } - ) + ) - cont.invokeOnCancellation { - cont.resumeWith(Result.success(null)) + cont.invokeOnCancellation { + cont.resumeWith(Result.success(null)) + } } + } else { + return r } } @@ -1408,11 +1411,11 @@ object ChatController { return null } - suspend fun apiConnectPlan(rh: Long?, connLink: String): Pair? { + suspend fun apiConnectPlan(rh: Long?, connLink: String, inProgress: MutableState): Pair? { val userId = kotlin.runCatching { currentUserId("apiConnectPlan") }.getOrElse { return null } - val r = sendCmdWithRetry(rh, CC.APIConnectPlan(userId, connLink)) + val r = sendCmdWithRetry(rh, CC.APIConnectPlan(userId, connLink), inProgress = inProgress) if (r is API.Result && r.res is CR.CRConnectionPlan) return r.res.connLink to r.res.connectionPlan - if (r != null) apiConnectResponseAlert(r) + if (inProgress.value && r != null) apiConnectResponseAlert(r) return null } @@ -1517,10 +1520,9 @@ object ChatController { suspend fun apiConnectPreparedContact(rh: Long?, contactId: Long, incognito: Boolean, msg: MsgContent?): Contact? { val r = sendCmdWithRetry(rh, CC.APIConnectPreparedContact(contactId, incognito, msg)) if (r is API.Result && r.res is CR.StartedConnectionToContact) return r.res.contact - if (r == null) return null - Log.e(TAG, "apiConnectPreparedContact bad response: ${r.responseType} ${r.details}") - if (!(networkErrorAlert(r))) { - apiErrorAlert("apiConnectPreparedContact", generalGetString(MR.strings.connection_error), r) + if (r != null) { + Log.e(TAG, "apiConnectPreparedContact bad response: ${r.responseType} ${r.details}") + apiConnectResponseAlert(r) } return null } @@ -1528,10 +1530,9 @@ object ChatController { suspend fun apiConnectPreparedGroup(rh: Long?, groupId: Long, incognito: Boolean, msg: MsgContent?): GroupInfo? { val r = sendCmdWithRetry(rh, CC.APIConnectPreparedGroup(groupId, incognito, msg)) if (r is API.Result && r.res is CR.StartedConnectionToGroup) return r.res.groupInfo - if (r == null) return null - Log.e(TAG, "apiConnectPreparedGroup bad response: ${r.responseType} ${r.details}") - if (!(networkErrorAlert(r))) { - apiErrorAlert("apiConnectPreparedGroup", generalGetString(MR.strings.connection_error), r) + if (r != null) { + Log.e(TAG, "apiConnectPreparedGroup bad response: ${r.responseType} ${r.details}") + apiConnectResponseAlert(r) } return null } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index b77713831b..444255a5fb 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -53,6 +53,40 @@ import kotlin.math.* @Stable data class ItemSeparation(val timestamp: Boolean, val largeGap: Boolean, val date: Instant?) +@Composable +fun ConnectInProgressView(s: String) { + Surface(color = MaterialTheme.colors.background) { + Divider() + Row( + Modifier + .height(60.dp) + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Row( + Modifier + .padding(start = 10.dp) + .fillMaxWidth() + .weight(1F), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + ComposeProgressIndicator() + Text(s) + } + + IconButton(onClick = { connectProgressManager.cancelConnectProgress() }) { + Icon( + painterResource(MR.images.ic_close), + contentDescription = stringResource(MR.strings.cancel_verb), + tint = MaterialTheme.colors.primary, + modifier = Modifier.padding(10.dp) + ) + } + } + } +} + @Composable // staleChatId means the id that was before chatModel.chatId becomes null. It's needed for Android only to make transition from chat // to chat list smooth. Otherwise, chat view will become blank right before the transition starts @@ -102,6 +136,13 @@ fun ChatView( val attachmentBottomSheetState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden) val scope = rememberCoroutineScope() val selectedChatItems = rememberSaveable { mutableStateOf(null as Set?) } + if (appPlatform.isAndroid) { + DisposableEffect(Unit) { + onDispose { + connectProgressManager.cancelConnectProgress() + } + } + } LaunchedEffect(Unit) { // snapshotFlow here is because it reacts much faster on changes in chatModel.chatId.value. // With LaunchedEffect(chatModel.chatId.value) there is a noticeable delay before reconstruction of the view @@ -110,6 +151,9 @@ fun ChatView( .distinctUntilChanged() .filterNotNull() .collect { chatId -> + if (appPlatform.isAndroid) { + connectProgressManager.cancelConnectProgress() + } if (chatsCtx.secondaryContextFilter == null) { markUnreadChatAsRead(chatId) } @@ -177,6 +221,10 @@ fun ChatView( Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally ) { + val connectInProgressText = connectProgressManager.showConnectProgress + if (appPlatform.isAndroid && connectInProgressText != null) { + ConnectInProgressView(connectInProgressText) + } val connectingText = connectingText(chatInfo) if (connectingText != null) { Text( diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextContactRequestActionsView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextContactRequestActionsView.kt index 2938cdd5c3..332d205cf1 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextContactRequestActionsView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeContextContactRequestActionsView.kt @@ -6,9 +6,11 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.material.* -import androidx.compose.runtime.Composable +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -19,68 +21,94 @@ import chat.simplex.common.views.helpers.* import chat.simplex.res.MR import dev.icerock.moko.resources.compose.painterResource import dev.icerock.moko.resources.compose.stringResource +import kotlinx.coroutines.delay @Composable fun ComposeContextContactRequestActionsView( rhId: Long?, contactRequestId: Long ) { - Column( - Modifier - .height(60.dp) - .background(MaterialTheme.colors.surface) + val inProgress = rememberSaveable { mutableStateOf(false) } + var progressByTimeout by rememberSaveable { mutableStateOf(false) } + + LaunchedEffect(inProgress.value) { + progressByTimeout = if (inProgress.value) { + delay(1000) + inProgress.value + } else { + false + } + } + + Box( + Modifier.height(60.dp), + contentAlignment = Alignment.Center ) { - Divider() - - Row( + Column( Modifier - .fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceEvenly, + .background(MaterialTheme.colors.surface) + .alpha(if (progressByTimeout) 0.6f else 1f) ) { - Row( - Modifier - .fillMaxWidth() - .fillMaxHeight() - .weight(1F) - .clickable { - showRejectRequestAlert(rhId, contactRequestId) - }, - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center - ) { - Icon( - painterResource(MR.images.ic_close), - contentDescription = null, - tint = Color.Red, - ) - TextIconSpaced(false) - Text(stringResource(MR.strings.reject_contact_button), color = Color.Red) - } + Divider() Row( Modifier - .fillMaxWidth() - .fillMaxHeight() - .weight(1F) - .clickable { - if (chatModel.addressShortLinkDataSet()) { - acceptContactRequest(rhId, incognito = false, contactRequestId, isCurrentUser = true, chatModel) - } else { - showAcceptRequestAlert(rhId, contactRequestId) - } - }, - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center + .fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceEvenly, ) { - Icon( - painterResource(MR.images.ic_check), - contentDescription = null, - tint = MaterialTheme.colors.primary, - ) - TextIconSpaced(false) - Text(stringResource(MR.strings.accept_contact_button), color = MaterialTheme.colors.primary) + var rejectButtonModifier = Modifier.fillMaxWidth().fillMaxHeight().weight(1F) + rejectButtonModifier = + if (inProgress.value) rejectButtonModifier + else rejectButtonModifier.clickable { showRejectRequestAlert(rhId, contactRequestId) } + Row( + rejectButtonModifier, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + Icon( + painterResource(MR.images.ic_close), + contentDescription = null, + tint = if (inProgress.value) MaterialTheme.colors.secondary else Color.Red, + ) + TextIconSpaced(false) + Text( + stringResource(MR.strings.reject_contact_button), + color = if (inProgress.value) MaterialTheme.colors.secondary else Color.Red + ) + } + var acceptButtonModifier = Modifier.fillMaxWidth().fillMaxHeight().weight(1F) + acceptButtonModifier = + if (inProgress.value) acceptButtonModifier + else + acceptButtonModifier.clickable { + if (chatModel.addressShortLinkDataSet()) { + acceptContactRequest(rhId, incognito = false, contactRequestId, isCurrentUser = true, chatModel = chatModel, close = null, inProgress = inProgress) + } else { + showAcceptRequestAlert(rhId, contactRequestId, inProgress = inProgress) + } + } + Row( + acceptButtonModifier, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + Icon( + painterResource(MR.images.ic_check), + contentDescription = null, + tint = if (inProgress.value) MaterialTheme.colors.secondary else MaterialTheme.colors.primary, + ) + TextIconSpaced(false) + Text( + stringResource(MR.strings.accept_contact_button), + color = if (inProgress.value) MaterialTheme.colors.secondary else MaterialTheme.colors.primary + ) + } } } + + if (progressByTimeout) { + ComposeProgressIndicator() + } } } @@ -98,7 +126,7 @@ fun showRejectRequestAlert(rhId: Long?, contactRequestId: Long) { ) } -fun showAcceptRequestAlert(rhId: Long?, contactRequestId: Long) { +fun showAcceptRequestAlert(rhId: Long?, contactRequestId: Long, inProgress: MutableState) { AlertManager.shared.showAlertDialogButtonsColumn( title = generalGetString(MR.strings.accept_contact_request), buttons = { @@ -106,14 +134,14 @@ fun showAcceptRequestAlert(rhId: Long?, contactRequestId: Long) { // Accept SectionItemView({ AlertManager.shared.hideAlert() - acceptContactRequest(rhId, incognito = false, contactRequestId, isCurrentUser = true, chatModel) + acceptContactRequest(rhId, incognito = false, contactRequestId, isCurrentUser = true, chatModel = chatModel, close = null, inProgress = inProgress) }) { Text(generalGetString(MR.strings.accept_contact_button), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.primary) } // Accept incognito SectionItemView({ AlertManager.shared.hideAlert() - acceptContactRequest(rhId, incognito = true, contactRequestId, isCurrentUser = true, chatModel) + acceptContactRequest(rhId, incognito = true, contactRequestId, isCurrentUser = true, chatModel = chatModel, close = null, inProgress = inProgress) }) { Text(generalGetString(MR.strings.accept_contact_incognito_button), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.primary) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt index 5e34bfc0df..f4ae0d7607 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt @@ -97,6 +97,7 @@ data class ComposeState( val preview: ComposePreview = ComposePreview.NoPreview, val contextItem: ComposeContextItem = ComposeContextItem.NoContextItem, val inProgress: Boolean = false, + val progressByTimeout: Boolean = false, val useLinkPreviews: Boolean, val mentions: MentionedMembers = emptyMap() ) { @@ -427,7 +428,7 @@ fun ComposeView( fun clearState(live: Boolean = false) { if (live) { - composeState.value = composeState.value.copy(inProgress = false) + composeState.value = composeState.value.copy(inProgress = false, progressByTimeout = false) } else { composeState.value = ComposeState(useLinkPreviews = useLinkPreviews) resetLinkPreview() @@ -1245,6 +1246,7 @@ fun ComposeView( SimpleButtonIconEnded( text = stringResource(MR.strings.compose_view_connect), icon = painterResource(icon), + color = if (composeState.value.inProgress) MaterialTheme.colors.secondary else MaterialTheme.colors.primary, disabled = composeState.value.inProgress, click = { withApi { sendRequest() } } ) @@ -1265,19 +1267,28 @@ fun ComposeView( contentAlignment = Alignment.Center ) { Row( - horizontalArrangement = Arrangement.spacedBy(8.dp) + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically ) { Icon( painterResource(icon), contentDescription = null, - tint = MaterialTheme.colors.primary, + tint = if (composeState.value.inProgress) MaterialTheme.colors.secondary else MaterialTheme.colors.primary ) Text( text, style = MaterialTheme.typography.caption, - color = MaterialTheme.colors.primary + color = if (composeState.value.inProgress) MaterialTheme.colors.secondary else MaterialTheme.colors.primary ) } + if (composeState.value.progressByTimeout) { + Box( + Modifier.fillMaxWidth().padding(end = DEFAULT_PADDING_HALF), + contentAlignment = Alignment.CenterEnd + ) { + ComposeProgressIndicator() + } + } } } @@ -1328,6 +1339,16 @@ fun ComposeView( chatModel.sharedContent.value = null } + LaunchedEffect(composeState.value.inProgress) { + val newProgressByTimeout = if (composeState.value.inProgress) { + delay(1000) + composeState.value.inProgress + } else { + false + } + composeState.value = composeState.value.copy(progressByTimeout = newProgressByTimeout) + } + Column { val currentUser = chatModel.currentUser.value if (chat.chatInfo.nextConnectPrepared && currentUser != null) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt index 8b9caad94d..467f1e52af 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/SendMsgView.kt @@ -65,15 +65,6 @@ fun SendMsgView( val padding = if (appPlatform.isAndroid) PaddingValues(vertical = 8.dp) else PaddingValues(top = 3.dp, bottom = 4.dp) Box(Modifier.padding(padding)) { val cs = composeState.value - var progressByTimeout by rememberSaveable { mutableStateOf(false) } - LaunchedEffect(composeState.value.inProgress) { - progressByTimeout = if (composeState.value.inProgress) { - delay(500) - composeState.value.inProgress - } else { - false - } - } val showVoiceButton = !nextConnect && cs.message.text.isEmpty() && showVoiceRecordIcon && !composeState.value.editing && !composeState.value.forwarding && cs.liveMessage == null && (cs.preview is ComposePreview.NoPreview || recState.value is RecordingState.Started) && (cs.contextItem !is ComposeContextItem.ReportedItem) val showDeleteTextButton = rememberSaveable { mutableStateOf(false) } @@ -137,7 +128,7 @@ fun SendMsgView( } } when { - progressByTimeout -> ProgressIndicator() + cs.progressByTimeout -> ComposeProgressIndicator() cs.contextItem is ComposeContextItem.ReportedItem -> { SendMsgButton(painterResource(MR.images.ic_check_filled), sendButtonSize, sendButtonAlpha, sendButtonColor, !sendMsgButtonDisabled, sendToConnect, sendMessage) } @@ -411,8 +402,8 @@ private fun RecordVoiceButton(interactionSource: MutableInteractionSource) { } @Composable -private fun ProgressIndicator() { - CircularProgressIndicator(Modifier.size(36.dp).padding(4.dp), color = MaterialTheme.colors.secondary, strokeWidth = 3.dp) +fun ComposeProgressIndicator() { + CircularProgressIndicator(Modifier.size(36.dp).padding(4.dp), color = MaterialTheme.colors.secondary, strokeWidth = 2.5.dp) } @Composable diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt index feba9acd79..4f06277e6f 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListNavLinkView.kt @@ -695,9 +695,19 @@ fun contactRequestAlertDialog(rhId: Long?, contactRequest: ChatInfo.ContactReque ) } -fun acceptContactRequest(rhId: Long?, incognito: Boolean, contactRequestId: Long, isCurrentUser: Boolean, chatModel: ChatModel, close: ((chat: Chat) -> Unit)? = null ) { +fun acceptContactRequest( + rhId: Long?, + incognito: Boolean, + contactRequestId: Long, + isCurrentUser: Boolean, + chatModel: ChatModel, + close: ((chat: Chat) -> Unit)? = null, + inProgress: MutableState? = null +) { withBGApi { + inProgress?.value = true val contact = chatModel.controller.apiAcceptContactRequest(rhId, incognito, contactRequestId) + inProgress?.value = false if (contact != null && isCurrentUser) { val chat = Chat(remoteHostId = rhId, ChatInfo.Direct(contact), listOf()) withContext(Dispatchers.Main) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt index 91d2699b7d..5e9bac515d 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt @@ -55,6 +55,7 @@ sealed class ActiveFilter { } private fun showNewChatSheet(oneHandUI: State) { + connectProgressManager.cancelConnectProgress() ModalManager.start.closeModals() ModalManager.end.closeModals() chatModel.newChatSheetVisible.value = true @@ -348,22 +349,64 @@ private fun ChatListToolbar(userPickerState: MutableStateFlow val updatingProgress = remember { chatModel.updatingProgress }.value val oneHandUI = remember { appPrefs.oneHandUI.state } - if (oneHandUI.value) { - val sp16 = with(LocalDensity.current) { 16.sp.toDp() } - - if (appPlatform.isDesktop && oneHandUI.value) { - val call = remember { chatModel.activeCall } - if (call.value != null) { - barButtons.add { - val c = call.value - if (c != null) { - ActiveCallInteractiveArea(c) - Spacer(Modifier.width(5.dp)) - } + if (updatingProgress != null) { + barButtons.add { + val interactionSource = remember { MutableInteractionSource() } + val hovered = interactionSource.collectIsHoveredAsState().value + IconButton(onClick = { + chatModel.updatingRequest?.close() + }, Modifier.hoverable(interactionSource)) { + if (hovered) { + Icon(painterResource(MR.images.ic_close), null, tint = WarningOrange) + } else if (updatingProgress == -1f) { + CIFileViewScope.progressIndicator() + } else { + CIFileViewScope.progressCircle((updatingProgress * 100).toLong(), 100) } } } - if (!stopped) { + } + + if (stopped) { + barButtons.add { + IconButton(onClick = { + AlertManager.shared.showAlertMsg( + generalGetString(MR.strings.chat_is_stopped_indication), + generalGetString(MR.strings.you_can_start_chat_via_setting_or_by_restarting_the_app) + ) + }) { + Icon( + painterResource(MR.images.ic_report_filled), + generalGetString(MR.strings.chat_is_stopped_indication), + tint = Color.Red, + ) + } + } + } else { + if (connectProgressManager.showConnectProgress != null) { + barButtons.add { + Box(Modifier.padding(horizontal = DEFAULT_PADDING_HALF)) { + CIFileViewScope.progressIndicator() + } + } + } + + if (oneHandUI.value) { + val sp16 = with(LocalDensity.current) { 16.sp.toDp() } + + if (appPlatform.isDesktop && oneHandUI.value) { + val call = remember { chatModel.activeCall } + if (call.value != null) { + barButtons.add { + val c = call.value + if (c != null) { + ActiveCallInteractiveArea(c) + Spacer(Modifier.width(5.dp)) + } + } + } + } + barButtons.add { IconButton( onClick = { @@ -388,38 +431,6 @@ private fun ChatListToolbar(userPickerState: MutableStateFlow } } - if (updatingProgress != null) { - barButtons.add { - val interactionSource = remember { MutableInteractionSource() } - val hovered = interactionSource.collectIsHoveredAsState().value - IconButton(onClick = { - chatModel.updatingRequest?.close() - }, Modifier.hoverable(interactionSource)) { - if (hovered) { - Icon(painterResource(MR.images.ic_close), null, tint = WarningOrange) - } else if (updatingProgress == -1f) { - CIFileViewScope.progressIndicator() - } else { - CIFileViewScope.progressCircle((updatingProgress * 100).toLong(), 100) - } - } - } - } else if (stopped) { - barButtons.add { - IconButton(onClick = { - AlertManager.shared.showAlertMsg( - generalGetString(MR.strings.chat_is_stopped_indication), - generalGetString(MR.strings.you_can_start_chat_via_setting_or_by_restarting_the_app) - ) - }) { - Icon( - painterResource(MR.images.ic_report_filled), - generalGetString(MR.strings.chat_is_stopped_indication), - tint = Color.Red, - ) - } - } - } val clipboard = LocalClipboardManager.current val scope = rememberCoroutineScope() val canScrollToZero = remember { derivedStateOf { listState.firstVisibleItemIndex != 0 || listState.firstVisibleItemScrollOffset != 0 } } @@ -658,8 +669,11 @@ private fun ChatListSearchBar(listState: LazyListState, searchText: MutableState if (it.isNotEmpty()) { // if some other text is pasted, enter search mode focusRequester.requestFocus() - } else if (listState.layoutInfo.totalItemsCount > 0) { - listState.scrollToItem(0) + } else { + connectProgressManager.cancelConnectProgress() + if (listState.layoutInfo.totalItemsCount > 0) { + listState.scrollToItem(0) + } } searchShowingSimplexLink.value = false searchChatFilteredBySimplexLink.value = null diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt index 73c59f61a2..786e3483c5 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt @@ -3,6 +3,8 @@ package chat.simplex.common.views.newchat import SectionItemView import androidx.compose.foundation.layout.* import androidx.compose.material.* +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -25,6 +27,24 @@ suspend fun planAndConnect( cleanup: (() -> Unit)? = null, filterKnownContact: ((Contact) -> Unit)? = null, filterKnownGroup: ((GroupInfo) -> Unit)? = null, +): CompletableDeferred { + connectProgressManager.cancelConnectProgress() + val inProgress = mutableStateOf(true) + connectProgressManager.startConnectProgress(generalGetString(MR.strings.loading_profile)) { + inProgress.value = false + cleanup?.invoke() + } + return planAndConnectTask(rhId, shortOrFullLink, close, cleanup, filterKnownContact, filterKnownGroup, inProgress) +} + +private suspend fun planAndConnectTask( + rhId: Long?, + shortOrFullLink: String, + close: (() -> Unit)?, + cleanup: (() -> Unit)? = null, + filterKnownContact: ((Contact) -> Unit)? = null, + filterKnownGroup: ((GroupInfo) -> Unit)? = null, + inProgress: MutableState ): CompletableDeferred { val completable = CompletableDeferred() val close: (() -> Unit) = { @@ -36,7 +56,9 @@ suspend fun planAndConnect( cleanup?.invoke() completable.complete(!completable.isActive) } - val result = chatModel.controller.apiConnectPlan(rhId, shortOrFullLink) + val result = chatModel.controller.apiConnectPlan(rhId, shortOrFullLink, inProgress = inProgress) + connectProgressManager.stopConnectProgress() + if (!inProgress.value) { return completable } if (result != null) { val (connectionLink, connectionPlan) = result val link = strHasSingleSimplexLink(shortOrFullLink.trim()) @@ -259,6 +281,8 @@ suspend fun planAndConnect( ) } } + } else { + cleanup() } return completable } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt index 54620f8d60..1cb1903a14 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt @@ -29,6 +29,7 @@ import chat.simplex.common.model.* import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.platform.* import chat.simplex.common.ui.theme.* +import chat.simplex.common.views.chat.item.CIFileViewScope import chat.simplex.common.views.chat.topPaddingToContent import chat.simplex.common.views.chatlist.* import chat.simplex.common.views.contacts.* @@ -40,6 +41,12 @@ import kotlinx.coroutines.flow.filter @Composable fun ModalData.NewChatSheet(rh: RemoteHostInfo?, close: () -> Unit) { + DisposableEffect(Unit) { + onDispose { + connectProgressManager.cancelConnectProgress() + } + } + val oneHandUI = remember { appPrefs.oneHandUI.state } Box { @@ -472,6 +479,13 @@ private fun ContactsSearchBar( ) { searchText.value = searchText.value.copy(it) } + + if (connectProgressManager.showConnectProgress != null) { + Box(Modifier.padding(end = DEFAULT_PADDING_HALF)) { + CIFileViewScope.progressIndicator(sizeMultiplier = 0.75f) + } + } + val hasText = remember { derivedStateOf { searchText.value.text.isNotEmpty() } } if (hasText.value) { val hideSearchOnBack: () -> Unit = { searchText.value = TextFieldValue() } @@ -522,8 +536,11 @@ private fun ContactsSearchBar( if (it.isNotEmpty()) { // if some other text is pasted, enter search mode focusRequester.requestFocus() - } else if (listState.layoutInfo.totalItemsCount > 0) { - listState.scrollToItem(0) + } else { + connectProgressManager.cancelConnectProgress() + if (listState.layoutInfo.totalItemsCount > 0) { + listState.scrollToItem(0) + } } searchShowingSimplexLink.value = false searchChatFilteredBySimplexLink.value = null diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt index 6c8f9f944c..b0846b4bb8 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.material.* import androidx.compose.runtime.* @@ -34,6 +35,7 @@ import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.model.ChatModel.controller import chat.simplex.common.platform.* import chat.simplex.common.ui.theme.* +import chat.simplex.common.views.chat.item.CIFileViewScope import chat.simplex.common.views.chat.topPaddingToContent import chat.simplex.common.views.helpers.* import chat.simplex.common.views.usersettings.* @@ -574,6 +576,12 @@ fun AddContactLearnMoreButton() { @Composable private fun ConnectView(rhId: Long?, showQRCodeScanner: MutableState, pastedLink: MutableState, close: () -> Unit) { + DisposableEffect(Unit) { + onDispose { + connectProgressManager.cancelConnectProgress() + } + } + SectionView(stringResource(MR.strings.paste_the_link_you_received).uppercase(), headerBottomPadding = 5.dp) { PasteLinkView(rhId, pastedLink, showQRCodeScanner, close) } @@ -614,10 +622,25 @@ private fun PasteLinkView(rhId: Long?, pastedLink: MutableState, showQRC ) } }) { - Text(stringResource(MR.strings.tap_to_paste_link)) + Box(Modifier.weight(1f)) { + Text(stringResource(MR.strings.tap_to_paste_link)) + } + if (connectProgressManager.showConnectProgress != null) { + CIFileViewScope.progressIndicator(sizeMultiplier = 0.6f) + } } } else { - LinkTextView(pastedLink.value, false) + Row( + Modifier.padding(end = DEFAULT_PADDING), + verticalAlignment = Alignment.CenterVertically + ) { + Box(Modifier.weight(1f)) { + LinkTextView(pastedLink.value, false) + } + if (connectProgressManager.showConnectProgress != null) { + CIFileViewScope.progressIndicator(sizeMultiplier = 0.6f) + } + } } } diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index c518c088fb..3b9d57090a 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -862,6 +862,7 @@ Paste the link you received The text you pasted is not a SimpleX link. Tap to paste link + Loading profile… Invalid QR code The code you scanned is not a SimpleX link QR code. From a5768e903d9d1849ce7fb9d115407682d1d00012 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Fri, 11 Jul 2025 21:28:10 +0100 Subject: [PATCH 12/18] core, ui: short bio/description for contact and group profiles (#6055) * core: short bio/description for contact and group profiles * use short description in commands * fix tests * query plans * ios: show contact and group profile descriptions * android, desktop: short description/bio * ui: layout for chat info, correct copy * comment out fields to add/edit short descriptions * remove short description from events * postgres schema --- apps/ios/Shared/Views/Chat/ChatInfoView.swift | 84 ++++---- .../Views/Chat/Group/GroupChatInfoView.swift | 38 ++-- .../Chat/Group/GroupMemberInfoView.swift | 16 +- .../Views/Chat/Group/GroupProfileView.swift | 2 + .../Views/Onboarding/CreateProfile.swift | 7 +- .../Views/UserSettings/UserProfile.swift | 2 + apps/ios/SimpleX.xcodeproj/project.pbxproj | 16 +- apps/ios/SimpleXChat/ChatTypes.swift | 47 ++++- .../chat/simplex/common/model/ChatModel.kt | 28 ++- .../chat/simplex/common/model/SimpleXAPI.kt | 2 +- .../chat/simplex/common/views/WelcomeView.kt | 19 +- .../simplex/common/views/chat/ChatInfoView.kt | 53 +++-- .../views/chat/group/GroupChatInfoView.kt | 26 +-- .../views/chat/group/GroupMemberInfoView.kt | 22 +- .../views/chat/group/GroupProfileView.kt | 25 ++- .../views/chat/item/CIGroupInvitationView.kt | 2 +- .../common/views/localauth/LocalAuthView.kt | 2 +- .../common/views/newchat/AddGroupView.kt | 1 + .../views/usersettings/UserProfileView.kt | 34 +++- .../commonMain/resources/MR/base/strings.xml | 3 + .../src/Directory/Service.hs | 23 ++- simplex-chat.cabal | 2 + src/Simplex/Chat/Controller.hs | 2 +- src/Simplex/Chat/Core.hs | 2 +- src/Simplex/Chat/Help.hs | 8 +- src/Simplex/Chat/Library/Commands.hs | 33 +-- src/Simplex/Chat/Library/Internal.hs | 6 +- src/Simplex/Chat/Library/Subscriber.hs | 6 +- src/Simplex/Chat/Messages/CIContent.hs | 4 +- src/Simplex/Chat/ProfileGenerator.hs | 2 +- src/Simplex/Chat/Store/Connections.hs | 12 +- src/Simplex/Chat/Store/ContactRequest.hs | 13 +- src/Simplex/Chat/Store/Direct.hs | 24 +-- src/Simplex/Chat/Store/Groups.hs | 106 +++++----- src/Simplex/Chat/Store/Messages.hs | 44 ++-- src/Simplex/Chat/Store/Postgres/Migrations.hs | 4 +- .../M20250709_profile_short_descr.hs | 23 +++ .../Store/Postgres/Migrations/chat_schema.sql | 6 +- src/Simplex/Chat/Store/Profiles.hs | 14 +- src/Simplex/Chat/Store/SQLite/Migrations.hs | 4 +- .../M20250709_profile_short_descr.hs | 20 ++ .../SQLite/Migrations/chat_query_plans.txt | 189 ++++++++---------- .../Store/SQLite/Migrations/chat_schema.sql | 6 +- src/Simplex/Chat/Store/Shared.hs | 63 +++--- src/Simplex/Chat/Types.hs | 25 ++- src/Simplex/Chat/View.hs | 75 +++---- tests/Bots/BroadcastTests.hs | 2 +- tests/Bots/DirectoryTests.hs | 48 ++--- tests/ChatTests/Groups.hs | 62 ++++-- tests/ChatTests/Local.hs | 2 +- tests/ChatTests/Profiles.hs | 71 +++---- tests/ChatTests/Utils.hs | 23 ++- tests/JSONFixtures.hs | 6 +- tests/ProtocolTests.hs | 6 +- tests/RemoteTests.hs | 8 +- 55 files changed, 810 insertions(+), 563 deletions(-) create mode 100644 src/Simplex/Chat/Store/Postgres/Migrations/M20250709_profile_short_descr.hs create mode 100644 src/Simplex/Chat/Store/SQLite/Migrations/M20250709_profile_short_descr.hs diff --git a/apps/ios/Shared/Views/Chat/ChatInfoView.swift b/apps/ios/Shared/Views/Chat/ChatInfoView.swift index 1cf017d8ea..42a14c2395 100644 --- a/apps/ios/Shared/Views/Chat/ChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatInfoView.swift @@ -111,7 +111,7 @@ struct ChatInfoView: View { @State private var sendReceiptsUserDefault = true @State private var progressIndicator = false @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false - + enum ChatInfoViewAlert: Identifiable { case clearChatAlert case networkStatusAlert @@ -135,7 +135,7 @@ struct ChatInfoView: View { } } } - + var body: some View { NavigationView { ZStack { @@ -146,12 +146,12 @@ struct ChatInfoView: View { .onTapGesture { aliasTextFieldFocused = false } - + localAliasTextEdit() .listRowBackground(Color.clear) .listRowSeparator(.hidden) .padding(.bottom, 18) - + GeometryReader { g in HStack(alignment: .center, spacing: 8) { let buttonWidth = g.size.width / 4 @@ -169,7 +169,7 @@ struct ChatInfoView: View { .listRowBackground(Color.clear) .listRowSeparator(.hidden) .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 8)) - + if let customUserProfile = customUserProfile { Section(header: Text("Incognito").foregroundColor(theme.colors.secondary)) { HStack { @@ -180,7 +180,7 @@ struct ChatInfoView: View { } } } - + Section { if let code = connectionCode { verifyCodeButton(code) } contactPreferencesButton() @@ -203,19 +203,19 @@ struct ChatInfoView: View { // } } .disabled(!contact.ready || !contact.active) - + Section { ChatTTLOption(chat: chat, progressIndicator: $progressIndicator) } footer: { Text("Delete chat messages from your device.") } - + if let conn = contact.activeConn { Section { infoRow(Text(String("E2E encryption")), conn.connPQEnabled ? "Quantum resistant" : "Standard") } } - + if let contactLink = contact.contactLink { Section { SimpleXLinkQRCode(uri: contactLink) @@ -232,7 +232,7 @@ struct ChatInfoView: View { .foregroundColor(theme.colors.secondary) } } - + if contact.ready && contact.active { Section(header: Text("Servers").foregroundColor(theme.colors.secondary)) { networkStatusRow() @@ -261,12 +261,12 @@ struct ChatInfoView: View { } } } - + Section { clearChatButton() deleteContactButton() } - + if developerTools { Section(header: Text("For console").foregroundColor(theme.colors.secondary)) { infoRow("Local name", chat.chatInfo.localDisplayName) @@ -291,7 +291,7 @@ struct ChatInfoView: View { .navigationBarHidden(true) .disabled(progressIndicator) .opacity(progressIndicator ? 0.6 : 1) - + if progressIndicator { ProgressView().scaleEffect(2) } @@ -303,7 +303,7 @@ struct ChatInfoView: View { sendReceiptsUserDefault = currentUser.sendRcptsContacts } sendReceipts = SendReceipts.fromBool(contact.chatSettings.sendRcpts, userDefault: sendReceiptsUserDefault) - + Task { do { let (stats, profile) = try await apiContactInfo(chat.chatInfo.apiId) @@ -342,7 +342,7 @@ struct ChatInfoView: View { } } .actionSheet(item: $actionSheet) { $0.actionSheet } - .sheet(item: $sheet) { + .sheet(item: $sheet) { if #available(iOS 16.0, *) { $0.content .presentationDetents([.fraction($0.fraction)]) @@ -361,41 +361,51 @@ struct ChatInfoView: View { } } } - + private func contactInfoHeader() -> some View { VStack(spacing: 8) { let cInfo = chat.chatInfo ChatInfoImage(chat: chat, size: 192, color: Color(uiColor: .tertiarySystemFill)) .padding(.vertical, 12) + // show actual display name, alias can be edited in this view + let displayName = contact.profile.displayName.trimmingCharacters(in: .whitespacesAndNewlines) + let fullName = cInfo.fullName.trimmingCharacters(in: .whitespacesAndNewlines) if contact.verified { ( Text(Image(systemName: "checkmark.shield")) .foregroundColor(theme.colors.secondary) .font(.title2) + textSpace - + Text(contact.profile.displayName) + + Text(displayName) .font(.largeTitle) ) .multilineTextAlignment(.center) .lineLimit(2) .padding(.bottom, 2) } else { - Text(contact.profile.displayName) + Text(displayName) .font(.largeTitle) .multilineTextAlignment(.center) .lineLimit(2) .padding(.bottom, 2) } - if cInfo.fullName != "" && cInfo.fullName != cInfo.displayName && cInfo.fullName != contact.profile.displayName { + if fullName != "" && fullName != displayName && fullName != cInfo.displayName.trimmingCharacters(in: .whitespacesAndNewlines) { Text(cInfo.fullName) .font(.title2) .multilineTextAlignment(.center) + .lineLimit(3) + .padding(.bottom, 2) + } + if let descr = cInfo.shortDescr?.trimmingCharacters(in: .whitespacesAndNewlines), descr != "" { + Text(descr) + .font(.subheadline) + .multilineTextAlignment(.center) .lineLimit(4) } } .frame(maxWidth: .infinity, alignment: .center) } - + private func localAliasTextEdit() -> some View { TextField("Set contact name…", text: $localAlias) .disableAutocorrection(true) @@ -412,7 +422,7 @@ struct ChatInfoView: View { .multilineTextAlignment(.center) .foregroundColor(theme.colors.secondary) } - + private func setContactAlias() { Task { do { @@ -475,7 +485,7 @@ struct ChatInfoView: View { ) } } - + private func contactPreferencesButton() -> some View { NavigationLink { ContactPreferencesView( @@ -491,7 +501,7 @@ struct ChatInfoView: View { Label("Contact preferences", systemImage: "switch.2") } } - + private func sendReceiptsOption() -> some View { WrappedPicker(selection: $sendReceipts) { ForEach([.yes, .no, .userDefault(sendReceiptsUserDefault)]) { (opt: SendReceipts) in @@ -504,7 +514,7 @@ struct ChatInfoView: View { setSendReceipts() } } - + private func setSendReceipts() { var chatSettings = chat.chatInfo.chatSettings ?? ChatSettings.defaults chatSettings.sendRcpts = sendReceipts.bool() @@ -524,7 +534,7 @@ struct ChatInfoView: View { .foregroundColor(.orange) } } - + private func synchronizeConnectionButtonForce() -> some View { Button { alert = .syncConnectionForceAlert @@ -533,7 +543,7 @@ struct ChatInfoView: View { .foregroundColor(.red) } } - + private func networkStatusRow() -> some View { HStack { Text("Network status") @@ -546,14 +556,14 @@ struct ChatInfoView: View { serverImage() } } - + private func serverImage() -> some View { let status = networkModel.contactNetworkStatus(contact) return Image(systemName: status.imageName) .foregroundColor(status == .connected ? .green : theme.colors.secondary) .font(.system(size: 12)) } - + private func deleteContactButton() -> some View { Button(role: .destructive) { deleteContactDialog( @@ -569,7 +579,7 @@ struct ChatInfoView: View { .foregroundColor(Color.red) } } - + private func clearChatButton() -> some View { Button() { alert = .clearChatAlert @@ -578,7 +588,7 @@ struct ChatInfoView: View { .foregroundColor(Color.orange) } } - + private func clearChatAlert() -> Alert { Alert( title: Text("Clear conversation?"), @@ -592,14 +602,14 @@ struct ChatInfoView: View { secondaryButton: .cancel() ) } - + private func networkStatusAlert() -> Alert { Alert( title: Text("Network status"), message: Text(networkModel.contactNetworkStatus(contact).statusExplanation) ) } - + private func switchContactAddress() { Task { do { @@ -618,7 +628,7 @@ struct ChatInfoView: View { } } } - + private func abortSwitchContactAddress() { Task { do { @@ -636,7 +646,7 @@ struct ChatInfoView: View { } } } - + private func savePreferences() { Task { do { @@ -668,7 +678,7 @@ struct ChatTTLOption: View { } let defaultTTL = ChatTTL.userDefault(ChatModel.shared.chatItemTTL) Text(defaultTTL.text).tag(defaultTTL) - + if case .chat(let ttl) = chatItemTTL, case .seconds = ttl { Text(ttl.deleteAfterText).tag(chatItemTTL) } @@ -1136,13 +1146,13 @@ func setChatTTL(_ ttl: ChatTTL, hasPreviousTTL: Bool, onCancel: @escaping () -> } else { NSLocalizedString("Enable automatic message deletion?", comment: "alert title") } - + let message = if ttl.neverExpires { NSLocalizedString("Messages in this chat will never be deleted.", comment: "alert message") } else { NSLocalizedString("This action cannot be undone - the messages sent and received in this chat earlier than selected will be deleted.", comment: "alert message") } - + showAlert(title, message: message) { [ UIAlertAction( diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index 2f36e5fa93..0fd4a86ece 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -75,12 +75,12 @@ struct GroupChatInfoView: View { List { groupInfoHeader() .listRowBackground(Color.clear) - + localAliasTextEdit() .listRowBackground(Color.clear) .listRowSeparator(.hidden) .padding(.bottom, 18) - + infoActionButtons() .padding(.horizontal) .frame(maxWidth: .infinity) @@ -124,7 +124,7 @@ struct GroupChatInfoView: View { Text(label) .foregroundColor(theme.colors.secondary) } - + Section { if members.filter({ $0.wrapped.memberCurrent }).count <= SMALL_GROUPS_RCPS_MEM_LIMIT { sendReceiptsOption() @@ -181,7 +181,7 @@ struct GroupChatInfoView: View { leaveGroupButton() } } - + if developerTools { Section(header: Text("For console").foregroundColor(theme.colors.secondary)) { infoRow("Local name", chat.chatInfo.localDisplayName) @@ -193,7 +193,7 @@ struct GroupChatInfoView: View { .navigationBarHidden(true) .disabled(progressIndicator) .opacity(progressIndicator ? 0.6 : 1) - + if progressIndicator { ProgressView().scaleEffect(2) } @@ -234,19 +234,29 @@ struct GroupChatInfoView: View { private func groupInfoHeader() -> some View { VStack { let cInfo = chat.chatInfo + // show actual display name, alias can be edited in this view + let displayName = (cInfo.groupInfo?.groupProfile.displayName ?? cInfo.displayName).trimmingCharacters(in: .whitespacesAndNewlines) + let fullName = cInfo.fullName.trimmingCharacters(in: .whitespacesAndNewlines) ChatInfoImage(chat: chat, size: 192, color: Color(uiColor: .tertiarySystemFill)) .padding(.top, 12) .padding() - Text(cInfo.groupInfo?.groupProfile.displayName ?? cInfo.displayName) + Text(displayName) .font(.largeTitle) .multilineTextAlignment(.center) .lineLimit(4) .padding(.bottom, 2) - if cInfo.fullName != "" && cInfo.fullName != cInfo.displayName { + if fullName != "" && fullName != displayName && fullName != cInfo.displayName.trimmingCharacters(in: .whitespacesAndNewlines) { Text(cInfo.fullName) .font(.title2) .multilineTextAlignment(.center) - .lineLimit(8) + .lineLimit(3) + .padding(.bottom, 2) + } + if let descr = cInfo.shortDescr?.trimmingCharacters(in: .whitespacesAndNewlines), descr != "" { + Text(descr) + .font(.subheadline) + .multilineTextAlignment(.center) + .lineLimit(4) } } .frame(maxWidth: .infinity, alignment: .center) @@ -268,7 +278,7 @@ struct GroupChatInfoView: View { .multilineTextAlignment(.center) .foregroundColor(theme.colors.secondary) } - + private func setGroupAlias() { Task { do { @@ -282,7 +292,7 @@ struct GroupChatInfoView: View { } } } - + func infoActionButtons() -> some View { GeometryReader { g in let buttonWidth = g.size.width / 4 @@ -829,11 +839,11 @@ struct GroupPreferencesButton: View { @State var preferences: FullGroupPreferences @State var currentPreferences: FullGroupPreferences var creatingGroup: Bool = false - + private var label: LocalizedStringKey { groupInfo.businessChat == nil ? "Group preferences" : "Chat preferences" } - + var body: some View { NavigationLink { GroupPreferencesView( @@ -851,7 +861,7 @@ struct GroupPreferencesButton: View { creatingGroup ? "Save" : "Save and notify group members", comment: "alert button" ) - + if groupInfo.fullGroupPreferences != preferences { showAlert( title: NSLocalizedString("Save preferences?", comment: "alert title"), @@ -869,7 +879,7 @@ struct GroupPreferencesButton: View { } } } - + private func savePreferences() { Task { do { diff --git a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift index 275b8dd357..725b5a61fa 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupMemberInfoView.swift @@ -444,29 +444,39 @@ struct GroupMemberInfoView: View { MemberProfileImage(mem, size: 192, color: Color(uiColor: .tertiarySystemFill)) .padding(.top, 12) .padding() + // show alias if set, alias cannot be edited in this view + let displayName = mem.displayName.trimmingCharacters(in: .whitespacesAndNewlines) + let fullName = mem.fullName.trimmingCharacters(in: .whitespacesAndNewlines) if mem.verified { ( Text(Image(systemName: "checkmark.shield")) .foregroundColor(theme.colors.secondary) .font(.title2) + textSpace - + Text(mem.displayName) + + Text(displayName) .font(.largeTitle) ) .multilineTextAlignment(.center) .lineLimit(2) .padding(.bottom, 2) } else { - Text(mem.displayName) + Text(displayName) .font(.largeTitle) .multilineTextAlignment(.center) .lineLimit(2) .padding(.bottom, 2) } - if mem.fullName != "" && mem.fullName != mem.displayName { + if fullName != "" && fullName != displayName && fullName != mem.memberProfile.displayName.trimmingCharacters(in: .whitespacesAndNewlines) { Text(mem.fullName) .font(.title2) .multilineTextAlignment(.center) + .lineLimit(3) + .padding(.bottom, 2) + } + if let descr = mem.memberProfile.shortDescr?.trimmingCharacters(in: .whitespacesAndNewlines), descr != "" { + Text(descr) + .font(.subheadline) + .multilineTextAlignment(.center) .lineLimit(4) } } diff --git a/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift b/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift index 4de3608735..db1c755682 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift @@ -55,6 +55,8 @@ struct GroupProfileView: View { if fullName != "" && fullName != groupProfile.displayName { TextField("Group full name (optional)", text: $groupProfile.fullName) } + // TODO enable in v6.4.1, limit to 160 characters + // TextField("Short description", text: Binding(get: {groupProfile.shortDescr ?? ""}, set: {groupProfile.shortDescr = $0})) } footer: { Text("Group profile is stored on members' devices, not on the servers.") } diff --git a/apps/ios/Shared/Views/Onboarding/CreateProfile.swift b/apps/ios/Shared/Views/Onboarding/CreateProfile.swift index ae72cb1be5..dfc8be738e 100644 --- a/apps/ios/Shared/Views/Onboarding/CreateProfile.swift +++ b/apps/ios/Shared/Views/Onboarding/CreateProfile.swift @@ -29,6 +29,7 @@ struct CreateProfile: View { @Environment(\.dismiss) var dismiss @EnvironmentObject var theme: AppTheme @State private var displayName: String = "" + @State private var profileBio: String = "" @FocusState private var focusDisplayName @State private var alert: UserProfileAlert? @@ -37,6 +38,8 @@ struct CreateProfile: View { Section { TextField("Enter your name…", text: $displayName) .focused($focusDisplayName) + // TODO enable in v6.4.1, limit to 160 characters + // TextField("Bio", text: $profileBio) Button { createProfile() } label: { @@ -80,9 +83,11 @@ struct CreateProfile: View { private func createProfile() { hideKeyboard() + let shortDescr: String? = if profileBio.isEmpty { nil } else { profileBio } let profile = Profile( displayName: displayName.trimmingCharacters(in: .whitespaces), - fullName: "" + fullName: "", + shortDescr: shortDescr ) let m = ChatModel.shared do { diff --git a/apps/ios/Shared/Views/UserSettings/UserProfile.swift b/apps/ios/Shared/Views/UserSettings/UserProfile.swift index aa2c04ccaa..444975d236 100644 --- a/apps/ios/Shared/Views/UserSettings/UserProfile.swift +++ b/apps/ios/Shared/Views/UserSettings/UserProfile.swift @@ -43,6 +43,8 @@ struct UserProfile: View { if let user = chatModel.currentUser, showFullName(user) { TextField("Full name (optional)", text: $profile.fullName) } + // TODO enable in v6.4.1, limit to 160 characters + // TextField("Bio", text: Binding(get: {profile.shortDescr ?? ""}, set: {profile.shortDescr = $0})) } footer: { Text("Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.") } diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 2582eb43bc..fc78a3532d 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -178,8 +178,8 @@ 64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; }; 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829982D54AEED006B9E89 /* libgmp.a */; }; 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829992D54AEEE006B9E89 /* libffi.a */; }; - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a */; }; - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a */; }; + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX-ghc9.6.3.a */; }; + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX.a */; }; 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */; }; 64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; }; 64D0C2C229FA57AB00B38D5F /* UserAddressLearnMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */; }; @@ -543,8 +543,8 @@ 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = ""; }; 64C829982D54AEED006B9E89 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; 64C829992D54AEEE006B9E89 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a"; sourceTree = ""; }; - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a"; sourceTree = ""; }; + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX-ghc9.6.3.a"; sourceTree = ""; }; + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX.a"; sourceTree = ""; }; 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = ""; }; 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressLearnMore.swift; sourceTree = ""; }; @@ -704,8 +704,8 @@ 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */, 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */, 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */, - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a in Frameworks */, - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a in Frameworks */, + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX-ghc9.6.3.a in Frameworks */, + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX.a in Frameworks */, CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -790,8 +790,8 @@ 64C829992D54AEEE006B9E89 /* libffi.a */, 64C829982D54AEED006B9E89 /* libgmp.a */, 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */, - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp-ghc9.6.3.a */, - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-Hjmcl0BGDg19a5be1DeLnp.a */, + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX-ghc9.6.3.a */, + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.4.0.5.1-H9b1PUqJfdC45BY0VzYHX.a */, ); path = Libraries; sourceTree = ""; diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index cab0e3bda6..cd687f619c 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -32,6 +32,7 @@ public struct User: Identifiable, Decodable, UserLike, NamedChat, Hashable { public var displayName: String { get { profile.displayName } } public var fullName: String { get { profile.fullName } } + public var shortDescr: String? { profile.shortDescr } public var image: String? { get { profile.image } } public var localAlias: String { get { "" } } @@ -109,12 +110,14 @@ public struct Profile: Codable, NamedChat, Hashable { public init( displayName: String, fullName: String, + shortDescr: String? = nil, image: String? = nil, contactLink: String? = nil, preferences: Preferences? = nil ) { self.displayName = displayName self.fullName = fullName + self.shortDescr = shortDescr self.image = image self.contactLink = contactLink self.preferences = preferences @@ -122,6 +125,7 @@ public struct Profile: Codable, NamedChat, Hashable { public var displayName: String public var fullName: String + public var shortDescr: String? public var image: String? public var contactLink: String? public var preferences: Preferences? @@ -142,6 +146,7 @@ public struct LocalProfile: Codable, NamedChat, Hashable { profileId: Int64, displayName: String, fullName: String, + shortDescr: String? = nil, image: String? = nil, contactLink: String? = nil, preferences: Preferences? = nil, @@ -150,6 +155,7 @@ public struct LocalProfile: Codable, NamedChat, Hashable { self.profileId = profileId self.displayName = displayName self.fullName = fullName + self.shortDescr = shortDescr self.image = image self.contactLink = contactLink self.preferences = preferences @@ -159,6 +165,7 @@ public struct LocalProfile: Codable, NamedChat, Hashable { public var profileId: Int64 public var displayName: String public var fullName: String + public var shortDescr: String? public var image: String? public var contactLink: String? public var preferences: Preferences? @@ -180,11 +187,27 @@ public struct LocalProfile: Codable, NamedChat, Hashable { } public func toLocalProfile (_ profileId: Int64, _ profile: Profile, _ localAlias: String) -> LocalProfile { - LocalProfile(profileId: profileId, displayName: profile.displayName, fullName: profile.fullName, image: profile.image, contactLink: profile.contactLink, preferences: profile.preferences, localAlias: localAlias) + LocalProfile( + profileId: profileId, + displayName: profile.displayName, + fullName: profile.fullName, + shortDescr: profile.shortDescr, + image: profile.image, + contactLink: profile.contactLink, + preferences: profile.preferences, + localAlias: localAlias + ) } public func fromLocalProfile (_ profile: LocalProfile) -> Profile { - Profile(displayName: profile.displayName, fullName: profile.fullName, image: profile.image, contactLink: profile.contactLink, preferences: profile.preferences) + Profile( + displayName: profile.displayName, + fullName: profile.fullName, + shortDescr: profile.shortDescr, + image: profile.image, + contactLink: profile.contactLink, + preferences: profile.preferences + ) } public struct UserProfileUpdateSummary: Decodable, Hashable { @@ -204,6 +227,7 @@ public enum ChatType: String, Hashable { public protocol NamedChat { var displayName: String { get } var fullName: String { get } + var shortDescr: String? { get } var image: String? { get } var localAlias: String { get } } @@ -1249,6 +1273,17 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable { } } + public var shortDescr: String? { + switch self { + case let .direct(contact): contact.profile.shortDescr + case let .group(groupInfo, _): groupInfo.groupProfile.shortDescr + case .local: nil + case let .contactRequest(contactRequest): contactRequest.profile.shortDescr + case let .contactConnection(contactConnection): nil + case .invalidJSON: nil + } + } + public var image: String? { get { switch self { @@ -1739,6 +1774,7 @@ public struct Contact: Identifiable, Decodable, NamedChat, Hashable { public var sendMsgToConnect: Bool { nextSendGrpInv || nextConnectPrepared } public var displayName: String { localAlias == "" ? profile.displayName : localAlias } public var fullName: String { get { profile.fullName } } + public var shortDescr: String? { profile.shortDescr } public var image: String? { get { profile.image } } public var contactLink: String? { get { profile.contactLink } } public var localAlias: String { profile.localAlias } @@ -1925,6 +1961,7 @@ public struct UserContactRequest: Decodable, NamedChat, Hashable { public var apiId: Int64 { get { contactRequestId } } var ready: Bool { get { true } } public var displayName: String { get { profile.displayName } } + public var shortDescr: String? { profile.shortDescr } public var fullName: String { get { profile.fullName } } public var image: String? { get { profile.image } } public var localAlias: String { "" } @@ -1977,6 +2014,7 @@ public struct PendingContactConnection: Decodable, NamedChat, Hashable { } } public var fullName: String { get { "" } } + public var shortDescr: String? { nil } public var image: String? { get { nil } } public var initiated: Bool { get { (pccConnStatus.initiated ?? false) && !viaContactUri } } @@ -2093,6 +2131,7 @@ public struct GroupInfo: Identifiable, Decodable, NamedChat, Hashable { public var profileChangeProhibited: Bool { preparedGroup?.connLinkPreparedConnection ?? false } public var displayName: String { localAlias == "" ? groupProfile.displayName : localAlias } public var fullName: String { get { groupProfile.fullName } } + public var shortDescr: String? { groupProfile.shortDescr } public var image: String? { get { groupProfile.image } } public var chatTags: [Int64] public var chatItemTTL: Int64? @@ -2152,6 +2191,7 @@ public struct GroupProfile: Codable, NamedChat, Hashable { public init( displayName: String, fullName: String, + shortDescr: String? = nil, description: String? = nil, image: String? = nil, groupPreferences: GroupPreferences? = nil, @@ -2159,6 +2199,7 @@ public struct GroupProfile: Codable, NamedChat, Hashable { ) { self.displayName = displayName self.fullName = fullName + self.shortDescr = shortDescr self.description = description self.image = image self.groupPreferences = groupPreferences @@ -2167,6 +2208,7 @@ public struct GroupProfile: Codable, NamedChat, Hashable { public var displayName: String public var fullName: String + public var shortDescr: String? public var description: String? public var image: String? public var groupPreferences: GroupPreferences? @@ -2555,6 +2597,7 @@ public struct NoteFolder: Identifiable, Decodable, NamedChat, Hashable { public var ready: Bool { get { true } } public var displayName: String { get { ChatInfo.privateNotesChatName } } public var fullName: String { get { "" } } + public var shortDescr: String? { nil } public var image: String? { get { nil } } public var localAlias: String { get { "" } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 87f6069cfe..7c2a359107 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -1233,6 +1233,7 @@ data class User( ): NamedChat, UserLike { override val displayName: String get() = profile.displayName override val fullName: String get() = profile.fullName + override val shortDescr: String? get() = profile.shortDescr override val image: String? get() = profile.image override val localAlias: String = "" @@ -1302,6 +1303,7 @@ typealias ChatId = String interface NamedChat { val displayName: String val fullName: String + val shortDescr: String? val image: String? val localAlias: String val chatViewName: String @@ -1412,6 +1414,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val updatedAt get() = contact.updatedAt override val displayName get() = contact.displayName override val fullName get() = contact.fullName + override val shortDescr get() = contact.profile.shortDescr override val image get() = contact.image override val localAlias: String get() = contact.localAlias override fun anyNameContains(searchAnyCase: String): Boolean = contact.anyNameContains(searchAnyCase) @@ -1439,6 +1442,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val updatedAt get() = groupInfo.updatedAt override val displayName get() = groupInfo.displayName override val fullName get() = groupInfo.fullName + override val shortDescr get() = groupInfo.groupProfile.shortDescr override val image get() = groupInfo.image override val localAlias get() = groupInfo.localAlias @@ -1465,6 +1469,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val updatedAt get() = noteFolder.updatedAt override val displayName get() = noteFolder.displayName override val fullName get() = noteFolder.fullName + override val shortDescr get() = null override val image get() = noteFolder.image override val localAlias get() = noteFolder.localAlias @@ -1491,6 +1496,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val updatedAt get() = contactRequest.updatedAt override val displayName get() = contactRequest.displayName override val fullName get() = contactRequest.fullName + override val shortDescr get() = contactRequest.profile.shortDescr override val image get() = contactRequest.image override val localAlias get() = contactRequest.localAlias @@ -1517,6 +1523,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val updatedAt get() = contactConnection.updatedAt override val displayName get() = contactConnection.displayName override val fullName get() = contactConnection.fullName + override val shortDescr get() = null override val image get() = contactConnection.image override val localAlias get() = contactConnection.localAlias @@ -1546,6 +1553,7 @@ sealed class ChatInfo: SomeChat, NamedChat { override val timedMessagesTTL: Int? get() = null override val displayName get() = invalidChatName override val fullName get() = invalidChatName + override val shortDescr get() = null override val image get() = null override val localAlias get() = "" @@ -1750,6 +1758,7 @@ data class Contact( override val timedMessagesTTL: Int? get() = with(mergedPreferences.timedMessages) { if (enabled.forUser) userPreference.pref.ttl else null } override val displayName get() = localAlias.ifEmpty { profile.displayName } override val fullName get() = profile.fullName + override val shortDescr get() = profile.shortDescr override val image get() = profile.image val contactLink: String? = profile.contactLink override val localAlias get() = profile.localAlias @@ -1900,6 +1909,7 @@ data class SecurityCode(val securityCode: String, val verifiedAt: Instant) data class Profile( override val displayName: String, override val fullName: String, + override val shortDescr: String?, override val image: String? = null, override val localAlias : String = "", val contactLink: String? = null, @@ -1910,12 +1920,13 @@ data class Profile( return if (fullName == "" || displayName == fullName) displayName else "$displayName ($fullName)" } - fun toLocalProfile(profileId: Long): LocalProfile = LocalProfile(profileId, displayName, fullName, image, localAlias, contactLink, preferences) + fun toLocalProfile(profileId: Long): LocalProfile = LocalProfile(profileId, displayName, fullName, shortDescr, image, localAlias, contactLink, preferences) companion object { val sampleData = Profile( displayName = "alice", - fullName = "Alice" + fullName = "Alice", + shortDescr = null, ) } } @@ -1925,6 +1936,7 @@ data class LocalProfile( val profileId: Long, override val displayName: String, override val fullName: String, + override val shortDescr: String?, override val image: String? = null, override val localAlias: String, val contactLink: String? = null, @@ -1932,13 +1944,14 @@ data class LocalProfile( ): NamedChat { val profileViewName: String = localAlias.ifEmpty { if (fullName == "" || displayName == fullName) displayName else "$displayName ($fullName)" } - fun toProfile(): Profile = Profile(displayName, fullName, image, localAlias, contactLink, preferences) + fun toProfile(): Profile = Profile(displayName, fullName, shortDescr, image, localAlias, contactLink, preferences) companion object { val sampleData = LocalProfile( profileId = 1L, displayName = "alice", fullName = "Alice", + shortDescr = null, preferences = ChatPreferences.sampleData, localAlias = "" ) @@ -2004,6 +2017,7 @@ data class GroupInfo ( override val timedMessagesTTL: Int? get() = with(fullGroupPreferences.timedMessages) { if (on) ttl else null } override val displayName get() = localAlias.ifEmpty { groupProfile.displayName } override val fullName get() = groupProfile.fullName + override val shortDescr get() = groupProfile.shortDescr override val image get() = groupProfile.image val isOwner: Boolean @@ -2075,6 +2089,7 @@ data class GroupRef(val groupId: Long, val localDisplayName: String) data class GroupProfile ( override val displayName: String, override val fullName: String, + override val shortDescr: String?, val description: String? = null, override val image: String? = null, override val localAlias: String = "", @@ -2084,7 +2099,8 @@ data class GroupProfile ( companion object { val sampleData = GroupProfile( displayName = "team", - fullName = "My Team" + fullName = "My Team", + shortDescr = null, ) } } @@ -2169,6 +2185,7 @@ data class GroupMember ( return pastMember(name) } override val fullName: String get() = memberProfile.fullName + override val shortDescr: String? get() = memberProfile.shortDescr override val image: String? get() = memberProfile.image val contactLink: String? = memberProfile.contactLink val verified get() = activeConn?.connectionCode != null @@ -2453,6 +2470,7 @@ class NoteFolder( override val timedMessagesTTL: Int? get() = null override val displayName get() = generalGetString(MR.strings.note_folder_local_display_name) override val fullName get() = "" + override val shortDescr get() = null override val image get() = null override val localAlias get() = "" override val localDisplayName: String get() = "" @@ -2491,6 +2509,7 @@ class UserContactRequest ( override val timedMessagesTTL: Int? get() = null override val displayName get() = profile.displayName override val fullName get() = profile.fullName + override val shortDescr get() = profile.shortDescr override val image get() = profile.image override val localAlias get() = "" @@ -2548,6 +2567,7 @@ class PendingContactConnection( } } override val fullName get() = "" + override val shortDescr get() = null override val image get() = null val initiated get() = (pccConnStatus.initiated ?: false) && !viaContactUri diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index 136d38e215..7438f85fd8 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -573,7 +573,7 @@ object ChatController { suspend fun startChatWithTemporaryDatabase(ctrl: ChatCtrl, netCfg: NetCfg): User? { Log.d(TAG, "startChatWithTemporaryDatabase") - val migrationActiveUser = apiGetActiveUser(null, ctrl) ?: apiCreateActiveUser(null, Profile(displayName = "Temp", fullName = ""), ctrl = ctrl) + val migrationActiveUser = apiGetActiveUser(null, ctrl) ?: apiCreateActiveUser(null, Profile(displayName = "Temp", fullName = "", shortDescr = null), ctrl = ctrl) if (!apiSetNetworkConfig(netCfg, ctrl = ctrl)) { Log.e(TAG, "Error setting network config, stopping migration") return null diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/WelcomeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/WelcomeView.kt index 8317c6cf6c..9d9b4c8f5e 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/WelcomeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/WelcomeView.kt @@ -46,6 +46,7 @@ fun CreateProfile(chatModel: ChatModel, close: () -> Unit) { .padding(top = 20.dp) ) { val displayName = rememberSaveable { mutableStateOf("") } + val shortDescr = rememberSaveable { mutableStateOf("") } val focusRequester = remember { FocusRequester() } ColumnWithScrollBar { @@ -66,6 +67,14 @@ fun CreateProfile(chatModel: ChatModel, close: () -> Unit) { } } ProfileNameField(displayName, "", { it.trim() == mkValidName(it) }, focusRequester) + +// TODO enable in v6.4.1, limit to 160 characters + +// Text( +// stringResource(MR.strings.short_descr), +// fontSize = 16.sp +// ) +// ProfileNameField(shortDescr, "") } SettingsActionItem( painterResource(MR.images.ic_check), @@ -75,7 +84,7 @@ fun CreateProfile(chatModel: ChatModel, close: () -> Unit) { iconColor = MaterialTheme.colors.primary, click = { if (chatModel.localUserCreated.value == true) { - createProfileInProfiles(chatModel, displayName.value, close) + createProfileInProfiles(chatModel, displayName.value, shortDescr.value, close) } else { createProfileInNoProfileSetup(displayName.value, close) } @@ -162,7 +171,7 @@ fun CreateFirstProfile(chatModel: ChatModel, close: () -> Unit) { fun createProfileInNoProfileSetup(displayName: String, close: () -> Unit) { withBGApi { - val user = controller.apiCreateActiveUser(null, Profile(displayName.trim(), "", null)) ?: return@withBGApi + val user = controller.apiCreateActiveUser(null, Profile(displayName.trim(), "", null, null)) ?: return@withBGApi if (!chatModel.connectedToRemote()) { chatModel.localUserCreated.value = true } @@ -173,11 +182,11 @@ fun createProfileInNoProfileSetup(displayName: String, close: () -> Unit) { } } -fun createProfileInProfiles(chatModel: ChatModel, displayName: String, close: () -> Unit) { +fun createProfileInProfiles(chatModel: ChatModel, displayName: String, shortDescr: String, close: () -> Unit) { withBGApi { val rhId = chatModel.remoteHostId() val user = chatModel.controller.apiCreateActiveUser( - rhId, Profile(displayName.trim(), "", null) + rhId, Profile(displayName.trim(), "", shortDescr.trim().ifEmpty { null }, null) ) ?: return@withBGApi chatModel.currentUser.value = user if (chatModel.users.isEmpty()) { @@ -196,7 +205,7 @@ fun createProfileInProfiles(chatModel: ChatModel, displayName: String, close: () fun createProfileOnboarding(chatModel: ChatModel, displayName: String, close: () -> Unit) { withBGApi { chatModel.currentUser.value = chatModel.controller.apiCreateActiveUser( - null, Profile(displayName.trim(), "", null) + null, Profile(displayName.trim(), "", null, null) ) ?: return@withBGApi chatModel.localUserCreated.value = true val onboardingStage = chatModel.controller.appPrefs.onboardingStage diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatInfoView.kt index 115d5b3c78..05d9e6564c 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatInfoView.kt @@ -706,15 +706,16 @@ fun ChatInfoLayout( @Composable fun ChatInfoHeader(cInfo: ChatInfo, contact: Contact) { Column( - Modifier.padding(horizontal = 8.dp), + Modifier.padding(horizontal = DEFAULT_PADDING), horizontalAlignment = Alignment.CenterHorizontally ) { ChatInfoImage(cInfo, size = 192.dp, iconColor = if (isInDarkTheme()) GroupDark else SettingsSecondaryLight) + val displayName = contact.profile.displayName.trim() val text = buildAnnotatedString { if (contact.verified) { appendInlineContent(id = "shieldIcon") } - append(contact.profile.displayName) + append(displayName) } val inlineContent: Map = mapOf( "shieldIcon" to InlineTextContent( @@ -724,10 +725,11 @@ fun ChatInfoHeader(cInfo: ChatInfo, contact: Contact) { } ) val clipboard = LocalClipboardManager.current - val copyNameToClipboard = { - clipboard.setText(AnnotatedString(contact.profile.displayName)) + val copyNameToClipboard = fun (name: String) { + clipboard.setText(AnnotatedString(name)) showToast(generalGetString(MR.strings.copied)) } + val copyDisplayName = { copyNameToClipboard(displayName) } Text( text, inlineContent = inlineContent, @@ -735,18 +737,39 @@ fun ChatInfoHeader(cInfo: ChatInfo, contact: Contact) { textAlign = TextAlign.Center, maxLines = 3, overflow = TextOverflow.Ellipsis, - modifier = Modifier.combinedClickable(onClick = copyNameToClipboard, onLongClick = copyNameToClipboard).onRightClick(copyNameToClipboard) + modifier = Modifier.combinedClickable(onClick = copyDisplayName, onLongClick = copyDisplayName).onRightClick(copyDisplayName) + ) + ChatInfoDescription(cInfo, displayName, copyNameToClipboard) + } +} + +@Composable +fun ChatInfoDescription(c: NamedChat, displayName: String, copyNameToClipboard: (String) -> Unit) { + val fullName = c.fullName.trim() + if (fullName != "" && fullName != displayName && fullName != c.displayName.trim()) { + val copyFullName = { copyNameToClipboard(fullName) } + Text( + fullName, style = MaterialTheme.typography.h2, + color = MaterialTheme.colors.onBackground, + textAlign = TextAlign.Center, + maxLines = 3, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.padding(top = DEFAULT_PADDING_HALF).combinedClickable(onClick = copyFullName, onLongClick = copyFullName).onRightClick(copyFullName) + ) + } + val descr = c.shortDescr?.trim() + if (descr != null && descr != "") { + val copyDescr = { copyNameToClipboard(descr) } + Text( + descr, + style = MaterialTheme.typography.body2, + color = MaterialTheme.colors.onBackground, + textAlign = TextAlign.Center, + maxLines = 4, + overflow = TextOverflow.Ellipsis, + lineHeight = 21.sp, + modifier = Modifier.padding(top = DEFAULT_PADDING_HALF).combinedClickable(onClick = copyDescr, onLongClick = copyDescr).onRightClick(copyDescr) ) - if (cInfo.fullName != "" && cInfo.fullName != cInfo.displayName && cInfo.fullName != contact.profile.displayName) { - Text( - cInfo.fullName, style = MaterialTheme.typography.h2, - color = MaterialTheme.colors.onBackground, - textAlign = TextAlign.Center, - maxLines = 4, - overflow = TextOverflow.Ellipsis, - modifier = Modifier.combinedClickable(onClick = copyNameToClipboard, onLongClick = copyNameToClipboard).onRightClick(copyNameToClipboard) - ) - } } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt index 74069f25f1..5a749766c4 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt @@ -724,33 +724,27 @@ fun ChatTTLOption(chatItemTTL: State, setChatItemTTL: (ChatItemTTL @Composable private fun GroupChatInfoHeader(cInfo: ChatInfo, groupInfo: GroupInfo) { Column( - Modifier.padding(horizontal = 8.dp), + Modifier.padding(horizontal = DEFAULT_PADDING), horizontalAlignment = Alignment.CenterHorizontally ) { ChatInfoImage(cInfo, size = 192.dp, iconColor = if (isInDarkTheme()) GroupDark else SettingsSecondaryLight) val clipboard = LocalClipboardManager.current - val copyNameToClipboard = { - clipboard.setText(AnnotatedString(groupInfo.groupProfile.displayName)) + val copyNameToClipboard = fun(name: String) { + clipboard.setText(AnnotatedString(name)) showToast(generalGetString(MR.strings.copied)) } + val displayName = groupInfo.groupProfile.displayName.trim() + val copyDisplayName = { copyNameToClipboard(displayName) } Text( - groupInfo.groupProfile.displayName, style = MaterialTheme.typography.h1.copy(fontWeight = FontWeight.Normal), + displayName, + style = MaterialTheme.typography.h1.copy(fontWeight = FontWeight.Normal), color = MaterialTheme.colors.onBackground, textAlign = TextAlign.Center, - maxLines = 4, + maxLines = 3, overflow = TextOverflow.Ellipsis, - modifier = Modifier.combinedClickable(onClick = copyNameToClipboard, onLongClick = copyNameToClipboard).onRightClick(copyNameToClipboard) + modifier = Modifier.combinedClickable(onClick = copyDisplayName, onLongClick = copyDisplayName).onRightClick(copyDisplayName) ) - if (cInfo.fullName != "" && cInfo.fullName != cInfo.displayName && cInfo.fullName != groupInfo.groupProfile.displayName) { - Text( - cInfo.fullName, style = MaterialTheme.typography.h2, - color = MaterialTheme.colors.onBackground, - textAlign = TextAlign.Center, - maxLines = 8, - overflow = TextOverflow.Ellipsis, - modifier = Modifier.combinedClickable(onClick = copyNameToClipboard, onLongClick = copyNameToClipboard).onRightClick(copyNameToClipboard) - ) - } + ChatInfoDescription(cInfo, displayName, copyNameToClipboard) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt index ac06b88222..d3e7f60f62 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupMemberInfoView.kt @@ -568,11 +568,12 @@ fun GroupMemberInfoHeader(member: GroupMember) { horizontalAlignment = Alignment.CenterHorizontally ) { MemberProfileImage(size = 192.dp, member, color = if (isInDarkTheme()) GroupDark else SettingsSecondaryLight) + val displayName = member.displayName.trim() // alias if set val text = buildAnnotatedString { if (member.verified) { appendInlineContent(id = "shieldIcon") } - append(member.displayName) + append(displayName) } val inlineContent: Map = mapOf( "shieldIcon" to InlineTextContent( @@ -582,10 +583,11 @@ fun GroupMemberInfoHeader(member: GroupMember) { } ) val clipboard = LocalClipboardManager.current - val copyNameToClipboard = { - clipboard.setText(AnnotatedString(member.displayName)) + val copyNameToClipboard = fun(name: String) { + clipboard.setText(AnnotatedString(name)) showToast(generalGetString(MR.strings.copied)) } + val copyDisplayName = { copyNameToClipboard(displayName) } Text( text, inlineContent = inlineContent, @@ -593,18 +595,10 @@ fun GroupMemberInfoHeader(member: GroupMember) { textAlign = TextAlign.Center, maxLines = 3, overflow = TextOverflow.Ellipsis, - modifier = Modifier.combinedClickable(onClick = copyNameToClipboard, onLongClick = copyNameToClipboard).onRightClick(copyNameToClipboard) + modifier = Modifier.combinedClickable(onClick = copyDisplayName, onLongClick = copyDisplayName).onRightClick(copyDisplayName) ) - if (member.fullName != "" && member.fullName != member.displayName) { - Text( - member.fullName, style = MaterialTheme.typography.h2, - color = MaterialTheme.colors.onBackground, - textAlign = TextAlign.Center, - maxLines = 4, - overflow = TextOverflow.Ellipsis, - modifier = Modifier.combinedClickable(onClick = copyNameToClipboard, onLongClick = copyNameToClipboard).onRightClick(copyNameToClipboard) - ) - } + // passing actual display name here, as alias is used above + ChatInfoDescription(member, member.memberProfile.displayName.trim(), copyNameToClipboard) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt index fb24c028b2..05b4be1c47 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt @@ -56,14 +56,16 @@ fun GroupProfileLayout( val bottomSheetModalState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden) val displayName = rememberSaveable { mutableStateOf(groupProfile.displayName) } val fullName = rememberSaveable { mutableStateOf(groupProfile.fullName) } + val shortDescr = rememberSaveable { mutableStateOf(groupProfile.shortDescr ?: "") } val chosenImage = rememberSaveable { mutableStateOf(null) } val profileImage = rememberSaveable { mutableStateOf(groupProfile.image) } val scope = rememberCoroutineScope() val scrollState = rememberScrollState() val focusRequester = remember { FocusRequester() } val dataUnchanged = - displayName.value == groupProfile.displayName && - fullName.value == groupProfile.fullName && + displayName.value.trim() == groupProfile.displayName && + fullName.value.trim() == groupProfile.fullName && + shortDescr.value.trim() == (groupProfile.shortDescr ?: "") && groupProfile.image == profileImage.value val closeWithAlert = { if (dataUnchanged || !canUpdateProfile(displayName.value, groupProfile)) { @@ -73,7 +75,8 @@ fun GroupProfileLayout( saveProfile( groupProfile.copy( displayName = displayName.value.trim(), - fullName = fullName.value, + fullName = fullName.value.trim(), + shortDescr = shortDescr.value.trim().ifEmpty { null }, image = profileImage.value ) ) @@ -130,7 +133,7 @@ fun GroupProfileLayout( } } ProfileNameField(displayName, "", { isValidNewProfileName(it, groupProfile) }, focusRequester) - if (groupProfile.fullName.isNotEmpty() && groupProfile.fullName != groupProfile.displayName) { + if (groupProfile.fullName.trim().isNotEmpty() && groupProfile.fullName.trim() != groupProfile.displayName.trim()) { Spacer(Modifier.height(DEFAULT_PADDING)) Text( stringResource(MR.strings.group_full_name_field), @@ -139,6 +142,17 @@ fun GroupProfileLayout( ) ProfileNameField(fullName) } + +// TODO enable in v6.4.1, limit to 160 characters + +// Spacer(Modifier.height(DEFAULT_PADDING)) +// Text( +// stringResource(MR.strings.group_short_descr_field), +// fontSize = 16.sp, +// modifier = Modifier.padding(bottom = DEFAULT_PADDING_HALF) +// ) +// ProfileNameField(shortDescr) + Spacer(Modifier.height(DEFAULT_PADDING)) val enabled = !dataUnchanged && canUpdateProfile(displayName.value, groupProfile) if (enabled) { @@ -148,7 +162,8 @@ fun GroupProfileLayout( saveProfile( groupProfile.copy( displayName = displayName.value.trim(), - fullName = fullName.value, + fullName = fullName.value.trim(), + shortDescr = shortDescr.value.trim().ifEmpty { null }, image = profileImage.value ) ) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIGroupInvitationView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIGroupInvitationView.kt index 2bcbbe29e0..39bb9545e1 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIGroupInvitationView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIGroupInvitationView.kt @@ -194,7 +194,7 @@ fun CIGroupInvitationViewLongNamePreview() { CIGroupInvitationView( ci = ChatItem.getGroupInvitationSample(), groupInvitation = CIGroupInvitation.getSample( - groupProfile = GroupProfile("group_with_a_really_really_really_long_name", "Group With A Really Really Really Long Name"), + groupProfile = GroupProfile("group_with_a_really_really_really_long_name", "Group With A Really Really Really Long Name", shortDescr = null), status = CIGroupInvitationStatus.Accepted ), memberRole = GroupMemberRole.Admin, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/localauth/LocalAuthView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/localauth/LocalAuthView.kt index 65e1864935..8021a605db 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/localauth/LocalAuthView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/localauth/LocalAuthView.kt @@ -82,7 +82,7 @@ private fun deleteStorageAndRestart(m: ChatModel, password: String, completed: ( } var profile: Profile? = null if (!displayName.isNullOrEmpty()) { - profile = Profile(displayName = displayName, fullName = "") + profile = Profile(displayName = displayName, fullName = "", shortDescr = null) } val createdUser = m.controller.apiCreateActiveUser(null, profile, pastTimestamp = true) m.currentUser.value = createdUser diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt index fd0d41478a..d4161ee3e5 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt @@ -140,6 +140,7 @@ fun AddGroupLayout( createGroup(incognito.value, GroupProfile( displayName = displayName.value.trim(), fullName = "", + shortDescr = null, image = profileImage.value, groupPreferences = GroupPreferences(history = GroupPreference(GroupFeatureEnabled.ON)) )) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfileView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfileView.kt index 90122bd29d..2149649755 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfileView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserProfileView.kt @@ -40,9 +40,10 @@ fun UserProfileView(chatModel: ChatModel, close: () -> Unit) { UserProfileLayout( profile = profile, close, - saveProfile = { displayName, fullName, image -> + saveProfile = { displayName, fullName, shortDescr, image -> withBGApi { - val updated = chatModel.controller.apiUpdateProfile(user.remoteHostId, profile.copy(displayName = displayName.trim(), fullName = fullName, image = image)) + val updatedProfile = profile.copy(displayName = displayName.trim(), fullName = fullName.trim(), shortDescr = shortDescr.trim().ifEmpty { null }, image = image) + val updated = chatModel.controller.apiUpdateProfile(user.remoteHostId, updatedProfile) if (updated != null) { val (newProfile, _) = updated chatModel.updateCurrentUser(user.remoteHostId, newProfile) @@ -59,11 +60,12 @@ fun UserProfileView(chatModel: ChatModel, close: () -> Unit) { fun UserProfileLayout( profile: Profile, close: () -> Unit, - saveProfile: (String, String, String?) -> Unit, + saveProfile: (String, String, String, String?) -> Unit, ) { val bottomSheetModalState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden) val displayName = remember { mutableStateOf(profile.displayName) } val fullName = remember { mutableStateOf(profile.fullName) } + val shortDescr = remember { mutableStateOf(profile.shortDescr ?: "") } val chosenImage = rememberSaveable { mutableStateOf(null) } val profileImage = rememberSaveable { mutableStateOf(profile.image) } val scope = rememberCoroutineScope() @@ -85,14 +87,15 @@ fun UserProfileLayout( sheetShape = RoundedCornerShape(topStart = 18.dp, topEnd = 18.dp) ) { val dataUnchanged = - displayName.value == profile.displayName && - fullName.value == profile.fullName && + displayName.value.trim() == profile.displayName && + fullName.value.trim() == profile.fullName && + shortDescr.value.trim() == (profile.shortDescr ?: "") && profile.image == profileImage.value val closeWithAlert = { if (dataUnchanged || !canSaveProfile(displayName.value, profile)) { close() } else { - showUnsavedChangesAlert({ saveProfile(displayName.value, fullName.value, profileImage.value) }, close) + showUnsavedChangesAlert({ saveProfile(displayName.value, fullName.value, shortDescr.value, profileImage.value) }, close) } } ModalView(close = closeWithAlert) { @@ -144,9 +147,20 @@ fun UserProfileLayout( ) ProfileNameField(fullName) } + +// TODO enable in v6.4.1, limit to 160 characters + +// Spacer(Modifier.height(DEFAULT_PADDING)) +// Text( +// stringResource(MR.strings.short_descr__field), +// fontSize = 16.sp, +// modifier = Modifier.padding(bottom = DEFAULT_PADDING_HALF) +// ) +// ProfileNameField(shortDescr) + Spacer(Modifier.height(DEFAULT_PADDING)) val enabled = !dataUnchanged && canSaveProfile(displayName.value, profile) - val saveModifier: Modifier = Modifier.clickable(enabled) { saveProfile(displayName.value, fullName.value, profileImage.value) } + val saveModifier: Modifier = Modifier.clickable(enabled) { saveProfile(displayName.value, fullName.value, shortDescr.value, profileImage.value) } val saveColor: Color = if (enabled) MaterialTheme.colors.primary else MaterialTheme.colors.secondary Text( stringResource(MR.strings.save_and_notify_contacts), @@ -209,7 +223,7 @@ private fun isValidNewProfileName(displayName: String, profile: Profile): Boolea displayName == profile.displayName || isValidDisplayName(displayName.trim()) private fun showFullName(profile: Profile): Boolean = - profile.fullName.isNotEmpty() && profile.fullName != profile.displayName + profile.fullName.trim().isNotEmpty() && profile.fullName.trim() != profile.displayName.trim() private fun canSaveProfile(displayName: String, profile: Profile): Boolean = displayName.trim().isNotEmpty() && isValidNewProfileName(displayName, profile) @@ -225,7 +239,7 @@ fun PreviewUserProfileLayoutEditOff() { UserProfileLayout( profile = Profile.sampleData, close = {}, - saveProfile = { _, _, _ -> } + saveProfile = { _, _, _, _ -> } ) } } @@ -241,7 +255,7 @@ fun PreviewUserProfileLayoutEditOn() { UserProfileLayout( profile = Profile.sampleData, close = {}, - saveProfile = { _, _, _ -> } + saveProfile = { _, _, _, _ -> } ) } } diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 3b9d57090a..cfe9dd3722 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -1108,6 +1108,7 @@ Profile name: Full name: + Bio: Your current profile Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile. Edit image @@ -1137,6 +1138,7 @@ The profile is only shared with your contacts. Display name cannot contain whitespace. Enter your name: + Your bio: Create Create profile Create @@ -1914,6 +1916,7 @@ Fully decentralized – visible only to members. Enter group name: Group full name: + Short description: Your chat profile will be sent to group members Your chat profile will be sent to chat members Create group diff --git a/apps/simplex-directory-service/src/Directory/Service.hs b/apps/simplex-directory-service/src/Directory/Service.hs index 9db9e4a019..93aebbf47b 100644 --- a/apps/simplex-directory-service/src/Directory/Service.hs +++ b/apps/simplex-directory-service/src/Directory/Service.hs @@ -234,14 +234,19 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName getGroupReg st groupId >>= \case Just gr -> action gr Nothing -> logError $ "Error: " <> err <> ", group: " <> localDisplayName <> ", can't find group registration ID " <> tshow groupId - groupInfoText GroupProfile {displayName = n, fullName = fn, description = d} = - n <> (if n == fn || T.null fn then "" else " (" <> fn <> ")") <> maybe "" ("\nWelcome message:\n" <>) d + groupInfoText p@GroupProfile {description = d} = groupNameDescr p <> maybe "" ("\nWelcome message:\n" <>) d + groupNameDescr GroupProfile {displayName = n, fullName = fn, shortDescr = sd_} = + n <> maybe "" (\d' -> " (" <> d' <> ")") descr + where + descr + | n == fn || T.null fn = if sd_ == Just "" then Nothing else sd_ + | otherwise = Just fn userGroupReference gr GroupInfo {groupProfile = GroupProfile {displayName}} = userGroupReference' gr displayName userGroupReference' GroupReg {userGroupRegId} displayName = groupReference' userGroupRegId displayName groupReference GroupInfo {groupId, groupProfile = GroupProfile {displayName}} = groupReference' groupId displayName groupReference' groupId displayName = "ID " <> tshow groupId <> " (" <> displayName <> ")" - groupAlreadyListed GroupInfo {groupProfile = GroupProfile {displayName, fullName}} = - "The group " <> displayName <> " (" <> fullName <> ") is already listed in the directory, please choose another name." + groupAlreadyListed GroupInfo {groupProfile = p} = + "The group " <> groupNameDescr p <> " is already listed in the directory, please choose another name." getGroups :: Text -> IO (Maybe [(GroupInfo, GroupSummary)]) getGroups = getGroups_ . Just @@ -295,7 +300,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName \Content and privacy policy: https://simplex.chat/docs/directory.html" deGroupInvitation :: Contact -> GroupInfo -> GroupMemberRole -> GroupMemberRole -> IO () - deGroupInvitation ct g@GroupInfo {groupProfile = GroupProfile {displayName, fullName}} fromMemberRole memberRole = do + deGroupInvitation ct g@GroupInfo {groupProfile = p@GroupProfile {displayName}} fromMemberRole memberRole = do logInfo $ "invited to group " <> viewGroupName g <> " by " <> viewContactName ct case badRolesMsg $ groupRolesStatus fromMemberRole memberRole of Just msg -> sendMessage cc ct msg @@ -308,7 +313,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName where askConfirmation = do ugrId <- addGroupReg st ct g GRSPendingConfirmation - sendMessage cc ct $ "The group " <> displayName <> " (" <> fullName <> ") is already submitted to the directory.\nTo confirm the registration, please send:" + sendMessage cc ct $ "The group " <> groupNameDescr p <> " is already submitted to the directory.\nTo confirm the registration, please send:" sendMessage cc ct $ "/confirm " <> tshow ugrId <> ":" <> viewName displayName badRolesMsg :: GroupRolesStatus -> Maybe Text @@ -400,9 +405,9 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName GroupInfo {groupId, groupProfile = p} = fromGroup GroupInfo {groupProfile = p'} = toGroup sameProfile - GroupProfile {displayName = n, fullName = fn, image = i, description = d} - GroupProfile {displayName = n', fullName = fn', image = i', description = d'} = - n == n' && fn == fn' && i == i' && d == d' + GroupProfile {displayName = n, fullName = fn, shortDescr = sd, image = i, description = d} + GroupProfile {displayName = n', fullName = fn', shortDescr = sd', image = i', description = d'} = + n == n' && fn == fn' && i == i' && sd == sd' && d == d' groupLinkAdded gr byMember = do getDuplicateGroup toGroup >>= \case Nothing -> notifyOwner gr "Error: getDuplicateGroup. Please notify the developers." diff --git a/simplex-chat.cabal b/simplex-chat.cabal index f48f46a1f7..75e819a727 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -110,6 +110,7 @@ library Simplex.Chat.Store.Postgres.Migrations.M20250526_short_links Simplex.Chat.Store.Postgres.Migrations.M20250702_contact_requests_remove_cascade_delete Simplex.Chat.Store.Postgres.Migrations.M20250704_groups_conn_link_prepared_connection + Simplex.Chat.Store.Postgres.Migrations.M20250709_profile_short_descr else exposed-modules: Simplex.Chat.Archive @@ -245,6 +246,7 @@ library Simplex.Chat.Store.SQLite.Migrations.M20250526_short_links Simplex.Chat.Store.SQLite.Migrations.M20250702_contact_requests_remove_cascade_delete Simplex.Chat.Store.SQLite.Migrations.M20250704_groups_conn_link_prepared_connection + Simplex.Chat.Store.SQLite.Migrations.M20250709_profile_short_descr other-modules: Paths_simplex_chat hs-source-dirs: diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index 0061b38022..de38af692d 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -531,7 +531,7 @@ data ChatCommand | CancelFile FileTransferId | FileStatus FileTransferId | ShowProfile -- UserId (not used in UI) - | UpdateProfile ContactName Text -- UserId (not used in UI) + | UpdateProfile ContactName (Maybe Text) -- UserId (not used in UI) | UpdateProfileImage (Maybe ImageData) -- UserId (not used in UI) | ShowProfileImage | SetUserFeature AChatFeature FeatureAllowed -- UserId (not used in UI) diff --git a/src/Simplex/Chat/Core.hs b/src/Simplex/Chat/Core.hs index 08c0a30c6d..e70aeb8775 100644 --- a/src/Simplex/Chat/Core.hs +++ b/src/Simplex/Chat/Core.hs @@ -107,7 +107,7 @@ createActiveUser cc = do where loop = do displayName <- T.pack <$> getWithPrompt "display name" - let profile = Just Profile {displayName, fullName = "", image = Nothing, contactLink = Nothing, preferences = Nothing} + let profile = Just Profile {displayName, fullName = "", shortDescr = Nothing, image = Nothing, contactLink = Nothing, preferences = Nothing} execChatCommand' (CreateActiveUser NewUser {profile, pastTimestamp = False}) 0 `runReaderT` cc >>= \case Right (CRActiveUser user) -> pure user r -> printResponseEvent (Nothing, Nothing) (config cc) r >> loop diff --git a/src/Simplex/Chat/Help.hs b/src/Simplex/Chat/Help.hs index adb77b9557..59e7a2c941 100644 --- a/src/Simplex/Chat/Help.hs +++ b/src/Simplex/Chat/Help.hs @@ -122,7 +122,7 @@ groupsHelpInfo = map styleMarkdown [ green "Group commands:", - indent <> highlight "/group [] " <> " - create group", + indent <> highlight "/group [] " <> " - create group", indent <> highlight "/add [] " <> " - add contact to group, roles: " <> highlight "owner" <> ", " <> highlight "admin" <> " (default), " <> highlight "member", indent <> highlight "/join " <> " - accept group invitation", indent <> highlight "/members " <> " - list group members", @@ -131,8 +131,10 @@ groupsHelpInfo = indent <> highlight "/clear # " <> " - clear all messages in the group locally", indent <> highlight "/delete # " <> " - delete group and all messages", indent <> highlight "/gp " <> " - view group profile", - indent <> highlight "/gp [] " <> " - update group profile names", - indent <> highlight "/group_descr [] " <> " - update/remove group description", + indent <> highlight "/gp [] " <> " - update group profile names", + indent <> highlight "/set welcome " <> " - set group welcome message", + indent <> highlight "/delete welcome " <> " - delete group welcome message", + indent <> highlight "/show welcome " <> " - show group welcome message", indent <> highlight "/groups " <> " - list groups", indent <> highlight "# " <> " - send message to group", "", diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 42499bd6a6..3065b48893 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -2507,8 +2507,8 @@ processChatCommand vr nm = \case APIUpdateGroupProfile groupId p' -> withUser $ \user -> do g <- withFastStore $ \db -> getGroup db vr user groupId runUpdateGroupProfile user g p' - UpdateGroupNames gName GroupProfile {displayName, fullName} -> - updateGroupProfileByName gName $ \p -> p {displayName, fullName} + UpdateGroupNames gName p'@GroupProfile {displayName, fullName, shortDescr} -> + updateGroupProfileByName gName $ \p -> p {displayName, fullName, shortDescr} ShowGroupProfile gName -> withUser $ \user -> CRGroupProfile user <$> withFastStore (\db -> getGroupInfoByName db vr user gName) UpdateGroupDescription gName description -> @@ -2729,8 +2729,8 @@ processChatCommand vr nm = \case fileStatus <- withFastStore $ \db -> getFileTransferProgress db user fileId pure $ CRFileTransferStatus user fileStatus ShowProfile -> withUser $ \user@User {profile} -> pure $ CRUserProfile user (fromLocalProfile profile) - UpdateProfile displayName fullName -> withUser $ \user@User {profile} -> do - let p = (fromLocalProfile profile :: Profile) {displayName = displayName, fullName = fullName} + UpdateProfile displayName shortDescr -> withUser $ \user@User {profile} -> do + let p = (fromLocalProfile profile :: Profile) {displayName, shortDescr, fullName = ""} updateProfile user p UpdateProfileImage image -> withUser $ \user@User {profile} -> do let p = (fromLocalProfile profile :: Profile) {image} @@ -3151,9 +3151,9 @@ processChatCommand vr nm = \case let (newMs, oldMs) = partition (\m -> maxVersion (memberChatVRange m) >= businessChatPrefsVersion) ms -- this is a fallback to send the members with the old version correct profile of the business when preferences change unless (null oldMs) $ do - GroupMember {memberProfile = LocalProfile {displayName, fullName, image}} <- + GroupMember {memberProfile = LocalProfile {displayName, fullName, shortDescr, image}} <- withStore $ \db -> getGroupMemberByMemberId db vr user g businessId - let p'' = p' {displayName, fullName, image} :: GroupProfile + let p'' = p' {displayName, fullName, shortDescr, image} :: GroupProfile recipients = filter memberCurrentOrPending oldMs void $ sendGroupMessage user g' Nothing recipients (XGrpInfo p'') let ps' = fromMaybe defaultBusinessGroupPrefs $ groupPreferences p' @@ -3162,6 +3162,7 @@ processChatCommand vr nm = \case Nothing -> do setGroupLinkData' let recipients = filter memberCurrentOrPending ms + liftIO $ putStrLn $ "about to sendGroupMessage to " <> show (length recipients) sendGroupMessage user g' Nothing recipients (XGrpInfo p') where setGroupLinkData' :: CM () @@ -3553,14 +3554,14 @@ processChatCommand vr nm = \case business = maybe False businessAddress settings contactData | large = ContactShortLinkData p msg business - | otherwise = ContactShortLinkData p {fullName = "", image = Nothing, contactLink = Nothing} Nothing business + | otherwise = ContactShortLinkData p {fullName = "", shortDescr = Nothing, image = Nothing, contactLink = Nothing} Nothing business pure $ encodeShortLinkData large contactData groupShortLinkData :: GroupProfile -> CM UserLinkData groupShortLinkData gp = do large <- chatReadVar useLargeLinkData let gp' | large = gp - | otherwise = gp {fullName = "", description = Nothing, image = Nothing, memberAdmission = Nothing} + | otherwise = gp {fullName = "", shortDescr = Nothing, description = Nothing, image = Nothing, memberAdmission = Nothing} pure $ encodeShortLinkData large $ GroupShortLinkData gp' encodeShortLinkData :: J.ToJSON a => Bool -> a -> UserLinkData encodeShortLinkData large d = @@ -4609,7 +4610,7 @@ chatCommandP = "/set profile image " *> (UpdateProfileImage . Just . ImageData <$> imageP), "/delete profile image" $> UpdateProfileImage Nothing, "/show profile image" $> ShowProfileImage, - ("/profile " <|> "/p ") *> (uncurry UpdateProfile <$> profileNames), + ("/profile " <|> "/p ") *> (uncurry UpdateProfile <$> profileNameDescr), ("/profile" <|> "/p") $> ShowProfile, "/set voice #" *> (SetGroupFeatureRole (AGFR SGFVoice) <$> displayNameP <*> _strP <*> optional memberRole), "/set voice @" *> (SetContactFeature (ACF SCFVoice) <$> displayNameP <*> optional (A.space *> strP)), @@ -4721,24 +4722,26 @@ chatCommandP = clearOverrides <- (" clear_overrides=" *> onOffP) <|> pure False pure UserMsgReceiptSettings {enable, clearOverrides} onOffP = ("on" $> True) <|> ("off" $> False) - profileNames = (,) <$> displayNameP <*> fullNameP + profileNameDescr = (,) <$> displayNameP <*> shortDescrP newUserP = do - (cName, fullName) <- profileNames - let profile = Just Profile {displayName = cName, fullName, image = Nothing, contactLink = Nothing, preferences = Nothing} + (cName, shortDescr) <- profileNameDescr + let profile = Just Profile {displayName = cName, fullName = "", shortDescr, image = Nothing, contactLink = Nothing, preferences = Nothing} pure NewUser {profile, pastTimestamp = False} jsonP :: J.FromJSON a => Parser a jsonP = J.eitherDecodeStrict' <$?> A.takeByteString groupProfile = do - (gName, fullName) <- profileNames + (gName, shortDescr) <- profileNameDescr let groupPreferences = Just (emptyGroupPrefs :: GroupPreferences) { directMessages = Just DirectMessagesGroupPreference {enable = FEOn, role = Nothing}, history = Just HistoryGroupPreference {enable = FEOn} } - pure GroupProfile {displayName = gName, fullName, description = Nothing, image = Nothing, groupPreferences, memberAdmission = Nothing} + pure GroupProfile {displayName = gName, fullName = "", shortDescr, description = Nothing, image = Nothing, groupPreferences, memberAdmission = Nothing} memberCriteriaP = ("all" $> Just MCAll) <|> ("off" $> Nothing) - fullNameP = A.space *> textP <|> pure "" + shortDescrP = do + descr <- A.takeWhile1 isSpace *> (T.dropWhileEnd isSpace <$> textP) <|> pure "" + pure $ if T.null descr then Nothing else Just $ T.take 160 descr textP = safeDecodeUtf8 <$> A.takeByteString pwdP = jsonP <|> (UserPwd . safeDecodeUtf8 <$> A.takeTill (== ' ')) verifyCodeP = safeDecodeUtf8 <$> A.takeWhile (\c -> isDigit c || c == ' ') diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index 81c4f080f4..625f3f0685 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -1041,8 +1041,8 @@ acceptBusinessJoinRequestAsync pure (gInfo, clientMember) businessGroupProfile :: Profile -> GroupPreferences -> GroupProfile -businessGroupProfile Profile {displayName, fullName, image} groupPreferences = - GroupProfile {displayName, fullName, description = Nothing, image, groupPreferences = Just groupPreferences, memberAdmission = Nothing} +businessGroupProfile Profile {displayName, fullName, shortDescr, image} groupPreferences = + GroupProfile {displayName, fullName, description = Nothing, shortDescr, image, groupPreferences = Just groupPreferences, memberAdmission = Nothing} introduceToModerators :: VersionRangeChat -> User -> GroupInfo -> GroupMember -> CM () introduceToModerators vr user gInfo@GroupInfo {groupId} m@GroupMember {memberRole, memberId} = do @@ -2504,6 +2504,7 @@ simplexTeamContactProfile = Profile { displayName = "SimpleX Chat team", fullName = "", + shortDescr = Just "Help and support for SimpleX network users", image = Just (ImageData "data:image/jpg;base64,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"), contactLink = Just $ CLFull adminContactReq, preferences = Nothing @@ -2514,6 +2515,7 @@ simplexStatusContactProfile = Profile { displayName = "SimpleX-Status", fullName = "", + shortDescr = Just "SimpleX bot for server status and release updates", image = Just (ImageData "data:image/jpg;base64,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"), contactLink = Just (either error CLFull $ strDecode "simplex:/contact/#/?v=1-2&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FShQuD-rPokbDvkyotKx5NwM8P3oUXHxA%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA6fSx1k9zrOmF0BJpCaTarZvnZpMTAVQhd3RkDQ35KT0%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion"), preferences = Nothing diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index 31bf0b743f..5a73430191 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -2232,9 +2232,9 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = createInternalChatItem user (CDDirectRcv c') ciContent Nothing where visibleProfileUpdated = - n' /= n || fn' /= fn || i' /= i || cl' /= cl - Profile {displayName = n, fullName = fn, image = i, contactLink = cl} = p - Profile {displayName = n', fullName = fn', image = i', contactLink = cl'} = p' + n' /= n || fn' /= fn || sd /= sd' || i' /= i || cl' /= cl + Profile {displayName = n, fullName = fn, shortDescr = sd, image = i, contactLink = cl} = p + Profile {displayName = n', fullName = fn', shortDescr = sd', image = i', contactLink = cl'} = p' xInfoMember :: GroupInfo -> GroupMember -> Profile -> UTCTime -> CM () xInfoMember gInfo m p' brokerTs = void $ processMemberProfileUpdate gInfo m p' True (Just brokerTs) diff --git a/src/Simplex/Chat/Messages/CIContent.hs b/src/Simplex/Chat/Messages/CIContent.hs index 09d1e9a281..e0bff73e0c 100644 --- a/src/Simplex/Chat/Messages/CIContent.hs +++ b/src/Simplex/Chat/Messages/CIContent.hs @@ -318,7 +318,7 @@ e2eInfoPQText = ciGroupInvitationToText :: CIGroupInvitation -> GroupMemberRole -> Text ciGroupInvitationToText CIGroupInvitation {groupProfile = GroupProfile {displayName, fullName}} role = - "invitation to join group " <> displayName <> optionalFullName displayName fullName <> " as " <> (decodeLatin1 . strEncode $ role) + "invitation to join group " <> displayName <> optionalFullName displayName fullName Nothing <> " as " <> (decodeLatin1 . strEncode $ role) rcvDirectEventToText :: RcvDirectEvent -> Text rcvDirectEventToText = \case @@ -402,7 +402,7 @@ sndConnEventToText = \case maybe "" (\GroupMemberRef {profile = Profile {displayName}} -> " for " <> displayName) member_ profileToText :: Profile -> Text -profileToText Profile {displayName, fullName} = displayName <> optionalFullName displayName fullName +profileToText Profile {displayName, fullName} = displayName <> optionalFullName displayName fullName Nothing msgIntegrityError :: MsgErrorType -> Text msgIntegrityError = \case diff --git a/src/Simplex/Chat/ProfileGenerator.hs b/src/Simplex/Chat/ProfileGenerator.hs index 5b6c9222cc..176320f282 100644 --- a/src/Simplex/Chat/ProfileGenerator.hs +++ b/src/Simplex/Chat/ProfileGenerator.hs @@ -10,7 +10,7 @@ generateRandomProfile :: IO Profile generateRandomProfile = do adjective <- pick adjectives noun <- pickNoun adjective 2 - pure $ Profile {displayName = adjective <> noun, fullName = "", image = Nothing, contactLink = Nothing, preferences = Nothing} + pure $ Profile {displayName = adjective <> noun, fullName = "", shortDescr = Nothing, image = Nothing, contactLink = Nothing, preferences = Nothing} where pick :: [a] -> IO a pick xs = (xs !!) <$> randomRIO (0, length xs - 1) diff --git a/src/Simplex/Chat/Store/Connections.hs b/src/Simplex/Chat/Store/Connections.hs index 3334653a2c..4aacc7e677 100644 --- a/src/Simplex/Chat/Store/Connections.hs +++ b/src/Simplex/Chat/Store/Connections.hs @@ -111,7 +111,7 @@ getConnectionEntity db vr user@User {userId, userContactId} agentConnId = do db [sql| SELECT - c.contact_profile_id, c.local_display_name, c.via_group, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, c.contact_used, c.contact_status, c.enable_ntfs, c.send_rcpts, c.favorite, + c.contact_profile_id, c.local_display_name, c.via_group, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, c.contact_used, c.contact_status, c.enable_ntfs, c.send_rcpts, c.favorite, p.preferences, c.user_preferences, c.created_at, c.updated_at, c.chat_ts, c.conn_full_link_to_connect, c.conn_short_link_to_connect, c.welcome_shared_msg_id, c.request_shared_msg_id, c.contact_request_id, c.contact_group_member_id, c.contact_grp_inv_sent, c.ui_themes, c.chat_deleted, c.custom_data, c.chat_item_ttl FROM contacts c @@ -120,8 +120,8 @@ getConnectionEntity db vr user@User {userId, userContactId} agentConnId = do |] (userId, contactId) toContact' :: Int64 -> Connection -> [ChatTagId] -> ContactRow' -> Contact - toContact' contactId conn chatTags ((profileId, localDisplayName, viaGroup, displayName, fullName, image, contactLink, localAlias, BI contactUsed, contactStatus) :. (enableNtfs_, sendRcpts, BI favorite, preferences, userPreferences, createdAt, updatedAt, chatTs) :. preparedContactRow :. (contactRequestId, contactGroupMemberId, BI contactGrpInvSent, uiThemes, BI chatDeleted, customData, chatItemTTL)) = - let profile = LocalProfile {profileId, displayName, fullName, image, contactLink, preferences, localAlias} + toContact' contactId conn chatTags ((profileId, localDisplayName, viaGroup, displayName, fullName, shortDescr, image, contactLink, localAlias, BI contactUsed, contactStatus) :. (enableNtfs_, sendRcpts, BI favorite, preferences, userPreferences, createdAt, updatedAt, chatTs) :. preparedContactRow :. (contactRequestId, contactGroupMemberId, BI contactGrpInvSent, uiThemes, BI chatDeleted, customData, chatItemTTL)) = + let profile = LocalProfile {profileId, displayName, fullName, shortDescr, image, contactLink, preferences, localAlias} chatSettings = ChatSettings {enableNtfs = fromMaybe MFAll enableNtfs_, sendRcpts = unBI <$> sendRcpts, favorite} mergedPreferences = contactUserPreferences user userPreferences preferences $ connIncognito conn activeConn = Just conn @@ -137,7 +137,7 @@ getConnectionEntity db vr user@User {userId, userContactId} agentConnId = do [sql| SELECT -- GroupInfo - g.group_id, g.local_display_name, gp.display_name, gp.full_name, g.local_alias, gp.description, gp.image, + g.group_id, g.local_display_name, gp.display_name, gp.full_name, gp.short_descr, g.local_alias, gp.description, gp.image, g.enable_ntfs, g.send_rcpts, g.favorite, gp.preferences, gp.member_admission, g.created_at, g.updated_at, g.chat_ts, g.user_member_profile_sent_at, g.conn_full_link_to_connect, g.conn_short_link_to_connect, g.conn_link_prepared_connection, g.conn_link_started_connection, g.welcome_shared_msg_id, g.request_shared_msg_id, @@ -147,12 +147,12 @@ getConnectionEntity db vr user@User {userId, userContactId} agentConnId = do mu.group_member_id, mu.group_id, mu.member_id, mu.peer_chat_min_version, mu.peer_chat_max_version, mu.member_role, mu.member_category, mu.member_status, mu.show_messages, mu.member_restriction, mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, -- GroupInfo {membership = GroupMember {memberProfile}} - pu.display_name, pu.full_name, pu.image, pu.contact_link, pu.local_alias, pu.preferences, + pu.display_name, pu.full_name, pu.short_descr, pu.image, pu.contact_link, pu.local_alias, pu.preferences, mu.created_at, mu.updated_at, mu.support_chat_ts, mu.support_chat_items_unread, mu.support_chat_items_member_attention, mu.support_chat_items_mentions, mu.support_chat_last_msg_from_member_ts, -- from GroupMember m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts FROM group_members m diff --git a/src/Simplex/Chat/Store/ContactRequest.hs b/src/Simplex/Chat/Store/ContactRequest.hs index ee68de5af2..4836e30116 100644 --- a/src/Simplex/Chat/Store/ContactRequest.hs +++ b/src/Simplex/Chat/Store/ContactRequest.hs @@ -72,7 +72,7 @@ createOrUpdateContactRequest isSimplexTeam invId cReqChatVRange@(VersionRange minV maxV) - profile@Profile {displayName, fullName, image, contactLink, preferences} + profile@Profile {displayName, fullName, shortDescr, image, contactLink, preferences} xContactId_ welcomeMsgId_ requestMsg_ @@ -109,7 +109,7 @@ createOrUpdateContactRequest [sql| SELECT -- Contact - ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, + ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.short_descr, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, cp.preferences, ct.user_preferences, ct.created_at, ct.updated_at, ct.chat_ts, ct.conn_full_link_to_connect, ct.conn_short_link_to_connect, ct.welcome_shared_msg_id, ct.request_shared_msg_id, ct.contact_request_id, ct.contact_group_member_id, ct.contact_grp_inv_sent, ct.ui_themes, ct.chat_deleted, ct.custom_data, ct.chat_item_ttl, -- Connection @@ -143,7 +143,7 @@ createOrUpdateContactRequest SELECT cr.contact_request_id, cr.local_display_name, cr.agent_invitation_id, cr.contact_id, cr.business_group_id, cr.user_contact_link_id, - cr.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, cr.xcontact_id, + cr.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, cr.xcontact_id, cr.pq_support, cr.welcome_shared_msg_id, cr.request_shared_msg_id, p.preferences, cr.created_at, cr.updated_at, cr.peer_chat_min_version, cr.peer_chat_max_version @@ -161,8 +161,8 @@ createOrUpdateContactRequest liftIO $ DB.execute db - "INSERT INTO contact_profiles (display_name, full_name, image, contact_link, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?)" - (displayName, fullName, image, contactLink, userId, preferences, currentTs, currentTs) + "INSERT INTO contact_profiles (display_name, full_name, short_descr, image, contact_link, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?)" + (displayName, fullName, shortDescr, image, contactLink, userId, preferences, currentTs, currentTs) profileId <- liftIO $ insertedRowId db liftIO $ DB.execute @@ -229,6 +229,7 @@ createOrUpdateContactRequest UPDATE contact_profiles SET display_name = ?, full_name = ?, + short_descr = ?, image = ?, contact_link = ?, updated_at = ? @@ -239,7 +240,7 @@ createOrUpdateContactRequest AND contact_request_id = ? ) |] - (displayName, fullName, image, contactLink, currentTs, userId, contactRequestId) + (displayName, fullName, shortDescr, image, contactLink, currentTs, userId, contactRequestId) updateRequest currentTs = if displayName == oldDisplayName then diff --git a/src/Simplex/Chat/Store/Direct.hs b/src/Simplex/Chat/Store/Direct.hs index f142da4553..e6db6bf90e 100644 --- a/src/Simplex/Chat/Store/Direct.hs +++ b/src/Simplex/Chat/Store/Direct.hs @@ -262,7 +262,7 @@ getContactByConnReqHash db vr user@User {userId} cReqHash1 cReqHash2 = do [sql| SELECT -- Contact - ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, + ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.short_descr, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, cp.preferences, ct.user_preferences, ct.created_at, ct.updated_at, ct.chat_ts, ct.conn_full_link_to_connect, ct.conn_short_link_to_connect, ct.welcome_shared_msg_id, ct.request_shared_msg_id, ct.contact_request_id, ct.contact_group_member_id, ct.contact_grp_inv_sent, ct.ui_themes, ct.chat_deleted, ct.custom_data, ct.chat_item_ttl, -- Connection @@ -692,15 +692,15 @@ updateContactProfile_ db userId profileId profile = do updateContactProfile_' db userId profileId profile currentTs updateContactProfile_' :: DB.Connection -> UserId -> ProfileId -> Profile -> UTCTime -> IO () -updateContactProfile_' db userId profileId Profile {displayName, fullName, image, contactLink, preferences} updatedAt = do +updateContactProfile_' db userId profileId Profile {displayName, fullName, shortDescr, image, contactLink, preferences} updatedAt = do DB.execute db [sql| UPDATE contact_profiles - SET display_name = ?, full_name = ?, image = ?, contact_link = ?, preferences = ?, updated_at = ? + SET display_name = ?, full_name = ?, short_descr = ?, image = ?, contact_link = ?, preferences = ?, updated_at = ? WHERE user_id = ? AND contact_profile_id = ? |] - (displayName, fullName, image, contactLink, preferences, updatedAt, userId, profileId) + (displayName, fullName, shortDescr, image, contactLink, preferences, updatedAt, userId, profileId) -- update only member profile fields (when member doesn't have associated contact - we can reset contactLink and prefs) updateMemberContactProfileReset_ :: DB.Connection -> UserId -> ProfileId -> Profile -> IO () @@ -709,15 +709,15 @@ updateMemberContactProfileReset_ db userId profileId profile = do updateMemberContactProfileReset_' db userId profileId profile currentTs updateMemberContactProfileReset_' :: DB.Connection -> UserId -> ProfileId -> Profile -> UTCTime -> IO () -updateMemberContactProfileReset_' db userId profileId Profile {displayName, fullName, image} updatedAt = do +updateMemberContactProfileReset_' db userId profileId Profile {displayName, fullName, shortDescr, image} updatedAt = do DB.execute db [sql| UPDATE contact_profiles - SET display_name = ?, full_name = ?, image = ?, contact_link = NULL, preferences = NULL, updated_at = ? + SET display_name = ?, full_name = ?, short_descr = ?, image = ?, contact_link = NULL, preferences = NULL, updated_at = ? WHERE user_id = ? AND contact_profile_id = ? |] - (displayName, fullName, image, updatedAt, userId, profileId) + (displayName, fullName, shortDescr, image, updatedAt, userId, profileId) -- update only member profile fields (when member has associated contact - we keep contactLink and prefs) updateMemberContactProfile_ :: DB.Connection -> UserId -> ProfileId -> Profile -> IO () @@ -726,15 +726,15 @@ updateMemberContactProfile_ db userId profileId profile = do updateMemberContactProfile_' db userId profileId profile currentTs updateMemberContactProfile_' :: DB.Connection -> UserId -> ProfileId -> Profile -> UTCTime -> IO () -updateMemberContactProfile_' db userId profileId Profile {displayName, fullName, image} updatedAt = do +updateMemberContactProfile_' db userId profileId Profile {displayName, fullName, shortDescr, image} updatedAt = do DB.execute db [sql| UPDATE contact_profiles - SET display_name = ?, full_name = ?, image = ?, updated_at = ? + SET display_name = ?, full_name = ?, short_descr = ?, image = ?, updated_at = ? WHERE user_id = ? AND contact_profile_id = ? |] - (displayName, fullName, image, updatedAt, userId, profileId) + (displayName, fullName, shortDescr, image, updatedAt, userId, profileId) updateContactLDN_ :: DB.Connection -> User -> Int64 -> ContactName -> ContactName -> UTCTime -> IO () updateContactLDN_ db user@User {userId} contactId displayName newName updatedAt = do @@ -785,7 +785,7 @@ contactRequestQuery = SELECT cr.contact_request_id, cr.local_display_name, cr.agent_invitation_id, cr.contact_id, cr.business_group_id, cr.user_contact_link_id, - cr.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, cr.xcontact_id, + cr.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, cr.xcontact_id, cr.pq_support, cr.welcome_shared_msg_id, cr.request_shared_msg_id, p.preferences, cr.created_at, cr.updated_at, cr.peer_chat_min_version, cr.peer_chat_max_version @@ -903,7 +903,7 @@ getContact_ db vr user@User {userId} contactId deleted = do [sql| SELECT -- Contact - ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, + ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.short_descr, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, cp.preferences, ct.user_preferences, ct.created_at, ct.updated_at, ct.chat_ts, ct.conn_full_link_to_connect, ct.conn_short_link_to_connect, ct.welcome_shared_msg_id, ct.request_shared_msg_id, ct.contact_request_id, ct.contact_group_member_id, ct.contact_grp_inv_sent, ct.ui_themes, ct.chat_deleted, ct.custom_data, ct.chat_item_ttl, -- Connection diff --git a/src/Simplex/Chat/Store/Groups.hs b/src/Simplex/Chat/Store/Groups.hs index 51cbcd6b61..c2c6d9798d 100644 --- a/src/Simplex/Chat/Store/Groups.hs +++ b/src/Simplex/Chat/Store/Groups.hs @@ -157,6 +157,7 @@ import Crypto.Random (ChaChaDRG) import qualified Data.Aeson.TH as J import Data.Bifunctor (second) import Data.Bitraversable (bitraverse) +import Data.Char (toLower) import Data.Either (rights) import Data.Int (Int64) import Data.List (partition, sortOn) @@ -192,11 +193,11 @@ import Database.SQLite.Simple (Only (..), Query, (:.) (..)) import Database.SQLite.Simple.QQ (sql) #endif -type MaybeGroupMemberRow = (Maybe Int64, Maybe Int64, Maybe MemberId, Maybe VersionChat, Maybe VersionChat, Maybe GroupMemberRole, Maybe GroupMemberCategory, Maybe GroupMemberStatus, Maybe BoolInt, Maybe MemberRestrictionStatus) :. (Maybe Int64, Maybe GroupMemberId, Maybe ContactName, Maybe ContactId, Maybe ProfileId, Maybe ProfileId, Maybe ContactName, Maybe Text, Maybe ImageData, Maybe ConnLinkContact, Maybe LocalAlias, Maybe Preferences) :. (Maybe UTCTime, Maybe UTCTime) :. (Maybe UTCTime, Maybe Int64, Maybe Int64, Maybe Int64, Maybe UTCTime) +type MaybeGroupMemberRow = (Maybe Int64, Maybe Int64, Maybe MemberId, Maybe VersionChat, Maybe VersionChat, Maybe GroupMemberRole, Maybe GroupMemberCategory, Maybe GroupMemberStatus, Maybe BoolInt, Maybe MemberRestrictionStatus) :. (Maybe Int64, Maybe GroupMemberId, Maybe ContactName, Maybe ContactId, Maybe ProfileId) :. (Maybe ProfileId, Maybe ContactName, Maybe Text, Maybe Text, Maybe ImageData, Maybe ConnLinkContact, Maybe LocalAlias, Maybe Preferences) :. (Maybe UTCTime, Maybe UTCTime) :. (Maybe UTCTime, Maybe Int64, Maybe Int64, Maybe Int64, Maybe UTCTime) toMaybeGroupMember :: Int64 -> MaybeGroupMemberRow -> Maybe GroupMember -toMaybeGroupMember userContactId ((Just groupMemberId, Just groupId, Just memberId, Just minVer, Just maxVer, Just memberRole, Just memberCategory, Just memberStatus, Just showMessages, memberBlocked) :. (invitedById, invitedByGroupMemberId, Just localDisplayName, memberContactId, Just memberContactProfileId, Just profileId, Just displayName, Just fullName, image, contactLink, Just localAlias, contactPreferences) :. (Just createdAt, Just updatedAt) :. (supportChatTs, Just supportChatUnread, Just supportChatUnanswered, Just supportChatMentions, supportChatLastMsgFromMemberTs)) = - Just $ toGroupMember userContactId ((groupMemberId, groupId, memberId, minVer, maxVer, memberRole, memberCategory, memberStatus, showMessages, memberBlocked) :. (invitedById, invitedByGroupMemberId, localDisplayName, memberContactId, memberContactProfileId, profileId, displayName, fullName, image, contactLink, localAlias, contactPreferences) :. (createdAt, updatedAt) :. (supportChatTs, supportChatUnread, supportChatUnanswered, supportChatMentions, supportChatLastMsgFromMemberTs)) +toMaybeGroupMember userContactId ((Just groupMemberId, Just groupId, Just memberId, Just minVer, Just maxVer, Just memberRole, Just memberCategory, Just memberStatus, Just showMessages, memberBlocked) :. (invitedById, invitedByGroupMemberId, Just localDisplayName, memberContactId, Just memberContactProfileId) :. (Just profileId, Just displayName, Just fullName, shortDescr, image, contactLink, Just localAlias, contactPreferences) :. (Just createdAt, Just updatedAt) :. (supportChatTs, Just supportChatUnread, Just supportChatUnanswered, Just supportChatMentions, supportChatLastMsgFromMemberTs)) = + Just $ toGroupMember userContactId ((groupMemberId, groupId, memberId, minVer, maxVer, memberRole, memberCategory, memberStatus, showMessages, memberBlocked) :. (invitedById, invitedByGroupMemberId, localDisplayName, memberContactId, memberContactProfileId) :. (profileId, displayName, fullName, shortDescr, image, contactLink, localAlias, contactPreferences) :. (createdAt, updatedAt) :. (supportChatTs, supportChatUnread, supportChatUnanswered, supportChatMentions, supportChatLastMsgFromMemberTs)) toMaybeGroupMember _ _ = Nothing createGroupLink :: DB.Connection -> User -> GroupInfo -> ConnId -> CreatedLinkContact -> GroupLinkId -> GroupMemberRole -> SubscriptionMode -> ExceptT StoreError IO GroupLink @@ -317,7 +318,7 @@ setGroupLinkShortLink db gLnk@GroupLink {userContactLinkId, connLinkContact = CC -- | creates completely new group with a single member - the current user createNewGroup :: DB.Connection -> VersionRangeChat -> TVar ChaChaDRG -> User -> GroupProfile -> Maybe Profile -> ExceptT StoreError IO GroupInfo createNewGroup db vr gVar user@User {userId} groupProfile incognitoProfile = ExceptT $ do - let GroupProfile {displayName, fullName, description, image, groupPreferences, memberAdmission} = groupProfile + let GroupProfile {displayName, fullName, shortDescr, description, image, groupPreferences, memberAdmission} = groupProfile fullGroupPreferences = mergeGroupPreferences groupPreferences currentTs <- getCurrentTime customUserProfileId <- mapM (createIncognitoProfile_ db userId currentTs) incognitoProfile @@ -325,8 +326,8 @@ createNewGroup db vr gVar user@User {userId} groupProfile incognitoProfile = Exc groupId <- liftIO $ do DB.execute db - "INSERT INTO group_profiles (display_name, full_name, description, image, user_id, preferences, member_admission, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?)" - (displayName, fullName, description, image, userId, groupPreferences, memberAdmission, currentTs, currentTs) + "INSERT INTO group_profiles (display_name, full_name, short_descr, description, image, user_id, preferences, member_admission, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?,?)" + (displayName, fullName, shortDescr, description, image, userId, groupPreferences, memberAdmission, currentTs, currentTs) profileId <- insertedRowId db DB.execute db @@ -388,7 +389,7 @@ createGroupInvitation db vr user@User {userId} contact@Contact {contactId, activ DB.query db "SELECT group_id FROM groups WHERE inv_queue_info = ? AND user_id = ? LIMIT 1" (connRequest, userId) createGroupInvitation_ :: ExceptT StoreError IO (GroupInfo, GroupMemberId) createGroupInvitation_ = do - let GroupProfile {displayName, fullName, description, image, groupPreferences, memberAdmission} = groupProfile + let GroupProfile {displayName, fullName, shortDescr, description, image, groupPreferences, memberAdmission} = groupProfile fullGroupPreferences = mergeGroupPreferences groupPreferences ExceptT $ withLocalDisplayName db userId displayName $ \localDisplayName -> runExceptT $ do @@ -396,8 +397,8 @@ createGroupInvitation db vr user@User {userId} contact@Contact {contactId, activ groupId <- liftIO $ do DB.execute db - "INSERT INTO group_profiles (display_name, full_name, description, image, user_id, preferences, member_admission, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?)" - (displayName, fullName, description, image, userId, groupPreferences, memberAdmission, currentTs, currentTs) + "INSERT INTO group_profiles (display_name, full_name, short_descr, description, image, user_id, preferences, member_admission, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?,?)" + (displayName, fullName, shortDescr, description, image, userId, groupPreferences, memberAdmission, currentTs, currentTs) profileId <- insertedRowId db DB.execute db @@ -753,13 +754,13 @@ createGroupViaLink' createGroup_ :: DB.Connection -> UserId -> GroupProfile -> Maybe (CreatedLinkContact, Maybe SharedMsgId) -> Maybe BusinessChatInfo -> UTCTime -> ExceptT StoreError IO (GroupId, Text) createGroup_ db userId groupProfile prepared business currentTs = ExceptT $ do - let GroupProfile {displayName, fullName, description, image, groupPreferences, memberAdmission} = groupProfile + let GroupProfile {displayName, fullName, shortDescr, description, image, groupPreferences, memberAdmission} = groupProfile withLocalDisplayName db userId displayName $ \localDisplayName -> runExceptT $ do liftIO $ do DB.execute db - "INSERT INTO group_profiles (display_name, full_name, description, image, user_id, preferences, member_admission, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?)" - (displayName, fullName, description, image, userId, groupPreferences, memberAdmission, currentTs, currentTs) + "INSERT INTO group_profiles (display_name, full_name, short_descr, description, image, user_id, preferences, member_admission, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?,?)" + (displayName, fullName, shortDescr, description, image, userId, groupPreferences, memberAdmission, currentTs, currentTs) profileId <- insertedRowId db DB.execute db @@ -936,14 +937,14 @@ getUserGroupDetails db vr User {userId, userContactId} _contactId_ search_ = do db [sql| SELECT - g.group_id, g.local_display_name, gp.display_name, gp.full_name, g.local_alias, gp.description, gp.image, + g.group_id, g.local_display_name, gp.display_name, gp.full_name, gp.short_descr, g.local_alias, gp.description, gp.image, g.enable_ntfs, g.send_rcpts, g.favorite, gp.preferences, gp.member_admission, g.created_at, g.updated_at, g.chat_ts, g.user_member_profile_sent_at, g.conn_full_link_to_connect, g.conn_short_link_to_connect, g.conn_link_prepared_connection, g.conn_link_started_connection, g.welcome_shared_msg_id, g.request_shared_msg_id, g.business_chat, g.business_member_id, g.customer_member_id, g.ui_themes, g.custom_data, g.chat_item_ttl, g.members_require_attention, mu.group_member_id, g.group_id, mu.member_id, mu.peer_chat_min_version, mu.peer_chat_max_version, mu.member_role, mu.member_category, mu.member_status, mu.show_messages, mu.member_restriction, - mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, pu.display_name, pu.full_name, pu.image, pu.contact_link, pu.local_alias, pu.preferences, + mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, pu.display_name, pu.full_name, pu.short_descr, pu.image, pu.contact_link, pu.local_alias, pu.preferences, mu.created_at, mu.updated_at, mu.support_chat_ts, mu.support_chat_items_unread, mu.support_chat_items_member_attention, mu.support_chat_items_mentions, mu.support_chat_last_msg_from_member_ts FROM groups g @@ -951,15 +952,16 @@ getUserGroupDetails db vr User {userId, userContactId} _contactId_ search_ = do JOIN group_members mu USING (group_id) JOIN contact_profiles pu ON pu.contact_profile_id = COALESCE(mu.member_profile_id, mu.contact_profile_id) WHERE g.user_id = ? AND mu.contact_id = ? - AND (LOWER(gp.display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(gp.full_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(gp.description) LIKE '%' || LOWER(?) || '%' + AND (LOWER(gp.display_name) LIKE '%' || ? || '%' + OR LOWER(gp.full_name) LIKE '%' || ? || '%' + OR LOWER(gp.short_descr) LIKE '%' || ? || '%' + OR LOWER(gp.description) LIKE '%' || ? || '%' ) |] - (userId, userContactId, search, search, search) + (userId, userContactId, search, search, search, search) mapM (addGroupChatTags db) g_ where - search = fromMaybe "" search_ + search = maybe "" (map toLower) search_ getUserGroupsWithSummary :: DB.Connection -> VersionRangeChat -> User -> Maybe ContactId -> Maybe String -> IO [(GroupInfo, GroupSummary)] getUserGroupsWithSummary db vr user _contactId_ search_ = @@ -1008,7 +1010,7 @@ groupMemberQuery = [sql| SELECT m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, c.connection_id, c.agent_conn_id, c.conn_level, c.via_contact, c.via_user_contact_link, c.via_group_link, c.group_link_id, c.xcontact_id, c.custom_user_profile_id, @@ -1239,7 +1241,7 @@ createJoiningMember User {userId, userContactId} GroupInfo {groupId, membership} cReqChatVRange - Profile {displayName, fullName, image, contactLink, preferences} + Profile {displayName, fullName, shortDescr, image, contactLink, preferences} cReqXContactId_ welcomeMsgId_ memberRole @@ -1249,8 +1251,8 @@ createJoiningMember liftIO $ DB.execute db - "INSERT INTO contact_profiles (display_name, full_name, image, contact_link, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?)" - (displayName, fullName, image, contactLink, userId, preferences, currentTs, currentTs) + "INSERT INTO contact_profiles (display_name, full_name, short_descr, image, contact_link, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?)" + (displayName, fullName, shortDescr, image, contactLink, userId, preferences, currentTs, currentTs) profileId <- liftIO $ insertedRowId db createWithRandomId gVar $ \memId -> do insertMember_ ldn profileId (MemberId memId) currentTs @@ -1299,7 +1301,7 @@ createBusinessRequestGroup gVar user@User {userId, userContactId} cReqChatVRange - Profile {displayName, fullName, image} + Profile {displayName, fullName, shortDescr, image} profileId -- contact request profile id, to be used for member profile ldn -- contact request local display name, to be used for group local display name groupPreferences = do @@ -1315,8 +1317,8 @@ createBusinessRequestGroup liftIO $ DB.execute db - "INSERT INTO group_profiles (display_name, full_name, image, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?)" - (displayName, fullName, image, userId, groupPreferences, currentTs, currentTs) + "INSERT INTO group_profiles (display_name, full_name, short_descr, image, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?)" + (displayName, fullName, shortDescr, image, userId, groupPreferences, currentTs, currentTs) groupProfileId <- liftIO $ insertedRowId db liftIO $ DB.execute @@ -1503,12 +1505,12 @@ createNewGroupMember db user gInfo invitingMember memInfo@MemberInfo {profile} m liftIO $ createNewMember_ db user gInfo newMember currentTs createNewMemberProfile_ :: DB.Connection -> User -> Profile -> UTCTime -> ExceptT StoreError IO (Text, ProfileId) -createNewMemberProfile_ db User {userId} Profile {displayName, fullName, image, contactLink, preferences} createdAt = +createNewMemberProfile_ db User {userId} Profile {displayName, fullName, shortDescr, image, contactLink, preferences} createdAt = ExceptT . withLocalDisplayName db userId displayName $ \ldn -> do DB.execute db - "INSERT INTO contact_profiles (display_name, full_name, image, contact_link, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?)" - (displayName, fullName, image, contactLink, userId, preferences, createdAt, createdAt) + "INSERT INTO contact_profiles (display_name, full_name, short_descr, image, contact_link, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?)" + (displayName, fullName, shortDescr, image, contactLink, userId, preferences, createdAt, createdAt) profileId <- insertedRowId db pure $ Right (ldn, profileId) @@ -1818,7 +1820,7 @@ getViaGroupMember db vr User {userId, userContactId} Contact {contactId} = do [sql| SELECT -- GroupInfo - g.group_id, g.local_display_name, gp.display_name, gp.full_name, g.local_alias, gp.description, gp.image, + g.group_id, g.local_display_name, gp.display_name, gp.full_name, gp.short_descr, g.local_alias, gp.description, gp.image, g.enable_ntfs, g.send_rcpts, g.favorite, gp.preferences, gp.member_admission, g.created_at, g.updated_at, g.chat_ts, g.user_member_profile_sent_at, g.conn_full_link_to_connect, g.conn_short_link_to_connect, g.conn_link_prepared_connection, g.conn_link_started_connection, g.welcome_shared_msg_id, g.request_shared_msg_id, @@ -1828,12 +1830,12 @@ getViaGroupMember db vr User {userId, userContactId} Contact {contactId} = do mu.group_member_id, mu.group_id, mu.member_id, mu.peer_chat_min_version, mu.peer_chat_max_version, mu.member_role, mu.member_category, mu.member_status, mu.show_messages, mu.member_restriction, mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, -- GroupInfo {membership = GroupMember {memberProfile}} - pu.display_name, pu.full_name, pu.image, pu.contact_link, pu.local_alias, pu.preferences, + pu.display_name, pu.full_name, pu.short_descr, pu.image, pu.contact_link, pu.local_alias, pu.preferences, mu.created_at, mu.updated_at, mu.support_chat_ts, mu.support_chat_items_unread, mu.support_chat_items_member_attention, mu.support_chat_items_mentions, mu.support_chat_last_msg_from_member_ts, -- via GroupMember m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, c.connection_id, c.agent_conn_id, c.conn_level, c.via_contact, c.via_user_contact_link, c.via_group_link, c.group_link_id, c.xcontact_id, c.custom_user_profile_id, @@ -1881,7 +1883,7 @@ getViaGroupContact db vr user@User {userId} GroupMember {groupMemberId} = do maybe (pure Nothing) (fmap eitherToMaybe . runExceptT . getContact db vr user) contactId_ updateGroupProfile :: DB.Connection -> User -> GroupInfo -> GroupProfile -> ExceptT StoreError IO GroupInfo -updateGroupProfile db user@User {userId} g@GroupInfo {groupId, localDisplayName, groupProfile = GroupProfile {displayName}} p'@GroupProfile {displayName = newName, fullName, description, image, groupPreferences, memberAdmission} +updateGroupProfile db user@User {userId} g@GroupInfo {groupId, localDisplayName, groupProfile = GroupProfile {displayName}} p'@GroupProfile {displayName = newName, fullName, shortDescr, description, image, groupPreferences, memberAdmission} | displayName == newName = liftIO $ do currentTs <- getCurrentTime updateGroupProfile_ currentTs @@ -1899,14 +1901,14 @@ updateGroupProfile db user@User {userId} g@GroupInfo {groupId, localDisplayName, db [sql| UPDATE group_profiles - SET display_name = ?, full_name = ?, description = ?, image = ?, preferences = ?, member_admission = ?, updated_at = ? + SET display_name = ?, full_name = ?, short_descr = ?, description = ?, image = ?, preferences = ?, member_admission = ?, updated_at = ? WHERE group_profile_id IN ( SELECT group_profile_id FROM groups WHERE user_id = ? AND group_id = ? ) |] - (newName, fullName, description, image, groupPreferences, memberAdmission, currentTs, userId, groupId) + (newName, fullName, shortDescr, description, image, groupPreferences, memberAdmission, currentTs, userId, groupId) updateGroup_ ldn currentTs = do DB.execute db @@ -1932,10 +1934,10 @@ updateGroupPreferences db User {userId} g@GroupInfo {groupId, groupProfile = p} pure (g :: GroupInfo) {groupProfile = p {groupPreferences = Just ps}, fullGroupPreferences = mergeGroupPreferences $ Just ps} updateGroupProfileFromMember :: DB.Connection -> User -> GroupInfo -> Profile -> ExceptT StoreError IO GroupInfo -updateGroupProfileFromMember db user g@GroupInfo {groupId} Profile {displayName = n, fullName = fn, image = img} = do +updateGroupProfileFromMember db user g@GroupInfo {groupId} Profile {displayName = n, fullName = fn, shortDescr = sd, image = img} = do p <- getGroupProfile -- to avoid any race conditions with UI let g' = g {groupProfile = p} :: GroupInfo - p' = p {displayName = n, fullName = fn, image = img} :: GroupProfile + p' = p {displayName = n, fullName = fn, shortDescr = sd, image = img} :: GroupProfile updateGroupProfile db user g' p' where getGroupProfile = @@ -1944,14 +1946,14 @@ updateGroupProfileFromMember db user g@GroupInfo {groupId} Profile {displayName DB.query db [sql| - SELECT gp.display_name, gp.full_name, gp.description, gp.image, gp.preferences, gp.member_admission + SELECT gp.display_name, gp.full_name, gp.short_descr, gp.description, gp.image, gp.preferences, gp.member_admission FROM group_profiles gp JOIN groups g ON gp.group_profile_id = g.group_profile_id WHERE g.group_id = ? |] (Only groupId) - toGroupProfile (displayName, fullName, description, image, groupPreferences, memberAdmission) = - GroupProfile {displayName, fullName, description, image, groupPreferences, memberAdmission} + toGroupProfile (displayName, fullName, shortDescr, description, image, groupPreferences, memberAdmission) = + GroupProfile {displayName, fullName, shortDescr, description, image, groupPreferences, memberAdmission} getGroupInfo :: DB.Connection -> VersionRangeChat -> User -> Int64 -> ExceptT StoreError IO GroupInfo getGroupInfo db vr User {userId, userContactId} groupId = ExceptT $ do @@ -2052,11 +2054,8 @@ getActiveMembersByName db vr user@User {userId} groupMemberName = do ts GroupInfo {chatTs, updatedAt} = fromMaybe updatedAt chatTs getMatchingContacts :: DB.Connection -> VersionRangeChat -> User -> Contact -> IO [Contact] -getMatchingContacts db vr user@User {userId} Contact {contactId, profile = LocalProfile {displayName, fullName, image}} = do - contactIds <- - map fromOnly <$> case image of - Just img -> DB.query db (q <> " AND p.image = ?") (userId, contactId, CSActive, displayName, fullName, img) - Nothing -> DB.query db (q <> " AND p.image is NULL") (userId, contactId, CSActive, displayName, fullName) +getMatchingContacts db vr user@User {userId} Contact {contactId, profile = LocalProfile {displayName, fullName, shortDescr, image}} = do + contactIds <- map fromOnly <$> DB.query db q (userId, contactId, CSActive, displayName, fullName, shortDescr, image) rights <$> mapM (runExceptT . getContact db vr user) contactIds where -- this query is different from one in getMatchingMemberContacts @@ -2069,14 +2068,12 @@ getMatchingContacts db vr user@User {userId} Contact {contactId, profile = Local WHERE ct.user_id = ? AND ct.contact_id != ? AND ct.contact_status = ? AND ct.deleted = 0 AND ct.is_user = 0 AND p.display_name = ? AND p.full_name = ? + AND p.short_descr IS ? AND p.image IS ? |] getMatchingMembers :: DB.Connection -> VersionRangeChat -> User -> Contact -> IO [GroupMember] -getMatchingMembers db vr user@User {userId} Contact {profile = LocalProfile {displayName, fullName, image}} = do - memberIds <- - map fromOnly <$> case image of - Just img -> DB.query db (q <> " AND p.image = ?") (userId, GCUserMember, displayName, fullName, img) - Nothing -> DB.query db (q <> " AND p.image is NULL") (userId, GCUserMember, displayName, fullName) +getMatchingMembers db vr user@User {userId} Contact {profile = LocalProfile {displayName, fullName, shortDescr, image}} = do + memberIds <- map fromOnly <$> DB.query db q (userId, GCUserMember, displayName, fullName, shortDescr, image) filter memberCurrent . rights <$> mapM (runExceptT . getGroupMemberById db vr user) memberIds where -- only match with members without associated contact @@ -2088,15 +2085,13 @@ getMatchingMembers db vr user@User {userId} Contact {profile = LocalProfile {dis WHERE m.user_id = ? AND m.contact_id IS NULL AND m.member_category != ? AND p.display_name = ? AND p.full_name = ? + AND p.short_descr IS ? AND p.image IS ? |] getMatchingMemberContacts :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> IO [Contact] getMatchingMemberContacts _ _ _ GroupMember {memberContactId = Just _} = pure [] -getMatchingMemberContacts db vr user@User {userId} GroupMember {memberProfile = LocalProfile {displayName, fullName, image}} = do - contactIds <- - map fromOnly <$> case image of - Just img -> DB.query db (q <> " AND p.image = ?") (userId, CSActive, displayName, fullName, img) - Nothing -> DB.query db (q <> " AND p.image is NULL") (userId, CSActive, displayName, fullName) +getMatchingMemberContacts db vr user@User {userId} GroupMember {memberProfile = LocalProfile {displayName, fullName, shortDescr, image}} = do + contactIds <- map fromOnly <$> DB.query db q (userId, CSActive, displayName, fullName, shortDescr, image) rights <$> mapM (runExceptT . getContact db vr user) contactIds where q = @@ -2107,6 +2102,7 @@ getMatchingMemberContacts db vr user@User {userId} GroupMember {memberProfile = WHERE ct.user_id = ? AND ct.contact_status = ? AND ct.deleted = 0 AND ct.is_user = 0 AND p.display_name = ? AND p.full_name = ? + AND p.short_descr IS ? AND p.image IS ? |] createSentProbe :: DB.Connection -> TVar ChaChaDRG -> UserId -> ContactOrMember -> ExceptT StoreError IO (Probe, Int64) diff --git a/src/Simplex/Chat/Store/Messages.hs b/src/Simplex/Chat/Store/Messages.hs index 8c7c02d709..1b74255c41 100644 --- a/src/Simplex/Chat/Store/Messages.hs +++ b/src/Simplex/Chat/Store/Messages.hs @@ -144,6 +144,7 @@ import Control.Monad.IO.Class import Crypto.Random (ChaChaDRG) import Data.Bifunctor (first) import Data.ByteString.Char8 (ByteString) +import Data.Char (toLower) import Data.Either (fromRight, rights) import Data.Int (Int64) import Data.List (foldl', sortBy) @@ -646,7 +647,7 @@ getChatItemQuote_ db User {userId, userContactId} chatDirection QuotedMsg {msgRe -- GroupMember m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, - p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts FROM group_members m @@ -789,13 +790,15 @@ findDirectChatPreviews_ db User {userId} pagination clq = JOIN contact_profiles cp ON ct.contact_profile_id = cp.contact_profile_id WHERE ct.user_id = ? AND ct.is_user = 0 AND ct.deleted = 0 AND ct.contact_used = 1 AND ( - LOWER(ct.local_display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(cp.display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(cp.full_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(cp.local_alias) LIKE '%' || LOWER(?) || '%' + LOWER(ct.local_display_name) LIKE '%' || ? || '%' + OR LOWER(cp.display_name) LIKE '%' || ? || '%' + OR LOWER(cp.full_name) LIKE '%' || ? || '%' + OR LOWER(cp.short_descr) LIKE '%' || ? || '%' + OR LOWER(cp.local_alias) LIKE '%' || ? || '%' ) |] - p = baseParams :. (userId, search, search, search, search) + s = map toLower search + p = baseParams :. (userId, s, s, s, s, s) queryWithPagination q p queryWithPagination :: ToRow p => Query -> p -> IO [(ContactId, UTCTime, Maybe ChatItemId) :. ChatStatsRow] queryWithPagination query params = case pagination of @@ -895,13 +898,15 @@ findGroupChatPreviews_ db User {userId} pagination clq = JOIN group_profiles gp ON gp.group_profile_id = g.group_profile_id WHERE g.user_id = ? AND ( - LOWER(g.local_display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(gp.display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(gp.full_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(gp.description) LIKE '%' || LOWER(?) || '%' + LOWER(g.local_display_name) LIKE '%' || ? || '%' + OR LOWER(gp.display_name) LIKE '%' || ? || '%' + OR LOWER(gp.full_name) LIKE '%' || ? || '%' + OR LOWER(gp.short_descr) LIKE '%' || ? || '%' + OR LOWER(gp.description) LIKE '%' || ? || '%' ) |] - p = baseParams :. (userId, search, search, search, search) + s = map toLower search + p = baseParams :. (userId, s, s, s, s, s) queryWithPagination q p queryWithPagination :: ToRow p => Query -> p -> IO [(GroupId, UTCTime, Maybe ChatItemId) :. GroupStatsRow] queryWithPagination query params = case pagination of @@ -1051,7 +1056,7 @@ getContactRequestChatPreviews_ db User {userId} pagination clq = case clq of SELECT cr.contact_request_id, cr.local_display_name, cr.agent_invitation_id, cr.contact_id, cr.business_group_id, cr.user_contact_link_id, - cr.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, cr.xcontact_id, + cr.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, cr.xcontact_id, cr.pq_support, cr.welcome_shared_msg_id, cr.request_shared_msg_id, p.preferences, cr.created_at, cr.updated_at, cr.peer_chat_min_version, cr.peer_chat_max_version @@ -1065,12 +1070,13 @@ getContactRequestChatPreviews_ db User {userId} pagination clq = case clq of AND cr.contact_id IS NULL AND cr.business_group_id IS NULL AND ( - LOWER(cr.local_display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(p.display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(p.full_name) LIKE '%' || LOWER(?) || '%' + LOWER(cr.local_display_name) LIKE '%' || ? || '%' + OR LOWER(p.display_name) LIKE '%' || ? || '%' + OR LOWER(p.full_name) LIKE '%' || ? || '%' + OR LOWER(p.short_descr) LIKE '%' || ? || '%' ) |] - params search = (userId, userId, search, search, search) + params search = let s = map toLower search in (userId, userId, s, s, s, s) getPreviews search = case pagination of PTLast count -> DB.query db (query <> " ORDER BY cr.updated_at DESC LIMIT ?") (params search :. Only count) PTAfter ts count -> DB.query db (query <> " AND cr.updated_at > ? ORDER BY cr.updated_at ASC LIMIT ?") (params search :. (ts, count)) @@ -2896,7 +2902,7 @@ getGroupChatItem db User {userId, userContactId} groupId itemId = ExceptT $ do -- GroupMember m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, - p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, -- quoted ChatItem @@ -2904,13 +2910,13 @@ getGroupChatItem db User {userId, userContactId} groupId itemId = ExceptT $ do -- quoted GroupMember rm.group_member_id, rm.group_id, rm.member_id, rm.peer_chat_min_version, rm.peer_chat_max_version, rm.member_role, rm.member_category, rm.member_status, rm.show_messages, rm.member_restriction, rm.invited_by, rm.invited_by_group_member_id, rm.local_display_name, rm.contact_id, rm.contact_profile_id, rp.contact_profile_id, - rp.display_name, rp.full_name, rp.image, rp.contact_link, rp.local_alias, rp.preferences, + rp.display_name, rp.full_name, rp.short_descr, rp.image, rp.contact_link, rp.local_alias, rp.preferences, rm.created_at, rm.updated_at, rm.support_chat_ts, rm.support_chat_items_unread, rm.support_chat_items_member_attention, rm.support_chat_items_mentions, rm.support_chat_last_msg_from_member_ts, -- deleted by GroupMember dbm.group_member_id, dbm.group_id, dbm.member_id, dbm.peer_chat_min_version, dbm.peer_chat_max_version, dbm.member_role, dbm.member_category, dbm.member_status, dbm.show_messages, dbm.member_restriction, dbm.invited_by, dbm.invited_by_group_member_id, dbm.local_display_name, dbm.contact_id, dbm.contact_profile_id, dbp.contact_profile_id, - dbp.display_name, dbp.full_name, dbp.image, dbp.contact_link, dbp.local_alias, dbp.preferences, + dbp.display_name, dbp.full_name, dbp.short_descr, dbp.image, dbp.contact_link, dbp.local_alias, dbp.preferences, dbm.created_at, dbm.updated_at, dbm.support_chat_ts, dbm.support_chat_items_unread, dbm.support_chat_items_member_attention, dbm.support_chat_items_mentions, dbm.support_chat_last_msg_from_member_ts FROM chat_items i diff --git a/src/Simplex/Chat/Store/Postgres/Migrations.hs b/src/Simplex/Chat/Store/Postgres/Migrations.hs index 02e2378d2c..b3ca626ca3 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations.hs +++ b/src/Simplex/Chat/Store/Postgres/Migrations.hs @@ -11,6 +11,7 @@ import Simplex.Chat.Store.Postgres.Migrations.M20250513_group_scope import Simplex.Chat.Store.Postgres.Migrations.M20250526_short_links import Simplex.Chat.Store.Postgres.Migrations.M20250702_contact_requests_remove_cascade_delete import Simplex.Chat.Store.Postgres.Migrations.M20250704_groups_conn_link_prepared_connection +import Simplex.Chat.Store.Postgres.Migrations.M20250709_profile_short_descr import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Text, Maybe Text)] @@ -21,7 +22,8 @@ schemaMigrations = ("20250513_group_scope", m20250513_group_scope, Just down_m20250513_group_scope), ("20250526_short_links", m20250526_short_links, Just down_m20250526_short_links), ("20250702_contact_requests_remove_cascade_delete", m20250702_contact_requests_remove_cascade_delete, Just down_m20250702_contact_requests_remove_cascade_delete), - ("20250704_groups_conn_link_prepared_connection", m20250704_groups_conn_link_prepared_connection, Just down_m20250704_groups_conn_link_prepared_connection) + ("20250704_groups_conn_link_prepared_connection", m20250704_groups_conn_link_prepared_connection, Just down_m20250704_groups_conn_link_prepared_connection), + ("20250709_profile_short_descr", m20250709_profile_short_descr, Just down_m20250709_profile_short_descr) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/M20250709_profile_short_descr.hs b/src/Simplex/Chat/Store/Postgres/Migrations/M20250709_profile_short_descr.hs new file mode 100644 index 0000000000..ddf6eb4a34 --- /dev/null +++ b/src/Simplex/Chat/Store/Postgres/Migrations/M20250709_profile_short_descr.hs @@ -0,0 +1,23 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Store.Postgres.Migrations.M20250709_profile_short_descr where + +import Data.Text (Text) +import qualified Data.Text as T +import Text.RawString.QQ (r) + +m20250709_profile_short_descr :: Text +m20250709_profile_short_descr = + T.pack + [r| +ALTER TABLE contact_profiles ADD COLUMN short_descr TEXT; +ALTER TABLE group_profiles ADD COLUMN short_descr TEXT; +|] + +down_m20250709_profile_short_descr :: Text +down_m20250709_profile_short_descr = + T.pack + [r| +ALTER TABLE contact_profiles DROP COLUMN short_descr; +ALTER TABLE group_profiles DROP COLUMN short_descr; +|] diff --git a/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql b/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql index 4115c8a491..81a2cdc505 100644 --- a/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Store/Postgres/Migrations/chat_schema.sql @@ -331,7 +331,8 @@ CREATE TABLE test_chat_schema.contact_profiles ( incognito smallint, local_alias text DEFAULT ''::text NOT NULL, preferences text, - contact_link bytea + contact_link bytea, + short_descr text ); @@ -577,7 +578,8 @@ CREATE TABLE test_chat_schema.group_profiles ( user_id bigint, preferences text, description text, - member_admission text + member_admission text, + short_descr text ); diff --git a/src/Simplex/Chat/Store/Profiles.hs b/src/Simplex/Chat/Store/Profiles.hs index 7fca9fed3f..b1bd94edf0 100644 --- a/src/Simplex/Chat/Store/Profiles.hs +++ b/src/Simplex/Chat/Store/Profiles.hs @@ -129,7 +129,7 @@ createUserRecord :: DB.Connection -> AgentUserId -> Profile -> Bool -> ExceptT S createUserRecord db auId p activeUser = createUserRecordAt db auId p activeUser =<< liftIO getCurrentTime createUserRecordAt :: DB.Connection -> AgentUserId -> Profile -> Bool -> UTCTime -> ExceptT StoreError IO User -createUserRecordAt db (AgentUserId auId) Profile {displayName, fullName, image, preferences = userPreferences} activeUser currentTs = +createUserRecordAt db (AgentUserId auId) Profile {displayName, fullName, shortDescr, image, preferences = userPreferences} activeUser currentTs = checkConstraint SEDuplicateName . liftIO $ do when activeUser $ DB.execute_ db "UPDATE users SET active_user = 0" let showNtfs = True @@ -147,8 +147,8 @@ createUserRecordAt db (AgentUserId auId) Profile {displayName, fullName, image, (displayName, displayName, userId, currentTs, currentTs) DB.execute db - "INSERT INTO contact_profiles (display_name, full_name, image, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?)" - (displayName, fullName, image, userId, userPreferences, currentTs, currentTs) + "INSERT INTO contact_profiles (display_name, full_name, short_descr, image, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?)" + (displayName, fullName, shortDescr, image, userId, userPreferences, currentTs, currentTs) profileId <- insertedRowId db DB.execute db @@ -156,7 +156,7 @@ createUserRecordAt db (AgentUserId auId) Profile {displayName, fullName, image, (profileId, displayName, userId, BI True, currentTs, currentTs, currentTs) contactId <- insertedRowId db DB.execute db "UPDATE users SET contact_id = ? WHERE user_id = ?" (contactId, userId) - pure $ toUser $ (userId, auId, contactId, profileId, BI activeUser, order, displayName, fullName, image, Nothing, userPreferences) :. (BI showNtfs, BI sendRcptsContacts, BI sendRcptsSmallGroups, Nothing, Nothing, Nothing, Nothing) + pure $ toUser $ (userId, auId, contactId, profileId, BI activeUser, order, displayName, fullName, shortDescr, image, Nothing, userPreferences) :. (BI showNtfs, BI sendRcptsContacts, BI sendRcptsSmallGroups, Nothing, Nothing, Nothing, Nothing) -- TODO [mentions] getUsersInfo :: DB.Connection -> IO [UserInfo] @@ -344,14 +344,14 @@ getUserContactProfiles db User {userId} = <$> DB.query db [sql| - SELECT display_name, full_name, image, contact_link, preferences + SELECT display_name, full_name, short_descr, image, contact_link, preferences FROM contact_profiles WHERE user_id = ? |] (Only userId) where - toContactProfile :: (ContactName, Text, Maybe ImageData, Maybe ConnLinkContact, Maybe Preferences) -> Profile - toContactProfile (displayName, fullName, image, contactLink, preferences) = Profile {displayName, fullName, image, contactLink, preferences} + toContactProfile :: (ContactName, Text, Maybe Text, Maybe ImageData, Maybe ConnLinkContact, Maybe Preferences) -> Profile + toContactProfile (displayName, fullName, shortDescr, image, contactLink, preferences) = Profile {displayName, fullName, shortDescr, image, contactLink, preferences} createUserContactLink :: DB.Connection -> User -> ConnId -> CreatedLinkContact -> SubscriptionMode -> ExceptT StoreError IO () createUserContactLink db User {userId} agentConnId (CCLink cReq shortLink) subMode = diff --git a/src/Simplex/Chat/Store/SQLite/Migrations.hs b/src/Simplex/Chat/Store/SQLite/Migrations.hs index ed78c8092a..fb13f1dcc8 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations.hs +++ b/src/Simplex/Chat/Store/SQLite/Migrations.hs @@ -134,6 +134,7 @@ import Simplex.Chat.Store.SQLite.Migrations.M20250513_group_scope import Simplex.Chat.Store.SQLite.Migrations.M20250526_short_links import Simplex.Chat.Store.SQLite.Migrations.M20250702_contact_requests_remove_cascade_delete import Simplex.Chat.Store.SQLite.Migrations.M20250704_groups_conn_link_prepared_connection +import Simplex.Chat.Store.SQLite.Migrations.M20250709_profile_short_descr import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Query, Maybe Query)] @@ -267,7 +268,8 @@ schemaMigrations = ("20250513_group_scope", m20250513_group_scope, Just down_m20250513_group_scope), ("20250526_short_links", m20250526_short_links, Just down_m20250526_short_links), ("20250702_contact_requests_remove_cascade_delete", m20250702_contact_requests_remove_cascade_delete, Just down_m20250702_contact_requests_remove_cascade_delete), - ("20250704_groups_conn_link_prepared_connection", m20250704_groups_conn_link_prepared_connection, Just down_m20250704_groups_conn_link_prepared_connection) + ("20250704_groups_conn_link_prepared_connection", m20250704_groups_conn_link_prepared_connection, Just down_m20250704_groups_conn_link_prepared_connection), + ("20250709_profile_short_descr", m20250709_profile_short_descr, Just down_m20250709_profile_short_descr) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/M20250709_profile_short_descr.hs b/src/Simplex/Chat/Store/SQLite/Migrations/M20250709_profile_short_descr.hs new file mode 100644 index 0000000000..59d8424d07 --- /dev/null +++ b/src/Simplex/Chat/Store/SQLite/Migrations/M20250709_profile_short_descr.hs @@ -0,0 +1,20 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Store.SQLite.Migrations.M20250709_profile_short_descr where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20250709_profile_short_descr :: Query +m20250709_profile_short_descr = + [sql| +ALTER TABLE contact_profiles ADD COLUMN short_descr TEXT; +ALTER TABLE group_profiles ADD COLUMN short_descr TEXT; +|] + +down_m20250709_profile_short_descr :: Query +down_m20250709_profile_short_descr = + [sql| +ALTER TABLE contact_profiles DROP COLUMN short_descr; +ALTER TABLE group_profiles DROP COLUMN short_descr; +|] diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index 2ff3164c5d..7454285725 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -60,7 +60,7 @@ Plan: Query: SELECT -- GroupInfo - g.group_id, g.local_display_name, gp.display_name, gp.full_name, g.local_alias, gp.description, gp.image, + g.group_id, g.local_display_name, gp.display_name, gp.full_name, gp.short_descr, g.local_alias, gp.description, gp.image, g.enable_ntfs, g.send_rcpts, g.favorite, gp.preferences, gp.member_admission, g.created_at, g.updated_at, g.chat_ts, g.user_member_profile_sent_at, g.conn_full_link_to_connect, g.conn_short_link_to_connect, g.conn_link_prepared_connection, g.conn_link_started_connection, g.welcome_shared_msg_id, g.request_shared_msg_id, @@ -70,12 +70,12 @@ Query: mu.group_member_id, mu.group_id, mu.member_id, mu.peer_chat_min_version, mu.peer_chat_max_version, mu.member_role, mu.member_category, mu.member_status, mu.show_messages, mu.member_restriction, mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, -- GroupInfo {membership = GroupMember {memberProfile}} - pu.display_name, pu.full_name, pu.image, pu.contact_link, pu.local_alias, pu.preferences, + pu.display_name, pu.full_name, pu.short_descr, pu.image, pu.contact_link, pu.local_alias, pu.preferences, mu.created_at, mu.updated_at, mu.support_chat_ts, mu.support_chat_items_unread, mu.support_chat_items_member_attention, mu.support_chat_items_mentions, mu.support_chat_last_msg_from_member_ts, -- from GroupMember m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts FROM group_members m @@ -196,7 +196,7 @@ Plan: Query: SELECT -- Contact - ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, + ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.short_descr, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, cp.preferences, ct.user_preferences, ct.created_at, ct.updated_at, ct.chat_ts, ct.conn_full_link_to_connect, ct.conn_short_link_to_connect, ct.welcome_shared_msg_id, ct.request_shared_msg_id, ct.contact_request_id, ct.contact_group_member_id, ct.contact_grp_inv_sent, ct.ui_themes, ct.chat_deleted, ct.custom_data, ct.chat_item_ttl, -- Connection @@ -287,6 +287,7 @@ Query: UPDATE contact_profiles SET display_name = ?, full_name = ?, + short_descr = ?, image = ?, contact_link = ?, updated_at = ? @@ -383,7 +384,7 @@ Plan: Query: SELECT - c.contact_profile_id, c.local_display_name, c.via_group, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, c.contact_used, c.contact_status, c.enable_ntfs, c.send_rcpts, c.favorite, + c.contact_profile_id, c.local_display_name, c.via_group, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, c.contact_used, c.contact_status, c.enable_ntfs, c.send_rcpts, c.favorite, p.preferences, c.user_preferences, c.created_at, c.updated_at, c.chat_ts, c.conn_full_link_to_connect, c.conn_short_link_to_connect, c.welcome_shared_msg_id, c.request_shared_msg_id, c.contact_request_id, c.contact_group_member_id, c.contact_grp_inv_sent, c.ui_themes, c.chat_deleted, c.custom_data, c.chat_item_ttl FROM contacts c @@ -398,7 +399,7 @@ Query: SELECT cr.contact_request_id, cr.local_display_name, cr.agent_invitation_id, cr.contact_id, cr.business_group_id, cr.user_contact_link_id, - cr.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, cr.xcontact_id, + cr.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, cr.xcontact_id, cr.pq_support, cr.welcome_shared_msg_id, cr.request_shared_msg_id, p.preferences, cr.created_at, cr.updated_at, cr.peer_chat_min_version, cr.peer_chat_max_version @@ -644,7 +645,7 @@ SEARCH m USING INTEGER PRIMARY KEY (rowid=?) SEARCH ct USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT gp.display_name, gp.full_name, gp.description, gp.image, gp.preferences, gp.member_admission + SELECT gp.display_name, gp.full_name, gp.short_descr, gp.description, gp.image, gp.preferences, gp.member_admission FROM group_profiles gp JOIN groups g ON gp.group_profile_id = g.group_profile_id WHERE g.group_id = ? @@ -673,7 +674,7 @@ Query: -- GroupMember m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, - p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts FROM group_members m @@ -867,7 +868,7 @@ Query: -- GroupMember m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, - p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, -- quoted ChatItem @@ -875,13 +876,13 @@ Query: -- quoted GroupMember rm.group_member_id, rm.group_id, rm.member_id, rm.peer_chat_min_version, rm.peer_chat_max_version, rm.member_role, rm.member_category, rm.member_status, rm.show_messages, rm.member_restriction, rm.invited_by, rm.invited_by_group_member_id, rm.local_display_name, rm.contact_id, rm.contact_profile_id, rp.contact_profile_id, - rp.display_name, rp.full_name, rp.image, rp.contact_link, rp.local_alias, rp.preferences, + rp.display_name, rp.full_name, rp.short_descr, rp.image, rp.contact_link, rp.local_alias, rp.preferences, rm.created_at, rm.updated_at, rm.support_chat_ts, rm.support_chat_items_unread, rm.support_chat_items_member_attention, rm.support_chat_items_mentions, rm.support_chat_last_msg_from_member_ts, -- deleted by GroupMember dbm.group_member_id, dbm.group_id, dbm.member_id, dbm.peer_chat_min_version, dbm.peer_chat_max_version, dbm.member_role, dbm.member_category, dbm.member_status, dbm.show_messages, dbm.member_restriction, dbm.invited_by, dbm.invited_by_group_member_id, dbm.local_display_name, dbm.contact_id, dbm.contact_profile_id, dbp.contact_profile_id, - dbp.display_name, dbp.full_name, dbp.image, dbp.contact_link, dbp.local_alias, dbp.preferences, + dbp.display_name, dbp.full_name, dbp.short_descr, dbp.image, dbp.contact_link, dbp.local_alias, dbp.preferences, dbm.created_at, dbm.updated_at, dbm.support_chat_ts, dbm.support_chat_items_unread, dbm.support_chat_items_member_attention, dbm.support_chat_items_mentions, dbm.support_chat_last_msg_from_member_ts FROM chat_items i @@ -933,7 +934,7 @@ SEARCH ri USING COVERING INDEX idx_chat_items_direct_shared_msg_id (user_id=? AN Query: SELECT -- Contact - ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, + ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.short_descr, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, cp.preferences, ct.user_preferences, ct.created_at, ct.updated_at, ct.chat_ts, ct.conn_full_link_to_connect, ct.conn_short_link_to_connect, ct.welcome_shared_msg_id, ct.request_shared_msg_id, ct.contact_request_id, ct.contact_group_member_id, ct.contact_grp_inv_sent, ct.ui_themes, ct.chat_deleted, ct.custom_data, ct.chat_item_ttl, -- Connection @@ -963,7 +964,7 @@ USE TEMP B-TREE FOR ORDER BY Query: SELECT -- GroupInfo - g.group_id, g.local_display_name, gp.display_name, gp.full_name, g.local_alias, gp.description, gp.image, + g.group_id, g.local_display_name, gp.display_name, gp.full_name, gp.short_descr, g.local_alias, gp.description, gp.image, g.enable_ntfs, g.send_rcpts, g.favorite, gp.preferences, gp.member_admission, g.created_at, g.updated_at, g.chat_ts, g.user_member_profile_sent_at, g.conn_full_link_to_connect, g.conn_short_link_to_connect, g.conn_link_prepared_connection, g.conn_link_started_connection, g.welcome_shared_msg_id, g.request_shared_msg_id, @@ -973,12 +974,12 @@ Query: mu.group_member_id, mu.group_id, mu.member_id, mu.peer_chat_min_version, mu.peer_chat_max_version, mu.member_role, mu.member_category, mu.member_status, mu.show_messages, mu.member_restriction, mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, -- GroupInfo {membership = GroupMember {memberProfile}} - pu.display_name, pu.full_name, pu.image, pu.contact_link, pu.local_alias, pu.preferences, + pu.display_name, pu.full_name, pu.short_descr, pu.image, pu.contact_link, pu.local_alias, pu.preferences, mu.created_at, mu.updated_at, mu.support_chat_ts, mu.support_chat_items_unread, mu.support_chat_items_member_attention, mu.support_chat_items_mentions, mu.support_chat_last_msg_from_member_ts, -- via GroupMember m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, c.connection_id, c.agent_conn_id, c.conn_level, c.via_contact, c.via_user_contact_link, c.via_group_link, c.group_link_id, c.xcontact_id, c.custom_user_profile_id, @@ -1013,14 +1014,14 @@ SEARCH cc USING COVERING INDEX idx_connections_group_member (user_id=? AND group Query: SELECT - g.group_id, g.local_display_name, gp.display_name, gp.full_name, g.local_alias, gp.description, gp.image, + g.group_id, g.local_display_name, gp.display_name, gp.full_name, gp.short_descr, g.local_alias, gp.description, gp.image, g.enable_ntfs, g.send_rcpts, g.favorite, gp.preferences, gp.member_admission, g.created_at, g.updated_at, g.chat_ts, g.user_member_profile_sent_at, g.conn_full_link_to_connect, g.conn_short_link_to_connect, g.conn_link_prepared_connection, g.conn_link_started_connection, g.welcome_shared_msg_id, g.request_shared_msg_id, g.business_chat, g.business_member_id, g.customer_member_id, g.ui_themes, g.custom_data, g.chat_item_ttl, g.members_require_attention, mu.group_member_id, g.group_id, mu.member_id, mu.peer_chat_min_version, mu.peer_chat_max_version, mu.member_role, mu.member_category, mu.member_status, mu.show_messages, mu.member_restriction, - mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, pu.display_name, pu.full_name, pu.image, pu.contact_link, pu.local_alias, pu.preferences, + mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, pu.display_name, pu.full_name, pu.short_descr, pu.image, pu.contact_link, pu.local_alias, pu.preferences, mu.created_at, mu.updated_at, mu.support_chat_ts, mu.support_chat_items_unread, mu.support_chat_items_member_attention, mu.support_chat_items_mentions, mu.support_chat_last_msg_from_member_ts FROM groups g @@ -1028,9 +1029,10 @@ Query: JOIN group_members mu USING (group_id) JOIN contact_profiles pu ON pu.contact_profile_id = COALESCE(mu.member_profile_id, mu.contact_profile_id) WHERE g.user_id = ? AND mu.contact_id = ? - AND (LOWER(gp.display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(gp.full_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(gp.description) LIKE '%' || LOWER(?) || '%' + AND (LOWER(gp.display_name) LIKE '%' || ? || '%' + OR LOWER(gp.full_name) LIKE '%' || ? || '%' + OR LOWER(gp.short_descr) LIKE '%' || ? || '%' + OR LOWER(gp.description) LIKE '%' || ? || '%' ) Plan: @@ -1444,7 +1446,7 @@ SEARCH group_members USING INTEGER PRIMARY KEY (rowid=?) Query: UPDATE group_profiles - SET display_name = ?, full_name = ?, description = ?, image = ?, preferences = ?, member_admission = ?, updated_at = ? + SET display_name = ?, full_name = ?, short_descr = ?, description = ?, image = ?, preferences = ?, member_admission = ?, updated_at = ? WHERE group_profile_id IN ( SELECT group_profile_id FROM groups @@ -1524,7 +1526,7 @@ Plan: Query: SELECT -- Contact - ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, + ct.contact_id, ct.contact_profile_id, ct.local_display_name, ct.via_group, cp.display_name, cp.full_name, cp.short_descr, cp.image, cp.contact_link, cp.local_alias, ct.contact_used, ct.contact_status, ct.enable_ntfs, ct.send_rcpts, ct.favorite, cp.preferences, ct.user_preferences, ct.created_at, ct.updated_at, ct.chat_ts, ct.conn_full_link_to_connect, ct.conn_short_link_to_connect, ct.welcome_shared_msg_id, ct.request_shared_msg_id, ct.contact_request_id, ct.contact_group_member_id, ct.contact_grp_inv_sent, ct.ui_themes, ct.chat_deleted, ct.custom_data, ct.chat_item_ttl, -- Connection @@ -1627,7 +1629,7 @@ Query: SELECT cr.contact_request_id, cr.local_display_name, cr.agent_invitation_id, cr.contact_id, cr.business_group_id, cr.user_contact_link_id, - cr.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, cr.xcontact_id, + cr.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, cr.xcontact_id, cr.pq_support, cr.welcome_shared_msg_id, cr.request_shared_msg_id, p.preferences, cr.created_at, cr.updated_at, cr.peer_chat_min_version, cr.peer_chat_max_version @@ -1641,9 +1643,10 @@ Query: AND cr.contact_id IS NULL AND cr.business_group_id IS NULL AND ( - LOWER(cr.local_display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(p.display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(p.full_name) LIKE '%' || LOWER(?) || '%' + LOWER(cr.local_display_name) LIKE '%' || ? || '%' + OR LOWER(p.display_name) LIKE '%' || ? || '%' + OR LOWER(p.full_name) LIKE '%' || ? || '%' + OR LOWER(p.short_descr) LIKE '%' || ? || '%' ) AND cr.updated_at < ? ORDER BY cr.updated_at DESC LIMIT ? Plan: @@ -1655,7 +1658,7 @@ Query: SELECT cr.contact_request_id, cr.local_display_name, cr.agent_invitation_id, cr.contact_id, cr.business_group_id, cr.user_contact_link_id, - cr.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, cr.xcontact_id, + cr.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, cr.xcontact_id, cr.pq_support, cr.welcome_shared_msg_id, cr.request_shared_msg_id, p.preferences, cr.created_at, cr.updated_at, cr.peer_chat_min_version, cr.peer_chat_max_version @@ -1669,9 +1672,10 @@ Query: AND cr.contact_id IS NULL AND cr.business_group_id IS NULL AND ( - LOWER(cr.local_display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(p.display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(p.full_name) LIKE '%' || LOWER(?) || '%' + LOWER(cr.local_display_name) LIKE '%' || ? || '%' + OR LOWER(p.display_name) LIKE '%' || ? || '%' + OR LOWER(p.full_name) LIKE '%' || ? || '%' + OR LOWER(p.short_descr) LIKE '%' || ? || '%' ) AND cr.updated_at > ? ORDER BY cr.updated_at ASC LIMIT ? Plan: @@ -1683,7 +1687,7 @@ Query: SELECT cr.contact_request_id, cr.local_display_name, cr.agent_invitation_id, cr.contact_id, cr.business_group_id, cr.user_contact_link_id, - cr.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, cr.xcontact_id, + cr.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, cr.xcontact_id, cr.pq_support, cr.welcome_shared_msg_id, cr.request_shared_msg_id, p.preferences, cr.created_at, cr.updated_at, cr.peer_chat_min_version, cr.peer_chat_max_version @@ -1697,9 +1701,10 @@ Query: AND cr.contact_id IS NULL AND cr.business_group_id IS NULL AND ( - LOWER(cr.local_display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(p.display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(p.full_name) LIKE '%' || LOWER(?) || '%' + LOWER(cr.local_display_name) LIKE '%' || ? || '%' + OR LOWER(p.display_name) LIKE '%' || ? || '%' + OR LOWER(p.full_name) LIKE '%' || ? || '%' + OR LOWER(p.short_descr) LIKE '%' || ? || '%' ) ORDER BY cr.updated_at DESC LIMIT ? Plan: @@ -1742,10 +1747,11 @@ Query: JOIN contact_profiles cp ON ct.contact_profile_id = cp.contact_profile_id WHERE ct.user_id = ? AND ct.is_user = 0 AND ct.deleted = 0 AND ct.contact_used = 1 AND ( - LOWER(ct.local_display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(cp.display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(cp.full_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(cp.local_alias) LIKE '%' || LOWER(?) || '%' + LOWER(ct.local_display_name) LIKE '%' || ? || '%' + OR LOWER(cp.display_name) LIKE '%' || ? || '%' + OR LOWER(cp.full_name) LIKE '%' || ? || '%' + OR LOWER(cp.short_descr) LIKE '%' || ? || '%' + OR LOWER(cp.local_alias) LIKE '%' || ? || '%' ) ORDER BY ct.chat_ts DESC LIMIT ? Plan: @@ -2113,10 +2119,11 @@ Query: JOIN group_profiles gp ON gp.group_profile_id = g.group_profile_id WHERE g.user_id = ? AND ( - LOWER(g.local_display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(gp.display_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(gp.full_name) LIKE '%' || LOWER(?) || '%' - OR LOWER(gp.description) LIKE '%' || LOWER(?) || '%' + LOWER(g.local_display_name) LIKE '%' || ? || '%' + OR LOWER(gp.display_name) LIKE '%' || ? || '%' + OR LOWER(gp.full_name) LIKE '%' || ? || '%' + OR LOWER(gp.short_descr) LIKE '%' || ? || '%' + OR LOWER(gp.description) LIKE '%' || ? || '%' ) ORDER BY g.chat_ts DESC LIMIT ? Plan: @@ -3169,7 +3176,7 @@ Plan: SEARCH connections USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT cp.display_name, cp.full_name, cp.image, cp.contact_link, cp.local_alias, cp.preferences -- , ct.user_preferences + SELECT cp.contact_profile_id, cp.display_name, cp.full_name, cp.short_descr, cp.image, cp.contact_link, cp.local_alias, cp.preferences -- , ct.user_preferences FROM contact_profiles cp WHERE cp.user_id = ? AND cp.contact_profile_id = ? @@ -3183,19 +3190,8 @@ Query: WHERE ct.user_id = ? AND ct.contact_status = ? AND ct.deleted = 0 AND ct.is_user = 0 AND p.display_name = ? AND p.full_name = ? - AND p.image = ? -Plan: -SEARCH ct USING INDEX idx_contacts_chat_ts (user_id=?) -SEARCH p USING INTEGER PRIMARY KEY (rowid=?) - -Query: - SELECT ct.contact_id - FROM contacts ct - JOIN contact_profiles p ON ct.contact_profile_id = p.contact_profile_id - WHERE ct.user_id = ? - AND ct.contact_status = ? AND ct.deleted = 0 AND ct.is_user = 0 - AND p.display_name = ? AND p.full_name = ? - AND p.image is NULL + AND p.short_descr IS ? AND p.image IS ? + Plan: SEARCH ct USING INDEX idx_contacts_chat_ts (user_id=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) @@ -3223,7 +3219,7 @@ SEARCH f USING PRIMARY KEY (file_id=?) SEARCH d USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT display_name, full_name, image, contact_link, preferences + SELECT display_name, full_name, short_descr, image, contact_link, preferences FROM contact_profiles WHERE user_id = ? @@ -3324,19 +3320,8 @@ Query: WHERE m.user_id = ? AND m.contact_id IS NULL AND m.member_category != ? AND p.display_name = ? AND p.full_name = ? - AND p.image = ? -Plan: -SEARCH m USING INDEX idx_group_members_user_id (user_id=?) -SEARCH p USING INTEGER PRIMARY KEY (rowid=?) - -Query: - SELECT m.group_member_id - FROM group_members m - JOIN contact_profiles p ON p.contact_profile_id = COALESCE(m.member_profile_id, m.contact_profile_id) - WHERE m.user_id = ? AND m.contact_id IS NULL - AND m.member_category != ? - AND p.display_name = ? AND p.full_name = ? - AND p.image is NULL + AND p.short_descr IS ? AND p.image IS ? + Plan: SEARCH m USING INDEX idx_group_members_user_id (user_id=?) SEARCH p USING INTEGER PRIMARY KEY (rowid=?) @@ -4133,8 +4118,8 @@ Query: Plan: Query: - INSERT INTO contact_profiles (display_name, full_name, image, user_id, incognito, created_at, updated_at) - VALUES (?,?,?,?,?,?,?) + INSERT INTO contact_profiles (display_name, full_name, short_descr, image, user_id, incognito, created_at, updated_at) + VALUES (?,?,?,?,?,?,?,?) Plan: SEARCH contact_requests USING COVERING INDEX idx_contact_requests_contact_profile_id (contact_profile_id=?) @@ -4389,7 +4374,7 @@ SEARCH contact_profiles USING INTEGER PRIMARY KEY (rowid=?) Query: UPDATE contact_profiles - SET display_name = ?, full_name = ?, image = ?, contact_link = ?, preferences = ?, updated_at = ? + SET display_name = ?, full_name = ?, short_descr = ?, image = ?, contact_link = ?, preferences = ?, updated_at = ? WHERE user_id = ? AND contact_profile_id = ? Plan: @@ -4397,7 +4382,7 @@ SEARCH contact_profiles USING INTEGER PRIMARY KEY (rowid=?) Query: UPDATE contact_profiles - SET display_name = ?, full_name = ?, image = ?, contact_link = NULL, preferences = NULL, updated_at = ? + SET display_name = ?, full_name = ?, short_descr = ?, image = ?, contact_link = NULL, preferences = NULL, updated_at = ? WHERE user_id = ? AND contact_profile_id = ? Plan: @@ -4405,7 +4390,7 @@ SEARCH contact_profiles USING INTEGER PRIMARY KEY (rowid=?) Query: UPDATE contact_profiles - SET display_name = ?, full_name = ?, image = ?, updated_at = ? + SET display_name = ?, full_name = ?, short_descr = ?, image = ?, updated_at = ? WHERE user_id = ? AND contact_profile_id = ? Plan: @@ -4679,7 +4664,7 @@ SEARCH pending_group_messages USING COVERING INDEX idx_pending_group_messages_me Query: SELECT -- GroupInfo - g.group_id, g.local_display_name, gp.display_name, gp.full_name, g.local_alias, gp.description, gp.image, + g.group_id, g.local_display_name, gp.display_name, gp.full_name, gp.short_descr, g.local_alias, gp.description, gp.image, g.enable_ntfs, g.send_rcpts, g.favorite, gp.preferences, gp.member_admission, g.created_at, g.updated_at, g.chat_ts, g.user_member_profile_sent_at, g.conn_full_link_to_connect, g.conn_short_link_to_connect, g.conn_link_prepared_connection, g.conn_link_started_connection, g.welcome_shared_msg_id, g.request_shared_msg_id, @@ -4688,7 +4673,7 @@ Query: -- GroupMember - membership mu.group_member_id, mu.group_id, mu.member_id, mu.peer_chat_min_version, mu.peer_chat_max_version, mu.member_role, mu.member_category, mu.member_status, mu.show_messages, mu.member_restriction, mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, - pu.display_name, pu.full_name, pu.image, pu.contact_link, pu.local_alias, pu.preferences, + pu.display_name, pu.full_name, pu.short_descr, pu.image, pu.contact_link, pu.local_alias, pu.preferences, mu.created_at, mu.updated_at, mu.support_chat_ts, mu.support_chat_items_unread, mu.support_chat_items_member_attention, mu.support_chat_items_mentions, mu.support_chat_last_msg_from_member_ts FROM groups g @@ -4705,7 +4690,7 @@ SEARCH pu USING INTEGER PRIMARY KEY (rowid=?) Query: SELECT -- GroupInfo - g.group_id, g.local_display_name, gp.display_name, gp.full_name, g.local_alias, gp.description, gp.image, + g.group_id, g.local_display_name, gp.display_name, gp.full_name, gp.short_descr, g.local_alias, gp.description, gp.image, g.enable_ntfs, g.send_rcpts, g.favorite, gp.preferences, gp.member_admission, g.created_at, g.updated_at, g.chat_ts, g.user_member_profile_sent_at, g.conn_full_link_to_connect, g.conn_short_link_to_connect, g.conn_link_prepared_connection, g.conn_link_started_connection, g.welcome_shared_msg_id, g.request_shared_msg_id, @@ -4714,7 +4699,7 @@ Query: -- GroupMember - membership mu.group_member_id, mu.group_id, mu.member_id, mu.peer_chat_min_version, mu.peer_chat_max_version, mu.member_role, mu.member_category, mu.member_status, mu.show_messages, mu.member_restriction, mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, - pu.display_name, pu.full_name, pu.image, pu.contact_link, pu.local_alias, pu.preferences, + pu.display_name, pu.full_name, pu.short_descr, pu.image, pu.contact_link, pu.local_alias, pu.preferences, mu.created_at, mu.updated_at, mu.support_chat_ts, mu.support_chat_items_unread, mu.support_chat_items_member_attention, mu.support_chat_items_mentions, mu.support_chat_last_msg_from_member_ts FROM groups g @@ -4732,7 +4717,7 @@ Query: SELECT cr.contact_request_id, cr.local_display_name, cr.agent_invitation_id, cr.contact_id, cr.business_group_id, cr.user_contact_link_id, - cr.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, cr.xcontact_id, + cr.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, cr.xcontact_id, cr.pq_support, cr.welcome_shared_msg_id, cr.request_shared_msg_id, p.preferences, cr.created_at, cr.updated_at, cr.peer_chat_min_version, cr.peer_chat_max_version @@ -4747,7 +4732,7 @@ Query: SELECT cr.contact_request_id, cr.local_display_name, cr.agent_invitation_id, cr.contact_id, cr.business_group_id, cr.user_contact_link_id, - cr.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, cr.xcontact_id, + cr.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, cr.xcontact_id, cr.pq_support, cr.welcome_shared_msg_id, cr.request_shared_msg_id, p.preferences, cr.created_at, cr.updated_at, cr.peer_chat_min_version, cr.peer_chat_max_version @@ -4761,7 +4746,7 @@ SEARCH p USING INTEGER PRIMARY KEY (rowid=?) Query: SELECT m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, c.connection_id, c.agent_conn_id, c.conn_level, c.via_contact, c.via_user_contact_link, c.via_group_link, c.group_link_id, c.xcontact_id, c.custom_user_profile_id, @@ -4794,7 +4779,7 @@ SEARCH cc USING COVERING INDEX idx_connections_group_member (user_id=? AND group Query: SELECT m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, c.connection_id, c.agent_conn_id, c.conn_level, c.via_contact, c.via_user_contact_link, c.via_group_link, c.group_link_id, c.xcontact_id, c.custom_user_profile_id, @@ -4819,7 +4804,7 @@ SEARCH cc USING COVERING INDEX idx_connections_group_member (user_id=? AND group Query: SELECT m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, c.connection_id, c.agent_conn_id, c.conn_level, c.via_contact, c.via_user_contact_link, c.via_group_link, c.group_link_id, c.xcontact_id, c.custom_user_profile_id, @@ -4844,7 +4829,7 @@ SEARCH cc USING COVERING INDEX idx_connections_group_member (user_id=? AND group Query: SELECT m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, c.connection_id, c.agent_conn_id, c.conn_level, c.via_contact, c.via_user_contact_link, c.via_group_link, c.group_link_id, c.xcontact_id, c.custom_user_profile_id, @@ -4869,7 +4854,7 @@ SEARCH cc USING COVERING INDEX idx_connections_group_member (user_id=? AND group Query: SELECT m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, c.connection_id, c.agent_conn_id, c.conn_level, c.via_contact, c.via_user_contact_link, c.via_group_link, c.group_link_id, c.xcontact_id, c.custom_user_profile_id, @@ -4894,7 +4879,7 @@ SEARCH cc USING COVERING INDEX idx_connections_group_member (user_id=? AND group Query: SELECT m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, c.connection_id, c.agent_conn_id, c.conn_level, c.via_contact, c.via_user_contact_link, c.via_group_link, c.group_link_id, c.xcontact_id, c.custom_user_profile_id, @@ -4919,7 +4904,7 @@ SEARCH cc USING COVERING INDEX idx_connections_group_member (user_id=? AND group Query: SELECT m.group_member_id, m.group_id, m.member_id, m.peer_chat_min_version, m.peer_chat_max_version, m.member_role, m.member_category, m.member_status, m.show_messages, m.member_restriction, - m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.image, p.contact_link, p.local_alias, p.preferences, + m.invited_by, m.invited_by_group_member_id, m.local_display_name, m.contact_id, m.contact_profile_id, p.contact_profile_id, p.display_name, p.full_name, p.short_descr, p.image, p.contact_link, p.local_alias, p.preferences, m.created_at, m.updated_at, m.support_chat_ts, m.support_chat_items_unread, m.support_chat_items_member_attention, m.support_chat_items_mentions, m.support_chat_last_msg_from_member_ts, c.connection_id, c.agent_conn_id, c.conn_level, c.via_contact, c.via_user_contact_link, c.via_group_link, c.group_link_id, c.xcontact_id, c.custom_user_profile_id, @@ -5065,7 +5050,7 @@ Plan: SEARCH server_operators USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.image, ucp.contact_link, ucp.preferences, + SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.short_descr, ucp.image, ucp.contact_link, ucp.preferences, u.show_ntfs, u.send_rcpts_contacts, u.send_rcpts_small_groups, u.view_pwd_hash, u.view_pwd_salt, u.user_member_profile_updated_at, u.ui_themes FROM users u JOIN contacts uct ON uct.contact_id = u.contact_id @@ -5077,7 +5062,7 @@ SEARCH uct USING INTEGER PRIMARY KEY (rowid=?) SEARCH ucp USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.image, ucp.contact_link, ucp.preferences, + SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.short_descr, ucp.image, ucp.contact_link, ucp.preferences, u.show_ntfs, u.send_rcpts_contacts, u.send_rcpts_small_groups, u.view_pwd_hash, u.view_pwd_salt, u.user_member_profile_updated_at, u.ui_themes FROM users u JOIN contacts uct ON uct.contact_id = u.contact_id @@ -5090,7 +5075,7 @@ SEARCH uct USING INTEGER PRIMARY KEY (rowid=?) SEARCH ucp USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.image, ucp.contact_link, ucp.preferences, + SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.short_descr, ucp.image, ucp.contact_link, ucp.preferences, u.show_ntfs, u.send_rcpts_contacts, u.send_rcpts_small_groups, u.view_pwd_hash, u.view_pwd_salt, u.user_member_profile_updated_at, u.ui_themes FROM users u JOIN contacts uct ON uct.contact_id = u.contact_id @@ -5103,7 +5088,7 @@ SEARCH uct USING INTEGER PRIMARY KEY (rowid=?) SEARCH ucp USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.image, ucp.contact_link, ucp.preferences, + SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.short_descr, ucp.image, ucp.contact_link, ucp.preferences, u.show_ntfs, u.send_rcpts_contacts, u.send_rcpts_small_groups, u.view_pwd_hash, u.view_pwd_salt, u.user_member_profile_updated_at, u.ui_themes FROM users u JOIN contacts uct ON uct.contact_id = u.contact_id @@ -5117,7 +5102,7 @@ SEARCH uct USING INTEGER PRIMARY KEY (rowid=?) SEARCH ucp USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.image, ucp.contact_link, ucp.preferences, + SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.short_descr, ucp.image, ucp.contact_link, ucp.preferences, u.show_ntfs, u.send_rcpts_contacts, u.send_rcpts_small_groups, u.view_pwd_hash, u.view_pwd_salt, u.user_member_profile_updated_at, u.ui_themes FROM users u JOIN contacts uct ON uct.contact_id = u.contact_id @@ -5130,7 +5115,7 @@ SEARCH uct USING INTEGER PRIMARY KEY (rowid=?) SEARCH ucp USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.image, ucp.contact_link, ucp.preferences, + SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.short_descr, ucp.image, ucp.contact_link, ucp.preferences, u.show_ntfs, u.send_rcpts_contacts, u.send_rcpts_small_groups, u.view_pwd_hash, u.view_pwd_salt, u.user_member_profile_updated_at, u.ui_themes FROM users u JOIN contacts uct ON uct.contact_id = u.contact_id @@ -5143,7 +5128,7 @@ SEARCH uct USING INTEGER PRIMARY KEY (rowid=?) SEARCH ucp USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.image, ucp.contact_link, ucp.preferences, + SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.short_descr, ucp.image, ucp.contact_link, ucp.preferences, u.show_ntfs, u.send_rcpts_contacts, u.send_rcpts_small_groups, u.view_pwd_hash, u.view_pwd_salt, u.user_member_profile_updated_at, u.ui_themes FROM users u JOIN contacts uct ON uct.contact_id = u.contact_id @@ -5156,7 +5141,7 @@ SEARCH uct USING INTEGER PRIMARY KEY (rowid=?) SEARCH ucp USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.image, ucp.contact_link, ucp.preferences, + SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.short_descr, ucp.image, ucp.contact_link, ucp.preferences, u.show_ntfs, u.send_rcpts_contacts, u.send_rcpts_small_groups, u.view_pwd_hash, u.view_pwd_salt, u.user_member_profile_updated_at, u.ui_themes FROM users u JOIN contacts uct ON uct.contact_id = u.contact_id @@ -5169,7 +5154,7 @@ SEARCH uct USING INTEGER PRIMARY KEY (rowid=?) SEARCH ucp USING INTEGER PRIMARY KEY (rowid=?) Query: - SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.image, ucp.contact_link, ucp.preferences, + SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.short_descr, ucp.image, ucp.contact_link, ucp.preferences, u.show_ntfs, u.send_rcpts_contacts, u.send_rcpts_small_groups, u.view_pwd_hash, u.view_pwd_salt, u.user_member_profile_updated_at, u.ui_themes FROM users u JOIN contacts uct ON uct.contact_id = u.contact_id @@ -5633,15 +5618,15 @@ Plan: Query: INSERT INTO chat_item_messages (chat_item_id, message_id, created_at, updated_at) VALUES (?,?,?,?) Plan: -Query: INSERT INTO contact_profiles (display_name, full_name, image, contact_link, user_id, local_alias, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?) +Query: INSERT INTO contact_profiles (display_name, full_name, short_descr, image, contact_link, user_id, local_alias, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?,?) Plan: SEARCH contact_requests USING COVERING INDEX idx_contact_requests_contact_profile_id (contact_profile_id=?) -Query: INSERT INTO contact_profiles (display_name, full_name, image, contact_link, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?) +Query: INSERT INTO contact_profiles (display_name, full_name, short_descr, image, contact_link, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?) Plan: SEARCH contact_requests USING COVERING INDEX idx_contact_requests_contact_profile_id (contact_profile_id=?) -Query: INSERT INTO contact_profiles (display_name, full_name, image, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?) +Query: INSERT INTO contact_profiles (display_name, full_name, short_descr, image, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?) Plan: SEARCH contact_requests USING COVERING INDEX idx_contact_requests_contact_profile_id (contact_profile_id=?) @@ -5677,10 +5662,10 @@ Plan: Query: INSERT INTO files (user_id, group_id, file_name, file_size, chunk_size, file_inline, ci_file_status, protocol, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?,?) Plan: -Query: INSERT INTO group_profiles (display_name, full_name, description, image, user_id, preferences, member_admission, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?) +Query: INSERT INTO group_profiles (display_name, full_name, short_descr, description, image, user_id, preferences, member_admission, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?,?) Plan: -Query: INSERT INTO group_profiles (display_name, full_name, image, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?) +Query: INSERT INTO group_profiles (display_name, full_name, short_descr, image, user_id, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?) Plan: Query: INSERT INTO group_snd_item_statuses (chat_item_id, group_member_id, group_snd_item_status) VALUES (?,?,?) diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql b/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql index 913a99b6ec..8352b4f952 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_schema.sql @@ -18,7 +18,8 @@ CREATE TABLE contact_profiles( incognito INTEGER, local_alias TEXT DEFAULT '' CHECK(local_alias NOT NULL), preferences TEXT, - contact_link BLOB + contact_link BLOB, + short_descr TEXT ); CREATE TABLE users( user_id INTEGER PRIMARY KEY, @@ -114,7 +115,8 @@ CREATE TABLE group_profiles( user_id INTEGER DEFAULT NULL REFERENCES users ON DELETE CASCADE, preferences TEXT, description TEXT NULL, - member_admission TEXT + member_admission TEXT, + short_descr TEXT ); CREATE TABLE groups( group_id INTEGER PRIMARY KEY, -- local group ID diff --git a/src/Simplex/Chat/Store/Shared.hs b/src/Simplex/Chat/Store/Shared.hs index 90246f0710..96ae329b5b 100644 --- a/src/Simplex/Chat/Store/Shared.hs +++ b/src/Simplex/Chat/Store/Shared.hs @@ -293,14 +293,14 @@ createConnection_ db userId connType entityId acId connStatus connChatVersion pe ent ct = if connType == ct then entityId else Nothing createIncognitoProfile_ :: DB.Connection -> UserId -> UTCTime -> Profile -> IO Int64 -createIncognitoProfile_ db userId createdAt Profile {displayName, fullName, image} = do +createIncognitoProfile_ db userId createdAt Profile {displayName, fullName, shortDescr, image} = do DB.execute db [sql| - INSERT INTO contact_profiles (display_name, full_name, image, user_id, incognito, created_at, updated_at) - VALUES (?,?,?,?,?,?,?) + INSERT INTO contact_profiles (display_name, full_name, short_descr, image, user_id, incognito, created_at, updated_at) + VALUES (?,?,?,?,?,?,?,?) |] - (displayName, fullName, image, userId, Just (BI True), createdAt, createdAt) + (displayName, fullName, shortDescr, image, userId, Just (BI True), createdAt, createdAt) insertedRowId db updateConnSupportPQ :: DB.Connection -> Int64 -> PQSupport -> PQEncryption -> IO () @@ -387,12 +387,12 @@ createContact db User {userId} profile = do void $ createContact_ db userId profile Nothing "" Nothing currentTs createContact_ :: DB.Connection -> UserId -> Profile -> Maybe (ACreatedConnLink, Maybe SharedMsgId) -> LocalAlias -> Maybe Int64 -> UTCTime -> ExceptT StoreError IO (Text, ContactId, ProfileId) -createContact_ db userId Profile {displayName, fullName, image, contactLink, preferences} prepared localAlias viaGroup currentTs = +createContact_ db userId Profile {displayName, fullName, shortDescr, image, contactLink, preferences} prepared localAlias viaGroup currentTs = ExceptT . withLocalDisplayName db userId displayName $ \ldn -> do DB.execute db - "INSERT INTO contact_profiles (display_name, full_name, image, contact_link, user_id, local_alias, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?)" - (displayName, fullName, image, contactLink, userId, localAlias, preferences, currentTs, currentTs) + "INSERT INTO contact_profiles (display_name, full_name, short_descr, image, contact_link, user_id, local_alias, preferences, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?,?)" + (displayName, fullName, shortDescr, image, contactLink, userId, localAlias, preferences, currentTs, currentTs) profileId <- insertedRowId db DB.execute db @@ -436,13 +436,13 @@ deleteUnusedIncognitoProfileById_ db User {userId} profileId = type PreparedContactRow = (Maybe AConnectionRequestUri, Maybe AConnShortLink, Maybe SharedMsgId, Maybe SharedMsgId) -type ContactRow' = (ProfileId, ContactName, Maybe Int64, ContactName, Text, Maybe ImageData, Maybe ConnLinkContact, LocalAlias, BoolInt, ContactStatus) :. (Maybe MsgFilter, Maybe BoolInt, BoolInt, Maybe Preferences, Preferences, UTCTime, UTCTime, Maybe UTCTime) :. PreparedContactRow :. (Maybe Int64, Maybe GroupMemberId, BoolInt, Maybe UIThemeEntityOverrides, BoolInt, Maybe CustomData, Maybe Int64) +type ContactRow' = (ProfileId, ContactName, Maybe Int64, ContactName, Text, Maybe Text, Maybe ImageData, Maybe ConnLinkContact, LocalAlias, BoolInt, ContactStatus) :. (Maybe MsgFilter, Maybe BoolInt, BoolInt, Maybe Preferences, Preferences, UTCTime, UTCTime, Maybe UTCTime) :. PreparedContactRow :. (Maybe Int64, Maybe GroupMemberId, BoolInt, Maybe UIThemeEntityOverrides, BoolInt, Maybe CustomData, Maybe Int64) type ContactRow = Only ContactId :. ContactRow' toContact :: VersionRangeChat -> User -> [ChatTagId] -> ContactRow :. MaybeConnectionRow -> Contact -toContact vr user chatTags ((Only contactId :. (profileId, localDisplayName, viaGroup, displayName, fullName, image, contactLink, localAlias, BI contactUsed, contactStatus) :. (enableNtfs_, sendRcpts, BI favorite, preferences, userPreferences, createdAt, updatedAt, chatTs) :. preparedContactRow :. (contactRequestId, contactGroupMemberId, BI contactGrpInvSent, uiThemes, BI chatDeleted, customData, chatItemTTL)) :. connRow) = - let profile = LocalProfile {profileId, displayName, fullName, image, contactLink, preferences, localAlias} +toContact vr user chatTags ((Only contactId :. (profileId, localDisplayName, viaGroup, displayName, fullName, shortDescr, image, contactLink, localAlias, BI contactUsed, contactStatus) :. (enableNtfs_, sendRcpts, BI favorite, preferences, userPreferences, createdAt, updatedAt, chatTs) :. preparedContactRow :. (contactRequestId, contactGroupMemberId, BI contactGrpInvSent, uiThemes, BI chatDeleted, customData, chatItemTTL)) :. connRow) = + let profile = LocalProfile {profileId, displayName, fullName, shortDescr, image, contactLink, preferences, localAlias} activeConn = toMaybeConnection vr connRow chatSettings = ChatSettings {enableNtfs = fromMaybe MFAll enableNtfs_, sendRcpts = unBI <$> sendRcpts, favorite} incognito = maybe False connIncognito activeConn @@ -463,42 +463,39 @@ toACreatedConnLink_ (Just (ACR m cr)) csl = case csl of getProfileById :: DB.Connection -> UserId -> Int64 -> ExceptT StoreError IO LocalProfile getProfileById db userId profileId = - ExceptT . firstRow toProfile (SEProfileNotFound profileId) $ + ExceptT . firstRow rowToLocalProfile (SEProfileNotFound profileId) $ DB.query db [sql| - SELECT cp.display_name, cp.full_name, cp.image, cp.contact_link, cp.local_alias, cp.preferences -- , ct.user_preferences + SELECT cp.contact_profile_id, cp.display_name, cp.full_name, cp.short_descr, cp.image, cp.contact_link, cp.local_alias, cp.preferences -- , ct.user_preferences FROM contact_profiles cp WHERE cp.user_id = ? AND cp.contact_profile_id = ? |] (userId, profileId) - where - toProfile :: (ContactName, Text, Maybe ImageData, Maybe ConnLinkContact, LocalAlias, Maybe Preferences) -> LocalProfile - toProfile (displayName, fullName, image, contactLink, localAlias, preferences) = LocalProfile {profileId, displayName, fullName, image, contactLink, preferences, localAlias} -type ContactRequestRow = (Int64, ContactName, AgentInvId, Maybe ContactId, Maybe GroupId, Maybe Int64) :. (Int64, ContactName, Text, Maybe ImageData, Maybe ConnLinkContact) :. (Maybe XContactId, PQSupport, Maybe SharedMsgId, Maybe SharedMsgId, Maybe Preferences, UTCTime, UTCTime, VersionChat, VersionChat) +type ContactRequestRow = (Int64, ContactName, AgentInvId, Maybe ContactId, Maybe GroupId, Maybe Int64) :. (Int64, ContactName, Text, Maybe Text, Maybe ImageData, Maybe ConnLinkContact) :. (Maybe XContactId, PQSupport, Maybe SharedMsgId, Maybe SharedMsgId, Maybe Preferences, UTCTime, UTCTime, VersionChat, VersionChat) toContactRequest :: ContactRequestRow -> UserContactRequest -toContactRequest ((contactRequestId, localDisplayName, agentInvitationId, contactId_, businessGroupId_, userContactLinkId_) :. (profileId, displayName, fullName, image, contactLink) :. (xContactId, pqSupport, welcomeSharedMsgId, requestSharedMsgId, preferences, createdAt, updatedAt, minVer, maxVer)) = do - let profile = Profile {displayName, fullName, image, contactLink, preferences} +toContactRequest ((contactRequestId, localDisplayName, agentInvitationId, contactId_, businessGroupId_, userContactLinkId_) :. (profileId, displayName, fullName, shortDescr, image, contactLink) :. (xContactId, pqSupport, welcomeSharedMsgId, requestSharedMsgId, preferences, createdAt, updatedAt, minVer, maxVer)) = do + let profile = Profile {displayName, fullName, shortDescr, image, contactLink, preferences} cReqChatVRange = fromMaybe (versionToRange maxVer) $ safeVersionRange minVer maxVer in UserContactRequest {contactRequestId, agentInvitationId, contactId_, businessGroupId_, userContactLinkId_, cReqChatVRange, localDisplayName, profileId, profile, xContactId, pqSupport, welcomeSharedMsgId, requestSharedMsgId, createdAt, updatedAt} userQuery :: Query userQuery = [sql| - SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.image, ucp.contact_link, ucp.preferences, + SELECT u.user_id, u.agent_user_id, u.contact_id, ucp.contact_profile_id, u.active_user, u.active_order, u.local_display_name, ucp.full_name, ucp.short_descr, ucp.image, ucp.contact_link, ucp.preferences, u.show_ntfs, u.send_rcpts_contacts, u.send_rcpts_small_groups, u.view_pwd_hash, u.view_pwd_salt, u.user_member_profile_updated_at, u.ui_themes FROM users u JOIN contacts uct ON uct.contact_id = u.contact_id JOIN contact_profiles ucp ON ucp.contact_profile_id = uct.contact_profile_id |] -toUser :: (UserId, UserId, ContactId, ProfileId, BoolInt, Int64, ContactName, Text, Maybe ImageData, Maybe ConnLinkContact, Maybe Preferences) :. (BoolInt, BoolInt, BoolInt, Maybe B64UrlByteString, Maybe B64UrlByteString, Maybe UTCTime, Maybe UIThemeEntityOverrides) -> User -toUser ((userId, auId, userContactId, profileId, BI activeUser, activeOrder, displayName, fullName, image, contactLink, userPreferences) :. (BI showNtfs, BI sendRcptsContacts, BI sendRcptsSmallGroups, viewPwdHash_, viewPwdSalt_, userMemberProfileUpdatedAt, uiThemes)) = +toUser :: (UserId, UserId, ContactId, ProfileId, BoolInt, Int64, ContactName, Text, Maybe Text, Maybe ImageData, Maybe ConnLinkContact, Maybe Preferences) :. (BoolInt, BoolInt, BoolInt, Maybe B64UrlByteString, Maybe B64UrlByteString, Maybe UTCTime, Maybe UIThemeEntityOverrides) -> User +toUser ((userId, auId, userContactId, profileId, BI activeUser, activeOrder, displayName, fullName, shortDescr, image, contactLink, userPreferences) :. (BI showNtfs, BI sendRcptsContacts, BI sendRcptsSmallGroups, viewPwdHash_, viewPwdSalt_, userMemberProfileUpdatedAt, uiThemes)) = User {userId, agentUserId = AgentUserId auId, userContactId, localDisplayName = displayName, profile, activeUser, activeOrder, fullPreferences, showNtfs, sendRcptsContacts, sendRcptsSmallGroups, viewPwdHash, userMemberProfileUpdatedAt, uiThemes} where - profile = LocalProfile {profileId, displayName, fullName, image, contactLink, preferences = userPreferences, localAlias = ""} + profile = LocalProfile {profileId, displayName, fullName, shortDescr, image, contactLink, preferences = userPreferences, localAlias = ""} fullPreferences = mergePreferences Nothing userPreferences viewPwdHash = UserPwdHash <$> viewPwdHash_ <*> viewPwdSalt_ @@ -612,16 +609,18 @@ type PreparedGroupRow = (Maybe ConnReqContact, Maybe ShortLinkContact, BoolInt, type BusinessChatInfoRow = (Maybe BusinessChatType, Maybe MemberId, Maybe MemberId) -type GroupInfoRow = (Int64, GroupName, GroupName, Text, Text, Maybe Text, Maybe ImageData, Maybe MsgFilter, Maybe BoolInt, BoolInt, Maybe GroupPreferences, Maybe GroupMemberAdmission) :. (UTCTime, UTCTime, Maybe UTCTime, Maybe UTCTime) :. PreparedGroupRow :. BusinessChatInfoRow :. (Maybe UIThemeEntityOverrides, Maybe CustomData, Maybe Int64, Int) :. GroupMemberRow +type GroupInfoRow = (Int64, GroupName, GroupName, Text, Maybe Text, Text, Maybe Text, Maybe ImageData) :. (Maybe MsgFilter, Maybe BoolInt, BoolInt, Maybe GroupPreferences, Maybe GroupMemberAdmission) :. (UTCTime, UTCTime, Maybe UTCTime, Maybe UTCTime) :. PreparedGroupRow :. BusinessChatInfoRow :. (Maybe UIThemeEntityOverrides, Maybe CustomData, Maybe Int64, Int) :. GroupMemberRow -type GroupMemberRow = (Int64, Int64, MemberId, VersionChat, VersionChat, GroupMemberRole, GroupMemberCategory, GroupMemberStatus, BoolInt, Maybe MemberRestrictionStatus) :. (Maybe Int64, Maybe GroupMemberId, ContactName, Maybe ContactId, ProfileId, ProfileId, ContactName, Text, Maybe ImageData, Maybe ConnLinkContact, LocalAlias, Maybe Preferences) :. (UTCTime, UTCTime) :. (Maybe UTCTime, Int64, Int64, Int64, Maybe UTCTime) +type GroupMemberRow = (Int64, Int64, MemberId, VersionChat, VersionChat, GroupMemberRole, GroupMemberCategory, GroupMemberStatus, BoolInt, Maybe MemberRestrictionStatus) :. (Maybe Int64, Maybe GroupMemberId, ContactName, Maybe ContactId, ProfileId) :. ProfileRow :. (UTCTime, UTCTime) :. (Maybe UTCTime, Int64, Int64, Int64, Maybe UTCTime) + +type ProfileRow = (ProfileId, ContactName, Text, Maybe Text, Maybe ImageData, Maybe ConnLinkContact, LocalAlias, Maybe Preferences) toGroupInfo :: VersionRangeChat -> Int64 -> [ChatTagId] -> GroupInfoRow -> GroupInfo -toGroupInfo vr userContactId chatTags ((groupId, localDisplayName, displayName, fullName, localAlias, description, image, enableNtfs_, sendRcpts, BI favorite, groupPreferences, memberAdmission) :. (createdAt, updatedAt, chatTs, userMemberProfileSentAt) :. preparedGroupRow :. businessRow :. (uiThemes, customData, chatItemTTL, membersRequireAttention) :. userMemberRow) = +toGroupInfo vr userContactId chatTags ((groupId, localDisplayName, displayName, fullName, shortDescr, localAlias, description, image) :. (enableNtfs_, sendRcpts, BI favorite, groupPreferences, memberAdmission) :. (createdAt, updatedAt, chatTs, userMemberProfileSentAt) :. preparedGroupRow :. businessRow :. (uiThemes, customData, chatItemTTL, membersRequireAttention) :. userMemberRow) = let membership = (toGroupMember userContactId userMemberRow) {memberChatVRange = vr} chatSettings = ChatSettings {enableNtfs = fromMaybe MFAll enableNtfs_, sendRcpts = unBI <$> sendRcpts, favorite} fullGroupPreferences = mergeGroupPreferences groupPreferences - groupProfile = GroupProfile {displayName, fullName, description, image, groupPreferences, memberAdmission} + groupProfile = GroupProfile {displayName, fullName, shortDescr, description, image, groupPreferences, memberAdmission} businessChat = toBusinessChatInfo businessRow preparedGroup = toPreparedGroup preparedGroupRow in GroupInfo {groupId, localDisplayName, groupProfile, localAlias, businessChat, fullGroupPreferences, membership, chatSettings, createdAt, updatedAt, chatTs, userMemberProfileSentAt, preparedGroup, chatTags, chatItemTTL, uiThemes, customData, membersRequireAttention} @@ -633,8 +632,8 @@ toPreparedGroup = \case _ -> Nothing toGroupMember :: Int64 -> GroupMemberRow -> GroupMember -toGroupMember userContactId ((groupMemberId, groupId, memberId, minVer, maxVer, memberRole, memberCategory, memberStatus, BI showMessages, memberRestriction_) :. (invitedById, invitedByGroupMemberId, localDisplayName, memberContactId, memberContactProfileId, profileId, displayName, fullName, image, contactLink, localAlias, preferences) :. (createdAt, updatedAt) :. (supportChatTs_, supportChatUnread, supportChatMemberAttention, supportChatMentions, supportChatLastMsgFromMemberTs)) = - let memberProfile = LocalProfile {profileId, displayName, fullName, image, contactLink, preferences, localAlias} +toGroupMember userContactId ((groupMemberId, groupId, memberId, minVer, maxVer, memberRole, memberCategory, memberStatus, BI showMessages, memberRestriction_) :. (invitedById, invitedByGroupMemberId, localDisplayName, memberContactId, memberContactProfileId) :. profileRow :. (createdAt, updatedAt) :. (supportChatTs_, supportChatUnread, supportChatMemberAttention, supportChatMentions, supportChatLastMsgFromMemberTs)) = + let memberProfile = rowToLocalProfile profileRow memberSettings = GroupMemberSettings {showMessages} blockedByAdmin = maybe False mrsBlocked memberRestriction_ invitedBy = toInvitedBy userContactId invitedById @@ -652,6 +651,10 @@ toGroupMember userContactId ((groupMemberId, groupId, memberId, minVer, maxVer, _ -> Nothing in GroupMember {..} +rowToLocalProfile :: ProfileRow -> LocalProfile +rowToLocalProfile (profileId, displayName, fullName, shortDescr, image, contactLink, localAlias, preferences) = + LocalProfile {profileId, displayName, fullName, shortDescr, image, contactLink, localAlias, preferences} + toBusinessChatInfo :: BusinessChatInfoRow -> Maybe BusinessChatInfo toBusinessChatInfo (Just chatType, Just businessId, Just customerId) = Just BusinessChatInfo {chatType, businessId, customerId} toBusinessChatInfo _ = Nothing @@ -661,7 +664,7 @@ groupInfoQuery = [sql| SELECT -- GroupInfo - g.group_id, g.local_display_name, gp.display_name, gp.full_name, g.local_alias, gp.description, gp.image, + g.group_id, g.local_display_name, gp.display_name, gp.full_name, gp.short_descr, g.local_alias, gp.description, gp.image, g.enable_ntfs, g.send_rcpts, g.favorite, gp.preferences, gp.member_admission, g.created_at, g.updated_at, g.chat_ts, g.user_member_profile_sent_at, g.conn_full_link_to_connect, g.conn_short_link_to_connect, g.conn_link_prepared_connection, g.conn_link_started_connection, g.welcome_shared_msg_id, g.request_shared_msg_id, @@ -670,7 +673,7 @@ groupInfoQuery = -- GroupMember - membership mu.group_member_id, mu.group_id, mu.member_id, mu.peer_chat_min_version, mu.peer_chat_max_version, mu.member_role, mu.member_category, mu.member_status, mu.show_messages, mu.member_restriction, mu.invited_by, mu.invited_by_group_member_id, mu.local_display_name, mu.contact_id, mu.contact_profile_id, pu.contact_profile_id, - pu.display_name, pu.full_name, pu.image, pu.contact_link, pu.local_alias, pu.preferences, + pu.display_name, pu.full_name, pu.short_descr, pu.image, pu.contact_link, pu.local_alias, pu.preferences, mu.created_at, mu.updated_at, mu.support_chat_ts, mu.support_chat_items_unread, mu.support_chat_items_member_attention, mu.support_chat_items_mentions, mu.support_chat_last_msg_from_member_ts FROM groups g diff --git a/src/Simplex/Chat/Types.hs b/src/Simplex/Chat/Types.hs index 739f5943b9..5cedf0368e 100644 --- a/src/Simplex/Chat/Types.hs +++ b/src/Simplex/Chat/Types.hs @@ -422,9 +422,9 @@ type MemberName = Text type GroupName = Text -optionalFullName :: ContactName -> Text -> Text -optionalFullName displayName fullName - | T.null fullName || displayName == fullName = "" +optionalFullName :: ContactName -> Text -> Maybe Text -> Text +optionalFullName displayName fullName shortDescr + | T.null fullName || displayName == fullName = maybe "" (\sd -> " (" <> sd <> ")") shortDescr | otherwise = " (" <> fullName <> ")" data ShortGroup = ShortGroup @@ -620,6 +620,7 @@ contactUserPreferences user userPreferences contactPreferences connectedIncognit data Profile = Profile { displayName :: ContactName, fullName :: Text, + shortDescr :: Maybe Text, -- short description limited to 160 characters image :: Maybe ImageData, contactLink :: Maybe ConnLinkContact, preferences :: Maybe Preferences @@ -632,7 +633,7 @@ data Profile = Profile profileFromName :: ContactName -> Profile profileFromName displayName = - Profile {displayName, fullName = "", image = Nothing, contactLink = Nothing, preferences = Nothing} + Profile {displayName, fullName = "", shortDescr = Nothing, image = Nothing, contactLink = Nothing, preferences = Nothing} -- check if profiles match ignoring preferences profilesMatch :: LocalProfile -> LocalProfile -> Bool @@ -642,8 +643,8 @@ profilesMatch n1 == n2 && fn1 == fn2 && i1 == i2 redactedMemberProfile :: Profile -> Profile -redactedMemberProfile Profile {displayName, fullName, image} = - Profile {displayName, fullName, image, contactLink = Nothing, preferences = Nothing} +redactedMemberProfile Profile {displayName, fullName, shortDescr, image} = + Profile {displayName, fullName, shortDescr, image, contactLink = Nothing, preferences = Nothing} data IncognitoProfile = NewIncognito Profile | ExistingIncognito LocalProfile @@ -669,6 +670,7 @@ data LocalProfile = LocalProfile { profileId :: ProfileId, displayName :: ContactName, fullName :: Text, + shortDescr :: Maybe Text, image :: Maybe ImageData, contactLink :: Maybe ConnLinkContact, preferences :: Maybe Preferences, @@ -680,17 +682,18 @@ localProfileId :: LocalProfile -> ProfileId localProfileId LocalProfile {profileId} = profileId toLocalProfile :: ProfileId -> Profile -> LocalAlias -> LocalProfile -toLocalProfile profileId Profile {displayName, fullName, image, contactLink, preferences} localAlias = - LocalProfile {profileId, displayName, fullName, image, contactLink, preferences, localAlias} +toLocalProfile profileId Profile {displayName, fullName, shortDescr, image, contactLink, preferences} localAlias = + LocalProfile {profileId, displayName, fullName, shortDescr, image, contactLink, preferences, localAlias} fromLocalProfile :: LocalProfile -> Profile -fromLocalProfile LocalProfile {displayName, fullName, image, contactLink, preferences} = - Profile {displayName, fullName, image, contactLink, preferences} +fromLocalProfile LocalProfile {displayName, fullName, shortDescr, image, contactLink, preferences} = + Profile {displayName, fullName, shortDescr, image, contactLink, preferences} data GroupProfile = GroupProfile { displayName :: GroupName, fullName :: Text, - description :: Maybe Text, + shortDescr :: Maybe Text, -- short description limited to 160 characters + description :: Maybe Text, -- this has been repurposed as welcome message image :: Maybe ImageData, groupPreferences :: Maybe GroupPreferences, memberAdmission :: Maybe GroupMemberAdmission diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs index fe28775c50..eb6db90d21 100644 --- a/src/Simplex/Chat/View.hs +++ b/src/Simplex/Chat/View.hs @@ -606,8 +606,8 @@ viewUsersList us = in if null ss then ["no users"] else ss where ldn (UserInfo User {localDisplayName = n} _) = T.toLower n - userInfo (UserInfo User {localDisplayName = n, profile = LocalProfile {fullName}, activeUser, showNtfs, viewPwdHash} count) - | activeUser || isNothing viewPwdHash = Just $ ttyFullName n fullName <> infoStr + userInfo (UserInfo User {localDisplayName = n, profile = LocalProfile {fullName, shortDescr}, activeUser, showNtfs, viewPwdHash} count) + | activeUser || isNothing viewPwdHash = Just $ ttyFullName n fullName shortDescr <> infoStr | otherwise = Nothing where infoStr = if null info then "" else " (" <> mconcat (intersperse ", " info) <> ")" @@ -1158,8 +1158,8 @@ viewAcceptingBusinessRequest :: GroupInfo -> [StyledString] viewAcceptingBusinessRequest g = [ttyFullGroup g <> ": accepting business address request..."] viewReceivedContactRequest :: ContactName -> Profile -> [StyledString] -viewReceivedContactRequest c Profile {fullName} = - [ ttyFullName c fullName <> " wants to connect to you!", +viewReceivedContactRequest c Profile {fullName, shortDescr} = + [ ttyFullName c fullName shortDescr <> " wants to connect to you!", "to accept: " <> highlight ("/ac " <> viewName c), "to reject: " <> highlight ("/rc " <> viewName c) <> " (the sender will NOT be notified)" ] @@ -1380,9 +1380,9 @@ viewSentGroupInvitation g c = case contactConn c of Nothing -> [] groupInvitation' :: GroupInfo -> StyledString -groupInvitation' g@GroupInfo {localDisplayName = ldn, groupProfile = GroupProfile {fullName}} = +groupInvitation' g@GroupInfo {localDisplayName = ldn, groupProfile = GroupProfile {fullName, shortDescr}} = highlight ("#" <> viewName ldn) - <> optFullName ldn fullName + <> optFullName ldn fullName shortDescr <> " - you are invited (" <> highlight ("/j " <> viewName ldn) <> joinText @@ -1415,9 +1415,9 @@ viewContactAndMemberAssociated ct g m ct' = ] viewUserProfile :: Profile -> [StyledString] -viewUserProfile Profile {displayName, fullName} = - [ "user profile: " <> ttyFullName displayName fullName, - "use " <> highlight' "/p " <> " to change it", +viewUserProfile Profile {displayName, fullName, shortDescr} = + [ "user profile: " <> ttyFullName displayName fullName shortDescr, + "use " <> highlight' "/p []" <> " to change it", "(the updated profile will be sent to all your contacts)" ] @@ -1703,16 +1703,17 @@ viewSwitchPhase = \case SPCompleted -> "changed address" viewUserProfileUpdated :: Profile -> Profile -> UserProfileUpdateSummary -> [StyledString] -viewUserProfileUpdated Profile {displayName = n, fullName, image, contactLink, preferences} Profile {displayName = n', fullName = fullName', image = image', contactLink = contactLink', preferences = prefs'} summary = +viewUserProfileUpdated Profile {displayName = n, fullName, shortDescr, image, contactLink, preferences} Profile {displayName = n', fullName = fullName', shortDescr = shortDescr', image = image', contactLink = contactLink', preferences = prefs'} summary = profileUpdated <> viewPrefsUpdated preferences prefs' where UserProfileUpdateSummary {updateSuccesses = s, updateFailures = f} = summary profileUpdated - | n == n' && fullName == fullName' && image == image' && contactLink == contactLink' = [] - | n == n' && fullName == fullName' && image == image' = [if isNothing contactLink' then "contact address removed" else "new contact address set"] - | n == n' && fullName == fullName' = [if isNothing image' then "profile image removed" else "profile image updated"] + | n == n' && fullName == fullName' && shortDescr == shortDescr' && image == image' && contactLink == contactLink' = [] + | n == n' && fullName == fullName' && shortDescr == shortDescr' && image == image' = [if isNothing contactLink' then "contact address removed" else "new contact address set"] + | n == n' && fullName == fullName' && shortDescr == shortDescr' = [if isNothing image' then "profile image removed" else "profile image updated"] + | n == n' && fullName == fullName' = ["user bio " <> (if maybe True T.null shortDescr' then "removed" else "changed to " <> maybe "" plain shortDescr') <> notified] | n == n' = ["user full name " <> (if T.null fullName' || fullName' == n' then "removed" else "changed to " <> plain fullName') <> notified] - | otherwise = ["user profile is changed to " <> ttyFullName n' fullName' <> notified] + | otherwise = ["user profile is changed to " <> ttyFullName n' fullName' shortDescr' <> notified] notified = " (your " <> sShow s <> " contacts are notified" <> failures <> ")" failures | f > 0 = ", " <> sShow f <> " failures" @@ -1770,8 +1771,8 @@ countactUserPrefText cup = case cup of viewGroupUpdated :: GroupInfo -> GroupInfo -> Maybe GroupMember -> [StyledString] viewGroupUpdated - GroupInfo {localDisplayName = n, groupProfile = GroupProfile {fullName, description, image, groupPreferences = gps, memberAdmission = ma}} - g'@GroupInfo {localDisplayName = n', groupProfile = GroupProfile {fullName = fullName', description = description', image = image', groupPreferences = gps', memberAdmission = ma'}} + GroupInfo {localDisplayName = n, groupProfile = GroupProfile {fullName, shortDescr, description, image, groupPreferences = gps, memberAdmission = ma}} + g'@GroupInfo {localDisplayName = n', groupProfile = GroupProfile {fullName = fullName', shortDescr = shortDescr', description = description', image = image', groupPreferences = gps', memberAdmission = ma'}} m = do let update = groupProfileUpdated <> groupPrefsUpdated <> memberAdmissionUpdated if null update @@ -1782,8 +1783,9 @@ viewGroupUpdated groupProfileUpdated = ["changed to " <> ttyFullGroup g' | n /= n'] <> ["full name " <> if T.null fullName' || fullName' == n' then "removed" else "changed to: " <> plain fullName' | n == n' && fullName /= fullName'] + <> ["description " <> if maybe True T.null shortDescr' then "removed" else "changed to: " <> maybe "" plain shortDescr' | n == n' && fullName == fullName' && shortDescr /= shortDescr'] <> ["profile image " <> maybe "removed" (const "updated") image' | image /= image'] - <> (if description == description' then [] else maybe ["description removed"] ((bold' "description changed to:" :) . map plain . T.lines) description') + <> (if description == description' then [] else maybe ["welcome message removed"] ((bold' "welcome message changed to:" :) . map plain . T.lines) description') groupPrefsUpdated | null prefs = [] | otherwise = bold' "updated group preferences:" : prefs @@ -1799,10 +1801,11 @@ viewGroupUpdated | otherwise = ["changed member admission rules"] viewGroupProfile :: GroupInfo -> [StyledString] -viewGroupProfile g@GroupInfo {groupProfile = GroupProfile {description, image, groupPreferences = gps}} = +viewGroupProfile g@GroupInfo {groupProfile = GroupProfile {shortDescr, description, image, groupPreferences = gps}} = [ttyFullGroup g] + <> maybe [] (\sd -> ["description: " <> plain sd]) shortDescr <> maybe [] (const ["has profile image"]) image - <> maybe [] ((bold' "description:" :) . map plain . T.lines) description + <> maybe [] ((bold' "welcome message:" :) . map plain . T.lines) description <> (bold' "group preferences:" : map viewPref allGroupFeatures) where viewPref (AGF f) = plain $ groupPreferenceText (pref gps) @@ -1963,16 +1966,20 @@ viewConnectionPlan ChatConfig {logLevel, testView} _connLink = \case viewContactUpdated :: Contact -> Contact -> [StyledString] viewContactUpdated - Contact {localDisplayName = n, profile = LocalProfile {fullName, contactLink}} - Contact {localDisplayName = n', profile = LocalProfile {fullName = fullName', contactLink = contactLink'}} - | n == n' && fullName == fullName' && contactLink == contactLink' = [] - | n == n' && fullName == fullName' = + Contact {localDisplayName = n, profile = LocalProfile {fullName, shortDescr, contactLink}} + Contact {localDisplayName = n', profile = LocalProfile {fullName = fullName', shortDescr = shortDescr', contactLink = contactLink'}} + | n == n' && fullName == fullName' && shortDescr == shortDescr' && contactLink == contactLink' = [] + | n == n' && fullName == fullName' && shortDescr == shortDescr' = if isNothing contactLink' then [ttyContact n <> " removed contact address"] else [ttyContact n <> " set new contact address, use " <> highlight ("/info " <> n) <> " to view"] + | n == n' && fullName == fullName' = + if maybe True T.null shortDescr' + then ["contact " <> ttyContact n <> " removed bio"] + else ["contact " <> ttyContact n <> " updated bio: " <> maybe "" plain shortDescr'] | n == n' = ["contact " <> ttyContact n <> fullNameUpdate] | otherwise = - [ "contact " <> ttyContact n <> " changed to " <> ttyFullName n' fullName', + [ "contact " <> ttyContact n <> " changed to " <> ttyFullName n' fullName' shortDescr', "use " <> ttyToContact n' <> highlight' "" <> " to send messages" ] where @@ -2566,18 +2573,18 @@ ttyContact' :: Contact -> StyledString ttyContact' Contact {localDisplayName = c} = ttyContact c ttyFullContact :: Contact -> StyledString -ttyFullContact Contact {localDisplayName, profile = LocalProfile {fullName}} = - ttyFullName localDisplayName fullName +ttyFullContact Contact {localDisplayName, profile = LocalProfile {fullName, shortDescr}} = + ttyFullName localDisplayName fullName shortDescr ttyMember :: GroupMember -> StyledString ttyMember GroupMember {localDisplayName} = ttyContact localDisplayName ttyFullMember :: GroupMember -> StyledString -ttyFullMember GroupMember {localDisplayName, memberProfile = LocalProfile {fullName}} = - ttyFullName localDisplayName fullName +ttyFullMember GroupMember {localDisplayName, memberProfile = LocalProfile {fullName, shortDescr}} = + ttyFullName localDisplayName fullName shortDescr -ttyFullName :: ContactName -> Text -> StyledString -ttyFullName c fullName = ttyContact c <> optFullName c fullName +ttyFullName :: ContactName -> Text -> Maybe Text -> StyledString +ttyFullName c fullName shortDescr = ttyContact c <> optFullName c fullName shortDescr ttyToContact :: ContactName -> StyledString ttyToContact c = ttyTo $ "@" <> viewName c <> " " @@ -2626,8 +2633,8 @@ ttyGroups [g] = ttyGroup g ttyGroups (g : gs) = ttyGroup g <> ", " <> ttyGroups gs ttyFullGroup :: GroupInfo -> StyledString -ttyFullGroup GroupInfo {localDisplayName = g, groupProfile = GroupProfile {fullName}} = - ttyGroup g <> optFullName g fullName +ttyFullGroup GroupInfo {localDisplayName = g, groupProfile = GroupProfile {fullName, shortDescr}} = + ttyGroup g <> optFullName g fullName shortDescr ttyFromGroup :: GroupInfo -> Maybe GroupChatScopeInfo -> GroupMember -> StyledString ttyFromGroup g scopeInfo m = ttyFromGroupAttention g scopeInfo m False @@ -2672,8 +2679,8 @@ groupScopeInfoStr = \case ttyFilePath :: FilePath -> StyledString ttyFilePath = plain -optFullName :: ContactName -> Text -> StyledString -optFullName localDisplayName fullName = plain $ optionalFullName localDisplayName fullName +optFullName :: ContactName -> Text -> Maybe Text -> StyledString +optFullName localDisplayName fullName shortDescr = plain $ optionalFullName localDisplayName fullName shortDescr ctIncognito :: Contact -> StyledString ctIncognito ct = if contactConnIncognito ct then incognitoPrefix else "" diff --git a/tests/Bots/BroadcastTests.hs b/tests/Bots/BroadcastTests.hs index 71142c8b60..500e30183b 100644 --- a/tests/Bots/BroadcastTests.hs +++ b/tests/Bots/BroadcastTests.hs @@ -33,7 +33,7 @@ withBroadcastBot opts test = bot = simplexChatCore testCfg (mkChatOpts opts) $ broadcastBot opts broadcastBotProfile :: Profile -broadcastBotProfile = Profile {displayName = "broadcast_bot", fullName = "Broadcast Bot", image = Nothing, contactLink = Nothing, preferences = Nothing} +broadcastBotProfile = Profile {displayName = "broadcast_bot", fullName = "Broadcast Bot", shortDescr = Nothing, image = Nothing, contactLink = Nothing, preferences = Nothing} mkBotOpts :: TestParams -> [KnownContact] -> BroadcastBotOpts mkBotOpts ps publishers = diff --git a/tests/Bots/DirectoryTests.hs b/tests/Bots/DirectoryTests.hs index c8b3d33916..351943925f 100644 --- a/tests/Bots/DirectoryTests.hs +++ b/tests/Bots/DirectoryTests.hs @@ -75,7 +75,7 @@ directoryServiceTests = do it "should accept some incorrect spellings" testCaptcha directoryProfile :: Profile -directoryProfile = Profile {displayName = "SimpleX-Directory", fullName = "", image = Nothing, contactLink = Nothing, preferences = Nothing} +directoryProfile = Profile {displayName = "SimpleX-Directory", fullName = "", shortDescr = Nothing, image = Nothing, contactLink = Nothing, preferences = Nothing} mkDirectoryOpts :: TestParams -> [KnownContact] -> Maybe KnownGroup -> DirectoryOpts mkDirectoryOpts TestParams {tmpPath = ps} superUsers ownersGroup = @@ -219,7 +219,7 @@ testDirectoryService ps = u <## "2 members" updateGroupProfile u welcome = do u ##> ("/set welcome #PSA " <> welcome) - u <## "description changed to:" + u <## "welcome message changed to:" u <## welcome approvalRequested su welcome grId = do su <# "SimpleX-Directory> bob submitted the group ID 1:" @@ -738,11 +738,11 @@ testRegOwnerChangedProfile ps = registerGroup superUser bob "privacy" "Privacy" addCathAsOwner bob cath bob ##> "/gp privacy privacy Privacy and Security" - bob <## "full name changed to: Privacy and Security" + bob <## "description changed to: Privacy and Security" bob <# "SimpleX-Directory> The group ID 1 (privacy) is updated!" bob <## "It is hidden from the directory until approved." cath <## "bob updated group #privacy:" - cath <## "full name changed to: Privacy and Security" + cath <## "description changed to: Privacy and Security" cath `connectVia` dsLink cath <## "contact and member are merged: SimpleX-Directory_1, #privacy SimpleX-Directory" cath <## "use @SimpleX-Directory to send messages" @@ -763,9 +763,9 @@ testAnotherOwnerChangedProfile ps = cath <## "contact and member are merged: SimpleX-Directory_1, #privacy SimpleX-Directory" cath <## "use @SimpleX-Directory to send messages" cath ##> "/gp privacy privacy Privacy and Security" - cath <## "full name changed to: Privacy and Security" + cath <## "description changed to: Privacy and Security" bob <## "cath updated group #privacy:" - bob <## "full name changed to: Privacy and Security" + bob <## "description changed to: Privacy and Security" bob <# "SimpleX-Directory> The group ID 1 (privacy) is updated by cath!" bob <## "It is hidden from the directory until approved." groupNotFound cath "privacy" @@ -784,9 +784,9 @@ testNotConnectedOwnerChangedProfile ps = registerGroup superUser bob "privacy" "Privacy" addCathAsOwner bob cath cath ##> "/gp privacy privacy Privacy and Security" - cath <## "full name changed to: Privacy and Security" + cath <## "description changed to: Privacy and Security" bob <## "cath updated group #privacy:" - bob <## "full name changed to: Privacy and Security" + bob <## "description changed to: Privacy and Security" bob <# "SimpleX-Directory> The group ID 1 (privacy) is updated by cath!" bob <## "It is hidden from the directory until approved." groupNotFound dan "privacy" @@ -806,13 +806,13 @@ testRegOwnerRemovedLink ps = bob <## "Welcome message:" welcomeWithLink <- getTermLine bob bob ##> "/set welcome #privacy Welcome!" - bob <## "description changed to:" + bob <## "welcome message changed to:" bob <## "Welcome!" bob <# "SimpleX-Directory> The group link for ID 1 (privacy) is removed from the welcome message." bob <## "" bob <## "The group is hidden from the directory until the group link is added and the group is re-approved." cath <## "bob updated group #privacy:" - cath <## "description changed to:" + cath <## "welcome message changed to:" cath <## "Welcome!" superUser <# "SimpleX-Directory> The group link is removed from ID 1 (privacy), de-listed." cath `connectVia` dsLink @@ -821,12 +821,12 @@ testRegOwnerRemovedLink ps = groupNotFound cath "privacy" let withChangedLink = T.unpack $ T.replace "contact#/?v=2-7&" "contact#/?v=3-7&" $ T.pack welcomeWithLink bob ##> ("/set welcome #privacy " <> withChangedLink) - bob <## "description changed to:" + bob <## "welcome message changed to:" bob <## withChangedLink bob <# "SimpleX-Directory> Thank you! The group link for ID 1 (privacy) is added to the welcome message." bob <## "You will be notified once the group is added to the directory - it may take up to 48 hours." cath <## "bob updated group #privacy:" - cath <## "description changed to:" + cath <## "welcome message changed to:" cath <## withChangedLink reapproveGroup 3 superUser bob groupFoundN 3 cath "privacy" @@ -846,10 +846,10 @@ testAnotherOwnerRemovedLink ps = bob <## "Welcome message:" welcomeWithLink <- getTermLine bob cath ##> "/set welcome #privacy Welcome!" - cath <## "description changed to:" + cath <## "welcome message changed to:" cath <## "Welcome!" bob <## "cath updated group #privacy:" - bob <## "description changed to:" + bob <## "welcome message changed to:" bob <## "Welcome!" bob <# "SimpleX-Directory> The group link for ID 1 (privacy) is removed from the welcome message by cath." bob <## "" @@ -857,10 +857,10 @@ testAnotherOwnerRemovedLink ps = superUser <# "SimpleX-Directory> The group link is removed from ID 1 (privacy), de-listed." groupNotFound cath "privacy" cath ##> ("/set welcome #privacy " <> welcomeWithLink) - cath <## "description changed to:" + cath <## "welcome message changed to:" cath <## welcomeWithLink bob <## "cath updated group #privacy:" - bob <## "description changed to:" + bob <## "welcome message changed to:" bob <## welcomeWithLink bob <# "SimpleX-Directory> Thank you! The group link for ID 1 (privacy) is added to the welcome message by cath." bob <## "You will be notified once the group is added to the directory - it may take up to 48 hours." @@ -881,10 +881,10 @@ testNotConnectedOwnerRemovedLink ps = bob <## "Welcome message:" welcomeWithLink <- getTermLine bob cath ##> "/set welcome #privacy Welcome!" - cath <## "description changed to:" + cath <## "welcome message changed to:" cath <## "Welcome!" bob <## "cath updated group #privacy:" - bob <## "description changed to:" + bob <## "welcome message changed to:" bob <## "Welcome!" bob <# "SimpleX-Directory> The group link for ID 1 (privacy) is removed from the welcome message by cath." bob <## "" @@ -892,21 +892,21 @@ testNotConnectedOwnerRemovedLink ps = superUser <# "SimpleX-Directory> The group link is removed from ID 1 (privacy), de-listed." groupNotFound dan "privacy" cath ##> ("/set welcome #privacy " <> welcomeWithLink) - cath <## "description changed to:" + cath <## "welcome message changed to:" cath <## welcomeWithLink bob <## "cath updated group #privacy:" - bob <## "description changed to:" + bob <## "welcome message changed to:" bob <## welcomeWithLink -- bob <# "SimpleX-Directory> The group link is added by another group member, your registration will not be processed." -- bob <## "" -- bob <## "Please update the group profile yourself." -- bob ##> ("/set welcome #privacy " <> welcomeWithLink <> " - welcome!") - -- bob <## "description changed to:" + -- bob <## "welcome message changed to:" -- bob <## (welcomeWithLink <> " - welcome!") bob <# "SimpleX-Directory> Thank you! The group link for ID 1 (privacy) is added to the welcome message by cath." bob <## "You will be notified once the group is added to the directory - it may take up to 48 hours." -- cath <## "bob updated group #privacy:" - -- cath <## "description changed to:" + -- cath <## "welcome message changed to:" -- cath <## (welcomeWithLink <> " - welcome!") reapproveGroup 3 superUser bob groupFoundN 3 dan "privacy" @@ -980,7 +980,7 @@ testDuplicateProhibitWhenUpdated ps = completeRegistration superUser bob "privacy" "Privacy" welcomeWithLink 1 groupFound cath "privacy" cath ##> ("/set welcome privacy " <> welcomeWithLink') - cath <## "description changed to:" + cath <## "welcome message changed to:" cath <## welcomeWithLink' cath <# "SimpleX-Directory> The group privacy (Privacy) is already listed in the directory, please choose another name." cath ##> "/gp privacy security Security" @@ -1352,7 +1352,7 @@ completeRegistrationId su u n fn welcomeWithLink gId ugId = do updateProfileWithLink :: TestCC -> String -> String -> Int -> IO () updateProfileWithLink u n welcomeWithLink ugId = do u ##> ("/set welcome " <> viewName n <> " " <> welcomeWithLink) - u <## "description changed to:" + u <## "welcome message changed to:" u <## welcomeWithLink u <# ("SimpleX-Directory> Thank you! The group link for ID " <> show ugId <> " (" <> n <> ") is added to the welcome message.") u <## "You will be notified once the group is added to the directory - it may take up to 48 hours." diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index 9d69b4fc27..56dd863b2d 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -353,7 +353,7 @@ testGroupShared alice bob cath checkMessages = do alice #$> ("/_get chat #1 around=" <> msgItem1 <> " count=2", chat, [(0, "connected"), (0, "connected"), (1, "hello"), (0, "hi there"), (0, "hey team")]) alice #$> ("/_get chat #1 count=100 search=team", chat, [(0, "hey team")]) bob @@@ [("#team", "hey team"), ("@alice", "received invitation to join group team as admin")] - bob #$> ("/_get chat #1 count=100", chat, groupFeatures <> [(0, "connected"), (0, "added cath (Catherine)"), (0, "connected"), (0, "hello"), (1, "hi there"), (0, "hey team")]) + bob #$> ("/_get chat #1 count=100", chat, groupFeatures <> [(0, "connected"), (0, "added cath"), (0, "connected"), (0, "hello"), (1, "hi there"), (0, "hey team")]) cath @@@ [("#team", "hey team"), ("@alice", "received invitation to join group team as admin")] cath #$> ("/_get chat #1 count=100", chat, groupFeatures <> [(0, "connected"), (0, "connected"), (0, "hello"), (0, "hi there"), (1, "hey team")]) alice #$> ("/_read chat #1", id, "ok") @@ -586,7 +586,7 @@ testGroup2 = <> [ "#club bob> connected", "#club cath> connected", - "#club bob> added dan (Daniel)", + "#club bob> added dan", "#club dan> connected", "#club hello", "#club bob> hi there", @@ -1466,6 +1466,26 @@ testUpdateGroupProfile = concurrently_ (alice <# "#my_team bob> hi") (cath <# "#my_team bob> hi") + alice ##> "/gp my_team my_team My team" + alice <## "description changed to: My team" + concurrentlyN_ + [ do + bob <## "alice updated group #my_team:" + bob <## "description changed to: My team", + do + cath <## "alice updated group #my_team:" + cath <## "description changed to: My team" + ] + alice ##> "/gp my_team my_team My team updated" + alice <## "description changed to: My team updated" + concurrentlyN_ + [ do + bob <## "alice updated group #my_team:" + bob <## "description changed to: My team updated", + do + cath <## "alice updated group #my_team:" + cath <## "description changed to: My team updated" + ] testUpdateMemberRole :: HasCallStack => TestParams -> IO () testUpdateMemberRole = @@ -1525,15 +1545,15 @@ testGroupDescription = testChat4 aliceProfile bobProfile cathProfile danProfile alice ##> "/group_profile team" alice <## "#team" groupInfo' alice - alice ##> "/group_descr team Welcome to the team!" - alice <## "description changed to:" + alice ##> "/set welcome team Welcome to the team!" + alice <## "welcome message changed to:" alice <## "Welcome to the team!" bob <## "alice updated group #team:" - bob <## "description changed to:" + bob <## "welcome message changed to:" bob <## "Welcome to the team!" alice ##> "/group_profile team" alice <## "#team" - alice <## "description:" + alice <## "welcome message:" alice <## "Welcome to the team!" groupInfo' alice connectUsers alice cath @@ -1845,9 +1865,9 @@ testDeleteMemberWithMessages = bob <## "#team: alice removed you from the group with all messages" bob <## "use /d #team to delete the group" cath <## "#team: alice removed bob from the group with all messages" - alice #$> ("/_get chat #1 count=2", chat, [(0, "moderated [deleted by you]"), (1, "removed bob (Bob)")]) + alice #$> ("/_get chat #1 count=2", chat, [(0, "moderated [deleted by you]"), (1, "removed bob")]) bob #$> ("/_get chat #1 count=2", chat, [(1, "moderated [deleted by alice]"), (0, "removed you")]) - cath #$> ("/_get chat #1 count=2", chat, [(0, "moderated [deleted by alice]"), (0, "removed bob (Bob)")]) + cath #$> ("/_get chat #1 count=2", chat, [(0, "moderated [deleted by alice]"), (0, "removed bob")]) testDeleteMemberMarkMessagesDeleted :: HasCallStack => TestParams -> IO () testDeleteMemberMarkMessagesDeleted = @@ -1868,9 +1888,9 @@ testDeleteMemberMarkMessagesDeleted = bob <## "#team: alice removed you from the group with all messages" bob <## "use /d #team to delete the group" cath <## "#team: alice removed bob from the group with all messages" - alice #$> ("/_get chat #1 count=2", chat, [(0, "hello [marked deleted by you]"), (1, "removed bob (Bob)")]) + alice #$> ("/_get chat #1 count=2", chat, [(0, "hello [marked deleted by you]"), (1, "removed bob")]) bob #$> ("/_get chat #1 count=2", chat, [(1, "hello [marked deleted by alice]"), (0, "removed you")]) - cath #$> ("/_get chat #1 count=2", chat, [(0, "hello [marked deleted by alice]"), (0, "removed bob (Bob)")]) + cath #$> ("/_get chat #1 count=2", chat, [(0, "hello [marked deleted by alice]"), (0, "removed bob")]) testSendMulti :: HasCallStack => TestParams -> IO () testSendMulti = @@ -5564,11 +5584,11 @@ testGroupHistoryWelcomeMessage = createGroup2 "team" alice bob alice ##> "/set welcome #team welcome to team" - alice <## "description changed to:" + alice <## "welcome message changed to:" alice <## "welcome to team" bob <## "alice updated group #team:" - bob <## "description changed to:" + bob <## "welcome message changed to:" bob <## "welcome to team" threadDelay 1000000 @@ -6192,10 +6212,10 @@ testBlockForAllMarkedBlocked = #$> ( "/_get chat #1 count=6", chat, [ (0, "1"), - (1, "blocked bob (Bob)"), + (1, "blocked bob"), (0, "2 [blocked by admin]"), (0, "3 [blocked by admin]"), - (1, "unblocked bob (Bob)"), + (1, "unblocked bob"), (0, "4") ] ) @@ -6203,10 +6223,10 @@ testBlockForAllMarkedBlocked = #$> ( "/_get chat #1 count=6", chat, [ (0, "1"), - (0, "blocked bob (Bob)"), + (0, "blocked bob"), (0, "2 [blocked by admin]"), (0, "3 [blocked by admin]"), - (0, "unblocked bob (Bob)"), + (0, "unblocked bob"), (0, "4") ] ) @@ -6273,10 +6293,10 @@ testBlockForAllFullDelete = #$> ( "/_get chat #1 count=6", chat, [ (0, "1"), - (1, "blocked bob (Bob)"), + (1, "blocked bob"), (0, "blocked [blocked by admin]"), (0, "blocked [blocked by admin]"), - (1, "unblocked bob (Bob)"), + (1, "unblocked bob"), (0, "4") ] ) @@ -6284,10 +6304,10 @@ testBlockForAllFullDelete = #$> ( "/_get chat #1 count=6", chat, [ (0, "1"), - (0, "blocked bob (Bob)"), + (0, "blocked bob"), (0, "blocked [blocked by admin]"), (0, "blocked [blocked by admin]"), - (0, "unblocked bob (Bob)"), + (0, "unblocked bob"), (0, "4") ] ) @@ -6380,7 +6400,7 @@ testBlockForAllBeforeJoining = dan ##> "/_get chat #1 count=100" r <- chat <$> getTermLine dan - r `shouldContain` [(0, "3 [blocked by admin]"), (0, "4 [blocked by admin]"), (0, "unblocked bob (Bob)"), (0, "5")] + r `shouldContain` [(0, "3 [blocked by admin]"), (0, "4 [blocked by admin]"), (0, "unblocked bob"), (0, "5")] r `shouldNotContain` [(0, "1")] r `shouldNotContain` [(0, "1 [blocked by admin]")] r `shouldNotContain` [(0, "2")] diff --git a/tests/ChatTests/Local.hs b/tests/ChatTests/Local.hs index a5fb31ad77..38d8220a9e 100644 --- a/tests/ChatTests/Local.hs +++ b/tests/ChatTests/Local.hs @@ -66,7 +66,7 @@ testUserNotes ps = withNewTestChat ps "alice" aliceProfile $ \alice -> do alice ##> "/create user secret" alice <## "user profile: secret" - alice <## "use /p to change it" + alice <## "use /p [] to change it" alice <## "(the updated profile will be sent to all your contacts)" alice ##> "/tail" diff --git a/tests/ChatTests/Profiles.hs b/tests/ChatTests/Profiles.hs index eaaabf5b15..e16ffc4929 100644 --- a/tests/ChatTests/Profiles.hs +++ b/tests/ChatTests/Profiles.hs @@ -156,19 +156,19 @@ testUpdateProfile = connectUsers bob cath alice ##> "/p" alice <## "user profile: alice (Alice)" - alice <## "use /p to change it" + alice <## "use /p [] to change it" alice <## "(the updated profile will be sent to all your contacts)" alice ##> "/p alice" concurrentlyN_ - [ alice <## "user full name removed (your 2 contacts are notified)", - bob <## "contact alice removed full name", - cath <## "contact alice removed full name" + [ alice <## "user bio removed (your 2 contacts are notified)", + bob <## "contact alice removed bio", + cath <## "contact alice removed bio" ] alice ##> "/p alice Alice Jones" concurrentlyN_ - [ alice <## "user full name changed to Alice Jones (your 2 contacts are notified)", - bob <## "contact alice updated full name: Alice Jones", - cath <## "contact alice updated full name: Alice Jones" + [ alice <## "user bio changed to Alice Jones (your 2 contacts are notified)", + bob <## "contact alice updated bio: Alice Jones", + cath <## "contact alice updated bio: Alice Jones" ] cath ##> "/p cate" concurrentlyN_ @@ -282,7 +282,7 @@ testMultiWordProfileNames = aliceProfile' = baseProfile {displayName = "Alice Jones"} bobProfile' = baseProfile {displayName = "Bob James"} cathProfile' = baseProfile {displayName = "Cath Johnson"} - baseProfile = Profile {displayName = "", fullName = "", image = Nothing, contactLink = Nothing, preferences = defaultPrefs} + baseProfile = Profile {displayName = "", fullName = "", shortDescr = Nothing, image = Nothing, contactLink = Nothing, preferences = defaultPrefs} testUserContactLink :: HasCallStack => TestParams -> IO () testUserContactLink = @@ -577,7 +577,7 @@ testDeduplicateContactRequestsProfileChange = testChat3 aliceProfile bobProfile alice @@@ [("@bob", "Audio/video calls: enabled")] bob ##> "/p bob" - bob <## "user full name removed (your 0 contacts are notified)" + bob <## "user bio removed (your 0 contacts are notified)" bob ##> ("/c " <> cLink) bob <## "connection request sent!" alice <## "bob wants to connect to you!" @@ -586,7 +586,7 @@ testDeduplicateContactRequestsProfileChange = testChat3 aliceProfile bobProfile alice @@@ [("@bob", "Audio/video calls: enabled")] bob ##> "/p bob Bob Ross" - bob <## "user full name changed to Bob Ross (your 0 contacts are notified)" + bob <## "user bio changed to Bob Ross (your 0 contacts are notified)" bob ##> ("/c " <> cLink) alice <#? bob alice @@@ [("@bob", "Audio/video calls: enabled")] @@ -1362,8 +1362,8 @@ testConnectIncognitoInvitationLink = testChat3 aliceProfile bobProfile cathProfi -- bob is not notified on profile change alice ##> "/p alice" concurrentlyN_ - [ alice <## "user full name removed (your 1 contacts are notified)", - cath <## "contact alice removed full name" + [ alice <## "user bio removed (your 1 contacts are notified)", + cath <## "contact alice removed bio" ] alice ?#> ("@" <> bobIncognito <> " do you see that I've changed profile?") bob ?<# (aliceIncognito <> "> do you see that I've changed profile?") @@ -1852,13 +1852,13 @@ testCantSeeGlobalPrefsUpdateIncognito = testChat3 aliceProfile bobProfile cathPr ] alice <## "cath (Catherine): contact is connected" alice ##> "/_profile 1 {\"displayName\": \"alice\", \"fullName\": \"\", \"preferences\": {\"fullDelete\": {\"allow\": \"always\"}, \"receipts\": {\"allow\": \"yes\", \"activated\": true}}}" - alice <## "user full name removed (your 1 contacts are notified)" + alice <## "user bio removed (your 1 contacts are notified)" alice <## "updated preferences:" alice <## "Full deletion allowed: always" (alice "/_profile 1 {\"displayName\": \"bob\", \"fullName\": \"Bob\", \"preferences\": {\"voice\": {\"allow\": \"no\"}, \"receipts\": {\"allow\": \"yes\", \"activated\": true}}}" + bob ##> "/_profile 1 {\"displayName\": \"bob\", \"fullName\": \"\", \"shortDescr\": \"Bob\", \"preferences\": {\"voice\": {\"allow\": \"no\"}, \"receipts\": {\"allow\": \"yes\", \"activated\": true}}}" bob <## "profile image removed" bob <## "updated preferences:" bob <## "Voice messages allowed: no" @@ -2270,12 +2270,12 @@ testSetContactPrefs = testChat2 aliceProfile bobProfile $ bob #$> ("/_get chat @2 count=100", chat, startFeatures <> [(0, "Voice messages: enabled for you"), (1, "voice message (00:10)"), (0, "Voice messages: off")]) (bob "/_profile 1 {\"displayName\": \"bob\", \"fullName\": \"\", \"preferences\": {\"voice\": {\"allow\": \"yes\"}, \"receipts\": {\"allow\": \"yes\", \"activated\": true}}}" - bob <## "user full name removed (your 1 contacts are notified)" + bob <## "user bio removed (your 1 contacts are notified)" bob <## "updated preferences:" bob <## "Voice messages allowed: yes" bob #$> ("/_get chat @2 count=100", chat, startFeatures <> [(0, "Voice messages: enabled for you"), (1, "voice message (00:10)"), (0, "Voice messages: off"), (1, "Voice messages: enabled")]) (bob ("/_get chat @2 count=100", chat, startFeatures <> [(1, "Voice messages: enabled for contact"), (0, "voice message (00:10)"), (1, "Voice messages: off"), (0, "updated profile"), (0, "Voice messages: enabled")]) @@ -2596,7 +2596,7 @@ testUpdateMultipleUserPrefs = testChat3 aliceProfile bobProfile cathProfile $ alice #> "@cath hi cath" cath <# "alice> hi cath" - alice ##> "/_profile 1 {\"displayName\": \"alice\", \"fullName\": \"Alice\", \"preferences\": {\"fullDelete\": {\"allow\": \"always\"}, \"reactions\": {\"allow\": \"no\"}, \"receipts\": {\"allow\": \"yes\", \"activated\": true}}}" + alice ##> "/_profile 1 {\"displayName\": \"alice\", \"fullName\": \"\", \"shortDescr\": \"Alice\", \"preferences\": {\"fullDelete\": {\"allow\": \"always\"}, \"reactions\": {\"allow\": \"no\"}, \"receipts\": {\"allow\": \"yes\", \"activated\": true}}}" alice <## "updated preferences:" alice <## "Full deletion allowed: always" alice <## "Message reactions allowed: no" @@ -2786,7 +2786,7 @@ testSetUITheme = theme cm = T.unpack $ encodeJSON UIThemeEntityOverrides {light = Nothing, dark = Just $ UIThemeEntityOverride cm Nothing defaultUIColors} userInfo a name = do a <## ("user profile: " <> name) - a <## "use /p to change it" + a <## "use /p [] to change it" a <## "(the updated profile will be sent to all your contacts)" contactInfo a = do a <## "contact ID: 2" @@ -2984,7 +2984,7 @@ testShortLinkInvitationPrepareContact ps@TestParams {largeLinkData} = testChatCf ] alice <# "bob> hello" unless largeLinkData $ - bob <## "contact alice updated full name: Alice" + bob <## "contact alice updated bio: Alice" concurrently_ (bob <## "alice (Alice): contact is connected") (alice <## "bob (Bob): contact is connected") @@ -3035,9 +3035,12 @@ testShortLinkInvitationLongName = testChatCfg2 testCfg {largeLinkData = False} a WithTime ("@" <> longName <> " hello") ] bob <# "alice> hello" - concurrently_ - (alice <## (longName <> ": contact is connected")) - (bob <## "alice (Alice): contact is connected") + concurrentlyN_ + [ do + alice <## ("contact " <> longName <> " updated bio: Bob") + alice <## (longName <> " (Bob): contact is connected"), + (bob <## "alice (Alice): contact is connected") + ] bob <##> alice where longName = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" @@ -3070,7 +3073,7 @@ testShortLinkInvitationConnectRetry ps@TestParams {largeLinkData} = testChatCfgO ] alice <# "bob> hello" unless largeLinkData $ - bob <## "contact alice updated full name: Alice" + bob <## "contact alice updated bio: Alice" concurrently_ (bob <## "alice (Alice): contact is connected") (alice <## "bob (Bob): contact is connected") @@ -3120,7 +3123,7 @@ testShortLinkAddressPrepareContact ps@TestParams {largeLinkData} = testChatCfg2 alice ##> "/ac bob" alice <## "bob (Bob): accepting contact request, you can send messages to contact" unless largeLinkData $ - bob <## "contact alice updated full name: Alice" + bob <## "contact alice updated bio: Alice" concurrently_ (bob <## "alice (Alice): contact is connected") (alice <## "bob (Bob): contact is connected") @@ -3208,7 +3211,7 @@ testShortLinkAddressConnectRetry ps@TestParams {largeLinkData} = alice ##> "/ac bob" alice <## "bob (Bob): accepting contact request, you can send messages to contact" unless largeLinkData $ - bob <## "contact alice updated full name: Alice" + bob <## "contact alice updated bio: Alice" concurrently_ (bob <## "alice (Alice): contact is connected") (alice <## "bob (Bob): contact is connected") @@ -3266,7 +3269,7 @@ testShortLinkAddressConnectRetryIncognito ps@TestParams {largeLinkData} = alice ##> ("/ac " <> bobIncognito) alice <## (bobIncognito <> ": accepting contact request, you can send messages to contact") unless largeLinkData $ - bob <## "contact alice updated full name: Alice" + bob <## "contact alice updated bio: Alice" concurrentlyN_ [ do _ <- getTermLine bob @@ -3492,7 +3495,7 @@ testGroupShortLinkWelcome ps@TestParams {largeLinkData} = testChatCfg2 testCfg { alice <## "group #team is created" alice <## "to add members use /a team or /create link #team" alice ##> "/set welcome #team Welcome!" - alice <## "description changed to:" + alice <## "welcome message changed to:" alice <## "Welcome!" alice ##> "/create link #team" (shortLink, fullLink) <- getGroupLinks alice "team" GRMember True @@ -3593,7 +3596,7 @@ testShortLinkInvitationConnectPreparedContactIncognito ps@TestParams {largeLinkD bobIncognito <- getTermLine bob bob <## "alice: connection started incognito" unless largeLinkData $ - bob <## "contact alice updated full name: Alice" + bob <## "contact alice updated bio: Alice" _ <- getTermLine bob concurrentlyN_ [ alice <## (bobIncognito <> ": contact is connected"), @@ -3626,7 +3629,7 @@ testShortLinkAddressConnectPreparedContactIncognito ps@TestParams {largeLinkData alice ##> ("/ac " <> bobIncognito) alice <## (bobIncognito <> ": accepting contact request, you can send messages to contact") unless largeLinkData $ - bob <## "contact alice updated full name: Alice" + bob <## "contact alice updated bio: Alice" _ <- getTermLine bob concurrentlyN_ [ alice <## (bobIncognito <> ": contact is connected"), @@ -3670,7 +3673,7 @@ testShortLinkChangePreparedContactUser ps@TestParams {largeLinkData} = testChatC ] alice <# "robert> hello" unless largeLinkData $ - bob <## "contact alice updated full name: Alice" + bob <## "contact alice updated bio: Alice" concurrently_ (bob <## "alice (Alice): contact is connected") (alice <## "robert: contact is connected") @@ -3724,7 +3727,7 @@ testShortLinkChangePreparedContactUserDuplicate ps@TestParams {largeLinkData} = ] alice <# "robert_1> hello" unless largeLinkData $ - bob <## "contact alice_1 updated full name: Alice" + bob <## "contact alice_1 updated bio: Alice" concurrently_ (bob <## "alice_1 (Alice): contact is connected") (alice <## "robert_1: contact is connected") @@ -4087,7 +4090,7 @@ testShortLinkAddressChangeAutoReply ps@TestParams {largeLinkData} = testChatCfg3 alice <## "bob (Bob): accepting contact request..." alice <## "bob (Bob): you can send messages to contact" unless largeLinkData $ - bob <## "contact alice updated full name: Alice" + bob <## "contact alice updated bio: Alice" concurrently_ (bob <### (["alice (Alice): contact is connected"] <> [WithTime "alice> welcome!" | not largeLinkData])) (alice <### (["bob (Bob): contact is connected"] <> [WithTime "@bob welcome!" | not largeLinkData])) @@ -4109,7 +4112,7 @@ testShortLinkAddressChangeAutoReply ps@TestParams {largeLinkData} = testChatCfg3 alice <## "cath (Catherine): accepting contact request..." alice <## "cath (Catherine): you can send messages to contact" unless largeLinkData $ - cath <## "contact alice updated full name: Alice" + cath <## "contact alice updated bio: Alice" concurrently_ (cath <## "alice (Alice): contact is connected") (alice <## "cath (Catherine): contact is connected") diff --git a/tests/ChatTests/Utils.hs b/tests/ChatTests/Utils.hs index 5dffb970d7..72c0205883 100644 --- a/tests/ChatTests/Utils.hs +++ b/tests/ChatTests/Utils.hs @@ -57,25 +57,28 @@ defaultPrefs :: Maybe Preferences defaultPrefs = Just $ toChatPrefs defaultChatPrefs aliceDesktopProfile :: Profile -aliceDesktopProfile = Profile {displayName = "alice_desktop", fullName = "Alice Desktop", image = Nothing, contactLink = Nothing, preferences = defaultPrefs} +aliceDesktopProfile = mkProfile "alice_desktop" "Alice Desktop" Nothing aliceProfile :: Profile -aliceProfile = Profile {displayName = "alice", fullName = "Alice", image = Nothing, contactLink = Nothing, preferences = defaultPrefs} +aliceProfile = mkProfile "alice" "Alice" Nothing bobProfile :: Profile -bobProfile = Profile {displayName = "bob", fullName = "Bob", image = Just (ImageData "data:image/png;base64,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"), contactLink = Nothing, preferences = defaultPrefs} +bobProfile = mkProfile "bob" "Bob" $ Just $ ImageData "data:image/png;base64,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" cathProfile :: Profile -cathProfile = Profile {displayName = "cath", fullName = "Catherine", image = Nothing, contactLink = Nothing, preferences = defaultPrefs} +cathProfile = mkProfile "cath" "Catherine" Nothing danProfile :: Profile -danProfile = Profile {displayName = "dan", fullName = "Daniel", image = Nothing, contactLink = Nothing, preferences = defaultPrefs} +danProfile = mkProfile "dan" "Daniel" Nothing eveProfile :: Profile -eveProfile = Profile {displayName = "eve", fullName = "Eve", image = Nothing, contactLink = Nothing, preferences = defaultPrefs} +eveProfile = mkProfile "eve" "Eve" Nothing businessProfile :: Profile -businessProfile = Profile {displayName = "biz", fullName = "Biz Inc", image = Nothing, contactLink = Nothing, preferences = defaultPrefs} +businessProfile = mkProfile "biz" "Biz Inc" Nothing + +mkProfile :: T.Text -> T.Text -> Maybe ImageData -> Profile +mkProfile displayName descr image = Profile {displayName, fullName = "", shortDescr = Just descr, image, contactLink = Nothing, preferences = defaultPrefs} it :: HasCallStack => String -> (TestParams -> Expectation) -> SpecWith (Arg (TestParams -> Expectation)) it name test = @@ -685,7 +688,7 @@ lastItemId cc = do showActiveUser :: HasCallStack => TestCC -> String -> Expectation showActiveUser cc name = do cc <## ("user profile: " <> name) - cc <## "use /p to change it" + cc <## "use /p [] to change it" cc <## "(the updated profile will be sent to all your contacts)" connectUsersNoShortLink :: HasCallStack => TestCC -> TestCC -> IO () @@ -710,8 +713,8 @@ connectUsers_ cc1 cc2 noShortLink = do showName :: TestCC -> IO String showName (TestCC ChatController {currentUser} _ _ _ _ _) = do - Just User {localDisplayName, profile = LocalProfile {fullName}} <- readTVarIO currentUser - pure . T.unpack $ localDisplayName <> optionalFullName localDisplayName fullName + Just User {localDisplayName, profile = LocalProfile {fullName, shortDescr}} <- readTVarIO currentUser + pure . T.unpack $ localDisplayName <> optionalFullName localDisplayName fullName shortDescr createGroup2 :: HasCallStack => String -> TestCC -> TestCC -> IO () createGroup2 gName cc1 cc2 = createGroup2' gName cc1 (cc2, GRAdmin) True diff --git a/tests/JSONFixtures.hs b/tests/JSONFixtures.hs index bd74f44022..99157b127f 100644 --- a/tests/JSONFixtures.hs +++ b/tests/JSONFixtures.hs @@ -17,10 +17,10 @@ activeUserExistsTagged :: LB.ByteString activeUserExistsTagged = "{\"error\":{\"type\":\"error\",\"errorType\":{\"type\":\"userExists\",\"contactName\":\"alice\"}}}" activeUserSwift :: LB.ByteString -activeUserSwift = "{\"result\":{\"_owsf\":true,\"activeUser\":{\"user\":{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"yes\"},\"fullDelete\":{\"allow\":\"no\"},\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"},\"calls\":{\"allow\":\"yes\"}},\"activeUser\":true,\"activeOrder\":1,\"showNtfs\":true,\"sendRcptsContacts\":true,\"sendRcptsSmallGroups\":true}}}}" +activeUserSwift = "{\"result\":{\"_owsf\":true,\"activeUser\":{\"user\":{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"\",\"shortDescr\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"yes\"},\"fullDelete\":{\"allow\":\"no\"},\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"},\"calls\":{\"allow\":\"yes\"}},\"activeUser\":true,\"activeOrder\":1,\"showNtfs\":true,\"sendRcptsContacts\":true,\"sendRcptsSmallGroups\":true}}}}" activeUserTagged :: LB.ByteString -activeUserTagged = "{\"result\":{\"type\":\"activeUser\",\"user\":{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"yes\"},\"fullDelete\":{\"allow\":\"no\"},\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"},\"calls\":{\"allow\":\"yes\"}},\"activeUser\":true,\"activeOrder\":1,\"showNtfs\":true,\"sendRcptsContacts\":true,\"sendRcptsSmallGroups\":true}}}" +activeUserTagged = "{\"result\":{\"type\":\"activeUser\",\"user\":{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"\",\"shortDescr\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"yes\"},\"fullDelete\":{\"allow\":\"no\"},\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"},\"calls\":{\"allow\":\"yes\"}},\"activeUser\":true,\"activeOrder\":1,\"showNtfs\":true,\"sendRcptsContacts\":true,\"sendRcptsSmallGroups\":true}}}" chatStartedSwift :: LB.ByteString chatStartedSwift = "{\"result\":{\"_owsf\":true,\"chatStarted\":{}}}" @@ -35,7 +35,7 @@ networkStatusesTagged :: LB.ByteString networkStatusesTagged = "{\"result\":{\"type\":\"networkStatuses\",\"user_\":" <> userJSON <> ",\"networkStatuses\":[]}}" userJSON :: LB.ByteString -userJSON = "{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"yes\"},\"fullDelete\":{\"allow\":\"no\"},\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"},\"calls\":{\"allow\":\"yes\"}},\"activeUser\":true,\"activeOrder\":1,\"showNtfs\":true,\"sendRcptsContacts\":true,\"sendRcptsSmallGroups\":true}" +userJSON = "{\"userId\":1,\"agentUserId\":\"1\",\"userContactId\":1,\"localDisplayName\":\"alice\",\"profile\":{\"profileId\":1,\"displayName\":\"alice\",\"fullName\":\"\",\"shortDescr\":\"Alice\",\"localAlias\":\"\"},\"fullPreferences\":{\"timedMessages\":{\"allow\":\"yes\"},\"fullDelete\":{\"allow\":\"no\"},\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"},\"calls\":{\"allow\":\"yes\"}},\"activeUser\":true,\"activeOrder\":1,\"showNtfs\":true,\"sendRcptsContacts\":true,\"sendRcptsSmallGroups\":true}" memberSubSummarySwift :: LB.ByteString memberSubSummarySwift = "{\"result\":{\"_owsf\":true,\"memberSubSummary\":{\"user\":" <> userJSON <> ",\"memberSubscriptions\":[]}}}" diff --git a/tests/ProtocolTests.hs b/tests/ProtocolTests.hs index 7cc27b3df5..8e0c937358 100644 --- a/tests/ProtocolTests.hs +++ b/tests/ProtocolTests.hs @@ -104,10 +104,10 @@ testGroupPreferences :: Maybe GroupPreferences testGroupPreferences = Just GroupPreferences {timedMessages = Nothing, directMessages = Nothing, reactions = Just ReactionsGroupPreference {enable = FEOn}, voice = Just VoiceGroupPreference {enable = FEOn, role = Nothing}, files = Nothing, fullDelete = Nothing, simplexLinks = Nothing, history = Nothing, reports = Nothing} testProfile :: Profile -testProfile = Profile {displayName = "alice", fullName = "Alice", image = Just (ImageData "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII="), contactLink = Nothing, preferences = testChatPreferences} +testProfile = Profile {displayName = "alice", fullName = "Alice", shortDescr = Nothing, image = Just (ImageData "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII="), contactLink = Nothing, preferences = testChatPreferences} testGroupProfile :: GroupProfile -testGroupProfile = GroupProfile {displayName = "team", fullName = "Team", description = Nothing, image = Nothing, groupPreferences = testGroupPreferences, memberAdmission = Nothing} +testGroupProfile = GroupProfile {displayName = "team", fullName = "Team", description = Nothing, shortDescr = Nothing, image = Nothing, groupPreferences = testGroupPreferences, memberAdmission = Nothing} decodeChatMessageTest :: Spec decodeChatMessageTest = describe "Chat message encoding/decoding" $ do @@ -223,7 +223,7 @@ decodeChatMessageTest = describe "Chat message encoding/decoding" $ do #==# XInfo testProfile it "x.info with empty full name" $ "{\"v\":\"1\",\"event\":\"x.info\",\"params\":{\"profile\":{\"fullName\":\"\",\"displayName\":\"alice\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}" - #==# XInfo Profile {displayName = "alice", fullName = "", image = Nothing, contactLink = Nothing, preferences = testChatPreferences} + #==# XInfo Profile {displayName = "alice", fullName = "", shortDescr = Nothing, image = Nothing, contactLink = Nothing, preferences = testChatPreferences} it "x.contact with xContactId" $ "{\"v\":\"1\",\"event\":\"x.contact\",\"params\":{\"contactReqId\":\"AQIDBA==\",\"profile\":{\"fullName\":\"Alice\",\"displayName\":\"alice\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\",\"preferences\":{\"reactions\":{\"allow\":\"yes\"},\"voice\":{\"allow\":\"yes\"}}}}}" #==# XContact testProfile (Just $ XContactId "\1\2\3\4") Nothing Nothing diff --git a/tests/RemoteTests.hs b/tests/RemoteTests.hs index f18b097e9c..f869c68227 100644 --- a/tests/RemoteTests.hs +++ b/tests/RemoteTests.hs @@ -448,7 +448,7 @@ multipleProfilesTest = testChat4 aliceProfile aliceDesktopProfile bobProfile cat desktop ##> "/create user desk_bottom" desktop <## "user profile: desk_bottom" - desktop <## "use /p to change it" + desktop <## "use /p [] to change it" desktop <## "(the updated profile will be sent to all your contacts)" desktop ##> "/users" desktop <## "alice_desktop (Alice Desktop)" @@ -461,7 +461,7 @@ multipleProfilesTest = testChat4 aliceProfile aliceDesktopProfile bobProfile cat desktop ##> "/create user alt_alice" desktop <## "user profile: alt_alice" - desktop <## "use /p to change it" + desktop <## "use /p [] to change it" desktop <## "(the updated profile will be sent to all your contacts)" desktop ##> "/users" @@ -470,7 +470,7 @@ multipleProfilesTest = testChat4 aliceProfile aliceDesktopProfile bobProfile cat desktop ##> "/user" desktop <## "user profile: alt_alice" - desktop <## "use /p to change it" + desktop <## "use /p [] to change it" desktop <## "(the updated profile will be sent to all your contacts)" bob #> "@alice hi" @@ -483,7 +483,7 @@ multipleProfilesTest = testChat4 aliceProfile aliceDesktopProfile bobProfile cat desktop <## "Using local profile" desktop ##> "/user" desktop <## "user profile: desk_bottom" - desktop <## "use /p to change it" + desktop <## "use /p [] to change it" desktop <## "(the updated profile will be sent to all your contacts)" bob #> "@alice hey" From 9d3422ceb93b5b60f1333540b3f2b6b0a225fcc0 Mon Sep 17 00:00:00 2001 From: 7sunarni <710720732@qq.com> Date: Sat, 12 Jul 2025 17:00:26 +0800 Subject: [PATCH 13/18] fix(install.sh): broken linux link (#6015) * fix(install.sh): broken linux link Signed-off-by: 7sunarni <710720732@qq.com> * Update install.sh --------- Signed-off-by: 7sunarni <710720732@qq.com> Co-authored-by: sh <37271604+shumvgolove@users.noreply.github.com> --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 3f65913e91..68acbccb14 100755 --- a/install.sh +++ b/install.sh @@ -20,7 +20,7 @@ fi if [ $PLATFORM == "Darwin" ]; then PLATFORM="macos-x86-64" elif [ $PLATFORM == "Linux" ]; then - PLATFORM="ubuntu-20_04-x86-64" + PLATFORM="ubuntu-22_04-x86-64" else echo "Scripted installation on your platform is not supported." echo "See compiled binaries in the ${1:-latest} release: https://github.com/$APP_NAME/$APP_NAME/releases/$RELEASE" From 9708a2ea48eb828b3069f6ca9ee5d9563a95a48f Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sat, 12 Jul 2025 15:17:57 +0100 Subject: [PATCH 14/18] ui: translations (#6059) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translated using Weblate (German) Currently translated at 99.3% (2107 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Russian) Currently translated at 98.0% (2078 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ru/ * Translated using Weblate (French) Currently translated at 92.1% (1953 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Italian) Currently translated at 99.3% (2107 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 91.1% (1932 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/zh_Hans/ * Translated using Weblate (Spanish) Currently translated at 98.0% (2079 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * Translated using Weblate (Dutch) Currently translated at 97.8% (2074 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/nl/ * Translated using Weblate (Ukrainian) Currently translated at 93.3% (1978 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/uk/ * Translated using Weblate (Polish) Currently translated at 85.8% (1820 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/pl/ * Translated using Weblate (Turkish) Currently translated at 86.9% (1843 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/ * Translated using Weblate (Hungarian) Currently translated at 99.3% (2107 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (German) Currently translated at 99.3% (2107 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Russian) Currently translated at 98.0% (2078 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ru/ * Translated using Weblate (French) Currently translated at 92.1% (1953 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/fr/ * Translated using Weblate (Italian) Currently translated at 99.3% (2107 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 91.1% (1932 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/zh_Hans/ * Translated using Weblate (Spanish) Currently translated at 98.0% (2079 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * Translated using Weblate (Dutch) Currently translated at 97.8% (2074 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/nl/ * Translated using Weblate (Ukrainian) Currently translated at 93.3% (1978 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/uk/ * Translated using Weblate (Polish) Currently translated at 85.8% (1820 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/pl/ * Translated using Weblate (Turkish) Currently translated at 86.9% (1843 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/ * Translated using Weblate (Hungarian) Currently translated at 99.3% (2107 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (German) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Italian) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Italian) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Turkish) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/tr/ * Translated using Weblate (Catalan) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ca/ * Translated using Weblate (Catalan) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ca/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * Translated using Weblate (Spanish) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/es/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (German) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (German) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2450 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Hebrew) Currently translated at 85.2% (2089 of 2450 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/he/ * Translated using Weblate (Turkish) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/ * Translated using Weblate (Turkish) Currently translated at 100.0% (2120 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/tr/ * Translated using Weblate (German) Currently translated at 100.0% (2451 of 2451 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (Italian) Currently translated at 100.0% (2451 of 2451 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2451 of 2451 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2451 of 2451 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2451 of 2451 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Persian) Currently translated at 78.2% (1918 of 2451 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fa/ * Translated using Weblate (Russian) Currently translated at 99.9% (2453 of 2454 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ru/ * Translated using Weblate (Russian) Currently translated at 99.9% (2453 of 2454 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ru/ * Translated using Weblate (Russian) Currently translated at 99.9% (2453 of 2454 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ru/ * Translated using Weblate (Russian) Currently translated at 99.9% (2453 of 2454 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ru/ * Translated using Weblate (Russian) Currently translated at 99.9% (2453 of 2454 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ru/ * Translated using Weblate (Russian) Currently translated at 99.9% (2453 of 2454 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ru/ * Translated using Weblate (Russian) Currently translated at 99.9% (2118 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ru/ * Translated using Weblate (Russian) Currently translated at 99.9% (2118 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ru/ * Translated using Weblate (Russian) Currently translated at 99.9% (2118 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ru/ * Translated using Weblate (Russian) Currently translated at 99.9% (2118 of 2120 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/ru/ * process localizations * update translations * reprocess --------- Co-authored-by: Pixelcode Co-authored-by: J R Co-authored-by: Ophiushi <41908476+ishi-sama@users.noreply.github.com> Co-authored-by: Random Co-authored-by: re me Co-authored-by: No name Co-authored-by: M1K4 Co-authored-by: Max Co-authored-by: B.O.S.S Co-authored-by: Abdullah Koyuncu Co-authored-by: summoner001 Co-authored-by: mlanp Co-authored-by: 大王叫我来巡山 Co-authored-by: U.S Co-authored-by: fran secs Co-authored-by: Ghost of Sparta Co-authored-by: jonnysemon Co-authored-by: elid Co-authored-by: firmfox --- .../Shared/Views/NewChat/NewChatView.swift | 24 +- .../Views/UserSettings/UserAddressView.swift | 8 +- .../bg.xcloc/Localized Contents/bg.xliff | 28 +- .../cs.xcloc/Localized Contents/cs.xliff | 28 +- .../de.xcloc/Localized Contents/de.xliff | 58 +- .../en.xcloc/Localized Contents/en.xliff | 39 +- .../es.xcloc/Localized Contents/es.xliff | 68 +- .../fi.xcloc/Localized Contents/fi.xliff | 28 +- .../fr.xcloc/Localized Contents/fr.xliff | 30 +- .../hu.xcloc/Localized Contents/hu.xliff | 44 +- .../it.xcloc/Localized Contents/it.xliff | 48 +- .../ja.xcloc/Localized Contents/ja.xliff | 28 +- .../nl.xcloc/Localized Contents/nl.xliff | 36 +- .../pl.xcloc/Localized Contents/pl.xliff | 30 +- .../ru.xcloc/Localized Contents/ru.xliff | 70 +- .../th.xcloc/Localized Contents/th.xliff | 28 +- .../tr.xcloc/Localized Contents/tr.xliff | 319 ++++++- .../uk.xcloc/Localized Contents/uk.xliff | 34 +- .../Localized Contents/zh-Hans.xliff | 30 +- .../SimpleX NSE/tr.lproj/Localizable.strings | 20 +- apps/ios/de.lproj/Localizable.strings | 68 +- apps/ios/es.lproj/Localizable.strings | 120 ++- apps/ios/fr.lproj/Localizable.strings | 6 +- apps/ios/hu.lproj/Localizable.strings | 54 +- apps/ios/it.lproj/Localizable.strings | 58 +- apps/ios/nl.lproj/Localizable.strings | 10 +- apps/ios/pl.lproj/Localizable.strings | 6 +- apps/ios/ru.lproj/Localizable.strings | 122 ++- apps/ios/tr.lproj/Localizable.strings | 824 +++++++++++++++++- apps/ios/uk.lproj/Localizable.strings | 10 +- apps/ios/zh-Hans.lproj/Localizable.strings | 4 +- .../chat/simplex/common/model/SimpleXAPI.kt | 4 +- .../commonMain/resources/MR/ar/strings.xml | 17 +- .../commonMain/resources/MR/base/strings.xml | 13 +- .../commonMain/resources/MR/ca/strings.xml | 16 +- .../commonMain/resources/MR/de/strings.xml | 29 +- .../commonMain/resources/MR/es/strings.xml | 59 +- .../commonMain/resources/MR/fa/strings.xml | 32 + .../commonMain/resources/MR/hu/strings.xml | 19 +- .../commonMain/resources/MR/it/strings.xml | 19 +- .../commonMain/resources/MR/iw/strings.xml | 4 + .../commonMain/resources/MR/ru/strings.xml | 55 +- .../commonMain/resources/MR/tr/strings.xml | 55 +- .../resources/MR/zh-rCN/strings.xml | 45 +- 44 files changed, 2174 insertions(+), 473 deletions(-) diff --git a/apps/ios/Shared/Views/NewChat/NewChatView.swift b/apps/ios/Shared/Views/NewChat/NewChatView.swift index 19e0d4180d..499287016a 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatView.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatView.swift @@ -435,7 +435,7 @@ private struct ActiveProfilePicker: View { alert = SomeAlert( alert: Alert( title: Text("Error switching profile"), - message: Text("Your connection was moved to \(profile.chatViewName) but an unexpected error occurred while redirecting you to the profile.") + message: Text("Your connection was moved to \(profile.chatViewName) but an error happened when switching profile.") ), id: "switchingProfileError" ) @@ -474,8 +474,8 @@ private struct ActiveProfilePicker: View { IncognitoHelp() } } - - + + @ViewBuilder private func viewBody() -> some View { profilePicker() .allowsHitTesting(!switchingProfileByTimeout) @@ -488,11 +488,11 @@ private struct ActiveProfilePicker: View { } } } - + private func filteredProfiles() -> [User] { let s = trimmedSearchTextOrPassword let lower = s.localizedLowercase - + return profiles.filter { u in if (u.activeUser || !u.hidden) && (s == "" || u.chatViewName.localizedLowercase.contains(lower)) { return true @@ -500,7 +500,7 @@ private struct ActiveProfilePicker: View { return correctPassword(u, s) } } - + private func profilerPickerUserOption(_ user: User) -> some View { Button { if selectedProfile == user && incognitoEnabled { @@ -526,7 +526,7 @@ private struct ActiveProfilePicker: View { } } } - + @ViewBuilder private func profilePicker() -> some View { let incognitoOption = Button { if !incognitoEnabled { @@ -552,11 +552,11 @@ private struct ActiveProfilePicker: View { } } } - + List { let filteredProfiles = filteredProfiles() let activeProfile = filteredProfiles.first { u in u.activeUser } - + if let selectedProfile = activeProfile { let otherProfiles = filteredProfiles .filter { u in u.userId != activeProfile?.userId } @@ -569,7 +569,7 @@ private struct ActiveProfilePicker: View { profilerPickerUserOption(selectedProfile) incognitoOption } - + ForEach(otherProfiles) { p in profilerPickerUserOption(p) } @@ -1057,7 +1057,7 @@ private func showPrepareContactAlert( } } catch let error { logger.error("showPrepareContactAlert apiPrepareContact error: \(error.localizedDescription)") - showAlert(NSLocalizedString("Error preparing contact", comment: ""), message: responseError(error)) + showAlert(NSLocalizedString("Error opening chat", comment: ""), message: responseError(error)) await MainActor.run { cleanup?() } @@ -1093,7 +1093,7 @@ private func showPrepareGroupAlert( } } catch let error { logger.error("showPrepareGroupAlert apiPrepareGroup error: \(error.localizedDescription)") - showAlert(NSLocalizedString("Error preparing group", comment: ""), message: responseError(error)) + showAlert(NSLocalizedString("Error opening group", comment: ""), message: responseError(error)) await MainActor.run { cleanup?() } diff --git a/apps/ios/Shared/Views/UserSettings/UserAddressView.swift b/apps/ios/Shared/Views/UserSettings/UserAddressView.swift index 46a9083436..58d4ffb30e 100644 --- a/apps/ios/Shared/Views/UserSettings/UserAddressView.swift +++ b/apps/ios/Shared/Views/UserSettings/UserAddressView.swift @@ -229,15 +229,15 @@ struct UserAddressView: View { showAddShortLinkAlert() } label: { settingsRow("plus", color: theme.colors.primary) { - Text("Share profile via link") + Text("Share profile with address") } } } private func showAddShortLinkAlert() { showAlert( - title: NSLocalizedString("Share profile via link", comment: "alert title"), - message: NSLocalizedString("Profile will be shared via the address link.", comment: "alert message"), + title: NSLocalizedString("Share profile with address", comment: "alert title"), + message: NSLocalizedString("Profile will be shared with the address.", comment: "alert message"), buttonTitle: NSLocalizedString("Share profile", comment: "alert button"), buttonAction: { addShortLink() }, cancelButton: true @@ -255,7 +255,7 @@ struct UserAddressView: View { await MainActor.run { progressIndicator = false } } catch let error { logger.error("apiAddMyAddressShortLink: \(responseError(error))") - let a = getErrorAlert(error, "Error adding address short link") + let a = getErrorAlert(error, "Error adding short link") alert = .error(title: a.title, error: a.message) await MainActor.run { progressIndicator = false } } diff --git a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff index 4fc9a7de98..cc6ac9cb18 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -3048,10 +3048,6 @@ chat item action Error accepting member alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) Грешка при добавяне на член(ове) @@ -3234,12 +3230,8 @@ chat item action Грешка при отваряне на чата No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group No comment provided by engineer. @@ -4508,6 +4500,10 @@ This is your link for group %@! Съобщения на живо No comment provided by engineer. + + Loading profile… + in progress text + Local name Локално име @@ -5792,8 +5788,8 @@ Error: %@ Актуализацията на профила ще бъде изпратена до вашите контакти. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. alert message @@ -6976,8 +6972,8 @@ chat item action Share profile alert button - - Share profile via link + + Share profile with address alert title @@ -8717,8 +8713,8 @@ Repeat connection request? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index 7588714922..b9319d1318 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -2924,10 +2924,6 @@ chat item action Error accepting member alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) Chyba přidávání člena(ů) @@ -3107,12 +3103,8 @@ chat item action Error opening chat No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group No comment provided by engineer. @@ -4339,6 +4331,10 @@ This is your link for group %@! Živé zprávy No comment provided by engineer. + + Loading profile… + in progress text + Local name Místní název @@ -5585,8 +5581,8 @@ Error: %@ Aktualizace profilu bude zaslána vašim kontaktům. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. alert message @@ -6748,8 +6744,8 @@ chat item action Share profile alert button - - Share profile via link + + Share profile with address alert title @@ -8425,8 +8421,8 @@ Repeat connection request? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index 122bfe3d3c..d073e1a128 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -1626,6 +1626,7 @@ set passcode view Chat with members before they join. + Chat mit Mitgliedern bevor sie beitreten. No comment provided by engineer. @@ -1865,6 +1866,7 @@ set passcode view Connect faster! 🚀 + Schneller miteinander verbinden! 🚀 No comment provided by engineer. @@ -3198,11 +3200,6 @@ chat item action Fehler beim Übernehmen des Mitglieds alert title - - Error adding address short link - Fehler beim Hinzufügen eines verkürzten Adresslinks - No comment provided by engineer. - Error adding member(s) Fehler beim Hinzufügen von Mitgliedern @@ -3395,16 +3392,11 @@ chat item action Error opening chat - Fehler beim Öffnen des Chats + Fehler beim Öffnen des Chat No comment provided by engineer. - - Error preparing contact - Fehler bei der Kontaktaufnahme - No comment provided by engineer. - - - Error preparing group + + Error opening group Fehler beim Vorbereiten der Gruppe No comment provided by engineer. @@ -3921,7 +3913,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - Weiterleitungsserver %@ konnte sich nicht mit dem Zielserver %@ verbinden. Bitte versuchen Sie es später erneut. + Weiterleitungsserver %1$@ konnte sich nicht mit dem Zielserver %2$@ verbinden. Bitte versuchen Sie es später erneut. alert message @@ -4585,7 +4577,7 @@ Weitere Verbesserungen sind bald verfügbar! Join as %@ - beitreten als %@ + Als %@ beitreten No comment provided by engineer. @@ -4692,6 +4684,7 @@ Das ist Ihr Link für die Gruppe %@! Less traffic on mobile networks. + Weniger Datenverkehr in mobilen Netzen. No comment provided by engineer. @@ -4749,6 +4742,10 @@ Das ist Ihr Link für die Gruppe %@! Live Nachrichten No comment provided by engineer. + + Loading profile… + in progress text + Local name Lokaler Name @@ -4866,7 +4863,7 @@ Das ist Ihr Link für die Gruppe %@! Member will join the group, accept member? - Ein Mitglied wird der Gruppe beitreten. Übernehmen? + Mitglied wird der Gruppe beitreten. Übernehmen? alert message @@ -4946,6 +4943,7 @@ Das ist Ihr Link für die Gruppe %@! Message instantly once you tap Connect. + Sobald Sie auf Verbinden tippen, erhalten Sie sofort eine Nachricht. No comment provided by engineer. @@ -5285,6 +5283,7 @@ Das ist Ihr Link für die Gruppe %@! New group role: Moderator + Neue Gruppen-Rolle: Moderator No comment provided by engineer. @@ -5434,6 +5433,7 @@ Das ist Ihr Link für die Gruppe %@! No private routing session + Keine private Routing-Sitzung alert title @@ -5718,12 +5718,12 @@ Dies erfordert die Aktivierung eines VPNs. Open new chat - Neuen Chat eröffnen + Neuen Chat öffnen new chat action Open new group - Neue Gruppe eröffnen + Neue Gruppe öffnen new chat action @@ -6104,6 +6104,7 @@ Fehler: %@ Private routing timeout + Zeitüberschreitung der privaten Routing-Sitzung alert title @@ -6136,8 +6137,8 @@ Fehler: %@ Profil-Aktualisierung wird an Ihre Kontakte gesendet. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. Das Profil wird über den Adress-Link geteilt. alert message @@ -6215,6 +6216,7 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen. Protocol background timeout + Protokoll Hintergrund-Zeitüberschreitung No comment provided by engineer. @@ -6506,6 +6508,7 @@ swipe action Removes messages and blocks members. + Entfernt Nachrichten und blockiert Mitglieder. No comment provided by engineer. @@ -6690,6 +6693,7 @@ swipe action Review group members + Gruppenmitglieder überprüfen No comment provided by engineer. @@ -7085,6 +7089,7 @@ chat item action Send your private feedback to groups. + Senden Sie Ihr privates Feedback an Gruppen. No comment provided by engineer. @@ -7418,8 +7423,8 @@ chat item action Profil teilen alert button - - Share profile via link + + Share profile with address Profil über einen Link teilen alert title @@ -7808,6 +7813,7 @@ report reason TCP connection bg timeout + TCP-Verbindung Hintergrund-Zeitüberschreitung No comment provided by engineer. @@ -9270,8 +9276,8 @@ Verbindungsanfrage wiederholen? Ihr Chat wurde nach %@ verschoben, aber es ist ein unerwarteter Fehler aufgetreten, als Sie zum Profil weitergeleitet wurden. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. Ihre Verbindung wurde auf %@ verschoben. Während Sie auf das Profil weitergeleitet wurden trat aber ein unerwarteter Fehler auf. No comment provided by engineer. @@ -9839,7 +9845,7 @@ pref value group is deleted - Gruppe wird gelöscht + Gruppe wurde gelöscht No comment provided by engineer. @@ -10147,7 +10153,7 @@ time to disappear removed from group - Von der Gruppe entfernt + Aus der Gruppe entfernt No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index 033c349609..8b88f7b37c 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -3200,11 +3200,6 @@ chat item action Error accepting member alert title - - Error adding address short link - Error adding address short link - No comment provided by engineer. - Error adding member(s) Error adding member(s) @@ -3400,14 +3395,9 @@ chat item action Error opening chat No comment provided by engineer. - - Error preparing contact - Error preparing contact - No comment provided by engineer. - - - Error preparing group - Error preparing group + + Error opening group + Error opening group No comment provided by engineer. @@ -4752,6 +4742,11 @@ This is your link for group %@! Live messages No comment provided by engineer. + + Loading profile… + Loading profile… + in progress text + Local name Local name @@ -6143,9 +6138,9 @@ Error: %@ Profile update will be sent to your contacts. alert message - - Profile will be shared via the address link. - Profile will be shared via the address link. + + Profile will be shared with the address. + Profile will be shared with the address. alert message @@ -7429,9 +7424,9 @@ chat item action Share profile alert button - - Share profile via link - Share profile via link + + Share profile with address + Share profile with address alert title @@ -9282,9 +9277,9 @@ Repeat connection request? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. + Your connection was moved to %@ but an error happened when switching profile. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff index 52ba64a4ac..8ef196c621 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -588,6 +588,7 @@ swipe action Accept contact request + Aceptar petición de contacto alert title @@ -648,6 +649,7 @@ swipe action Add message + Añadir mensaje placeholder for sending contact request @@ -1396,6 +1398,7 @@ swipe action Can't change profile + No se puede cambiar el perfil alert title @@ -1623,6 +1626,7 @@ set passcode view Chat with members before they join. + Chat con miembros antes de unirse. No comment provided by engineer. @@ -1862,6 +1866,7 @@ set passcode view Connect faster! 🚀 + ¡Conecta más rápido! 🚀 No comment provided by engineer. @@ -2952,6 +2957,7 @@ chat item action Empty message! + ¡Mensaje vacío! No comment provided by engineer. @@ -3194,10 +3200,6 @@ chat item action Error al aceptar el miembro alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) Error al añadir miembro(s) @@ -3220,6 +3222,7 @@ chat item action Error changing chat profile + Error al cambiar perfil de chat alert title @@ -3392,12 +3395,9 @@ chat item action Error al abrir chat No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group + Error al abrir el grupo No comment provided by engineer. @@ -3422,6 +3422,7 @@ chat item action Error rejecting contact request + Error al rechazar la solicitud del contacto alert title @@ -3912,7 +3913,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - El servidor de reenvío %@ no ha podido conectarse al servidor de destino %@. Por favor, intentalo más tarde. + El servidor de reenvío %1$@ no ha podido conectarse al servidor de destino %2$@. Por favor, intentalo más tarde. alert message @@ -4683,6 +4684,7 @@ This is your link for group %@! Less traffic on mobile networks. + Menos tráfico en redes móviles. No comment provided by engineer. @@ -4740,6 +4742,10 @@ This is your link for group %@! Mensajes en vivo No comment provided by engineer. + + Loading profile… + in progress text + Local name Nombre local @@ -4937,6 +4943,7 @@ This is your link for group %@! Message instantly once you tap Connect. + Mensajea ya tras pulsar Contactar. No comment provided by engineer. @@ -5016,6 +5023,7 @@ This is your link for group %@! Messages are protected by **end-to-end encryption**. + Los mensajes están protegidos mediante **cifrado de extremo a extremo**. No comment provided by engineer. @@ -5275,6 +5283,7 @@ This is your link for group %@! New group role: Moderator + Nuevo rol de grupo: Moderador No comment provided by engineer. @@ -5424,6 +5433,7 @@ This is your link for group %@! No private routing session + Ninguna sesión con enrutamiento privado alert title @@ -5708,22 +5718,27 @@ Requiere activación de la VPN. Open new chat + Abrir chat nuevo new chat action Open new group + Abrir grupo nuevo new chat action Open to accept + Abrir para aceptar No comment provided by engineer. Open to connect + Abrir para conectar No comment provided by engineer. Open to join + Abrir para unirte No comment provided by engineer. @@ -6089,6 +6104,7 @@ Error: %@ Private routing timeout + Timeout enrutamiento privado alert title @@ -6121,8 +6137,9 @@ Error: %@ La actualización del perfil se enviará a tus contactos. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. + El perfil será compartido mediante la dirección de contacto. alert message @@ -6199,6 +6216,7 @@ Actívalo en ajustes de *Servidores y Redes*. Protocol background timeout + Timeout protocolo en segundo plano No comment provided by engineer. @@ -6490,6 +6508,7 @@ swipe action Removes messages and blocks members. + Eliminar mensajes y bloquear miembros. No comment provided by engineer. @@ -6674,6 +6693,7 @@ swipe action Review group members + Revisar miembros del grupo No comment provided by engineer. @@ -6979,6 +6999,7 @@ chat item action Send contact request? + ¿Enviar solicitud de contacto? No comment provided by engineer. @@ -7048,10 +7069,12 @@ chat item action Send request + Enviar solicitud No comment provided by engineer. Send request without message + Enviar solicitud sin mensaje No comment provided by engineer. @@ -7066,6 +7089,7 @@ chat item action Send your private feedback to groups. + Envía tu comentario privado a los grupos. No comment provided by engineer. @@ -7160,6 +7184,7 @@ chat item action Sent to your contact after connection. + Enviado a tu contacto tras la conexión. No comment provided by engineer. @@ -7385,6 +7410,7 @@ chat item action Share group profile via link + Compartir perfil de grupo mediante enlace No comment provided by engineer. @@ -7397,8 +7423,9 @@ chat item action Perfil a compartir alert button - - Share profile via link + + Share profile with address + Compartir perfil mediante enlace alert title @@ -7786,6 +7813,7 @@ report reason TCP connection bg timeout + Timeout conexión TCP sp No comment provided by engineer. @@ -8219,6 +8247,7 @@ Se te pedirá que completes la autenticación antes de activar esta función. To use another profile after connection attempt, delete the chat and use the link again. + Para usar otro perfil tras el intento de conexión, elimina el chat y usa el enlace de nuevo. alert message @@ -9149,6 +9178,7 @@ Repeat connection request? You will be able to send messages **only after your request is accepted**. + Podrás enviar mensajes **después de que tu solicitud sea aceptada**. No comment provided by engineer. @@ -9243,10 +9273,11 @@ Repeat connection request? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. + Tu chat ha sido movido a %@ pero ha ocurrido un error inesperado mientras se te redirigía al perfil. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. Tu conexión ha sido trasladada a %@ pero ha ocurrido un error inesperado al redirigirte al perfil. No comment provided by engineer. @@ -9633,6 +9664,7 @@ marked deleted chat item preview text contact should accept… + el contacto debe aceptar… No comment provided by engineer. @@ -9803,6 +9835,7 @@ pref value group + grupo shown on group welcome message @@ -10135,6 +10168,7 @@ time to disappear request is sent + petición enviada No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index d320b429cb..0a35d00e70 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -2902,10 +2902,6 @@ chat item action Error accepting member alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) Virhe lisättäessä jäseniä @@ -3084,12 +3080,8 @@ chat item action Error opening chat No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group No comment provided by engineer. @@ -4315,6 +4307,10 @@ This is your link for group %@! Live-viestit No comment provided by engineer. + + Loading profile… + in progress text + Local name Paikallinen nimi @@ -5559,8 +5555,8 @@ Error: %@ Profiilipäivitys lähetetään kontakteillesi. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. alert message @@ -6721,8 +6717,8 @@ chat item action Share profile alert button - - Share profile via link + + Share profile with address alert title @@ -8396,8 +8392,8 @@ Repeat connection request? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff index 053dc803fb..10df7eaaa4 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -3183,10 +3183,6 @@ chat item action Error accepting member alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) Erreur lors de l'ajout de membre·s @@ -3379,12 +3375,8 @@ chat item action Erreur lors de l'ouverture du chat No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group No comment provided by engineer. @@ -3897,7 +3889,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - Le serveur de redirection %@ n'a pas réussi à se connecter au serveur de destination %@. Veuillez réessayer plus tard. + Le serveur de redirection %1$@ n'a pas réussi à se connecter au serveur de destination %2$@. Veuillez réessayer plus tard. alert message @@ -4710,6 +4702,10 @@ Voici votre lien pour le groupe %@ ! Messages dynamiques No comment provided by engineer. + + Loading profile… + in progress text + Local name Nom local @@ -6060,8 +6056,8 @@ Erreur : %@ La mise à jour du profil sera envoyée à vos contacts. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. alert message @@ -7310,8 +7306,8 @@ chat item action Partager le profil alert button - - Share profile via link + + Share profile with address alert title @@ -9141,8 +9137,8 @@ Répéter la demande de connexion ? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. Votre connexion a été déplacée vers %@ mais une erreur inattendue s'est produite lors de la redirection vers le profil. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index 9fba98af31..04cc68839f 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -1626,6 +1626,7 @@ set passcode view Chat with members before they join. + Csevegés a tagokkal mielőtt csatlakoznának. No comment provided by engineer. @@ -1865,6 +1866,7 @@ set passcode view Connect faster! 🚀 + Gyorsabb kapcsolódás! 🚀 No comment provided by engineer. @@ -3198,11 +3200,6 @@ chat item action Hiba a tag befogadásakor alert title - - Error adding address short link - Hiba a rövid címhivatkozás hozzáadásakor - No comment provided by engineer. - Error adding member(s) Hiba történt a tag(ok) hozzáadásakor @@ -3398,13 +3395,8 @@ chat item action Hiba történt a csevegés megnyitásakor No comment provided by engineer. - - Error preparing contact - Hiba a kapcsolat előkészítésekor - No comment provided by engineer. - - - Error preparing group + + Error opening group Hiba a csoport előkészítésekor No comment provided by engineer. @@ -3921,7 +3913,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - A(z) %@ továbbítókiszolgáló nem tudott kapcsolódni a(z) %@ célkiszolgálóhoz. Próbálja meg később. + A(z) %1$@ továbbítókiszolgáló nem tudott kapcsolódni a(z) %2$@ célkiszolgálóhoz. Próbálja meg később. alert message @@ -4692,6 +4684,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Less traffic on mobile networks. + Kevesebb adatforgalom a mobilhálózatokon. No comment provided by engineer. @@ -4749,6 +4742,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Élő üzenetek No comment provided by engineer. + + Loading profile… + in progress text + Local name Helyi név @@ -4946,6 +4943,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Message instantly once you tap Connect. + Az üzenet azonnal megjelenik, amint a kapcsolódás gombra koppint. No comment provided by engineer. @@ -5285,6 +5283,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! New group role: Moderator + Új szerepkör: Moderátor No comment provided by engineer. @@ -5434,6 +5433,7 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! No private routing session + Nincs privát útválasztási munkamenet alert title @@ -6104,6 +6104,7 @@ Hiba: %@ Private routing timeout + Privát útválasztás időtúllépése alert title @@ -6136,8 +6137,8 @@ Hiba: %@ A profilfrissítés el lesz küldve a partnerei számára. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. A profil meg lesz osztva a címhivatkozáson keresztül. alert message @@ -6215,6 +6216,7 @@ Engedélyezze a *Hálózat és kiszolgálók* menüben. Protocol background timeout + Protokoll időtúllépése a háttérben No comment provided by engineer. @@ -6506,6 +6508,7 @@ swipe action Removes messages and blocks members. + Üzenetek eltávolítása és a tagok tiltása. No comment provided by engineer. @@ -6690,6 +6693,7 @@ swipe action Review group members + Csoporttagok áttekintése No comment provided by engineer. @@ -7085,6 +7089,7 @@ chat item action Send your private feedback to groups. + Küldjön privát visszajelzést a csoportoknak. No comment provided by engineer. @@ -7418,8 +7423,8 @@ chat item action Profil megosztása alert button - - Share profile via link + + Share profile with address Profil megosztása hivatkozáson keresztül alert title @@ -7808,6 +7813,7 @@ report reason TCP connection bg timeout + TCP-kapcsolat időtúllépése a háttérben No comment provided by engineer. @@ -9270,8 +9276,8 @@ Repeat connection request? A csevegés át lett helyezve ide: %@, de egy váratlan hiba történt a profilra való átirányításkor. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. A kapcsolata át lett helyezve ide: %@, de egy váratlan hiba történt a profilra való átirányításkor. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff index 0db1dcf4c5..b058411553 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -1626,6 +1626,7 @@ set passcode view Chat with members before they join. + Chatta con i membri prima che si uniscano. No comment provided by engineer. @@ -1865,6 +1866,7 @@ set passcode view Connect faster! 🚀 + Connettiti più velocemente! 🚀 No comment provided by engineer. @@ -3198,11 +3200,6 @@ chat item action Errore di accettazione del membro alert title - - Error adding address short link - Errore di aggiunta del link breve dell'indirizzo - No comment provided by engineer. - Error adding member(s) Errore di aggiunta membro/i @@ -3398,13 +3395,8 @@ chat item action Errore di apertura della chat No comment provided by engineer. - - Error preparing contact - Errore di preparazione del contatto - No comment provided by engineer. - - - Error preparing group + + Error opening group Errore di preparazione del gruppo No comment provided by engineer. @@ -3921,7 +3913,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - Il server di inoltro %@ non è riuscito a connettersi al server di destinazione %@. Riprova più tardi. + Il server di inoltro %1$@ non è riuscito a connettersi al server di destinazione %2$@. Riprova più tardi. alert message @@ -4692,6 +4684,7 @@ Questo è il tuo link per il gruppo %@! Less traffic on mobile networks. + Meno traffico sulle reti mobili. No comment provided by engineer. @@ -4749,6 +4742,10 @@ Questo è il tuo link per il gruppo %@! Messaggi in diretta No comment provided by engineer. + + Loading profile… + in progress text + Local name Nome locale @@ -4826,7 +4823,7 @@ Questo è il tuo link per il gruppo %@! Member admission - Ammissione del membro + Ammissione dei membri No comment provided by engineer. @@ -4946,6 +4943,7 @@ Questo è il tuo link per il gruppo %@! Message instantly once you tap Connect. + Parla immediatamente appena tocchi "Connetti". No comment provided by engineer. @@ -5285,6 +5283,7 @@ Questo è il tuo link per il gruppo %@! New group role: Moderator + Nuovo ruolo nei gruppi: Moderatore No comment provided by engineer. @@ -5434,6 +5433,7 @@ Questo è il tuo link per il gruppo %@! No private routing session + Nessuna sessione di instradamento privato alert title @@ -6104,6 +6104,7 @@ Errore: %@ Private routing timeout + Scadenza dell'instradamento privato alert title @@ -6136,8 +6137,8 @@ Errore: %@ L'aggiornamento del profilo verrà inviato ai tuoi contatti. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. Il profilo verrà condiviso tramite il link dell'indirizzo. alert message @@ -6215,6 +6216,7 @@ Attivalo nelle impostazioni *Rete e server*. Protocol background timeout + Scadenza del protocollo in sec. piano No comment provided by engineer. @@ -6506,6 +6508,7 @@ swipe action Removes messages and blocks members. + Rimuove i messaggi e blocca i membri. No comment provided by engineer. @@ -6690,6 +6693,7 @@ swipe action Review group members + Revisiona i membri del gruppo No comment provided by engineer. @@ -7085,6 +7089,7 @@ chat item action Send your private feedback to groups. + Invia i tuoi commenti privati ai gruppi. No comment provided by engineer. @@ -7314,7 +7319,7 @@ chat item action Set member admission - Imposta l'ammissione del membro + Imposta l'ammissione dei membri No comment provided by engineer. @@ -7418,8 +7423,8 @@ chat item action Condividi il profilo alert button - - Share profile via link + + Share profile with address Condividi il profilo via link alert title @@ -7808,6 +7813,7 @@ report reason TCP connection bg timeout + Scadenza conness. TCP in sec. piano No comment provided by engineer. @@ -9270,8 +9276,8 @@ Ripetere la richiesta di connessione? La tua chat è stata spostata su %@ , ma si è verificato un errore imprevisto mentre venivi reindirizzato/a al profilo. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. La tua connessione è stata spostata a %@, ma si è verificato un errore imprevisto durante il reindirizzamento al profilo. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index 8378d9ce05..742375725c 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -2975,10 +2975,6 @@ chat item action Error accepting member alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) メンバー追加にエラー発生 @@ -3157,12 +3153,8 @@ chat item action Error opening chat No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group No comment provided by engineer. @@ -4388,6 +4380,10 @@ This is your link for group %@! ライブメッセージ No comment provided by engineer. + + Loading profile… + in progress text + Local name ローカルネーム @@ -5637,8 +5633,8 @@ Error: %@ 連絡先にプロフィール更新のお知らせが届きます。 alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. alert message @@ -6791,8 +6787,8 @@ chat item action Share profile alert button - - Share profile via link + + Share profile with address alert title @@ -8467,8 +8463,8 @@ Repeat connection request? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff index 275c521b05..f965b2fc50 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -394,8 +394,8 @@ - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). - faster and more stable. - - verbinding maken met [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! -- ontvangst bevestiging(tot 20 leden). + - verbinding maken met [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! +- ontvangst bevestiging(tot 20 leden). - sneller en stabieler. No comment provided by engineer. @@ -3193,10 +3193,6 @@ chat item action Fout bij het accepteren van lid alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) Fout bij het toevoegen van leden @@ -3390,12 +3386,8 @@ chat item action Fout bij het openen van de chat No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group No comment provided by engineer. @@ -3910,7 +3902,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - De doorstuurserver %@ kon geen verbinding maken met de bestemmingsserver %@. Probeer het later opnieuw. + De doorstuurserver %1$@ kon geen verbinding maken met de bestemmingsserver %2$@. Probeer het later opnieuw. alert message @@ -4737,6 +4729,10 @@ Dit is jouw link voor groep %@! Live berichten No comment provided by engineer. + + Loading profile… + in progress text + Local name Lokale naam @@ -5517,7 +5513,7 @@ Dit is jouw link voor groep %@! Now admins can: - delete members' messages. - disable members ("observer" role) - Nu kunnen beheerders: + Nu kunnen beheerders: - berichten van leden verwijderen. - schakel leden uit ("waarnemer" rol) No comment provided by engineer. @@ -6118,8 +6114,8 @@ Fout: %@ Profiel update wordt naar uw contacten verzonden. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. alert message @@ -7392,8 +7388,8 @@ chat item action Profiel delen alert button - - Share profile via link + + Share profile with address alert title @@ -9240,8 +9236,8 @@ Verbindingsverzoek herhalen? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. Uw verbinding is verplaatst naar %@, maar er is een onverwachte fout opgetreden tijdens het omleiden naar het profiel. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index e797362e5e..4b2f6e8f6b 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -3142,10 +3142,6 @@ chat item action Error accepting member alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) Błąd dodawania członka(ów) @@ -3333,12 +3329,8 @@ chat item action Błąd otwierania czatu No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group No comment provided by engineer. @@ -3833,7 +3825,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - Serwer przekazujący %@ nie mógł połączyć się z serwerem docelowym %@. Spróbuj ponownie później. + Serwer przekazujący %1$@ nie mógł połączyć się z serwerem docelowym %2$@. Spróbuj ponownie później. alert message @@ -4639,6 +4631,10 @@ To jest twój link do grupy %@! Wiadomości na żywo No comment provided by engineer. + + Loading profile… + in progress text + Local name Nazwa lokalna @@ -5966,8 +5962,8 @@ Błąd: %@ Aktualizacja profilu zostanie wysłana do Twoich kontaktów. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. alert message @@ -7208,8 +7204,8 @@ chat item action Udostępnij profil alert button - - Share profile via link + + Share profile with address alert title @@ -9008,8 +9004,8 @@ Powtórzyć prośbę połączenia? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. Twoje połączenie zostało przeniesione do %@, ale podczas przekierowywania do profilu wystąpił nieoczekiwany błąd. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index a47a619438..29e1b81936 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -588,6 +588,7 @@ swipe action Accept contact request + Принять запрос на соединение alert title @@ -668,6 +669,7 @@ swipe action Add short link + Добавить короткую ссылку No comment provided by engineer. @@ -1396,6 +1398,7 @@ swipe action Can't change profile + Нельзя поменять профиль alert title @@ -1623,6 +1626,7 @@ set passcode view Chat with members before they join. + Общайтесь с членами до того как принять их. No comment provided by engineer. @@ -1862,6 +1866,7 @@ set passcode view Connect faster! 🚀 + Соединяйтесь быстрее! 🚀 No comment provided by engineer. @@ -2952,6 +2957,7 @@ chat item action Empty message! + Пустое сообщение! No comment provided by engineer. @@ -3194,10 +3200,6 @@ chat item action Ошибка вступления члена группы alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) Ошибка при добавлении членов группы @@ -3210,6 +3212,7 @@ chat item action Error adding short link + Ошибка создания короткой ссылки No comment provided by engineer. @@ -3219,6 +3222,7 @@ chat item action Error changing chat profile + Ошибка изменения профиля alert title @@ -3388,15 +3392,12 @@ chat item action Error opening chat - Ошибка доступа к чату + Ошибка при открытии чата No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group + Ошибка при открытии группы No comment provided by engineer. @@ -3421,6 +3422,7 @@ chat item action Error rejecting contact request + Ошибка отклонения запроса alert title @@ -3911,7 +3913,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - Пересылающий сервер %@ не смог подключиться к серверу назначения %@. Попробуйте позже. + Пересылающий сервер %1$@ не смог подключиться к серверу назначения %2$@. Попробуйте позже. alert message @@ -4075,6 +4077,7 @@ Error: %2$@ Group profile was changed. If you save it, the updated profile will be sent to group members. + Профиль группы изменен. Если Вы сохраните его, новый профиль будет отправлен членам группы. alert message @@ -4680,6 +4683,7 @@ This is your link for group %@! Less traffic on mobile networks. + Меньше трафик в мобильных сетях. No comment provided by engineer. @@ -4737,6 +4741,10 @@ This is your link for group %@! "Живые" сообщения No comment provided by engineer. + + Loading profile… + in progress text + Local name Локальное имя @@ -4934,6 +4942,7 @@ This is your link for group %@! Message instantly once you tap Connect. + Отправляйте сообщения сразу после соединения. No comment provided by engineer. @@ -5013,6 +5022,7 @@ This is your link for group %@! Messages are protected by **end-to-end encryption**. + Сообщения защищены **end-to-end шифрованием**. No comment provided by engineer. @@ -5272,6 +5282,7 @@ This is your link for group %@! New group role: Moderator + Новая роль в группах: Модератор No comment provided by engineer. @@ -5421,6 +5432,7 @@ This is your link for group %@! No private routing session + Нет сессии конфиденциальной доставки alert title @@ -5705,22 +5717,27 @@ Requires compatible VPN. Open new chat + Открыть новый чат new chat action Open new group + Открыть новую группу new chat action Open to accept + Откройте чтобы принять No comment provided by engineer. Open to connect + Откройте чтобы соединиться No comment provided by engineer. Open to join + Откройте чтобы вступить No comment provided by engineer. @@ -6086,6 +6103,7 @@ Error: %@ Private routing timeout + Таймаут конфиденциальной доставки alert title @@ -6118,8 +6136,9 @@ Error: %@ Обновлённый профиль будет отправлен Вашим контактам. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. + Профиль будет добавлен в адрес. alert message @@ -6196,6 +6215,7 @@ Enable in *Network & servers* settings. Protocol background timeout + Фоновый таймаут протокола No comment provided by engineer. @@ -6487,6 +6507,7 @@ swipe action Removes messages and blocks members. + Может удалять сообщения и блокировать членов. No comment provided by engineer. @@ -6671,6 +6692,7 @@ swipe action Review group members + Одобрять членов группы No comment provided by engineer. @@ -6741,6 +6763,7 @@ chat item action Save (and notify members) + Сохранить (и уведомить членов) alert button @@ -6775,6 +6798,7 @@ chat item action Save group profile? + Сохранить профиль группы? alert title @@ -7064,6 +7088,7 @@ chat item action Send your private feedback to groups. + Отправляйте Ваши конфиденциальные предложения группе. No comment provided by engineer. @@ -7158,6 +7183,7 @@ chat item action Sent to your contact after connection. + Отправляется Вашему контакту после соединения. No comment provided by engineer. @@ -7383,6 +7409,7 @@ chat item action Share group profile via link + Добавить профиль группы в ссылку No comment provided by engineer. @@ -7395,8 +7422,9 @@ chat item action Поделиться профилем alert button - - Share profile via link + + Share profile with address + Добавить профиль к адресу alert title @@ -7784,6 +7812,7 @@ report reason TCP connection bg timeout + Фоновый таймаут TCP-соединения No comment provided by engineer. @@ -8217,6 +8246,7 @@ You will be prompted to complete authentication before this feature is enabled.< To use another profile after connection attempt, delete the chat and use the link again. + Чтобы использовать другой профиль после попытки соединения, удалите чат и используйте ссылку снова. alert message @@ -9147,6 +9177,7 @@ Repeat connection request? You will be able to send messages **only after your request is accepted**. + Вы сможете отправлять сообщения **только после того как Ваш запрос будет принят**. No comment provided by engineer. @@ -9243,8 +9274,8 @@ Repeat connection request? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. Соединение было перемещено на %@, но при смене профиля произошла неожиданная ошибка. No comment provided by engineer. @@ -9631,6 +9662,7 @@ marked deleted chat item preview text contact should accept… + контакт должен принять… No comment provided by engineer. @@ -9801,6 +9833,7 @@ pref value group + группа shown on group welcome message @@ -10133,6 +10166,7 @@ time to disappear request is sent + запрос отправлен No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index eb2ca322a9..01f1f121f0 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -2888,10 +2888,6 @@ chat item action Error accepting member alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) เกิดข้อผิดพลาดในการเพิ่มสมาชิก @@ -3069,12 +3065,8 @@ chat item action Error opening chat No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group No comment provided by engineer. @@ -4298,6 +4290,10 @@ This is your link for group %@! ข้อความสด No comment provided by engineer. + + Loading profile… + in progress text + Local name ชื่อภายในเครื่องเท่านั้น @@ -5538,8 +5534,8 @@ Error: %@ การอัปเดตโปรไฟล์จะถูกส่งไปยังผู้ติดต่อของคุณ alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. alert message @@ -6696,8 +6692,8 @@ chat item action Share profile alert button - - Share profile via link + + Share profile with address alert title @@ -8365,8 +8361,8 @@ Repeat connection request? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff index 9bb5df2ac6..ede5499f57 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -588,6 +588,7 @@ swipe action Accept contact request + Kişi isteğini kabul et alert title @@ -613,7 +614,7 @@ swipe action Acknowledged - Onaylandı + Onaylı No comment provided by engineer. @@ -648,6 +649,7 @@ swipe action Add message + Mesaj ekle placeholder for sending contact request @@ -667,6 +669,7 @@ swipe action Add short link + Kısa bağlantı ekle No comment provided by engineer. @@ -776,6 +779,7 @@ swipe action All chats will be removed from the list %@, and the list deleted. + Tüm sohbetler %@ listesinden kaldırılacak ve liste silinecek. alert message @@ -820,10 +824,12 @@ swipe action All reports will be archived for you. + Tüm raporlar sizin için arşivlenecek. No comment provided by engineer. All servers + Tüm sunucular No comment provided by engineer. @@ -903,6 +909,7 @@ swipe action Allow to report messsages to moderators. + Mesajları moderatörlere bildirmeye izin ver. No comment provided by engineer. @@ -987,6 +994,7 @@ swipe action Another reason + Başka bir sebep report reason @@ -1016,6 +1024,7 @@ swipe action App group: + Uygulama grubu: No comment provided by engineer. @@ -1065,14 +1074,17 @@ swipe action Archive + Arşivle No comment provided by engineer. Archive %lld reports? + %lld raporu arşivle? No comment provided by engineer. Archive all reports? + Tüm raporlar arşivlensin mi? No comment provided by engineer. @@ -1087,14 +1099,17 @@ swipe action Archive report + Raporu arşivle No comment provided by engineer. Archive report? + Rapor arşivlensin mi? No comment provided by engineer. Archive reports + Raporları arşivle swipe action @@ -1204,6 +1219,7 @@ swipe action Better groups performance + Daha iyi grup performansı No comment provided by engineer. @@ -1228,6 +1244,7 @@ swipe action Better privacy and security + Daha iyi gizlilik ve güvenlik No comment provided by engineer. @@ -1332,6 +1349,7 @@ swipe action Businesses + İşletmeler No comment provided by engineer. @@ -1343,6 +1361,9 @@ swipe action By using SimpleX Chat you agree to: - send only legal content in public groups. - respect other users – no spam. + SimpleX Chat'i kullanarak şunları kabul etmiş olursunuz: +- herkese açık gruplarda yalnızca yasal içerik göndermek. +- diğer kullanıcılara saygı göstermek – spam yapmamak. No comment provided by engineer. @@ -1377,6 +1398,7 @@ swipe action Can't change profile + Profil değiştirilemiyor alert title @@ -1438,6 +1460,7 @@ new chat action Change automatic message deletion? + Otomatik mesaj silme değiştirilsin mi? alert title @@ -1593,14 +1616,17 @@ set passcode view Chat with admins + Yöneticilerle sohbet et chat toolbar Chat with member + Üye ile sohbet et No comment provided by engineer. Chat with members before they join. + Üyeler katılmadan önce onlarla sohbet edin. No comment provided by engineer. @@ -1610,6 +1636,7 @@ set passcode view Chats with members + Üyelerle sohbetler No comment provided by engineer. @@ -1679,10 +1706,12 @@ set passcode view Clear group? + Grup temizlensin mi? No comment provided by engineer. Clear or delete group? + Grup temizlensin veya silinsin mi? No comment provided by engineer. @@ -1707,6 +1736,7 @@ set passcode view Community guidelines violation + Topluluk kurallarının ihlali report reason @@ -1766,6 +1796,7 @@ set passcode view Configure server operators + Sunucu operatörlerini yapılandır No comment provided by engineer. @@ -1820,6 +1851,7 @@ set passcode view Confirmed + Onaylandı token status text @@ -1834,6 +1866,7 @@ set passcode view Connect faster! 🚀 + Daha hızlı bağlanın! 🚀 No comment provided by engineer. @@ -1937,6 +1970,7 @@ Bu senin kendi tek kullanımlık bağlantın! Connection blocked + Bağlantı engellendi No comment provided by engineer. @@ -1952,10 +1986,13 @@ Bu senin kendi tek kullanımlık bağlantın! Connection is blocked by server operator: %@ + Bağlantı sunucu operatörü tarafından engellendi: +%@ No comment provided by engineer. Connection not ready. + Bağlantı hazır değil. No comment provided by engineer. @@ -1970,6 +2007,7 @@ Bu senin kendi tek kullanımlık bağlantın! Connection requires encryption renegotiation. + Bağlantı için şifreleme yeniden görüşmesi gerekiyor. No comment provided by engineer. @@ -2054,6 +2092,7 @@ Bu senin kendi tek kullanımlık bağlantın! Content violates conditions of use + İçerik kullanım koşullarını ihlal ediyor blocking reason @@ -2133,6 +2172,7 @@ Bu senin kendi tek kullanımlık bağlantın! Create list + Liste oluştur No comment provided by engineer. @@ -2391,6 +2431,7 @@ swipe action Delete chat messages from your device. + Sohbet mesajlarını cihazınızdan silin. No comment provided by engineer. @@ -2405,6 +2446,7 @@ swipe action Delete chat with member? + Üye ile sohbet silinsin mi? alert title @@ -2489,6 +2531,7 @@ swipe action Delete list? + Liste silinsin mi? alert title @@ -2543,6 +2586,7 @@ swipe action Delete report + Raporu sil No comment provided by engineer. @@ -2582,6 +2626,7 @@ swipe action Delivered even when Apple drops them. + Apple tarafından düşürülse bile teslim edilir. No comment provided by engineer. @@ -2706,10 +2751,12 @@ swipe action Disable automatic message deletion? + Otomatik mesaj silme devre dışı bırakılsın mı? alert title Disable delete messages + Mesaj silmeyi devre dışı bırak alert button @@ -2804,6 +2851,7 @@ swipe action Documents: + Belgeler: No comment provided by engineer. @@ -2818,6 +2866,7 @@ swipe action Don't miss important messages. + Önemli mesajları kaçırmayın. No comment provided by engineer. @@ -2827,6 +2876,7 @@ swipe action Done + Tamam No comment provided by engineer. @@ -2907,6 +2957,7 @@ chat item action Empty message! + Boş mesaj! No comment provided by engineer. @@ -2921,6 +2972,7 @@ chat item action Enable Flux in Network & servers settings for better metadata privacy. + Daha iyi meta veri gizliliği için Ağ & sunucu ayarlarında Flux'u etkinleştirin. No comment provided by engineer. @@ -3065,6 +3117,7 @@ chat item action Encryption renegotiation in progress. + Şifreleme yeniden görüşmesi devam ediyor. No comment provided by engineer. @@ -3144,12 +3197,9 @@ chat item action Error accepting member + Üyeyi kabul etme hatası alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) Üye(ler) eklenirken hata oluştu @@ -3162,6 +3212,7 @@ chat item action Error adding short link + Kısa bağlantı ekleme hatası No comment provided by engineer. @@ -3171,6 +3222,7 @@ chat item action Error changing chat profile + Sohbet profilini değiştirme hatası alert title @@ -3195,6 +3247,7 @@ chat item action Error checking token status + Jeton durumu kontrol hatası No comment provided by engineer. @@ -3219,6 +3272,7 @@ chat item action Error creating list + Liste oluşturma hatası alert title @@ -3238,6 +3292,7 @@ chat item action Error creating report + Rapor oluşturma hatası No comment provided by engineer. @@ -3252,6 +3307,7 @@ chat item action Error deleting chat with member + Üye ile sohbet silme hatası alert title @@ -3336,15 +3392,12 @@ chat item action Error opening chat - Sohbeti açarken sorun oluştu + Kişiyi hazırlama hatası No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group + Grubu hazırlama hatası No comment provided by engineer. @@ -3364,10 +3417,12 @@ chat item action Error registering for notifications + Bildirimler için kayıt hatası alert title Error rejecting contact request + Kişi isteğini reddetme hatası alert title @@ -3377,6 +3432,7 @@ chat item action Error reordering lists + Listeleri yeniden sıralama hatası alert title @@ -3391,6 +3447,7 @@ chat item action Error saving chat list + Sohbet listesini kaydetme hatası alert title @@ -3475,6 +3532,7 @@ chat item action Error testing server connection + Sunucu bağlantısını test etme hatası No comment provided by engineer. @@ -3561,6 +3619,7 @@ snd error text Expired + Süresi dolmuş token status text @@ -3605,6 +3664,7 @@ snd error text Faster deletion of groups. + Grupların daha hızlı silinmesi. No comment provided by engineer. @@ -3614,6 +3674,7 @@ snd error text Faster sending messages. + Mesajların daha hızlı gönderilmesi. No comment provided by engineer. @@ -3623,6 +3684,7 @@ snd error text Favorites + Favoriler No comment provided by engineer. @@ -3640,6 +3702,8 @@ snd error text File is blocked by server operator: %@. + Dosya sunucu operatörü tarafından engellendi: +%@. file error text @@ -3769,6 +3833,7 @@ snd error text For all moderators + Tüm moderatörler için No comment provided by engineer. @@ -3788,6 +3853,7 @@ snd error text For me + Benim için No comment provided by engineer. @@ -3847,7 +3913,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - Yönlendirme sunucusu %@, hedef sunucu %@'ya bağlanamadı. Lütfen daha sonra deneyin. + Yönlendirme sunucusu %1$@, hedef sunucu %2$@'ya bağlanamadı. Lütfen daha sonra deneyin. alert message @@ -3916,6 +3982,7 @@ Hata: %2$@ Get notified when mentioned. + Bahsedildiğinde bildirim alın. No comment provided by engineer. @@ -4010,6 +4077,7 @@ Hata: %2$@ Group profile was changed. If you save it, the updated profile will be sent to group members. + Grup profili değiştirildi. Eğer kaydederseniz, güncellenmiş profil grup üyelerine gönderilecektir. alert message @@ -4029,6 +4097,7 @@ Hata: %2$@ Groups + Gruplar No comment provided by engineer. @@ -4038,6 +4107,7 @@ Hata: %2$@ Help admins moderating their groups. + Yöneticilere gruplarını yönetmelerinde yardımcı olun. No comment provided by engineer. @@ -4102,6 +4172,7 @@ Hata: %2$@ How it works + Nasıl çalışır alert button @@ -4248,10 +4319,12 @@ Daha fazla iyileştirme yakında geliyor! Inappropriate content + Uygunsuz içerik report reason Inappropriate profile + Uygunsuz profil report reason @@ -4348,22 +4421,27 @@ Daha fazla iyileştirme yakında geliyor! Invalid + Geçersiz token status text Invalid (bad token) + Geçersiz (kötü jeton) token status text Invalid (expired) + Geçersiz (süresi dolmuş) token status text Invalid (unregistered) + Geçersiz (kayıtlı değil) token status text Invalid (wrong topic) + Geçersiz (yanlış konu) token status text @@ -4606,6 +4684,7 @@ Bu senin grup için bağlantın %@! Less traffic on mobile networks. + Mobil ağlarda daha az trafik. No comment provided by engineer. @@ -4640,14 +4719,17 @@ Bu senin grup için bağlantın %@! List + Liste swipe action List name and emoji should be different for all lists. + Liste adı ve emojisi tüm listeler için farklı olmalıdır. No comment provided by engineer. List name... + Liste adı... No comment provided by engineer. @@ -4660,6 +4742,10 @@ Bu senin grup için bağlantın %@! Canlı mesajlar No comment provided by engineer. + + Loading profile… + in progress text + Local name Yerel isim @@ -4737,6 +4823,7 @@ Bu senin grup için bağlantın %@! Member admission + Üye kabulü No comment provided by engineer. @@ -4746,6 +4833,7 @@ Bu senin grup için bağlantın %@! Member reports + Üye raporları chat feature @@ -4765,6 +4853,7 @@ Bu senin grup için bağlantın %@! Member will be removed from chat - this cannot be undone! + Üye sohbetten kaldırılacak - bu geri alınamaz! No comment provided by engineer. @@ -4774,6 +4863,7 @@ Bu senin grup için bağlantın %@! Member will join the group, accept member? + Üye gruba katılacak, kabul edilsin mi? alert message @@ -4788,6 +4878,7 @@ Bu senin grup için bağlantın %@! Members can report messsages to moderators. + Üyeler mesajları moderatörlere bildirebilir. No comment provided by engineer. @@ -4817,6 +4908,7 @@ Bu senin grup için bağlantın %@! Mention members 👋 + Üyeleri belirtin 👋 No comment provided by engineer. @@ -4851,6 +4943,7 @@ Bu senin grup için bağlantın %@! Message instantly once you tap Connect. + Bağlan'a dokunduğunuzda hemen mesaj gönderin. No comment provided by engineer. @@ -4930,6 +5023,7 @@ Bu senin grup için bağlantın %@! Messages are protected by **end-to-end encryption**. + Mesajlar **uçtan uca şifreleme** ile korunmaktadır. No comment provided by engineer. @@ -4939,6 +5033,7 @@ Bu senin grup için bağlantın %@! Messages in this chat will never be deleted. + Bu sohbetteki mesajlar asla silinmeyecek. alert message @@ -5043,6 +5138,7 @@ Bu senin grup için bağlantın %@! More + Daha fazla swipe action @@ -5057,6 +5153,7 @@ Bu senin grup için bağlantın %@! More reliable notifications + Daha güvenilir bildirimler No comment provided by engineer. @@ -5076,6 +5173,7 @@ Bu senin grup için bağlantın %@! Mute all + Tümünü sessize al notification label action @@ -5100,6 +5198,7 @@ Bu senin grup için bağlantın %@! Network decentralization + Ağ merkeziyetsizliği No comment provided by engineer. @@ -5114,6 +5213,7 @@ Bu senin grup için bağlantın %@! Network operator + Ağ operatörü No comment provided by engineer. @@ -5128,6 +5228,7 @@ Bu senin grup için bağlantın %@! New + Yeni token status text @@ -5177,10 +5278,12 @@ Bu senin grup için bağlantın %@! New events + Yeni etkinlikler notification New group role: Moderator + Yeni grup rolü: Moderatör No comment provided by engineer. @@ -5200,6 +5303,7 @@ Bu senin grup için bağlantın %@! New member wants to join the group. + Yeni üye gruba katılmak istiyor. rcv group event chat item @@ -5214,6 +5318,7 @@ Bu senin grup için bağlantın %@! New server + Yeni sunucu No comment provided by engineer. @@ -5228,18 +5333,22 @@ Bu senin grup için bağlantın %@! No chats + Hiç sohbet yok No comment provided by engineer. No chats found + Hiç sohbet bulunamadı No comment provided by engineer. No chats in list %@ + Listede hiç sohbet yok %@ No comment provided by engineer. No chats with members + Üyelerle hiç sohbet yok No comment provided by engineer. @@ -5289,14 +5398,17 @@ Bu senin grup için bağlantın %@! No media & file servers. + Hiç medya & dosya sunucusu yok. servers error No message + Mesaj yok No comment provided by engineer. No message servers. + Hiç mesaj sunucusu yok. servers error @@ -5321,6 +5433,7 @@ Bu senin grup için bağlantın %@! No private routing session + Özel yönlendirme oturumu yok alert title @@ -5335,26 +5448,32 @@ Bu senin grup için bağlantın %@! No servers for private message routing. + Özel mesaj yönlendirmesi için hiç sunucu yok. servers error No servers to receive files. + Dosya almak için hiç sunucu yok. servers error No servers to receive messages. + Mesaj almak için hiç sunucu yok. servers error No servers to send files. + Dosya göndermek için hiç sunucu yok. servers error No token! + Hiç jeton yok! alert title No unread chats + Okunmamış sohbet yok No comment provided by engineer. @@ -5369,6 +5488,7 @@ Bu senin grup için bağlantın %@! Notes + Notlar No comment provided by engineer. @@ -5393,14 +5513,17 @@ Bu senin grup için bağlantın %@! Notifications error + Bildirim hatası alert title Notifications privacy + Bildirim gizliliği No comment provided by engineer. Notifications status + Bildirim durumu alert title @@ -5460,6 +5583,7 @@ VPN'nin etkinleştirilmesi gerekir. Only chat owners can change preferences. + Yalnızca sohbet sahipleri tercihleri değiştirebilir. No comment provided by engineer. @@ -5489,10 +5613,12 @@ VPN'nin etkinleştirilmesi gerekir. Only sender and moderators see it + Sadece gönderici ve moderatörler görür No comment provided by engineer. Only you and moderators see it + Sadece siz ve moderatörler görür No comment provided by engineer. @@ -5557,6 +5683,7 @@ VPN'nin etkinleştirilmesi gerekir. Open changes + Açık değişiklikler No comment provided by engineer. @@ -5571,6 +5698,7 @@ VPN'nin etkinleştirilmesi gerekir. Open conditions + Açık koşullar No comment provided by engineer. @@ -5580,6 +5708,7 @@ VPN'nin etkinleştirilmesi gerekir. Open link? + Bağlantıyı aç? alert title @@ -5589,22 +5718,27 @@ VPN'nin etkinleştirilmesi gerekir. Open new chat + Yeni sohbet aç new chat action Open new group + Yeni grup aç new chat action Open to accept + Kabul etmek için aç No comment provided by engineer. Open to connect + Bağlanmak için aç No comment provided by engineer. Open to join + Katılmak için aç No comment provided by engineer. @@ -5614,14 +5748,17 @@ VPN'nin etkinleştirilmesi gerekir. Operator + Operatör No comment provided by engineer. Operator server + Operatör sunucusu alert title Or import archive file + Veya arşiv dosyasını içe aktar No comment provided by engineer. @@ -5646,10 +5783,12 @@ VPN'nin etkinleştirilmesi gerekir. Or to share privately + Veya özel olarak paylaşmak için No comment provided by engineer. Organize chats into lists + Sohbetleri listelere ayır No comment provided by engineer. @@ -5845,18 +5984,22 @@ Hata: %@ Please try to disable and re-enable notfications. + Lütfen bildirimleri devre dışı bırakmayı ve yeniden etkinleştirmeyi deneyin. token info Please wait for group moderators to review your request to join the group. + Lütfen grup moderatörlerinin gruba katılma isteğinizi incelemesini bekleyin. snd group event chat item Please wait for token activation to complete. + Lütfen jeton aktivasyonunun tamamlanmasını bekleyin. token info Please wait for token to be registered. + Lütfen jeton kaydedilene kadar bekleyin. token info @@ -5886,6 +6029,7 @@ Hata: %@ Preset servers + Ön ayar sunucuları No comment provided by engineer. @@ -5905,10 +6049,12 @@ Hata: %@ Privacy for your customers. + Müşterileriniz için gizlilik. No comment provided by engineer. Privacy policy and conditions of use. + Gizlilik politikası ve kullanım koşulları. No comment provided by engineer. @@ -5918,6 +6064,7 @@ Hata: %@ Private chats, groups and your contacts are not accessible to server operators. + Özel sohbetler, gruplar ve kişilerinize sunucu operatörleri tarafından erişilemez. No comment provided by engineer. @@ -5927,6 +6074,7 @@ Hata: %@ Private media file names. + Özel medya dosyası adları. No comment provided by engineer. @@ -5956,6 +6104,7 @@ Hata: %@ Private routing timeout + Özel yönlendirme zaman aşımı alert title @@ -5988,8 +6137,9 @@ Hata: %@ Profil güncellemesi kişilerinize gönderilecektir. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. + Profil adres bağlantısı aracılığıyla paylaşılacaktır. alert message @@ -6014,6 +6164,7 @@ Hata: %@ Prohibit reporting messages to moderators. + Mesajları moderatörlere bildirmeyi yasakla. No comment provided by engineer. @@ -6065,6 +6216,7 @@ Enable in *Network & servers* settings. Protocol background timeout + Protokol arka plan zaman aşımı No comment provided by engineer. @@ -6154,7 +6306,7 @@ Enable in *Network & servers* settings. Receipts are disabled - Alıcılar devre dışı bırakıldı + Alındı onayları devre dışı bırakıldı No comment provided by engineer. @@ -6279,14 +6431,17 @@ Enable in *Network & servers* settings. Register + Kaydol No comment provided by engineer. Register notification token? + Bildirim jetonunu kaydet? token info Registered + Kayıtlı token status text @@ -6308,6 +6463,7 @@ swipe action Reject member? + Üyeyi reddet? alert title @@ -6352,6 +6508,7 @@ swipe action Removes messages and blocks members. + Mesajları kaldırır ve üyeleri engeller. No comment provided by engineer. @@ -6391,46 +6548,57 @@ swipe action Report + Rapor et chat item action Report content: only group moderators will see it. + İçeriği rapor et: sadece grup moderatörleri görecek. report reason Report member profile: only group moderators will see it. + Üye profilini rapor et: sadece grup moderatörleri görecek. report reason Report other: only group moderators will see it. + Diğerini rapor et: sadece grup moderatörleri görecek. report reason Report reason? + Rapor nedeni? No comment provided by engineer. Report sent to moderators + Rapor moderatörlere gönderildi alert title Report spam: only group moderators will see it. + Spam rapor et: sadece grup moderatörleri görecek. report reason Report violation: only group moderators will see it. + İhlali rapor et: sadece grup moderatörleri görecek. report reason Report: %@ + Rapor: %@ report in notification Reporting messages to moderators is prohibited. + Mesajları moderatörlere bildirmek yasaktır. No comment provided by engineer. Reports + Raporlar No comment provided by engineer. @@ -6520,18 +6688,22 @@ swipe action Review conditions + Koşulları gözden geçir No comment provided by engineer. Review group members + Grup üyelerini gözden geçir No comment provided by engineer. Review members + Üyeleri gözden geçir admission stage Review members before admitting ("knocking"). + Üyeleri kabul etmeden önce gözden geçir ("kapı çalma"). admission stage description @@ -6592,10 +6764,12 @@ chat item action Save (and notify members) + Kaydet (ve üyelere bildir) alert button Save admission settings? + Kabul ayarlarını kaydet? alert title @@ -6625,10 +6799,12 @@ chat item action Save group profile? + Grup profilini kaydet? alert title Save list + Listeyi kaydet No comment provided by engineer. @@ -6823,6 +6999,7 @@ chat item action Send contact request? + Kişi isteği gönderilsin mi? No comment provided by engineer. @@ -6877,6 +7054,7 @@ chat item action Send private reports + Özel raporlar gönder No comment provided by engineer. @@ -6891,10 +7069,12 @@ chat item action Send request + İstek gönder No comment provided by engineer. Send request without message + Mesaj olmadan istek gönder No comment provided by engineer. @@ -6909,6 +7089,7 @@ chat item action Send your private feedback to groups. + Özel geri bildiriminizi gruplara gönderin. No comment provided by engineer. @@ -6928,7 +7109,7 @@ chat item action Sending delivery receipts will be enabled for all contacts. - Tüm kişiler için iletim bilgisi gönderme özelliği etkinleştirilecek. + Tüm kişiler için alındı bilgisi gönderme özelliği etkinleştirilecek. No comment provided by engineer. @@ -7003,6 +7184,7 @@ chat item action Sent to your contact after connection. + Bağlantıdan sonra kişinize gönderildi. No comment provided by engineer. @@ -7022,6 +7204,7 @@ chat item action Server added to operator %@. + Sunucu operatör %@'ya eklendi. alert message @@ -7041,14 +7224,17 @@ chat item action Server operator changed. + Sunucu operatörü değişti. alert title Server operators + Sunucu operatörleri No comment provided by engineer. Server protocol changed. + Sunucu protokolü değişti. alert title @@ -7108,6 +7294,7 @@ chat item action Set chat name… + Sohbet adını belirle… No comment provided by engineer. @@ -7132,10 +7319,12 @@ chat item action Set member admission + Üye kabulünü ayarla No comment provided by engineer. Set message expiration in chats. + Sohbetlerde mesajın sonlanma süresini ayarla. No comment provided by engineer. @@ -7191,10 +7380,12 @@ chat item action Share 1-time link with a friend + Arkadaşınızla 1 defaya mahsus bağlantı paylaşın No comment provided by engineer. Share SimpleX address on social media. + SimpleX adresini sosyal medyada paylaşın. No comment provided by engineer. @@ -7204,6 +7395,7 @@ chat item action Share address publicly + Adresinizi herkese açık olarak paylaşın No comment provided by engineer. @@ -7218,6 +7410,7 @@ chat item action Share group profile via link + Grup profilini bağlantı aracılığıyla paylaş No comment provided by engineer. @@ -7230,8 +7423,9 @@ chat item action Profil paylaş alert button - - Share profile via link + + Share profile with address + Profili bağlantı aracılığıyla paylaş alert title @@ -7251,6 +7445,7 @@ chat item action Short link + Kısa bağlantı No comment provided by engineer. @@ -7310,6 +7505,7 @@ chat item action SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app. + SimpleX Chat ve Flux, Flux tarafından işletilen sunucuları uygulamaya dahil etmek için bir anlaşma yaptı. No comment provided by engineer. @@ -7344,10 +7540,12 @@ chat item action SimpleX address and 1-time links are safe to share via any messenger. + SimpleX adresi ve 1 defaya mahsus bağlantılar, herhangi bir mesajlaşma uygulaması aracılığıyla paylaşmak için güvenlidir. No comment provided by engineer. SimpleX address or 1-time link? + SimpleX adresi mi yoksa 1 defaya mahsus bağlantı mı? No comment provided by engineer. @@ -7357,6 +7555,7 @@ chat item action SimpleX channel link + SimpleX kanal bağlantısı simplex link type @@ -7452,6 +7651,8 @@ chat item action Some servers failed the test: %@ + Bazı sunucular testi geçemedi: +%@ alert message @@ -7461,6 +7662,7 @@ chat item action Spam + Spam blocking reason report reason @@ -7551,6 +7753,7 @@ report reason Storage + Depolama No comment provided by engineer. @@ -7610,6 +7813,7 @@ report reason TCP connection bg timeout + TCP bağlantı arka plan zaman aşımı No comment provided by engineer. @@ -7619,6 +7823,7 @@ report reason TCP port for messaging + Mesajlaşma için TCP portu No comment provided by engineer. @@ -7648,6 +7853,7 @@ report reason Tap Create SimpleX address in the menu to create it later. + Daha sonra oluşturmak için menüden BasitX adresi oluştur'a dokunun. No comment provided by engineer. @@ -7697,6 +7903,7 @@ report reason Test notifications + Bildirimleri test et No comment provided by engineer. @@ -7743,6 +7950,7 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. The app protects your privacy by using different operators in each conversation. + Uygulama, her sohbette farklı operatörler kullanarak gizliliğinizi korur. No comment provided by engineer. @@ -7762,6 +7970,7 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. The connection reached the limit of undelivered messages, your contact may be offline. + Bağlantı, teslim edilmemiş mesajlar limitine ulaştı, kişiniz çevrimdışı olabilir. No comment provided by engineer. @@ -7821,10 +8030,12 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. The same conditions will apply to operator **%@**. + Aynı koşullar operatör **%@** için de geçerli olacaktır. No comment provided by engineer. The second preset operator in the app! + Uygulamadaki ikinci ön ayar operatörü! No comment provided by engineer. @@ -7844,6 +8055,7 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. The servers for new files of your current chat profile **%@**. + Mevcut sohbet profiliniz için yeni dosyaların sunucuları **%@**. No comment provided by engineer. @@ -7863,6 +8075,7 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. These conditions will also apply for: **%@**. + Bu koşullar ayrıca şunlar için de geçerli olacaktır: **%@**. No comment provided by engineer. @@ -7887,6 +8100,7 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. This action cannot be undone - the messages sent and received in this chat earlier than selected will be deleted. + Bu işlem geri alınamaz - daha önce seçilen tarihten önceki bu sohbette gönderilen ve alınan mesajlar silinecektir. alert message @@ -7926,6 +8140,7 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. + Bu bağlantı daha yeni bir uygulama sürümü gerektiriyor. Lütfen uygulamayı güncelleyin veya kişinizden uyumlu bir bağlantı göndermesini isteyin. No comment provided by engineer. @@ -7935,6 +8150,7 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. This message was deleted or not received yet. + Bu mesaj silindi veya henüz alınmadı. No comment provided by engineer. @@ -7969,6 +8185,7 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. To protect against your link being replaced, you can compare contact security codes. + Bağlantınızın değiştirilmesine karşı korunmak için, kişi güvenlik kodlarını karşılaştırabilirsiniz. No comment provided by engineer. @@ -7995,6 +8212,7 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec To receive + Almak için No comment provided by engineer. @@ -8019,6 +8237,7 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec To send + Göndermek için No comment provided by engineer. @@ -8028,10 +8247,12 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec To use another profile after connection attempt, delete the chat and use the link again. + Bağlantı denemesinden sonra başka bir profili kullanmak için, sohbeti silin ve bağlantıyı tekrar kullanın. alert message To use the servers of **%@**, accept conditions of use. + **%@**'nın sunucularını kullanmak için, kullanım koşullarını kabul edin. No comment provided by engineer. @@ -8051,6 +8272,7 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec Token status: %@. + Jeton durumu: %@. token status @@ -8130,6 +8352,7 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec Undelivered messages + Teslim edilmemiş mesajlar No comment provided by engineer. @@ -8226,6 +8449,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Unsupported connection link + Desteklenmeyen bağlantı bağlantısı No comment provided by engineer. @@ -8255,6 +8479,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Updated conditions + Güncellenmiş koşullar No comment provided by engineer. @@ -8299,6 +8524,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Use %@ + %@ kullan No comment provided by engineer. @@ -8318,10 +8544,12 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Use TCP port %@ when no port is specified. + Port belirtilmediğinde TCP port %@ kullanın. No comment provided by engineer. Use TCP port 443 for preset servers only. + Sadece ön ayar sunucuları için TCP port 443 kullanın. No comment provided by engineer. @@ -8336,10 +8564,12 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Use for files + Dosyalar için kullan No comment provided by engineer. Use for messages + Mesajlar için kullan No comment provided by engineer. @@ -8384,6 +8614,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Use servers + Sunucuları kullan No comment provided by engineer. @@ -8398,6 +8629,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Use web port + Web portunu kullan No comment provided by engineer. @@ -8482,6 +8714,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste View conditions + Koşulları görüntüle No comment provided by engineer. @@ -8491,6 +8724,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste View updated conditions + Güncellenmiş koşulları görüntüle No comment provided by engineer. @@ -8605,6 +8839,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste When more than one operator is enabled, none of them has metadata to learn who communicates with whom. + Birden fazla operatör etkinleştirildiğinde, hiçbiri kimin kiminle iletişim kurduğunu öğrenmek için meta veriye sahip değildir. No comment provided by engineer. @@ -8704,6 +8939,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste You are already connected with %@. + Zaten %@ ile bağlantıdasınız. No comment provided by engineer. @@ -8765,6 +9001,7 @@ Katılma isteği tekrarlansın mı? You can configure servers via settings. + Sunucuları ayarlar aracılığıyla yapılandırabilirsiniz. No comment provided by engineer. @@ -8809,6 +9046,7 @@ Katılma isteği tekrarlansın mı? You can set connection name, to remember who the link was shared with. + Bağlantı adını ayarlayabilirsiniz, böylece bağlantının kiminle paylaşıldığını hatırlarsınız. No comment provided by engineer. @@ -8853,6 +9091,7 @@ Katılma isteği tekrarlansın mı? You can view your reports in Chat with admins. + Raporlarınızı Yöneticilerle Sohbet bölümünde görüntüleyebilirsiniz. alert message @@ -8934,10 +9173,12 @@ Bağlantı isteği tekrarlansın mı? You should receive notifications. + Bildirim almanız gerekiyor. token info You will be able to send messages **only after your request is accepted**. + Mesaj gönderebilmek için **isteğinizin kabul edilmesini beklemelisiniz**. No comment provided by engineer. @@ -8972,6 +9213,7 @@ Bağlantı isteği tekrarlansın mı? You will stop receiving messages from this chat. Chat history will be preserved. + Bu sohbetten mesaj almaya son vereceksiniz. Sohbet geçmişi korunacaktır. No comment provided by engineer. @@ -9031,10 +9273,11 @@ Bağlantı isteği tekrarlansın mı? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. + Sohbetiniz %@'ya taşındı ancak sizi profile yönlendirirken beklenmedik bir hata oluştu. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. Bağlantınız %@ adresine taşındı ancak sizi profile yönlendirirken beklenmedik bir hata oluştu. No comment provided by engineer. @@ -9115,6 +9358,7 @@ Bağlantı isteği tekrarlansın mı? Your servers + Sunucularınız No comment provided by engineer. @@ -9154,6 +9398,7 @@ Bağlantı isteği tekrarlansın mı? accepted %@ + kabul edildi %@ rcv group event chat item @@ -9163,10 +9408,12 @@ Bağlantı isteği tekrarlansın mı? accepted invitation + davetiye kabul edildi chat list item title accepted you + seni kabul etti rcv group event chat item @@ -9191,6 +9438,7 @@ Bağlantı isteği tekrarlansın mı? all + tümü member criteria value @@ -9210,6 +9458,7 @@ Bağlantı isteği tekrarlansın mı? archived report + arşivlenmiş rapor No comment provided by engineer. @@ -9280,6 +9529,7 @@ marked deleted chat item preview text can't send messages + mesaj gönderilemiyor No comment provided by engineer. @@ -9389,10 +9639,12 @@ marked deleted chat item preview text contact deleted + kişi silindi No comment provided by engineer. contact disabled + kişi devre dışı No comment provided by engineer. @@ -9407,10 +9659,12 @@ marked deleted chat item preview text contact not ready + kişi hazır değil No comment provided by engineer. contact should accept… + kişi kabul etmeli… No comment provided by engineer. @@ -9571,7 +9825,7 @@ pref value expired - Süresi dolmuş + süresi dolmuş No comment provided by engineer. @@ -9581,6 +9835,7 @@ pref value group + grup shown on group welcome message @@ -9590,6 +9845,7 @@ pref value group is deleted + grup silindi No comment provided by engineer. @@ -9714,6 +9970,7 @@ pref value member has old version + üye eski sürümde No comment provided by engineer. @@ -9748,6 +10005,7 @@ pref value moderator + moderatör member role @@ -9782,6 +10040,7 @@ pref value not synchronized + senkronize edilmedi No comment provided by engineer. @@ -9839,14 +10098,17 @@ time to disappear pending + beklemede No comment provided by engineer. pending approval + onay bekliyor No comment provided by engineer. pending review + inceleme bekliyor No comment provided by engineer. @@ -9866,6 +10128,7 @@ time to disappear rejected + reddedildi No comment provided by engineer. @@ -9890,6 +10153,7 @@ time to disappear removed from group + gruptan çıkarıldı No comment provided by engineer. @@ -9904,22 +10168,27 @@ time to disappear request is sent + istek gönderildi No comment provided by engineer. request to join rejected + katılma isteği reddedildi No comment provided by engineer. requested to connect + bağlanma isteği gönderildi chat list item title review + incele No comment provided by engineer. reviewed by admins + yöneticiler tarafından incelendi No comment provided by engineer. @@ -10108,6 +10377,7 @@ son alınan msj: %2$@ you accepted this member + bu üyeyi kabul ettiniz snd group event chat item @@ -10243,22 +10513,27 @@ son alınan msj: %2$@ %d new events + %d yeni olaylar notification body From %d chat(s) + %d 'dan sohbetler notification body From: %@ + Şuradan: %@@ notification body New events + Yeni etkinlikler notification New messages + Yeni mesajlar notification diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff index de20729f90..f7e5fd4aff 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -1876,14 +1876,14 @@ set passcode view Connect to yourself? This is your own SimpleX address! - З'єднатися з самим собою? + З'єднатися з самим собою? Це ваша власна SimpleX-адреса! new chat sheet title Connect to yourself? This is your own one-time link! - Підключитися до себе? + Підключитися до себе? Це ваше власне одноразове посилання! new chat sheet title @@ -3193,10 +3193,6 @@ chat item action Помилка при прийомі учасника alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) Помилка додавання користувача(ів) @@ -3390,12 +3386,8 @@ chat item action Помилка відкриття чату No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group No comment provided by engineer. @@ -3908,7 +3900,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - Серверу переадресації %@ не вдалося з'єднатися з сервером призначення %@. Спробуйте пізніше. + Серверу переадресації %1$@ не вдалося з'єднатися з сервером призначення %2$@. Спробуйте пізніше. alert message @@ -4734,6 +4726,10 @@ This is your link for group %@! Живі повідомлення No comment provided by engineer. + + Loading profile… + in progress text + Local name Місцева назва @@ -6084,8 +6080,8 @@ Error: %@ Оновлення профілю буде надіслано вашим контактам. alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. alert message @@ -7334,8 +7330,8 @@ chat item action Поділіться профілем alert button - - Share profile via link + + Share profile with address alert title @@ -9165,8 +9161,8 @@ Repeat connection request? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. Ваше з'єднання було переміщено на %@, але під час перенаправлення на профіль сталася несподівана помилка. No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index fab1b8d1dc..6d0bb1c74a 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -3184,10 +3184,6 @@ chat item action Error accepting member alert title - - Error adding address short link - No comment provided by engineer. - Error adding member(s) 添加成员错误 @@ -3379,12 +3375,8 @@ chat item action 打开聊天时出错 No comment provided by engineer. - - Error preparing contact - No comment provided by engineer. - - - Error preparing group + + Error opening group No comment provided by engineer. @@ -3899,7 +3891,7 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - 转发服务器 %@ 无法连接到目标服务器 %@。请稍后尝试。 + 转发服务器 %1$@ 无法连接到目标服务器 %2$@。请稍后尝试。 alert message @@ -4726,6 +4718,10 @@ This is your link for group %@! 实时消息 No comment provided by engineer. + + Loading profile… + in progress text + Local name 本地名称 @@ -6092,8 +6088,8 @@ Error: %@ 个人资料更新将被发送给您的联系人。 alert message - - Profile will be shared via the address link. + + Profile will be shared with the address. alert message @@ -7329,8 +7325,8 @@ chat item action Share profile alert button - - Share profile via link + + Share profile with address alert title @@ -9127,8 +9123,8 @@ Repeat connection request? Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile. alert message - - Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile. + + Your connection was moved to %@ but an error happened when switching profile. No comment provided by engineer. diff --git a/apps/ios/SimpleX NSE/tr.lproj/Localizable.strings b/apps/ios/SimpleX NSE/tr.lproj/Localizable.strings index 5ef592ec70..e43538b856 100644 --- a/apps/ios/SimpleX NSE/tr.lproj/Localizable.strings +++ b/apps/ios/SimpleX NSE/tr.lproj/Localizable.strings @@ -1,7 +1,15 @@ -/* - Localizable.strings - SimpleX +/* notification body */ +"%d new events" = "%d yeni olaylar"; + +/* notification body */ +"From %d chat(s)" = "%d 'dan sohbetler"; + +/* notification body */ +"From: %@" = "Şuradan: %@@"; + +/* notification */ +"New events" = "Yeni etkinlikler"; + +/* notification */ +"New messages" = "Yeni mesajlar"; - Created by EP on 30/07/2024. - Copyright © 2024 SimpleX Chat. All rights reserved. -*/ diff --git a/apps/ios/de.lproj/Localizable.strings b/apps/ios/de.lproj/Localizable.strings index c57af773a5..8e4a547b6a 100644 --- a/apps/ios/de.lproj/Localizable.strings +++ b/apps/ios/de.lproj/Localizable.strings @@ -1080,6 +1080,9 @@ set passcode view */ /* No comment provided by engineer. */ "Chat with member" = "Chat mit einem Mitglied"; +/* No comment provided by engineer. */ +"Chat with members before they join." = "Chat mit Mitgliedern bevor sie beitreten."; + /* No comment provided by engineer. */ "Chats" = "Chats"; @@ -1227,6 +1230,9 @@ set passcode view */ /* No comment provided by engineer. */ "Connect automatically" = "Automatisch verbinden"; +/* No comment provided by engineer. */ +"Connect faster! 🚀" = "Schneller miteinander verbinden! 🚀"; + /* No comment provided by engineer. */ "Connect to desktop" = "Mit dem Desktop verbinden"; @@ -2169,9 +2175,6 @@ chat item action */ /* alert title */ "Error accepting member" = "Fehler beim Übernehmen des Mitglieds"; -/* No comment provided by engineer. */ -"Error adding address short link" = "Fehler beim Hinzufügen eines verkürzten Adresslinks"; - /* No comment provided by engineer. */ "Error adding member(s)" = "Fehler beim Hinzufügen von Mitgliedern"; @@ -2287,13 +2290,10 @@ chat item action */ "Error migrating settings" = "Fehler beim Migrieren der Einstellungen"; /* No comment provided by engineer. */ -"Error opening chat" = "Fehler beim Öffnen des Chats"; +"Error opening chat" = "Fehler beim Öffnen des Chat"; /* No comment provided by engineer. */ -"Error preparing contact" = "Fehler bei der Kontaktaufnahme"; - -/* No comment provided by engineer. */ -"Error preparing group" = "Fehler beim Vorbereiten der Gruppe"; +"Error opening group" = "Fehler beim Vorbereiten der Gruppe"; /* alert title */ "Error receiving file" = "Fehler beim Herunterladen der Datei"; @@ -2606,8 +2606,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "%lld Nachricht(en) wird/werden weitergeleitet"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Weiterleitungsserver %@ konnte sich nicht mit dem Zielserver %@ verbinden. Bitte versuchen Sie es später erneut."; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Weiterleitungsserver %1$@ konnte sich nicht mit dem Zielserver %2$@ verbinden. Bitte versuchen Sie es später erneut."; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "Adresse des Weiterleitungsservers ist nicht kompatibel mit den Netzwerkeinstellungen: %@."; @@ -2688,7 +2688,7 @@ snd error text */ "Group invitation is no longer valid, it was removed by sender." = "Die Gruppeneinladung ist nicht mehr gültig, da sie vom Absender entfernt wurde."; /* No comment provided by engineer. */ -"group is deleted" = "Gruppe wird gelöscht"; +"group is deleted" = "Gruppe wurde gelöscht"; /* No comment provided by engineer. */ "Group link" = "Gruppen-Link"; @@ -3063,7 +3063,7 @@ snd error text */ "Join" = "Beitreten"; /* No comment provided by engineer. */ -"Join as %@" = "beitreten als %@"; +"Join as %@" = "Als %@ beitreten"; /* new chat sheet title */ "Join group" = "Treten Sie der Gruppe bei"; @@ -3125,6 +3125,9 @@ snd error text */ /* rcv group event chat item */ "left" = "hat die Gruppe verlassen"; +/* No comment provided by engineer. */ +"Less traffic on mobile networks." = "Weniger Datenverkehr in mobilen Netzen."; + /* email subject */ "Let's talk in SimpleX Chat" = "Lassen Sie uns in SimpleX Chat kommunizieren"; @@ -3246,7 +3249,7 @@ snd error text */ "Member will be removed from group - this cannot be undone!" = "Das Mitglied wird aus der Gruppe entfernt. Dies kann nicht rückgängig gemacht werden!"; /* alert message */ -"Member will join the group, accept member?" = "Ein Mitglied wird der Gruppe beitreten. Übernehmen?"; +"Member will join the group, accept member?" = "Mitglied wird der Gruppe beitreten. Übernehmen?"; /* No comment provided by engineer. */ "Members can add message reactions." = "Gruppenmitglieder können eine Reaktion auf Nachrichten geben."; @@ -3296,6 +3299,9 @@ snd error text */ /* item status text */ "Message forwarded" = "Nachricht weitergeleitet"; +/* No comment provided by engineer. */ +"Message instantly once you tap Connect." = "Sobald Sie auf Verbinden tippen, erhalten Sie sofort eine Nachricht."; + /* item status description */ "Message may be delivered later if member becomes active." = "Die Nachricht kann später zugestellt werden, wenn das Mitglied aktiv wird."; @@ -3512,6 +3518,9 @@ snd error text */ /* notification */ "New events" = "Neue Ereignisse"; +/* No comment provided by engineer. */ +"New group role: Moderator" = "Neue Gruppen-Rolle: Moderator"; + /* No comment provided by engineer. */ "New in %@" = "Neu in %@"; @@ -3617,6 +3626,9 @@ snd error text */ /* No comment provided by engineer. */ "No permission to record voice message" = "Keine Berechtigung für das Aufnehmen von Sprachnachrichten"; +/* alert title */ +"No private routing session" = "Keine private Routing-Sitzung"; + /* No comment provided by engineer. */ "No push server" = "Lokal"; @@ -3803,10 +3815,10 @@ new chat action */ "Open migration to another device" = "Migration auf ein anderes Gerät öffnen"; /* new chat action */ -"Open new chat" = "Neuen Chat eröffnen"; +"Open new chat" = "Neuen Chat öffnen"; /* new chat action */ -"Open new group" = "Neue Gruppe eröffnen"; +"Open new group" = "Neue Gruppe öffnen"; /* No comment provided by engineer. */ "Open Settings" = "Geräte-Einstellungen öffnen"; @@ -4057,6 +4069,9 @@ new chat action */ /* alert title */ "Private routing error" = "Fehler beim privaten Routing"; +/* alert title */ +"Private routing timeout" = "Zeitüberschreitung der privaten Routing-Sitzung"; + /* No comment provided by engineer. */ "Profile and server connections" = "Profil und Serververbindungen"; @@ -4076,7 +4091,7 @@ new chat action */ "Profile update will be sent to your contacts." = "Profil-Aktualisierung wird an Ihre Kontakte gesendet."; /* alert message */ -"Profile will be shared via the address link." = "Das Profil wird über den Adress-Link geteilt."; +"Profile will be shared with the address." = "Das Profil wird über den Adress-Link geteilt."; /* No comment provided by engineer. */ "Prohibit audio/video calls." = "Audio-/Video-Anrufe nicht erlauben."; @@ -4120,6 +4135,9 @@ new chat action */ /* No comment provided by engineer. */ "Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Schützen Sie Ihre IP-Adresse vor den Nachrichten-Relais, die Ihre Kontakte ausgewählt haben.\nAktivieren Sie es in den *Netzwerk & Server* Einstellungen."; +/* No comment provided by engineer. */ +"Protocol background timeout" = "Protokoll Hintergrund-Zeitüberschreitung"; + /* No comment provided by engineer. */ "Protocol timeout" = "Protokollzeitüberschreitung"; @@ -4318,7 +4336,7 @@ swipe action */ "removed contact address" = "Die Kontaktadresse wurde entfernt"; /* No comment provided by engineer. */ -"removed from group" = "Von der Gruppe entfernt"; +"removed from group" = "Aus der Gruppe entfernt"; /* profile update event chat item */ "removed profile picture" = "Das Profil-Bild wurde entfernt"; @@ -4326,6 +4344,9 @@ swipe action */ /* rcv group event chat item */ "removed you" = "hat Sie aus der Gruppe entfernt"; +/* No comment provided by engineer. */ +"Removes messages and blocks members." = "Entfernt Nachrichten und blockiert Mitglieder."; + /* No comment provided by engineer. */ "Renegotiate" = "Neu aushandeln"; @@ -4446,6 +4467,9 @@ swipe action */ /* No comment provided by engineer. */ "Review conditions" = "Nutzungsbedingungen einsehen"; +/* No comment provided by engineer. */ +"Review group members" = "Gruppenmitglieder überprüfen"; + /* admission stage */ "Review members" = "Überprüfung der Mitglieder"; @@ -4699,6 +4723,9 @@ chat item action */ /* No comment provided by engineer. */ "Send up to 100 last messages to new members." = "Bis zu 100 der letzten Nachrichten an neue Gruppenmitglieder senden."; +/* No comment provided by engineer. */ +"Send your private feedback to groups." = "Senden Sie Ihr privates Feedback an Gruppen."; + /* alert message */ "Sender cancelled file transfer." = "Der Absender hat die Dateiübertragung abgebrochen."; @@ -4905,7 +4932,7 @@ chat item action */ "Share profile" = "Profil teilen"; /* alert title */ -"Share profile via link" = "Profil über einen Link teilen"; +"Share profile with address" = "Profil über einen Link teilen"; /* No comment provided by engineer. */ "Share SimpleX address on social media." = "Die SimpleX-Adresse auf sozialen Medien teilen."; @@ -5184,6 +5211,9 @@ report reason */ /* No comment provided by engineer. */ "TCP connection" = "TCP-Verbindung"; +/* No comment provided by engineer. */ +"TCP connection bg timeout" = "TCP-Verbindung Hintergrund-Zeitüberschreitung"; + /* No comment provided by engineer. */ "TCP connection timeout" = "Timeout der TCP-Verbindung"; @@ -6127,7 +6157,7 @@ report reason */ "Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Ihr Chat wurde nach %@ verschoben, aber es ist ein unerwarteter Fehler aufgetreten, als Sie zum Profil weitergeleitet wurden."; /* No comment provided by engineer. */ -"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Ihre Verbindung wurde auf %@ verschoben. Während Sie auf das Profil weitergeleitet wurden trat aber ein unerwarteter Fehler auf."; +"Your connection was moved to %@ but an error happened when switching profile." = "Ihre Verbindung wurde auf %@ verschoben. Während Sie auf das Profil weitergeleitet wurden trat aber ein unerwarteter Fehler auf."; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Ihr Kontakt hat eine Datei gesendet, die größer ist als die derzeit unterstützte maximale Größe (%@)."; diff --git a/apps/ios/es.lproj/Localizable.strings b/apps/ios/es.lproj/Localizable.strings index 1ff4b22ecc..1bd3ecf149 100644 --- a/apps/ios/es.lproj/Localizable.strings +++ b/apps/ios/es.lproj/Localizable.strings @@ -358,6 +358,9 @@ swipe action */ /* No comment provided by engineer. */ "Accept connection request?" = "¿Aceptar solicitud de conexión?"; +/* alert title */ +"Accept contact request" = "Aceptar petición de contacto"; + /* notification body */ "Accept contact request from %@?" = "¿Aceptar solicitud de contacto de %@?"; @@ -404,6 +407,9 @@ swipe action */ /* No comment provided by engineer. */ "Add list" = "Añadir lista"; +/* placeholder for sending contact request */ +"Add message" = "Añadir mensaje"; + /* No comment provided by engineer. */ "Add profile" = "Añadir perfil"; @@ -915,6 +921,9 @@ marked deleted chat item preview text */ /* No comment provided by engineer. */ "Can't call member" = "No se puede llamar al miembro"; +/* alert title */ +"Can't change profile" = "No se puede cambiar el perfil"; + /* No comment provided by engineer. */ "Can't invite contact!" = "¡No se puede invitar el contacto!"; @@ -1071,6 +1080,9 @@ set passcode view */ /* No comment provided by engineer. */ "Chat with member" = "Chat con miembro"; +/* No comment provided by engineer. */ +"Chat with members before they join." = "Chat con miembros antes de unirse."; + /* No comment provided by engineer. */ "Chats" = "Chats"; @@ -1218,6 +1230,9 @@ set passcode view */ /* No comment provided by engineer. */ "Connect automatically" = "Conectar automáticamente"; +/* No comment provided by engineer. */ +"Connect faster! 🚀" = "¡Conecta más rápido! 🚀"; + /* No comment provided by engineer. */ "Connect to desktop" = "Conectar con ordenador"; @@ -1392,6 +1407,9 @@ set passcode view */ /* No comment provided by engineer. */ "Contact preferences" = "Preferencias de contacto"; +/* No comment provided by engineer. */ +"contact should accept…" = "el contacto debe aceptar…"; + /* No comment provided by engineer. */ "Contact will be deleted - this cannot be undone!" = "El contacto será eliminado. ¡No puede deshacerse!"; @@ -1968,6 +1986,9 @@ chat item action */ /* No comment provided by engineer. */ "Edit group profile" = "Editar perfil de grupo"; +/* No comment provided by engineer. */ +"Empty message!" = "¡Mensaje vacío!"; + /* No comment provided by engineer. */ "Enable" = "Activar"; @@ -2166,6 +2187,9 @@ chat item action */ /* No comment provided by engineer. */ "Error changing address" = "Error al cambiar servidor"; +/* alert title */ +"Error changing chat profile" = "Error al cambiar perfil de chat"; + /* No comment provided by engineer. */ "Error changing connection profile" = "Error al cambiar el perfil de conexión"; @@ -2268,6 +2292,9 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Error al abrir chat"; +/* No comment provided by engineer. */ +"Error opening group" = "Error al abrir el grupo"; + /* alert title */ "Error receiving file" = "Error al recibir archivo"; @@ -2280,6 +2307,9 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Error al registrarse para notificaciones"; +/* alert title */ +"Error rejecting contact request" = "Error al rechazar la solicitud del contacto"; + /* alert title */ "Error removing member" = "Error al expulsar miembro"; @@ -2576,8 +2606,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "Reenviando %lld mensajes"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "El servidor de reenvío %@ no ha podido conectarse al servidor de destino %@. Por favor, intentalo más tarde."; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "El servidor de reenvío %1$@ no ha podido conectarse al servidor de destino %2$@. Por favor, intentalo más tarde."; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "La dirección del servidor de reenvío es incompatible con la configuración de red: %@."; @@ -2624,6 +2654,9 @@ snd error text */ /* message preview */ "Good morning!" = "¡Buenos días!"; +/* shown on group welcome message */ +"group" = "grupo"; + /* No comment provided by engineer. */ "Group" = "Grupo"; @@ -3092,6 +3125,9 @@ snd error text */ /* rcv group event chat item */ "left" = "ha salido"; +/* No comment provided by engineer. */ +"Less traffic on mobile networks." = "Menos tráfico en redes móviles."; + /* email subject */ "Let's talk in SimpleX Chat" = "Hablemos en SimpleX Chat"; @@ -3263,6 +3299,9 @@ snd error text */ /* item status text */ "Message forwarded" = "Mensaje reenviado"; +/* No comment provided by engineer. */ +"Message instantly once you tap Connect." = "Mensajea ya tras pulsar Contactar."; + /* item status description */ "Message may be delivered later if member becomes active." = "El mensaje podría ser entregado más tarde si el miembro vuelve a estar activo."; @@ -3311,6 +3350,9 @@ snd error text */ /* No comment provided by engineer. */ "Messages & files" = "Mensajes"; +/* No comment provided by engineer. */ +"Messages are protected by **end-to-end encryption**." = "Los mensajes están protegidos mediante **cifrado de extremo a extremo**."; + /* No comment provided by engineer. */ "Messages from %@ will be shown!" = "¡Los mensajes de %@ serán mostrados!"; @@ -3476,6 +3518,9 @@ snd error text */ /* notification */ "New events" = "Eventos nuevos"; +/* No comment provided by engineer. */ +"New group role: Moderator" = "Nuevo rol de grupo: Moderador"; + /* No comment provided by engineer. */ "New in %@" = "Nuevo en %@"; @@ -3581,6 +3626,9 @@ snd error text */ /* No comment provided by engineer. */ "No permission to record voice message" = "Sin permiso para grabar mensajes de voz"; +/* alert title */ +"No private routing session" = "Ninguna sesión con enrutamiento privado"; + /* No comment provided by engineer. */ "No push server" = "Sin servidores push"; @@ -3766,9 +3814,24 @@ new chat action */ /* authentication reason */ "Open migration to another device" = "Abrir menú migración a otro dispositivo"; +/* new chat action */ +"Open new chat" = "Abrir chat nuevo"; + +/* new chat action */ +"Open new group" = "Abrir grupo nuevo"; + /* No comment provided by engineer. */ "Open Settings" = "Abrir Configuración"; +/* No comment provided by engineer. */ +"Open to accept" = "Abrir para aceptar"; + +/* No comment provided by engineer. */ +"Open to connect" = "Abrir para conectar"; + +/* No comment provided by engineer. */ +"Open to join" = "Abrir para unirte"; + /* No comment provided by engineer. */ "Opening app…" = "Iniciando aplicación…"; @@ -4006,6 +4069,9 @@ new chat action */ /* alert title */ "Private routing error" = "Error de enrutamiento privado"; +/* alert title */ +"Private routing timeout" = "Timeout enrutamiento privado"; + /* No comment provided by engineer. */ "Profile and server connections" = "Eliminar perfil y conexiones"; @@ -4024,6 +4090,9 @@ new chat action */ /* alert message */ "Profile update will be sent to your contacts." = "La actualización del perfil se enviará a tus contactos."; +/* alert message */ +"Profile will be shared with the address." = "El perfil será compartido mediante la dirección de contacto."; + /* No comment provided by engineer. */ "Prohibit audio/video calls." = "No se permiten llamadas y videollamadas."; @@ -4066,6 +4135,9 @@ new chat action */ /* No comment provided by engineer. */ "Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Protege tu dirección IP de los servidores de retransmisión elegidos por tus contactos.\nActívalo en ajustes de *Servidores y Redes*."; +/* No comment provided by engineer. */ +"Protocol background timeout" = "Timeout protocolo en segundo plano"; + /* No comment provided by engineer. */ "Protocol timeout" = "Timeout protocolo"; @@ -4272,6 +4344,9 @@ swipe action */ /* rcv group event chat item */ "removed you" = "te ha expulsado"; +/* No comment provided by engineer. */ +"Removes messages and blocks members." = "Eliminar mensajes y bloquear miembros."; + /* No comment provided by engineer. */ "Renegotiate" = "Renegociar"; @@ -4326,6 +4401,9 @@ swipe action */ /* No comment provided by engineer. */ "Reports" = "Informes"; +/* No comment provided by engineer. */ +"request is sent" = "petición enviada"; + /* No comment provided by engineer. */ "request to join rejected" = "petición para unirse rechazada"; @@ -4389,6 +4467,9 @@ swipe action */ /* No comment provided by engineer. */ "Review conditions" = "Revisar condiciones"; +/* No comment provided by engineer. */ +"Review group members" = "Revisar miembros del grupo"; + /* admission stage */ "Review members" = "Revisar miembros"; @@ -4588,6 +4669,9 @@ chat item action */ /* No comment provided by engineer. */ "Send a live message - it will update for the recipient(s) as you type it" = "Envía un mensaje en vivo: se actualizará para el (los) destinatario(s) a medida que se escribe"; +/* No comment provided by engineer. */ +"Send contact request?" = "¿Enviar solicitud de contacto?"; + /* No comment provided by engineer. */ "Send delivery receipts to" = "Enviar confirmaciones de entrega a"; @@ -4627,12 +4711,21 @@ chat item action */ /* No comment provided by engineer. */ "Send receipts" = "Enviar confirmaciones"; +/* No comment provided by engineer. */ +"Send request" = "Enviar solicitud"; + +/* No comment provided by engineer. */ +"Send request without message" = "Enviar solicitud sin mensaje"; + /* No comment provided by engineer. */ "Send them from gallery or custom keyboards." = "Envíalos desde la galería o desde teclados personalizados."; /* No comment provided by engineer. */ "Send up to 100 last messages to new members." = "Se envían hasta 100 mensajes más recientes a los miembros nuevos."; +/* No comment provided by engineer. */ +"Send your private feedback to groups." = "Envía tu comentario privado a los grupos."; + /* alert message */ "Sender cancelled file transfer." = "El remitente ha cancelado la transferencia de archivos."; @@ -4687,6 +4780,9 @@ chat item action */ /* No comment provided by engineer. */ "Sent reply" = "Respuesta enviada"; +/* No comment provided by engineer. */ +"Sent to your contact after connection." = "Enviado a tu contacto tras la conexión."; + /* No comment provided by engineer. */ "Sent total" = "Total enviados"; @@ -4826,12 +4922,18 @@ chat item action */ /* No comment provided by engineer. */ "Share from other apps." = "Comparte desde otras aplicaciones."; +/* No comment provided by engineer. */ +"Share group profile via link" = "Compartir perfil de grupo mediante enlace"; + /* No comment provided by engineer. */ "Share link" = "Compartir enlace"; /* alert button */ "Share profile" = "Perfil a compartir"; +/* alert title */ +"Share profile with address" = "Compartir perfil mediante enlace"; + /* No comment provided by engineer. */ "Share SimpleX address on social media." = "Comparte tu dirección SimpleX en redes sociales."; @@ -5109,6 +5211,9 @@ report reason */ /* No comment provided by engineer. */ "TCP connection" = "Conexión TCP"; +/* No comment provided by engineer. */ +"TCP connection bg timeout" = "Timeout conexión TCP sp"; + /* No comment provided by engineer. */ "TCP connection timeout" = "Timeout de la conexión TCP"; @@ -5337,6 +5442,9 @@ report reason */ /* No comment provided by engineer. */ "To support instant push notifications the chat database has to be migrated." = "Para permitir las notificaciones automáticas instantáneas, la base de datos se debe migrar."; +/* alert message */ +"To use another profile after connection attempt, delete the chat and use the link again." = "Para usar otro perfil tras el intento de conexión, elimina el chat y usa el enlace de nuevo."; + /* No comment provided by engineer. */ "To use the servers of **%@**, accept conditions of use." = "Para usar los servidores de **%@**, debes aceptar las condiciones de uso."; @@ -5991,6 +6099,9 @@ report reason */ /* snd group event chat item */ "you unblocked %@" = "has desbloqueado a %@"; +/* No comment provided by engineer. */ +"You will be able to send messages **only after your request is accepted**." = "Podrás enviar mensajes **después de que tu solicitud sea aceptada**."; + /* No comment provided by engineer. */ "You will be connected to group when the group host's device is online, please wait or check later!" = "Te conectarás al grupo cuando el dispositivo del anfitrión esté en línea, por favor espera o revisa más tarde."; @@ -6042,8 +6153,11 @@ report reason */ /* No comment provided by engineer. */ "Your chat profiles" = "Mis perfiles"; +/* alert message */ +"Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Tu chat ha sido movido a %@ pero ha ocurrido un error inesperado mientras se te redirigía al perfil."; + /* No comment provided by engineer. */ -"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Tu conexión ha sido trasladada a %@ pero ha ocurrido un error inesperado al redirigirte al perfil."; +"Your connection was moved to %@ but an error happened when switching profile." = "Tu conexión ha sido trasladada a %@ pero ha ocurrido un error inesperado al redirigirte al perfil."; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "El contacto ha enviado un archivo mayor al máximo admitido (%@)."; diff --git a/apps/ios/fr.lproj/Localizable.strings b/apps/ios/fr.lproj/Localizable.strings index 4ec270e58e..283b4f0ca8 100644 --- a/apps/ios/fr.lproj/Localizable.strings +++ b/apps/ios/fr.lproj/Localizable.strings @@ -2507,8 +2507,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "Transfert des %lld messages"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Le serveur de redirection %@ n'a pas réussi à se connecter au serveur de destination %@. Veuillez réessayer plus tard."; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Le serveur de redirection %1$@ n'a pas réussi à se connecter au serveur de destination %2$@. Veuillez réessayer plus tard."; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "L'adresse du serveur de redirection est incompatible avec les paramètres du réseau : %@."; @@ -5667,7 +5667,7 @@ chat item action */ "Your chat profiles" = "Vos profils de chat"; /* No comment provided by engineer. */ -"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Votre connexion a été déplacée vers %@ mais une erreur inattendue s'est produite lors de la redirection vers le profil."; +"Your connection was moved to %@ but an error happened when switching profile." = "Votre connexion a été déplacée vers %@ mais une erreur inattendue s'est produite lors de la redirection vers le profil."; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Votre contact a envoyé un fichier plus grand que la taille maximale supportée actuellement(%@)."; diff --git a/apps/ios/hu.lproj/Localizable.strings b/apps/ios/hu.lproj/Localizable.strings index 96d1e4e0be..02c03b7725 100644 --- a/apps/ios/hu.lproj/Localizable.strings +++ b/apps/ios/hu.lproj/Localizable.strings @@ -1080,6 +1080,9 @@ set passcode view */ /* No comment provided by engineer. */ "Chat with member" = "Csevegés a taggal"; +/* No comment provided by engineer. */ +"Chat with members before they join." = "Csevegés a tagokkal mielőtt csatlakoznának."; + /* No comment provided by engineer. */ "Chats" = "Csevegések"; @@ -1227,6 +1230,9 @@ set passcode view */ /* No comment provided by engineer. */ "Connect automatically" = "Kapcsolódás automatikusan"; +/* No comment provided by engineer. */ +"Connect faster! 🚀" = "Gyorsabb kapcsolódás! 🚀"; + /* No comment provided by engineer. */ "Connect to desktop" = "Társítás számítógéppel"; @@ -2169,9 +2175,6 @@ chat item action */ /* alert title */ "Error accepting member" = "Hiba a tag befogadásakor"; -/* No comment provided by engineer. */ -"Error adding address short link" = "Hiba a rövid címhivatkozás hozzáadásakor"; - /* No comment provided by engineer. */ "Error adding member(s)" = "Hiba történt a tag(ok) hozzáadásakor"; @@ -2290,10 +2293,7 @@ chat item action */ "Error opening chat" = "Hiba történt a csevegés megnyitásakor"; /* No comment provided by engineer. */ -"Error preparing contact" = "Hiba a kapcsolat előkészítésekor"; - -/* No comment provided by engineer. */ -"Error preparing group" = "Hiba a csoport előkészítésekor"; +"Error opening group" = "Hiba a csoport előkészítésekor"; /* alert title */ "Error receiving file" = "Hiba történt a fájl fogadásakor"; @@ -2606,8 +2606,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "%lld üzenet továbbítása"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "A(z) %@ továbbítókiszolgáló nem tudott kapcsolódni a(z) %@ célkiszolgálóhoz. Próbálja meg később."; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "A(z) %1$@ továbbítókiszolgáló nem tudott kapcsolódni a(z) %2$@ célkiszolgálóhoz. Próbálja meg később."; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "A továbbítókiszolgáló címe nem kompatibilis a hálózati beállításokkal: %@."; @@ -3125,6 +3125,9 @@ snd error text */ /* rcv group event chat item */ "left" = "elhagyta a csoportot"; +/* No comment provided by engineer. */ +"Less traffic on mobile networks." = "Kevesebb adatforgalom a mobilhálózatokon."; + /* email subject */ "Let's talk in SimpleX Chat" = "Beszélgessünk a SimpleX Chatben"; @@ -3296,6 +3299,9 @@ snd error text */ /* item status text */ "Message forwarded" = "Továbbított üzenet"; +/* No comment provided by engineer. */ +"Message instantly once you tap Connect." = "Az üzenet azonnal megjelenik, amint a kapcsolódás gombra koppint."; + /* item status description */ "Message may be delivered later if member becomes active." = "Az üzenet később is kézbesíthető, ha a tag aktívvá válik."; @@ -3512,6 +3518,9 @@ snd error text */ /* notification */ "New events" = "Új események"; +/* No comment provided by engineer. */ +"New group role: Moderator" = "Új szerepkör: Moderátor"; + /* No comment provided by engineer. */ "New in %@" = "Újdonságok a(z) %@ verzióban"; @@ -3617,6 +3626,9 @@ snd error text */ /* No comment provided by engineer. */ "No permission to record voice message" = "Nincs engedély a hangüzenet rögzítésére"; +/* alert title */ +"No private routing session" = "Nincs privát útválasztási munkamenet"; + /* No comment provided by engineer. */ "No push server" = "Helyi"; @@ -4057,6 +4069,9 @@ new chat action */ /* alert title */ "Private routing error" = "Privát útválasztási hiba"; +/* alert title */ +"Private routing timeout" = "Privát útválasztás időtúllépése"; + /* No comment provided by engineer. */ "Profile and server connections" = "Profil és kiszolgálókapcsolatok"; @@ -4076,7 +4091,7 @@ new chat action */ "Profile update will be sent to your contacts." = "A profilfrissítés el lesz küldve a partnerei számára."; /* alert message */ -"Profile will be shared via the address link." = "A profil meg lesz osztva a címhivatkozáson keresztül."; +"Profile will be shared with the address." = "A profil meg lesz osztva a címhivatkozáson keresztül."; /* No comment provided by engineer. */ "Prohibit audio/video calls." = "A hívások kezdeményezése le van tiltva."; @@ -4120,6 +4135,9 @@ new chat action */ /* No comment provided by engineer. */ "Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Védje az IP-címét a partnerei által kiválasztott üzenetváltási továbbítókiszolgálókkal szemben.\nEngedélyezze a *Hálózat és kiszolgálók* menüben."; +/* No comment provided by engineer. */ +"Protocol background timeout" = "Protokoll időtúllépése a háttérben"; + /* No comment provided by engineer. */ "Protocol timeout" = "Protokoll időtúllépése"; @@ -4326,6 +4344,9 @@ swipe action */ /* rcv group event chat item */ "removed you" = "eltávolította Önt"; +/* No comment provided by engineer. */ +"Removes messages and blocks members." = "Üzenetek eltávolítása és a tagok tiltása."; + /* No comment provided by engineer. */ "Renegotiate" = "Újraegyeztetés"; @@ -4446,6 +4467,9 @@ swipe action */ /* No comment provided by engineer. */ "Review conditions" = "Feltételek felülvizsgálata"; +/* No comment provided by engineer. */ +"Review group members" = "Csoporttagok áttekintése"; + /* admission stage */ "Review members" = "Tagok áttekintése"; @@ -4699,6 +4723,9 @@ chat item action */ /* No comment provided by engineer. */ "Send up to 100 last messages to new members." = "Legfeljebb az utolsó 100 üzenet elküldése az új tagok számára."; +/* No comment provided by engineer. */ +"Send your private feedback to groups." = "Küldjön privát visszajelzést a csoportoknak."; + /* alert message */ "Sender cancelled file transfer." = "A fájl küldője visszavonta az átvitelt."; @@ -4905,7 +4932,7 @@ chat item action */ "Share profile" = "Profil megosztása"; /* alert title */ -"Share profile via link" = "Profil megosztása hivatkozáson keresztül"; +"Share profile with address" = "Profil megosztása hivatkozáson keresztül"; /* No comment provided by engineer. */ "Share SimpleX address on social media." = "SimpleX-cím megosztása a közösségi médiában."; @@ -5184,6 +5211,9 @@ report reason */ /* No comment provided by engineer. */ "TCP connection" = "TCP-kapcsolat"; +/* No comment provided by engineer. */ +"TCP connection bg timeout" = "TCP-kapcsolat időtúllépése a háttérben"; + /* No comment provided by engineer. */ "TCP connection timeout" = "TCP-kapcsolat időtúllépése"; @@ -6127,7 +6157,7 @@ report reason */ "Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "A csevegés át lett helyezve ide: %@, de egy váratlan hiba történt a profilra való átirányításkor."; /* No comment provided by engineer. */ -"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "A kapcsolata át lett helyezve ide: %@, de egy váratlan hiba történt a profilra való átirányításkor."; +"Your connection was moved to %@ but an error happened when switching profile." = "A kapcsolata át lett helyezve ide: %@, de egy váratlan hiba történt a profilra való átirányításkor."; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "A partnere a jelenleg megengedett maximális méretű (%@) fájlnál nagyobbat küldött."; diff --git a/apps/ios/it.lproj/Localizable.strings b/apps/ios/it.lproj/Localizable.strings index dd9eeb106d..6ab35722e8 100644 --- a/apps/ios/it.lproj/Localizable.strings +++ b/apps/ios/it.lproj/Localizable.strings @@ -1080,6 +1080,9 @@ set passcode view */ /* No comment provided by engineer. */ "Chat with member" = "Chatta con il membro"; +/* No comment provided by engineer. */ +"Chat with members before they join." = "Chatta con i membri prima che si uniscano."; + /* No comment provided by engineer. */ "Chats" = "Chat"; @@ -1227,6 +1230,9 @@ set passcode view */ /* No comment provided by engineer. */ "Connect automatically" = "Connetti automaticamente"; +/* No comment provided by engineer. */ +"Connect faster! 🚀" = "Connettiti più velocemente! 🚀"; + /* No comment provided by engineer. */ "Connect to desktop" = "Connetti al desktop"; @@ -2169,9 +2175,6 @@ chat item action */ /* alert title */ "Error accepting member" = "Errore di accettazione del membro"; -/* No comment provided by engineer. */ -"Error adding address short link" = "Errore di aggiunta del link breve dell'indirizzo"; - /* No comment provided by engineer. */ "Error adding member(s)" = "Errore di aggiunta membro/i"; @@ -2290,10 +2293,7 @@ chat item action */ "Error opening chat" = "Errore di apertura della chat"; /* No comment provided by engineer. */ -"Error preparing contact" = "Errore di preparazione del contatto"; - -/* No comment provided by engineer. */ -"Error preparing group" = "Errore di preparazione del gruppo"; +"Error opening group" = "Errore di preparazione del gruppo"; /* alert title */ "Error receiving file" = "Errore nella ricezione del file"; @@ -2606,8 +2606,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "Inoltro di %lld messaggi"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Il server di inoltro %@ non è riuscito a connettersi al server di destinazione %@. Riprova più tardi."; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Il server di inoltro %1$@ non è riuscito a connettersi al server di destinazione %2$@. Riprova più tardi."; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "L'indirizzo del server di inoltro è incompatibile con le impostazioni di rete: %@."; @@ -3125,6 +3125,9 @@ snd error text */ /* rcv group event chat item */ "left" = "è uscito/a"; +/* No comment provided by engineer. */ +"Less traffic on mobile networks." = "Meno traffico sulle reti mobili."; + /* email subject */ "Let's talk in SimpleX Chat" = "Parliamo in SimpleX Chat"; @@ -3216,7 +3219,7 @@ snd error text */ "member %@ changed to %@" = "il membro %1$@ è diventato %2$@"; /* No comment provided by engineer. */ -"Member admission" = "Ammissione del membro"; +"Member admission" = "Ammissione dei membri"; /* rcv group event chat item */ "member connected" = "si è connesso/a"; @@ -3296,6 +3299,9 @@ snd error text */ /* item status text */ "Message forwarded" = "Messaggio inoltrato"; +/* No comment provided by engineer. */ +"Message instantly once you tap Connect." = "Parla immediatamente appena tocchi \"Connetti\"."; + /* item status description */ "Message may be delivered later if member becomes active." = "Il messaggio può essere consegnato più tardi se il membro diventa attivo."; @@ -3512,6 +3518,9 @@ snd error text */ /* notification */ "New events" = "Nuovi eventi"; +/* No comment provided by engineer. */ +"New group role: Moderator" = "Nuovo ruolo nei gruppi: Moderatore"; + /* No comment provided by engineer. */ "New in %@" = "Novità nella %@"; @@ -3617,6 +3626,9 @@ snd error text */ /* No comment provided by engineer. */ "No permission to record voice message" = "Nessuna autorizzazione per registrare messaggi vocali"; +/* alert title */ +"No private routing session" = "Nessuna sessione di instradamento privato"; + /* No comment provided by engineer. */ "No push server" = "Locale"; @@ -4057,6 +4069,9 @@ new chat action */ /* alert title */ "Private routing error" = "Errore di instradamento privato"; +/* alert title */ +"Private routing timeout" = "Scadenza dell'instradamento privato"; + /* No comment provided by engineer. */ "Profile and server connections" = "Profilo e connessioni al server"; @@ -4076,7 +4091,7 @@ new chat action */ "Profile update will be sent to your contacts." = "L'aggiornamento del profilo verrà inviato ai tuoi contatti."; /* alert message */ -"Profile will be shared via the address link." = "Il profilo verrà condiviso tramite il link dell'indirizzo."; +"Profile will be shared with the address." = "Il profilo verrà condiviso tramite il link dell'indirizzo."; /* No comment provided by engineer. */ "Prohibit audio/video calls." = "Proibisci le chiamate audio/video."; @@ -4120,6 +4135,9 @@ new chat action */ /* No comment provided by engineer. */ "Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Proteggi il tuo indirizzo IP dai relay di messaggistica scelti dai tuoi contatti.\nAttivalo nelle impostazioni *Rete e server*."; +/* No comment provided by engineer. */ +"Protocol background timeout" = "Scadenza del protocollo in sec. piano"; + /* No comment provided by engineer. */ "Protocol timeout" = "Scadenza del protocollo"; @@ -4326,6 +4344,9 @@ swipe action */ /* rcv group event chat item */ "removed you" = "ti ha rimosso/a"; +/* No comment provided by engineer. */ +"Removes messages and blocks members." = "Rimuove i messaggi e blocca i membri."; + /* No comment provided by engineer. */ "Renegotiate" = "Rinegoziare"; @@ -4446,6 +4467,9 @@ swipe action */ /* No comment provided by engineer. */ "Review conditions" = "Leggi le condizioni"; +/* No comment provided by engineer. */ +"Review group members" = "Revisiona i membri del gruppo"; + /* admission stage */ "Review members" = "Revisiona i membri"; @@ -4699,6 +4723,9 @@ chat item action */ /* No comment provided by engineer. */ "Send up to 100 last messages to new members." = "Invia fino a 100 ultimi messaggi ai nuovi membri."; +/* No comment provided by engineer. */ +"Send your private feedback to groups." = "Invia i tuoi commenti privati ai gruppi."; + /* alert message */ "Sender cancelled file transfer." = "Il mittente ha annullato il trasferimento del file."; @@ -4838,7 +4865,7 @@ chat item action */ "Set it instead of system authentication." = "Impostalo al posto dell'autenticazione di sistema."; /* No comment provided by engineer. */ -"Set member admission" = "Imposta l'ammissione del membro"; +"Set member admission" = "Imposta l'ammissione dei membri"; /* No comment provided by engineer. */ "Set message expiration in chats." = "Imposta la scadenza dei messaggi nelle chat."; @@ -4905,7 +4932,7 @@ chat item action */ "Share profile" = "Condividi il profilo"; /* alert title */ -"Share profile via link" = "Condividi il profilo via link"; +"Share profile with address" = "Condividi il profilo via link"; /* No comment provided by engineer. */ "Share SimpleX address on social media." = "Condividi l'indirizzo SimpleX sui social media."; @@ -5184,6 +5211,9 @@ report reason */ /* No comment provided by engineer. */ "TCP connection" = "Connessione TCP"; +/* No comment provided by engineer. */ +"TCP connection bg timeout" = "Scadenza conness. TCP in sec. piano"; + /* No comment provided by engineer. */ "TCP connection timeout" = "Scadenza connessione TCP"; @@ -6127,7 +6157,7 @@ report reason */ "Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "La tua chat è stata spostata su %@ , ma si è verificato un errore imprevisto mentre venivi reindirizzato/a al profilo."; /* No comment provided by engineer. */ -"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "La tua connessione è stata spostata a %@, ma si è verificato un errore imprevisto durante il reindirizzamento al profilo."; +"Your connection was moved to %@ but an error happened when switching profile." = "La tua connessione è stata spostata a %@, ma si è verificato un errore imprevisto durante il reindirizzamento al profilo."; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Il tuo contatto ha inviato un file più grande della dimensione massima attualmente supportata (%@)."; diff --git a/apps/ios/nl.lproj/Localizable.strings b/apps/ios/nl.lproj/Localizable.strings index 1e5572db2d..4f76057a3e 100644 --- a/apps/ios/nl.lproj/Localizable.strings +++ b/apps/ios/nl.lproj/Localizable.strings @@ -5,7 +5,7 @@ "_italic_" = "\\_cursief_"; /* No comment provided by engineer. */ -"- connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!\n- delivery receipts (up to 20 members).\n- faster and more stable." = "- verbinding maken met [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! \n- ontvangst bevestiging(tot 20 leden). \n- sneller en stabieler."; +"- connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!\n- delivery receipts (up to 20 members).\n- faster and more stable." = "- verbinding maken met [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!\n- ontvangst bevestiging(tot 20 leden).\n- sneller en stabieler."; /* No comment provided by engineer. */ "- more stable message delivery.\n- a bit better groups.\n- and more!" = "- stabielere berichtbezorging.\n- een beetje betere groepen.\n- en meer!"; @@ -2570,8 +2570,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "%lld berichten doorsturen"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "De doorstuurserver %@ kon geen verbinding maken met de bestemmingsserver %@. Probeer het later opnieuw."; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "De doorstuurserver %1$@ kon geen verbinding maken met de bestemmingsserver %2$@. Probeer het later opnieuw."; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "Het adres van de doorstuurserver is niet compatibel met de netwerkinstellingen: %@."; @@ -3633,7 +3633,7 @@ snd error text */ "Notifications status" = "Meldingsstatus"; /* No comment provided by engineer. */ -"Now admins can:\n- delete members' messages.\n- disable members (\"observer\" role)" = "Nu kunnen beheerders: \n- berichten van leden verwijderen.\n- schakel leden uit (\"waarnemer\" rol)"; +"Now admins can:\n- delete members' messages.\n- disable members (\"observer\" role)" = "Nu kunnen beheerders:\n- berichten van leden verwijderen.\n- schakel leden uit (\"waarnemer\" rol)"; /* member role */ "observer" = "Waarnemer"; @@ -6028,7 +6028,7 @@ report reason */ "Your chat profiles" = "Uw chat profielen"; /* No comment provided by engineer. */ -"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Uw verbinding is verplaatst naar %@, maar er is een onverwachte fout opgetreden tijdens het omleiden naar het profiel."; +"Your connection was moved to %@ but an error happened when switching profile." = "Uw verbinding is verplaatst naar %@, maar er is een onverwachte fout opgetreden tijdens het omleiden naar het profiel."; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Uw contact heeft een bestand verzonden dat groter is dan de momenteel ondersteunde maximale grootte (%@)."; diff --git a/apps/ios/pl.lproj/Localizable.strings b/apps/ios/pl.lproj/Localizable.strings index b0387a32cd..00eb3605ea 100644 --- a/apps/ios/pl.lproj/Localizable.strings +++ b/apps/ios/pl.lproj/Localizable.strings @@ -2324,8 +2324,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "Przekazywanie %lld wiadomości"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Serwer przekazujący %@ nie mógł połączyć się z serwerem docelowym %@. Spróbuj ponownie później."; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Serwer przekazujący %1$@ nie mógł połączyć się z serwerem docelowym %2$@. Spróbuj ponownie później."; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "Adres serwera przekierowującego jest niekompatybilny z ustawieniami sieciowymi: %@."; @@ -5280,7 +5280,7 @@ chat item action */ "Your chat profiles" = "Twoje profile czatu"; /* No comment provided by engineer. */ -"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Twoje połączenie zostało przeniesione do %@, ale podczas przekierowywania do profilu wystąpił nieoczekiwany błąd."; +"Your connection was moved to %@ but an error happened when switching profile." = "Twoje połączenie zostało przeniesione do %@, ale podczas przekierowywania do profilu wystąpił nieoczekiwany błąd."; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Twój kontakt wysłał plik, który jest większy niż obecnie obsługiwany maksymalny rozmiar (%@)."; diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings index d131dcc641..b4c52153eb 100644 --- a/apps/ios/ru.lproj/Localizable.strings +++ b/apps/ios/ru.lproj/Localizable.strings @@ -358,6 +358,9 @@ swipe action */ /* No comment provided by engineer. */ "Accept connection request?" = "Принять запрос?"; +/* alert title */ +"Accept contact request" = "Принять запрос на соединение"; + /* notification body */ "Accept contact request from %@?" = "Принять запрос на соединение от %@?"; @@ -416,6 +419,9 @@ swipe action */ /* No comment provided by engineer. */ "Add servers by scanning QR codes." = "Добавить серверы через QR код."; +/* No comment provided by engineer. */ +"Add short link" = "Добавить короткую ссылку"; + /* No comment provided by engineer. */ "Add team members" = "Добавить сотрудников"; @@ -915,6 +921,9 @@ marked deleted chat item preview text */ /* No comment provided by engineer. */ "Can't call member" = "Не удаётся позвонить члену группы"; +/* alert title */ +"Can't change profile" = "Нельзя поменять профиль"; + /* No comment provided by engineer. */ "Can't invite contact!" = "Нельзя пригласить контакт!"; @@ -1071,6 +1080,9 @@ set passcode view */ /* No comment provided by engineer. */ "Chat with member" = "Чат с членом группы"; +/* No comment provided by engineer. */ +"Chat with members before they join." = "Общайтесь с членами до того как принять их."; + /* No comment provided by engineer. */ "Chats" = "Чаты"; @@ -1218,6 +1230,9 @@ set passcode view */ /* No comment provided by engineer. */ "Connect automatically" = "Соединяться автоматически"; +/* No comment provided by engineer. */ +"Connect faster! 🚀" = "Соединяйтесь быстрее! 🚀"; + /* No comment provided by engineer. */ "Connect to desktop" = "Подключиться к компьютеру"; @@ -1392,6 +1407,9 @@ set passcode view */ /* No comment provided by engineer. */ "Contact preferences" = "Предпочтения контакта"; +/* No comment provided by engineer. */ +"contact should accept…" = "контакт должен принять…"; + /* No comment provided by engineer. */ "Contact will be deleted - this cannot be undone!" = "Контакт будет удален — это нельзя отменить!"; @@ -1968,6 +1986,9 @@ chat item action */ /* No comment provided by engineer. */ "Edit group profile" = "Редактировать профиль группы"; +/* No comment provided by engineer. */ +"Empty message!" = "Пустое сообщение!"; + /* No comment provided by engineer. */ "Enable" = "Включить"; @@ -2160,9 +2181,15 @@ chat item action */ /* alert title */ "Error adding server" = "Ошибка добавления сервера"; +/* No comment provided by engineer. */ +"Error adding short link" = "Ошибка создания короткой ссылки"; + /* No comment provided by engineer. */ "Error changing address" = "Ошибка при изменении адреса"; +/* alert title */ +"Error changing chat profile" = "Ошибка изменения профиля"; + /* No comment provided by engineer. */ "Error changing connection profile" = "Ошибка при изменении профиля соединения"; @@ -2263,7 +2290,10 @@ chat item action */ "Error migrating settings" = "Ошибка миграции настроек"; /* No comment provided by engineer. */ -"Error opening chat" = "Ошибка доступа к чату"; +"Error opening chat" = "Ошибка при открытии чата"; + +/* No comment provided by engineer. */ +"Error opening group" = "Ошибка при открытии группы"; /* alert title */ "Error receiving file" = "Ошибка при получении файла"; @@ -2277,6 +2307,9 @@ chat item action */ /* alert title */ "Error registering for notifications" = "Ошибка регистрации для уведомлений"; +/* alert title */ +"Error rejecting contact request" = "Ошибка отклонения запроса"; + /* alert title */ "Error removing member" = "Ошибка при удалении члена группы"; @@ -2573,8 +2606,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "Пересылка %lld сообщений"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Пересылающий сервер %@ не смог подключиться к серверу назначения %@. Попробуйте позже."; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Пересылающий сервер %1$@ не смог подключиться к серверу назначения %2$@. Попробуйте позже."; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "Адрес пересылающего сервера несовместим с настройками сети: %@."; @@ -2621,6 +2654,9 @@ snd error text */ /* message preview */ "Good morning!" = "Доброе утро!"; +/* shown on group welcome message */ +"group" = "группа"; + /* No comment provided by engineer. */ "Group" = "Группа"; @@ -2678,6 +2714,9 @@ snd error text */ /* snd group event chat item */ "group profile updated" = "профиль группы обновлен"; +/* alert message */ +"Group profile was changed. If you save it, the updated profile will be sent to group members." = "Профиль группы изменен. Если Вы сохраните его, новый профиль будет отправлен членам группы."; + /* No comment provided by engineer. */ "Group welcome message" = "Приветственное сообщение группы"; @@ -3086,6 +3125,9 @@ snd error text */ /* rcv group event chat item */ "left" = "покинул(а) группу"; +/* No comment provided by engineer. */ +"Less traffic on mobile networks." = "Меньше трафик в мобильных сетях."; + /* email subject */ "Let's talk in SimpleX Chat" = "Давайте поговорим в SimpleX Chat"; @@ -3257,6 +3299,9 @@ snd error text */ /* item status text */ "Message forwarded" = "Сообщение переслано"; +/* No comment provided by engineer. */ +"Message instantly once you tap Connect." = "Отправляйте сообщения сразу после соединения."; + /* item status description */ "Message may be delivered later if member becomes active." = "Сообщение может быть доставлено позже, если член группы станет активным."; @@ -3305,6 +3350,9 @@ snd error text */ /* No comment provided by engineer. */ "Messages & files" = "Сообщения"; +/* No comment provided by engineer. */ +"Messages are protected by **end-to-end encryption**." = "Сообщения защищены **end-to-end шифрованием**."; + /* No comment provided by engineer. */ "Messages from %@ will be shown!" = "Сообщения от %@ будут показаны!"; @@ -3470,6 +3518,9 @@ snd error text */ /* notification */ "New events" = "Новые события"; +/* No comment provided by engineer. */ +"New group role: Moderator" = "Новая роль в группах: Модератор"; + /* No comment provided by engineer. */ "New in %@" = "Новое в %@"; @@ -3575,6 +3626,9 @@ snd error text */ /* No comment provided by engineer. */ "No permission to record voice message" = "Нет разрешения для записи голосового сообщения"; +/* alert title */ +"No private routing session" = "Нет сессии конфиденциальной доставки"; + /* No comment provided by engineer. */ "No push server" = "Без сервера нотификаций"; @@ -3760,9 +3814,24 @@ new chat action */ /* authentication reason */ "Open migration to another device" = "Открытие миграции на другое устройство"; +/* new chat action */ +"Open new chat" = "Открыть новый чат"; + +/* new chat action */ +"Open new group" = "Открыть новую группу"; + /* No comment provided by engineer. */ "Open Settings" = "Открыть Настройки"; +/* No comment provided by engineer. */ +"Open to accept" = "Откройте чтобы принять"; + +/* No comment provided by engineer. */ +"Open to connect" = "Откройте чтобы соединиться"; + +/* No comment provided by engineer. */ +"Open to join" = "Откройте чтобы вступить"; + /* No comment provided by engineer. */ "Opening app…" = "Приложение отрывается…"; @@ -4000,6 +4069,9 @@ new chat action */ /* alert title */ "Private routing error" = "Ошибка конфиденциальной доставки"; +/* alert title */ +"Private routing timeout" = "Таймаут конфиденциальной доставки"; + /* No comment provided by engineer. */ "Profile and server connections" = "Профиль и соединения на сервере"; @@ -4018,6 +4090,9 @@ new chat action */ /* alert message */ "Profile update will be sent to your contacts." = "Обновлённый профиль будет отправлен Вашим контактам."; +/* alert message */ +"Profile will be shared with the address." = "Профиль будет добавлен в адрес."; + /* No comment provided by engineer. */ "Prohibit audio/video calls." = "Запретить аудио/видео звонки."; @@ -4060,6 +4135,9 @@ new chat action */ /* No comment provided by engineer. */ "Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Защитите ваш IP адрес от серверов сообщений, выбранных Вашими контактами.\nВключите в настройках *Сети и серверов*."; +/* No comment provided by engineer. */ +"Protocol background timeout" = "Фоновый таймаут протокола"; + /* No comment provided by engineer. */ "Protocol timeout" = "Таймаут протокола"; @@ -4266,6 +4344,9 @@ swipe action */ /* rcv group event chat item */ "removed you" = "удалил(а) Вас из группы"; +/* No comment provided by engineer. */ +"Removes messages and blocks members." = "Может удалять сообщения и блокировать членов."; + /* No comment provided by engineer. */ "Renegotiate" = "Пересогласовать"; @@ -4320,6 +4401,9 @@ swipe action */ /* No comment provided by engineer. */ "Reports" = "Сообщения о нарушениях"; +/* No comment provided by engineer. */ +"request is sent" = "запрос отправлен"; + /* No comment provided by engineer. */ "request to join rejected" = "запрос на вступление отклонён"; @@ -4383,6 +4467,9 @@ swipe action */ /* No comment provided by engineer. */ "Review conditions" = "Посмотреть условия"; +/* No comment provided by engineer. */ +"Review group members" = "Одобрять членов группы"; + /* admission stage */ "Review members" = "Одобрять членов"; @@ -4420,6 +4507,9 @@ chat item action */ /* alert button */ "Save (and notify contacts)" = "Сохранить (и уведомить контакты)"; +/* alert button */ +"Save (and notify members)" = "Сохранить (и уведомить членов)"; + /* alert title */ "Save admission settings?" = "Сохранить настройки вступления?"; @@ -4438,6 +4528,9 @@ chat item action */ /* No comment provided by engineer. */ "Save group profile" = "Сохранить профиль группы"; +/* alert title */ +"Save group profile?" = "Сохранить профиль группы?"; + /* No comment provided by engineer. */ "Save list" = "Сохранить список"; @@ -4630,6 +4723,9 @@ chat item action */ /* No comment provided by engineer. */ "Send up to 100 last messages to new members." = "Отправить до 100 последних сообщений новым членам."; +/* No comment provided by engineer. */ +"Send your private feedback to groups." = "Отправляйте Ваши конфиденциальные предложения группе."; + /* alert message */ "Sender cancelled file transfer." = "Отправитель отменил передачу файла."; @@ -4684,6 +4780,9 @@ chat item action */ /* No comment provided by engineer. */ "Sent reply" = "Отправленный ответ"; +/* No comment provided by engineer. */ +"Sent to your contact after connection." = "Отправляется Вашему контакту после соединения."; + /* No comment provided by engineer. */ "Sent total" = "Всего отправлено"; @@ -4823,12 +4922,18 @@ chat item action */ /* No comment provided by engineer. */ "Share from other apps." = "Поделитесь из других приложений."; +/* No comment provided by engineer. */ +"Share group profile via link" = "Добавить профиль группы в ссылку"; + /* No comment provided by engineer. */ "Share link" = "Поделиться ссылкой"; /* alert button */ "Share profile" = "Поделиться профилем"; +/* alert title */ +"Share profile with address" = "Добавить профиль к адресу"; + /* No comment provided by engineer. */ "Share SimpleX address on social media." = "Поделитесь SimpleX адресом в социальных сетях."; @@ -5106,6 +5211,9 @@ report reason */ /* No comment provided by engineer. */ "TCP connection" = "TCP-соединение"; +/* No comment provided by engineer. */ +"TCP connection bg timeout" = "Фоновый таймаут TCP-соединения"; + /* No comment provided by engineer. */ "TCP connection timeout" = "Таймаут TCP соединения"; @@ -5334,6 +5442,9 @@ report reason */ /* No comment provided by engineer. */ "To support instant push notifications the chat database has to be migrated." = "Для поддержки мгновенный доставки уведомлений данные чата должны быть перемещены."; +/* alert message */ +"To use another profile after connection attempt, delete the chat and use the link again." = "Чтобы использовать другой профиль после попытки соединения, удалите чат и используйте ссылку снова."; + /* No comment provided by engineer. */ "To use the servers of **%@**, accept conditions of use." = "Чтобы использовать серверы оператора **%@**, примите условия использования."; @@ -5988,6 +6099,9 @@ report reason */ /* snd group event chat item */ "you unblocked %@" = "Вы разблокировали %@"; +/* No comment provided by engineer. */ +"You will be able to send messages **only after your request is accepted**." = "Вы сможете отправлять сообщения **только после того как Ваш запрос будет принят**."; + /* No comment provided by engineer. */ "You will be connected to group when the group host's device is online, please wait or check later!" = "Соединение с группой будет установлено, когда хост группы будет онлайн. Пожалуйста, подождите или проверьте позже!"; @@ -6040,7 +6154,7 @@ report reason */ "Your chat profiles" = "Ваши профили чата"; /* No comment provided by engineer. */ -"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Соединение было перемещено на %@, но при смене профиля произошла неожиданная ошибка."; +"Your connection was moved to %@ but an error happened when switching profile." = "Соединение было перемещено на %@, но при смене профиля произошла неожиданная ошибка."; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Ваш контакт отправил файл, размер которого превышает максимальный размер (%@)."; diff --git a/apps/ios/tr.lproj/Localizable.strings b/apps/ios/tr.lproj/Localizable.strings index 5891e33d42..d3db322042 100644 --- a/apps/ios/tr.lproj/Localizable.strings +++ b/apps/ios/tr.lproj/Localizable.strings @@ -358,6 +358,9 @@ swipe action */ /* No comment provided by engineer. */ "Accept connection request?" = "Bağlantı isteği kabul edilsin mi?"; +/* alert title */ +"Accept contact request" = "Kişi isteğini kabul et"; + /* notification body */ "Accept contact request from %@?" = "%@ 'den gelen iletişim isteği kabul edilsin mi?"; @@ -368,14 +371,23 @@ swipe action */ /* alert title */ "Accept member" = "Üyeyi kabul et"; +/* rcv group event chat item */ +"accepted %@" = "kabul edildi %@"; + /* call status */ "accepted call" = "kabul edilen arama"; /* No comment provided by engineer. */ "Accepted conditions" = "Kabul edilmiş koşullar"; +/* chat list item title */ +"accepted invitation" = "davetiye kabul edildi"; + +/* rcv group event chat item */ +"accepted you" = "seni kabul etti"; + /* No comment provided by engineer. */ -"Acknowledged" = "Onaylandı"; +"Acknowledged" = "Onaylı"; /* No comment provided by engineer. */ "Acknowledgement errors" = "Onay hataları"; @@ -395,6 +407,9 @@ swipe action */ /* No comment provided by engineer. */ "Add list" = "Liste ekle"; +/* placeholder for sending contact request */ +"Add message" = "Mesaj ekle"; + /* No comment provided by engineer. */ "Add profile" = "Profil ekle"; @@ -404,6 +419,9 @@ swipe action */ /* No comment provided by engineer. */ "Add servers by scanning QR codes." = "Karekod taratarak sunucuları ekleyin."; +/* No comment provided by engineer. */ +"Add short link" = "Kısa bağlantı ekle"; + /* No comment provided by engineer. */ "Add team members" = "Takım üyesi ekle"; @@ -470,6 +488,9 @@ swipe action */ /* chat item text */ "agreeing encryption…" = "şifreleme kabul ediliyor…"; +/* member criteria value */ +"all" = "tümü"; + /* No comment provided by engineer. */ "All" = "Hepsi"; @@ -479,6 +500,9 @@ swipe action */ /* No comment provided by engineer. */ "All chats and messages will be deleted - this cannot be undone!" = "Tüm konuşmalar ve mesajlar silinecektir. Bu, geri alınamaz!"; +/* alert message */ +"All chats will be removed from the list %@, and the list deleted." = "Tüm sohbetler %@ listesinden kaldırılacak ve liste silinecek."; + /* No comment provided by engineer. */ "All data is erased when it is entered." = "Kullanıldığında bütün veriler silinir."; @@ -506,6 +530,12 @@ swipe action */ /* profile dropdown */ "All profiles" = "Tüm Profiller"; +/* No comment provided by engineer. */ +"All reports will be archived for you." = "Tüm raporlar sizin için arşivlenecek."; + +/* No comment provided by engineer. */ +"All servers" = "Tüm sunucular"; + /* No comment provided by engineer. */ "All your contacts will remain connected." = "Konuştuğun kişilerin tümü bağlı kalacaktır."; @@ -551,6 +581,9 @@ swipe action */ /* No comment provided by engineer. */ "Allow to irreversibly delete sent messages. (24 hours)" = "Gönderilen mesajların kalıcı olarak silinmesine izin ver. (24 saat içinde)"; +/* No comment provided by engineer. */ +"Allow to report messsages to moderators." = "Mesajları moderatörlere bildirmeye izin ver."; + /* No comment provided by engineer. */ "Allow to send files and media." = "Dosya ve medya göndermeye izin ver."; @@ -605,6 +638,9 @@ swipe action */ /* No comment provided by engineer. */ "and %lld other events" = "ve %lld diğer etkinlikler"; +/* report reason */ +"Another reason" = "Başka bir sebep"; + /* No comment provided by engineer. */ "Answer call" = "Aramayı cevapla"; @@ -620,6 +656,9 @@ swipe action */ /* No comment provided by engineer. */ "App encrypts new local files (except videos)." = "Uygulama yerel dosyaları şifreler (videolar dışında)."; +/* No comment provided by engineer. */ +"App group:" = "Uygulama grubu:"; + /* No comment provided by engineer. */ "App icon" = "Uygulama simgesi"; @@ -647,15 +686,36 @@ swipe action */ /* No comment provided by engineer. */ "Apply to" = "Şuna uygula"; +/* No comment provided by engineer. */ +"Archive" = "Arşivle"; + +/* No comment provided by engineer. */ +"Archive %lld reports?" = "%lld raporu arşivle?"; + +/* No comment provided by engineer. */ +"Archive all reports?" = "Tüm raporlar arşivlensin mi?"; + /* No comment provided by engineer. */ "Archive and upload" = "Arşivle ve yükle"; /* No comment provided by engineer. */ "Archive contacts to chat later." = "Daha sonra görüşmek için kişileri arşivleyin."; +/* No comment provided by engineer. */ +"Archive report" = "Raporu arşivle"; + +/* No comment provided by engineer. */ +"Archive report?" = "Rapor arşivlensin mi?"; + +/* swipe action */ +"Archive reports" = "Raporları arşivle"; + /* No comment provided by engineer. */ "Archived contacts" = "Arşivli kişiler"; +/* No comment provided by engineer. */ +"archived report" = "arşivlenmiş rapor"; + /* No comment provided by engineer. */ "Archiving database" = "Veritabanı arşivleniyor"; @@ -731,6 +791,9 @@ swipe action */ /* No comment provided by engineer. */ "Better groups" = "Daha iyi gruplar"; +/* No comment provided by engineer. */ +"Better groups performance" = "Daha iyi grup performansı"; + /* No comment provided by engineer. */ "Better message dates." = "Daha iyi mesaj tarihleri."; @@ -743,6 +806,9 @@ swipe action */ /* No comment provided by engineer. */ "Better notifications" = "Daha iyi bildirimler"; +/* No comment provided by engineer. */ +"Better privacy and security" = "Daha iyi gizlilik ve güvenlik"; + /* No comment provided by engineer. */ "Better security ✅" = "Daha iyi güvenlik ✅"; @@ -816,9 +882,15 @@ marked deleted chat item preview text */ /* No comment provided by engineer. */ "Business chats" = "İş konuşmaları"; +/* No comment provided by engineer. */ +"Businesses" = "İşletmeler"; + /* No comment provided by engineer. */ "By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Sohbet profiline göre (varsayılan) veya [bağlantıya göre](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)."; +/* No comment provided by engineer. */ +"By using SimpleX Chat you agree to:\n- send only legal content in public groups.\n- respect other users – no spam." = "SimpleX Chat'i kullanarak şunları kabul etmiş olursunuz:\n- herkese açık gruplarda yalnızca yasal içerik göndermek.\n- diğer kullanıcılara saygı göstermek – spam yapmamak."; + /* No comment provided by engineer. */ "call" = "Ara"; @@ -849,6 +921,9 @@ marked deleted chat item preview text */ /* No comment provided by engineer. */ "Can't call member" = "Üye aranamaz"; +/* alert title */ +"Can't change profile" = "Profil değiştirilemiyor"; + /* No comment provided by engineer. */ "Can't invite contact!" = "Kişi davet edilemiyor!"; @@ -858,6 +933,9 @@ marked deleted chat item preview text */ /* No comment provided by engineer. */ "Can't message member" = "Üyeye mesaj gönderilemiyor"; +/* No comment provided by engineer. */ +"can't send messages" = "mesaj gönderilemiyor"; + /* alert action alert button new chat action */ @@ -887,6 +965,9 @@ new chat action */ /* No comment provided by engineer. */ "Change" = "Değiştir"; +/* alert title */ +"Change automatic message deletion?" = "Otomatik mesaj silme değiştirilsin mi?"; + /* authentication reason */ "Change chat profiles" = "Sohbet profillerini değiştir"; @@ -993,9 +1074,21 @@ set passcode view */ /* No comment provided by engineer. */ "Chat will be deleted for you - this cannot be undone!" = "Sohbet senden silinecek - bu geri alınamaz!"; +/* chat toolbar */ +"Chat with admins" = "Yöneticilerle sohbet et"; + +/* No comment provided by engineer. */ +"Chat with member" = "Üye ile sohbet et"; + +/* No comment provided by engineer. */ +"Chat with members before they join." = "Üyeler katılmadan önce onlarla sohbet edin."; + /* No comment provided by engineer. */ "Chats" = "Sohbetler"; +/* No comment provided by engineer. */ +"Chats with members" = "Üyelerle sohbetler"; + /* No comment provided by engineer. */ "Check messages every 20 min." = "Her 20 dakikada mesajları kontrol et."; @@ -1035,6 +1128,12 @@ set passcode view */ /* No comment provided by engineer. */ "Clear conversation?" = "Sohbet temizlensin mi?"; +/* No comment provided by engineer. */ +"Clear group?" = "Grup temizlensin mi?"; + +/* No comment provided by engineer. */ +"Clear or delete group?" = "Grup temizlensin veya silinsin mi?"; + /* No comment provided by engineer. */ "Clear private notes?" = "Gizli notlar temizlensin mi?"; @@ -1050,6 +1149,9 @@ set passcode view */ /* No comment provided by engineer. */ "colored" = "renklendirilmiş"; +/* report reason */ +"Community guidelines violation" = "Topluluk kurallarının ihlali"; + /* server test step */ "Compare file" = "Dosya karşılaştır"; @@ -1086,6 +1188,9 @@ set passcode view */ /* No comment provided by engineer. */ "Configure ICE servers" = "ICE sunucularını ayarla"; +/* No comment provided by engineer. */ +"Configure server operators" = "Sunucu operatörlerini yapılandır"; + /* No comment provided by engineer. */ "Confirm" = "Onayla"; @@ -1116,12 +1221,18 @@ set passcode view */ /* No comment provided by engineer. */ "Confirm upload" = "Yüklemeyi onayla"; +/* token status text */ +"Confirmed" = "Onaylandı"; + /* server test step */ "Connect" = "Bağlan"; /* No comment provided by engineer. */ "Connect automatically" = "Otomatik olarak bağlan"; +/* No comment provided by engineer. */ +"Connect faster! 🚀" = "Daha hızlı bağlanın! 🚀"; + /* No comment provided by engineer. */ "Connect to desktop" = "Bilgisayara bağlan"; @@ -1209,6 +1320,9 @@ set passcode view */ /* No comment provided by engineer. */ "Connection and servers status." = "Bağlantı ve sunucuların durumu."; +/* No comment provided by engineer. */ +"Connection blocked" = "Bağlantı engellendi"; + /* alert title */ "Connection error" = "Bağlantı hatası"; @@ -1218,12 +1332,21 @@ set passcode view */ /* chat list item title (it should not be shown */ "connection established" = "bağlantı kuruldu"; +/* No comment provided by engineer. */ +"Connection is blocked by server operator:\n%@" = "Bağlantı sunucu operatörü tarafından engellendi:\n%@"; + +/* No comment provided by engineer. */ +"Connection not ready." = "Bağlantı hazır değil."; + /* No comment provided by engineer. */ "Connection notifications" = "Bağlantı bildirimleri"; /* No comment provided by engineer. */ "Connection request sent!" = "Bağlantı daveti gönderildi!"; +/* No comment provided by engineer. */ +"Connection requires encryption renegotiation." = "Bağlantı için şifreleme yeniden görüşmesi gerekiyor."; + /* No comment provided by engineer. */ "Connection security" = "Bağlantı güvenliği"; @@ -1251,9 +1374,15 @@ set passcode view */ /* No comment provided by engineer. */ "Contact already exists" = "Kişi zaten mevcut"; +/* No comment provided by engineer. */ +"contact deleted" = "kişi silindi"; + /* No comment provided by engineer. */ "Contact deleted!" = "Kişiler silindi!"; +/* No comment provided by engineer. */ +"contact disabled" = "kişi devre dışı"; + /* No comment provided by engineer. */ "contact has e2e encryption" = "kişi uçtan uca şifrelemeye sahiptir"; @@ -1272,9 +1401,15 @@ set passcode view */ /* No comment provided by engineer. */ "Contact name" = "Kişi adı"; +/* No comment provided by engineer. */ +"contact not ready" = "kişi hazır değil"; + /* No comment provided by engineer. */ "Contact preferences" = "Kişi tercihleri"; +/* No comment provided by engineer. */ +"contact should accept…" = "kişi kabul etmeli…"; + /* No comment provided by engineer. */ "Contact will be deleted - this cannot be undone!" = "Kişiler silinecek - bu geri alınamaz !"; @@ -1284,6 +1419,9 @@ set passcode view */ /* No comment provided by engineer. */ "Contacts can mark messages for deletion; you will be able to view them." = "Kişiler silinmesi için mesajları işaretleyebilir; onları görüntüleyebilirsin."; +/* blocking reason */ +"Content violates conditions of use" = "İçerik kullanım koşullarını ihlal ediyor"; + /* No comment provided by engineer. */ "Continue" = "Devam et"; @@ -1326,6 +1464,9 @@ set passcode view */ /* No comment provided by engineer. */ "Create link" = "Bağlantı oluştur"; +/* No comment provided by engineer. */ +"Create list" = "Liste oluştur"; + /* No comment provided by engineer. */ "Create new profile in [desktop app](https://simplex.chat/downloads/). 💻" = "[bilgisayar uygulaması] nda yeni bir profil oluştur(https://simplex.chat/downloads/). 💻"; @@ -1502,12 +1643,18 @@ swipe action */ /* No comment provided by engineer. */ "Delete chat" = "Sohbeti sil"; +/* No comment provided by engineer. */ +"Delete chat messages from your device." = "Sohbet mesajlarını cihazınızdan silin."; + /* No comment provided by engineer. */ "Delete chat profile" = "Sohbet profilini sil"; /* No comment provided by engineer. */ "Delete chat profile?" = "Sohbet profili silinsin mi?"; +/* alert title */ +"Delete chat with member?" = "Üye ile sohbet silinsin mi?"; + /* No comment provided by engineer. */ "Delete chat?" = "Sohbet silinsin mi?"; @@ -1556,6 +1703,9 @@ swipe action */ /* No comment provided by engineer. */ "Delete link?" = "Bağlantı silinsin mi?"; +/* alert title */ +"Delete list?" = "Liste silinsin mi?"; + /* No comment provided by engineer. */ "Delete member message?" = "Kişinin mesajı silinsin mi?"; @@ -1586,6 +1736,9 @@ swipe action */ /* server test step */ "Delete queue" = "Sırayı sil"; +/* No comment provided by engineer. */ +"Delete report" = "Raporu sil"; + /* No comment provided by engineer. */ "Delete up to 20 messages at once." = "Tek seferde en fazla 20 mesaj silin."; @@ -1616,6 +1769,9 @@ swipe action */ /* No comment provided by engineer. */ "Deletion errors" = "Silme hatası"; +/* No comment provided by engineer. */ +"Delivered even when Apple drops them." = "Apple tarafından düşürülse bile teslim edilir."; + /* No comment provided by engineer. */ "Delivery" = "Teslimat"; @@ -1691,6 +1847,12 @@ swipe action */ /* No comment provided by engineer. */ "Disable (keep overrides)" = "Devre dışı bırak (geçersiz kılmaları koru)"; +/* alert title */ +"Disable automatic message deletion?" = "Otomatik mesaj silme devre dışı bırakılsın mı?"; + +/* alert button */ +"Disable delete messages" = "Mesaj silmeyi devre dışı bırak"; + /* No comment provided by engineer. */ "Disable for all" = "Herkes için devre dışı bırak"; @@ -1751,15 +1913,24 @@ swipe action */ /* No comment provided by engineer. */ "Do NOT use SimpleX for emergency calls." = "Acil aramalar için SimpleX'i KULLANMAYIN."; +/* No comment provided by engineer. */ +"Documents:" = "Belgeler:"; + /* No comment provided by engineer. */ "Don't create address" = "Adres oluşturma"; /* No comment provided by engineer. */ "Don't enable" = "Etkinleştirme"; +/* No comment provided by engineer. */ +"Don't miss important messages." = "Önemli mesajları kaçırmayın."; + /* alert action */ "Don't show again" = "Yeniden gösterme"; +/* No comment provided by engineer. */ +"Done" = "Tamam"; + /* No comment provided by engineer. */ "Downgrade and open chat" = "Sürüm düşür ve sohbeti aç"; @@ -1815,6 +1986,9 @@ chat item action */ /* No comment provided by engineer. */ "Edit group profile" = "Grup profilini düzenle"; +/* No comment provided by engineer. */ +"Empty message!" = "Boş mesaj!"; + /* No comment provided by engineer. */ "Enable" = "Etkinleştir"; @@ -1827,6 +2001,9 @@ chat item action */ /* No comment provided by engineer. */ "Enable camera access" = "Kamera erişimini etkinleştir"; +/* No comment provided by engineer. */ +"Enable Flux in Network & servers settings for better metadata privacy." = "Daha iyi meta veri gizliliği için Ağ & sunucu ayarlarında Flux'u etkinleştirin."; + /* No comment provided by engineer. */ "Enable for all" = "Herkes için etkinleştir"; @@ -1938,6 +2115,9 @@ chat item action */ /* chat item text */ "encryption re-negotiation required for %@" = "şifrelemenin yeniden anlaşması %@ için gerekiyor"; +/* No comment provided by engineer. */ +"Encryption renegotiation in progress." = "Şifreleme yeniden görüşmesi devam ediyor."; + /* No comment provided by engineer. */ "ended" = "bitti"; @@ -1992,15 +2172,24 @@ chat item action */ /* No comment provided by engineer. */ "Error accepting contact request" = "Bağlantı isteği kabul edilirken hata oluştu"; +/* alert title */ +"Error accepting member" = "Üyeyi kabul etme hatası"; + /* No comment provided by engineer. */ "Error adding member(s)" = "Üye(ler) eklenirken hata oluştu"; /* alert title */ "Error adding server" = "Sunucu eklenirken hata oluştu"; +/* No comment provided by engineer. */ +"Error adding short link" = "Kısa bağlantı ekleme hatası"; + /* No comment provided by engineer. */ "Error changing address" = "Adres değiştirilirken hata oluştu"; +/* alert title */ +"Error changing chat profile" = "Sohbet profilini değiştirme hatası"; + /* No comment provided by engineer. */ "Error changing connection profile" = "Bağlantı profili değiştirilirken hata oluştu"; @@ -2013,6 +2202,9 @@ chat item action */ /* No comment provided by engineer. */ "Error changing to incognito!" = "Gizli moduna geçerken hata oluştu!"; +/* No comment provided by engineer. */ +"Error checking token status" = "Jeton durumu kontrol hatası"; + /* alert message */ "Error connecting to forwarding server %@. Please try later." = "Yönlendirme sunucusu %@'ya bağlanırken hata oluştu. Lütfen daha sonra deneyin."; @@ -2025,6 +2217,9 @@ chat item action */ /* No comment provided by engineer. */ "Error creating group link" = "Grup bağlantısı oluşturulurken hata oluştu"; +/* alert title */ +"Error creating list" = "Liste oluşturma hatası"; + /* No comment provided by engineer. */ "Error creating member contact" = "Kişi iletişimi oluşturulurken hata oluştu"; @@ -2034,12 +2229,18 @@ chat item action */ /* No comment provided by engineer. */ "Error creating profile!" = "Profil oluşturulurken hata oluştu!"; +/* No comment provided by engineer. */ +"Error creating report" = "Rapor oluşturma hatası"; + /* No comment provided by engineer. */ "Error decrypting file" = "Dosya şifresi çözülürken hata oluştu"; /* alert title */ "Error deleting chat database" = "Sohbet veritabanı silinirken sorun oluştu"; +/* alert title */ +"Error deleting chat with member" = "Üye ile sohbet silme hatası"; + /* No comment provided by engineer. */ "Error deleting chat!" = "Sohbet silinirken hata oluştu!"; @@ -2089,7 +2290,10 @@ chat item action */ "Error migrating settings" = "Ayarlar taşınırken hata oluştu"; /* No comment provided by engineer. */ -"Error opening chat" = "Sohbeti açarken sorun oluştu"; +"Error opening chat" = "Kişiyi hazırlama hatası"; + +/* No comment provided by engineer. */ +"Error opening group" = "Grubu hazırlama hatası"; /* alert title */ "Error receiving file" = "Dosya alınırken sorun oluştu"; @@ -2100,12 +2304,24 @@ chat item action */ /* No comment provided by engineer. */ "Error reconnecting servers" = "Hata sunuculara yeniden bağlanılıyor"; +/* alert title */ +"Error registering for notifications" = "Bildirimler için kayıt hatası"; + +/* alert title */ +"Error rejecting contact request" = "Kişi isteğini reddetme hatası"; + /* alert title */ "Error removing member" = "Kişiyi silerken sorun oluştu"; +/* alert title */ +"Error reordering lists" = "Listeleri yeniden sıralama hatası"; + /* No comment provided by engineer. */ "Error resetting statistics" = "Hata istatistikler sıfırlanıyor"; +/* alert title */ +"Error saving chat list" = "Sohbet listesini kaydetme hatası"; + /* No comment provided by engineer. */ "Error saving group profile" = "Grup profili kaydedilirken sorun oluştu"; @@ -2157,6 +2373,9 @@ chat item action */ /* No comment provided by engineer. */ "Error synchronizing connection" = "Bağlantı senkronizasyonunda hata oluştu"; +/* No comment provided by engineer. */ +"Error testing server connection" = "Sunucu bağlantısını test etme hatası"; + /* No comment provided by engineer. */ "Error updating group link" = "Grup bağlantısı güncellenirken hata oluştu"; @@ -2208,7 +2427,10 @@ snd error text */ "Expand" = "Genişlet"; /* No comment provided by engineer. */ -"expired" = "Süresi dolmuş"; +"expired" = "süresi dolmuş"; + +/* token status text */ +"Expired" = "Süresi dolmuş"; /* No comment provided by engineer. */ "Export database" = "Veritabanını dışarı aktar"; @@ -2234,18 +2456,30 @@ snd error text */ /* No comment provided by engineer. */ "Fast and no wait until the sender is online!" = "Hızlı ve gönderici çevrimiçi olana kadar beklemek yok!"; +/* No comment provided by engineer. */ +"Faster deletion of groups." = "Grupların daha hızlı silinmesi."; + /* No comment provided by engineer. */ "Faster joining and more reliable messages." = "Daha hızlı katılma ve daha güvenilir mesajlar."; +/* No comment provided by engineer. */ +"Faster sending messages." = "Mesajların daha hızlı gönderilmesi."; + /* swipe action */ "Favorite" = "Favori"; +/* No comment provided by engineer. */ +"Favorites" = "Favoriler"; + /* file error alert title */ "File error" = "Dosya hatası"; /* alert message */ "File errors:\n%@" = "Dosya hataları:\n%@"; +/* file error text */ +"File is blocked by server operator:\n%@." = "Dosya sunucu operatörü tarafından engellendi:\n%@."; + /* file error text */ "File not found - most likely file was deleted or cancelled." = "Dosya bulunamadı - muhtemelen dosya silindi veya göderim iptal edildi."; @@ -2321,6 +2555,9 @@ snd error text */ /* No comment provided by engineer. */ "Fix not supported by group member" = "Düzeltme grup üyesi tarafından desteklenmiyor"; +/* No comment provided by engineer. */ +"For all moderators" = "Tüm moderatörler için"; + /* servers error */ "For chat profile %@:" = "Sohbet profili için %@:"; @@ -2330,6 +2567,9 @@ snd error text */ /* No comment provided by engineer. */ "For example, if your contact receives messages via a SimpleX Chat server, your app will deliver them via a Flux server." = "Örneğin, eğer kişiniz SimpleX Sohbet sunucusundan mesajları alıyorsa, uygulamanız bu mesajları Flux sunucusundan iletecektir."; +/* No comment provided by engineer. */ +"For me" = "Benim için"; + /* No comment provided by engineer. */ "For private routing" = "Gizli yönlendirme için"; @@ -2366,8 +2606,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "%lld mesajlarını ilet"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Yönlendirme sunucusu %@, hedef sunucu %@'ya bağlanamadı. Lütfen daha sonra deneyin."; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Yönlendirme sunucusu %1$@, hedef sunucu %2$@'ya bağlanamadı. Lütfen daha sonra deneyin."; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "Yönlendirme sunucusu adresi ağ ayarlarıyla uyumsuz: %@."; @@ -2402,6 +2642,9 @@ snd error text */ /* No comment provided by engineer. */ "Further reduced battery usage" = "Daha da azaltılmış pil kullanımı"; +/* No comment provided by engineer. */ +"Get notified when mentioned." = "Bahsedildiğinde bildirim alın."; + /* No comment provided by engineer. */ "GIFs and stickers" = "GİFler ve çıkartmalar"; @@ -2411,6 +2654,9 @@ snd error text */ /* message preview */ "Good morning!" = "Günaydın!"; +/* shown on group welcome message */ +"group" = "grup"; + /* No comment provided by engineer. */ "Group" = "Grup"; @@ -2441,6 +2687,9 @@ snd error text */ /* No comment provided by engineer. */ "Group invitation is no longer valid, it was removed by sender." = "Grup davet artık geçerli değil, gönderici tarafından silindi."; +/* No comment provided by engineer. */ +"group is deleted" = "grup silindi"; + /* No comment provided by engineer. */ "Group link" = "Grup bağlantısı"; @@ -2465,6 +2714,9 @@ snd error text */ /* snd group event chat item */ "group profile updated" = "grup profili güncellendi"; +/* alert message */ +"Group profile was changed. If you save it, the updated profile will be sent to group members." = "Grup profili değiştirildi. Eğer kaydederseniz, güncellenmiş profil grup üyelerine gönderilecektir."; + /* No comment provided by engineer. */ "Group welcome message" = "Grup hoşgeldin mesajı"; @@ -2474,9 +2726,15 @@ snd error text */ /* No comment provided by engineer. */ "Group will be deleted for you - this cannot be undone!" = "Grup senden silinecektir - bu geri alınamaz!"; +/* No comment provided by engineer. */ +"Groups" = "Gruplar"; + /* No comment provided by engineer. */ "Help" = "Yardım"; +/* No comment provided by engineer. */ +"Help admins moderating their groups." = "Yöneticilere gruplarını yönetmelerinde yardımcı olun."; + /* No comment provided by engineer. */ "Hidden" = "Gizlenmiş"; @@ -2513,6 +2771,9 @@ snd error text */ /* No comment provided by engineer. */ "How it helps privacy" = "Gizliliğinizi nasıl arttırır"; +/* alert button */ +"How it works" = "Nasıl çalışır"; + /* No comment provided by engineer. */ "How SimpleX works" = "SimpleX nasıl çalışır"; @@ -2600,6 +2861,12 @@ snd error text */ /* No comment provided by engineer. */ "inactive" = "inaktif"; +/* report reason */ +"Inappropriate content" = "Uygunsuz içerik"; + +/* report reason */ +"Inappropriate profile" = "Uygunsuz profil"; + /* No comment provided by engineer. */ "Incognito" = "Gizli"; @@ -2666,6 +2933,21 @@ snd error text */ /* No comment provided by engineer. */ "Interface colors" = "Arayüz renkleri"; +/* token status text */ +"Invalid" = "Geçersiz"; + +/* token status text */ +"Invalid (bad token)" = "Geçersiz (kötü jeton)"; + +/* token status text */ +"Invalid (expired)" = "Geçersiz (süresi dolmuş)"; + +/* token status text */ +"Invalid (unregistered)" = "Geçersiz (kayıtlı değil)"; + +/* token status text */ +"Invalid (wrong topic)" = "Geçersiz (yanlış konu)"; + /* invalid chat data */ "invalid chat" = "geçersi̇z sohbet"; @@ -2843,6 +3125,9 @@ snd error text */ /* rcv group event chat item */ "left" = "ayrıldı"; +/* No comment provided by engineer. */ +"Less traffic on mobile networks." = "Mobil ağlarda daha az trafik."; + /* email subject */ "Let's talk in SimpleX Chat" = "Hadi SimpleX Chat'te konuşalım"; @@ -2861,6 +3146,15 @@ snd error text */ /* No comment provided by engineer. */ "Linked desktops" = "Bağlanmış bilgisayarlar"; +/* swipe action */ +"List" = "Liste"; + +/* No comment provided by engineer. */ +"List name and emoji should be different for all lists." = "Liste adı ve emojisi tüm listeler için farklı olmalıdır."; + +/* No comment provided by engineer. */ +"List name..." = "Liste adı..."; + /* No comment provided by engineer. */ "LIVE" = "CANLI"; @@ -2924,12 +3218,21 @@ snd error text */ /* profile update event chat item */ "member %@ changed to %@" = "kişi %1$@ , %2$@ olarak değişti"; +/* No comment provided by engineer. */ +"Member admission" = "Üye kabulü"; + /* rcv group event chat item */ "member connected" = "bağlanıldı"; +/* No comment provided by engineer. */ +"member has old version" = "üye eski sürümde"; + /* item status text */ "Member inactive" = "Üye inaktif"; +/* chat feature */ +"Member reports" = "Üye raporları"; + /* No comment provided by engineer. */ "Member role will be changed to \"%@\". All chat members will be notified." = "Üye rolü \"%@\" olarak değiştirilecektir. Tüm sohbet üyeleri bilgilendirilecektir."; @@ -2939,15 +3242,24 @@ snd error text */ /* No comment provided by engineer. */ "Member role will be changed to \"%@\". The member will receive a new invitation." = "Üye rolü \"%@\" olarak değiştirilecektir. Ve üye yeni bir davetiye alacaktır."; +/* No comment provided by engineer. */ +"Member will be removed from chat - this cannot be undone!" = "Üye sohbetten kaldırılacak - bu geri alınamaz!"; + /* No comment provided by engineer. */ "Member will be removed from group - this cannot be undone!" = "Üye gruptan çıkarılacaktır - bu geri alınamaz!"; +/* alert message */ +"Member will join the group, accept member?" = "Üye gruba katılacak, kabul edilsin mi?"; + /* No comment provided by engineer. */ "Members can add message reactions." = "Grup üyeleri mesaj tepkileri ekleyebilir."; /* No comment provided by engineer. */ "Members can irreversibly delete sent messages. (24 hours)" = "Grup üyeleri, gönderilen mesajları kalıcı olarak silebilir. (24 saat içinde)"; +/* No comment provided by engineer. */ +"Members can report messsages to moderators." = "Üyeler mesajları moderatörlere bildirebilir."; + /* No comment provided by engineer. */ "Members can send direct messages." = "Grup üyeleri doğrudan mesajlar gönderebilir."; @@ -2963,6 +3275,9 @@ snd error text */ /* No comment provided by engineer. */ "Members can send voice messages." = "Grup üyeleri sesli mesajlar gönderebilir."; +/* No comment provided by engineer. */ +"Mention members 👋" = "Üyeleri belirtin 👋"; + /* No comment provided by engineer. */ "Menus" = "Menüler"; @@ -2984,6 +3299,9 @@ snd error text */ /* item status text */ "Message forwarded" = "Mesaj iletildi"; +/* No comment provided by engineer. */ +"Message instantly once you tap Connect." = "Bağlan'a dokunduğunuzda hemen mesaj gönderin."; + /* item status description */ "Message may be delivered later if member becomes active." = "Kullanıcı aktif olursa mesaj iletilebilir."; @@ -3032,9 +3350,15 @@ snd error text */ /* No comment provided by engineer. */ "Messages & files" = "Mesajlar & dosyalar"; +/* No comment provided by engineer. */ +"Messages are protected by **end-to-end encryption**." = "Mesajlar **uçtan uca şifreleme** ile korunmaktadır."; + /* No comment provided by engineer. */ "Messages from %@ will be shown!" = "%@ den gelen mesajlar gösterilecektir!"; +/* alert message */ +"Messages in this chat will never be deleted." = "Bu sohbetteki mesajlar asla silinmeyecek."; + /* No comment provided by engineer. */ "Messages received" = "Mesajlar alındı"; @@ -3107,15 +3431,24 @@ snd error text */ /* marked deleted chat item preview text */ "moderated by %@" = "%@ tarafından yönetilmekte"; +/* member role */ +"moderator" = "moderatör"; + /* time unit */ "months" = "aylar"; +/* swipe action */ +"More" = "Daha fazla"; + /* No comment provided by engineer. */ "More improvements are coming soon!" = "Daha fazla geliştirmeler yakında geliyor!"; /* No comment provided by engineer. */ "More reliable network connection." = "Daha güvenilir ağ bağlantısı."; +/* No comment provided by engineer. */ +"More reliable notifications" = "Daha güvenilir bildirimler"; + /* item status description */ "Most likely this connection is deleted." = "Büyük ihtimalle bu bağlantı silinmiş."; @@ -3125,6 +3458,9 @@ snd error text */ /* notification label action */ "Mute" = "Sustur"; +/* notification label action */ +"Mute all" = "Tümünü sessize al"; + /* No comment provided by engineer. */ "Muted when inactive!" = "Aktif değilken susturuldu!"; @@ -3137,12 +3473,18 @@ snd error text */ /* No comment provided by engineer. */ "Network connection" = "Ağ bağlantısı"; +/* No comment provided by engineer. */ +"Network decentralization" = "Ağ merkeziyetsizliği"; + /* snd error text */ "Network issues - message expired after many attempts to send it." = "Ağ sorunları - birçok gönderme denemesinden sonra mesajın süresi doldu."; /* No comment provided by engineer. */ "Network management" = "Ağ yönetimi"; +/* No comment provided by engineer. */ +"Network operator" = "Ağ operatörü"; + /* No comment provided by engineer. */ "Network settings" = "Ağ ayarları"; @@ -3152,6 +3494,9 @@ snd error text */ /* delete after time */ "never" = "asla"; +/* token status text */ +"New" = "Yeni"; + /* No comment provided by engineer. */ "New chat" = "Yeni sohbet"; @@ -3170,6 +3515,12 @@ snd error text */ /* No comment provided by engineer. */ "New display name" = "Yeni görünen ad"; +/* notification */ +"New events" = "Yeni etkinlikler"; + +/* No comment provided by engineer. */ +"New group role: Moderator" = "Yeni grup rolü: Moderatör"; + /* No comment provided by engineer. */ "New in %@" = "%@ da yeni"; @@ -3179,6 +3530,9 @@ snd error text */ /* No comment provided by engineer. */ "New member role" = "Yeni üye rolü"; +/* rcv group event chat item */ +"New member wants to join the group." = "Yeni üye gruba katılmak istiyor."; + /* notification */ "new message" = "yeni mesaj"; @@ -3191,6 +3545,9 @@ snd error text */ /* No comment provided by engineer. */ "New passphrase…" = "Yeni parola…"; +/* No comment provided by engineer. */ +"New server" = "Yeni sunucu"; + /* No comment provided by engineer. */ "New SOCKS credentials will be used every time you start the app." = "Uygulamayı her başlattığınızda yeni SOCKS kimlik bilgileri kullanılacaktır."; @@ -3206,6 +3563,18 @@ snd error text */ /* Authentication unavailable */ "No app password" = "Uygulama şifresi yok"; +/* No comment provided by engineer. */ +"No chats" = "Hiç sohbet yok"; + +/* No comment provided by engineer. */ +"No chats found" = "Hiç sohbet bulunamadı"; + +/* No comment provided by engineer. */ +"No chats in list %@" = "Listede hiç sohbet yok %@"; + +/* No comment provided by engineer. */ +"No chats with members" = "Üyelerle hiç sohbet yok"; + /* No comment provided by engineer. */ "No contacts selected" = "Hiçbir kişi seçilmedi"; @@ -3236,6 +3605,15 @@ snd error text */ /* No comment provided by engineer. */ "No info, try to reload" = "Bilgi yok, yenilemeyi deneyin"; +/* servers error */ +"No media & file servers." = "Hiç medya & dosya sunucusu yok."; + +/* No comment provided by engineer. */ +"No message" = "Mesaj yok"; + +/* servers error */ +"No message servers." = "Hiç mesaj sunucusu yok."; + /* No comment provided by engineer. */ "No network connection" = "Ağ bağlantısı yok"; @@ -3248,21 +3626,48 @@ snd error text */ /* No comment provided by engineer. */ "No permission to record voice message" = "Sesli mesaj kaydetmek için izin yok"; +/* alert title */ +"No private routing session" = "Özel yönlendirme oturumu yok"; + /* No comment provided by engineer. */ "No push server" = "Yerel"; /* No comment provided by engineer. */ "No received or sent files" = "Hiç alınmış veya gönderilmiş dosya yok"; +/* servers error */ +"No servers for private message routing." = "Özel mesaj yönlendirmesi için hiç sunucu yok."; + +/* servers error */ +"No servers to receive files." = "Dosya almak için hiç sunucu yok."; + +/* servers error */ +"No servers to receive messages." = "Mesaj almak için hiç sunucu yok."; + +/* servers error */ +"No servers to send files." = "Dosya göndermek için hiç sunucu yok."; + /* copied message info in history */ "no text" = "metin yok"; +/* alert title */ +"No token!" = "Hiç jeton yok!"; + +/* No comment provided by engineer. */ +"No unread chats" = "Okunmamış sohbet yok"; + /* No comment provided by engineer. */ "No user identifiers." = "Herhangi bir kullanıcı tanımlayıcısı yok."; /* No comment provided by engineer. */ "Not compatible!" = "Uyumlu değil!"; +/* No comment provided by engineer. */ +"not synchronized" = "senkronize edilmedi"; + +/* No comment provided by engineer. */ +"Notes" = "Notlar"; + /* No comment provided by engineer. */ "Nothing selected" = "Hiçbir şey seçilmedi"; @@ -3275,6 +3680,15 @@ snd error text */ /* No comment provided by engineer. */ "Notifications are disabled!" = "Bildirimler devre dışı!"; +/* alert title */ +"Notifications error" = "Bildirim hatası"; + +/* No comment provided by engineer. */ +"Notifications privacy" = "Bildirim gizliliği"; + +/* alert title */ +"Notifications status" = "Bildirim durumu"; + /* No comment provided by engineer. */ "Now admins can:\n- delete members' messages.\n- disable members (\"observer\" role)" = "Şimdi yöneticiler:\n- üyelerin mesajlarını silebilir\n- üyeleri devre dışı bırakabilir (\"gözlemci\" rolü)"; @@ -3322,6 +3736,9 @@ new chat action */ /* No comment provided by engineer. */ "Onion hosts will not be used." = "Onion ana bilgisayarları kullanılmayacaktır."; +/* No comment provided by engineer. */ +"Only chat owners can change preferences." = "Yalnızca sohbet sahipleri tercihleri değiştirebilir."; + /* No comment provided by engineer. */ "Only client devices store user profiles, contacts, groups, and messages." = "Yalnızca istemci cihazlar kullanıcı profillerini, kişileri, grupları ve **2 katmanlı uçtan uca şifreleme** ile gönderilen mesajları depolar."; @@ -3337,6 +3754,12 @@ new chat action */ /* No comment provided by engineer. */ "Only group owners can enable voice messages." = "Yalnızca grup sahipleri sesli mesajları etkinleştirebilir."; +/* No comment provided by engineer. */ +"Only sender and moderators see it" = "Sadece gönderici ve moderatörler görür"; + +/* No comment provided by engineer. */ +"Only you and moderators see it" = "Sadece siz ve moderatörler görür"; + /* No comment provided by engineer. */ "Only you can add message reactions." = "Sadece siz mesaj tepkileri ekleyebilirsiniz."; @@ -3370,24 +3793,57 @@ new chat action */ /* alert action */ "Open" = "Aç"; +/* No comment provided by engineer. */ +"Open changes" = "Açık değişiklikler"; + /* new chat action */ "Open chat" = "Sohbeti aç"; /* authentication reason */ "Open chat console" = "Sohbet konsolunu aç"; +/* No comment provided by engineer. */ +"Open conditions" = "Açık koşullar"; + /* new chat action */ "Open group" = "Grubu aç"; +/* alert title */ +"Open link?" = "Bağlantıyı aç?"; + /* authentication reason */ "Open migration to another device" = "Başka bir cihaza açık geçiş"; +/* new chat action */ +"Open new chat" = "Yeni sohbet aç"; + +/* new chat action */ +"Open new group" = "Yeni grup aç"; + /* No comment provided by engineer. */ "Open Settings" = "Ayarları aç"; +/* No comment provided by engineer. */ +"Open to accept" = "Kabul etmek için aç"; + +/* No comment provided by engineer. */ +"Open to connect" = "Bağlanmak için aç"; + +/* No comment provided by engineer. */ +"Open to join" = "Katılmak için aç"; + /* No comment provided by engineer. */ "Opening app…" = "Uygulama açılıyor…"; +/* No comment provided by engineer. */ +"Operator" = "Operatör"; + +/* alert title */ +"Operator server" = "Operatör sunucusu"; + +/* No comment provided by engineer. */ +"Or import archive file" = "Veya arşiv dosyasını içe aktar"; + /* No comment provided by engineer. */ "Or paste archive link" = "Veya arşiv bağlantısını yapıştırın"; @@ -3400,6 +3856,12 @@ new chat action */ /* No comment provided by engineer. */ "Or show this code" = "Veya bu kodu göster"; +/* No comment provided by engineer. */ +"Or to share privately" = "Veya özel olarak paylaşmak için"; + +/* No comment provided by engineer. */ +"Organize chats into lists" = "Sohbetleri listelere ayır"; + /* No comment provided by engineer. */ "other" = "diğer"; @@ -3457,9 +3919,18 @@ new chat action */ /* No comment provided by engineer. */ "peer-to-peer" = "eşler arası"; +/* No comment provided by engineer. */ +"pending" = "beklemede"; + /* No comment provided by engineer. */ "Pending" = "Bekleniyor"; +/* No comment provided by engineer. */ +"pending approval" = "onay bekliyor"; + +/* No comment provided by engineer. */ +"pending review" = "inceleme bekliyor"; + /* No comment provided by engineer. */ "Periodic" = "Periyodik olarak"; @@ -3526,6 +3997,18 @@ new chat action */ /* No comment provided by engineer. */ "Please store passphrase securely, you will NOT be able to change it if you lose it." = "Lütfen parolayı güvenli bir şekilde saklayın, kaybederseniz parolayı DEĞİŞTİREMEZSİNİZ."; +/* token info */ +"Please try to disable and re-enable notfications." = "Lütfen bildirimleri devre dışı bırakmayı ve yeniden etkinleştirmeyi deneyin."; + +/* snd group event chat item */ +"Please wait for group moderators to review your request to join the group." = "Lütfen grup moderatörlerinin gruba katılma isteğinizi incelemesini bekleyin."; + +/* token info */ +"Please wait for token activation to complete." = "Lütfen jeton aktivasyonunun tamamlanmasını bekleyin."; + +/* token info */ +"Please wait for token to be registered." = "Lütfen jeton kaydedilene kadar bekleyin."; + /* No comment provided by engineer. */ "Polish interface" = "Lehçe arayüz"; @@ -3541,6 +4024,9 @@ new chat action */ /* No comment provided by engineer. */ "Preset server address" = "Ön ayarlı sunucu adresi"; +/* No comment provided by engineer. */ +"Preset servers" = "Ön ayar sunucuları"; + /* No comment provided by engineer. */ "Preview" = "Ön izleme"; @@ -3550,12 +4036,24 @@ new chat action */ /* No comment provided by engineer. */ "Privacy & security" = "Gizlilik & güvenlik"; +/* No comment provided by engineer. */ +"Privacy for your customers." = "Müşterileriniz için gizlilik."; + +/* No comment provided by engineer. */ +"Privacy policy and conditions of use." = "Gizlilik politikası ve kullanım koşulları."; + /* No comment provided by engineer. */ "Privacy redefined" = "Gizlilik yeniden tanımlandı"; +/* No comment provided by engineer. */ +"Private chats, groups and your contacts are not accessible to server operators." = "Özel sohbetler, gruplar ve kişilerinize sunucu operatörleri tarafından erişilemez."; + /* No comment provided by engineer. */ "Private filenames" = "Gizli dosya adları"; +/* No comment provided by engineer. */ +"Private media file names." = "Özel medya dosyası adları."; + /* No comment provided by engineer. */ "Private message routing" = "Gizli mesaj yönlendirme"; @@ -3571,6 +4069,9 @@ new chat action */ /* alert title */ "Private routing error" = "Gizli yönlendirme hatası"; +/* alert title */ +"Private routing timeout" = "Özel yönlendirme zaman aşımı"; + /* No comment provided by engineer. */ "Profile and server connections" = "Profil ve sunucu bağlantıları"; @@ -3589,6 +4090,9 @@ new chat action */ /* alert message */ "Profile update will be sent to your contacts." = "Profil güncellemesi kişilerinize gönderilecektir."; +/* alert message */ +"Profile will be shared with the address." = "Profil adres bağlantısı aracılığıyla paylaşılacaktır."; + /* No comment provided by engineer. */ "Prohibit audio/video calls." = "Sesli/görüntülü aramaları yasakla."; @@ -3601,6 +4105,9 @@ new chat action */ /* No comment provided by engineer. */ "Prohibit messages reactions." = "Mesajlarda tepkileri yasakla."; +/* No comment provided by engineer. */ +"Prohibit reporting messages to moderators." = "Mesajları moderatörlere bildirmeyi yasakla."; + /* No comment provided by engineer. */ "Prohibit sending direct messages to members." = "Üyelere doğrudan mesaj göndermeyi yasakla."; @@ -3628,6 +4135,9 @@ new chat action */ /* No comment provided by engineer. */ "Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "IP adresinizi kişileriniz tarafından seçilen mesajlaşma yönlendiricilerinden koruyun.\n*Ağ ve sunucular* ayarlarında etkinleştirin."; +/* No comment provided by engineer. */ +"Protocol background timeout" = "Protokol arka plan zaman aşımı"; + /* No comment provided by engineer. */ "Protocol timeout" = "Protokol zaman aşımı"; @@ -3683,7 +4193,7 @@ new chat action */ "Read more in our [GitHub repository](https://github.com/simplex-chat/simplex-chat#readme)." = "[GitHub deposu]nda daha fazlasını okuyun(https://github.com/simplex-chat/simplex-chat#readme)."; /* No comment provided by engineer. */ -"Receipts are disabled" = "Alıcılar devre dışı bırakıldı"; +"Receipts are disabled" = "Alındı onayları devre dışı bırakıldı"; /* No comment provided by engineer. */ "Receive errors" = "Alım sırasında hata"; @@ -3763,6 +4273,15 @@ new chat action */ /* No comment provided by engineer. */ "Reduced battery usage" = "Azaltılmış pil kullanımı"; +/* No comment provided by engineer. */ +"Register" = "Kaydol"; + +/* token info */ +"Register notification token?" = "Bildirim jetonunu kaydet?"; + +/* token status text */ +"Registered" = "Kayıtlı"; + /* alert action reject incoming call via notification swipe action */ @@ -3774,6 +4293,12 @@ swipe action */ /* alert title */ "Reject contact request" = "Bağlanma isteğini reddet"; +/* alert title */ +"Reject member?" = "Üyeyi reddet?"; + +/* No comment provided by engineer. */ +"rejected" = "reddedildi"; + /* call status */ "rejected call" = "geri çevrilmiş çağrı"; @@ -3810,12 +4335,18 @@ swipe action */ /* profile update event chat item */ "removed contact address" = "kişi adresi silindi"; +/* No comment provided by engineer. */ +"removed from group" = "gruptan çıkarıldı"; + /* profile update event chat item */ "removed profile picture" = "profil fotoğrafı silindi"; /* rcv group event chat item */ "removed you" = "sen kaldırıldın"; +/* No comment provided by engineer. */ +"Removes messages and blocks members." = "Mesajları kaldırır ve üyeleri engeller."; + /* No comment provided by engineer. */ "Renegotiate" = "Yeniden müzakere"; @@ -3837,6 +4368,48 @@ swipe action */ /* chat item action */ "Reply" = "Yanıtla"; +/* chat item action */ +"Report" = "Rapor et"; + +/* report reason */ +"Report content: only group moderators will see it." = "İçeriği rapor et: sadece grup moderatörleri görecek."; + +/* report reason */ +"Report member profile: only group moderators will see it." = "Üye profilini rapor et: sadece grup moderatörleri görecek."; + +/* report reason */ +"Report other: only group moderators will see it." = "Diğerini rapor et: sadece grup moderatörleri görecek."; + +/* No comment provided by engineer. */ +"Report reason?" = "Rapor nedeni?"; + +/* alert title */ +"Report sent to moderators" = "Rapor moderatörlere gönderildi"; + +/* report reason */ +"Report spam: only group moderators will see it." = "Spam rapor et: sadece grup moderatörleri görecek."; + +/* report reason */ +"Report violation: only group moderators will see it." = "İhlali rapor et: sadece grup moderatörleri görecek."; + +/* report in notification */ +"Report: %@" = "Rapor: %@"; + +/* No comment provided by engineer. */ +"Reporting messages to moderators is prohibited." = "Mesajları moderatörlere bildirmek yasaktır."; + +/* No comment provided by engineer. */ +"Reports" = "Raporlar"; + +/* No comment provided by engineer. */ +"request is sent" = "istek gönderildi"; + +/* No comment provided by engineer. */ +"request to join rejected" = "katılma isteği reddedildi"; + +/* chat list item title */ +"requested to connect" = "bağlanma isteği gönderildi"; + /* No comment provided by engineer. */ "Required" = "Gerekli"; @@ -3888,6 +4461,24 @@ swipe action */ /* chat item action */ "Reveal" = "Göster"; +/* No comment provided by engineer. */ +"review" = "incele"; + +/* No comment provided by engineer. */ +"Review conditions" = "Koşulları gözden geçir"; + +/* No comment provided by engineer. */ +"Review group members" = "Grup üyelerini gözden geçir"; + +/* admission stage */ +"Review members" = "Üyeleri gözden geçir"; + +/* admission stage description */ +"Review members before admitting (\"knocking\")." = "Üyeleri kabul etmeden önce gözden geçir (\"kapı çalma\")."; + +/* No comment provided by engineer. */ +"reviewed by admins" = "yöneticiler tarafından incelendi"; + /* No comment provided by engineer. */ "Revoke" = "İptal et"; @@ -3916,6 +4507,12 @@ chat item action */ /* alert button */ "Save (and notify contacts)" = "Kaydet (ve kişilere bildir)"; +/* alert button */ +"Save (and notify members)" = "Kaydet (ve üyelere bildir)"; + +/* alert title */ +"Save admission settings?" = "Kabul ayarlarını kaydet?"; + /* alert button */ "Save and notify contact" = "Kaydet ve kişilere bildir"; @@ -3931,6 +4528,12 @@ chat item action */ /* No comment provided by engineer. */ "Save group profile" = "Grup profilini kaydet"; +/* alert title */ +"Save group profile?" = "Grup profilini kaydet?"; + +/* No comment provided by engineer. */ +"Save list" = "Listeyi kaydet"; + /* No comment provided by engineer. */ "Save passphrase and open chat" = "Parolayı kaydet ve sohbeti aç"; @@ -4066,6 +4669,9 @@ chat item action */ /* No comment provided by engineer. */ "Send a live message - it will update for the recipient(s) as you type it" = "Bir canlı mesaj gönder - yazışına göre kişiye(lere) kendini günceller"; +/* No comment provided by engineer. */ +"Send contact request?" = "Kişi isteği gönderilsin mi?"; + /* No comment provided by engineer. */ "Send delivery receipts to" = "Görüldü bilgilerini şuraya gönder"; @@ -4096,18 +4702,30 @@ chat item action */ /* No comment provided by engineer. */ "Send notifications" = "Bildirimler gönder"; +/* No comment provided by engineer. */ +"Send private reports" = "Özel raporlar gönder"; + /* No comment provided by engineer. */ "Send questions and ideas" = "Fikirler ve sorular gönderin"; /* No comment provided by engineer. */ "Send receipts" = "Mesajlar gönder"; +/* No comment provided by engineer. */ +"Send request" = "İstek gönder"; + +/* No comment provided by engineer. */ +"Send request without message" = "Mesaj olmadan istek gönder"; + /* No comment provided by engineer. */ "Send them from gallery or custom keyboards." = "Bunları galeriden veya özel klavyelerden gönder."; /* No comment provided by engineer. */ "Send up to 100 last messages to new members." = "Yeni üyelere 100 adete kadar son mesajları gönderin."; +/* No comment provided by engineer. */ +"Send your private feedback to groups." = "Özel geri bildiriminizi gruplara gönderin."; + /* alert message */ "Sender cancelled file transfer." = "Gönderici dosya gönderimini iptal etti."; @@ -4118,7 +4736,7 @@ chat item action */ "Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "Görüldü bilgisi, tüm görünür sohbet profillerindeki tüm kişiler için etkinleştirilecektir."; /* No comment provided by engineer. */ -"Sending delivery receipts will be enabled for all contacts." = "Tüm kişiler için iletim bilgisi gönderme özelliği etkinleştirilecek."; +"Sending delivery receipts will be enabled for all contacts." = "Tüm kişiler için alındı bilgisi gönderme özelliği etkinleştirilecek."; /* No comment provided by engineer. */ "Sending file will be stopped." = "Dosya gönderimi durdurulacaktır."; @@ -4162,6 +4780,9 @@ chat item action */ /* No comment provided by engineer. */ "Sent reply" = "Gönderilen cevap"; +/* No comment provided by engineer. */ +"Sent to your contact after connection." = "Bağlantıdan sonra kişinize gönderildi."; + /* No comment provided by engineer. */ "Sent total" = "Gönderilen tüm mesajların toplamı"; @@ -4171,6 +4792,9 @@ chat item action */ /* No comment provided by engineer. */ "Server" = "Sunucu"; +/* alert message */ +"Server added to operator %@." = "Sunucu operatör %@'ya eklendi."; + /* No comment provided by engineer. */ "Server address" = "Sunucu adresi"; @@ -4180,6 +4804,15 @@ chat item action */ /* srv error text. */ "Server address is incompatible with network settings." = "Sunucu adresi ağ ayarlarıyla uyumlu değil."; +/* alert title */ +"Server operator changed." = "Sunucu operatörü değişti."; + +/* No comment provided by engineer. */ +"Server operators" = "Sunucu operatörleri"; + +/* alert title */ +"Server protocol changed." = "Sunucu protokolü değişti."; + /* queue info */ "server queue info: %@\n\nlast received msg: %@" = "sunucu kuyruk bilgisi: %1$@\n\nson alınan msj: %2$@"; @@ -4216,6 +4849,9 @@ chat item action */ /* No comment provided by engineer. */ "Set 1 day" = "1 günlüğüne ayarla"; +/* No comment provided by engineer. */ +"Set chat name…" = "Sohbet adını belirle…"; + /* No comment provided by engineer. */ "Set contact name…" = "Kişi adı gir…"; @@ -4228,6 +4864,12 @@ chat item action */ /* No comment provided by engineer. */ "Set it instead of system authentication." = "Sistem kimlik doğrulaması yerine ayarla."; +/* No comment provided by engineer. */ +"Set member admission" = "Üye kabulünü ayarla"; + +/* No comment provided by engineer. */ +"Set message expiration in chats." = "Sohbetlerde mesajın sonlanma süresini ayarla."; + /* profile update event chat item */ "set new contact address" = "yeni kişi adresi ayarla"; @@ -4265,21 +4907,36 @@ chat item action */ /* No comment provided by engineer. */ "Share 1-time link" = "Tek kullanımlık bağlantıyı paylaş"; +/* No comment provided by engineer. */ +"Share 1-time link with a friend" = "Arkadaşınızla 1 defaya mahsus bağlantı paylaşın"; + /* No comment provided by engineer. */ "Share address" = "Adresi paylaş"; +/* No comment provided by engineer. */ +"Share address publicly" = "Adresinizi herkese açık olarak paylaşın"; + /* alert title */ "Share address with contacts?" = "Kişilerle adres paylaşılsın mı?"; /* No comment provided by engineer. */ "Share from other apps." = "Diğer uygulamalardan paylaşın."; +/* No comment provided by engineer. */ +"Share group profile via link" = "Grup profilini bağlantı aracılığıyla paylaş"; + /* No comment provided by engineer. */ "Share link" = "Bağlantıyı paylaş"; /* alert button */ "Share profile" = "Profil paylaş"; +/* alert title */ +"Share profile with address" = "Profili bağlantı aracılığıyla paylaş"; + +/* No comment provided by engineer. */ +"Share SimpleX address on social media." = "SimpleX adresini sosyal medyada paylaşın."; + /* No comment provided by engineer. */ "Share this 1-time invite link" = "Bu tek kullanımlık bağlantı davetini paylaş"; @@ -4289,6 +4946,9 @@ chat item action */ /* No comment provided by engineer. */ "Share with contacts" = "Kişilerle paylaş"; +/* No comment provided by engineer. */ +"Short link" = "Kısa bağlantı"; + /* No comment provided by engineer. */ "Show → on messages sent via private routing." = "Gizli yönlendirme yoluyla gönderilen mesajlarda → işaretini göster."; @@ -4325,9 +4985,21 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX Address" = "SimpleX Adresi"; +/* No comment provided by engineer. */ +"SimpleX address and 1-time links are safe to share via any messenger." = "SimpleX adresi ve 1 defaya mahsus bağlantılar, herhangi bir mesajlaşma uygulaması aracılığıyla paylaşmak için güvenlidir."; + +/* No comment provided by engineer. */ +"SimpleX address or 1-time link?" = "SimpleX adresi mi yoksa 1 defaya mahsus bağlantı mı?"; + /* alert title */ "SimpleX address settings" = "Ayarları otomatik olarak kabul et"; +/* simplex link type */ +"SimpleX channel link" = "SimpleX kanal bağlantısı"; + +/* No comment provided by engineer. */ +"SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app." = "SimpleX Chat ve Flux, Flux tarafından işletilen sunucuları uygulamaya dahil etmek için bir anlaşma yaptı."; + /* No comment provided by engineer. */ "SimpleX Chat security was audited by Trail of Bits." = "SimpleX Chat güvenliği Trails of Bits tarafından denetlenmiştir."; @@ -4403,9 +5075,16 @@ chat item action */ /* No comment provided by engineer. */ "Some non-fatal errors occurred during import:" = "İçe aktarma sırasında bazı önemli olmayan hatalar oluştu:"; +/* alert message */ +"Some servers failed the test:\n%@" = "Bazı sunucular testi geçemedi:\n%@"; + /* notification title */ "Somebody" = "Biri"; +/* blocking reason +report reason */ +"Spam" = "Spam"; + /* No comment provided by engineer. */ "Square, circle, or anything in between." = "Kare,daire, veya aralarında herhangi bir şey."; @@ -4463,6 +5142,9 @@ chat item action */ /* No comment provided by engineer. */ "Stopping chat" = "Sohbeti durdurma"; +/* No comment provided by engineer. */ +"Storage" = "Depolama"; + /* No comment provided by engineer. */ "strike" = "çizik"; @@ -4505,6 +5187,9 @@ chat item action */ /* No comment provided by engineer. */ "Tap button " = "Tuşa bas "; +/* No comment provided by engineer. */ +"Tap Create SimpleX address in the menu to create it later." = "Daha sonra oluşturmak için menüden BasitX adresi oluştur'a dokunun."; + /* No comment provided by engineer. */ "Tap to activate profile." = "Profili etkinleştirmek için tıkla."; @@ -4526,9 +5211,15 @@ chat item action */ /* No comment provided by engineer. */ "TCP connection" = "TCP bağlantısı"; +/* No comment provided by engineer. */ +"TCP connection bg timeout" = "TCP bağlantı arka plan zaman aşımı"; + /* No comment provided by engineer. */ "TCP connection timeout" = "TCP bağlantı zaman aşımı"; +/* No comment provided by engineer. */ +"TCP port for messaging" = "Mesajlaşma için TCP portu"; + /* No comment provided by engineer. */ "TCP_KEEPCNT" = "TCP_KEEPCNT"; @@ -4544,6 +5235,9 @@ chat item action */ /* server test failure */ "Test failed at step %@." = "Test %@ adımında başarısız oldu."; +/* No comment provided by engineer. */ +"Test notifications" = "Bildirimleri test et"; + /* No comment provided by engineer. */ "Test server" = "Sunucuyu test et"; @@ -4565,6 +5259,9 @@ chat item action */ /* No comment provided by engineer. */ "The app can notify you when you receive messages or contact requests - please open settings to enable." = "Uygulama, mesaj veya iletişim isteği aldığınızda sizi bilgilendirebilir - etkinleştirmek için lütfen ayarları açın."; +/* No comment provided by engineer. */ +"The app protects your privacy by using different operators in each conversation." = "Uygulama, her sohbette farklı operatörler kullanarak gizliliğinizi korur."; + /* No comment provided by engineer. */ "The app will ask to confirm downloads from unknown file servers (except .onion)." = "Uygulama bilinmeyen dosya sunucularından indirmeleri onaylamanızı isteyecektir (.onion hariç)."; @@ -4574,6 +5271,9 @@ chat item action */ /* No comment provided by engineer. */ "The code you scanned is not a SimpleX link QR code." = "Taradığınız kod bir SimpleX bağlantı QR kodu değildir."; +/* No comment provided by engineer. */ +"The connection reached the limit of undelivered messages, your contact may be offline." = "Bağlantı, teslim edilmemiş mesajlar limitine ulaştı, kişiniz çevrimdışı olabilir."; + /* No comment provided by engineer. */ "The connection you accepted will be cancelled!" = "Bağlantı kabulünüz iptal edilecektir!"; @@ -4610,6 +5310,12 @@ chat item action */ /* No comment provided by engineer. */ "The old database was not removed during the migration, it can be deleted." = "Eski veritabanı geçiş sırasında kaldırılmadı, silinebilir."; +/* No comment provided by engineer. */ +"The same conditions will apply to operator **%@**." = "Aynı koşullar operatör **%@** için de geçerli olacaktır."; + +/* No comment provided by engineer. */ +"The second preset operator in the app!" = "Uygulamadaki ikinci ön ayar operatörü!"; + /* No comment provided by engineer. */ "The second tick we missed! ✅" = "Özlediğimiz ikinci tik! ✅"; @@ -4619,6 +5325,9 @@ chat item action */ /* No comment provided by engineer. */ "The servers for new connections of your current chat profile **%@**." = "Mevcut sohbet profilinizin yeni bağlantıları için sunucular **%@**."; +/* No comment provided by engineer. */ +"The servers for new files of your current chat profile **%@**." = "Mevcut sohbet profiliniz için yeni dosyaların sunucuları **%@**."; + /* No comment provided by engineer. */ "The text you pasted is not a SimpleX link." = "Yapıştırdığın metin bir SimpleX bağlantısı değildir."; @@ -4628,6 +5337,9 @@ chat item action */ /* No comment provided by engineer. */ "Themes" = "Temalar"; +/* No comment provided by engineer. */ +"These conditions will also apply for: **%@**." = "Bu koşullar ayrıca şunlar için de geçerli olacaktır: **%@**."; + /* No comment provided by engineer. */ "These settings are for your current profile **%@**." = "Bu ayarlar mevcut profiliniz **%@** içindir."; @@ -4640,6 +5352,9 @@ chat item action */ /* No comment provided by engineer. */ "This action cannot be undone - the messages sent and received earlier than selected will be deleted. It may take several minutes." = "Bu işlem geri alınamaz - seçilenden daha önce gönderilen ve alınan mesajlar silinecektir. Bu işlem birkaç dakika sürebilir."; +/* alert message */ +"This action cannot be undone - the messages sent and received in this chat earlier than selected will be deleted." = "Bu işlem geri alınamaz - daha önce seçilen tarihten önceki bu sohbette gönderilen ve alınan mesajlar silinecektir."; + /* No comment provided by engineer. */ "This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "Bu işlem geri alınamaz - profiliniz, kişileriniz, mesajlarınız ve dosyalarınız geri döndürülemez şekilde kaybolacaktır."; @@ -4664,9 +5379,15 @@ chat item action */ /* No comment provided by engineer. */ "This group no longer exists." = "Bu grup artık mevcut değildir."; +/* No comment provided by engineer. */ +"This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link." = "Bu bağlantı daha yeni bir uygulama sürümü gerektiriyor. Lütfen uygulamayı güncelleyin veya kişinizden uyumlu bir bağlantı göndermesini isteyin."; + /* No comment provided by engineer. */ "This link was used with another mobile device, please create a new link on the desktop." = "Bu bağlantı başka bir mobil cihazda kullanıldı, lütfen masaüstünde yeni bir bağlantı oluşturun."; +/* No comment provided by engineer. */ +"This message was deleted or not received yet." = "Bu mesaj silindi veya henüz alınmadı."; + /* No comment provided by engineer. */ "This setting applies to messages in your current chat profile **%@**." = "Bu ayar, geçerli sohbet profiliniz **%@** deki mesajlara uygulanır."; @@ -4685,6 +5406,9 @@ chat item action */ /* No comment provided by engineer. */ "To make a new connection" = "Yeni bir bağlantı oluşturmak için"; +/* No comment provided by engineer. */ +"To protect against your link being replaced, you can compare contact security codes." = "Bağlantınızın değiştirilmesine karşı korunmak için, kişi güvenlik kodlarını karşılaştırabilirsiniz."; + /* No comment provided by engineer. */ "To protect timezone, image/voice files use UTC." = "Zaman bölgesini korumak için,fotoğraf/ses dosyaları UTC kullanır."; @@ -4697,6 +5421,9 @@ chat item action */ /* No comment provided by engineer. */ "To protect your privacy, SimpleX uses separate IDs for each of your contacts." = "Gizliliği korumak için, diğer tüm platformlar gibi kullanıcı kimliği kullanmak yerine, SimpleX mesaj kuyrukları için kişilerinizin her biri için ayrı tanımlayıcılara sahiptir."; +/* No comment provided by engineer. */ +"To receive" = "Almak için"; + /* No comment provided by engineer. */ "To record speech please grant permission to use Microphone." = "Konuşmayı kaydetmek için lütfen Mikrofon kullanma izni verin."; @@ -4709,9 +5436,18 @@ chat item action */ /* No comment provided by engineer. */ "To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page." = "Gizli profilinizi ortaya çıkarmak için **Sohbet profilleriniz** sayfasındaki arama alanına tam bir şifre girin."; +/* No comment provided by engineer. */ +"To send" = "Göndermek için"; + /* No comment provided by engineer. */ "To support instant push notifications the chat database has to be migrated." = "Anlık anlık bildirimleri desteklemek için sohbet veritabanının taşınması gerekir."; +/* alert message */ +"To use another profile after connection attempt, delete the chat and use the link again." = "Bağlantı denemesinden sonra başka bir profili kullanmak için, sohbeti silin ve bağlantıyı tekrar kullanın."; + +/* No comment provided by engineer. */ +"To use the servers of **%@**, accept conditions of use." = "**%@**'nın sunucularını kullanmak için, kullanım koşullarını kabul edin."; + /* No comment provided by engineer. */ "To verify end-to-end encryption with your contact compare (or scan) the code on your devices." = "Kişinizle uçtan uca şifrelemeyi doğrulamak için cihazlarınızdaki kodu karşılaştırın (veya tarayın)."; @@ -4721,6 +5457,9 @@ chat item action */ /* No comment provided by engineer. */ "Toggle incognito when connecting." = "Bağlanırken gizli moda geçiş yap."; +/* token status */ +"Token status: %@." = "Jeton durumu: %@."; + /* No comment provided by engineer. */ "Toolbar opacity" = "Araç çubuğu opaklığı"; @@ -4769,6 +5508,9 @@ chat item action */ /* rcv group event chat item */ "unblocked %@" = "engeli kaldırıldı %@"; +/* No comment provided by engineer. */ +"Undelivered messages" = "Teslim edilmemiş mesajlar"; + /* No comment provided by engineer. */ "Unexpected migration state" = "Beklenmeyen geçiş durumu"; @@ -4835,6 +5577,9 @@ chat item action */ /* swipe action */ "Unread" = "Okunmamış"; +/* No comment provided by engineer. */ +"Unsupported connection link" = "Desteklenmeyen bağlantı bağlantısı"; + /* No comment provided by engineer. */ "Up to 100 last messages are sent to new members." = "Yeni üyelere 100e kadar en son mesajlar gönderildi."; @@ -4850,6 +5595,9 @@ chat item action */ /* No comment provided by engineer. */ "Update settings?" = "Ayarları güncelleyelim mi?"; +/* No comment provided by engineer. */ +"Updated conditions" = "Güncellenmiş koşullar"; + /* rcv group event chat item */ "updated group profile" = "grup profili güncellendi"; @@ -4883,12 +5631,21 @@ chat item action */ /* No comment provided by engineer. */ "Use .onion hosts" = ".onion ana bilgisayarlarını kullan"; +/* No comment provided by engineer. */ +"Use %@" = "%@ kullan"; + /* No comment provided by engineer. */ "Use chat" = "Sohbeti kullan"; /* new chat action */ "Use current profile" = "Şu anki profili kullan"; +/* No comment provided by engineer. */ +"Use for files" = "Dosyalar için kullan"; + +/* No comment provided by engineer. */ +"Use for messages" = "Mesajlar için kullan"; + /* No comment provided by engineer. */ "Use for new connections" = "Yeni bağlantılar için kullan"; @@ -4913,18 +5670,30 @@ chat item action */ /* No comment provided by engineer. */ "Use server" = "Sunucu kullan"; +/* No comment provided by engineer. */ +"Use servers" = "Sunucuları kullan"; + /* No comment provided by engineer. */ "Use SimpleX Chat servers?" = "SimpleX Chat sunucuları kullanılsın mı?"; /* No comment provided by engineer. */ "Use SOCKS proxy" = "SOCKS vekili kullan"; +/* No comment provided by engineer. */ +"Use TCP port %@ when no port is specified." = "Port belirtilmediğinde TCP port %@ kullanın."; + +/* No comment provided by engineer. */ +"Use TCP port 443 for preset servers only." = "Sadece ön ayar sunucuları için TCP port 443 kullanın."; + /* No comment provided by engineer. */ "Use the app while in the call." = "Görüşme sırasında uygulamayı kullanın."; /* No comment provided by engineer. */ "Use the app with one hand." = "Uygulamayı tek elle kullan."; +/* No comment provided by engineer. */ +"Use web port" = "Web portunu kullan"; + /* No comment provided by engineer. */ "User selection" = "Kullanıcı seçimi"; @@ -4997,9 +5766,15 @@ chat item action */ /* No comment provided by engineer. */ "Videos and files up to 1gb" = "1gb'a kadar videolar ve dosyalar"; +/* No comment provided by engineer. */ +"View conditions" = "Koşulları görüntüle"; + /* No comment provided by engineer. */ "View security code" = "Güvenlik kodunu görüntüle"; +/* No comment provided by engineer. */ +"View updated conditions" = "Güncellenmiş koşulları görüntüle"; + /* chat feature */ "Visible history" = "Görünür geçmiş"; @@ -5081,6 +5856,9 @@ chat item action */ /* No comment provided by engineer. */ "when IP hidden" = "IP gizliyken"; +/* No comment provided by engineer. */ +"When more than one operator is enabled, none of them has metadata to learn who communicates with whom." = "Birden fazla operatör etkinleştirildiğinde, hiçbiri kimin kiminle iletişim kurduğunu öğrenmek için meta veriye sahip değildir."; + /* No comment provided by engineer. */ "When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." = "Biriyle gizli bir profil paylaştığınızda, bu profil sizi davet ettikleri gruplar için kullanılacaktır."; @@ -5135,6 +5913,9 @@ chat item action */ /* No comment provided by engineer. */ "You accepted connection" = "Bağlantıyı onayladın"; +/* snd group event chat item */ +"you accepted this member" = "bu üyeyi kabul ettiniz"; + /* No comment provided by engineer. */ "You allow" = "İzin veriyorsunuz"; @@ -5144,6 +5925,9 @@ chat item action */ /* No comment provided by engineer. */ "You are already connected to %@." = "Zaten %@'a bağlısınız."; +/* No comment provided by engineer. */ +"You are already connected with %@." = "Zaten %@ ile bağlantıdasınız."; + /* new chat sheet message */ "You are already connecting to %@." = "Zaten %@'a bağlanıyorsunuz."; @@ -5183,6 +5967,9 @@ chat item action */ /* No comment provided by engineer. */ "You can change it in Appearance settings." = "Görünüm ayarlarından değiştirebilirsiniz."; +/* No comment provided by engineer. */ +"You can configure servers via settings." = "Sunucuları ayarlar aracılığıyla yapılandırabilirsiniz."; + /* No comment provided by engineer. */ "You can create it later" = "Daha sonra oluşturabilirsiniz"; @@ -5207,6 +5994,9 @@ chat item action */ /* No comment provided by engineer. */ "You can send messages to %@ from Archived contacts." = "Arşivlenen kişilerden %@'ya mesaj gönderebilirsiniz."; +/* No comment provided by engineer. */ +"You can set connection name, to remember who the link was shared with." = "Bağlantı adını ayarlayabilirsiniz, böylece bağlantının kiminle paylaşıldığını hatırlarsınız."; + /* No comment provided by engineer. */ "You can set lock screen notification preview via settings." = "Kilit ekranı bildirim önizlemesini ayarlar üzerinden ayarlayabilirsiniz."; @@ -5231,6 +6021,9 @@ chat item action */ /* alert message */ "You can view invitation link again in connection details." = "Bağlantı detaylarından davet bağlantısını yeniden görüntüleyebilirsin."; +/* alert message */ +"You can view your reports in Chat with admins." = "Raporlarınızı Yöneticilerle Sohbet bölümünde görüntüleyebilirsiniz."; + /* No comment provided by engineer. */ "You can't send messages!" = "Mesajlar gönderemezsiniz!"; @@ -5300,9 +6093,15 @@ chat item action */ /* chat list item description */ "you shared one-time link incognito" = "tek kullanımlık link paylaştınız gizli"; +/* token info */ +"You should receive notifications." = "Bildirim almanız gerekiyor."; + /* snd group event chat item */ "you unblocked %@" = "engelini kaldırdın %@"; +/* No comment provided by engineer. */ +"You will be able to send messages **only after your request is accepted**." = "Mesaj gönderebilmek için **isteğinizin kabul edilmesini beklemelisiniz**."; + /* No comment provided by engineer. */ "You will be connected to group when the group host's device is online, please wait or check later!" = "Grup sahibinin cihazı çevrimiçi olduğunda gruba bağlanacaksınız, lütfen bekleyin veya daha sonra kontrol edin!"; @@ -5321,6 +6120,9 @@ chat item action */ /* No comment provided by engineer. */ "You will still receive calls and notifications from muted profiles when they are active." = "Aktif olduklarında sessize alınmış profillerden arama ve bildirim almaya devam edersiniz."; +/* No comment provided by engineer. */ +"You will stop receiving messages from this chat. Chat history will be preserved." = "Bu sohbetten mesaj almaya son vereceksiniz. Sohbet geçmişi korunacaktır."; + /* No comment provided by engineer. */ "You will stop receiving messages from this group. Chat history will be preserved." = "Bu gruptan artık mesaj almayacaksınız. Sohbet geçmişi korunacaktır."; @@ -5351,8 +6153,11 @@ chat item action */ /* No comment provided by engineer. */ "Your chat profiles" = "Sohbet profillerin"; +/* alert message */ +"Your chat was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Sohbetiniz %@'ya taşındı ancak sizi profile yönlendirirken beklenmedik bir hata oluştu."; + /* No comment provided by engineer. */ -"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Bağlantınız %@ adresine taşındı ancak sizi profile yönlendirirken beklenmedik bir hata oluştu."; +"Your connection was moved to %@ but an error happened when switching profile." = "Bağlantınız %@ adresine taşındı ancak sizi profile yönlendirirken beklenmedik bir hata oluştu."; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Kişiniz şu anda desteklenen maksimum boyuttan (%@) daha büyük bir dosya gönderdi."; @@ -5402,6 +6207,9 @@ chat item action */ /* No comment provided by engineer. */ "Your server address" = "Sunucu adresiniz"; +/* No comment provided by engineer. */ +"Your servers" = "Sunucularınız"; + /* No comment provided by engineer. */ "Your settings" = "Ayarlarınız"; diff --git a/apps/ios/uk.lproj/Localizable.strings b/apps/ios/uk.lproj/Localizable.strings index ef65d87fa5..d4f0b2d35b 100644 --- a/apps/ios/uk.lproj/Localizable.strings +++ b/apps/ios/uk.lproj/Localizable.strings @@ -1210,10 +1210,10 @@ set passcode view */ "Connect to your friends faster." = "Швидше спілкуйтеся з друзями."; /* new chat sheet title */ -"Connect to yourself?\nThis is your own one-time link!" = "Підключитися до себе? \nЦе ваше власне одноразове посилання!"; +"Connect to yourself?\nThis is your own one-time link!" = "Підключитися до себе?\nЦе ваше власне одноразове посилання!"; /* new chat sheet title */ -"Connect to yourself?\nThis is your own SimpleX address!" = "З'єднатися з самим собою? \nЦе ваша власна SimpleX-адреса!"; +"Connect to yourself?\nThis is your own SimpleX address!" = "З'єднатися з самим собою?\nЦе ваша власна SimpleX-адреса!"; /* new chat sheet title */ "Connect via contact address" = "Підключіться за контактною адресою"; @@ -2543,8 +2543,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "Пересилання повідомлень %lld"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Серверу переадресації %@ не вдалося з'єднатися з сервером призначення %@. Спробуйте пізніше."; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "Серверу переадресації %1$@ не вдалося з'єднатися з сервером призначення %2$@. Спробуйте пізніше."; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "Адреса сервера переадресації несумісна з налаштуваннями мережі: %@."; @@ -5742,7 +5742,7 @@ chat item action */ "Your chat profiles" = "Ваші профілі чату"; /* No comment provided by engineer. */ -"Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." = "Ваше з'єднання було переміщено на %@, але під час перенаправлення на профіль сталася несподівана помилка."; +"Your connection was moved to %@ but an error happened when switching profile." = "Ваше з'єднання було переміщено на %@, але під час перенаправлення на профіль сталася несподівана помилка."; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Ваш контакт надіслав файл, розмір якого перевищує підтримуваний на цей момент максимальний розмір (%@)."; diff --git a/apps/ios/zh-Hans.lproj/Localizable.strings b/apps/ios/zh-Hans.lproj/Localizable.strings index 1122dcbc95..4a05f60226 100644 --- a/apps/ios/zh-Hans.lproj/Localizable.strings +++ b/apps/ios/zh-Hans.lproj/Localizable.strings @@ -2513,8 +2513,8 @@ snd error text */ /* No comment provided by engineer. */ "Forwarding %lld messages" = "正在转发 %lld 条消息"; -/* No comment provided by engineer. */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "转发服务器 %@ 无法连接到目标服务器 %@。请稍后尝试。"; +/* alert message */ +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "转发服务器 %1$@ 无法连接到目标服务器 %2$@。请稍后尝试。"; /* No comment provided by engineer. */ "Forwarding server address is incompatible with network settings: %@." = "转发服务器地址与网络设置不兼容:%@。"; diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index 7438f85fd8..769efecad8 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -1505,7 +1505,7 @@ object ChatController { val r = sendCmd(rh, CC.APIChangePreparedContactUser(contactId, newUserId)) if (r is API.Result && r.res is CR.ContactUserChanged) return r.res.toContact Log.e(TAG, "apiChangePreparedContactUser bad response: ${r.responseType} ${r.details}") - AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_changing_contact_user), "${r.responseType}: ${r.details}") + AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_changing_user), "${r.responseType}: ${r.details}") return null } @@ -1513,7 +1513,7 @@ object ChatController { val r = sendCmd(rh, CC.APIChangePreparedGroupUser(groupId, newUserId)) if (r is API.Result && r.res is CR.GroupUserChanged) return r.res.toGroup Log.e(TAG, "apiChangePreparedGroupUser bad response: ${r.responseType} ${r.details}") - AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_changing_group_user), "${r.responseType}: ${r.details}") + AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_changing_user), "${r.responseType}: ${r.details}") return null } diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml index 4e08994b62..6216ff3368 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml @@ -2426,8 +2426,7 @@ إلا بعد قبول طلبك.]]> اتصل يجب أن يقبل جهة الاتصال… - خطأ في تغيير مستخدم جهة الاتصال - خطأ في تغيير مستخدم المجموعة + خطأ في تغيير مستخدم جهة الاتصال خطأ في إعداد جهة الاتصال خطأ في إعداد المجموعة خطأ في رفض طلب جهة الاتصال @@ -2453,4 +2452,18 @@ ملف تعريفك لا يمكن تغيير ملف التعريف لاستخدام ملف تعريف آخر بعد محاولة الاتصال، احذف الدردشة واستخدم الرابط مرة أخرى. + الدردشة مع الالمُدراء + الدردشة مع الأعضاء قبل انضمامهم. + اتصل بشكل أسرع! 🚀 + تقليل حركة البيانات على شبكات الجوّال. + راسل فورًا بمجرد النقر على \"اتصل\". + دور جديد للمجموعة: مشرف + لا توجد جلسة توجيه خاصة + انتهت مهلة التوجيه الخاص + انتهت مهلة خلفية البروتوكول + يزيل الرسائل ويحظر الأعضاء. + مراجعة أعضاء المجموعة + أرسل ملاحظاتك الخاصة إلى المجموعات. + مهلة اتصال TCP في الخلفية + جارِ تحميل ملف التعريف… diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index cfe9dd3722..2fe4f5b9a3 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -220,10 +220,9 @@ Error updating chat list Error creating chat list Error loading chat lists - Error preparing contact - Error preparing group - Error changing contact user - Error changing group user + Error opening chat + Error opening group + Error changing profile Instant notifications @@ -851,7 +850,7 @@ Share profile Select chat profile Error switching profile - Your connection was moved to %s but an unexpected error occurred while redirecting you to the profile. + Your connection was moved to %s but an error happened when switchig profile. Or scan QR code Keep unused invitation? You can view invitation link again in connection details. @@ -1093,8 +1092,8 @@ Business address Add your team members to the conversations. Add short link - Share profile via link - Profile will be shared via the address link. + Share profile with address + Profile will be shared with the address. Share profile Share group profile via link diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml index 56d54b593b..6d04ab62cb 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ca/strings.xml @@ -2408,8 +2408,7 @@ després que la sol·licitud sigui acceptada.]]> Connectar el contacte hauria d\'acceptar… - Error en canviar el contacte - Error en canviar el compte del grup + Error en canviar el perfil Error en preparar el contacte Error en preparar el grup Error en rebutjar la sol·licitud de contacte @@ -2434,4 +2433,17 @@ Per utilitzar un altre perfil després d\'un intent de connexió, suprimiu el xat i torneu a utilitzar l\'enllaç. Missatge de benvinguda El vostre perfil + Xatejar amb l\'administració + Xatejar amb membres abans que s\'uneixin. + Connexió més ràpida! 🚀 + Menys trànsit a les xarxes mòbils. + Enviar missatges a l\'instant en tocar Connectar. + Nou rol de grup: Moderador(a) + Sense sessió d\'encaminament privada + Temps d\'espera d\'encaminament privat + Temps d\'espera del protocol en segon pla + Elimina missatges i bloca membres. + Revisió de membres del grup + Envieu comentaris privats a grups. + Temps d\'espera de la connexió TCP en segon pla diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml index 2e406fc9df..f1a0169f12 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml @@ -2474,11 +2474,11 @@ Chats mit Mitgliedern Chat mit Administratoren Keine Chats mit Mitgliedern - Entfernen + Ablehnen hat Sie übernommen Chat mit einem Mitglied %d Nachrichten - Ein Mitglied wird der Gruppe beitreten. Übernehmen? + Mitglied wird der Gruppe beitreten. Übernehmen? Ein neues Mitglied will der Gruppe beitreten. Überprüfung Von Administratoren überprüft @@ -2494,9 +2494,9 @@ Chat mit einem Mitglied Übernehmen Bitte warten Sie auf die Überprüfung Ihrer Anfrage durch die Gruppen-Moderatoren, um der Gruppe beitreten zu können. - Gruppe wird gelöscht + Gruppe wurde gelöscht Beitrittsanfrage abgelehnt - Von der Gruppe entfernt + Aus der Gruppe entfernt Sie haben die Gruppe verlassen Kontakt deaktiviert Nicht synchronisiert @@ -2516,15 +2516,14 @@ sobald Ihre Anfrage akzeptiert wurde.]]> Verbinden Kontakt sollte akzeptieren… - Fehler beim Ändern des Benutzer-Kontakts - Fehler beim Wechseln der Benutzer-Gruppe + Fehler beim Ändern des Profils Fehler bei der Kontaktaufnahme Fehler beim Vorbereiten der Gruppe Fehler bei der Ablehnung der Kontaktanfrage Der Gruppe beitreten Chat öffnen - Neuen Chat eröffnen - Neue Gruppe eröffnen + Neuen Chat öffnen + Neue Gruppe öffnen Zum Akzeptieren öffnen Zum Verbinden öffnen Zum Beitreten öffnen @@ -2543,4 +2542,18 @@ Ihr Profil Änderung des Profils nicht möglich Wenn Sie nach dem Verbindungsversuch ein anderes Profil verwenden möchten, löschen Sie den Chat und verwenden Sie den Link erneut. + Chat mit Administratoren + Chat mit Mitgliedern bevor sie beitreten. + Schneller miteinander verbinden! 🚀 + Weniger Datenverkehr in mobilen Netzen. + Sobald Sie auf Verbinden tippen, erhalten Sie sofort eine Nachricht. + Neue Gruppen-Rolle: Moderator + Keine private Routing-Sitzung + Zeitüberschreitung der privaten Routing-Sitzung + Protokoll Hintergrund-Zeitüberschreitung + Entfernt Nachrichten und blockiert Mitglieder. + Gruppenmitglieder überprüfen + Senden Sie Ihr privates Feedback an Gruppen. + TCP-Verbindung Hintergrund-Zeitüberschreitung + Profil wird geladen… diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml index cbc07aad20..9ac5ccc517 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/es/strings.xml @@ -356,7 +356,7 @@ Base de datos cifrada Error al expulsar miembro Los miembros pueden enviar mensajes de voz. - en modo incógnito mediante enlace de dirección del contacto + en modo incógnito mediante dirección de contacto ¡Error al crear perfil! No se pudo cargar el chat Fallo en la carga de chats @@ -495,7 +495,7 @@ Error en la entrega del mensaje Lo más probable es que este contacto haya eliminado la conexión contigo. Moderar - unirte como %s + Unirte como %s Sólo se pueden enviar 10 imágenes al mismo tiempo ¡Archivo grande! Silenciar @@ -871,7 +871,7 @@ mediante %1$s Servicio SimpleX Chat ¡Bienvenido %1$s! - has sido invitado al grupo + Has sido invitado al grupo Esperando archivo Esperando imagen Mensaje de voz (%1$s ) @@ -917,7 +917,7 @@ Te conectarás con todos los miembros del grupo. tu Estás conectado al servidor usado para recibir mensajes de este contacto. - mediante enlace de dirección de contacto + mediante dirección de contacto mediante enlace de grupo enlace de un solo uso has compartido enlace de un solo uso en módo incógnito @@ -1136,7 +1136,7 @@ Asegúrate de que el archivo tiene la sintaxis YAML correcta. Exporta el tema para tener un ejemplo de la estructura del archivo de tema. La actualización del perfil se enviará a tus contactos. Mensaje recibido - Guardar configuración de auto aceptar + Guardar configuración de dirección SimpleX Puedes compartir tu dirección como enlace o código QR para que cualquiera pueda conectarse contigo. ¿Guardar configuración\? Secundario @@ -1379,7 +1379,7 @@ - conexión al servicio de directorio (BETA)! \n- confirmaciones de entrega (hasta 20 miembros). \n- mayor rapidez y estabilidad. - Enviar mensaje directo + envia para conectar conectado directamente Expandir Error de renegociación de cifrado @@ -2036,7 +2036,7 @@ Debes permitir que tus contacto te llamen para poder llamarles. Error al conectar con el servidor de reenvío %1$s. Por favor, inténtalo más tarde. La dirección del servidor de reenvío es incompatible con la configuración de red: %1$s. - El servidor de reenvío %1$s no ha podido conectarse al servidor de destino %2$s. Por favor, intentalo más tarde. + El servidor de reenvío %1$s no ha podido conectarse al servidor de destino %2$s. Por favor, inténtalo más tarde. La versión del servidor de reenvío es incompatible con la configuración de red: %1$s. Ningún contacto filtrado Difumina para mayor privacidad @@ -2435,4 +2435,49 @@ Aceptar como miembro El miembro se unirá al grupo, ¿aceptas al miembro? Añadir enlace corto + Aceptar petición de contacto + Añadir mensaje + después de que tu petición sea aceptada.]]> + Chat con administradores + Chat con miembros antes de unirse. + Conectar + ¡Conecta más rápido! 🚀 + el contacto debe aceptar… + Error al cambiar el perfil + Error al preparar el contacto + Error al preparar el grupo + Error al rechazar la solicitud del contacto + Unirte al grupo + Menos tráfico en redes móviles. + Mensajea ya tras pulsar Contactar. + Nuevo rol de grupo: Moderador + Ninguna sesión con enrutamiento privado + Abrir chat + Abrir chat nuevo + Abrir grupo nuevo + Abrir para aceptar + Abrir para conectar + Abrir para unirte + Timeout enrutamiento privado + El perfil será compartido mediante la dirección de contacto + Timeout protocolo en segundo plano + Rechazar solicitud del contacto + Eliminar mensajes y bloquear miembros. + petición enviada + Revisar miembros del grupo + ¿Enviar solicitud de contacto? + Enviar solicitud + Enviar solicitud sin mensaje + Envía tu comentario privado a los grupos. + Enviadp a tu contacto tras la conexión. + Compartir perfil de grupo mediante enlace + Compartir perfil + Compartir perfil mediante enlace + Timeout conexión TCP sp + El remitente NO será notificado. + Para usar otro perfil tras el intento de conexión, elimina el chat y usa el enlace de nuevo. + Mensaje de bienvenida + Tu perfil + cifrado de extremo a extremo.]]> + No se puede cambiar el perfil diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml index 394dbcfc54..cf43a7c944 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fa/strings.xml @@ -1952,4 +1952,36 @@ ارتباط به حد نصاب پیام‌های نرسیده رسید، ممکن است مخاطب شما آفلاین باشد. خطا در به‌روزرسانی فهرست گفتگو افزودن پیام + امکان تماس وجود ندارد! + خطا در ارسال پیام + تماس با مخاطب امکان پذیر نیست + تماس با عضو گروه ممکن نیست + تغییر پروفایل امکان پذیر نیست + ارسال پیام به عضو گروه امکان پذیر نیست + ارسال پیام امکان پذیر نیست + بایگانی گزارش ها + تماس های با کیفیت تر + عملکرد بهتر گروه ها + امنیت و حریم خصوصی قوی تر + تغییر لیست + تغییر ترتیب + چت + این چت از قبل وجود دارد! + گفتگو با اعضا + پیام برای همه اعضا حذف خواهد شد - این عمل قابل بازگشت نیست! + بخش های حذف شده + بخش های دانلود شده + برای مجوز میکروفون، روی آیکون اطلاعات کنار نوار آدرس کلیک کنید + تکمیل شد + تایید حذف مخاطب؟ + اتصال + اتصال + متصل + اتصال سریع تر! 🚀 + درحال اتصال + درحال اتصال به مخاطب، لطفا منتظر بمانید یا بعداً بررسی کنید! + وضعیت اتصال و سرور ها + اتصال آماده نیست + مخاطب حذف شد. + مخاطبین diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml index 30cf5a05c7..8b4b558d01 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml @@ -327,7 +327,7 @@ cím módosítása… Társítva a hordozható eszközhöz Jelenlegi jelmondat… - Fájl kiválasztása + Válasszon ki egy fájlt Kép törlése Fájl létrehozása Tikos csoport létrehozása @@ -2410,8 +2410,7 @@ Hiba történt a meghívó elutasításakor Hiba a kapcsolat előkészítésekor Hiba a csoport előkészítésekor - Hiba a partner módosításakor - Hiba a csoportfelhasználó módosításakor + Hiba a profil módosításakor Megnyitás a csatlakozáshoz Megnyitás a kapcsolódáshoz Megnyitás az elfogadáshoz @@ -2436,4 +2435,18 @@ Csoportprofil megosztása hivatkozáson keresztül Nem lehet módosítani a profilt Másik profil használatához a kapcsolatfelvételi kísérlet után törölje a csevegést, és használja újra a hivatkozást. + Csevegés az adminisztrátorokkal + Csevegés a tagokkal mielőtt csatlakoznának. + Gyorsabb kapcsolódás! 🚀 + Kevesebb adatforgalom a mobilhálózatokon. + Az üzenet azonnal megjelenik, amint a kapcsolódás gombra koppint. + Új szerepkör: Moderátor + Nincs privát útválasztási munkamenet + Privát útválasztás időtúllépése + Protokoll időtúllépése a háttérben + Üzenetek eltávolítása és a tagok tiltása. + Csoporttagok áttekintése + Küldjön privát visszajelzést a csoportoknak. + TCP-kapcsolat időtúllépése a háttérben + Profil betöltése… diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml index f3ff19b293..5b01873dbf 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml @@ -2400,7 +2400,7 @@ Attendi che i moderatori del gruppo revisionino la tua richiesta di entrare nel gruppo. hai accettato questo membro revisiona - Ammissione del membro + Ammissione dei membri Nessuna chat con membri off Revisiona i membri @@ -2445,8 +2445,7 @@ solo dopo che la tua richiesta verrà accettata.]]> Connetti il contatto dovrebbe accettare… - Errore cambiando il contatto - Errore cambiando l\'utente del gruppo + Errore cambiando l\'profilo Errore di preparazione del contatto Errore di preparazione del gruppo Errore nel rifiuto della richiesta di contatto @@ -2472,4 +2471,18 @@ Il tuo profilo Impossibile cambiare profilo Per usare un altro profilo dopo il tentativo di connessione, elimina la chat e usa di nuovo il link. + Chatta con gli amministratori + Chatta con i membri prima che si uniscano. + Connettiti più velocemente! 🚀 + Meno traffico sulle reti mobili. + Parla immediatamente appena tocchi \"Connetti\". + Nuovo ruolo nei gruppi: Moderatore + Nessuna sessione di instradamento privato + Scadenza dell\'instradamento privato + Scadenza del protocollo in sec. piano + Rimuove i messaggi e blocca i membri. + Revisiona i membri del gruppo + Invia i tuoi commenti privati ai gruppi. + Scadenza conness. TCP in sec. piano + Caricamento del profilo… diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml index 760bc3cc17..b71831c9e0 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/iw/strings.xml @@ -2134,4 +2134,8 @@ שמור וחבר מחדש שקיפות אנא בדוק שקישור SimpleX תקין. + פתח שיחה + פתח שיחה חדשה + פתח קבוצה חדשה + שלח את המשוב הפרטי שלך לקבוצות. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml index d190441ec3..96793dd332 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ru/strings.xml @@ -175,7 +175,7 @@ Чаты соединяется… Вы приглашены в группу - вступить как %s + Вступить как %s соединяется… Нажмите, чтобы начать чат Соединиться с разработчиками @@ -1201,7 +1201,7 @@ Пользовательское время Отправить Пригласить друзей - Сохранить настройки автоприема + Сохранить настройки адреса SimpleX Изменить режим самоуничтожения Изменить код самоуничтожения Самоуничтожение @@ -1464,7 +1464,7 @@ Ошибка при создании контакта Послать прямое сообщение контакту Ошибка отправки приглашения - Послать прямое сообщение + Отправьте сообщение чтобы соединиться соединен напрямую Раскрыть Блокируйте членов группы @@ -2521,4 +2521,53 @@ 1 чат с членом группы SimpleX ссылка канала добавить короткую ссылку + Принять запрос на соединение + Добавить сообщение + О себе: + Нельзя поменять профиль + end-to-end шифрованием.]]> + только после того как Ваш запрос будет принят.]]> + Чат с админами + Общайтесь с членами до того как принять их. + Соединиться + Соединяйтесь быстрее! 🚀 + контакт должен принять… + Ошибка изменения профиля + Ошибка при открытии чата + Ошибка при открытии группы + Ошибка отклонения запроса + Вступить в группу + Меньше трафик в мобильных сетях. + Загрузка профиля… + Отправляйте сообщения сразу после соединения. + Новая роль в группах: Модератор + Нет сессии конфиденциальной доставки + Открыть чат + Открыть новый чат + Открыть новую группу + Откройте чтобы принять + Откройте чтобы соединиться + Откройте чтобы вступить + Таймаут конфиденциальной доставки + Профиль будет добавлен в адрес. + Фоновый таймаут протокола + Отклонить запрос на соединение + Может удалять сообщения и блокировать членов. + запрос отправлен + Одобрять членов группы + Отправить запрос на соединение? + Отправить запрос + Отправить запрос без сообщения + Отправляйте Ваши конфиденциальные предложения группе. + Отправляется Вашему контакту после соединения. + Добавить профиль группы в ссылку + Добавить профиль + Добавить профиль к адресу + Цель: + Фоновый таймаут TCP-соединения + Отправитель не будет уведомлён. + Чтобы использовать другой профиль после попытки соединения, удалите чат и используйте ссылку снова. + Приветственное сообщение + О Вас: + Ваш профиль diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml index 42affa7a68..1111e1d69e 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/tr/strings.xml @@ -87,7 +87,7 @@ WebRTC ICE sunucu adreslerinin doğru formatta olduğundan emin olun: Satırlara ayrılmış ve yinelenmemiş şekilde. Kaydet ARAYÜZ RENKLERİ - Otomatik-kabul ayarlarını kaydet + SimpleX adres ayarlarını kaydet Ayarlar kaydedilsin mi? Kaydet ve konuştuğun kişilere bildir Tercihleri kaydet\? @@ -696,7 +696,7 @@ Daha fazla bilgi edinin Sesli mesajlar - 5 dakikaya kadar sesli mesajlar. -\n- özel mesaj kaybolma süreleri ayarlama +\n- özel mesaj kaybolma süreleri ayarlama \n- mesag düzenleme geçmişi. hafta Kişi zaten mevcut @@ -709,7 +709,7 @@ Cihaz doğrulaması devre dışı. SimpleX Kilidi Kapatılıyor. Cihaz doğrulaması etkin değil. Cihaz doğrulamasını etkinleştirdikten sonra SimpleX Kilidini Ayarlar üzerinden açabilirsiniz. Şuna cevap olarak - %s olarak katıl + %s olarak katılın Geçersiz link! Geçersiz QR kodu Geçersiz sunucu adresi! @@ -840,7 +840,7 @@ Zaten %1$s e bağlısınız Doğrulanamadınız; lütfen tekrar deneyin. SimpleX Kilidini Ayarlar üzerinden açabilirsiniz. - gruba davet edildiniz + Gruba davetlisiniz Hiç sohbetiniz yok Gözlemcisiniz sen gözlemcisin @@ -1235,7 +1235,7 @@ Masaüstüne bağlan Doğrudan mesaj gönder Bu adres üzerinden zaten bağlantı talebinde bulundunuz! - doğrudan mesaj gönder + bağlanmak için gönder Gönderen kişi dosya aktarımını iptal etti. Mesajları yalnızca siz geri döndürülemez şekilde silebilirsiniz (kişiniz bunları silinmek üzere işaretleyebilir). (24 saat içinde) %1$s’ye bağlanıyorsunuz.]]> @@ -2441,4 +2441,49 @@ SimpleX kanal bağlantısı Mesajlaşma için TCP bağlantı noktası Web bağlantı noktasını kullan + İletişim isteğini kabul et + Mesaj ekle + Profil değiştirilemiyor + uçtan uca şifreleme ile korunmaktadır.]]> + sonra mesaj gönderebileceksiniz.]]> + Yöneticilerle sohbet edin + Üyeler katılmadan önce onlarla sohbet edin. + Bağlan + Daha hızlı bağlanın! 🚀 + iletişim kabul etmelidir… + Kullanıcısını değiştirirken hata oluştu + Kişi hazırlanırken hata oluştu + Grup hazırlanırken hata oluştu + İletişim isteği reddedildi + Gruba katıl + Mobil ağlarda daha az trafik. + Bağlan\'a dokunduğunuz anda anında mesaj gönderin. + Yeni grup rolü: Moderatör + Özel yönlendirme oturumu yok + Sohbeti aç + Yeni sohbet aç + Yeni grup aç + Kabul etmeye açık + Bağlanmak için açık + Katılmak için açık + Özel yönlendirme zaman aşımı + Profil, adres bağlantısı aracılığıyla paylaşılacaktır. + Protokol arka plan zaman aşımı + İletişim isteğini reddet + Mesajları siler ve üyeleri engeller. + istek gönderilir + İnceleme grubu üyeleri + İletişim isteği gönder? + Talep gönder + Mesaj olmadan istek gönder + Özel geri bildirimlerinizi gruplara gönderin. + Bağlantı kurulduktan sonra kişinize gönderilir. + Grup profilini bağlantı yoluyla paylaş + Profil paylaş + Profilinizi bağlantı yoluyla paylaşın + TCP bağlantısı arka plan zaman aşımı + Gönderen bilgilendirilmeyecektir. + Bağlantı denemesinden sonra başka bir profil kullanmak için sohbeti silin ve bağlantıyı tekrar kullanın. + Hoş geldiniz mesajı + Profiliniz diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml index 40293c4ddb..72915d56f4 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -2272,20 +2272,20 @@ 存档 删除举报 举报 - 举报其他:仅moderators会看到。 - 举报成员个人资料:仅moderators会看到。 - 举报违规:仅moderators会看到。 + 举报其他:仅协管会看到。 + 举报成员个人资料:仅协管会看到。 + 举报违规:仅协管会看到。 存档举报 - 举报内容:仅moderators会看到。 - 举报垃圾信息:仅moderators会看到。 - moderators + 举报内容:仅协管会看到。 + 举报垃圾信息:仅协管会看到。 + 协管 另一个理由 已存档的举报 违反社区指导方针 不当内容 不当个人资料 - 仅发送人和moderators能看到 - 只有你和moderators能看到 + 仅发送人和协管能看到 + 只有你和协管能看到 垃圾信息 存档举报? 举报理由? @@ -2325,13 +2325,13 @@ 存档所有举报? 存档 %d 份举报? 存档举报 - 所有 moderators + 所有 协管 仅自己 举报:%s - 禁止向 moderators 举报消息。 + 禁止向 协管 举报消息。 此群禁止消息举报。 - 成员可以向 moderators 举报消息。 - 允许向 moderators 举报消息。 + 成员可以向 协管 举报消息。 + 允许向 协管 举报消息。 提及成员👋 更好的群性能 更好的隐私和安全 @@ -2358,7 +2358,7 @@ 将显示来自这些成员的消息! 删除成员吗? 为所有其他成员解封这些成员吗? - moderators + 协管 将从聊天中移除这些成员 — 此操作无法撤销! 隐私政策和使用条款。 接受 @@ -2375,7 +2375,7 @@ 预设服务器 仅预设服务器使用 TCP 协议 443 端口。 接受成员出错 - 举报已发送至 moderators + 举报已发送至 协管 %d 个聊天 和成员的 %d 个聊天 %d 条消息 @@ -2429,8 +2429,7 @@ 仅在你的请求被接收后.]]> 连接 联系人应当接受… - 更改联系用户出错 - 更改群用户出错 + 更改户出错 准备联系时出错 准备群时出错 拒绝联络请求出错 @@ -2456,4 +2455,18 @@ 你的个人资料 无法更改个人资料 要在连接尝试后使用不同的个人资料,请删除聊天并再次使用该链接。 + 和管理员聊天 + 在成员加入前和这些人聊天 + 更快地连接!🚀 + 消耗更少的移动网络数据。 + 轻按连接后即刻发消息。 + 新的群角色:协管 + 无私密路由会话 + 私密路由超时 + 协议后台超时 + 删除消息并封禁成员。 + 审核群成员 + 向群发送私密反馈。 + TCP 连接后台超时 + 正加载个人资料… From f3454f1f909008a9dee1ff987da1a4b4a9a10da5 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sat, 12 Jul 2025 15:18:11 +0100 Subject: [PATCH 15/18] website: translations (#6061) * Added translation using Weblate (Turkish) * Added translation using Weblate (Turkish) * Added translation using Weblate (Indonesian) * Translated using Weblate (Turkish) Currently translated at 6.6% (17 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/tr/ * Translated using Weblate (Turkish) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/tr/ * Translated using Weblate (Turkish) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/tr/ * Translated using Weblate (Turkish) Currently translated at 100.0% (257 of 257 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/tr/ --------- Co-authored-by: Abdullah Koyuncu --- website/langs/id.json | 1 + website/langs/tr.json | 259 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 260 insertions(+) create mode 100644 website/langs/id.json create mode 100644 website/langs/tr.json diff --git a/website/langs/id.json b/website/langs/id.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/website/langs/id.json @@ -0,0 +1 @@ +{} diff --git a/website/langs/tr.json b/website/langs/tr.json new file mode 100644 index 0000000000..c6f6d24c93 --- /dev/null +++ b/website/langs/tr.json @@ -0,0 +1,259 @@ +{ + "home": "Anasayfa", + "developers": "Geliştiriciler", + "reference": "Referans", + "blog": "Blog", + "features": "Özellikler", + "why-simplex": "Neden SimpleX", + "simplex-privacy": "SimpleX ile Gizlilik", + "simplex-network": "SimpleX ağı", + "simplex-explained": "SimpleX açıklıyor", + "simplex-explained-tab-1-text": "1. Kullanıcıların nasıl deneyimlediği", + "simplex-explained-tab-2-text": "2. Nasıl çalışır", + "simplex-explained-tab-3-text": "3. Sunucuların ne gördüğü", + "simplex-explained-tab-1-p-1": "Kişiler ve gruplar oluşturabilir ve tıpkı diğer mesajlaşma programlarında olduğu gibi iki yönlü iletişim kurabilirsiniz.", + "simplex-explained-tab-1-p-2": "Tek yönlü kuyruklarla ve kullanıcı profil tanımlayıcıları olmadan nasıl çalışabilir?", + "simplex-explained-tab-2-p-1": "Her bağlantı için, farklı sunucular üzerinden mesaj göndermek ve almak üzere iki ayrı mesaj kuyruğu kullanırsınız.", + "simplex-explained-tab-2-p-2": "Sunucular, kullanıcı konuşmalarının veya bağlantılarının tüm geçmişini bilmeden mesajları yalnızca tek bir yönde iletir.", + "simplex-explained-tab-3-p-1": "Sunucular her kuyruk için ayrı, anonim oturum açma bilgileri kullanır ve hangi kullanıcıya ait olduğunu bilmez.", + "simplex-explained-tab-3-p-2": "Tor erişim sunucuları kullanarak kullanıcılar, meta veri gizliliğini artırabilir ve IP adresi korelasyonunu önleyebilir.", + "chat-bot-example": "Sohbet Botu Örneği", + "smp-protocol": "SMP Protokolü", + "chat-protocol": "Sohbet Protokolü", + "donate": "Bağış Yap", + "copyright-label": "© 2020-2025 SimpleX | Açık Kaynak Projesi", + "simplex-chat-protocol": "SimpleX Sohbet Protokolü", + "terminal-cli": "Terminal Komut Satırı Arayüzü", + "terms-and-privacy-policy": "Gizlilik Politikası", + "hero-header": "Gizlilik Yeniden Tanımlandı", + "hero-subheader": "Kullanıcı kimliği olmadan
ilk mesajlaşma uygulaması", + "hero-p-1": "Diğer uygulamalarda kullanıcı kimlikleri vardır: Signal, Matrix, Session, Briar, Jami, Cwtch vb.
SimpleX bunları kullanmaz, rastgele sayılar bile yoktur.
Bu, gizliliği büyük ölçüde artırır.", + "hero-overlay-1-textlink": "Kullanıcı kimlikleri neden gizlilik için kötüdür?", + "hero-overlay-2-textlink": "SimpleX nasıl çalışır?", + "hero-overlay-3-textlink": "Güvenlik Denetimi", + "hero-2-header": "Özel bir bağlantı kurmak", + "hero-2-header-desc": "Bu video, bir kişinin tek kullanımlık QR kodu ile yüz yüze veya görüntülü görüşme ile nasıl bağlantı kurabileceğinizi gösterir. Ayrıca paylaşılan bir davet bağlantısı ile de bağlantı kurabilirsiniz.", + "hero-overlay-1-title": "SimpleX nasıl çalışır?", + "hero-overlay-2-title": "Kullanıcı kimlikleri gizlilik için neden kötüdür?", + "hero-overlay-3-title": "Güvenlik Denetimi", + "feature-1-title": "Uçtan uca şifreli mesajlar, markdown ve düzenleme desteğiyle", + "feature-2-title": "Uçtan uca şifreli
resimler, videolar ve dosyalar", + "feature-3-title": "Uçtan uca şifreli merkeziyetsiz gruplar — Sadece kullanıcılar bu grupların varlığını bilir", + "feature-4-title": "Uçtan uca şifreli sesli mesajlar", + "feature-5-title": "Kaybolan gizli sohbetler", + "feature-6-title": "Uçtan uca şifreli
sesli ve görüntülü aramalar", + "feature-7-title": "Taşınabilir ve şifreli uygulama veri depolama — tüm profilinizi başka bir cihaza kolayca taşıyın", + "feature-8-title": "Gizli mod —
SimpleX Chat'te benzersiz", + "simplex-network-overlay-1-title": "P2P Mesajlaşma Protokolleriyle Karşılaştırma", + "simplex-private-1-title": "İki Katmanlı
Uçtan Uca Şifreleme", + "simplex-private-2-title": "Ek Sunucu
Şifreleme Katmanı", + "simplex-private-3-title": "Güvenli Doğrulanmış
TLS Taşıma Katmanı", + "simplex-private-4-title": "İsteğe Bağlı
Tor Erişimi", + "simplex-private-5-title": "Çoklu İçerik
Doldurma Katmanları", + "simplex-private-6-title": "Ağ Dışı
Anahtar Değişimi", + "simplex-private-7-title": "Mesaj Bütünlüğü
Doğrulaması", + "simplex-private-8-title": "Mesajları karıştırma,
korelasyonu azaltma", + "simplex-private-9-title": "Tek Yönlü
Mesaj Kuyrukları", + "simplex-private-10-title": "Geçici, anonim çift yönlü kimlikler", + "simplex-private-card-1-point-1": "Double-Ratchet protokolü —
Perfect Forward Secrecy, inkar edilebilirlik ve ihlal sonrası kurtarma ile Off-the-Record mesajlar.", + "simplex-private-card-1-point-2": "Her kuyrukta NaCL kriptobox kullanılır, böylece TLS ihlal edilse bile mesaj kuyrukları arasındaki trafik ilişkilendirilemez.", + "simplex-private-card-2-point-1": "Alıcıya teslimat için ek sunucu şifreleme katmanı, TLS ihlal edilirse alınan ve gönderilen sunucu verileri arasındaki ilişkiyi önler.", + "simplex-private-card-3-point-1": "İstemci-sunucu bağlantıları için yalnızca güçlü algoritmalarla TLS 1.2/1.3 kullanılır.", + "simplex-private-card-3-point-2": "Sunucu parmak izleri ve kanal bağlama, MITM ve tekrar saldırılarını önler.", + "simplex-private-card-3-point-3": "Oturum saldırılarını önlemek için bağlantı devamı devre dışı bırakılmıştır.", + "simplex-private-card-4-point-1": "IP adresinizi korumak için Tor veya başka bir taşıma katmanı ağı üzerinden sunuculara erişebilirsiniz.", + "simplex-private-card-4-point-2": "Android'de Tor ile SimpleX kullanmak için Orbot uygulamasını yükleyin ve SOCKS5 proxy'yi etkinleştirin veya iOS'ta VPN kullanın.", + "simplex-private-card-5-point-1": "SimpleX, mesaj boyutu saldırılarını önlemek için her şifreleme katmanında içerik doldurma kullanır.", + "simplex-private-card-5-point-2": "Sunucu ve ağ gözlemcileri için aynı görünen farklı boyutlarda mesajlar üretir.", + "simplex-private-card-6-point-1": "Birçok iletişim ağı, sunucu veya ağ sağlayıcıları tarafından yapılan MITM saldırılarına karşı savunmasızdır.", + "simplex-private-card-6-point-2": "Bunu önlemek için, SimpleX bağlantı adresini link veya QR kodu olarak paylaştığınızda tek kullanımlık anahtarları ağ dışı yollarla iletir.", + "simplex-private-card-7-point-1": "Mesaj bütünlüğünü sağlamak için, mesajlar sıralı olarak numaralandırılır ve önceki mesajın hash'i eklenir.", + "simplex-private-card-7-point-2": "Bir mesaj eklendiğinde, silindiğinde veya değiştirildiğinde alıcı uyarılır.", + "simplex-private-card-8-point-1": "SimpleX sunucuları, düşük gecikmeli karıştırıcı düğümler olarak çalışır — gelen ve giden mesajların sırası farklıdır.", + "simplex-private-card-9-point-1": "Her mesaj kuyruğu, farklı gönderici ve alıcı adresleriyle mesajları yalnızca tek yönde iletir.", + "simplex-private-card-9-point-2": "Geleneksel mesaj aracılarına kıyasla, olası saldırı vektörleri ve mevcut metaveriler azaltılır.", + "simplex-private-card-10-point-1": "SimpleX, her kullanıcı bağlantısı veya grup üyesi için kendi geçici, anonim ve çift yönlü adreslerini ve kimlik bilgilerini kullanır.", + "simplex-private-card-10-point-2": "SimpleX, kullanıcı profili tanımlayıcıları olmadan mesaj göndermeye olanak tanır ve diğer alternatiflere göre daha iyi meta veri gizliliği sunar.", + "privacy-matters-1-title": "Reklam ve fiyat ayrımcılığı", + "privacy-matters-1-overlay-1-title": "Gizlilik size para kazandırır", + "privacy-matters-1-overlay-1-linkText": "Gizlilik size para kazandırır", + "privacy-matters-2-title": "Seçim manipülasyonları", + "privacy-matters-2-overlay-1-title": "Gizlilik size güç verir", + "privacy-matters-2-overlay-1-linkText": "Gizlilik size güç verir", + "privacy-matters-3-title": "Zararsız bir bağlantı nedeniyle kovuşturma", + "privacy-matters-3-overlay-1-title": "Gizlilik özgürlüğünüzü korur", + "privacy-matters-3-overlay-1-linkText": "Gizlilik özgürlüğünüzü korur", + "simplex-unique-1-title": "Tam gizlilik elde edersiniz", + "simplex-unique-1-overlay-1-title": "Kimliğiniz, profiliniz, kişileriniz ve metaverileriniz için tam gizlilik", + "simplex-unique-2-title": "Spam ve kötüye kullanıma
karşı koruma", + "simplex-unique-2-overlay-1-title": "Spam ve kötüye kullanıma
karşı en iyi koruma", + "simplex-unique-3-title": "Verilerinizin kontrolü sizde", + "simplex-unique-3-overlay-1-title": "Verilerinizin sahipliği, kontrolü ve güvenliği", + "simplex-unique-4-title": "SimpleX ağının sahibi sizsiniz", + "simplex-unique-4-overlay-1-title": "Tamamen merkeziyetsiz — SimpleX ağının sahibi kullanıcılar", + "hero-overlay-card-1-p-1": "Birçok kullanıcı soruyor:SimpleX, kullanıcı kimlikleri olmadan mesajları kime göndereceğini nasıl biliyor?", + "hero-overlay-card-1-p-2": "Mesajları iletmek için SimpleX, diğer ağların aksine, her bağlantı için farklı olan yalnızca geçici, anonim ve çift yönlü kimlikler kullanır — kalıcı kimlik yoktur.", + "hero-overlay-card-1-p-3": "Hangi sunucuları mesaj almak için kullanacağınızı siz belirlersiniz. Kişileriniz — bu sunucuları size mesaj göndermek için kullanır. Her konuşma genellikle iki farklı sunucu kullanır.", + "hero-overlay-card-1-p-4": "Bu tasarım, uygulama düzeyinde kullanıcı meta verilerinin sızmasını önler. Mesaj sunucularına Tor üzerinden bağlanarak gizliliğinizi ve IP adresinizi koruyabilirsiniz.", + "hero-overlay-card-1-p-5": "Kullanıcı profilleri, kişiler ve gruplar yalnızca kullanıcının cihazında saklanır. Mesajlar, iki katmanlı uçtan uca şifreleme ile gönderilir.", + "hero-overlay-card-1-p-6": "Daha fazla bilgi için SimpleX teknik dokümanını okuyun.", + "hero-overlay-card-2-p-1": "Kullanıcıların kalıcı kimlikleri olduğunda, bu bir oturum kimliği gibi rastgele bir sayı olsa bile, sağlayıcıların veya saldırganların kullanıcıların birbirleriyle nasıl bağlantılı olduğunu ve kaç mesaj gönderdiklerini tespit etme riski vardır.", + "hero-overlay-card-2-p-2": "Bu bilgiler, mevcut halka açık sosyal ağlarla ilişkilendirilebilir ve gerçek kimlikler ortaya çıkarılabilir.", + "hero-overlay-card-2-p-3": "Aynı profil üzerinden iki farklı kişiyle sohbet ederseniz, en gizlilik odaklı uygulamalarda bile (ör. Tor v3 hizmetleri kullananlar) bu kişiler, aynı kişiyle bağlantılı olduklarını anlayabilir.", + "hero-overlay-card-2-p-4": "SimpleX, tasarımı gereği hiçbir kullanıcı kimliği olmadığı için bu tür saldırılara karşı koruma sağlar. Ayrıca, her kişi için farklı görünen adlar kullanabilir ve gizli modu etkinleştirerek kişiler arasında hiçbir ortak veri paylaşmazsınız.", + "hero-overlay-card-3-p-1": "Trail of Bits, büyük teknoloji şirketleri, devlet kurumları ve büyük blokzincir projeleriyle çalışan lider bir güvenlik ve teknoloji danışmanlık şirketidir.", + "hero-overlay-card-3-p-2": "Trail of Bits, Kasım 2022'de SimpleX platformunun kriptografik ve ağ bileşenlerini inceledi. Detaylar için duyuruya göz atın.", + "hero-overlay-card-3-p-3": "Trail of Bits, Temmuz 2024'te SimpleX'in ağ protokolünün kriptografik tasarımını inceledi. Daha fazla bilgi için buraya bakın.", + "simplex-network-overlay-card-1-p-1": "Eşler arası mesajlaşma protokolleri ve uygulamaları, SimpleX'e kıyasla daha az güvenilir, analiz edilmesi daha karmaşık ve çeşitli saldırı türlerine karşı daha savunmasız olmalarına neden olan çeşitli sorunlara sahiptir.", + "simplex-network-overlay-card-1-li-1": "P2P ağları, mesajları yönlendirmek için DHT türlerine güvenir. DHT tasarımları, teslimat garantisi ile gecikme arasında denge kurmak zorundadır. P2P'ye kıyasla SimpleX, daha iyi teslimat garantisi ve daha düşük gecikme sunar çünkü bir mesaj birden fazla sunucu üzerinden yedekli ve paralel olarak gönderilebilir ve alıcı tarafından seçilen sunucular kullanılır. P2P ağlarında mesajlar O(log N) düğüm üzerinden sıralı olarak gönderilir ve düğümler bir algoritma ile seçilir.", + "simplex-network-overlay-card-1-li-2": "SimpleX tasarımı, çoğu P2P ağının aksine, hiçbir küresel kullanıcı kimliği içermez, geçici olanlar bile yoktur. Sadece geçici, ikili kimlikler kullanır ve bu da daha iyi anonimlik ve meta veri koruması sağlar.", + "simplex-network-overlay-card-1-li-3": "P2P, MITM saldırısı sorununu çözmez ve mevcut uygulamaların çoğu ilk anahtar değişimi için ağ dışı mesajlar kullanmaz. SimpleX ise ilk anahtar değişimi için ağ dışı mesajlar veya mevcut güvenli ve güvenilir bağlantılar kullanır.", + "simplex-network-overlay-card-1-li-4": "——P2P uygulamaları internet servis sağlayıcıları tarafından engellenebilir (örneğin BitTorrent). SimpleX ise taşıma bağımsızdır — standart web protokolleriyle, örneğin WebSockets ile çalışabilir.", + "simplex-network-overlay-card-1-li-5": "Bilinen tüm P2P ağları Sybil saldırılarına karşı savunmasızdır çünkü her düğüm tespit edilebilir ve ağ bir bütün olarak çalışır. Bilinen önlemler ya merkezi bir bileşen ya da pahalı bir iş kanıtı gerektirir. SimpleX ağı sunucu tespiti sağlamaz, parçalıdır ve birden fazla izole alt ağ ile çalışır, bu da ağ genelinde saldırıları imkansız kılar.", + "simplex-network-overlay-card-1-li-6": "P2P ağları, istemciler trafiği tekrar gönderip güçlendirebildiğinde DRDoS saldırılarına karşı savunmasız olabilir ve bu da tüm ağda hizmet reddine yol açabilir. SimpleX istemcileri yalnızca bilinen bağlantılardan gelen trafiği iletir ve bir saldırgan tarafından ağ genelinde trafiği güçlendirmek için kullanılamaz.", + "privacy-matters-overlay-card-1-p-1": "Birçok büyük şirket, kiminle bağlantılı olduğunuz bilgisini gelir seviyenizi tahmin etmek, size gerçekten ihtiyacınız olmayan ürünleri satmak ve fiyatları belirlemek için kullanır.", + "privacy-matters-overlay-card-1-p-2": "Çevrimiçi satıcılar, daha düşük gelire sahip kişilerin daha acil alışverişler yaptığını bilir ve bu nedenle daha yüksek fiyatlar talep edebilir veya indirimleri kaldırabilir.", + "privacy-matters-overlay-card-1-p-3": "Bazı finans ve sigorta şirketleri, faiz oranlarını ve primleri belirlemek için sosyal grafikleri kullanır. Düşük gelirliler genellikle daha fazla öder — bu, \"yoksulluk primi\" olarak bilinir.", + "privacy-matters-overlay-card-1-p-4": "SimpleX ağı, bağlantılarınızın gizliliğini diğer tüm alternatiflerden daha iyi korur ve sosyal grafiğinizin şirketler veya kuruluşlar tarafından erişilmesini tamamen engeller. Kullanıcılar SimpleX Chat uygulamasının önceden yapılandırılmış sunucularını kullansa bile, sunucu sahipleri kullanıcı sayısını veya bağlantılarını bilmez.", + "privacy-matters-overlay-card-2-p-1": "Çok da uzun olmayan bir süre önce, büyük seçimlerin saygın bir danışmanlık şirketi tarafından sosyal grafiklerimiz kullanılarak manipüle edildiğine tanık olduk; bu, gerçek dünyaya bakışımızı çarpıttı ve oylarımızı etkiledi.", + "privacy-matters-overlay-card-2-p-2": "Tarafsız olmak ve bağımsız kararlar verebilmek için bilgi alanınız üzerinde kontrol sahibi olmalısınız. Bu, yalnızca sosyal grafiğinize erişimi olmayan özel bir iletişim ağı kullanıyorsanız mümkündür.", + "privacy-matters-overlay-card-2-p-3": "SimpleX, tasarımı gereği hiçbir kullanıcı kimliği olmayan ilk ağdır ve bağlantı grafiğinizi diğer tüm bilinen alternatiflerden daha iyi korur.", + "privacy-matters-overlay-card-3-p-1": "Herkes gizliliğine ve iletişiminin güvenliğine önem vermelidir — zararsız sohbetler bile, saklayacak bir şeyiniz olmasa da sizi tehlikeye atabilir.", + "privacy-matters-overlay-card-3-p-2": "En çarpıcı hikayelerden biri, Mohamedou Ould Slahi'nin yaşadıklarıdır; anılarını yazdığı kitapta ve \"The Mauritanian\" filminde anlatılır. Afganistan'daki akrabalarını aradıktan sonra, Almanya'da 10 yıl yaşamasına rağmen, Guantanamo'ya gönderildi ve yıllarca yargılanmadan işkence gördü çünkü 11 Eylül saldırılarına karıştığından şüpheleniliyordu.", + "privacy-matters-overlay-card-3-p-3": "Normal insanlar bile, çevrimiçi olarak paylaştıkları şeyler nedeniyle, hatta \"anonim\" hesaplarını kullansalar bile, demokratik ülkelerde bile tutuklanabiliyor.", + "privacy-matters-overlay-card-3-p-4": "Sadece uçtan uca şifreli bir mesajlaşma uygulaması kullanmak yeterli değildir. Hepimiz, bağlı olduğumuz kişisel ağlarımızın gizliliğini koruyan bir mesajlaşma uygulaması kullanmalıyız.", + "simplex-unique-overlay-card-1-p-1": "Diğer mesajlaşma ağlarının aksine, SimpleX kullanıcılara hiçbir kimlik atamaz. Kullanıcıları tanımlamak için telefon numaralarına, alan adı tabanlı adreslere (e-posta veya XMPP gibi), kullanıcı adlarına, genel anahtarlara veya rastgele sayılara dayanmaz — SimpleX sunucu sahipleri bile sunucularını kaç kişinin kullandığını bilmez.", + "simplex-unique-overlay-card-1-p-2": "SimpleX, mesajları iletmek için ikili anonim adresler kullanır; bunlar tek yönlü mesaj kuyruklarından oluşur ve alınan ve gönderilen mesajlar için ayrıdır, genellikle farklı sunucular üzerinden iletilir.", + "simplex-unique-overlay-card-1-p-3": "Bu tasarım, sizin ve iletişim kurduğunuz kişilerin gizliliğini korur ve bağlantıları SimpleX ağ sunucularından ve olası gözlemcilerden gizler. IP adresinizi sunuculardan gizlemek için SimpleX sunucularına Tor üzerinden bağlanabilirsiniz.", + "simplex-unique-overlay-card-2-p-1": "SimpleX ağında kimliğiniz olmadığı için, kimse size ulaşamaz; yalnızca tek kullanımlık veya geçici bir kullanıcı adresini QR kodu veya bağlantı olarak paylaşırsanız iletişim kurabilir.", + "simplex-unique-overlay-card-2-p-2": "İsteğe bağlı kullanıcı adresi spam bağlantı istekleri göndermek için kullanılabilse de, bu adresi değiştirebilir veya tamamen silebilirsiniz; bağlantılarınız kaybolmaz.", + "simplex-unique-overlay-card-3-p-1": "SimpleX Chat tüm kullanıcı verilerini yalnızca uç cihazlarda taşınabilir ve şifreli bir veritabanı formatında saklar; bu format dışa aktarılabilir ve desteklenen herhangi bir cihaza aktarılabilir.", + "simplex-unique-overlay-card-3-p-2": "Uçtan uca şifreli mesajlar, son cihaza ulaşana kadar SimpleX aktarma sunucularında geçici olarak saklanır ve ardından kalıcı olarak silinir.", + "simplex-unique-overlay-card-3-p-3": "Federasyonlu ağ sunucularının (ör. e-posta, XMPP veya Matrix) aksine, SimpleX sunucuları kullanıcı hesabı saklamaz, yalnızca mesajları iletir ve böylece tarafların gizliliği korunur.", + "simplex-unique-overlay-card-3-p-4": "Gönderilen ve alınan sunucu trafiği arasında ortak bir kimlik veya şifreli metin yoktur — bu nedenle, bir gözlemci TLS ele geçirilse bile kimin kiminle iletişim kurduğunu kolayca tespit edemez.", + "simplex-unique-overlay-card-4-p-1": "Kendi sunucularınızla SimpleX kullanabilirsiniz ve yine de uygulamanın önceden yapılandırılmış sunucularını kullanan kişilerle iletişim kurabilirsiniz.", + "simplex-unique-overlay-card-4-p-2": "SimpleX ağı açık bir protokol kullanır ve sohbet botları geliştirmek için bir SDK sunar. Bu sayede kullanıcıların SimpleX Chat uygulamalarıyla etkileşime geçebileceği servisler oluşturabilirsiniz — hangi SimpleX servislerini geliştireceğinizi merakla bekliyoruz.", + "simplex-unique-overlay-card-4-p-3": "SimpleX ağının geliştirilmesine aktif olarak katkıda bulunmak, örneğin SimpleX uygulama kullanıcıları için bir sohbet botu geliştirmek veya SimpleX Chat kütüphanesinin mobil uygulamalara entegrasyonunu ilerletmek isterseniz, bizimle iletişime geçin ve destek alın.", + "simplex-unique-card-1-p-1": "SimpleX, profilinizin, kişilerin ve meta verilerinizin gizliliğini korur ve bunları SimpleX ağ sunucularından ve diğer olası gözlemcilerden gizler.", + "simplex-unique-card-1-p-2": "Mevcut tüm diğer mesajlaşma ağlarının aksine, SimpleX kullanıcılarına hiçbir kimlik atamaz — rastgele sayılar bile yoktur.", + "simplex-unique-card-2-p-1": "SimpleX ağında kimliğiniz veya sabit bir adresiniz olmadığı için, kimse size ulaşamaz; yalnızca tek kullanımlık veya geçici bir kullanıcı adresini QR kodu veya bağlantı olarak paylaşırsanız iletişim kurabilir.", + "simplex-unique-card-3-p-1": "SimpleX, kullanıcı verilerini yalnızca uç cihazlarda ve taşınabilir, şifreli bir veritabanı formatında saklar — bu, başka bir cihaza aktarılabilir.", + "simplex-unique-card-3-p-2": "Uçtan uca şifreli mesajlar, son cihaza ulaşana kadar SimpleX aktarma sunucularında geçici olarak saklanır ve ardından kalıcı olarak silinir.", + "simplex-unique-card-4-p-1": "SimpleX ağı tamamen merkeziyetsizdir ve kripto para birimleri veya internet dışında başka ağlara bağlı değildir.", + "simplex-unique-card-4-p-2": "Kendi sunucularınızla SimpleX'i kullanabilirsiniz veya bizim sunduğumuz sunucuları kullanabilirsiniz — yine de tüm kullanıcılarla bağlantı kurabilirsiniz.", + "join": "Katılın", + "we-invite-you-to-join-the-conversation": "Sizi sohbete katılmaya davet ediyoruz", + "join-the-REDDIT-community": "Reddit grubuna katılın", + "join-us-on-GitHub": "GitHub'da bize katılın", + "donate-here-to-help-us": "Bize destek olmak için buradan bağış yapın", + "sign-up-to-receive-our-updates": "Güncellemelerimizi almak için kaydolun", + "enter-your-email-address": "E-posta adresinizi girin", + "get-simplex": "SimpleX' masaüstü uygulamasını indirin", + "why-simplex-is-unique": "SimpleX neden benzersiz", + "learn-more": "Daha fazlasını öğrenin", + "more-info": "Daha fazla bilgi", + "hide-info": "Bilgiyi gizle", + "contact-hero-header": "SimpleX Chat ile bağlantı kurmak için bir adres aldınız", + "invitation-hero-header": "SimpleX Chat ile bağlantı kurmak için tek kullanımlık bir bağlantı aldınız", + "contact-hero-subheader": "Mobil cihazınızda veya tabletinizde SimpleX Chat uygulamasıyla QR kodunu tarayın.", + "contact-hero-p-1": "Bu bağlantıdaki genel anahtarlar ve mesaj kuyruğu adresi, bu sayfayı açtığınızda AĞ ÜZERİNDEN GÖNDERİLMEZ — bağlantı URL'sinin hash bölümünde yer alır.", + "contact-hero-p-2": "SimpleX Chat'i henüz indirmediniz mi?", + "contact-hero-p-3": "Uygulamayı indirmek için aşağıdaki bağlantıları kullanın.", + "scan-qr-code-from-mobile-app": "Mobil uygulamadan QR kodunu tarayın", + "to-make-a-connection": "Bağlantı başlatmak için:", + "install-simplex-app": "SimpleX uygulamasını yükleyin", + "connect-in-app": "Uygulamada bağlanın", + "open-simplex-app": "SimpleX uygulamasını açın", + "tap-the-connect-button-in-the-app": "Uygulamada \"Bağlan\" düğmesine dokunun", + "scan-the-qr-code-with-the-simplex-chat-app": "SimpleX Chat uygulamasıyla QR kodunu tarayın", + "scan-the-qr-code-with-the-simplex-chat-app-description": "Bu bağlantıdaki genel anahtarlar ve mesaj kuyruğu adresi, bu sayfayı açtığınızda AĞ ÜZERİNDEN GÖNDERİLMEZ —
bağlantı URL'sinin hash bölümünde yer alır.", + "installing-simplex-chat-to-terminal": "Terminalde SimpleX Chat kurulumu", + "use-this-command": "Bu komutu kullanın:", + "see-simplex-chat": "SimpleX Chat'i gör", + "github-repository": "GitHub deposu", + "the-instructions--source-code": "İndirme veya kaynak koddan derleme talimatları için.", + "if-you-already-installed-simplex-chat-for-the-terminal": "SimpleX'i terminal için zaten yüklediyseniz", + "if-you-already-installed": "Zaten yüklediyseniz", + "simplex-chat-for-the-terminal": "Terminal için SimpleX Chat", + "copy-the-command-below-text": "Aşağıdaki komutu kopyalayıp sohbette kullanın:", + "privacy-matters-section-header": "Gizlilik neden önemlidir", + "privacy-matters-section-subheader": "Meta verilerinizin gizliliğini korumak — kiminle ne zaman iletişim kurduğunuz — sizi şu risklerden korur:", + "privacy-matters-section-label": "Mesajlaşma uygulamanızın verilerinize erişimi olmadığından emin olun!", + "simplex-private-section-header": "SimpleX'i gizli yapan nedir", + "tap-to-close": "Kapatmak için dokunun", + "simplex-network-section-header": "SimpleX-Ağı", + "simplex-network-section-desc": "P2P ve federasyonlu ağların avantajlarını birleştirerek SimpleX, mümkün olan en iyi gizliliği sunar.", + "simplex-network-1-header": "P2P ağlarının aksine", + "simplex-network-1-desc": "Tüm mesajlar sunucular üzerinden gönderilir; bu, meta veri korumasını artırır ve daha güvenilir asenkron mesaj iletimi sağlar ve birçok sorunu önler", + "simplex-network-1-overlay-linktext": "P2P ağlarının sorunları", + "simplex-network-2-header": "Federasyonlu ağların aksine", + "simplex-network-2-desc": "SimpleX aktarma sunucuları KULLANICI PROFİLLERİNİ, kişileri ve teslim edilen mesajları SAKLAMAZ ve birbirleriyle bağlantı kurmaz, ayrıca bir sunucu dizini yoktur.", + "simplex-network-3-header": "SimpleX Ağı", + "simplex-network-3-desc": "Sunucular, kullanıcıları birbirine bağlamak için tek yönlü kuyruklar sağlar. Ancak ağın bağlantı grafiğini göremezler — bunu yalnızca kullanıcılar bilir.", + "comparison-section-header": "Diğer protokollerle karşılaştırma", + "protocol-1-text": "Signal, büyük platformlar", + "protocol-2-text": "XMPP / Matrix", + "protocol-3-text": "P2P protokolleri", + "comparison-point-1-text": "Küresel bir kimlik gerektirir", + "comparison-point-2-text": "MITM saldırısı riski", + "comparison-point-3-text": "DNS sistemine bağımlılık", + "comparison-point-4-text": "Tek veya merkezi ağ", + "comparison-point-5-text": "Merkezi bileşen veya diğer ağ genelinde saldırılar", + "yes": "Evet", + "no": "Hayır", + "no-private": "Hayır – gizli", + "no-secure": "Hayır – güvenli", + "no-resilient": "Hayır – dayanıklı", + "no-decentralized": "Hayır – merkeziyetsiz", + "no-federated": "Hayır – federasyonlu", + "comparison-section-list-point-1": "Genellikle telefon numarasına, bazen kullanıcı adına dayalı", + "comparison-section-list-point-2": "DNS tabanlı adresler", + "comparison-section-list-point-3": "Genel anahtar veya başka bir küresel benzersiz kimlik", + "comparison-section-list-point-4a": "SimpleX aktarıcıları uçtan uca şifrelemeyi tehlikeye atamaz. Olası bir ağ dışı kanal saldırısını önlemek için güvenlik kodunu doğrulayın", + "comparison-section-list-point-4": "Operatörün sunucuları ele geçirilirse. Signal ve diğer uygulamalarda bunu azaltmak için güvenlik kodu doğrulanabilir", + "comparison-section-list-point-5": "Kullanıcı meta verilerinin gizliliği korunmaz", + "comparison-section-list-point-6": "P2P dağıtık olsa da federasyonlu değildir — tek bir ağ olarak çalışır", + "comparison-section-list-point-7": "P2P ağlarının ya merkezi bir yönetimi vardır ya da tüm ağ tehlikeye girebilir", + "see-here": "Buraya bakın", + "guide-dropdown-1": "Hızlı Başlangıç", + "guide-dropdown-2": "Mesaj gönderme", + "guide-dropdown-3": "Gizli Gruplar", + "guide-dropdown-4": "Sohbet Profilleri", + "guide-dropdown-5": "Veri yönetimi", + "guide-dropdown-6": "Sesli & Görüntülü Aramalar", + "guide-dropdown-7": "Gizlilik & Güvenlik", + "guide-dropdown-8": "Uygulama Ayarları", + "guide-dropdown-9": "Bağlantı kurma", + "guide": "Kılavuz", + "docs-dropdown-1": "SimpleX Ağı", + "docs-dropdown-2": "Android dosyalarına erişim", + "docs-dropdown-3": "Sohbet veritabanına erişim", + "docs-dropdown-4": "SMP sunucusunu barındırma", + "docs-dropdown-5": "XFTP sunucusunu barındırma", + "docs-dropdown-6": "WebRTC sunucusu", + "docs-dropdown-7": "SimpleX Chat'i çevir", + "docs-dropdown-8": "SimpleX dizin servisi", + "docs-dropdown-9": "İndirilenler", + "docs-dropdown-10": "Şeffaflık", + "docs-dropdown-11": "SSS", + "docs-dropdown-12": "Güvenlik", + "docs-dropdown-14": "İşletmeler için SimpleX", + "newer-version-of-eng-msg": "Bu sayfanın İngilizce olarak daha güncel bir sürümü mevcut.", + "click-to-see": "Görmek için tıklayın", + "menu": "Menü", + "on-this-page": "Bu sayfada", + "back-to-top": "Başa dön", + "glossary": "Sözlük", + "simplex-chat-via-f-droid": "F-Droid ile SimpleX Chat", + "simplex-chat-repo": "SimpleX Chat deposu", + "stable-and-beta-versions-built-by-developers": "Geliştiriciler tarafından oluşturulan kararlı ve beta sürümler", + "f-droid-page-simplex-chat-repo-section-text": "F-Droid istemcinize eklemek için QR kodunu tarayın veya bu URL'yi kullanın:", + "signing-key-fingerprint": "İmza anahtarı parmak izi (SHA-256)", + "f-droid-org-repo": "F-Droid.org deposu", + "stable-versions-built-by-f-droid-org": "F-Droid.org tarafından oluşturulan kararlı sürümler", + "releases-to-this-repo-are-done-1-2-days-later": "Bu depoya sürümler birkaç gün sonra eklenir", + "f-droid-page-f-droid-org-repo-section-text": "SimpleX Chat ve F-Droid.org depoları farklı anahtarlarla imzalanır. Geçiş yapmak için sohbet veritabanınızı dışa aktarın ve uygulamayı yeniden yükleyin.", + "jobs": "Ekibe katılın", + "please-enable-javascript": "QR kodunu görebilmek için lütfen JavaScript'i etkinleştirin.", + "please-use-link-in-mobile-app": "Lütfen bağlantıyı mobil uygulamada kullanın" +} From 8094078beea00caf671293e0e0868f63c84f58f9 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Sat, 12 Jul 2025 18:39:41 +0000 Subject: [PATCH 16/18] core: improve message forwarding to better manage support scopes (#6056) * core: test forwarding in support scope * wip * test * add to test * comment * rework forwarding * fixes * refactor tests * narrow * forwardMsgs * support mem * unfocus tests * fix, tests * plans * add test * comment * add scope to reaction and deletion, refactor * fix del * refactor * query plans --------- Co-authored-by: Evgeny Poberezkin --- src/Simplex/Chat/Library/Commands.hs | 12 +- src/Simplex/Chat/Library/Subscriber.hs | 493 +++++++++++------- src/Simplex/Chat/Messages.hs | 18 + src/Simplex/Chat/Protocol.hs | 47 +- src/Simplex/Chat/Store/Groups.hs | 81 ++- .../SQLite/Migrations/chat_query_plans.txt | 65 ++- tests/ChatTests/Groups.hs | 218 +++++++- tests/ProtocolTests.hs | 2 +- 8 files changed, 695 insertions(+), 241 deletions(-) diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 3065b48893..1f1f114a39 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -669,7 +669,7 @@ processChatCommand vr nm = \case assertDeletable items assertDirectAllowed user MDSnd ct XMsgDel_ let msgIds = itemsMsgIds items - events = map (\msgId -> XMsgDel msgId Nothing) msgIds + events = map (\msgId -> XMsgDel msgId Nothing Nothing) msgIds forM_ (L.nonEmpty events) $ \events' -> sendDirectContactMessages user ct events' if featureAllowed SCFFullDelete forUser ct @@ -691,7 +691,7 @@ processChatCommand vr nm = \case assertDeletable items assertUserGroupRole gInfo GRObserver -- can still delete messages sent earlier let msgIds = itemsMsgIds items - events = L.nonEmpty $ map (`XMsgDel` Nothing) msgIds + events = L.nonEmpty $ map (\msgId -> XMsgDel msgId Nothing $ toMsgScope gInfo <$> chatScopeInfo) msgIds mapM_ (sendGroupMessages user gInfo Nothing recipients) events delGroupChatItems user gInfo chatScopeInfo items False pure $ CRChatItemsDeleted user deletions True False @@ -754,7 +754,7 @@ processChatCommand vr nm = \case throwCmdError "reaction not allowed - chat item has no content" rs <- withFastStore' $ \db -> getDirectReactions db ct itemSharedMId True checkReactionAllowed rs - (SndMessage {msgId}, _) <- sendDirectContactMessage user ct $ XMsgReact itemSharedMId Nothing reaction add + (SndMessage {msgId}, _) <- sendDirectContactMessage user ct $ XMsgReact itemSharedMId Nothing Nothing reaction add createdAt <- liftIO getCurrentTime reactions <- withFastStore' $ \db -> do setDirectReaction db ct itemSharedMId True reaction add msgId createdAt @@ -779,7 +779,7 @@ processChatCommand vr nm = \case let GroupMember {memberId = itemMemberId} = chatItemMember g ci rs <- withFastStore' $ \db -> getGroupReactions db g membership itemMemberId itemSharedMId True checkReactionAllowed rs - SndMessage {msgId} <- sendGroupMessage user g scope recipients (XMsgReact itemSharedMId (Just itemMemberId) reaction add) + SndMessage {msgId} <- sendGroupMessage user g scope recipients (XMsgReact itemSharedMId (Just itemMemberId) (toMsgScope g <$> chatScopeInfo) reaction add) createdAt <- liftIO getCurrentTime reactions <- withFastStore' $ \db -> do setGroupReaction db g membership itemMemberId itemSharedMId True reaction add msgId createdAt @@ -2507,7 +2507,7 @@ processChatCommand vr nm = \case APIUpdateGroupProfile groupId p' -> withUser $ \user -> do g <- withFastStore $ \db -> getGroup db vr user groupId runUpdateGroupProfile user g p' - UpdateGroupNames gName p'@GroupProfile {displayName, fullName, shortDescr} -> + UpdateGroupNames gName GroupProfile {displayName, fullName, shortDescr} -> updateGroupProfileByName gName $ \p -> p {displayName, fullName, shortDescr} ShowGroupProfile gName -> withUser $ \user -> CRGroupProfile user <$> withFastStore (\db -> getGroupInfoByName db vr user gName) @@ -3202,7 +3202,7 @@ processChatCommand vr nm = \case assertDeletable gInfo items assertUserGroupRole gInfo GRAdmin -- TODO GRModerator when most users migrate let msgMemIds = itemsMsgMemIds gInfo items - events = L.nonEmpty $ map (\(msgId, memId) -> XMsgDel msgId (Just memId)) msgMemIds + events = L.nonEmpty $ map (\(msgId, memId) -> XMsgDel msgId (Just memId) $ toMsgScope gInfo <$> chatScopeInfo) msgMemIds mapM_ (sendGroupMessages_ user gInfo ms) events delGroupChatItems user gInfo chatScopeInfo items True where diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index 5a73430191..4819f254dd 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -4,6 +4,7 @@ {-# LANGUAGE GADTs #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedStrings #-} @@ -28,7 +29,7 @@ import Data.Either (lefts, partitionEithers, rights) import Data.Functor (($>)) import Data.Int (Int64) import Data.List (foldl') -import Data.List.NonEmpty (NonEmpty (..)) +import Data.List.NonEmpty (NonEmpty (..), (<|)) import qualified Data.List.NonEmpty as L import Data.Map.Strict (Map) import qualified Data.Map.Strict as M @@ -490,8 +491,8 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = XMsgNew mc -> newContentMessage ct'' mc msg msgMeta XMsgFileDescr sharedMsgId fileDescr -> messageFileDescription ct'' sharedMsgId fileDescr XMsgUpdate sharedMsgId mContent _ ttl live _msgScope -> messageUpdate ct'' sharedMsgId mContent msg msgMeta ttl live - XMsgDel sharedMsgId _ -> messageDelete ct'' sharedMsgId msg msgMeta - XMsgReact sharedMsgId _ reaction add -> directMsgReaction ct'' sharedMsgId reaction add msg msgMeta + XMsgDel sharedMsgId _ _ -> messageDelete ct'' sharedMsgId msg msgMeta + XMsgReact sharedMsgId _ _ reaction add -> directMsgReaction ct'' sharedMsgId reaction add msg msgMeta -- TODO discontinue XFile XFile fInv -> processFileInvitation' ct'' fInv msg msgMeta XFileCancel sharedMsgId -> xFileCancel ct'' sharedMsgId @@ -889,59 +890,82 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = -- possible improvement is to choose scope based on event (some events specify scope) (gInfo', m', scopeInfo) <- mkGroupChatScope gInfo m checkIntegrityCreateItem (CDGroupRcv gInfo' scopeInfo m') msgMeta `catchChatError` \_ -> pure () - forM_ aChatMsgs $ \case - Right (ACMsg _ chatMsg) -> - processEvent gInfo' m' tags eInfo chatMsg `catchChatError` \e -> eToView e - Left e -> do - atomically $ modifyTVar' tags ("error" :) - logInfo $ "group msg=error " <> eInfo <> " " <> tshow e - eToView (ChatError . CEException $ "error parsing chat message: " <> e) - forwardMsgs (rights aChatMsgs) `catchChatError` eToView + fwdScopesMsgs <- foldM (processAChatMsg gInfo' m' tags eInfo) M.empty aChatMsgs + let GroupMember {memberRole = membershipMemRole} = membership + when (membershipMemRole >= GRAdmin && not (blockedByAdmin m)) $ + forM_ (M.assocs fwdScopesMsgs) $ \(groupForwardScope, fwdMsgs) -> + forwardMsgs groupForwardScope (L.reverse fwdMsgs) `catchChatError` eToView checkSendRcpt $ rights aChatMsgs where aChatMsgs = parseChatMessages msgBody brokerTs = metaBrokerTs msgMeta - processEvent :: GroupInfo -> GroupMember -> TVar [Text] -> Text -> MsgEncodingI e => ChatMessage e -> CM () + processAChatMsg :: + GroupInfo + -> GroupMember + -> TVar [Text] + -> Text + -> Map GroupForwardScope (NonEmpty (ChatMessage 'Json)) + -> Either String AChatMessage + -> CM (Map GroupForwardScope (NonEmpty (ChatMessage 'Json))) + processAChatMsg gInfo' m' tags eInfo fwdScopeMap = \case + Right (ACMsg SJson chatMsg) -> do + cmFwdScope_ <- processEvent gInfo' m' tags eInfo chatMsg `catchChatError` \e -> eToView e $> Nothing + case cmFwdScope_ of + Nothing -> pure fwdScopeMap + Just cmFwdScope -> + pure $ M.alter (Just . maybe [chatMsg] (chatMsg <|)) cmFwdScope fwdScopeMap + Right (ACMsg SBinary chatMsg) -> do + void (processEvent gInfo' m' tags eInfo chatMsg) `catchChatError` \e -> eToView e + pure fwdScopeMap + Left e -> do + atomically $ modifyTVar' tags ("error" :) + logInfo $ "group msg=error " <> eInfo <> " " <> tshow e + eToView (ChatError . CEException $ "error parsing chat message: " <> e) + pure fwdScopeMap + processEvent :: GroupInfo -> GroupMember -> TVar [Text] -> Text -> MsgEncodingI e => ChatMessage e -> CM (Maybe GroupForwardScope) processEvent gInfo' m' tags eInfo chatMsg@ChatMessage {chatMsgEvent} = do let tag = toCMEventTag chatMsgEvent atomically $ modifyTVar' tags (tshow tag :) logInfo $ "group msg=" <> tshow tag <> " " <> eInfo (m'', conn', msg@RcvMessage {chatMsgEvent = ACME _ event}) <- saveGroupRcvMsg user groupId m' conn msgMeta msgBody chatMsg + -- ! see isForwardedGroupMsg: processing functions should return GroupForwardScope for same events case event of XMsgNew mc -> memberCanSend m'' scope $ newGroupContentMessage gInfo' m'' mc msg brokerTs False where ExtMsgContent {scope} = mcExtMsgContent mc -- file description is always allowed, to allow sending files to support scope XMsgFileDescr sharedMsgId fileDescr -> groupMessageFileDescription gInfo' m'' sharedMsgId fileDescr XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> memberCanSend m'' msgScope $ groupMessageUpdate gInfo' m'' sharedMsgId mContent mentions msgScope msg brokerTs ttl live - XMsgDel sharedMsgId memberId -> groupMessageDelete gInfo' m'' sharedMsgId memberId msg brokerTs - XMsgReact sharedMsgId (Just memberId) reaction add -> groupMsgReaction gInfo' m'' sharedMsgId memberId reaction add msg brokerTs + XMsgDel sharedMsgId memberId scope_ -> groupMessageDelete gInfo' m'' sharedMsgId memberId scope_ msg brokerTs + XMsgReact sharedMsgId (Just memberId) scope_ reaction add -> groupMsgReaction gInfo' m'' sharedMsgId memberId scope_ reaction add msg brokerTs -- TODO discontinue XFile - XFile fInv -> processGroupFileInvitation' gInfo' m'' fInv msg brokerTs + XFile fInv -> Nothing <$ processGroupFileInvitation' gInfo' m'' fInv msg brokerTs XFileCancel sharedMsgId -> xFileCancelGroup gInfo' m'' sharedMsgId - XFileAcptInv sharedMsgId fileConnReq_ fName -> xFileAcptInvGroup gInfo' m'' sharedMsgId fileConnReq_ fName + XFileAcptInv sharedMsgId fileConnReq_ fName -> Nothing <$ xFileAcptInvGroup gInfo' m'' sharedMsgId fileConnReq_ fName XInfo p -> xInfoMember gInfo' m'' p brokerTs - XGrpLinkMem p -> xGrpLinkMem gInfo' m'' conn' p - XGrpLinkAcpt acceptance role memberId -> xGrpLinkAcpt gInfo' m'' acceptance role memberId msg brokerTs + XGrpLinkMem p -> Nothing <$ xGrpLinkMem gInfo' m'' conn' p + XGrpLinkAcpt acceptance role memberId -> Nothing <$ xGrpLinkAcpt gInfo' m'' acceptance role memberId msg brokerTs XGrpMemNew memInfo msgScope -> xGrpMemNew gInfo' m'' memInfo msgScope msg brokerTs - XGrpMemIntro memInfo memRestrictions_ -> xGrpMemIntro gInfo' m'' memInfo memRestrictions_ - XGrpMemInv memId introInv -> xGrpMemInv gInfo' m'' memId introInv - XGrpMemFwd memInfo introInv -> xGrpMemFwd gInfo' m'' memInfo introInv + XGrpMemIntro memInfo memRestrictions_ -> Nothing <$ xGrpMemIntro gInfo' m'' memInfo memRestrictions_ + XGrpMemInv memId introInv -> Nothing <$ xGrpMemInv gInfo' m'' memId introInv + XGrpMemFwd memInfo introInv -> Nothing <$ xGrpMemFwd gInfo' m'' memInfo introInv XGrpMemRole memId memRole -> xGrpMemRole gInfo' m'' memId memRole msg brokerTs XGrpMemRestrict memId memRestrictions -> xGrpMemRestrict gInfo' m'' memId memRestrictions msg brokerTs - XGrpMemCon memId -> xGrpMemCon gInfo' m'' memId + XGrpMemCon memId -> Nothing <$ xGrpMemCon gInfo' m'' memId + -- TODO there should be a special logic when deleting host member (e.g., host forwards it before deleting connections) XGrpMemDel memId withMessages -> xGrpMemDel gInfo' m'' memId withMessages msg brokerTs XGrpLeave -> xGrpLeave gInfo' m'' msg brokerTs - XGrpDel -> xGrpDel gInfo' m'' msg brokerTs + -- TODO there should be a special logic - host should forward before deleting connections + XGrpDel -> Just <$> xGrpDel gInfo' m'' msg brokerTs XGrpInfo p' -> xGrpInfo gInfo' m'' p' msg brokerTs XGrpPrefs ps' -> xGrpPrefs gInfo' m'' ps' -- TODO [knocking] why don't we forward these messages? - XGrpDirectInv connReq mContent_ msgScope -> memberCanSend m'' msgScope $ xGrpDirectInv gInfo' m'' conn' connReq mContent_ msg brokerTs - XGrpMsgForward memberId msg' msgTs -> xGrpMsgForward gInfo' m'' memberId msg' msgTs - XInfoProbe probe -> xInfoProbe (COMGroupMember m'') probe - XInfoProbeCheck probeHash -> xInfoProbeCheck (COMGroupMember m'') probeHash - XInfoProbeOk probe -> xInfoProbeOk (COMGroupMember m'') probe - BFileChunk sharedMsgId chunk -> bFileChunkGroup gInfo' sharedMsgId chunk msgMeta - _ -> messageError $ "unsupported message: " <> tshow event + XGrpDirectInv connReq mContent_ msgScope -> memberCanSend m'' msgScope $ Nothing <$ xGrpDirectInv gInfo' m'' conn' connReq mContent_ msg brokerTs + XGrpMsgForward memberId msg' msgTs -> Nothing <$ xGrpMsgForward gInfo' m'' memberId msg' msgTs + XInfoProbe probe -> Nothing <$ xInfoProbe (COMGroupMember m'') probe + XInfoProbeCheck probeHash -> Nothing <$ xInfoProbeCheck (COMGroupMember m'') probeHash + XInfoProbeOk probe -> Nothing <$ xInfoProbeOk (COMGroupMember m'') probe + BFileChunk sharedMsgId chunk -> Nothing <$ bFileChunkGroup gInfo' sharedMsgId chunk msgMeta + _ -> Nothing <$ messageError ("unsupported message: " <> tshow event) checkSendRcpt :: [AChatMessage] -> CM Bool checkSendRcpt aMsgs = do currentMemCount <- withStore' $ \db -> getGroupCurrentMembersCount db user gInfo @@ -953,25 +977,57 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = where aChatMsgHasReceipt (ACMsg _ ChatMessage {chatMsgEvent}) = hasDeliveryReceipt (toCMEventTag chatMsgEvent) - forwardMsgs :: [AChatMessage] -> CM () - forwardMsgs aMsgs = do - -- TODO [knocking] forward to/from GSMemPendingReview members - let GroupMember {memberRole = membershipMemRole} = membership - when (membershipMemRole >= GRAdmin && not (blockedByAdmin m)) $ do - let forwardedMsgs = mapMaybe (\(ACMsg _ chatMsg) -> forwardedGroupMsg chatMsg) aMsgs - forM_ (L.nonEmpty forwardedMsgs) $ \forwardedMsgs' -> do - ChatConfig {highlyAvailable} <- asks config - -- members introduced to this invited member - introducedMembers <- - if memberCategory m == GCInviteeMember - then withStore' $ \db -> getForwardIntroducedMembers db vr user m highlyAvailable - else pure [] - -- invited members to which this member was introduced - invitedMembers <- withStore' $ \db -> getForwardInvitedMembers db vr user m highlyAvailable - let GroupMember {memberId} = m - ms = forwardedToGroupMembers (introducedMembers <> invitedMembers) forwardedMsgs' - events = L.map (\cm -> XGrpMsgForward memberId cm brokerTs) forwardedMsgs' - unless (null ms) $ void $ sendGroupMessages_ user gInfo ms events + -- TODO forwardMsgs member retrieval can be further optimized: + -- - move remaining filters to SQL (memberCurrentOrPending, memberCurrent) + -- - create new GroupForwardScope for reports to avoid post-filtering moderators in msgsForwardedToMember + -- as an additional step, instead initially retrieve only moderators + -- (reuse getForwardIntroducedModerators, getForwardInvitedModerators + filters) + -- - new GroupForwardScope for excluding members on XGrpMemRestrict + forwardMsgs :: GroupForwardScope -> NonEmpty (ChatMessage 'Json) -> CM () + forwardMsgs groupForwardScope fwdMsgs = do + ms <- buildMemberList + let GroupMember {memberId} = m + events = L.map (\cm -> XGrpMsgForward memberId cm brokerTs) fwdMsgs + unless (null ms) $ void $ sendGroupMessages_ user gInfo ms events + where + buildMemberList = case groupForwardScope of + GFSAll -> do + ms <- getAllIntroducedAndInvited + pure $ filter (\mem -> memberCurrentOrPending mem && msgsForwardedToMember fwdMsgs mem) ms + GFSMain -> do + ms <- getAllIntroducedAndInvited + pure $ filter (\mem -> memberCurrent mem && msgsForwardedToMember fwdMsgs mem) ms + GFSMemberSupport scopeGMId -> do + -- moderators introduced to this invited member + introducedModMs <- + if memberCategory m == GCInviteeMember + then withStore' $ \db -> getForwardIntroducedModerators db vr user m + else pure [] + -- invited moderators to which this member was introduced + invitedModMs <- withStore' $ \db -> getForwardInvitedModerators db vr user m + let modMs = introducedModMs <> invitedModMs + moderatorFilter mem = + memberCurrent mem + && maxVersion (memberChatVRange mem) >= groupKnockingVersion + && msgsForwardedToMember fwdMsgs mem + modMs' = filter moderatorFilter modMs + if scopeGMId == groupMemberId' m + then pure modMs' + else + withStore' (\db -> getForwardScopeMember db vr user m scopeGMId) >>= \case + Just scopeMem | msgsForwardedToMember fwdMsgs scopeMem -> pure $ scopeMem : modMs' + _ -> pure modMs' + where + getAllIntroducedAndInvited = do + ChatConfig {highlyAvailable} <- asks config + -- members introduced to this invited member + introducedMembers <- + if memberCategory m == GCInviteeMember + then withStore' $ \db -> getForwardIntroducedMembers db vr user m highlyAvailable + else pure [] + -- invited members to which this member was introduced + invitedMembers <- withStore' $ \db -> getForwardInvitedMembers db vr user m highlyAvailable + pure $ introducedMembers <> invitedMembers RCVD msgMeta msgRcpt -> withAckMessage' "group rcvd" agentConnId msgMeta $ groupMsgReceived gInfo m conn msgMeta msgRcpt @@ -1408,12 +1464,12 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = mem <- acceptGroupJoinSendRejectAsync user uclId gInfo invId chatVRange p xContactId_ rjctReason toViewTE $ TERejectingGroupJoinRequestMember user gInfo mem rjctReason - memberCanSend :: GroupMember -> Maybe MsgScope -> CM () -> CM () + memberCanSend :: GroupMember -> Maybe MsgScope -> CM (Maybe GroupForwardScope) -> CM (Maybe GroupForwardScope) memberCanSend m@GroupMember {memberRole} msgScope a = case msgScope of Just MSMember {} -> a Nothing | memberRole > GRObserver || memberPending m -> a - | otherwise -> messageError "member is not allowed to send messages" + | otherwise -> messageError "member is not allowed to send messages" $> Nothing processConnMERR :: ConnectionEntity -> Connection -> AgentErrorType -> CM () processConnMERR connEntity conn err = do @@ -1641,18 +1697,34 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = when (sz > fileSize) $ receiveFileEvt' user ft False Nothing Nothing >>= toView messageFileDescription :: Contact -> SharedMsgId -> FileDescr -> CM () - messageFileDescription ct@Contact {contactId} sharedMsgId fileDescr = do - fileId <- withStore $ \db -> getFileIdBySharedMsgId db userId contactId sharedMsgId - processFDMessage (CDDirectRcv ct) sharedMsgId fileId fileDescr + messageFileDescription Contact {contactId} sharedMsgId fileDescr = do + (fileId, aci) <- withStore $ \db -> do + fileId <- getFileIdBySharedMsgId db userId contactId sharedMsgId + aci <- getChatItemByFileId db vr user fileId + pure (fileId, aci) + processFDMessage fileId aci fileDescr - groupMessageFileDescription :: GroupInfo -> GroupMember -> SharedMsgId -> FileDescr -> CM () - groupMessageFileDescription g@GroupInfo {groupId} m sharedMsgId fileDescr = do - fileId <- withStore $ \db -> getGroupFileIdBySharedMsgId db userId groupId sharedMsgId - -- here scope we pass only affects how chat item is searched in getAChatItemBySharedMsgId, and it ignores scope - processFDMessage (CDGroupRcv g Nothing m) sharedMsgId fileId fileDescr + groupMessageFileDescription :: GroupInfo -> GroupMember -> SharedMsgId -> FileDescr -> CM (Maybe GroupForwardScope) + groupMessageFileDescription g@GroupInfo {groupId} GroupMember {memberId} sharedMsgId fileDescr = do + (fileId, aci) <- withStore $ \db -> do + fileId <- getGroupFileIdBySharedMsgId db userId groupId sharedMsgId + aci <- getChatItemByFileId db vr user fileId + pure (fileId, aci) + case aci of + AChatItem SCTGroup SMDRcv (GroupChat _g scopeInfo) ChatItem {chatDir = CIGroupRcv m} -> + if sameMemberId memberId m + then do + -- in processFDMessage some paths are programmed as errors, + -- for example failure on not approved relays (CEFileNotApproved). + -- we catch error, so that even if processFDMessage fails, message can still be forwarded. + processFDMessage fileId aci fileDescr `catchChatError` \_ -> pure () + pure $ Just $ toGroupForwardScope g scopeInfo + else + messageError "x.msg.file.descr: file of another member" $> Nothing + _ -> messageError "x.msg.file.descr: invalid file description part" $> Nothing - processFDMessage :: ChatTypeQuotable c => ChatDirection c 'MDRcv -> SharedMsgId -> FileTransferId -> FileDescr -> CM () - processFDMessage cd sharedMsgId fileId fileDescr = do + processFDMessage :: FileTransferId -> AChatItem -> FileDescr -> CM () + processFDMessage fileId aci fileDescr = do ft <- withStore $ \db -> getRcvFileTransfer db user fileId unless (rcvFileCompleteOrCancelled ft) $ do (rfd@RcvFileDescr {fileDescrComplete}, ft'@RcvFileTransfer {fileStatus, xftpRcvFile, cryptoArgs}) <- withStore $ \db -> do @@ -1661,9 +1733,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = -- to prevent race condition with accept ft' <- getRcvFileTransfer db user fileId pure (rfd, ft') - when fileDescrComplete $ do - ci <- withStore $ \db -> getAChatItemBySharedMsgId db user cd sharedMsgId - toView $ CEvtRcvFileDescrReady user ci ft' rfd + when fileDescrComplete $ toView $ CEvtRcvFileDescrReady user aci ft' rfd case (fileStatus, xftpRcvFile) of (RFSAccepted _, Just XFTPRcvFile {userApprovedRelays}) -> receiveViaCompleteFD user fileId rfd userApprovedRelays cryptoArgs _ -> pure () @@ -1769,27 +1839,40 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = else pure Nothing mapM_ toView cEvt_ - groupMsgReaction :: GroupInfo -> GroupMember -> SharedMsgId -> MemberId -> MsgReaction -> Bool -> RcvMessage -> UTCTime -> CM () - groupMsgReaction g m sharedMsgId itemMemberId reaction add RcvMessage {msgId} brokerTs = do - when (groupFeatureAllowed SGFReactions g) $ do - rs <- withStore' $ \db -> getGroupReactions db g m itemMemberId sharedMsgId False - when (reactionAllowed add reaction rs) $ do - updateChatItemReaction `catchCINotFound` \_ -> - withStore' $ \db -> setGroupReaction db g m itemMemberId sharedMsgId False reaction add msgId brokerTs + groupMsgReaction :: GroupInfo -> GroupMember -> SharedMsgId -> MemberId -> Maybe MsgScope -> MsgReaction -> Bool -> RcvMessage -> UTCTime -> CM (Maybe GroupForwardScope) + groupMsgReaction g m@GroupMember {memberRole} sharedMsgId itemMemberId scope_ reaction add RcvMessage {msgId} brokerTs + | groupFeatureAllowed SGFReactions g = do + rs <- withStore' $ \db -> getGroupReactions db g m itemMemberId sharedMsgId False + if reactionAllowed add reaction rs + then + updateChatItemReaction `catchCINotFound` \_ -> case scope_ of + Just (MSMember scopeMemberId) + | memberRole >= GRModerator || scopeMemberId == memberId' m -> + withStore $ \db -> do + liftIO $ setGroupReaction db g m itemMemberId sharedMsgId False reaction add msgId brokerTs + Just . GFSMemberSupport <$> getScopeMemberIdViaMemberId db user g m scopeMemberId + | otherwise -> pure Nothing + Nothing -> do + withStore' $ \db -> setGroupReaction db g m itemMemberId sharedMsgId False reaction add msgId brokerTs + pure $ Just GFSMain + else pure Nothing + | otherwise = pure Nothing where updateChatItemReaction = do - cEvt_ <- withStore $ \db -> do - CChatItem md ci <- getGroupMemberCIBySharedMsgId db user g itemMemberId sharedMsgId - scopeInfo <- getGroupChatScopeInfoForItem db vr user g (chatItemId' ci) - if ciReactionAllowed ci - then liftIO $ do + (CChatItem md ci, scopeInfo) <- withStore $ \db -> do + cci <- getGroupMemberCIBySharedMsgId db user g itemMemberId sharedMsgId + scopeInfo <- getGroupChatScopeInfoForItem db vr user g (cChatItemId cci) + pure (cci, scopeInfo) + if ciReactionAllowed ci + then do + reactions <- withStore' $ \db -> do setGroupReaction db g m itemMemberId sharedMsgId False reaction add msgId brokerTs - reactions <- getGroupCIReactions db g itemMemberId sharedMsgId - let ci' = CChatItem md ci {reactions} - r = ACIReaction SCTGroup SMDRcv (GroupChat g scopeInfo) $ CIReaction (CIGroupRcv m) ci' brokerTs reaction - pure $ Just $ CEvtChatItemReaction user add r - else pure Nothing - mapM_ toView cEvt_ + getGroupCIReactions db g itemMemberId sharedMsgId + let ci' = CChatItem md ci {reactions} + r = ACIReaction SCTGroup SMDRcv (GroupChat g scopeInfo) $ CIReaction (CIGroupRcv m) ci' brokerTs reaction + toView $ CEvtChatItemReaction user add r + pure $ Just $ toGroupForwardScope g scopeInfo + else pure Nothing reactionAllowed :: Bool -> MsgReaction -> [MsgReaction] -> Bool reactionAllowed add reaction rs = (reaction `elem` rs) /= add && not (add && length rs >= maxMsgReactions) @@ -1800,20 +1883,23 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = ChatErrorStore (SEChatItemSharedMsgIdNotFound sharedMsgId) -> handle sharedMsgId e -> throwError e - newGroupContentMessage :: GroupInfo -> GroupMember -> MsgContainer -> RcvMessage -> UTCTime -> Bool -> CM () + newGroupContentMessage :: GroupInfo -> GroupMember -> MsgContainer -> RcvMessage -> UTCTime -> Bool -> CM (Maybe GroupForwardScope) newGroupContentMessage gInfo m@GroupMember {memberId, memberRole} mc msg@RcvMessage {sharedMsgId_} brokerTs forwarded = do (gInfo', m', scopeInfo) <- mkGetMessageChatScope vr user gInfo m msgScope_ if blockedByAdmin m' - then createBlockedByAdmin gInfo' m' scopeInfo + then createBlockedByAdmin gInfo' m' scopeInfo $> Nothing else case prohibitedGroupContent gInfo' m' scopeInfo content ft_ fInv_ False of - Just f -> rejected gInfo' m' scopeInfo f + Just f -> rejected gInfo' m' scopeInfo f $> Nothing Nothing -> withStore' (\db -> getCIModeration db vr user gInfo' memberId sharedMsgId_) >>= \case Just ciModeration -> do applyModeration gInfo' m' scopeInfo ciModeration withStore' $ \db -> deleteCIModeration db gInfo' memberId sharedMsgId_ - Nothing -> createContentItem gInfo' m' scopeInfo + pure Nothing + Nothing -> do + createContentItem gInfo' m' scopeInfo + pure $ Just $ toGroupForwardScope gInfo scopeInfo where rejected gInfo' m' scopeInfo f = newChatItem gInfo' m' scopeInfo (ciContentNoParse $ CIRcvGroupFeatureRejected f) Nothing Nothing False timed' gInfo' = if forwarded then rcvCITimed_ (Just Nothing) itemTTL else rcvGroupCITimed gInfo' itemTTL @@ -1859,10 +1945,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = reactions <- maybe (pure []) (\sharedMsgId -> withStore' $ \db -> getGroupCIReactions db gInfo' memberId sharedMsgId) sharedMsgId_ groupMsgToView cInfo ci' {reactions} - groupMessageUpdate :: GroupInfo -> GroupMember -> SharedMsgId -> MsgContent -> Map MemberName MsgMention -> Maybe MsgScope -> RcvMessage -> UTCTime -> Maybe Int -> Maybe Bool -> CM () + groupMessageUpdate :: GroupInfo -> GroupMember -> SharedMsgId -> MsgContent -> Map MemberName MsgMention -> Maybe MsgScope -> RcvMessage -> UTCTime -> Maybe Int -> Maybe Bool -> CM (Maybe GroupForwardScope) groupMessageUpdate gInfo@GroupInfo {groupId} m@GroupMember {groupMemberId, memberId} sharedMsgId mc mentions msgScope_ msg@RcvMessage {msgId} brokerTs ttl_ live_ | prohibitedSimplexLinks gInfo m ft_ = - messageWarning $ "x.msg.update ignored: feature not allowed " <> groupFeatureNameText GFSimplexLinks + messageWarning ("x.msg.update ignored: feature not allowed " <> groupFeatureNameText GFSimplexLinks) $> Nothing | otherwise = do updateRcvChatItem `catchCINotFound` \_ -> do -- This patches initial sharedMsgId into chat item when locally deleted chat item @@ -1877,6 +1963,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = ci' <- updateGroupChatItem db user groupId ci content True live Nothing blockedMember m' ci' $ markGroupChatItemBlocked db user gInfo' ci' toView $ CEvtChatItemUpdated user (AChatItem SCTGroup SMDRcv cInfo ci') + pure $ Just $ toGroupForwardScope gInfo scopeInfo where content = CIRcvMsgContent mc ts@(_, ft_) = msgContentTexts mc @@ -1901,12 +1988,15 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = updateGroupCIMentions db gInfo ci' ciMentions toView $ CEvtChatItemUpdated user (AChatItem SCTGroup SMDRcv (GroupChat gInfo scopeInfo) ci') startUpdatedTimedItemThread user (ChatRef CTGroup groupId $ toChatScope <$> scopeInfo) ci ci' - else toView $ CEvtChatItemNotChanged user (AChatItem SCTGroup SMDRcv (GroupChat gInfo scopeInfo) ci) - else messageError "x.msg.update: group member attempted to update a message of another member" - _ -> messageError "x.msg.update: group member attempted invalid message update" + pure $ Just $ toGroupForwardScope gInfo scopeInfo + else do + toView $ CEvtChatItemNotChanged user (AChatItem SCTGroup SMDRcv (GroupChat gInfo scopeInfo) ci) + pure Nothing + else messageError "x.msg.update: group member attempted to update a message of another member" $> Nothing + _ -> messageError "x.msg.update: group member attempted invalid message update" $> Nothing - groupMessageDelete :: GroupInfo -> GroupMember -> SharedMsgId -> Maybe MemberId -> RcvMessage -> UTCTime -> CM () - groupMessageDelete gInfo@GroupInfo {membership} m@GroupMember {memberId, memberRole = senderRole} sharedMsgId sndMemberId_ RcvMessage {msgId} brokerTs = do + groupMessageDelete :: GroupInfo -> GroupMember -> SharedMsgId -> Maybe MemberId -> Maybe MsgScope -> RcvMessage -> UTCTime -> CM (Maybe GroupForwardScope) + groupMessageDelete gInfo@GroupInfo {membership} m@GroupMember {memberId, memberRole = senderRole} sharedMsgId sndMemberId_ scope_ RcvMessage {msgId} brokerTs = do let msgMemberId = fromMaybe memberId sndMemberId_ withStore' (\db -> runExceptT $ getGroupMemberCIBySharedMsgId db user gInfo msgMemberId sharedMsgId) >>= \case Right cci@(CChatItem _ ci@ChatItem {chatDir}) -> case chatDir of @@ -1914,40 +2004,52 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = -- regular deletion Nothing | sameMemberId memberId mem && msgMemberId == memberId && rcvItemDeletable ci brokerTs -> - delete cci Nothing + Just <$> delete cci Nothing | otherwise -> - messageError "x.msg.del: member attempted invalid message delete" + messageError "x.msg.del: member attempted invalid message delete" $> Nothing -- moderation (not limited by time) Just _ | sameMemberId memberId mem && msgMemberId == memberId -> - delete cci (Just m) + Just <$> delete cci (Just m) | otherwise -> moderate mem cci CIGroupSnd -> moderate membership cci Left e - | msgMemberId == memberId -> messageError $ "x.msg.del: message not found, " <> tshow e - | senderRole < GRModerator -> messageError $ "x.msg.del: message not found, message of another member with insufficient member permissions, " <> tshow e - | otherwise -> withStore' $ \db -> createCIModeration db gInfo m msgMemberId sharedMsgId msgId brokerTs + | msgMemberId == memberId -> + messageError ("x.msg.del: message not found, " <> tshow e) $> Nothing + | senderRole < GRModerator -> do + messageError $ "x.msg.del: message not found, message of another member with insufficient member permissions, " <> tshow e + pure Nothing + | otherwise -> case scope_ of + Just (MSMember scopeMemberId) -> + withStore $ \db -> do + liftIO $ createCIModeration db gInfo m msgMemberId sharedMsgId msgId brokerTs + Just . GFSMemberSupport <$> getScopeMemberIdViaMemberId db user gInfo m scopeMemberId + Nothing -> do + withStore' $ \db -> createCIModeration db gInfo m msgMemberId sharedMsgId msgId brokerTs + pure $ Just GFSMain where - moderate :: GroupMember -> CChatItem 'CTGroup -> CM () + moderate :: GroupMember -> CChatItem 'CTGroup -> CM (Maybe GroupForwardScope) moderate mem cci = case sndMemberId_ of Just sndMemberId | sameMemberId sndMemberId mem -> checkRole mem $ do - delete cci (Just m) + groupForwardScope <- delete cci (Just m) archiveMessageReports cci m - | otherwise -> messageError "x.msg.del: message of another member with incorrect memberId" - _ -> messageError "x.msg.del: message of another member without memberId" + pure $ Just groupForwardScope + | otherwise -> messageError "x.msg.del: message of another member with incorrect memberId" $> Nothing + _ -> messageError "x.msg.del: message of another member without memberId" $> Nothing checkRole GroupMember {memberRole} a | senderRole < GRModerator || senderRole < memberRole = - messageError "x.msg.del: message of another member with insufficient member permissions" + messageError "x.msg.del: message of another member with insufficient member permissions" $> Nothing | otherwise = a - delete :: CChatItem 'CTGroup -> Maybe GroupMember -> CM () + delete :: CChatItem 'CTGroup -> Maybe GroupMember -> CM GroupForwardScope delete cci byGroupMember = do scopeInfo <- withStore $ \db -> getGroupChatScopeInfoForItem db vr user gInfo (cChatItemId cci) deletions <- if groupFeatureMemberAllowed SGFFullDelete m gInfo then deleteGroupCIs user gInfo scopeInfo [cci] byGroupMember brokerTs else markGroupCIsDeleted user gInfo scopeInfo [cci] byGroupMember brokerTs toView $ CEvtChatItemsDeleted user deletions False False + pure $ toGroupForwardScope gInfo scopeInfo archiveMessageReports :: CChatItem 'CTGroup -> GroupMember -> CM () archiveMessageReports (CChatItem _ ci) byMember = do ciIds <- withStore' $ \db -> markMessageReportsDeleted db user gInfo ci byMember brokerTs @@ -2084,21 +2186,25 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = _ -> pure () receiveFileChunk ft Nothing meta chunk - xFileCancelGroup :: GroupInfo -> GroupMember -> SharedMsgId -> CM () - xFileCancelGroup g@GroupInfo {groupId} GroupMember {groupMemberId, memberId} sharedMsgId = do - fileId <- withStore $ \db -> getGroupFileIdBySharedMsgId db userId groupId sharedMsgId - CChatItem msgDir ChatItem {chatDir} <- withStore $ \db -> getGroupChatItemBySharedMsgId db user g groupMemberId sharedMsgId - case (msgDir, chatDir) of - (SMDRcv, CIGroupRcv m) -> do + xFileCancelGroup :: GroupInfo -> GroupMember -> SharedMsgId -> CM (Maybe GroupForwardScope) + xFileCancelGroup g@GroupInfo {groupId} GroupMember {memberId} sharedMsgId = do + (fileId, aci) <- withStore $ \db -> do + fileId <- getGroupFileIdBySharedMsgId db userId groupId sharedMsgId + aci <- getChatItemByFileId db vr user fileId + pure (fileId, aci) + case aci of + AChatItem SCTGroup SMDRcv (GroupChat _g scopeInfo) ChatItem {chatDir = CIGroupRcv m} -> do if sameMemberId memberId m then do - ft <- withStore (\db -> getRcvFileTransfer db user fileId) + ft <- withStore $ \db -> getRcvFileTransfer db user fileId unless (rcvFileCompleteOrCancelled ft) $ do cancelRcvFileTransfer user ft >>= mapM_ deleteAgentConnectionAsync - ci <- withStore $ \db -> getChatItemByFileId db vr user fileId - toView $ CEvtRcvFileSndCancelled user ci ft - else messageError "x.file.cancel: group member attempted to cancel file of another member" -- shouldn't happen now that query includes group member id - (SMDSnd, _) -> messageError "x.file.cancel: group member attempted invalid file cancel" + toView $ CEvtRcvFileSndCancelled user aci ft + pure $ Just $ toGroupForwardScope g scopeInfo + else + -- shouldn't happen now that query includes group member id + messageError "x.file.cancel: group member attempted to cancel file of another member" $> Nothing + _ -> messageError "x.file.cancel: group member attempted invalid file cancel" $> Nothing xFileAcptInvGroup :: GroupInfo -> GroupMember -> SharedMsgId -> Maybe ConnReqInvitation -> String -> CM () xFileAcptInvGroup GroupInfo {groupId} m@GroupMember {activeConn} sharedMsgId fileConnReq_ fName = do @@ -2236,8 +2342,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = Profile {displayName = n, fullName = fn, shortDescr = sd, image = i, contactLink = cl} = p Profile {displayName = n', fullName = fn', shortDescr = sd', image = i', contactLink = cl'} = p' - xInfoMember :: GroupInfo -> GroupMember -> Profile -> UTCTime -> CM () - xInfoMember gInfo m p' brokerTs = void $ processMemberProfileUpdate gInfo m p' True (Just brokerTs) + xInfoMember :: GroupInfo -> GroupMember -> Profile -> UTCTime -> CM (Maybe GroupForwardScope) + xInfoMember gInfo m p' brokerTs = do + void $ processMemberProfileUpdate gInfo m p' True (Just brokerTs) + pure $ memberEventForwardScope m xGrpLinkMem :: GroupInfo -> GroupMember -> Connection -> Profile -> CM () xGrpLinkMem gInfo@GroupInfo {membership, businessChat} m@GroupMember {groupMemberId, memberCategory} Connection {viaGroupLink} p' = do @@ -2615,33 +2723,41 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = -- TODO show/log error, other events in SMP confirmation _ -> pure (conn', False) - xGrpMemNew :: GroupInfo -> GroupMember -> MemberInfo -> Maybe MsgScope -> RcvMessage -> UTCTime -> CM () + xGrpMemNew :: GroupInfo -> GroupMember -> MemberInfo -> Maybe MsgScope -> RcvMessage -> UTCTime -> CM (Maybe GroupForwardScope) xGrpMemNew gInfo m memInfo@(MemberInfo memId memRole _ _) msgScope_ msg brokerTs = do checkHostRole m memRole - unless (sameMemberId memId $ membership gInfo) $ - withStore' (\db -> runExceptT $ getGroupMemberByMemberId db vr user gInfo memId) >>= \case - Right unknownMember@GroupMember {memberStatus = GSMemUnknown} -> do - (updatedMember, gInfo') <- withStore $ \db -> do - updatedMember <- updateUnknownMemberAnnounced db vr user m unknownMember memInfo initialStatus - gInfo' <- if memberPending updatedMember - then liftIO $ increaseGroupMembersRequireAttention db user gInfo - else pure gInfo - pure (updatedMember, gInfo') - toView $ CEvtUnknownMemberAnnounced user gInfo' m unknownMember updatedMember - memberAnnouncedToView updatedMember gInfo' - Right _ -> messageError "x.grp.mem.new error: member already exists" - Left _ -> do - (newMember, gInfo') <- withStore $ \db -> do - newMember <- createNewGroupMember db user gInfo m memInfo GCPostMember initialStatus - gInfo' <- if memberPending newMember - then liftIO $ increaseGroupMembersRequireAttention db user gInfo - else pure gInfo - pure (newMember, gInfo') - memberAnnouncedToView newMember gInfo' + if sameMemberId memId (membership gInfo) + then pure Nothing + else do + withStore' (\db -> runExceptT $ getGroupMemberByMemberId db vr user gInfo memId) >>= \case + Right unknownMember@GroupMember {memberStatus = GSMemUnknown} -> do + (updatedMember, gInfo') <- withStore $ \db -> do + updatedMember <- updateUnknownMemberAnnounced db vr user m unknownMember memInfo initialStatus + gInfo' <- if memberPending updatedMember + then liftIO $ increaseGroupMembersRequireAttention db user gInfo + else pure gInfo + pure (updatedMember, gInfo') + toView $ CEvtUnknownMemberAnnounced user gInfo' m unknownMember updatedMember + memberAnnouncedToView updatedMember gInfo' + pure $ forwardScope updatedMember + Right _ -> messageError "x.grp.mem.new error: member already exists" $> Nothing + Left _ -> do + (newMember, gInfo') <- withStore $ \db -> do + newMember <- createNewGroupMember db user gInfo m memInfo GCPostMember initialStatus + gInfo' <- if memberPending newMember + then liftIO $ increaseGroupMembersRequireAttention db user gInfo + else pure gInfo + pure (newMember, gInfo') + memberAnnouncedToView newMember gInfo' + pure $ forwardScope newMember where initialStatus = case msgScope_ of Just (MSMember _) -> GSMemPendingReview _ -> GSMemAnnounced + forwardScope GroupMember {groupMemberId, memberStatus} + | memberStatus == GSMemPendingApproval = Nothing + | memberStatus == GSMemPendingReview = Just $ GFSMemberSupport groupMemberId + | otherwise = Just GFSMain memberAnnouncedToView announcedMember@GroupMember {groupMemberId, memberProfile} gInfo' = do (announcedMember', scopeInfo) <- getMemNewChatScope announcedMember let event = RGEMemberAdded groupMemberId (fromLocalProfile memberProfile) @@ -2729,7 +2845,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = chatV = vr `peerConnChatVersion` mcvr withStore' $ \db -> createIntroToMemberContact db user m toMember chatV mcvr groupConnIds directConnIds customUserProfileId subMode - xGrpMemRole :: GroupInfo -> GroupMember -> MemberId -> GroupMemberRole -> RcvMessage -> UTCTime -> CM () + xGrpMemRole :: GroupInfo -> GroupMember -> MemberId -> GroupMemberRole -> RcvMessage -> UTCTime -> CM (Maybe GroupForwardScope) xGrpMemRole gInfo@GroupInfo {membership} m@GroupMember {memberRole = senderRole} memId memRole msg brokerTs | membershipMemId == memId = let gInfo' = gInfo {membership = membership {memberRole = memRole}} @@ -2737,23 +2853,25 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = | otherwise = withStore' (\db -> runExceptT $ getGroupMemberByMemberId db vr user gInfo memId) >>= \case Right member -> changeMemberRole gInfo member $ RGEMemberRole (groupMemberId' member) (fromLocalProfile $ memberProfile member) memRole - Left _ -> messageError "x.grp.mem.role with unknown member ID" + Left _ -> messageError "x.grp.mem.role with unknown member ID" $> Nothing where GroupMember {memberId = membershipMemId} = membership changeMemberRole gInfo' member@GroupMember {memberRole = fromRole} gEvent - | senderRole < GRAdmin || senderRole < fromRole = messageError "x.grp.mem.role with insufficient member permissions" + | senderRole < GRAdmin || senderRole < fromRole = + messageError "x.grp.mem.role with insufficient member permissions" $> Nothing | otherwise = do withStore' $ \db -> updateGroupMemberRole db user member memRole (gInfo'', m', scopeInfo) <- mkGroupChatScope gInfo' m (ci, cInfo) <- saveRcvChatItemNoParse user (CDGroupRcv gInfo'' scopeInfo m') msg brokerTs (CIRcvGroupEvent gEvent) groupMsgToView cInfo ci toView CEvtMemberRole {user, groupInfo = gInfo'', byMember = m', member = member {memberRole = memRole}, fromRole, toRole = memRole} + pure $ memberEventForwardScope member checkHostRole :: GroupMember -> GroupMemberRole -> CM () checkHostRole GroupMember {memberRole, localDisplayName} memRole = when (memberRole < GRAdmin || memberRole < memRole) $ throwChatError (CEGroupContactRole localDisplayName) - xGrpMemRestrict :: GroupInfo -> GroupMember -> MemberId -> MemberRestrictions -> RcvMessage -> UTCTime -> CM () + xGrpMemRestrict :: GroupInfo -> GroupMember -> MemberId -> MemberRestrictions -> RcvMessage -> UTCTime -> CM (Maybe GroupForwardScope) xGrpMemRestrict gInfo@GroupInfo {membership = GroupMember {memberId = membershipMemId}} m@GroupMember {memberRole = senderRole} @@ -2763,12 +2881,13 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = brokerTs | membershipMemId == memId = -- member shouldn't receive this message about themselves - messageError "x.grp.mem.restrict: admin blocks you" + messageError "x.grp.mem.restrict: admin blocks you" $> Nothing | otherwise = withStore' (\db -> runExceptT $ getGroupMemberByMemberId db vr user gInfo memId) >>= \case Right bm@GroupMember {groupMemberId = bmId, memberRole, blockedByAdmin, memberProfile = bmp} - | blockedByAdmin == mrsBlocked restriction -> pure () - | senderRole < GRModerator || senderRole < memberRole -> messageError "x.grp.mem.restrict with insufficient member permissions" + | blockedByAdmin == mrsBlocked restriction -> pure Nothing + | senderRole < GRModerator || senderRole < memberRole -> + messageError "x.grp.mem.restrict with insufficient member permissions" $> Nothing | otherwise -> do bm' <- setMemberBlocked bm toggleNtf bm' (not blocked) @@ -2776,11 +2895,13 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = (gInfo', m', scopeInfo) <- mkGroupChatScope gInfo m (ci, cInfo) <- saveRcvChatItemNoParse user (CDGroupRcv gInfo' scopeInfo m') msg brokerTs ciContent groupMsgToView cInfo ci - toView CEvtMemberBlockedForAll {user, groupInfo = gInfo', byMember = m', member = bm, blocked} + toView CEvtMemberBlockedForAll {user, groupInfo = gInfo', byMember = m', member = bm', blocked} + pure $ memberEventForwardScope bm Left (SEGroupMemberNotFoundByMemberId _) -> do bm <- createUnknownMember gInfo memId bm' <- setMemberBlocked bm toView $ CEvtUnknownMemberBlocked user gInfo m bm' + pure $ Just GFSMain Left e -> throwError $ ChatErrorStore e where setMemberBlocked bm = withStore' $ \db -> updateGroupMemberBlocked db user gInfo restriction bm @@ -2827,7 +2948,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = _ -> updateStatus introId GMIntroReConnected updateStatus introId status = withStore' $ \db -> updateIntroStatus db introId status - xGrpMemDel :: GroupInfo -> GroupMember -> MemberId -> Bool -> RcvMessage -> UTCTime -> CM () + xGrpMemDel :: GroupInfo -> GroupMember -> MemberId -> Bool -> RcvMessage -> UTCTime -> CM (Maybe GroupForwardScope) xGrpMemDel gInfo@GroupInfo {membership} m@GroupMember {memberRole = senderRole} memId withMessages msg brokerTs = do let GroupMember {memberId = membershipMemId} = membership if membershipMemId == memId @@ -2840,9 +2961,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = when withMessages $ deleteMessages membership SMDSnd deleteMemberItem RGEUserDeleted toView $ CEvtDeletedMemberUser user gInfo {membership = membership {memberStatus = GSMemRemoved}} m withMessages + pure Nothing -- TODO there should be a special logic when deleting host member (e.g., host forwards it before deleting connections) else withStore' (\db -> runExceptT $ getGroupMemberByMemberId db vr user gInfo memId) >>= \case - Left _ -> messageError "x.grp.mem.del with unknown member ID" + Left _ -> messageError "x.grp.mem.del with unknown member ID" $> Just GFSAll Right member@GroupMember {groupMemberId, memberProfile} -> checkRole member $ do -- ? prohibit deleting member if it's the sender - sender should use x.grp.leave @@ -2852,10 +2974,11 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = when withMessages $ deleteMessages member SMDRcv deleteMemberItem $ RGEMemberDeleted groupMemberId (fromLocalProfile memberProfile) toView $ CEvtDeletedMember user gInfo' m member {memberStatus = GSMemRemoved} withMessages + pure $ memberEventForwardScope member where checkRole GroupMember {memberRole} a | senderRole < GRAdmin || senderRole < memberRole = - messageError "x.grp.mem.del with insufficient member permissions" + messageError "x.grp.mem.del with insufficient member permissions" $> Nothing | otherwise = a deleteMemberItem gEvent = do (gInfo', m', scopeInfo) <- mkGroupChatScope gInfo m @@ -2866,7 +2989,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = | groupFeatureMemberAllowed SGFFullDelete m gInfo = deleteGroupMemberCIs user gInfo delMem m msgDir | otherwise = markGroupMemberCIsDeleted user gInfo delMem m - xGrpLeave :: GroupInfo -> GroupMember -> RcvMessage -> UTCTime -> CM () + xGrpLeave :: GroupInfo -> GroupMember -> RcvMessage -> UTCTime -> CM (Maybe GroupForwardScope) xGrpLeave gInfo m msg brokerTs = do deleteMemberConnection m -- member record is not deleted to allow creation of "member left" chat item @@ -2879,8 +3002,9 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = (ci, cInfo) <- saveRcvChatItemNoParse user (CDGroupRcv gInfo'' scopeInfo m') msg brokerTs (CIRcvGroupEvent RGEMemberLeft) groupMsgToView cInfo ci toView $ CEvtLeftMember user gInfo'' m' {memberStatus = GSMemLeft} + pure $ memberEventForwardScope m - xGrpDel :: GroupInfo -> GroupMember -> RcvMessage -> UTCTime -> CM () + xGrpDel :: GroupInfo -> GroupMember -> RcvMessage -> UTCTime -> CM GroupForwardScope xGrpDel gInfo@GroupInfo {membership} m@GroupMember {memberRole} msg brokerTs = do when (memberRole /= GROwner) $ throwChatError $ CEGroupUserRole gInfo GROwner ms <- withStore' $ \db -> do @@ -2893,26 +3017,29 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = (ci, cInfo) <- saveRcvChatItemNoParse user (CDGroupRcv gInfo'' scopeInfo m') msg brokerTs (CIRcvGroupEvent RGEGroupDeleted) groupMsgToView cInfo ci toView $ CEvtGroupDeleted user gInfo'' {membership = membership {memberStatus = GSMemGroupDeleted}} m' + pure GFSAll - xGrpInfo :: GroupInfo -> GroupMember -> GroupProfile -> RcvMessage -> UTCTime -> CM () + xGrpInfo :: GroupInfo -> GroupMember -> GroupProfile -> RcvMessage -> UTCTime -> CM (Maybe GroupForwardScope) xGrpInfo g@GroupInfo {groupProfile = p, businessChat} m@GroupMember {memberRole} p' msg brokerTs - | memberRole < GROwner = messageError "x.grp.info with insufficient member permissions" - | otherwise = case businessChat of - Nothing -> unless (p == p') $ do - g' <- withStore $ \db -> updateGroupProfile db user g p' - (g'', m', scopeInfo) <- mkGroupChatScope g' m - toView $ CEvtGroupUpdated user g g'' (Just m') - let cd = CDGroupRcv g'' scopeInfo m' - unless (sameGroupProfileInfo p p') $ do - (ci, cInfo) <- saveRcvChatItemNoParse user cd msg brokerTs (CIRcvGroupEvent $ RGEGroupUpdated p') - groupMsgToView cInfo ci - createGroupFeatureChangedItems user cd CIRcvGroupFeature g g'' - Just _ -> updateGroupPrefs_ g m $ fromMaybe defaultBusinessGroupPrefs $ groupPreferences p' + | memberRole < GROwner = messageError "x.grp.info with insufficient member permissions" $> Nothing + | otherwise = do + case businessChat of + Nothing -> unless (p == p') $ do + g' <- withStore $ \db -> updateGroupProfile db user g p' + (g'', m', scopeInfo) <- mkGroupChatScope g' m + toView $ CEvtGroupUpdated user g g'' (Just m') + let cd = CDGroupRcv g'' scopeInfo m' + unless (sameGroupProfileInfo p p') $ do + (ci, cInfo) <- saveRcvChatItemNoParse user cd msg brokerTs (CIRcvGroupEvent $ RGEGroupUpdated p') + groupMsgToView cInfo ci + createGroupFeatureChangedItems user cd CIRcvGroupFeature g g'' + Just _ -> updateGroupPrefs_ g m $ fromMaybe defaultBusinessGroupPrefs $ groupPreferences p' + pure $ Just GFSAll - xGrpPrefs :: GroupInfo -> GroupMember -> GroupPreferences -> CM () + xGrpPrefs :: GroupInfo -> GroupMember -> GroupPreferences -> CM (Maybe GroupForwardScope) xGrpPrefs g m@GroupMember {memberRole} ps' - | memberRole < GROwner = messageError "x.grp.prefs with insufficient member permissions" - | otherwise = updateGroupPrefs_ g m ps' + | memberRole < GROwner = messageError "x.grp.prefs with insufficient member permissions" $> Nothing + | otherwise = updateGroupPrefs_ g m ps' $> Just GFSAll updateGroupPrefs_ :: GroupInfo -> GroupMember -> GroupPreferences -> CM () updateGroupPrefs_ g@GroupInfo {groupProfile = p} m ps' = @@ -2984,28 +3111,28 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = processForwardedMsg unknownAuthor msg Left e -> throwError $ ChatErrorStore e where - -- Note: forwarded group events (see forwardedGroupMsg) should include msgId to be deduplicated + -- ! see isForwardedGroupMsg: forwarded group events should include msgId to be deduplicated processForwardedMsg :: GroupMember -> ChatMessage 'Json -> CM () processForwardedMsg author chatMsg = do let body = LB.toStrict $ J.encode msg rcvMsg@RcvMessage {chatMsgEvent = ACME _ event} <- saveGroupFwdRcvMsg user groupId m author body chatMsg case event of - XMsgNew mc -> memberCanSend author scope $ newGroupContentMessage gInfo author mc rcvMsg msgTs True + XMsgNew mc -> void $ memberCanSend author scope $ newGroupContentMessage gInfo author mc rcvMsg msgTs True where ExtMsgContent {scope} = mcExtMsgContent mc -- file description is always allowed, to allow sending files to support scope - XMsgFileDescr sharedMsgId fileDescr -> groupMessageFileDescription gInfo author sharedMsgId fileDescr - XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> memberCanSend author msgScope $ groupMessageUpdate gInfo author sharedMsgId mContent mentions msgScope rcvMsg msgTs ttl live - XMsgDel sharedMsgId memId -> groupMessageDelete gInfo author sharedMsgId memId rcvMsg msgTs - XMsgReact sharedMsgId (Just memId) reaction add -> groupMsgReaction gInfo author sharedMsgId memId reaction add rcvMsg msgTs - XFileCancel sharedMsgId -> xFileCancelGroup gInfo author sharedMsgId - XInfo p -> xInfoMember gInfo author p msgTs - XGrpMemNew memInfo msgScope -> xGrpMemNew gInfo author memInfo msgScope rcvMsg msgTs - XGrpMemRole memId memRole -> xGrpMemRole gInfo author memId memRole rcvMsg msgTs - XGrpMemDel memId withMessages -> xGrpMemDel gInfo author memId withMessages rcvMsg msgTs - XGrpLeave -> xGrpLeave gInfo author rcvMsg msgTs - XGrpDel -> xGrpDel gInfo author rcvMsg msgTs - XGrpInfo p' -> xGrpInfo gInfo author p' rcvMsg msgTs - XGrpPrefs ps' -> xGrpPrefs gInfo author ps' + XMsgFileDescr sharedMsgId fileDescr -> void $ groupMessageFileDescription gInfo author sharedMsgId fileDescr + XMsgUpdate sharedMsgId mContent mentions ttl live msgScope -> void $ memberCanSend author msgScope $ groupMessageUpdate gInfo author sharedMsgId mContent mentions msgScope rcvMsg msgTs ttl live + XMsgDel sharedMsgId memId scope_ -> void $ groupMessageDelete gInfo author sharedMsgId memId scope_ rcvMsg msgTs + XMsgReact sharedMsgId (Just memId) scope_ reaction add -> void $ groupMsgReaction gInfo author sharedMsgId memId scope_ reaction add rcvMsg msgTs + XFileCancel sharedMsgId -> void $ xFileCancelGroup gInfo author sharedMsgId + XInfo p -> void $ xInfoMember gInfo author p msgTs + XGrpMemNew memInfo msgScope -> void $ xGrpMemNew gInfo author memInfo msgScope rcvMsg msgTs + XGrpMemRole memId memRole -> void $ xGrpMemRole gInfo author memId memRole rcvMsg msgTs + XGrpMemDel memId withMessages -> void $ xGrpMemDel gInfo author memId withMessages rcvMsg msgTs + XGrpLeave -> void $ xGrpLeave gInfo author rcvMsg msgTs + XGrpDel -> void $ xGrpDel gInfo author rcvMsg msgTs + XGrpInfo p' -> void $ xGrpInfo gInfo author p' rcvMsg msgTs + XGrpPrefs ps' -> void $ xGrpPrefs gInfo author ps' _ -> messageError $ "x.grp.msg.forward: unsupported forwarded event " <> T.pack (show $ toCMEventTag event) createUnknownMember :: GroupInfo -> MemberId -> CM GroupMember diff --git a/src/Simplex/Chat/Messages.hs b/src/Simplex/Chat/Messages.hs index c4442a5e8e..24a2d11dc8 100644 --- a/src/Simplex/Chat/Messages.hs +++ b/src/Simplex/Chat/Messages.hs @@ -128,6 +128,24 @@ toMsgScope :: GroupInfo -> GroupChatScopeInfo -> MsgScope toMsgScope GroupInfo {membership} = \case GCSIMemberSupport {groupMember_} -> MSMember $ memberId' $ fromMaybe membership groupMember_ +data GroupForwardScope + = GFSAll -- message should be forwarded to all group members, even pending (e.g. XGrpDel, XGrpInfo) + | GFSMain -- message should be forwarded to current group members only (e.g. regular messages in group) + | GFSMemberSupport GroupMemberId + deriving (Eq, Ord, Show) + +toGroupForwardScope :: GroupInfo -> Maybe GroupChatScopeInfo -> GroupForwardScope +toGroupForwardScope GroupInfo {membership} = \case + Nothing -> GFSMain + Just GCSIMemberSupport {groupMember_} -> GFSMemberSupport $ groupMemberId' $ fromMaybe membership groupMember_ + +memberEventForwardScope :: GroupMember -> Maybe GroupForwardScope +memberEventForwardScope m@GroupMember {memberRole, memberStatus} + | memberStatus == GSMemPendingApproval = Nothing + | memberStatus == GSMemPendingReview = Just $ GFSMemberSupport $ groupMemberId' m + | memberRole >= GRModerator = Just GFSAll + | otherwise = Just GFSMain + chatInfoToRef :: ChatInfo c -> ChatRef chatInfoToRef = \case DirectChat Contact {contactId} -> ChatRef CTDirect contactId Nothing diff --git a/src/Simplex/Chat/Protocol.hs b/src/Simplex/Chat/Protocol.hs index 1fad623967..84d5cc8c3d 100644 --- a/src/Simplex/Chat/Protocol.hs +++ b/src/Simplex/Chat/Protocol.hs @@ -317,9 +317,9 @@ data ChatMsgEvent (e :: MsgEncoding) where XMsgNew :: MsgContainer -> ChatMsgEvent 'Json XMsgFileDescr :: {msgId :: SharedMsgId, fileDescr :: FileDescr} -> ChatMsgEvent 'Json XMsgUpdate :: {msgId :: SharedMsgId, content :: MsgContent, mentions :: Map MemberName MsgMention, ttl :: Maybe Int, live :: Maybe Bool, scope :: Maybe MsgScope} -> ChatMsgEvent 'Json - XMsgDel :: SharedMsgId -> Maybe MemberId -> ChatMsgEvent 'Json + XMsgDel :: {msgId :: SharedMsgId, memberId :: Maybe MemberId, scope :: Maybe MsgScope} -> ChatMsgEvent 'Json XMsgDeleted :: ChatMsgEvent 'Json - XMsgReact :: {msgId :: SharedMsgId, memberId :: Maybe MemberId, reaction :: MsgReaction, add :: Bool} -> ChatMsgEvent 'Json + XMsgReact :: {msgId :: SharedMsgId, memberId :: Maybe MemberId, scope :: Maybe MsgScope, reaction :: MsgReaction, add :: Bool} -> ChatMsgEvent 'Json XFile :: FileInvitation -> ChatMsgEvent 'Json -- TODO discontinue XFileAcpt :: String -> ChatMsgEvent 'Json -- direct file protocol XFileAcptInv :: SharedMsgId -> Maybe ConnReqInvitation -> String -> ChatMsgEvent 'Json @@ -369,6 +369,8 @@ data AChatMsgEvent = forall e. MsgEncodingI e => ACME (SMsgEncoding e) (ChatMsgE deriving instance Show AChatMsgEvent +-- when sending, used for deciding whether message will be forwarded by host or not (memberSendAction); +-- actual filtering on forwarding is done in processEvent isForwardedGroupMsg :: ChatMsgEvent e -> Bool isForwardedGroupMsg ev = case ev of XMsgNew mc -> case mcExtMsgContent mc of @@ -376,7 +378,7 @@ isForwardedGroupMsg ev = case ev of _ -> True XMsgFileDescr _ _ -> True XMsgUpdate {} -> True - XMsgDel _ _ -> True + XMsgDel {} -> True XMsgReact {} -> True XFileCancel _ -> True XInfo _ -> True @@ -390,12 +392,7 @@ isForwardedGroupMsg ev = case ev of XGrpPrefs _ -> True _ -> False -forwardedGroupMsg :: forall e. MsgEncodingI e => ChatMessage e -> Maybe (ChatMessage 'Json) -forwardedGroupMsg msg@ChatMessage {chatMsgEvent} = case encoding @e of - SJson | isForwardedGroupMsg chatMsgEvent -> Just msg - _ -> Nothing - --- applied after checking forwardedGroupMsg and building list of group members to forward to, see Chat; +-- applied after building list of messages to forward and building list of group members to forward to, see Chat; -- -- this filters out members if any of forwarded events in batch is an XGrpMemRestrict event referring to them, -- but practically XGrpMemRestrict is not batched with other events so it wouldn't prevent forwarding of other events @@ -403,27 +400,23 @@ forwardedGroupMsg msg@ChatMessage {chatMsgEvent} = case encoding @e of -- -- same for reports (MCReport) - they are not batched with other events, so we can safely filter out -- members with role less than moderator when forwarding -forwardedToGroupMembers :: forall e. MsgEncodingI e => [GroupMember] -> NonEmpty (ChatMessage e) -> [GroupMember] -forwardedToGroupMembers ms forwardedMsgs = - filter forwardToMember ms +msgsForwardedToMember :: NonEmpty (ChatMessage 'Json) -> GroupMember -> Bool +msgsForwardedToMember fwdMsgs GroupMember {memberId, memberRole} = + (memberId `notElem` restrictMemberIds) && (not hasReport || memberRole >= GRModerator) where - forwardToMember GroupMember {memberId, memberRole} = - (memberId `notElem` restrictMemberIds) - && (not hasReport || memberRole >= GRModerator) - restrictMemberIds = mapMaybe restrictMemberId $ L.toList forwardedMsgs - restrictMemberId ChatMessage {chatMsgEvent} = case encoding @e of - SJson -> case chatMsgEvent of + restrictMemberIds = mapMaybe restrictMemberId $ L.toList fwdMsgs + restrictMemberId :: ChatMessage 'Json -> Maybe MemberId + restrictMemberId ChatMessage {chatMsgEvent} = + case chatMsgEvent of XGrpMemRestrict mId _ -> Just mId _ -> Nothing - _ -> Nothing - hasReport = any isReportEvent forwardedMsgs - isReportEvent ChatMessage {chatMsgEvent} = case encoding @e of - SJson -> case chatMsgEvent of + hasReport = any isReportEvent fwdMsgs + isReportEvent ChatMessage {chatMsgEvent} = + case chatMsgEvent of XMsgNew mc -> case mcExtMsgContent mc of ExtMsgContent {content = MCReport {}} -> True _ -> False _ -> False - _ -> False data MsgReaction = MREmoji {emoji :: MREmojiChar} | MRUnknown {tag :: Text, json :: J.Object} deriving (Eq, Show) @@ -1105,9 +1098,9 @@ appJsonToCM AppMessageJson {v, msgId, event, params} = do live <- opt "live" scope <- opt "scope" pure XMsgUpdate {msgId = msgId', content, mentions, ttl, live, scope} - XMsgDel_ -> XMsgDel <$> p "msgId" <*> opt "memberId" + XMsgDel_ -> XMsgDel <$> p "msgId" <*> opt "memberId" <*> opt "scope" XMsgDeleted_ -> pure XMsgDeleted - XMsgReact_ -> XMsgReact <$> p "msgId" <*> opt "memberId" <*> p "reaction" <*> p "add" + XMsgReact_ -> XMsgReact <$> p "msgId" <*> opt "memberId" <*> opt "scope" <*> p "reaction" <*> p "add" XFile_ -> XFile <$> p "file" XFileAcpt_ -> XFileAcpt <$> p "fileName" XFileAcptInv_ -> XFileAcptInv <$> p "msgId" <*> opt "fileConnReq" <*> p "fileName" @@ -1176,9 +1169,9 @@ chatToAppMessage ChatMessage {chatVRange, msgId, chatMsgEvent} = case encoding @ XMsgNew container -> msgContainerJSON container XMsgFileDescr msgId' fileDescr -> o ["msgId" .= msgId', "fileDescr" .= fileDescr] XMsgUpdate {msgId = msgId', content, mentions, ttl, live, scope} -> o $ ("ttl" .=? ttl) $ ("live" .=? live) $ ("scope" .=? scope) $ ("mentions" .=? nonEmptyMap mentions) ["msgId" .= msgId', "content" .= content] - XMsgDel msgId' memberId -> o $ ("memberId" .=? memberId) ["msgId" .= msgId'] + XMsgDel msgId' memberId scope -> o $ ("memberId" .=? memberId) $ ("scope" .=? scope) ["msgId" .= msgId'] XMsgDeleted -> JM.empty - XMsgReact msgId' memberId reaction add -> o $ ("memberId" .=? memberId) ["msgId" .= msgId', "reaction" .= reaction, "add" .= add] + XMsgReact msgId' memberId scope reaction add -> o $ ("memberId" .=? memberId) $ ("scope" .=? scope) ["msgId" .= msgId', "reaction" .= reaction, "add" .= add] XFile fileInv -> o ["file" .= fileInv] XFileAcpt fileName -> o ["fileName" .= fileName] XFileAcptInv sharedMsgId fileConnReq fileName -> o $ ("fileConnReq" .=? fileConnReq) ["msgId" .= sharedMsgId, "fileName" .= fileName] diff --git a/src/Simplex/Chat/Store/Groups.hs b/src/Simplex/Chat/Store/Groups.hs index c2c6d9798d..4b1b72ff9d 100644 --- a/src/Simplex/Chat/Store/Groups.hs +++ b/src/Simplex/Chat/Store/Groups.hs @@ -60,6 +60,8 @@ module Simplex.Chat.Store.Groups getMentionedMemberByMemberId, getGroupMemberById, getGroupMemberByMemberId, + getGroupMemberIdViaMemberId, + getScopeMemberIdViaMemberId, getGroupMembers, getGroupModerators, getGroupMembersForExpiration, @@ -103,7 +105,10 @@ module Simplex.Chat.Store.Groups getIntroduction, getIntroducedGroupMemberIds, getForwardIntroducedMembers, + getForwardIntroducedModerators, getForwardInvitedMembers, + getForwardInvitedModerators, + getForwardScopeMember, createIntroReMember, createIntroToMemberContact, saveMemberInvitation, @@ -182,7 +187,7 @@ import qualified Simplex.Messaging.Crypto as C import Simplex.Messaging.Crypto.Ratchet (pattern PQEncOff, pattern PQSupportOff) import Simplex.Messaging.Parsers (defaultJSON) import Simplex.Messaging.Protocol (SubscriptionMode (..)) -import Simplex.Messaging.Util (eitherToMaybe, firstRow', ($>>=), (<$$>)) +import Simplex.Messaging.Util (eitherToMaybe, firstRow', ($>>), ($>>=), (<$$>)) import Simplex.Messaging.Version import UnliftIO.STM #if defined(dbPostgres) @@ -1091,6 +1096,20 @@ getGroupMemberByMemberId db vr user@User {userId} GroupInfo {groupId} memberId = (groupMemberQuery <> " WHERE m.group_id = ? AND m.member_id = ?") (userId, groupId, memberId) +getScopeMemberIdViaMemberId :: DB.Connection -> User -> GroupInfo -> GroupMember -> MemberId -> ExceptT StoreError IO GroupMemberId +getScopeMemberIdViaMemberId db user g@GroupInfo {membership} sender scopeMemberId + | scopeMemberId == memberId' membership = pure $ groupMemberId' membership + | scopeMemberId == memberId' sender = pure $ groupMemberId' sender + | otherwise = getGroupMemberIdViaMemberId db user g scopeMemberId + +getGroupMemberIdViaMemberId :: DB.Connection -> User -> GroupInfo -> MemberId -> ExceptT StoreError IO GroupMemberId +getGroupMemberIdViaMemberId db User {userId} GroupInfo {groupId} memberId = + ExceptT . firstRow fromOnly (SEGroupMemberNotFoundByMemberId memberId) $ + DB.query + db + "SELECT group_member_id FROM group_members WHERE user_id = ? AND group_id = ? AND member_id = ?" + (userId, groupId, memberId) + getGroupMembers :: DB.Connection -> VersionRangeChat -> User -> GroupInfo -> IO [GroupMember] getGroupMembers db vr user@User {userId, userContactId} GroupInfo {groupId} = do map (toContactMember vr user) @@ -1727,6 +1746,26 @@ getForwardIntroducedMembers db vr user invitee highlyAvailable = do WHERE to_group_member_id = ? AND intro_status NOT IN (?,?,?) |] +-- for support scope we don't need to filter by intro_chat_protocol_version for non highly available client, +-- as we will filter moderators supporting this feature by a higher version (as opposed to getForwardIntroducedMembers) +getForwardIntroducedModerators :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> IO [GroupMember] +getForwardIntroducedModerators db vr user@User {userContactId} invitee = do + memberIds <- map fromOnly <$> query + rights <$> mapM (runExceptT . getGroupMemberById db vr user) memberIds + where + mId = groupMemberId' invitee + query = + DB.query + db + [sql| + SELECT i.re_group_member_id + FROM group_member_intros i + JOIN group_members m ON m.group_member_id = i.re_group_member_id + WHERE i.to_group_member_id = ? AND i.intro_status NOT IN (?,?,?) + AND (m.contact_id IS NULL OR m.contact_id != ?) AND m.member_role IN (?,?,?) + |] + (mId, GMIntroReConnected, GMIntroToConnected, GMIntroConnected, userContactId, GRModerator, GRAdmin, GROwner) + getForwardInvitedMembers :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> Bool -> IO [GroupMember] getForwardInvitedMembers db vr user forwardMember highlyAvailable = do memberIds <- map fromOnly <$> query @@ -1747,6 +1786,46 @@ getForwardInvitedMembers db vr user forwardMember highlyAvailable = do WHERE re_group_member_id = ? AND intro_status NOT IN (?,?,?) |] +-- for support scope we don't need to filter by intro_chat_protocol_version for non highly available client, +-- as we will filter moderators supporting this feature by a higher version (as opposed to getForwardInvitedMembers) +getForwardInvitedModerators :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> IO [GroupMember] +getForwardInvitedModerators db vr user@User {userContactId} forwardMember = do + memberIds <- map fromOnly <$> query + rights <$> mapM (runExceptT . getGroupMemberById db vr user) memberIds + where + mId = groupMemberId' forwardMember + query = + DB.query + db + [sql| + SELECT i.to_group_member_id + FROM group_member_intros i + JOIN group_members m ON m.group_member_id = i.to_group_member_id + WHERE i.re_group_member_id = ? AND i.intro_status NOT IN (?,?,?) + AND (m.contact_id IS NULL OR m.contact_id != ?) AND m.member_role IN (?,?,?) + |] + (mId, GMIntroReConnected, GMIntroToConnected, GMIntroConnected, userContactId, GRModerator, GRAdmin, GROwner) + +getForwardScopeMember :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> GroupMemberId -> IO (Maybe GroupMember) +getForwardScopeMember db vr user GroupMember {groupMemberId = sendingGMId} scopeGMId = do + (introExists_ :: Maybe Int64) <- + liftIO $ maybeFirstRow fromOnly $ + DB.query + db + [sql| + SELECT 1 + FROM group_member_intros + WHERE + ( + (re_group_member_id = ? AND to_group_member_id = ?) OR + (re_group_member_id = ? AND to_group_member_id = ?) + ) + AND intro_status NOT IN (?,?,?) + LIMIT 1 + |] + (sendingGMId, scopeGMId, scopeGMId, sendingGMId, GMIntroReConnected, GMIntroToConnected, GMIntroConnected) + pure introExists_ $>> (eitherToMaybe <$> runExceptT (getGroupMemberById db vr user scopeGMId)) + createIntroReMember :: DB.Connection -> User -> GroupInfo -> GroupMember -> VersionChat -> MemberInfo -> Maybe MemberRestrictions -> (CommandId, ConnId) -> SubscriptionMode -> ExceptT StoreError IO GroupMember createIntroReMember db diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index 7454285725..7ff8ce0ece 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -1041,6 +1041,24 @@ SEARCH g USING INTEGER PRIMARY KEY (rowid=?) SEARCH gp USING INTEGER PRIMARY KEY (rowid=?) SEARCH pu USING INTEGER PRIMARY KEY (rowid=?) +Query: + SELECT 1 + FROM group_member_intros + WHERE + ( + (re_group_member_id = ? AND to_group_member_id = ?) OR + (re_group_member_id = ? AND to_group_member_id = ?) + ) + AND intro_status NOT IN (?,?,?) + LIMIT 1 + +Plan: +MULTI-INDEX OR +INDEX 1 +SEARCH group_member_intros USING INDEX sqlite_autoindex_group_member_intros_1 (re_group_member_id=? AND to_group_member_id=?) +INDEX 2 +SEARCH group_member_intros USING INDEX sqlite_autoindex_group_member_intros_1 (re_group_member_id=? AND to_group_member_id=?) + Query: SELECT 1 FROM users WHERE (user_id = ? AND local_display_name = ?) @@ -1334,6 +1352,28 @@ Plan: SEARCH g USING INTEGER PRIMARY KEY (rowid=?) SEARCH i USING INTEGER PRIMARY KEY (rowid=?) +Query: + SELECT i.re_group_member_id + FROM group_member_intros i + JOIN group_members m ON m.group_member_id = i.re_group_member_id + WHERE i.to_group_member_id = ? AND i.intro_status NOT IN (?,?,?) + AND (m.contact_id IS NULL OR m.contact_id != ?) AND m.member_role IN (?,?,?) + +Plan: +SEARCH i USING INDEX idx_group_member_intros_to_group_member_id (to_group_member_id=?) +SEARCH m USING INTEGER PRIMARY KEY (rowid=?) + +Query: + SELECT i.to_group_member_id + FROM group_member_intros i + JOIN group_members m ON m.group_member_id = i.to_group_member_id + WHERE i.re_group_member_id = ? AND i.intro_status NOT IN (?,?,?) + AND (m.contact_id IS NULL OR m.contact_id != ?) AND m.member_role IN (?,?,?) + +Plan: +SEARCH i USING INDEX idx_group_member_intros_re_group_member_id (re_group_member_id=?) +SEARCH m USING INTEGER PRIMARY KEY (rowid=?) + Query: SELECT member_status FROM group_members @@ -3565,6 +3605,15 @@ Query: Plan: SEARCH chat_items USING INTEGER PRIMARY KEY (rowid=?) +Query: + UPDATE connections SET conn_status='deleted' + WHERE group_member_id IN (SELECT group_member_id FROM group_members WHERE local_display_name = ?) + +Plan: +SEARCH connections USING INDEX idx_connections_group_member_id (group_member_id=?) +LIST SUBQUERY 1 +SCAN group_members USING COVERING INDEX idx_group_members_user_id_local_display_name + Query: UPDATE group_member_intros SET intro_status = ?, @@ -3576,6 +3625,18 @@ Query: Plan: SEARCH group_member_intros USING INTEGER PRIMARY KEY (rowid=?) +Query: + UPDATE group_member_intros SET intro_status='fwd' + WHERE re_group_member_id IN (SELECT group_member_id FROM group_members WHERE local_display_name = ?) + AND to_group_member_id IN (SELECT group_member_id FROM group_members WHERE local_display_name = ?) + +Plan: +SEARCH group_member_intros USING INDEX sqlite_autoindex_group_member_intros_1 (re_group_member_id=? AND to_group_member_id=?) +LIST SUBQUERY 1 +SCAN group_members USING COVERING INDEX idx_group_members_user_id_local_display_name +LIST SUBQUERY 2 +SCAN group_members USING COVERING INDEX idx_group_members_user_id_local_display_name + Query: UPDATE group_members SET contact_id = ?, local_display_name = ?, contact_profile_id = ?, updated_at = ? @@ -5997,10 +6058,6 @@ Query: UPDATE connections SET conn_status = ?, updated_at = ?, conn_req_inv = NU Plan: SEARCH connections USING INTEGER PRIMARY KEY (rowid=?) -Query: UPDATE connections SET conn_status='deleted' WHERE group_member_id = 3 -Plan: -SEARCH connections USING INDEX idx_connections_group_member_id (group_member_id=?) - Query: UPDATE connections SET conn_type = ?, group_member_id = ?, updated_at = ? WHERE connection_id = ? Plan: SEARCH connections USING INTEGER PRIMARY KEY (rowid=?) diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index 56dd863b2d..23837ad597 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -3,6 +3,7 @@ {-# LANGUAGE NumericUnderscores #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PostfixOperators #-} +{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# OPTIONS_GHC -fno-warn-ambiguous-fields #-} @@ -37,8 +38,10 @@ import Simplex.Messaging.Version import Test.Hspec hiding (it) #if defined(dbPostgres) import Database.PostgreSQL.Simple (Only (..)) +import Database.PostgreSQL.Simple.SqlQQ (sql) #else import Database.SQLite.Simple (Only (..)) +import Database.SQLite.Simple.QQ (sql) import Simplex.Chat.Options.DB import System.Directory (copyFile) import System.FilePath (()) @@ -198,6 +201,13 @@ chatGroupTests = do describe "group scoped messages" $ do it "should send scoped messages to support (single moderator)" testScopedSupportSingleModerator it "should send scoped messages to support (many moderators)" testScopedSupportManyModerators + it "should forward messages inside support scope" testScopedSupportForward + it "should forward messages inside support scope while member is in review" testScopedSupportForwardWhileReview + it "should not forward messages from support to main scope" testScopedSupportDontForward + -- TODO test messages are not forwarded between support scopes (1 in review, 1 not? combinations?) + it "should forward file inside support scope" testScopedSupportForwardFile + -- TODO test files are forwarded inside support scope while member is in review + -- TODO test group events directed to all (e.g. XGrpInfo) are forwarded to support scope member while in review it "should send messages to admins and members" testSupportCLISendCommand it "should correctly maintain unread stats for support chats on reading chat items" testScopedSupportUnreadStatsOnRead it "should correctly maintain unread stats for support chats on deleting chat items" testScopedSupportUnreadStatsOnDelete @@ -4565,7 +4575,8 @@ testGroupMsgForward :: HasCallStack => TestParams -> IO () testGroupMsgForward = testChat3 aliceProfile bobProfile cathProfile $ \alice bob cath -> do - setupGroupForwarding3 "team" alice bob cath + createGroup3 "team" alice bob cath + setupGroupForwarding alice bob cath bob #> "#team hi there" alice <# "#team bob> hi there" @@ -4593,7 +4604,8 @@ testGroupMsgForwardReport :: HasCallStack => TestParams -> IO () testGroupMsgForwardReport = testChat3 aliceProfile bobProfile cathProfile $ \alice bob cath -> do - setupGroupForwarding3 "team" alice bob cath + createGroup3 "team" alice bob cath + setupGroupForwarding alice bob cath bob #> "#team hi there" alice <# "#team bob> hi there" @@ -4647,17 +4659,39 @@ testGroupMsgForwardReport = alice <# "#team cath> hey team" bob <# "#team cath> hey team [>>]" -setupGroupForwarding3 :: String -> TestCC -> TestCC -> TestCC -> IO () -setupGroupForwarding3 gName alice bob cath = do - createGroup3 gName alice bob cath - +setupGroupForwarding :: TestCC -> TestCC -> TestCC -> IO () +setupGroupForwarding host invitee1 invitee2 = do threadDelay 1000000 -- delay so intro_status doesn't get overwritten to connected - void $ withCCTransaction bob $ \db -> - DB.execute_ db "UPDATE connections SET conn_status='deleted' WHERE group_member_id = 3" - void $ withCCTransaction cath $ \db -> - DB.execute_ db "UPDATE connections SET conn_status='deleted' WHERE group_member_id = 3" - void $ withCCTransaction alice $ \db -> - DB.execute_ db "UPDATE group_member_intros SET intro_status='fwd'" + + invitee1Name <- userName invitee1 + invitee2Name <- userName invitee2 + + -- set up test: break connections between invitee1 and invitee2 to enable group forwarding + void $ withCCTransaction invitee1 $ \db -> + DB.execute + db + [sql| + UPDATE connections SET conn_status='deleted' + WHERE group_member_id IN (SELECT group_member_id FROM group_members WHERE local_display_name = ?) + |] + (Only invitee2Name) + void $ withCCTransaction invitee2 $ \db -> + DB.execute + db + [sql| + UPDATE connections SET conn_status='deleted' + WHERE group_member_id IN (SELECT group_member_id FROM group_members WHERE local_display_name = ?) + |] + (Only invitee1Name) + void $ withCCTransaction host $ \db -> + DB.execute + db + [sql| + UPDATE group_member_intros SET intro_status='fwd' + WHERE re_group_member_id IN (SELECT group_member_id FROM group_members WHERE local_display_name = ?) + AND to_group_member_id IN (SELECT group_member_id FROM group_members WHERE local_display_name = ?) + |] + (invitee1Name, invitee2Name) testGroupMsgForwardDeduplicate :: HasCallStack => TestParams -> IO () testGroupMsgForwardDeduplicate = @@ -4700,7 +4734,8 @@ testGroupMsgForwardEdit :: HasCallStack => TestParams -> IO () testGroupMsgForwardEdit = testChat3 aliceProfile bobProfile cathProfile $ \alice bob cath -> do - setupGroupForwarding3 "team" alice bob cath + createGroup3 "team" alice bob cath + setupGroupForwarding alice bob cath bob #> "#team hi there" alice <# "#team bob> hi there" @@ -4723,7 +4758,8 @@ testGroupMsgForwardReaction :: HasCallStack => TestParams -> IO () testGroupMsgForwardReaction = testChat3 aliceProfile bobProfile cathProfile $ \alice bob cath -> do - setupGroupForwarding3 "team" alice bob cath + createGroup3 "team" alice bob cath + setupGroupForwarding alice bob cath bob #> "#team hi there" alice <# "#team bob> hi there" @@ -4740,7 +4776,8 @@ testGroupMsgForwardDeletion :: HasCallStack => TestParams -> IO () testGroupMsgForwardDeletion = testChat3 aliceProfile bobProfile cathProfile $ \alice bob cath -> do - setupGroupForwarding3 "team" alice bob cath + createGroup3 "team" alice bob cath + setupGroupForwarding alice bob cath -- disableFullDeletion3 "team" alice bob cath bob #> "#team hi there" @@ -4756,7 +4793,8 @@ testGroupMsgForwardFile :: HasCallStack => TestParams -> IO () testGroupMsgForwardFile = testChat3 aliceProfile bobProfile cathProfile $ \alice bob cath -> withXFTPServer $ do - setupGroupForwarding3 "team" alice bob cath + createGroup3 "team" alice bob cath + setupGroupForwarding alice bob cath bob #> "/f #team ./tests/fixtures/test.jpg" bob <## "use /fc 1 to cancel sending" @@ -4781,7 +4819,8 @@ testGroupMsgForwardChangeRole :: HasCallStack => TestParams -> IO () testGroupMsgForwardChangeRole = testChat3 aliceProfile bobProfile cathProfile $ \alice bob cath -> do - setupGroupForwarding3 "team" alice bob cath + createGroup3 "team" alice bob cath + setupGroupForwarding alice bob cath cath ##> "/mr #team bob member" cath <## "#team: you changed the role of bob to member" @@ -4792,7 +4831,8 @@ testGroupMsgForwardNewMember :: HasCallStack => TestParams -> IO () testGroupMsgForwardNewMember = testChat4 aliceProfile bobProfile cathProfile danProfile $ \alice bob cath dan -> do - setupGroupForwarding3 "team" alice bob cath + createGroup3 "team" alice bob cath + setupGroupForwarding alice bob cath connectUsers cath dan cath ##> "/a #team dan" @@ -4833,7 +4873,8 @@ testGroupMsgForwardLeave :: HasCallStack => TestParams -> IO () testGroupMsgForwardLeave = testChat3 aliceProfile bobProfile cathProfile $ \alice bob cath -> do - setupGroupForwarding3 "team" alice bob cath + createGroup3 "team" alice bob cath + setupGroupForwarding alice bob cath bob ##> "/leave #team" bob <## "#team: you left the group" @@ -7015,6 +7056,145 @@ testScopedSupportManyModerators = cath ##> "/member support chats #team" cath <## "bob (Bob) (id 3): unread: 0, require attention: 0, mentions: 0" +testScopedSupportForward :: HasCallStack => TestParams -> IO () +testScopedSupportForward = + testChat4 aliceProfile bobProfile cathProfile danProfile $ \alice bob cath dan -> do + createGroup4 "team" alice (bob, GRMember) (cath, GRMember) (dan, GRModerator) + setupGroupForwarding alice bob dan + + -- messages are forwarded in main scope + bob #> "#team 1" + [alice, cath] *<# "#team bob> 1" + dan <# "#team bob> 1 [>>]" + + dan #> "#team 2" + [alice, cath] *<# "#team dan> 2" + bob <# "#team dan> 2 [>>]" + + -- messages are forwarded inside support scope + bob #> "#team (support) 3" + alice <# "#team (support: bob) bob> 3" + dan <# "#team (support: bob) bob> 3 [>>]" + + dan #> "#team (support: bob) 4" + alice <# "#team (support: bob) dan> 4" + bob <# "#team (support) dan> 4 [>>]" + +testScopedSupportForwardWhileReview :: HasCallStack => TestParams -> IO () +testScopedSupportForwardWhileReview = + testChat5 aliceProfile bobProfile cathProfile danProfile eveProfile $ + \alice bob cath dan eve -> do + createGroup4 "team" alice (bob, GRMember) (cath, GRModerator) (dan, GRModerator) + + alice ##> "/set admission review #team all" + alice <## "changed member admission rules" + concurrentlyN_ + [ do + bob <## "alice updated group #team:" + bob <## "changed member admission rules", + do + cath <## "alice updated group #team:" + cath <## "changed member admission rules", + do + dan <## "alice updated group #team:" + dan <## "changed member admission rules" + ] + + alice ##> "/create link #team" + gLink <- getGroupLink alice "team" GRMember True + eve ##> ("/c " <> gLink) + eve <## "connection request sent!" + alice <## "eve (Eve): accepting request to join group #team..." + concurrentlyN_ + [ alice <## "#team: eve connected and pending review", + eve + <### [ "#team: alice accepted you to the group, pending review", + "#team: joining the group...", + "#team: you joined the group, connecting to group moderators for admission to group", + "#team: member cath (Catherine) is connected", + "#team: member dan (Daniel) is connected" + ], + do + cath <## "#team: alice added eve (Eve) to the group (connecting and pending review...), use /_accept member #1 5 to accept member" + cath <## "#team: new member eve is connected and pending review, use /_accept member #1 5 to accept member", + do + dan <## "#team: alice added eve (Eve) to the group (connecting and pending review...), use /_accept member #1 5 to accept member" + dan <## "#team: new member eve is connected and pending review, use /_accept member #1 5 to accept member" + ] + + setupGroupForwarding alice cath eve + + -- message from cath is not forwarded to eve in group scope + bob #> "#team 1" + [alice, cath, dan] *<# "#team bob> 1" + + -- message from cath is not forwarded to eve in group scope + cath #> "#team 2" + [alice, bob, dan] *<# "#team cath> 2" + + -- messages are forwarded in support scope + eve #> "#team (support) 3" + [alice, dan] *<# "#team (support: eve) eve> 3" + cath <# "#team (support: eve) eve> 3 [>>]" + + cath #> "#team (support: eve) 4" + [alice, dan] *<# "#team (support: eve) cath> 4" + eve <# "#team (support) cath> 4 [>>]" + +testScopedSupportDontForward :: HasCallStack => TestParams -> IO () +testScopedSupportDontForward = + testChat4 aliceProfile bobProfile cathProfile danProfile $ \alice bob cath dan -> do + createGroup4 "team" alice (bob, GRMember) (cath, GRMember) (dan, GRModerator) + setupGroupForwarding alice bob cath + + -- messages are forwarded in main scope + bob #> "#team 1" + [alice, dan] *<# "#team bob> 1" + cath <# "#team bob> 1 [>>]" + + cath #> "#team 2" + [alice, dan] *<# "#team cath> 2" + bob <# "#team cath> 2 [>>]" + + -- messages are not forwarded from support to main scope + bob #> "#team (support) 3" + [alice, dan] *<# "#team (support: bob) bob> 3" + + cath #> "#team (support) 4" + [alice, dan] *<# "#team (support: cath) cath> 4" + +testScopedSupportForwardFile :: HasCallStack => TestParams -> IO () +testScopedSupportForwardFile = + testChat4 aliceProfile bobProfile cathProfile danProfile $ \alice bob cath dan -> withXFTPServer $ do + createGroup4 "team" alice (bob, GRMember) (cath, GRMember) (dan, GRModerator) + setupGroupForwarding alice bob dan + + -- files are forwarded inside support scope + bob ##> "/_send #1(_support) json [{\"filePath\": \"./tests/fixtures/test.jpg\", \"msgContent\": {\"type\": \"text\", \"text\": \"hi, sending a file\"}}]" + bob <# "#team (support) hi, sending a file" + bob <# "/f #team (support) ./tests/fixtures/test.jpg" + bob <## "use /fc 1 to cancel sending" + + concurrentlyN_ + [ do + alice <# "#team (support: bob) bob> hi, sending a file" + alice <# "#team (support: bob) bob> sends file test.jpg (136.5 KiB / 139737 bytes)" + alice <## "use /fr 1 [/ | ] to receive it", + do + dan <# "#team (support: bob) bob> hi, sending a file [>>]" + dan <# "#team (support: bob) bob> sends file test.jpg (136.5 KiB / 139737 bytes) [>>]" + dan <## "use /fr 1 [/ | ] to receive it [>>]" + ] + + bob <## "completed uploading file 1 (test.jpg) for #team" + + dan ##> "/fr 1 ./tests/tmp" + dan + <### [ "saving file 1 from bob to ./tests/tmp/test.jpg", + "started receiving file 1 (test.jpg) from bob" + ] + dan <## "completed receiving file 1 (test.jpg) from bob" + testSupportCLISendCommand :: HasCallStack => TestParams -> IO () testSupportCLISendCommand = testChat2 aliceProfile bobProfile $ \alice bob -> do diff --git a/tests/ProtocolTests.hs b/tests/ProtocolTests.hs index 8e0c937358..b42c838c8a 100644 --- a/tests/ProtocolTests.hs +++ b/tests/ProtocolTests.hs @@ -196,7 +196,7 @@ decodeChatMessageTest = describe "Chat message encoding/decoding" $ do #==# XMsgUpdate (SharedMsgId "\1\2\3\4") (MCText "hello") [] Nothing Nothing Nothing it "x.msg.del" $ "{\"v\":\"1\",\"event\":\"x.msg.del\",\"params\":{\"msgId\":\"AQIDBA==\"}}" - #==# XMsgDel (SharedMsgId "\1\2\3\4") Nothing + #==# XMsgDel (SharedMsgId "\1\2\3\4") Nothing Nothing it "x.msg.deleted" $ "{\"v\":\"1\",\"event\":\"x.msg.deleted\",\"params\":{}}" #==# XMsgDeleted From 362bdc32826dd4001c60e9f0cedbc98ebfc921d4 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Sat, 12 Jul 2025 19:46:34 +0100 Subject: [PATCH 17/18] core: update contact cards --- src/Simplex/Chat/Library/Internal.hs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index 625f3f0685..6d6cf33b96 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -2502,9 +2502,9 @@ adminContactReq = simplexTeamContactProfile :: Profile simplexTeamContactProfile = Profile - { displayName = "SimpleX Chat team", + { displayName = "Ask SimpleX Team", fullName = "", - shortDescr = Just "Help and support for SimpleX network users", + shortDescr = Just "Send questions about SimpleX Chat app and your suggestions", image = Just (ImageData "data:image/jpg;base64,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"), contactLink = Just $ CLFull adminContactReq, preferences = Nothing @@ -2513,9 +2513,9 @@ simplexTeamContactProfile = simplexStatusContactProfile :: Profile simplexStatusContactProfile = Profile - { displayName = "SimpleX-Status", + { displayName = "SimpleX Status", fullName = "", - shortDescr = Just "SimpleX bot for server status and release updates", + shortDescr = Just "Automatic server status and app release updates", image = Just (ImageData "data:image/jpg;base64,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"), contactLink = Just (either error CLFull $ strDecode "simplex:/contact/#/?v=1-2&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FShQuD-rPokbDvkyotKx5NwM8P3oUXHxA%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA6fSx1k9zrOmF0BJpCaTarZvnZpMTAVQhd3RkDQ35KT0%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion"), preferences = Nothing From cc32eb131b0b5be0b04b2e444ce59cb2353ed466 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Sat, 12 Jul 2025 20:13:48 +0100 Subject: [PATCH 18/18] core: 6.4.0.6 (simplexmq 6.4.0.12) --- cabal.project | 2 +- scripts/nix/sha256map.nix | 2 +- simplex-chat.cabal | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cabal.project b/cabal.project index 5ab8aeda55..2ba1eff9ee 100644 --- a/cabal.project +++ b/cabal.project @@ -12,7 +12,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: 99e59b73a32400067a8ac630ca4ad27f27bba0ef + tag: 85a7fbf5381e71e605757e399791db9d58b71a1d source-repository-package type: git diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index 1cfb937dea..0b0e810586 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."99e59b73a32400067a8ac630ca4ad27f27bba0ef" = "04cj3m5ykw0gaqhnj2i25ny8zi312zng5nlya30ia4dr2wz2n0rz"; + "https://github.com/simplex-chat/simplexmq.git"."85a7fbf5381e71e605757e399791db9d58b71a1d" = "01iax6vgm0m30j4m4brp4i8nnla484ni75g0vpf9cglrajiv0qav"; "https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38"; "https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d"; "https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 75e819a727..63e9208699 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -5,7 +5,7 @@ cabal-version: 1.12 -- see: https://github.com/sol/hpack name: simplex-chat -version: 6.4.0.5.1 +version: 6.4.0.6 category: Web, System, Services, Cryptography homepage: https://github.com/simplex-chat/simplex-chat#readme author: simplex.chat