Finish v0.7.8

This commit is contained in:
manuroe
2018-12-12 10:28:25 +01:00
56 changed files with 1787 additions and 395 deletions
+8
View File
@@ -0,0 +1,8 @@
### Pull Request Checklist
<!-- Please read CONTRIBUTING.rst before submitting your pull request -->
* [ ] Pull request is based on the develop branch
* [ ] Pull request updates [CHANGES.rst](https://github.com/vector-im/riot-ios/blob/develop/CHANGES.rst)
* [ ] Pull request includes screenshots or videos of UI changes
* [ ] Pull request includes a [sign off](https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.rst#sign-off)
+29 -16
View File
@@ -1,49 +1,62 @@
Changes in 0.7.8 (2018-12-12)
===============================================
Improvements:
* Upgrade MatrixKit version (v0.9.1).
* Replace the deprecated MXMediaManager and MXMediaLoader interfaces use (see matrix-org/matrix-ios-sdk/pull/593).
* Replace the deprecated MXKAttachment and MXKImageView interfaces use (see matrix-org/matrix-ios-kit/pull/487).
* i18n: Enable Japanese (ja)
* i18n: Enable Hungarian (hu)
Bug fix:
* Registration: reCAPTCHA does not work anymore on iOS 10 (#2119).
Changes in 0.7.7 (2018-10-31)
===============================================
Improvements:
* Upgrade MatrixKit version (v0.8.6).
* Upgrade MatrixKit version (v0.8.6).
Bug fix:
* Notifications: old notifications can reappear (#1985).
* Notifications: old notifications can reappear (#1985).
Changes in 0.7.6 (2018-10-05)
===============================================
Bug fix:
* Wrong version number.
* Wrong version number.
Changes in 0.7.5 (2018-10-05)
===============================================
Improvements:
* Upgrade MatrixKit version (v0.8.5).
* Server Quota Notices: Implement the blue banner (#1937).
* Upgrade MatrixKit version (v0.8.5).
* Server Quota Notices: Implement the blue banner (#1937).
Changes in 0.7.4 (2018-09-26)
===============================================
Improvements:
* Upgrade MatrixKit version (v0.8.4).
* Lazy loading: Enable it by default (if the homeserver supports it).
* i18n: Add Spanish (sp).
* Settings: Make advanced info copyable (#2023).
* Settings: Made cryptography info copyable, thanks to @daverPL (PR #1999).
* Room settings: Anyone can now set a room alias (#2033).
* Upgrade MatrixKit version (v0.8.4).
* Lazy loading: Enable it by default (if the homeserver supports it).
* i18n: Add Spanish (sp).
* Settings: Make advanced info copyable (#2023).
* Settings: Made cryptography info copyable, thanks to @daverPL (PR #1999).
* Room settings: Anyone can now set a room alias (#2033).
Bug fix:
* Fix missing read receipts when lazy-loading room members.
* Weird text color when selecting a message (#2046).
* Fix missing read receipts when lazy-loading room members.
* Weird text color when selecting a message (#2046).
Changes in 0.7.3 (2018-08-27)
===============================================
Improvements:
* Upgrade MatrixKit version (v0.8.3).
* Upgrade MatrixKit version (v0.8.3).
Bug fix:
* Fix input toolbar reset in RoomViewController on MXSession state change (#2006 and #2008).
* Fix user interaction disabled in master view of UISplitViewContoller when selecting a room (#2005).
* Fix input toolbar reset in RoomViewController on MXSession state change (#2006 and #2008).
* Fix user interaction disabled in master view of UISplitViewContoller when selecting a room (#2005).
Changes in 0.7.2 (2018-08-24)
===============================================
+2 -1
View File
@@ -9,7 +9,7 @@ source 'https://github.com/CocoaPods/Specs.git'
# Different flavours of pods to MatrixKit
# The current MatrixKit pod version
$matrixKitVersion = '0.8.6'
$matrixKitVersion = '0.9.1'
# The develop branch version
#$matrixKitVersion = 'develop'
@@ -65,6 +65,7 @@ end
abstract_target 'RiotPods' do
pod 'GBDeviceInfo', '~> 5.2.0'
pod 'Reusable', '~> 4.0'
# Piwik for analytics
# While https://github.com/matomo-org/matomo-sdk-ios/pull/223 is not released, use the PR branch
+33 -21
View File
@@ -42,38 +42,40 @@ PODS:
- GBDeviceInfo/Core (5.2.0)
- GZIP (1.2.2)
- HPGrowingTextView (1.1)
- libbase58 (0.1.4)
- libPhoneNumber-iOS (0.9.13)
- MatrixKit (0.8.6):
- MatrixKit (0.9.1):
- cmark (~> 0.24.1)
- DTCoreText (~> 1.6.21)
- HPGrowingTextView (~> 1.1)
- libPhoneNumber-iOS (~> 0.9.13)
- MatrixKit/Core (= 0.8.6)
- MatrixSDK (= 0.11.6)
- MatrixKit/AppExtension (0.8.6):
- MatrixKit/Core (= 0.9.1)
- MatrixSDK (= 0.12.0)
- MatrixKit/AppExtension (0.9.1):
- cmark (~> 0.24.1)
- DTCoreText (~> 1.6.21)
- DTCoreText/Extension
- HPGrowingTextView (~> 1.1)
- libPhoneNumber-iOS (~> 0.9.13)
- MatrixSDK (= 0.11.6)
- MatrixKit/Core (0.8.6):
- MatrixSDK (= 0.12.0)
- MatrixKit/Core (0.9.1):
- cmark (~> 0.24.1)
- DTCoreText (~> 1.6.21)
- HPGrowingTextView (~> 1.1)
- libPhoneNumber-iOS (~> 0.9.13)
- MatrixSDK (= 0.11.6)
- MatrixSDK (0.11.6):
- MatrixSDK/Core (= 0.11.6)
- MatrixSDK/Core (0.11.6):
- MatrixSDK (= 0.12.0)
- MatrixSDK (0.12.0):
- MatrixSDK/Core (= 0.12.0)
- MatrixSDK/Core (0.12.0):
- AFNetworking (~> 3.2.0)
- GZIP (~> 1.2.2)
- libbase58 (~> 0.1.4)
- OLMKit (~> 3.0.0)
- Realm (~> 3.11.1)
- MatrixSDK/JingleCallStack (0.11.6):
- MatrixSDK/JingleCallStack (0.12.0):
- MatrixSDK/Core
- WebRTC (= 63.11.20455)
- MatrixSDK/SwiftSupport (0.11.6):
- MatrixSDK/SwiftSupport (0.12.0):
- MatrixSDK/Core
- OLMKit (3.0.0):
- OLMKit/olmc (= 3.0.0)
@@ -83,21 +85,27 @@ PODS:
- PiwikTracker (4.4.2):
- PiwikTracker/Core (= 4.4.2)
- PiwikTracker/Core (4.4.2)
- Realm (3.11.1):
- Realm/Headers (= 3.11.1)
- Realm/Headers (3.11.1)
- Realm (3.11.2):
- Realm/Headers (= 3.11.2)
- Realm/Headers (3.11.2)
- Reusable (4.0.5):
- Reusable/Storyboard (= 4.0.5)
- Reusable/View (= 4.0.5)
- Reusable/Storyboard (4.0.5)
- Reusable/View (4.0.5)
- WebRTC (63.11.20455)
DEPENDENCIES:
- cmark
- DTCoreText
- GBDeviceInfo (~> 5.2.0)
- MatrixKit (= 0.8.6)
- MatrixKit/AppExtension (= 0.8.6)
- MatrixKit (= 0.9.1)
- MatrixKit/AppExtension (= 0.9.1)
- MatrixSDK/JingleCallStack
- MatrixSDK/SwiftSupport
- OLMKit
- PiwikTracker (from `https://github.com/manuroe/matomo-sdk-ios.git`, branch `feature/CustomVariables`)
- Reusable (~> 4.0)
SPEC REPOS:
https://github.com/cocoapods/specs.git:
@@ -108,11 +116,13 @@ SPEC REPOS:
- GBDeviceInfo
- GZIP
- HPGrowingTextView
- libbase58
- libPhoneNumber-iOS
- MatrixKit
- MatrixSDK
- OLMKit
- Realm
- Reusable
- WebRTC
EXTERNAL SOURCES:
@@ -133,14 +143,16 @@ SPEC CHECKSUMS:
GBDeviceInfo: 2c65ceb9404f9079264d4c238f5b81916fdfc5e2
GZIP: 12374d285e3b5d46cfcd480700fcfc7e16caf4f1
HPGrowingTextView: 88a716d97fb853bcb08a4a08e4727da17efc9b19
libbase58: 7c040313537b8c44b6e2d15586af8e21f7354efd
libPhoneNumber-iOS: e444379ac18bbfbdefad571da735b2cd7e096caa
MatrixKit: d9caa711e67070e5fb348d4237f6c81ea274e17a
MatrixSDK: c167aeef005954ab0c15267f00694259070182e2
MatrixKit: 84242042ce625d06f4fabc440a2df56e9188e45e
MatrixSDK: 34972f2cd8ac5e2c7f58dc9e5395c3ff8360661f
OLMKit: 88eda69110489f817d59bcb4353b7c247570aa4f
PiwikTracker: 42862c7b13028065c3dfd36b4dc38db8a5765acf
Realm: 037c5919b9ceb59d6beed5d3b031096856b119b3
Realm: 864477d028db77f7c5a0cba64a4892ad53db128a
Reusable: 188be1a54ac0691bc66e5bb24ec6eb91971b315b
WebRTC: f2a6203584745fe53532633397557876b5d71640
PODFILE CHECKSUM: dc6706b7e2aa657e688e75f5c2e4a8b9e14bd876
PODFILE CHECKSUM: 8e6ec927e33f0f90bfb6e18f4489e3e9c4fc43db
COCOAPODS: 1.6.0.beta.2
+26
View File
@@ -12,7 +12,9 @@
24EEE5A31F23A8C300B3C705 /* AvatarGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BC111E7009EC00A9B29C /* AvatarGenerator.m */; };
3233F7461F3497E2006ACA81 /* JitsiMeet.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3233F7441F3497DA006ACA81 /* JitsiMeet.framework */; };
3233F7471F3497E2006ACA81 /* JitsiMeet.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3233F7441F3497DA006ACA81 /* JitsiMeet.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
3275FD8C21A5A2C500B9C13D /* TermsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3275FD8B21A5A2C500B9C13D /* TermsView.swift */; };
3284A35120A07C210044F922 /* postMessageAPI.js in Resources */ = {isa = PBXBuildFile; fileRef = 3284A35020A07C210044F922 /* postMessageAPI.js */; };
32B1FEDB21A46F2C00637127 /* TermsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32B1FEDA21A46F2C00637127 /* TermsView.xib */; };
358DB9429359F97520545D35 /* Pods_RiotPods_RiotShareExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5856BA7A55E53C0AEAFC084 /* Pods_RiotPods_RiotShareExtension.framework */; };
89C94E649229EA68AE787E9E /* Pods_RiotPods_Riot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2510A69B4A681C1FEC36E848 /* Pods_RiotPods_Riot.framework */; };
926FA53F1F4C132000F826C2 /* MXSession+Riot.m in Sources */ = {isa = PBXBuildFile; fileRef = 926FA53E1F4C132000F826C2 /* MXSession+Riot.m */; };
@@ -385,7 +387,9 @@
3267EFB420E379FD00FF1CAA /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; fileEncoding = 4; path = Podfile; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
3267EFB520E379FD00FF1CAA /* AUTHORS.rst */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AUTHORS.rst; sourceTree = "<group>"; };
3267EFB620E379FD00FF1CAA /* README.rst */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.rst; sourceTree = "<group>"; };
3275FD8B21A5A2C500B9C13D /* TermsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsView.swift; sourceTree = "<group>"; };
3284A35020A07C210044F922 /* postMessageAPI.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = postMessageAPI.js; sourceTree = "<group>"; };
32B1FEDA21A46F2C00637127 /* TermsView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TermsView.xib; sourceTree = "<group>"; };
32BDC9A1211C2C870064AF51 /* zh_Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_Hant; path = zh_Hant.lproj/InfoPlist.strings; sourceTree = "<group>"; };
32BDC9A2211C2C870064AF51 /* zh_Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_Hant; path = zh_Hant.lproj/Localizable.strings; sourceTree = "<group>"; };
32BDC9A3211C2C870064AF51 /* zh_Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_Hant; path = zh_Hant.lproj/Vector.strings; sourceTree = "<group>"; };
@@ -396,6 +400,12 @@
32D7159F2146CC7F00DF59C9 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
32D715A02146CC8800DF59C9 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
3998C51E0196D42B366E0900 /* Pods-RiotPods-RiotShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RiotPods-RiotShareExtension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RiotPods-RiotShareExtension/Pods-RiotPods-RiotShareExtension.debug.xcconfig"; sourceTree = "<group>"; };
3D78489021AC9E6400B98A7D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = "<group>"; };
3D78489121AC9E6500B98A7D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = "<group>"; };
3D78489221AC9E6500B98A7D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Vector.strings; sourceTree = "<group>"; };
3D78489321ACA25200B98A7D /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = "<group>"; };
3D78489421ACA25300B98A7D /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = "<group>"; };
3D78489521ACA25300B98A7D /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Vector.strings; sourceTree = "<group>"; };
78CD06F14060998545642330 /* Pods-RiotPods-Riot.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RiotPods-Riot.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RiotPods-Riot/Pods-RiotPods-Riot.debug.xcconfig"; sourceTree = "<group>"; };
926FA53D1F4C132000F826C2 /* MXSession+Riot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MXSession+Riot.h"; sourceTree = "<group>"; };
926FA53E1F4C132000F826C2 /* MXSession+Riot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MXSession+Riot.m"; sourceTree = "<group>"; };
@@ -1892,6 +1902,8 @@
B1B5579720EF575A00210D55 /* ForgotPasswordInputsView.h */,
B1B5579420EF575A00210D55 /* ForgotPasswordInputsView.m */,
B1B5579820EF575A00210D55 /* ForgotPasswordInputsView.xib */,
32B1FEDA21A46F2C00637127 /* TermsView.xib */,
3275FD8B21A5A2C500B9C13D /* TermsView.swift */,
);
path = Views;
sourceTree = "<group>";
@@ -2663,6 +2675,8 @@
zh_Hant,
sq,
es,
ja,
hu,
);
mainGroup = F094A9991B78D8F000B1FBBF;
productRefGroup = F094A9A31B78D8F000B1FBBF /* Products */;
@@ -2768,6 +2782,7 @@
B1B558D920EF768F00210D55 /* RoomOutgoingEncryptedAttachmentBubbleCell.xib in Resources */,
B1B5573020EE6C4D00210D55 /* BugReportViewController.xib in Resources */,
B169329B20F39E6300746532 /* Main.storyboard in Resources */,
32B1FEDB21A46F2C00637127 /* TermsView.xib in Resources */,
B1B5578E20EF568D00210D55 /* GroupInviteTableViewCell.xib in Resources */,
B1B5582020EF625800210D55 /* SimpleRoomTitleView.xib in Resources */,
F083BE061E7009ED00A9B29C /* Riot-Defaults.plist in Resources */,
@@ -2868,9 +2883,11 @@
"${BUILT_PRODUCTS_DIR}/OLMKit/OLMKit.framework",
"${BUILT_PRODUCTS_DIR}/PiwikTracker/PiwikTracker.framework",
"${BUILT_PRODUCTS_DIR}/Realm/Realm.framework",
"${BUILT_PRODUCTS_DIR}/Reusable/Reusable.framework",
"${PODS_ROOT}/WebRTC/WebRTC.framework",
"${BUILT_PRODUCTS_DIR}/cmark/cmark.framework",
"${BUILT_PRODUCTS_DIR}/libPhoneNumber-iOS/libPhoneNumber_iOS.framework",
"${BUILT_PRODUCTS_DIR}/libbase58/libbase58.framework",
"${BUILT_PRODUCTS_DIR}/DTCoreText.default-Extension/DTCoreText.framework",
"${BUILT_PRODUCTS_DIR}/MatrixKit-AppExtension/MatrixKit.framework",
);
@@ -2887,9 +2904,11 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OLMKit.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PiwikTracker.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reusable.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/cmark.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libPhoneNumber_iOS.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libbase58.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
@@ -3023,6 +3042,7 @@
B1B558E920EF768F00210D55 /* RoomSelectedStickerBubbleCell.m in Sources */,
B1B558DF20EF768F00210D55 /* RoomOutgoingTextMsgWithoutSenderInfoBubbleCell.m in Sources */,
F083BE041E7009ED00A9B29C /* Tools.m in Sources */,
3275FD8C21A5A2C500B9C13D /* TermsView.swift in Sources */,
B1B5573D20EE6C4D00210D55 /* WebViewViewController.m in Sources */,
B1B5572720EE6C4D00210D55 /* RoomSearchViewController.m in Sources */,
F05927C91FDED836009F2A68 /* MXGroup+Riot.m in Sources */,
@@ -3187,6 +3207,8 @@
32BDC9A3211C2C870064AF51 /* zh_Hant */,
32BDC9A6211C34C90064AF51 /* sq */,
32D7159E2146CC6F00DF59C9 /* es */,
3D78489221AC9E6500B98A7D /* ja */,
3D78489521ACA25300B98A7D /* hu */,
);
name = Vector.strings;
sourceTree = "<group>";
@@ -3207,6 +3229,8 @@
32BDC9A1211C2C870064AF51 /* zh_Hant */,
32BDC9A4211C34C90064AF51 /* sq */,
32D715A02146CC8800DF59C9 /* es */,
3D78489021AC9E6400B98A7D /* ja */,
3D78489321ACA25200B98A7D /* hu */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
@@ -3227,6 +3251,8 @@
32BDC9A2211C2C870064AF51 /* zh_Hant */,
32BDC9A5211C34C90064AF51 /* sq */,
32D7159F2146CC7F00DF59C9 /* es */,
3D78489121AC9E6500B98A7D /* ja */,
3D78489421ACA25300B98A7D /* hu */,
);
name = Localizable.strings;
sourceTree = "<group>";
+1
View File
@@ -555,3 +555,4 @@
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Сървърът е достигнал ограничението си за активни потребители на месец, така че ";
"room_resource_usage_limit_reached_message_2" = "някои потребители няма да могат да влязат.";
"room_resource_usage_limit_reached_message_contact_3" = " за да увеличите този лимит.";
"auth_accept_policies" = "Моля, прегледайте и приемете политиките на този сървър:";
+1 -1
View File
@@ -2,4 +2,4 @@
"NSCameraUsageDescription" = "La càmera s'utilitza per fer fotos i vídeos, fer vídeo conferència.";
"NSPhotoLibraryUsageDescription" = "La fototeca s'utilitza per enviar fotos i vídeos.";
"NSMicrophoneUsageDescription" = "El micròfon s'utilitza per fer vídeos, fer trucades.";
"NSContactsUsageDescription" = "L'agenda de contactes s'utilitza per cercar usuaris per correu electrònic o número de telèfon a Riot.";
"NSContactsUsageDescription" = "Per tal de mostrar-vos quins dels vostres contactes ja són usuaris de Riot o Matrix, podem enviar les seves adreces i números de telèfon desades a la vostra agenda cap al vostre servidor d'identitats de Matrix. El nou Vector no emmagatzema aquestes dades ni les usa per a cap altra finalitat. Per a més informació, si us plau visiteu l'apartat de política de privacitat als paràmetres de l'aplicació.";
+47
View File
@@ -508,3 +508,50 @@
"e2e_room_key_request_share_without_verifying" = "Comparteix sense verificar";
"e2e_room_key_request_ignore_request" = "Ignora la sol·licitud";
"room_do_not_have_permission_to_post" = "No tens permisos per publicar en aquesta sala";
"room_recents_server_notice_section" = "Alertes del sistema";
"room_message_reply_to_placeholder" = "Envia una resposta (no xifrada)…";
"encrypted_room_message_reply_to_placeholder" = "Envia una resposta xifrada…";
"room_message_reply_to_short_placeholder" = "Envia una resposta…";
"room_event_action_view_decrypted_source" = "Veure la font no xifrada";
"room_event_action_kick_prompt_reason" = "Raó per a fer fora aquest usuari";
"room_event_action_ban_prompt_reason" = "Raó per a prohibir aquest usuari";
"room_action_send_photo_or_video" = "Envia foto o vídeo";
"room_action_send_sticker" = "Envia adhesiu";
"room_replacement_information" = "Aquesta sala s'ha substituït i ja no està activa.";
"room_replacement_link" = "La conversa continua aquí.";
"room_predecessor_information" = "Aquesta sala és una continuació d'una altra conversa.";
"room_predecessor_link" = "Fes clic aquí per veure missatges antics.";
"room_resource_limit_exceeded_message_contact_1" = " Si us plau ";
"room_resource_limit_exceeded_message_contact_2_link" = "Posa't en contacte amb l'administrador del servei";
"room_resource_limit_exceeded_message_contact_3" = " per a continuar usant aquest servei.";
"room_resource_usage_limit_reached_message_1_default" = "Aquest servidor ha superat un dels seus límits de recursos per tant ";
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Aquest servidor ha arribat al seu límit d'usuaris actius mensuals ";
"room_resource_usage_limit_reached_message_2" = "alguns usuaris no podran iniciar sessió.";
"room_resource_usage_limit_reached_message_contact_3" = " per augmentar aquest límit.";
"settings_deactivate_account" = "Desactivar compte";
"settings_labs_room_members_lazy_loading" = "Membres de les sales de càrrega lenta";
"settings_labs_room_members_lazy_loading_error_message" = "El teu servidor encara no admet càrregues lentes de membres de la sala. Prova-ho més tard.";
"settings_deactivate_my_account" = "Desactivar el meu compte";
"event_formatter_rerequest_keys_part1_link" = "Re-sol·licita les claus de xifratge";
"event_formatter_rerequest_keys_part2" = " des d'els teus altres dispositius.";
"homeserver_connection_lost" = "No s'ha pogut connectar amb el servidor.";
"widget_sticker_picker_no_stickerpacks_alert" = "Actualment no tens cap etiqueta adhesiva activada.";
"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Afegir alguns ara?";
// GDPR
"gdpr_consent_not_given_alert_message" = "Per a continuar utilitzant el servidor %@ has de revisar i acceptar els termes i condicions.";
"gdpr_consent_not_given_alert_review_now_action" = "Revisa ara";
"deactivate_account_title" = "Desactiva el compte";
"deactivate_account_informations_part1" = "Això farà que el teu compte no es pugui utilitzar de manera permanent. No podràs iniciar sessió i ningú no podrà tornar a registrar la mateixa identificació d'usuari. Això farà que el teu compte deixi totes les sales on participa i eliminarà els detalls del teu compte del teu servidor d'identitat. ";
"deactivate_account_informations_part2_emphasize" = "Aquesta acció és irreversible.";
"deactivate_account_informations_part3" = "\n\nDesactivant el teu compte ";
"deactivate_account_informations_part4_emphasize" = "no per defecte ens obliga a oblidar els missatges que has enviat. ";
"deactivate_account_informations_part5" = "Si vols que oblidem els teus missatges, marca el quadre següent\n\nLa visibilitat del missatge a Matrix és similar al correu electrònic. L'oblit dels teus missatges significa que els missatges que has enviat no es compartiran amb cap usuari nou o no registrat però els usuaris registrats que ja tenen accés a aquests missatges encara tindran accés a la seva còpia.";
"deactivate_account_forget_messages_information_part1" = "Si us plau oblida tots els missatges que he enviat quan el meu compte estigui desactivat (";
"deactivate_account_forget_messages_information_part2_emphasize" = "Avís";
"deactivate_account_forget_messages_information_part3" = ": això farà que els usuaris futurs vegin una vista incompleta de les converses)";
"deactivate_account_validate_action" = "Desactiva el compte";
"deactivate_account_password_alert_title" = "Desactiva el compte";
"deactivate_account_password_alert_message" = "Per a continuar si us plau introdueix la teva contrasenya";
// Re-request confirmation dialog
"rerequest_keys_alert_title" = "Sol·licitud enviada";
"rerequest_keys_alert_message" = "Inicia Riot en un altre dispositiu que pugui desxifrar el missatge per que pugui enviar les claus a aquest dispositiu.";
+1
View File
@@ -556,3 +556,4 @@
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Dieser Heimserver hat sein Limit an monatlich aktiven Benutzern überschritten, sodass ";
"room_resource_usage_limit_reached_message_2" = "einige Benutzer nicht in der Lage sein werden, sich einzuloggen.";
"room_resource_usage_limit_reached_message_contact_3" = " um dieses Limit erhöhen zu lassen.";
"auth_accept_policies" = "Bitte Regeln dieses Heimservers ansehen und akzeptieren:";
+1
View File
@@ -107,6 +107,7 @@
"auth_reset_password_error_not_found" = "Your email address does not appear to be associated with a Matrix ID on this Homeserver.";
"auth_reset_password_success_message" = "Your password has been reset.\n\nYou have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, re-log in on each device.";
"auth_add_email_and_phone_warning" = "Registration with email and phone number at once is not supported yet until the api exists. Only the phone number will be taken into account. You may add your email to your profile in settings.";
"auth_accept_policies" = "Please review and accept the policies of this homeserver:";
// Chat creation
"room_creation_title" = "New Chat";
+1
View File
@@ -558,3 +558,4 @@
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Hasiera zerbitzari honek hilabeteko erabiltzaile aktiboen muga jo du ";
"room_resource_usage_limit_reached_message_2" = "erabiltzaile batzuk ezin izango dute saioa hasi.";
"room_resource_usage_limit_reached_message_contact_3" = " muga hau areagotzeko.";
"auth_accept_policies" = "Irakurri eta onartu hasiera-zerbitzariaren baldintzak:";
+2 -1
View File
@@ -509,7 +509,7 @@
"room_details_flair_invalid_id_prompt_msg" = "%@ n'est pas un identifiant valide pour une communauté";
"room_details_fail_to_update_room_communities" = "Échec de la mise à jour des communautés liées";
"room_do_not_have_permission_to_post" = "Vous n'avez pas la permission d'envoyer des messages dans ce salon";
"room_event_action_kick_prompt_reason" = "Raison de l'exclusion de l'utilisateur";
"room_event_action_kick_prompt_reason" = "Motif de l'expulsion de l'utilisateur";
"room_event_action_ban_prompt_reason" = "Raison du bannissement de l'utilisateur";
// GDPR
"gdpr_consent_not_given_alert_message" = "Pour continuer à utiliser le serveur d'accueil %@, vous devez lire et accepter les conditions générales.";
@@ -556,3 +556,4 @@
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Ce serveur d'accueil a atteint sa limite mensuelle d'utilisateurs actifs donc ";
"room_resource_usage_limit_reached_message_2" = "quelques utilisateurs ne pourront pas se connecter.";
"room_resource_usage_limit_reached_message_contact_3" = " pour augmenter cette limite.";
"auth_accept_policies" = "Veuillez lire et accepter les politiques de ce serveur d'accueil :";
+1
View File
@@ -561,3 +561,4 @@
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Ez a Matrix szerver elérte a havi aktív felhasználói korlátját, így ";
"room_resource_usage_limit_reached_message_2" = "néhány felhasználó nem tud majd bejelentkezni.";
"room_resource_usage_limit_reached_message_contact_3" = " hogy korlátot megemeljék.";
"auth_accept_policies" = "A Matrix szerver felhasználási feltételeit kérlek nézd át és fogadd el:";
+1
View File
@@ -0,0 +1 @@
+1
View File
@@ -0,0 +1 @@
+1 -1
View File
@@ -2,4 +2,4 @@
"NSCameraUsageDescription" = "ビデオ通話や写真撮影、動画撮影などを行うときにカメラを使用します。";
"NSPhotoLibraryUsageDescription" = "フォトライブラリは、写真や動画の送信に使用されます。";
"NSMicrophoneUsageDescription" = "マイクは動画撮影や通話に使用されます。";
"NSContactsUsageDescription" = "本体内の連絡先、アドレス帳は、Riotのユーザを電子メールアドレス電話番号で検索する際に使用します。";
"NSContactsUsageDescription" = "連絡先のどれがRiotまたはMatrixを既に使用しているかを表示するために、あなたのアドレス帳にあるメールアドレス電話番号をMatrix Identity Serverに送信することができます。 New Vectorはこのデータを保存したり、他の目的に使用したりしません。 詳細については、アプリケーション設定のプライバシーポリシーページを参照してください。";
+4
View File
@@ -46,3 +46,7 @@
"VOICE_CONF_NAMED_FROM_USER" = "会議通話の着信 from %@: '%@'";
/* Incoming named video conference invite from a specific person */
"VIDEO_CONF_NAMED_FROM_USER" = "映像つき会議通話の着信 from %@: '%@'";
/* A single unread message in a room */
"SINGLE_UNREAD_IN_ROOM" = "@にメッセージを受け取りました";
/* A single unread message */
"SINGLE_UNREAD" = "あなたはメッセージを受け取りました";
+97 -5
View File
@@ -11,13 +11,13 @@
"continue" = "続く";
"create" = "作成";
"start" = "開始";
"leave" = "退室";
"leave" = "保存しない";
"remove" = "削除";
"invite" = "招待";
"retry" = "再試行";
"on" = "オン";
"off" = "オフ";
"cancel" = "取消";
"cancel" = "キャンセル";
"save" = "保存";
"join" = "参加";
"decline" = "断る";
@@ -178,8 +178,8 @@
"room_participants_action_invite" = "招待";
"room_participants_action_leave" = "部屋を退室";
"room_participants_action_remove" = "部屋から退室させる";
"room_participants_action_ban" = "この部屋から強制退去と再入室禁止";
"room_participants_action_unban" = "再入室禁止解除";
"room_participants_action_ban" = "この部屋からブロックする";
"room_participants_action_unban" = "ブロック解除";
"room_participants_action_ignore" = "この参加者の発言を全て非表示にする";
"room_participants_action_unignore" = "この参加者の発言を全て表示する";
"room_participants_action_set_default_power_level" = "権限を一般参加者へ変更";
@@ -362,7 +362,7 @@
"room_details_addresses_invalid_address_prompt_msg" = "%@ は正しくない形式の住所表記です";
"room_details_addresses_disable_main_address_prompt_title" = "代表住所表記の警告";
"room_details_addresses_disable_main_address_prompt_msg" = "代表住所表記が設定されていません. この部屋の代表住所表記は無作為に選択、設定されます";
"room_details_banned_users_section" = "再入室禁止された参加者";
"room_details_banned_users_section" = "ブロックされたユーザー";
"room_details_advanced_section" = "拡張設定";
"room_details_advanced_room_id" = "部屋の固有ID:";
"room_details_advanced_enable_e2e_encryption" = "暗号化を開始(警告: 部屋の暗号を中止することはできません!)";
@@ -470,3 +470,95 @@
"room_details_advanced_e2e_encryption_prompt_message" = "End-to-end暗号化は実験的なものであり、信頼性が低い場合があります。\n\n発言を保護するためにはまだそれを信用すべきではありません。\n\n端末は、まだ参加する前の発言履歴を復号化することはできません。\n\n部屋の暗号化が今から有効になったら、もう無効にすることはできません。\n\n暗号化された発言は、まだ暗号化を実装していないアプリでは表示されません。";
"settings_enable_callkit" = "呼び出しの統合";
"settings_pin_rooms_with_unread" = "未読のある部屋をピン止めする";
"title_groups" = "コミュニティ";
"room_recents_server_notice_section" = "システムアラート";
// Groups tab
"group_invite_section" = "招待";
"group_section" = "コミュニティ";
"room_message_reply_to_placeholder" = "返信を送る (暗号化されていない)…";
"room_do_not_have_permission_to_post" = "この部屋に投稿する権限がありません";
"encrypted_room_message_reply_to_placeholder" = "暗号化された返信を送る…";
"room_message_reply_to_short_placeholder" = "返信を送る…";
"room_event_action_view_decrypted_source" = "復号化されたソースを見る";
"room_event_action_kick_prompt_reason" = "このユーザーを追放する理由";
"room_action_send_photo_or_video" = "写真か動画を送る";
"room_action_send_sticker" = "スタンプ送信";
"room_replacement_information" = "この部屋は交換されており、もうアクティブではありません。";
"room_replacement_link" = "会話はここで続けられます。";
"room_predecessor_information" = "この部屋は別の会話の続きです。";
"room_predecessor_link" = "より古いメッセージを見るにはここをクリックしてください。";
"room_resource_limit_exceeded_message_contact_2_link" = "サービス管理者に連絡する";
"room_resource_limit_exceeded_message_contact_3" = " このサービスの使用を継続するには。";
"room_resource_usage_limit_reached_message_1_default" = "このホームサーバーはリソース制限の1つを超えています ";
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "このホームサーバーは月間アクティブユーザー数制限を超えています ";
"room_resource_usage_limit_reached_message_2" = "一部のユーザーはログインできなくなります。";
"room_resource_usage_limit_reached_message_contact_3" = " この制限を増やすには。";
"settings_deactivate_account" = "無効化したアカウント";
"settings_labs_room_members_lazy_loading" = "遅延ロードルームのメンバー";
"settings_labs_room_members_lazy_loading_error_message" = "あなたのホームサーバーはまだルームメンバーの遅延ロードをサポートしていません。 後で試してください。";
"settings_deactivate_my_account" = "アカウントを無効にします";
"room_details_flair_section" = "コミュニティの特色を表示";
"room_details_new_flair_placeholder" = "新しいコミュニティIDを追加 (例 +foo@)";
"room_details_flair_invalid_id_prompt_title" = "無効な形式";
"room_details_flair_invalid_id_prompt_msg" = "%@はコミュニティの有効な識別子ではありません";
"room_details_fail_to_update_room_communities" = "関連コミュニティを更新できない";
// Group Details
"group_details_title" = "コミュニティの詳細";
"group_details_home" = "ホーム";
"group_details_people" = "人々";
"group_details_rooms" = "部屋";
// Group Home
"group_home_one_member_format" = "1 メンバー";
"group_home_multi_members_format" = "%tu メンバー";
"group_home_one_room_format" = "1 部屋";
"group_home_multi_rooms_format" = "%tu 部屋";
"group_invitation_format" = "%@がこのコミュニティにあなたを招待しました";
// Group participants
"group_participants_add_participant" = "参加者を追加";
"group_participants_leave_prompt_title" = "グループを退出";
"group_participants_leave_prompt_msg" = "本当にグループを退出しますか?";
"group_participants_remove_prompt_title" = "確認";
"group_participants_remove_prompt_msg" = "本当にこのグループから%@を削除しますか?";
"group_participants_invite_prompt_title" = "確認";
"group_participants_invite_prompt_msg" = "本当にこのグループに%@を招待しますか?";
"group_participants_filter_members" = "コミュニティメンバーをフィルタリング";
"group_participants_invite_another_user" = "ユーザーIDまたは名前による検索/招待";
"group_participants_invite_malformed_id_title" = "招待エラー";
"group_participants_invite_malformed_id" = "不正なID。 '@localpart:domain' のようなMatrix IDでなければなりません";
"group_participants_invited_section" = "招待した";
// Group rooms
"group_rooms_filter_rooms" = "コミュニティルームをフィルタリング";
"event_formatter_rerequest_keys_part1_link" = "暗号鍵の再要求";
"event_formatter_rerequest_keys_part2" = " あなたの他の端末から。";
"homeserver_connection_lost" = "ホームサーバーに接続できませんでした。";
"widget_sticker_picker_no_stickerpacks_alert" = "現在、ステッカーパックを有効にしていません。";
"widget_sticker_picker_no_stickerpacks_alert_add_now" = "今すぐ追加しますか?";
// Room key request dialog
"e2e_room_key_request_title" = "暗号化キー要求";
"e2e_room_key_request_message_new_device" = "暗号化キーを要求している新しい端末 '%@'を追加しました。";
"e2e_room_key_request_message" = "検証されていない端末 '%@'が暗号化キーを要求しています。";
"e2e_room_key_request_start_verification" = "検証開始...";
"e2e_room_key_request_share_without_verifying" = "検証せずに共有";
"e2e_room_key_request_ignore_request" = "要求を無視";
// GDPR
"gdpr_consent_not_given_alert_message" = "%@ホームサーバーを引き続き使用するには、利用規約を確認して同意する必要があります。";
"gdpr_consent_not_given_alert_review_now_action" = "今レビュー";
"deactivate_account_title" = "無効なアカウント";
"deactivate_account_informations_part1" = "これにより、アカウントは永久に使用できなくなります。 ログインすることはできず、誰も同じユーザーIDを再登録することはできません。 これにより、あなたのアカウントは参加しているすべての部屋から退去し、あなたのIDサーバーからアカウントの詳細が削除されます。 ";
"deactivate_account_informations_part2_emphasize" = "この動作は元に戻せません。";
"deactivate_account_informations_part3" = "\n\nアカウントの無効化 ";
"deactivate_account_informations_part4_emphasize" = "デフォルトではあなたが送信したメッセージを忘れることはありません。 ";
"deactivate_account_informations_part5" = "あなたのメッセージを忘れたければ、下のボックスにチェックを入れてください\n\nMatrixのメッセージの可視性はEメールと似ています。 forgettingメッセージは、送信したメッセージは新規または未登録のユーザーと共有されませんが、既にこれらのメッセージにアクセスしている登録ユーザーは引き続き自分のコピーにアクセスできます。";
"deactivate_account_forget_messages_information_part1" = "アカウントが無効になったときに送信したすべてのメッセージを忘れてください (";
"deactivate_account_forget_messages_information_part2_emphasize" = "警告";
"deactivate_account_forget_messages_information_part3" = ":これは将来のユーザーに会話の不完全なビューが表示される)";
"deactivate_account_validate_action" = "無効なアカウント";
"deactivate_account_password_alert_title" = "無効なアカウント";
"deactivate_account_password_alert_message" = "続行するには、パスワードを入力してください";
// Re-request confirmation dialog
"rerequest_keys_alert_title" = "リクエスト送信";
"rerequest_keys_alert_message" = "この端末にキーを送信できるように、メッセージを復号化できる別の端末でRiotを起動してください。";
"room_event_action_ban_prompt_reason" = "このユーザーをブロックする理由";
"room_resource_limit_exceeded_message_contact_1" = " Please ";
"settings_ui_theme_black" = "Black";
"settings_flair" = "特色を表示する";
+3
View File
@@ -0,0 +1,3 @@
// Permissions usage explanations
"NSCameraUsageDescription" = "Aparat służy do robienia zdjęć i nagrywania filmów, prowadzenia rozmów wideo.";
"NSPhotoLibraryUsageDescription" = "Biblioteka zdjęć służy do wysyłania zdjęć i filmów.";
+474
View File
@@ -0,0 +1,474 @@
// Titles
"title_home" = "Strona startowa";
"title_favourites" = "Ulubione";
"title_people" = "Ludzie";
"title_rooms" = "Pokoje";
"title_groups" = "Społeczności";
"warning" = "Ostrzeżenie";
// Actions
"view" = "Widok";
"back" = "Powrót";
"continue" = "Kontynuuj";
"create" = "Utwórz";
"leave" = "Opuść";
"remove" = "Usuń";
"invite" = "Zaproś";
"retry" = "Ponów";
"off" = "Off";
"cancel" = "Anuluj";
"save" = "Zapisz";
"join" = "Dołącz";
"decline" = "Odrzuć";
"accept" = "Akceptuj";
"preview" = "Podgląd";
"camera" = "Kamera";
"voice" = "Głos";
"active_call" = "Aktywne połączenie";
"active_call_details" = "Aktywne połączenie (%@)";
"later" = "Później";
"rename" = "Zmień nazwę";
"collapse" = "zwiń";
"send_to" = "Wyślij do %@";
"sending" = "Wysyłanie";
// Authentication
"auth_login" = "Zaloguj się";
"auth_register" = "Zarejestruj";
"auth_submit" = "Wyślij";
"auth_skip" = "Pomiń";
"auth_send_reset_email" = "Wyślij e-mail przywracający";
"auth_return_to_login" = "Wróć do ekranu logowania";
"auth_user_id_placeholder" = "Nazwa użytkownika lub e-mail";
"auth_password_placeholder" = "Hasło";
"auth_new_password_placeholder" = "Nowe hasło";
"auth_user_name_placeholder" = "Nazwa użytkownika";
"auth_optional_email_placeholder" = "Adres e-mail (opcjonalnie)";
"auth_email_placeholder" = "Adres e-mail";
"auth_optional_phone_placeholder" = "Numer telefonu komórkowego (opcjonalne)";
"auth_phone_placeholder" = "Numer telefonu";
"auth_repeat_password_placeholder" = "Powtórz hasło";
"auth_repeat_new_password_placeholder" = "Potwierdź swoje nowe hasło";
"auth_home_server_placeholder" = "URL (np. https://matrix.org)";
"auth_identity_server_placeholder" = "URL (np. https://matrix.org)";
"auth_invalid_login_param" = "Nieprawidłowa nazwa użytkownika i/lub hasło";
"auth_invalid_user_name" = "Nazwa użytkownika może zawierać tylko litery, cyfry, kropki, myślniki i podkreślenia";
"auth_invalid_email" = "To nie wygląda na poprawny adres e-mail";
"auth_invalid_phone" = "To nie wygląda na poprawny numer telefonu";
"auth_missing_password" = "Brak hasła";
"auth_add_email_phone_message" = "Dodaj adres e-mail i/lub nr telefonu do swojego konta, aby umożliwić innym użytkownikom odnalezienie ciebie. Adres e-mail pozwoli ci również zresetować hasło.";
"auth_add_email_and_phone_message" = "Dodaj adres e-mail i nr telefonu do swojego konta, aby umożliwić innym użytkownikom odnalezienie ciebie. Adres e-mail pozwoli ci również zresetować hasło.";
"auth_missing_email" = "Brak adresu e-mail";
"auth_missing_phone" = "Brak numeru telefonu";
"auth_missing_email_or_phone" = "Brak adresu e-mail lub numeru telefonu";
"auth_email_in_use" = "Podany adres e-mail jest już w użyciu";
"auth_phone_in_use" = "Ten numer telefonu jest już używany";
"auth_password_dont_match" = "Hasła nie zgadzają się";
"auth_username_in_use" = "Nazwa użytkownika jest już używana";
"auth_use_server_options" = "Użyj niestandardowych ustawień serwera (zaawansowane)";
"auth_email_validation_message" = "Sprawdź swój e-mail, aby kontynuować rejestrację";
"auth_msisdn_validation_title" = "Oczekiwanie na weryfikację";
"auth_msisdn_validation_message" = "Wysłaliśmy SMS z kodem aktywacyjnym. Podaj ten kod poniżej.";
"auth_recaptcha_message" = "Ten serwer domowy chciałby się upewnić, że nie jesteś robotem";
"auth_reset_password_message" = "Aby zresetować swoje hasło, wpisz adres e-mail powiązany z twoim kontem:";
"auth_reset_password_missing_password" = "Należy wprowadzić nowe hasło.";
"auth_reset_password_next_step_button" = "Zweryfikowałem swój adres e-mail";
"auth_reset_password_error_unauthorized" = "Nie udało się zweryfikować adresu e-mail: upewnij się że kliknąłeś w link w e-mailu";
"auth_reset_password_error_not_found" = "Twój adres e-mail zdaje się nie być powiązany z żadnym Matrix ID na tym serwerze domowym.";
"auth_invalid_password" = "Zbyt krótkie hasło (co najmniej 6 znaków)";
"auth_add_email_message" = "Dodaj do konta adres e-mail, aby użytkownicy mogli Cię odnaleźć, oraz abyś mógł przywrócić swoje hasło.";
"auth_add_phone_message" = "Dodaj numer telefonu, aby użytkownicy mogli Cię odnaleźć.";
"auth_reset_password_missing_email" = "Musi zostać wprowadzony e-mail powiązany z kontem.";
"auth_reset_password_email_validation_message" = "Wysłano email na adres %@. Po otwarciu znajdującego się tam linku, kliknij poniżej.";
"auth_reset_password_success_message" = "Twoje hasło zostało zresetowane.\n\nZostałeś wylogowany ze wszystkich urządzeń i nie będziesz więcej otrzymywać powiadomień push. Aby ponownie włączyć powiadomienia, zaloguj się ponownie na każdym urządzeniu.";
"auth_add_email_and_phone_warning" = "Rejestracja jednocześnie za pomocą numeru telefonu i adresu e-mail nie jest obsługiwana dopóki nie pojawi się odpowiednie API. Tylko numer telefonu będzie brany pod uwagę. Możesz dodać adres e-mail do swojego profilu w ustawieniach.";
// Chat creation
"room_creation_title" = "Nowa rozmowa";
"room_creation_account" = "Konto";
"room_creation_appearance" = "Wygląd";
"room_creation_appearance_name" = "Nazwa";
"room_creation_privacy" = "Prywatność";
"room_recents_directory_section_network" = "Sieć";
"room_recents_favourites_section" = "ULUBIONE";
"room_recents_people_section" = "LUDZIE";
"room_recents_conversations_section" = "POKOJE";
"room_recents_no_conversation" = "Brak pokojów";
"room_recents_low_priority_section" = "NISKI PRIORYTET";
"room_recents_server_notice_section" = "ALERTY SYSTEMOWE";
"room_recents_invites_section" = "ZAPROSZENIA";
"room_recents_start_chat_with" = "Rozpocznij rozmowę";
"room_recents_create_empty_room" = "Utwórz pokój";
"room_recents_join_room" = "Dołącz do pokoju";
"room_recents_join_room_title" = "Dołącz do pokoju";
"room_recents_join_room_prompt" = "Wprowadź ID lub nazwę pokoju";
// People tab
"people_invites_section" = "ZAPROSZENIA";
"people_conversation_section" = "ROZMOWY";
"people_no_conversation" = "Brak rozmów";
// Groups tab
"group_invite_section" = "ZAPROSZENIA";
"group_section" = "SPOŁECZNOŚCI";
// Search
"search_rooms" = "Pokoje";
"search_messages" = "Wiadomości";
"search_people" = "Ludzie";
"search_files" = "Pliki";
"search_default_placeholder" = "Szukaj";
"search_no_result" = "Brak wyników";
// Directory
"directory_cell_title" = "Przeglądaj katalog";
"directory_search_results" = "%tu znalezionych wyników dla %@";
"directory_search_results_more_than" = ">%tu znalezionych wyników dla %@";
"directory_searching_title" = "Wyszukiwanie katalogu…";
// Contacts
"contacts_address_book_section" = "LOKALNE KONTAKTY";
"contacts_address_book_matrix_users_toggle" = "Tylko użytkownicy Matrixa";
"contacts_address_book_permission_denied" = "Nie udzieliłeś(-aś) uprawnienia na dostęp do listy kontaktów";
"contacts_user_directory_section" = "KATALOG UŻYTKOWNIKÓW";
"room_participants_leave_prompt_title" = "Opuść pokój";
"room_participants_remove_prompt_title" = "Potwierdzenie";
"room_participants_invite_prompt_title" = "Potwierdzenie";
"room_participants_filter_room_members" = "Filtruj członków pokoju";
"room_participants_idle" = "Bezczynny(-a)";
"room_participants_now" = "teraz";
"room_participants_ago" = "temu";
"room_participants_action_section_admin_tools" = "Narzędzia Administracyjne";
"room_participants_action_section_direct_chats" = "Rozmowy bezpośrednie";
"room_participants_action_section_devices" = "Urządzenia";
"room_participants_action_invite" = "Zaproś";
"room_participants_action_leave" = "Opuść pokój";
"room_participants_action_remove" = "Usuń z pokoju";
"room_participants_action_unban" = "Odbanuj";
"room_participants_action_ignore" = "Ukryj wszystkie wiadomości od tego użytkownika";
"room_participants_action_unignore" = "Pokaż wszystkie wiadomości od tego użytkownika";
"room_participants_action_set_default_power_level" = "Przywróć do poziomu normalnego użytkownika";
"room_participants_action_set_moderator" = "Uczyń moderatorem";
"room_participants_action_set_admin" = "Uczyń administratorem";
"room_participants_action_start_new_chat" = "Rozpocznij nową rozmowę";
"room_participants_action_start_voice_call" = "Rozpocznij połączenie telefoniczne";
"room_participants_action_start_video_call" = "Rozpocznij połączenie wideo";
"room_participants_action_mention" = "Wspomnij";
"room_many_users_are_typing" = "%@, %@ i inni piszą…";
"room_message_placeholder" = "Wyślij wiadomość (niezaszyfrowaną)…";
"room_message_reply_to_placeholder" = "Wyślij odpowiedź (niezaszyfrowaną)…";
"room_do_not_have_permission_to_post" = "Nie masz uprawnień, aby pisać w tym pokoju";
"encrypted_room_message_placeholder" = "Wyślij zaszyfrowaną wiadomość…";
"encrypted_room_message_reply_to_placeholder" = "Wyślij zaszyfrowaną odpowiedź…";
"room_message_short_placeholder" = "Wyślij wiadomość…";
"room_message_reply_to_short_placeholder" = "Wyślij odpowiedź…";
"room_offline_notification" = "Połączenie z serwerem zostało utracone.";
"room_ongoing_conference_call_close" = "Zamknij";
"room_prompt_resend" = "Wyślij ponownie wszystko";
"room_prompt_cancel" = "anuluj wszystko";
"room_resend_unsent_messages" = "Wyślij niewysłane wiadomości ponownie";
"room_delete_unsent_messages" = "Usuń niewysłane wiadomości";
"room_event_action_copy" = "Kopiuj";
"room_event_action_quote" = "Cytuj";
"room_event_action_redact" = "Usuń";
"room_event_action_more" = "Więcej";
"room_event_action_share" = "Udostępnij";
"room_event_action_permalink" = "Odnośnik bezpośredni";
"room_event_action_view_source" = "Pokaż źródło";
"room_event_action_view_decrypted_source" = "Pokaż odszyfrowane źródło";
"room_event_action_report" = "Zgłoś zawartość";
"room_event_action_report_prompt_reason" = "Powód zgłoszenia zawartości";
"room_event_action_save" = "Zapisz";
"room_event_action_resend" = "Wyślij ponownie";
"room_event_action_delete" = "Usuń";
"room_event_action_cancel_download" = "Anuluj pobieranie";
"room_action_send_sticker" = "Wyślij naklejkę";
"room_replacement_information" = "Ten pokój został zamieniony i nie jest już aktywny.";
"room_replacement_link" = "Konwersacja jest kontynuowana tutaj.";
"room_predecessor_information" = "Ten pokój jest kontynuacją innej rozmowy.";
"room_predecessor_link" = "Kliknij tutaj, aby zobaczyć starsze wiadomości.";
"room_resource_limit_exceeded_message_contact_2_link" = "skontaktuj się z administratorem";
"room_resource_limit_exceeded_message_contact_3" = " , aby korzystać dalej z funkcji.";
"room_resource_limit_exceeded_message_contact_1" = " Proszę ";
"room_resource_usage_limit_reached_message_1_default" = "Ten serwer przekroczył jeden z limitów, więc ";
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Ten serwer osiągnął miesięczny limit aktywnych użytkowników, więc ";
"room_resource_usage_limit_reached_message_2" = "niektórzy użytkownicy nie będą mogli się zalogować.";
"room_resource_usage_limit_reached_message_contact_3" = " , aby zwiększył ten limit.";
// Unknown devices
"unknown_devices_alert_title" = "Pokój zawiera nieznane urządzenia";
"room_event_action_cancel_send" = "Anuluj Wysyłanie";
"room_event_action_view_encryption" = "Informacje o szyfrowaniu";
"room_event_failed_to_send" = "Nie udało się wysłać";
"room_warning_about_encryption" = "Szyfrowanie End-to-End jest w fazie beta i nie jest pewne. \n\nNie powinieneś ufać mu w celu zabezpieczenia danych.\n\nUrządzenia nie będą w stanie na razie odszyfrować historii sprzed momentu dołączenia do pokoju.\n\nSzyfrowane wiadomości nie będą widoczne dla klientów którzy nie wspierają jeszcze szyfrowania.";
"unknown_devices_alert" = "Ten pokój zawiera nieznane urządzenia, które nie zostały zweryfikowane.\nOznacza to brak gwarancji, że urządzenia należą do użytkowników do których twierdzą, że należą.\nPrzed kontynuowaniem, zalecamy wykonanie procesu weryfikacji każdego urządzenia, ale możesz ponownie wysłać wiadomość bez weryfikacji, jeśli wolisz.";
"unknown_devices_send_anyway" = "Wyślij mimo to";
"unknown_devices_call_anyway" = "Zadzwoń mimo to";
"unknown_devices_answer_anyway" = "Odpowiedz mimo to";
"unknown_devices_verify" = "Zweryfikuj…";
"unknown_devices_title" = "Nieznane urządzenia";
// Room Title
"room_title_new_room" = "Nowy pokój";
"room_title_multiple_active_members" = "%@/%@ aktywnych członków";
"room_title_invite_members" = "Zaproś członków";
"room_title_members" = "%@ członków";
"room_title_one_member" = "1 członek";
// Room Preview
"room_preview_invitation_format" = "Zostałeś(-aś) zaproszony(-a) do tego pokoju przez %@";
"room_preview_subtitle" = "To jest podgląd pokoju. Interakcje zostały zablokowane.";
"room_preview_unlinked_email_warning" = "Zaproszenie zostało wysłane do %@, który nie jest powiązany z zalogowanym kontem. Możesz zalogować się z wykorzystaniem innego konta, albo dodać ten adres e-mail do swoich kontaktów.";
"room_preview_try_join_an_unknown_room_default" = "pokój";
// Settings
"settings_title" = "Ustawienia";
"settings_report_bug" = "Zgłoś błąd";
"settings_config_user_id" = "Zalogowany(-a) jako %@";
"settings_user_settings" = "USTAWIENIA UŻYTKOWNIKA";
"settings_notifications_settings" = "USTAWIENIA POWIADOMIEŃ";
"settings_calls_settings" = "POŁĄCZENIA";
"settings_user_interface" = "INTERFEJS UŻYTKOWNIKA";
"settings_ignored_users" = "IGNOROWANI UŻYTKOWNICY";
"settings_contacts" = "LOKALNE KONTAKTY";
"settings_advanced" = "ZAAWANSOWANE";
"settings_other" = "POZOSTAŁE";
"settings_devices" = "URZĄDZENIA";
"settings_cryptography" = "KRYPTOGRAFIA";
"settings_deactivate_account" = "DEZAKTYWUJ KONTO";
"settings_sign_out" = "Wyloguj się";
"settings_profile_picture" = "Obraz profilowy";
"settings_display_name" = "Wyświetlana nazwa";
"settings_remove_prompt_title" = "Potwierdzenie";
"settings_pin_rooms_with_missed_notif" = "Przypnij pokoje z ominiętymi powiadomieniami";
"settings_pin_rooms_with_unread" = "Przypnij pokoje z nieprzeczytanych wiadomościami";
"settings_ui_language" = "Język";
"settings_ui_theme" = "Motyw";
"settings_ui_theme_auto" = "Auto";
"settings_ui_theme_light" = "Jasny";
"settings_ui_theme_dark" = "Ciemmy";
"settings_ui_theme_black" = "Czarny";
"settings_ui_theme_picker_title" = "Wybierz motyw";
"settings_contacts_phonebook_country" = "Kraj książki adresowej";
"settings_labs_e2e_encryption" = "Szyfrowanie End-to-End";
"settings_labs_create_conference_with_jitsi" = "Utwórz połączenia konferencyjne za pomocą jitsi";
"settings_version" = "Wersja %@";
"settings_olm_version" = "Wersja Olm %@";
"settings_copyright" = "Prawa autorskie";
"settings_copyright_url" = "https://riot.im/copyright";
"settings_term_conditions" = "Warunki użytkowania";
"settings_term_conditions_url" = "https://riot.im/tac_apple";
"settings_privacy_policy" = "Polityka prywatności";
"settings_privacy_policy_url" = "https://riot.im/privacy";
"settings_third_party_notices" = "Informacje o stronach trzecich";
"settings_enable_rageshake" = "Potrząśnij wściekle, aby zgłosić błąd";
"settings_clear_cache" = "Wyczyść pamięć podręczną";
"settings_change_password" = "Zmień hasło";
"settings_old_password" = "stare hasło";
"settings_new_password" = "nowe hasło";
"settings_confirm_password" = "potwierdź hasło";
"settings_password_updated" = "Twoje hasło zostało zmienione";
"settings_crypto_device_name" = "Nazwa urządzenia: ";
"settings_crypto_device_id" = "\nIdentyfikator urządzenia: ";
"settings_crypto_device_key" = "\nKlucz urządzenia: ";
"settings_crypto_blacklist_unverified_devices" = "Szyfruj wiadomości tylko do zaufanych urządzeń";
"settings_deactivate_my_account" = "Dezaktywuj moje konto";
// Room Details
"room_details_title" = "Szczegóły pokoju";
"room_details_files" = "Pliki";
"room_details_settings" = "Ustawienia";
"room_details_photo" = "Obraz pokoju";
"room_details_room_name" = "Nazwa Pokoju";
"room_details_topic" = "Temat";
"room_details_favourite_tag" = "Ulubione";
"room_details_low_priority_tag" = "Niski priorytet";
"room_details_direct_chat" = "Rozmowa bezpośrednia";
"room_details_access_section_anyone_apart_from_guest" = "Każdy kto zna link pokoju, poza gośćmi";
"room_details_access_section_anyone" = "Każdy kto zna link pokoju, razem z gośćmi";
"room_details_access_section_no_address_warning" = "Aby móc stworzyć link do pokoju musi on mieć swój adres";
"room_details_access_section_directory_toggle" = "Wyświetlaj ten pokój na liście pokojów";
"room_details_history_section" = "Kto może przeczytać historię?";
"room_details_history_section_anyone" = "Każdy";
"room_details_history_section_members_only" = "Tylko członkowie (od momentu włączenia tej opcji)";
"room_details_history_section_members_only_since_invited" = "Tylko członkowie (od kiedy zostali zaproszeni)";
"room_details_history_section_members_only_since_joined" = "Tylko członkowie (od kiedy dołączyli)";
"room_details_history_section_prompt_title" = "Ostrzeżenie o prywatności";
"room_details_addresses_section" = "Adresy";
"room_details_no_local_addresses" = "Ten pokój nie ma lokalnych adresów";
"room_details_new_address" = "Dodaj nowy adres";
"room_details_new_address_placeholder" = "Dodaj nowy adres (np. #foo%@)";
"room_details_addresses_invalid_address_prompt_title" = "Nieprawidłowy format aliasu";
"room_details_addresses_invalid_address_prompt_msg" = "%@ nie jest poprawnym formatem aliasu";
"room_details_flair_invalid_id_prompt_title" = "Nieprawidłowy format";
"room_details_banned_users_section" = "Zbanowani użytkownicy";
"room_details_advanced_section" = "Zaawansowane";
"room_details_advanced_room_id" = "ID Pokoju:";
"room_details_advanced_enable_e2e_encryption" = "Włącz szyfrowanie \n(ostrzeżenie: nie może zostać wyłączone!)";
"room_details_advanced_e2e_encryption_enabled" = "Szyfrowanie jest włączone w tym pokoju";
"room_details_advanced_e2e_encryption_disabled" = "Szyfrowanie nie jest włączone w tym pokoju.";
"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Szyfruj wiadomości tylko do zaufanych urządzeń";
"room_details_set_main_address" = "Ustaw jako główny adres";
"room_details_unset_main_address" = "Nie ustawiaj jako główny adres";
"room_details_copy_room_id" = "Kopiuj ID pokoju";
"room_details_copy_room_address" = "Kopiuj adres pokoju";
"room_details_copy_room_url" = "Kopiuj URL Pokoju";
// Group Details
"group_details_title" = "Informacje o społeczności";
"group_details_people" = "Ludzie";
"group_details_rooms" = "Pokoje";
// Group Home
"group_home_one_member_format" = "1 członek";
"group_home_multi_members_format" = "%tu członków";
"group_home_one_room_format" = "1 pokój";
"group_home_multi_rooms_format" = "%tu pokojów";
"group_invitation_format" = "%@ zaprosił(a) Cię do przyłączenia się do tej Społeczności";
"group_participants_leave_prompt_title" = "Opuść grupę";
"group_participants_remove_prompt_title" = "Potwierdzenie";
"group_participants_invite_prompt_title" = "Potwierdzenie";
"group_participants_filter_members" = "Filtruj członków społeczności";
"group_participants_invite_malformed_id" = "Uszkodzony ID. Czy to powinien być Matrix ID podobny do '@localpart:domain'";
// Group rooms
"group_rooms_filter_rooms" = "Filtruj pokoje społeczności";
// Read Receipts
"read_receipts_list" = "Przeczytaj listę odbiorców";
"media_picker_select" = "Wybierz";
// Directory
"directory_title" = "Katalog";
"directory_server_picker_title" = "Wybierz katalog";
"directory_server_all_rooms" = "Wszystkie pokoje na serwerze %@";
"directory_server_type_homeserver" = "Wpisz serwer domowy, aby pobrać z niego listę publicznych pokoi";
"directory_server_placeholder" = "matrix.org";
"event_formatter_widget_added" = "widżet %@ został dodany przez %@";
"event_formatter_widget_removed" = "widżet %@ został usunięty przez %@";
"event_formatter_rerequest_keys_part1_link" = "Poproś ponownie o klucze szyfrujące";
"event_formatter_rerequest_keys_part2" = " z innych Twoich urządzeń.";
// Others
"or" = "lub";
"you" = "Ty";
"today" = "Dzisiaj";
"yesterday" = "Wczoraj";
// Room key request dialog
"e2e_room_key_request_title" = "Żądanie klucza szyfrującego";
"e2e_room_key_request_message_new_device" = "Dodałeś(-aś) nowe urządzenie '%@', które żąda kluczy szyfrujących.";
"e2e_room_key_request_message" = "Twoje niezweryfikowane urządzenie '%@' żąda kluczy szyfrujących.";
"e2e_room_key_request_start_verification" = "Rozpocznij weryfikację…";
"e2e_room_key_request_share_without_verifying" = "Udostępnij bez weryfikacji";
"gdpr_consent_not_given_alert_review_now_action" = "Przejrzyj teraz";
"deactivate_account_title" = "Dezaktywuj konto";
"deactivate_account_informations_part1" = "To sprawi, że Twoje konto stanie się na stałe niezdatne do użytku. Nie będziesz mógł się zalogować i nikt nie będzie mógł ponownie zarejestrować tego samego identyfikatora użytkownika. Spowoduje to, że Twoje konto opuści wszystkie pokoje, w których uczestniczy, i usunie dane Twojego konta z serwera tożsamości. ";
"deactivate_account_informations_part2_emphasize" = "Ta czynność jest nieodwracalna.";
"deactivate_account_informations_part3" = "\n\nDezaktywacja konta ";
"deactivate_account_informations_part4_emphasize" = "domyślnie nie powoduje zapomnienia wysłanych przez Ciebie wiadomości. ";
"deactivate_account_informations_part5" = "Jeśli chcesz, abyśmy zapomnieli o Twoich wiadomościach, zaznacz pole poniżej\n\nWidoczność wiadomości w Matrix jest podobna do wiadomości e-mail. Nasze zapomnienie wiadomości oznacza, że wysłane wiadomości nie będą udostępniane żadnym nowym lub niezarejestrowanym użytkownikom, ale zarejestrowani użytkownicy, którzy już mają dostęp do tych wiadomości, nadal będą mieli dostęp do ich kopii.";
"deactivate_account_forget_messages_information_part1" = "Proszę zapomnieć o wszystkich wiadomościach, które wysłałem, gdy moje konto zostało dezaktywowane (";
"deactivate_account_forget_messages_information_part2_emphasize" = "Ostrzeżenie";
"deactivate_account_forget_messages_information_part3" = ": spowoduje to, że przyszli użytkownicy zobaczą niepełny obraz rozmów)";
"deactivate_account_validate_action" = "Dezaktywuj konto";
"deactivate_account_password_alert_title" = "Dezaktywuj konto";
"deactivate_account_password_alert_message" = "Aby kontynuować, proszę wprowadzić swoje hasło";
// Re-request confirmation dialog
"rerequest_keys_alert_title" = "Prośba wysłana";
"rerequest_keys_alert_message" = "Uruchom proszę Riot na innym urządzeniu, które może odszyfrować wiadomość, aby wysłać klucze do tego urządzenia.";
"on" = "Włączone";
"video" = "Obraz";
"auth_forgot_password" = "Zapomniałeś(-aś) hasło?";
// Room recents
"room_recents_directory_section" = "KATALOG POKOJÓW";
// Rooms tab
"room_directory_no_public_room" = "Nie są dostępne publiczne pokoje";
"directory_cell_description" = "%tu pokojów";
// Chat participants
"room_participants_title" = "Uczestnicy";
"room_participants_add_participant" = "Dodaj uczestnika";
"room_participants_one_participant" = "1 uczestnik";
"room_participants_multi_participants" = "%d uczestników";
"room_participants_leave_prompt_msg" = "Czy napewno chcesz opuścić pokój?";
"room_participants_online" = "Dostępny(-a)";
"room_participants_offline" = "Niedostępny(-a)";
"room_participants_unknown" = "Nieznane";
"room_participants_action_section_other" = "Inny";
// Chat
"room_jump_to_first_unread" = "Przeskocz do pierwszej nieprzeczytanej wiadomości";
"room_new_message_notification" = "%d nowa wiadomość";
"room_new_messages_notification" = "%d nowych wiadomości";
"room_one_user_is_typing" = "%@ pisze…";
"room_two_users_are_typing" = "%@ i %@ piszą…";
"room_ongoing_conference_call" = "Przychodzące połączenie grupowe. Dołącz z %@ lub %@.";
"room_title_one_active_member" = "%@/%@ aktywnych członków";
"next" = "Następny";
"auth_untrusted_id_server" = "Serwer tożsamości nie jest zaufany";
"room_creation_appearance_picture" = "Obraz rozmowy (opcjonalne)";
"room_creation_private_room" = "Ta rozmowa jest prywatna";
"room_creation_public_room" = "Ta rozmowa jest publiczna";
"room_creation_make_public" = "Zrób publiczny";
"room_creation_make_public_prompt_title" = "Zrobić tą rozmowę publiczną?";
"room_creation_make_private" = "Zrób prywatny";
"search_in_progress" = "Wyszukiwanie…";
"contacts_address_book_no_contact" = "Brak lokalnych kontaktów";
"auth_msisdn_validation_error" = "Nie można zweryfikować numeru telefonu.";
"room_participants_invite_malformed_id" = "Uszkodzony ID. Powinien być adres e-mail lub Matrix ID podobny do '@localpart:domain'";
"room_unsent_messages_notification" = "Wiadomość nie została wysłana. Czy %@ lub %@ teraz?";
"room_ongoing_conference_call_with_close" = "Przychodzące połączenie grupowe. Dołącz z %@ lub z %@. %@ to.";
"directory_search_results_title" = "Przeglądaj wyniki katalogów";
"room_event_action_kick_prompt_reason" = "Powód wyrzucenia użytkownika";
"room_action_send_photo_or_video" = "Wyślij zdjęcie lub film";
"settings_mark_all_as_read" = "Oznacz wszystkie wiadomości jako przeczytane";
"settings_labs" = "LABORATORIUM";
"settings_sign_out_confirmation" = "Jesteś pewny(-a)?";
"settings_email_address" = "E-mail";
"settings_email_address_placeholder" = "Wprowadź adres e-mail";
"settings_add_email_address" = "Dodaj adres e-mail";
"settings_phone_number" = "Telefon";
"settings_add_phone_number" = "Dodaj numer telefonu";
"settings_night_mode" = "Tryb Nocny";
"settings_fail_to_update_profile" = "Nie udało się zaktualizować profilu";
"settings_show_decrypted_content" = "Pokaż odszyfrowaną zawartość";
"settings_fail_to_update_password" = "Nie udało się zaktualizować hasła";
"settings_crypto_export" = "Eksportuj klucze";
"room_details_people" = "Członkowie";
"room_details_access_section_invited_only" = "Tylko ludzie, którzy zostali zaproszeni";
"room_details_new_flair_placeholder" = "Dodaj nowe ID społeczności (np. +foo%@)";
"room_creation_keep_private" = "Zachowaj prywatny";
"auth_email_not_found" = "Nie udało się wysłać e-maila: Ten adres e-mail nie został znaleziony";
"auth_accept_policies" = "Przeczytaj i zaakceptuj zasady tego serwera domowego:";
"room_creation_wait_for_creation" = "Pokój jest już tworzony. Proszę czekaj.";
"room_creation_invite_another_user" = "Szukaj / zaproś przez ID Użytkownika, Nazwę lub e-mail";
"search_people_placeholder" = "Szukaj przez ID Użytkownika, Nazwę lub e-mail";
"contacts_user_directory_offline_section" = "KATALOG UŻYTKOWNIKA (offline)";
"room_participants_remove_prompt_msg" = "Czy na pewno chcesz usunąć %@ z tej rozmowy?";
"room_participants_invite_prompt_msg" = "Czy na pewno chcesz zaprosić %@ do tej rozmowy?";
"room_participants_invite_another_user" = "Szukaj / zaproś przez ID Użytkownika, Nazwę lub e-mail";
"room_event_action_report_prompt_ignore_user" = "Czy chcesz ukryć wszystkie wiadomości od tego użytkownika?";
"settings_sign_out_e2e_warn" = "Utracisz klucze szyfrowania end-to-end. Oznacza to, że nie będziesz już mógł czytać starych wiadomości w zaszyfrowanych pokojach na tym urządzeniu.";
"settings_surname" = "Nazwisko";
"settings_first_name" = "Imię";
"settings_unignore_user" = "Pokazać wszystkie wiadomości od %@?";
"settings_contacts_discover_matrix_users" = "Użyj e-maili i numerów telefonów do odkrycia użytkowników";
"settings_labs_e2e_encryption_prompt_message" = "Aby zakończyć konfigurowanie szyfrowania, musisz zalogować się ponownie.";
"room_details_mute_notifs" = "Wycisz powiadomienia";
// GDPR
"gdpr_consent_not_given_alert_message" = "Aby kontynuować korzystanie z serwera domowego %@, musisz przejrzeć i zaakceptować warunki użytkowania.";
"e2e_room_key_request_ignore_request" = "Zignoruj żądanie";
"widget_integration_room_not_visible" = "Pokój %@ nie jest widoczny.";
"widget_integration_missing_user_id" = "Brakujące user_id w żądaniu.";
"widget_integration_missing_room_id" = "Brakujące room_id w żądaniu.";
"widget_integration_no_permission_in_room" = "Nie masz pozwolenia na wykonanie tej akcji w tym pokoju.";
"widget_integration_must_be_in_room" = "Nie jesteś w tym pokoju.";
"widget_integration_positive_power_level" = "Poziom uprawnień musi być liczbą dodatnią.";
"widget_integration_room_not_recognised" = "Ten pokój nie jest rozpoznany.";
"widget_integration_failed_to_send_request" = "Nie udało się wysłać żądania.";
"widget_integration_unable_to_create" = "Nie można utworzyć widżetu.";
// Widget Integration Manager
"widget_integration_need_to_be_able_to_invite" = "Aby to zrobić musisz mieć możliwość zapraszania użytkowników.";
"widget_sticker_picker_no_stickerpacks_alert" = "Nie masz obecnie włączonych żadnych pakietów naklejek.";
"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Czy chcesz dodać teraz kilka?";
"widget_creation_failure" = "Utworzenie widżetu nie powiodło się";
// Widget
"widget_no_power_to_manage" = "Potrzebujesz uprawnień do zarządzania widżetami w tym pokoju";
"bug_report_send" = "Wyślij";
"bug_report_progress_zipping" = "Zbieranie dzienników";
"bug_report_progress_uploading" = "Wysyłanie raportu";
"bug_report_send_screenshot" = "Wyślij zrzut ekranu";
"bug_report_logs_description" = "W celu zdiagnozowania problemów, logi z tego klienta zostaną wysłane wraz z tym raportem o błędzie. Jeśli wolisz wysłać tylko powyższy tekst, odznacz:";
"bug_report_send_logs" = "Wyślij logi";
// Bug report
"bug_report_title" = "Zgłoś błąd";
"e2e_need_log_in_again" = "Należy się ponownie zalogować w celu wygenerowania kluczy szyfrowania end-to-end dla tego urządzenia i wysłania klucza publicznego do Twojego serwera domowego.\nJest to jednorazowe działanie; przepraszamy za trudności.";
// Crypto
"e2e_enabling_on_app_update" = "Riot obsługuje już szyfrowanie end-to-end (E2E), ale musisz zalogować się ponownie, aby je włączyć.\n\nMożesz to zrobić teraz lub później z poziomu ustawień aplikacji.";
// No VoIP support
"no_voip_title" = "Połączenie przychodzące";
"call_incoming_video" = "Przychodzące połączenie wideo…";
"call_incoming_voice" = "Połączenie przychodzące…";
"call_incoming_video_prompt" = "Przychodzące połączenie wideo od %@";
// Call
"call_incoming_voice_prompt" = "Przychodzące połączenie głosowe od %@";
"do_not_ask_again" = "Nie pytaj ponownie";
+1 -1
View File
@@ -2,4 +2,4 @@
"NSCameraUsageDescription" = "Kamera përdoret për të bërë foto dhe regjistruar video, dhe për të bërë thirrje video.";
"NSPhotoLibraryUsageDescription" = "Fototeka përdoret për të dërguar foto dhe video.";
"NSMicrophoneUsageDescription" = "Mikrofoni përdoret për të regjistruar video, dhe për të bërë thirrje.";
"NSContactsUsageDescription" = "Libri i kontakteve përdoret për të kërkuar për përdorues sipas email-i ose numri telefoni në Riot.";
"NSContactsUsageDescription" = "Që të mund tju shfaqim se cilët prej kontakteve tuaj përdorin tashmë Riot ose Matrix, mund të dërgojmë adresat email dhe numrat e telefonave nga libri juaj i adresave te Shërbyesi Matrix i Identiteteve. Vektori i ri nuk i depoziton këto të dhëna apo ti përdorë për ndonjë qëllim tjetër. Për më tepër të dhëna, shihni faqen e rregullave të privatësisë, te rregullimet e aplikacionit.";
+181 -21
View File
@@ -5,7 +5,7 @@
"title_groups" = "Bashkësi";
"warning" = "Sinjalizim";
// Actions
"view" = "Shiheni";
"view" = "Parje";
"next" = "Pasuesja";
"back" = "Mbrapsht";
"continue" = "Vazhdo";
@@ -99,7 +99,7 @@
"people_conversation_section" = "BISEDA";
"people_no_conversation" = "Ska biseda";
// Rooms tab
"room_directory_no_public_room" = "Sk a dhoma publike";
"room_directory_no_public_room" = "Ska dhoma publike";
// Groups tab
"group_invite_section" = "FTESA";
"group_section" = "BASHKËSI";
@@ -108,7 +108,7 @@
"search_messages" = "Mesazhe";
"search_people" = "Persona";
"search_files" = "Kartela";
"search_default_placeholder" = "Kërko";
"search_default_placeholder" = "Kërkoni";
"search_people_placeholder" = "Kërkoni sipas ID-je Përdoruesi, Emri ose email-i";
"search_no_result" = "Ska përfundime";
"search_in_progress" = "Po kërkohet…";
@@ -153,9 +153,9 @@
"room_participants_action_invite" = "Ftoje";
"room_participants_action_leave" = "Braktiseni këtë dhomë";
"room_participants_action_remove" = "Hiqeni prej kësaj dhome";
"room_participants_action_unban" = "Zhdëboje";
"room_participants_action_set_default_power_level" = "Riktheje në përdorues normal";
"room_participants_action_set_moderator" = "Kaloje moderator";
"room_participants_action_unban" = "Hiqi dëbimin";
"room_participants_action_set_default_power_level" = "Rikthejeni në përdorues normal";
"room_participants_action_set_moderator" = "Kalojeni moderator";
"room_participants_action_set_admin" = "Kalojeni përgjegjës";
"room_participants_action_start_new_chat" = "Filloni fjalosje të re";
"room_participants_action_start_voice_call" = "Nis thirrje audio";
@@ -167,10 +167,10 @@
"room_new_messages_notification" = "%d mesazhe të rinj";
"room_one_user_is_typing" = "%@ po shtyp…";
"room_two_users_are_typing" = "%@ & %@ po shtypin…";
"room_many_users_are_typing" = "%@, %@ & të tjerë po shtyin…";
"room_message_placeholder" = "Dërgojni një mesazh (të pafshehtëzuar)…";
"room_many_users_are_typing" = "%@, %@ & të tjerë po shtypin…";
"room_message_placeholder" = "Dërgoni një mesazh (të pafshehtëzuar)…";
"room_do_not_have_permission_to_post" = "Skeni leje të postoni në këtë dhomë";
"encrypted_room_message_placeholder" = "Dërgoni një mesazh të fshehtëzuar…";
"encrypted_room_message_placeholder" = "Dërgoni një mesazhi të fshehtëzuar…";
"room_message_short_placeholder" = "Dërgoni një mesazh…";
"room_offline_notification" = "Humbi lidhja me shërbyesin.";
"room_unsent_messages_notification" = "Mesazhet su dërguan. %@ apo %@ tani?";
@@ -249,7 +249,7 @@
"settings_ui_theme_dark" = "E errët";
"settings_ui_theme_black" = "E zezë";
"settings_ui_theme_picker_title" = "Përzgjidhni temë";
"settings_unignore_user" = "Shfaq krejt mesazhet nga %@?";
"settings_unignore_user" = "Të shfaqen krejt mesazhet nga %@?";
"settings_contacts_phonebook_country" = "Vend libri telefonash";
"settings_labs_e2e_encryption" = "Fshehtëzim Skaj-Më-Skaj";
"settings_version" = "Version %@";
@@ -304,7 +304,7 @@
"room_details_advanced_e2e_encryption_enabled" = "Në këtë dhomë është i aktivizuar fshehtëzimi";
"room_details_advanced_e2e_encryption_disabled" = "Në këtë dhomë s’është i aktivizuar fshehtëzimi.";
"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Fshehtëzo vetëm për pajisje të verifikuara";
"room_details_fail_to_add_room_aliases" = "Su arrit të shtoheshin adresa dhome të re";
"room_details_fail_to_add_room_aliases" = "Sarrihet të shtohen adresa dhomash të reja";
"room_details_save_changes_prompt" = "Doni të ruhen ndryshimet?";
"room_details_set_main_address" = "Caktoje si Adresë Kryesore";
"room_details_unset_main_address" = "Hiqe Nga Adresë Kryesore";
@@ -351,7 +351,7 @@
"you" = "Ju";
"today" = "Sot";
"yesterday" = "Dje";
"network_offline_prompt" = "Lidhja Internet duket se është jashtë linje.";
"network_offline_prompt" = "Lidhja Internet duket se sfunksionin.";
"public_room_section_title" = "Dhoma Publike (at %@):";
"do_not_ask_again" = "Mos pyet sërish";
// Call
@@ -384,12 +384,172 @@
"e2e_room_key_request_share_without_verifying" = "Ndaje pa e verifikuar";
"e2e_room_key_request_ignore_request" = "Shpërfille kërkesën";
"auth_user_id_placeholder" = "Email ose emër përdoruesi";
"auth_invalid_user_name" = "Emri përdoruesi mund të përmban vetëm shkronja, numra, pika, viza lidhëse dhe nënvije";
"auth_reset_password_email_validation_message" = "Një e-mail të është dërguar%@. Pasi ke ndjekur lidhjen që përmban, kliko përfundi.";
"auth_reset_password_next_step_button" = "Kam vërtetuar adresën e-mail-i time";
"on" = "Aktivizuar";
"auth_add_phone_message" = "Shtoja një adresë e-mail-i llogarisë tënde për të mundur përdoruesit të te zbulojnë.";
"auth_msisdn_validation_message" = "Kemi dërguar një SMS me një kod aktivizimi. lutem fute kodin përposh.";
"auth_recaptcha_message" = "Ky server shtëpiak kishte dashur të sigurohet se nuk je robot";
"auth_reset_password_error_unauthorized" = "Vërtetimi i adresës e-mail-i dështoi: sigurohu se ke klikuar lidhjen e-mail";
"auth_reset_password_error_not_found" = "Adresa e-mail-i yt nuk duket se është e lidhur me një ID matrix-i në këtë server shtëpiak.";
"auth_invalid_user_name" = "Emrat e përdoruesve mund të përmba vetëm shkronja, numra, pika, vija ndarëse dhe nënvija";
"auth_reset_password_email_validation_message" = "Te %@ u dërgua një email. Pasi ndiqni lidhjen që përmban, klikoni më poshtë.";
"auth_reset_password_next_step_button" = "E kam verifikuar adresën time email";
"on" = "On";
"auth_add_phone_message" = "Shtoni te llogaria juaj një numër telefoni, për tu dhënë mundësinë përdoruesve tju zbulojnë.";
"auth_msisdn_validation_message" = "Kemi dërguar një SMS me një kod aktivizimi. Ju lutemi, jepeni këtë kod më posh.";
"auth_recaptcha_message" = "Ky Shërbyes Home do të donte të sigurohej se sjeni robot";
"auth_reset_password_error_unauthorized" = "Verifikimi i adresës email dështoi: sigurohuni se keni klikuar lidhjen te email-i";
"auth_reset_password_error_not_found" = "Adresa juaj email sduket të jetë e përshoqëruar me ID Matrix në këtë shërbyes Home.";
"title_favourites" = "Të parapëlqyer";
"join" = "Merrni pjesë";
"auth_add_email_message" = "Shtoni te llogaria juaj një adresë email, për tu dhënë mundësinë përdoruesve tju zbulojnë dhe që tju lejojë të ricaktoni fjalëkalimin.";
"auth_add_email_phone_message" = "Shtoni te llogaria juaj një adresë email dhe/ose një numër telefoni, për tu dhënë mundësinë përdoruesve tju zbulojnë. Adresa email do tju lejojë edhe të ricaktoni fjalëkalimin tuaj.";
"auth_add_email_and_phone_message" = "Shtoni te llogaria juaj një adresë email dhe një numër telefoni, për tu dhënë mundësinë përdoruesve tju zbulojnë. Adresa email do tju lejojë edhe të ricaktoni fjalëkalimin tuaj.";
"auth_use_server_options" = "Përdor mundësi vetjake shërbyesi (e përparuar)";
"auth_add_email_and_phone_warning" = "Regjistrimi me email dhe me numër telefoni njëherazi nuk mbulohet ende, deri sa të ketë API. Do të merret parasysh vetëm numri i telefonit. Email-in tuaj mund ta shtoni te profili juaj, te rregullimet.";
"room_creation_appearance_picture" = "Foto fjalosjeje (në daçi)";
"room_creation_invite_another_user" = "Kërkoni / ftoni sipas ID-je Përdoruesi, Emri ose email-i";
"room_recents_favourites_section" = "TË PARAPALQYERA";
"room_recents_server_notice_section" = "SINJALIZIME SISTEMI";
"room_recents_join_room_title" = "Hyni në një dhomë";
"room_participants_invite_another_user" = "Kërkoni / ftoni sipas ID-je Përdoruesi, Emri ose email-i";
"room_participants_action_ignore" = "Fshihi krejt mesazhet nga ky përdorues";
"room_participants_action_unignore" = "Shfaq krejt mesazhet nga ky përdorues";
"room_message_reply_to_placeholder" = "Dërgoni një përgjigje (të pafshehtëzuar)…";
"encrypted_room_message_reply_to_placeholder" = "Dërgoni një përgjigje të fshehtëzuar…";
"room_message_reply_to_short_placeholder" = "Dërgoni një përgjigje…";
"room_resend_unsent_messages" = "Ridërgo mesazhet e padërguara";
"room_event_action_view_decrypted_source" = "Shihni Burim të Shfshehtëzuar";
"room_event_action_kick_prompt_reason" = "Arsye për përzënien e këtij përdoruesi";
"room_event_action_ban_prompt_reason" = "Arsye për dëbimin e këtij përdoruesi";
"room_action_send_photo_or_video" = "Dërgoni foto ose video";
"room_replacement_link" = "Biseda vazhdon këtu.";
"room_predecessor_link" = "Klikoni këtu për të parë mesazhe më të vjetër.";
"room_resource_limit_exceeded_message_contact_1" = " Ju lutemi, ";
"room_resource_limit_exceeded_message_contact_2_link" = "lidhuni me përgjegjësin tuaj të shërbimit";
"room_resource_limit_exceeded_message_contact_3" = " që të vazhdoni përdorimin e këtij shërbimi.";
"room_resource_usage_limit_reached_message_2" = "disa përdorues sdo të jenë në gjendje të bëjnë hyrjen.";
"room_resource_usage_limit_reached_message_contact_3" = " për ta zmadhuar këtë kufi.";
// Unknown devices
"unknown_devices_alert_title" = "Dhoma përmban pajisje të panjohura";
"settings_deactivate_account" = "ÇAKTIVIZOJE LLOGARINË";
"settings_fail_to_update_profile" = "Sarrihet të përditësohet profili";
"settings_pin_rooms_with_missed_notif" = "Fikso dhomat me njoftime të humbura";
"settings_pin_rooms_with_unread" = "Fikso dhomat me mesazhe të palexuar";
"settings_labs_create_conference_with_jitsi" = "Krijoni thirrje konferencë me Jitsi-n";
"settings_fail_to_update_password" = "Sarrihet të përditësohet fjalëkalimi";
"settings_deactivate_my_account" = "Çaktivizoje llogarinë time";
"room_details_mute_notifs" = "Heshtoji njoftimet";
"room_details_access_section_no_address_warning" = "Që të lidhni një dhomë, ajo duhet të ketë një adresë";
"room_details_new_address_placeholder" = "Shtoni adresë të re (p.sh. #foo%@)";
"room_details_new_flair_placeholder" = "Shtoni ID bashkësie të re (e.g. +foo%@)";
"room_details_fail_to_update_avatar" = "Sarrihet të përditësohet fotoja e dhomës";
"room_details_fail_to_update_room_name" = "Sarrihet të përditësohet emri i dhomës";
"room_details_fail_to_update_topic" = "Sarrihet të përditësohet tema";
"room_details_fail_to_update_room_join_rule" = "Sarrihet të përditësohet rregulli për pjesëmarrje";
"room_details_fail_to_update_room_directory_visibility" = "Sarrihet të përditësohet dukshmëria e drejtorisë së dhomave";
"room_details_fail_to_update_history_visibility" = "Sarrihet të përditësohet dukshmëria e historikut";
"room_details_fail_to_remove_room_aliases" = "Sarrihet të hiqen adresat e dhomave";
"room_details_fail_to_update_room_canonical_alias" = "Sarrihet të përditësohet adresa kryesore";
"room_details_fail_to_update_room_communities" = "Sarrihet të përditësohen bashkësitë e afërta";
"room_details_fail_to_enable_encryption" = "Sarrihet të aktivizohet fshehtëzimi në këtë dhomë";
"group_home_multi_members_format" = "Anëtarë %tu";
"group_home_multi_rooms_format" = "Dhoma %tu";
"group_participants_invite_another_user" = "Kërkoni / ftoni sipas ID-je Përdoruesi ose Emri";
"directory_server_all_native_rooms" = "Krejt dhomat origjinale nën Matrix";
"event_formatter_widget_added" = "Widget-i %@ u shtua nga %@";
"event_formatter_widget_removed" = "Widget-i %@ u hoq nga %@";
"event_formatter_rerequest_keys_part1_link" = "Rikërko kyçe fshehtëzimi";
"event_formatter_rerequest_keys_part2" = " nga pajisje tuajat të tjera.";
// Others
"or" = "ose";
"homeserver_connection_lost" = "Su lidh dot te shërbyesi Home.";
"call_jitsi_error" = "S'u arrit të hyhej në thirrjen për konferencë.";
"widget_creation_failure" = "Krijimi i widget-it dështoi";
"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Të shtohen ca tani?";
"widget_integration_room_not_visible" = "Dhoma %s s’është e dukshme.";
"gdpr_consent_not_given_alert_review_now_action" = "Shqyrtojini tani";
"deactivate_account_title" = "Çaktivizoni Llogarinë";
"deactivate_account_informations_part2_emphasize" = "Ky veprim është i paprapakthyeshëm.";
"deactivate_account_informations_part3" = "\n\nÇaktivizimi i llogarisë tuaj, ";
"deactivate_account_forget_messages_information_part2_emphasize" = "Kujdes";
"deactivate_account_validate_action" = "Çaktivizoje llogarinë";
"deactivate_account_password_alert_title" = "Çaktivizoni Llogarinë";
"deactivate_account_password_alert_message" = "Që të vazhdohet, ju lutemi, jepni fjalëkalimin tuaj";
// Re-request confirmation dialog
"rerequest_keys_alert_title" = "Kërkesa u Dërgua";
"auth_reset_password_success_message" = "Fjalëkalimi juaj u ri caktua.\n\nËshtë bërë dalja juaj nga llogaria në krejt pajisjet dhe sdo të merrni më njoftime push. Për riaktivizim të njoftimeve, ribëni hyrjen në çdo pajisje.";
"room_creation_make_public_prompt_msg" = "Jeni i sigurt se doni ta bëni publike këtë fjalosje? Në një të tillë, mesazhet tuaj mund ti lexojë cilido dhe mund të hyjë në bisedë.";
"room_creation_wait_for_creation" = "Po krijohet tashmë një dhomë, Ju lutemi, prisni.";
"contacts_address_book_permission_required" = "Lypset leje për hyrje në kontaktet vendore";
"contacts_address_book_permission_denied" = "Se lejuat Riot-i të hyjë në kontaktet tuaja vendore";
"room_participants_remove_third_party_invite_msg" = "Heqja e ftesave nga palë të treta nuk mbulohet ende, derisa të kihet API";
"room_participants_invite_malformed_id" = "ID e keqformuar. Duhet të jetë një adresë email ose ID Matrix, si '@localpart:domain'";
"room_participants_action_ban" = "Dëboje nga kjo dhomë";
"room_unsent_messages_unknown_devices_notification" = "Mesazhi su dërgua, për shkak të pranisë së pajisjeve të panjohura. %@ apo %@ tani?";
"room_ongoing_conference_call" = "Thirrje konference që po zhvillohet. Merrni pjesë si %@ ose %@.";
"room_ongoing_conference_call_with_close" = "Thirrje konference që po zhvillohet. Merrni pjesë si %@ ose %@. %@.";
"room_conference_call_no_power" = "Ju duhen leje për të administruar thirrje konferencë në këtë dhomë";
"room_event_action_share" = "Ndajeni me të tjerë";
"room_event_action_report_prompt_ignore_user" = "Doni të fshihen krejt mesazhet nga ky përdorues?";
"room_warning_about_encryption" = "Fshehtëzimi skaj-më-skaj është në fazën beta dhe mund të mos jetë i qëndrueshëm.\n\nSduhet ti zini ende besë për sigurim të dhënash.\n\nPajisjet sdo të jenë ende në gjendje të shfshehtëzojnë historik nga periudha përpara se të merrnin pjesë te dhomë.\n\nMesazhet e fshehtëzuar sdo të jenë të dukshëm në klientë që nuk sendërtojnë ende fshehtëzimin.";
"room_replacement_information" = "Kjo dhomë është zëvendësuar dhe s’është më aktive.";
"room_predecessor_information" = "Kjo dhomë është një vazhdim i një bisede tjetër.";
"room_resource_usage_limit_reached_message_1_default" = "Ky shërbyes home ka tejkaluar një nga kufijtë mbi burimet, ndaj ";
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Ky shërbyes home ka tejkaluar kufirin Përdorues Aktivë Mujorë, ndaj ";
"unknown_devices_alert" = "Kjo dhomë përmban pajisje të panjohura që sjanë verifikuar.\nKjo do të thotë se nuk ka garanci se pajisjet u përkasin përdoruesve që pretendojnë se u përkasin.\nPërpara se të vazhdoni, këshillojmë që të kaloni në proces verifikimi çdo pajisje, por mund të ridërgoni mesazhin pa verifikuar gjë, nëse parapëlqeni kështu.";
"room_preview_subtitle" = "Kjo është një paraparje e kësaj dhome. Ndërveprimet në dhomë janë çaktivizuar.";
"room_preview_unlinked_email_warning" = "Kjo ftesë i qe dërguar %@, që s’është i përshoqëruar me këtë llogari. Mund të doni të hyni me një llogari tjetër, ose ta shtoni këtë email te kjo llogari.";
"room_preview_try_join_an_unknown_room" = "Po përpiqeni të hyni në %@. Do të donit të bëheni pjesë, që të mundni të merrni pjesë te diskutimi?";
"settings_sign_out_e2e_warn" = "Do të humbni kyçet tuaj të fshehtëzimit skaj-më-skaj. Kjo do të thotë se sdo të jeni më në gjendje të lexoni mesazhe të vjetër te dhoma të fshehtëzuara në këtë pajisje.";
"settings_surname" = "Mbiemër";
"settings_global_settings_info" = "Rregullimet globale për njoftime i gjeni te klienti juaj %@ web";
"settings_on_denied_notification" = "Njoftimet për %@ spranohen, ju lutemi, lejojini që nga rregullimet e pajisjes tuaj";
"settings_enable_callkit" = "Thirrje të integruara";
"settings_callkit_info" = "Merrini thirrjet ardhëse edhe me ekran të kyçur. Shihni thirrjet tuaja nën Riot te historiku i thirrjeve të sistemit. Nëse iCloud është i aktivizuar, ky historik thirrjesh do ti jepet kompanisë Apple.";
"settings_ui_theme_picker_message" = "\"Auto\" përdor rregullimet Përmbysi Ngjyrat\" të pajisjes tuaj";
"settings_contacts_discover_matrix_users" = "Përdorni email-e dhe numra telefoni për të gjetur përdorues";
"settings_labs_e2e_encryption_prompt_message" = "Që të përfundohet rregullimi i fshehtëzimit duhet të ribëni hyrjen në llogari.";
"settings_labs_room_members_lazy_loading" = "<em>Lazy-load</em> anëtarët e dhomave";
"settings_labs_room_members_lazy_loading_error_message" = "Shërbyesi juaj nuk e mbulon ende <em>lazy loading</em> e anëtarëve të dhomës. Provoni më vonë.";
"settings_olm_version" = "Version Olm %@";
"settings_send_crash_report" = "Dërgo të dhëna anonime vithisjesh & përdorimi";
"room_details_access_section_anyone_apart_from_guest" = "Cilido që di lidhjen e dhomës, hiq vizitorët";
"room_details_access_section_anyone" = "Cilido që di lidhjen e dhomës, përfshi vizitorë";
"room_details_history_section_members_only" = "Vetëm anëtarët (që nga çasti i përzgjedhjes së kësaj mundësie)";
"room_details_history_section_prompt_msg" = "Ndryshime se cilët mund të lexojnë historikun do të vlejnë vetëm për mesazhe të ardhshëm në këtë dhomë. Dukshmëria e historikut ekzistues nuk do të ndryshohet.";
"room_details_addresses_disable_main_address_prompt_msg" = "Sdo të keni adresë kryesore të specifikuar. Adresa kryesore parazgjedhje për këtë dhomë do të zgjidhet në tym";
"room_details_advanced_enable_e2e_encryption" = "Aktivizo fshehtëzim (kujdes: smund të çaktizohet më!)";
"room_details_advanced_e2e_encryption_prompt_message" = "Fshehtëzimi skaj-më-skaj është eksperimental dhe mund të mos jetë i qëndrueshëm.\n\nSduhet ti zini ende besë për sigurim të dhënash.\n\nPajisjet sdo të jenë ende në gjendje të shfshehtëzojnë historik nga periudha përpara se të merrnin pjesë te dhomë.\n\nPasi të jetë aktivizuar fshehtëzimi për një dhomë, smund të çaktivizohet më (hëpërhë).\n\nMesazhet e fshehtëzuar sdo të jenë të dukshëm në klientë që nuk sendërtojnë ende fshehtëzimin.";
"room_details_fail_to_update_room_guest_access" = "Sarrihet të përditësohet mundësia e hyrjes në dhomë të vizitorëve";
"group_participants_invite_malformed_id" = "ID e keqformuar. Duhet të jetë një ID Matrix, si '@localpart:domain'";
"directory_server_type_homeserver" = "Shtypni një shërbyes home që të paraqiten dhoma publike prej tij";
"bug_report_prompt" = "Herën e fundit aplikacioni u vithis. Do të donit të parashtroni një raport vithisje?";
"rage_shake_prompt" = "Duket se po përplasni telefonin nga inati. Do të donit të parashtroni një njoftim të mete?";
"camera_access_not_granted" = "%@ ska leje të përdorë Kamerën, ju lutemi, ndryshoni rregullimet e privatësisë";
"large_badge_value_k_format" = "%.1fK";
"no_voip" = "%@ po ju thërret, por %@ nuk mbulon ende thirrje.\nMund ta shpërfillni këtë njoftim dhe ti përgjigjeni thirrjes prej një tjetër pajisjeje, ose mund të mos e pranoni.";
// Crash report
"google_analytics_use_prompt" = "Do të donit të ndihmoni në përmirësimin e %@-it duke parashtruar automatikisht dhe në mënyrë anonime raporte vithisjesh dhe të dhëna përdorimi?";
// Crypto
"e2e_enabling_on_app_update" = "Riot tani mbulon fshehtëzim skaj-më-skaj, por lypset të ribëni hyrjen që ta aktivizoni.\n\nMund ta bëni tani ose më vonë, që prej rregullimeve të aplikacionit.";
"bug_report_description" = "Ju lutemi, përshkruajeni të metën. Ç’po bënit? Ç’prisnit të ndodhte? Ç’ndodhi në fakt?";
"bug_crash_report_description" = "Ju lutemi, përshkruani ç’po bënit para vithisjes:";
"bug_report_logs_description" = "Që të mund të diagnostikohen probleme, regjistra prej këtij klienti do të dërgohen tok me këtë njoftim të metash. Nëse do të parapëlqenit të dërgohej vetëm teksti më sipër, ju lutemi, hiqjani shenjën kutizës:";
// Widget
"widget_no_power_to_manage" = "Ju duhen leje për të administruar widget-e në këtë dhomë";
"widget_sticker_picker_no_stickerpacks_alert" = "Hëpërhë, skeni të aktivizuar ndonjë pako ngjitësash.";
// Widget Integration Manager
"widget_integration_need_to_be_able_to_invite" = "Që ta bëni këtë, lypset të jeni në gjendje të ftoni përdorues.";
// Share extension
"share_extension_auth_prompt" = "Që të ndani lëndë me të tjerët, bëni hyrjen te aplikacioni kryesor";
"share_extension_failed_to_encrypt" = "Su arrit të dërgohej. Kontrolloni te aplikacioni kryesor rregullimet e fshehtëzimit për këtë dhomë";
"e2e_room_key_request_message_new_device" = "Shtuat një pajisje të re '%@', e cila po kërkon kyçe fshehtëzimi.";
"e2e_room_key_request_message" = "Pajisja juaj e paverifikuar '%@' po kërkon kyçe fshehtëzimi.";
// GDPR
"gdpr_consent_not_given_alert_message" = "Që të vazhdohet të përdoret shërbyesi home %@, duhet të shqyrtoni dhe pajtoheni me termat dhe kushtet.";
"deactivate_account_informations_part1" = "Kjo do ta bëjë përgjithnjë të papërdorshëm llogarinë tuaj. Nuk do të jeni në gjendje të bëni hyrjen në të, dhe askush sdo të jetë në gjendje të rrregjistrohet me të njëjtën ID përdoruesi. Kjo do të sjellë daljen e llogarisë tuaj nga krejt dhomat në të cilat po merr pjesë, dhe do të heqë nga shërbyesi i identitetit tuaj hollësitë e llogarisë tuaj. ";
"deactivate_account_informations_part4_emphasize" = "si parazgjedhje, nuk na bën të harrojmë mesazhet që keni dërguar. ";
"deactivate_account_informations_part5" = "Nëse do të donit që të harrohen mesazhet tuaj, ju lutemi, i vini shenjë kutizës më poshtë\n\nDukshmëria e mesazheve në Matrix është e ngjashme me atë në email. Harrimi i mesazheve nga ana jonë do të thotë që mesazhet që keni dërguar nuk do të ndahen me çfarëdo përdoruesi të ri apo të paregjistruar, por përdoruesit e regjistruar, që kanë tashmë hyrje në këto mesazhe, do të kenë prapëseprapë hyrje te kopja e tyre.";
"deactivate_account_forget_messages_information_part1" = "Të lutem, harro krejt mesazhet që kamë dërguar, kur të çaktivizohet llogaria ime (";
"deactivate_account_forget_messages_information_part3" = ": kjo do të bëjë që përdorues të ardhshëm të shohin një pamje jo të plotë të bisedave)";
"rerequest_keys_alert_message" = "Ju lutemi, niseni Riot-in në një tjetër pajisje që mundet të shfshehtëzojë mesazhin, që kështu të mund të dërgojë kyçet te kjo pajisje.";
"room_event_action_redact" = "Redaktojeni";
"e2e_need_log_in_again" = "Që të prodhohen kyçe fshehtëzimi skaj-më-skaj për këtë pajisje, lypset të ribëni hyrjen dhe të parashtroni kyçin publik te shërbyesi juaj homë.\nKjo duhet vetëm një herë; na ndjeni për belanë.";
"room_action_send_sticker" = "Dërgoni ngjitës";
"settings_flair" = "Shfaq simbole, kur lejohet";
"room_details_flair_section" = "Shfaq simbole për bashkësi";
"auth_accept_policies" = "Ju lutemi, shqyrtoni dhe pranoni rregullat e këtij shërbyesi Home:";
+5
View File
@@ -0,0 +1,5 @@
// Permissions usage explanations
"NSCameraUsageDescription" = "Камера використовується для знімків фото і відео, а також для відео-викликів.";
"NSPhotoLibraryUsageDescription" = "Фотографії використовуються для надсилання фото і відео.";
"NSMicrophoneUsageDescription" = "Мікрофон використовується для відео і викликів.";
"NSContactsUsageDescription" = "Щоб показати, які з ваших контактів вже використовують Riot чи Matrix, ми можемо надіслати адреси електронної пошти і номери телефонів з вашої адресної книги до вашого сервера ідентифікації Matrix. Новий Vector не зберігає і не використовує ці дані. Для докладних відомостей ознайомтеся зі сторінкою політики приватності в налаштуваннях додатку.";
+52
View File
@@ -0,0 +1,52 @@
/* New message from a specific person, not referencing a room */
"MSG_FROM_USER" = "Повідомлення від %@";
/* New message from a specific person in a named room */
"MSG_FROM_USER_IN_ROOM" = "%@ пише в %@";
/* New message from a specific person, not referencing a room. Content included. */
"MSG_FROM_USER_WITH_CONTENT" = "%@: %@";
/* New message from a specific person in a named room. Content included. */
"MSG_FROM_USER_IN_ROOM_WITH_CONTENT" = "%@ в %@: %@";
/* New action message from a specific person, not referencing a room. */
"ACTION_FROM_USER" = "* %@ %@";
/* New action message from a specific person in a named room. */
"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@";
/* New action message from a specific person, not referencing a room. */
"IMAGE_FROM_USER" = "%@ надсилає вам зображення %@";
/* New action message from a specific person in a named room. */
"IMAGE_FROM_USER_IN_ROOM" = "%@ оприлюднює зображення %@ в %@";
/* A single unread message in a room */
"SINGLE_UNREAD_IN_ROOM" = "Ви отримали повідомлення в %@";
/* A single unread message */
"SINGLE_UNREAD" = "Ви отримали повідомлення";
/* Multiple unread messages in a room */
"UNREAD_IN_ROOM" = "%@ нових повідомлень в %@";
/* Multiple unread messages from a specific person, not referencing a room */
"MSGS_FROM_USER" = "%@ нових повідомлень в %@";
/* Multiple unread messages from two people */
"MSGS_FROM_TWO_USERS" = "%@ нових повідомлень від %@ і %@";
/* Multiple unread messages from three people */
"MSGS_FROM_THREE_USERS" = "%@ нових повідомлень від %@, %@ і %@";
/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */
"MSGS_FROM_TWO_PLUS_USERS" = "%@ нових повідомлень від %@, %@ та інших";
/* Multiple messages in two rooms */
"MSGS_IN_TWO_ROOMS" = "%@ нових повідомлень в %@ і %@";
/* Look, stuff's happened, alright? Just open the app. */
"MSGS_IN_TWO_PLUS_ROOMS" = "%@ нових повідомлень в %@, %@ та інших";
/* A user has invited you to a chat */
"USER_INVITE_TO_CHAT" = "%@ запрошує вас до чату";
/* A user has invited you to an (unamed) group chat */
"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ запрошує вас до групового чату";
/* A user has invited you to a named room */
"USER_INVITE_TO_NAMED_ROOM" = "%@ запрошує вас до %@";
/* Incoming one-to-one voice call */
"VOICE_CALL_FROM_USER" = "Виклик від %@";
/* Incoming one-to-one video call */
"VIDEO_CALL_FROM_USER" = "Відео-виклик від %@";
/* Incoming unnamed voice conference invite from a specific person */
"VOICE_CONF_FROM_USER" = "Груповий виклик від %@";
/* Incoming unnamed video conference invite from a specific person */
"VIDEO_CONF_FROM_USER" = "Груповий відео-виклик від %@";
/* Incoming named voice conference invite from a specific person */
"VOICE_CONF_NAMED_FROM_USER" = "Груповий виклик від %@: '%@'";
/* Incoming named video conference invite from a specific person */
"VIDEO_CONF_NAMED_FROM_USER" = "Груповий відео-виклик від %@: '%@'";
+83
View File
@@ -0,0 +1,83 @@
// Titles
"title_home" = "Домівка";
"title_favourites" = "Обране";
"title_people" = "Люди";
"title_rooms" = "Кімнати";
"title_groups" = "Спільноти";
"warning" = "Попередження";
// Actions
"view" = "Вигляд";
"next" = "Далі";
"back" = "Назад";
"continue" = "Продовжити";
"create" = "Створити";
"start" = "Почати";
"leave" = "Вийти";
"remove" = "Вилучити";
"invite" = "Запросити";
"retry" = "Повторити";
"on" = "Увімк";
"off" = "Вимк";
"cancel" = "Скасувати";
"save" = "Зберегти";
"join" = "Приєднатися";
"decline" = "Відхилити";
"accept" = "Прийняти";
"preview" = "Попередній перегляд";
"camera" = "Камера";
"voice" = "Голос";
"video" = "Відео";
"active_call" = "Активний виклик";
"active_call_details" = "Активний виклик (%@)";
"later" = "Пізніше";
"rename" = "Перейменувати";
"collapse" = "згорнути";
"send_to" = "Надіслати до %@";
"sending" = "Надсилання";
// Authentication
"auth_login" = "Увійти";
"auth_register" = "Зареєструватися";
"auth_submit" = "Відправити";
"auth_skip" = "Пропустити";
"auth_send_reset_email" = "Надіслати лист для відновлення";
"auth_return_to_login" = "Повернутися на екран входу";
"auth_user_id_placeholder" = "Е-пошта чи ім'я користувача";
"auth_password_placeholder" = "Пароль";
"auth_new_password_placeholder" = "Новий пароль";
"auth_user_name_placeholder" = "Ім'я користувача";
"auth_optional_email_placeholder" = "Адреса е-пошти (необов'язково)";
"auth_email_placeholder" = "Адреса е-пошти";
"auth_optional_phone_placeholder" = "Номер телефону (необов'язково)";
"auth_phone_placeholder" = "Номер телефону";
"auth_repeat_password_placeholder" = "Повторіть пароль";
"auth_repeat_new_password_placeholder" = "Підтвердьте новий пароль";
"auth_home_server_placeholder" = "URL (наприклад, https://matrix.org)";
"auth_identity_server_placeholder" = "URL (наприклад, https://matrix.org)";
"auth_invalid_login_param" = "Неправильне ім'я користувача або пароль";
"auth_invalid_user_name" = "Імена користувачів можуть містити лише літери, цифри, крапки, дефіси й підкреслення";
"auth_invalid_password" = "Пароль надто короткий (мінімум 6 знаків)";
"auth_invalid_email" = "Схоже, це недійсна адреса е-пошти";
"auth_invalid_phone" = "Схоже, це недійсний номер телефону";
"auth_missing_password" = "Відсутній пароль";
"auth_add_email_message" = "Додайте адресу е-пошти до свого облікового запису, щоб користувачі могли знаходити вас, а також для можливості відновлення пароля.";
"auth_add_phone_message" = "Додайте номер телефону до свого облікового запису, щоб користувачі могли знаходити вас.";
"auth_add_email_phone_message" = "Додайте адресу е-пошти та/або номер телефону до свого облікового запису, щоб інші користувачі могли знаходити вас. Адреса е-пошти також дозволить вам відновлювати пароль.";
"auth_add_email_and_phone_message" = "Додайте адресу е-пошти та/або номер телефону до свого облікового запису, щоб інші користувачі могли знаходити вас. Адреса е-пошти також дозволить вам відновлювати пароль.";
"auth_missing_email" = "Відсутня адреса е-пошти";
"auth_missing_phone" = "Відсутній номер телефону";
"auth_missing_email_or_phone" = "Відсутня адреса е-пошта чи номер телефону";
"auth_email_in_use" = "Ця адреса е-пошти вже використовується";
"auth_phone_in_use" = "Цей номер телефону вже використовується";
"auth_untrusted_id_server" = "Сервер облікових даних не довірений";
"auth_password_dont_match" = "Паролі не збігаються";
"auth_username_in_use" = "Ім'я користувача зайняте";
"auth_forgot_password" = "Забули пароль?";
"auth_email_not_found" = "Не вдалося надіслати лист: Таку адресу е-пошти не знайдено";
"auth_use_server_options" = "Власні налаштування сервера";
"auth_email_validation_message" = "Перевірте свою пошту для продовження реєстрації";
"auth_msisdn_validation_title" = "Очікування перевірки";
"auth_msisdn_validation_message" = "Ми надіслали SMS з кодом активації. Введіть цей код внизу.";
"auth_msisdn_validation_error" = "Неможливо перевірити номер телефону.";
"auth_recaptcha_message" = "Цей домашній сервер бажає переконатися, що ви не робот";
"auth_reset_password_message" = "Щоб відновити пароль, введіть адресу е-пошти, пов'язану з вашим обліковим записом:";
"auth_reset_password_missing_email" = "Необхідно ввести адресу е-пошти, пов'язану з вашим обліковим записом.";
+8 -1
View File
@@ -1,5 +1,6 @@
/*
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -30,7 +31,13 @@
{
mxkImageView.enableInMemoryCache = YES;
[mxkImageView setImageURL:[mxSession.matrixRestClient urlOfContentThumbnail:self.profile.avatarUrl toFitViewSize:mxkImageView.frame.size withMethod:MXThumbnailingMethodCrop] withType:nil andImageOrientation:UIImageOrientationUp previewImage:avatarImage];
[mxkImageView setImageURI:self.profile.avatarUrl
withType:nil
andImageOrientation:UIImageOrientationUp
toFitViewSize:mxkImageView.frame.size
withMethod:MXThumbnailingMethodCrop
previewImage:avatarImage
mediaManager:mxSession.mediaManager];
}
else
{
+8 -1
View File
@@ -1,5 +1,6 @@
/*
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -30,7 +31,13 @@
{
mxkImageView.enableInMemoryCache = YES;
[mxkImageView setImageURL:[self.mxSession.matrixRestClient urlOfContentThumbnail:self.avatar toFitViewSize:mxkImageView.frame.size withMethod:MXThumbnailingMethodCrop] withType:nil andImageOrientation:UIImageOrientationUp previewImage:avatarImage];
[mxkImageView setImageURI:self.avatar
withType:nil
andImageOrientation:UIImageOrientationUp
toFitViewSize:mxkImageView.frame.size
withMethod:MXThumbnailingMethodCrop
previewImage:avatarImage
mediaManager:self.mxSession.mediaManager];
}
else
{
@@ -801,11 +801,10 @@
#pragma mark - MXKAuthInputsViewDelegate
- (void)authInputsView:(MXKAuthInputsView *)authInputsView presentViewController:(UIViewController*)viewControllerToPresent
- (void)authInputsView:(MXKAuthInputsView *)authInputsView presentViewController:(UIViewController*)viewControllerToPresent animated:(BOOL)animated
{
[self dismissKeyboard];
[self presentViewController:viewControllerToPresent animated:YES completion:nil];
[self presentViewController:viewControllerToPresent animated:animated completion:nil];
}
- (void)authInputsViewDidCancelOperation:(MXKAuthInputsView *)authInputsView
@@ -17,6 +17,8 @@
#import <MatrixKit/MatrixKit.h>
#import "Riot-Swift.h"
@interface AuthInputsView : MXKAuthInputsView <MXKCountryPickerViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UITextField *userLoginTextField;
@@ -49,7 +51,8 @@
@property (weak, nonatomic) IBOutlet UILabel *messageLabel;
@property (weak, nonatomic) IBOutlet MXKAuthenticationRecaptchaWebView *recaptchaWebView;
@property (weak, nonatomic) IBOutlet UIView *recaptchaContainer;
@property (weak, nonatomic) IBOutlet TermsView *termsView;
/**
Tell whether some third-party identifiers may be added during the account registration.
+162 -148
View File
@@ -247,7 +247,7 @@
if (type == MXKAuthenticationTypeLogin)
{
if (self.isPasswordBasedFlowSupported)
if ([self isFlowSupported:kMXLoginFlowTypePassword])
{
// Check required fields
if ((!self.userLoginTextField.text.length && !nbPhoneNumber) || !self.passWordTextField.text.length)
@@ -301,14 +301,14 @@
else
{
// Check email field
if (self.isEmailIdentityFlowSupported && !self.emailTextField.text.length)
if ([self isFlowSupported:kMXLoginFlowTypeEmailIdentity] && !self.emailTextField.text.length)
{
if (self.areAllThirdPartyIdentifiersRequired)
{
NSLog(@"[AuthInputsView] Missing email");
errorMsg = NSLocalizedStringFromTable(@"auth_missing_email", @"Vector", nil);
}
else if (self.isMSISDNFlowSupported && !self.phoneTextField.text.length && self.isThirdPartyIdentifierRequired)
else if ([self isFlowSupported:kMXLoginFlowTypeMSISDN] && !self.phoneTextField.text.length && self.isThirdPartyIdentifierRequired)
{
NSLog(@"[AuthInputsView] Missing email or phone number");
errorMsg = NSLocalizedStringFromTable(@"auth_missing_email_or_phone", @"Vector", nil);
@@ -318,7 +318,7 @@
if (!errorMsg)
{
// Check phone field
if (self.isMSISDNFlowSupported && !self.phoneTextField.text.length)
if ([self isFlowSupported:kMXLoginFlowTypeMSISDN] && !self.phoneTextField.text.length)
{
if (self.areAllThirdPartyIdentifiersRequired)
{
@@ -402,7 +402,7 @@
// Handle here the supported login flow
if (type == MXKAuthenticationTypeLogin)
{
if (self.isPasswordBasedFlowSupported)
if ([self isFlowSupported:kMXLoginFlowTypePassword])
{
// Check whether the user login has been set.
NSString *user = self.userLoginTextField.text;
@@ -473,7 +473,7 @@
else if (type == MXKAuthenticationTypeRegister)
{
// Check whether a phone number has been set, and if it is not handled yet
if (nbPhoneNumber && !self.isMSISDNFlowCompleted)
if (nbPhoneNumber && ![self isFlowCompleted:kMXLoginFlowTypeMSISDN])
{
NSLog(@"[AuthInputsView] Prepare msisdn stage");
@@ -488,7 +488,7 @@
if (restClient)
{
// Check whether a second 3pid is available
_isThirdPartyIdentifierPending = (!self.emailContainer.isHidden && self.emailTextField.text.length && !self.isEmailIdentityFlowCompleted);
_isThirdPartyIdentifierPending = (!self.emailContainer.isHidden && self.emailTextField.text.length && ![self isFlowCompleted:kMXLoginFlowTypeEmailIdentity]);
// Launch msisdn validation
NSString *e164 = [[NBPhoneNumberUtil sharedInstance] format:nbPhoneNumber numberFormat:NBEPhoneNumberFormatE164 error:nil];
@@ -563,7 +563,7 @@
NSLog(@"[AuthInputsView] Authentication failed during the msisdn stage");
}
// Check whether an email has been set, and if it is not handled yet
else if (!self.emailContainer.isHidden && self.emailTextField.text.length && !self.isEmailIdentityFlowCompleted)
else if (!self.emailContainer.isHidden && self.emailTextField.text.length && ![self isFlowCompleted:kMXLoginFlowTypeEmailIdentity])
{
NSLog(@"[AuthInputsView] Prepare email identity stage");
@@ -578,7 +578,7 @@
if (restClient)
{
// Check whether a second 3pid is available
_isThirdPartyIdentifierPending = (nbPhoneNumber && !self.isMSISDNFlowCompleted);
_isThirdPartyIdentifierPending = (nbPhoneNumber && ![self isFlowCompleted:kMXLoginFlowTypeMSISDN]);
// Launch email validation
submittedEmail = [[MXK3PID alloc] initWithMedium:kMX3PIDMediumEmail andAddress:self.emailTextField.text];
@@ -603,7 +603,7 @@
@"auth": @{@"session":currentSession.session, @"threepid_creds": @{@"client_secret": submittedEmail.clientSecret, @"id_server": identServerURL.host, @"sid": submittedEmail.sid}, @"type": kMXLoginFlowTypeEmailIdentity},
@"username": self.userLoginTextField.text,
@"password": self.passWordTextField.text,
@"bind_msisdn": [NSNumber numberWithBool:self.isMSISDNFlowCompleted],
@"bind_msisdn": @([self isFlowCompleted:kMXLoginFlowTypeMSISDN]),
@"bind_email": @(YES)
};
@@ -664,7 +664,7 @@
}
NSLog(@"[AuthInputsView] Authentication failed during the email identity stage");
}
else if (self.isRecaptchaFlowRequired)
else if ([self isFlowSupported:kMXLoginFlowTypeRecaptcha] && ![self isFlowCompleted:kMXLoginFlowTypeRecaptcha])
{
NSLog(@"[AuthInputsView] Prepare reCaptcha stage");
@@ -676,8 +676,8 @@
@"auth": @{@"session":currentSession.session, @"response": response, @"type": kMXLoginFlowTypeRecaptcha},
@"username": self.userLoginTextField.text,
@"password": self.passWordTextField.text,
@"bind_msisdn": [NSNumber numberWithBool:self.isMSISDNFlowCompleted],
@"bind_email": [NSNumber numberWithBool:self.isEmailIdentityFlowCompleted]
@"bind_msisdn": @([self isFlowCompleted:kMXLoginFlowTypeMSISDN]),
@"bind_email": @([self isFlowCompleted:kMXLoginFlowTypeEmailIdentity])
};
callback(parameters, nil);
@@ -693,7 +693,7 @@
// Async response
return;
}
else if (self.isDummyFlowSupported)
else if ([self isFlowSupported:kMXLoginFlowTypeDummy] && ![self isFlowCompleted:kMXLoginFlowTypeDummy])
{
parameters = @{
@"auth": @{@"session":currentSession.session, @"type": kMXLoginFlowTypeDummy},
@@ -703,13 +703,37 @@
@"bind_email": @(NO)
};
}
else if (self.isPasswordBasedFlowSupported)
else if ([self isFlowSupported:kMXLoginFlowTypePassword] && ![self isFlowCompleted:kMXLoginFlowTypePassword])
{
// Note: this use case was not tested yet.
parameters = @{
@"auth": @{@"session":currentSession.session, @"username": self.userLoginTextField.text, @"password": self.passWordTextField.text, @"type": kMXLoginFlowTypePassword}
};
}
else if ([self isFlowSupported:kMXLoginFlowTypeTerms] && ![self isFlowCompleted:kMXLoginFlowTypeTerms])
{
NSLog(@"[AuthInputsView] Prepare terms stage");
MXWeakify(self);
[self displayTermsView:^{
MXStrongifyAndReturnIfNil(self);
NSDictionary *parameters = @{
@"auth": @{
@"session":self->currentSession.session,
@"type": kMXLoginFlowTypeTerms
},
@"username": self.userLoginTextField.text,
@"password": self.passWordTextField.text,
@"bind_msisdn": @([self isFlowCompleted:kMXLoginFlowTypeMSISDN]),
@"bind_email": @([self isFlowCompleted:kMXLoginFlowTypeEmailIdentity])
};
callback(parameters, nil);
}];
// Async response
return;
}
}
}
@@ -725,8 +749,8 @@
{
currentSession.completed = completedStages;
BOOL isMSISDNFlowCompleted = self.isMSISDNFlowCompleted;
BOOL isEmailFlowCompleted = self.isEmailIdentityFlowCompleted;
BOOL isMSISDNFlowCompleted = [self isFlowCompleted:kMXLoginFlowTypeMSISDN];
BOOL isEmailFlowCompleted = [self isFlowCompleted:kMXLoginFlowTypeEmailIdentity];
// Check the supported use cases
if (isMSISDNFlowCompleted && self.isThirdPartyIdentifierPending)
@@ -738,46 +762,43 @@
return;
}
else if ((isMSISDNFlowCompleted || isEmailFlowCompleted) && self.isRecaptchaFlowRequired)
else if ((isMSISDNFlowCompleted || isEmailFlowCompleted)
&& [self isFlowSupported:kMXLoginFlowTypeRecaptcha] && ![self isFlowCompleted:kMXLoginFlowTypeRecaptcha])
{
NSLog(@"[AuthInputsView] Display reCaptcha stage");
[self displayRecaptchaForm:^(NSString *response) {
if (response.length)
{
// Update the parameters dict
NSDictionary *parameters;
if (externalRegistrationParameters)
if (externalRegistrationParameters)
{
[self displayRecaptchaForm:^(NSString *response) {
if (response.length)
{
// We finalize here a registration triggered from external inputs. All the required data are handled by the session id
parameters = @{
NSDictionary *parameters = @{
@"auth": @{@"session": currentSession.session, @"response": response, @"type": kMXLoginFlowTypeRecaptcha},
};
callback (parameters, nil);
}
else
{
parameters = @{
@"auth": @{@"session": currentSession.session, @"response": response, @"type": kMXLoginFlowTypeRecaptcha},
@"username": self.userLoginTextField.text,
@"password": self.passWordTextField.text,
@"bind_msisdn": [NSNumber numberWithBool:isMSISDNFlowCompleted],
@"bind_email": [NSNumber numberWithBool:isEmailFlowCompleted]
};
NSLog(@"[AuthInputsView] reCaptcha stage failed");
callback (nil, [NSError errorWithDomain:MXKAuthErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey:[NSBundle mxk_localizedStringForKey:@"not_supported_yet"]}]);
}
callback (parameters, nil);
}
else
{
NSLog(@"[AuthInputsView] reCaptcha stage failed");
callback (nil, [NSError errorWithDomain:MXKAuthErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey:[NSBundle mxk_localizedStringForKey:@"not_supported_yet"]}]);
}
}];
}];
}
else
{
[self prepareParameters:callback];
}
return;
}
else if ([self isFlowSupported:kMXLoginFlowTypeTerms] && ![self isFlowCompleted:kMXLoginFlowTypeTerms])
{
NSLog(@"[AuthInputsView] Prepare a new terms stage");
[self prepareParameters:callback];
return;
}
}
@@ -930,7 +951,7 @@
- (BOOL)areThirdPartyIdentifiersSupported
{
return (self.isEmailIdentityFlowSupported || self.isMSISDNFlowSupported);
return ([self isFlowSupported:kMXLoginFlowTypeEmailIdentity] || [self isFlowSupported:kMXLoginFlowTypeMSISDN]);
}
- (BOOL)isThirdPartyIdentifierRequired
@@ -974,8 +995,8 @@
return NO;
}
BOOL isEmailIdentityFlowSupported = self.isEmailIdentityFlowSupported;
BOOL isMSISDNFlowSupported = self.isMSISDNFlowSupported;
BOOL isEmailIdentityFlowSupported = [self isFlowSupported:kMXLoginFlowTypeEmailIdentity];
BOOL isMSISDNFlowSupported = [self isFlowSupported:kMXLoginFlowTypeMSISDN];
for (MXLoginFlow *loginFlow in currentSession.flows)
{
@@ -1036,7 +1057,7 @@
}
else
{
if (self.isEmailIdentityFlowSupported)
if ([self isFlowSupported:kMXLoginFlowTypeEmailIdentity])
{
if (self.isThirdPartyIdentifierRequired)
{
@@ -1062,7 +1083,7 @@
lastViewContainer = self.emailContainer;
}
if (self.isMSISDNFlowSupported)
if ([self isFlowSupported:kMXLoginFlowTypeMSISDN])
{
self.phoneTextField.returnKeyType = UIReturnKeyDone;
@@ -1130,7 +1151,7 @@
- (IBAction)selectPhoneNumberCountry:(id)sender
{
if ([self.delegate respondsToSelector:@selector(authInputsView:presentViewController:)])
if ([self.delegate respondsToSelector:@selector(authInputsView:presentViewController:animated:)])
{
phoneNumberCountryPicker = [CountryPickerViewController countryPickerViewController];
phoneNumberCountryPicker.delegate = self;
@@ -1157,7 +1178,7 @@
UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_icon"] style:UIBarButtonItemStylePlain target:self action:@selector(dismissCountryPicker)];
phoneNumberCountryPicker.navigationItem.leftBarButtonItem = leftBarButtonItem;
[self.delegate authInputsView:self presentViewController:phoneNumberPickerNavigationController];
[self.delegate authInputsView:self presentViewController:phoneNumberPickerNavigationController animated:YES];
}
}
@@ -1257,7 +1278,8 @@
// Hide other items
self.messageLabelTopConstraint.constant = 8;
self.messageLabel.hidden = YES;
self.recaptchaWebView.hidden = YES;
self.recaptchaContainer.hidden = YES;
self.termsView.hidden = YES;
_currentLastContainer = nil;
}
@@ -1304,10 +1326,43 @@
self.messageLabel.hidden = NO;
self.messageLabel.text = NSLocalizedStringFromTable(@"auth_recaptcha_message", @"Vector", nil);
self.recaptchaWebView.hidden = NO;
self.currentLastContainer = self.recaptchaWebView;
[self.recaptchaWebView openRecaptchaWidgetWithSiteKey:siteKey fromHomeServer:restClient.homeserver callback:callback];
self.recaptchaContainer.hidden = NO;
self.currentLastContainer = self.recaptchaContainer;
// IB does not support WKWebview in a xib before iOS 11
// So, add it by coding
// Do some cleaning/reset before
for (UIView *view in self.recaptchaContainer.subviews)
{
[view removeFromSuperview];
}
MXKAuthenticationRecaptchaWebView *reCaptchaWebView = [MXKAuthenticationRecaptchaWebView new];
reCaptchaWebView.translatesAutoresizingMaskIntoConstraints = NO;
[self.recaptchaContainer addSubview:reCaptchaWebView];
[self.recaptchaContainer addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"|-[view]-|"
options:0
metrics:0
views:@{
@"view": reCaptchaWebView
}
]
];
[self.recaptchaContainer addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view]-|"
options:0
metrics:0
views:@{
@"view": reCaptchaWebView
}
]
];
[reCaptchaWebView openRecaptchaWidgetWithSiteKey:siteKey fromHomeServer:restClient.homeserver callback:callback];
return YES;
}
@@ -1338,7 +1393,11 @@
{
return YES;
}
else if ([flowType isEqualToString:kMXLoginFlowTypeTerms])
{
return YES;
}
return NO;
}
@@ -1499,7 +1558,7 @@
@"username": self.userLoginTextField.text,
@"password": self.passWordTextField.text,
@"bind_msisdn": @(YES),
@"bind_email": [NSNumber numberWithBool:self.isEmailIdentityFlowCompleted]
@"bind_email": @([self isFlowCompleted:kMXLoginFlowTypeEmailIdentity])
};
callback(parameters, nil);
@@ -1565,111 +1624,66 @@
[self.delegate authInputsView:self presentAlertController:inputsAlert];
}
- (BOOL)isPasswordBasedFlowSupported
- (BOOL)displayTermsView:(dispatch_block_t)onAcceptedCallback
{
if (currentSession)
{
for (MXLoginFlow *loginFlow in currentSession.flows)
{
if ([loginFlow.type isEqualToString:kMXLoginFlowTypePassword] || [loginFlow.stages indexOfObject:kMXLoginFlowTypePassword] != NSNotFound)
{
return YES;
}
}
}
return NO;
}
// Extract data
NSDictionary *loginTermsData = currentSession.params[kMXLoginFlowTypeTerms];
MXLoginTerms *loginTerms;
MXJSONModelSetMXJSONModel(loginTerms, MXLoginTerms.class, loginTermsData);
- (BOOL)isEmailIdentityFlowSupported
{
if (currentSession)
if (loginTerms)
{
for (MXLoginFlow *loginFlow in currentSession.flows)
{
if ([loginFlow.stages indexOfObject:kMXLoginFlowTypeEmailIdentity] != NSNotFound || [loginFlow.type isEqualToString:kMXLoginFlowTypeEmailIdentity])
{
return YES;
}
}
}
return NO;
}
[self hideInputsContainer];
- (BOOL)isEmailIdentityFlowCompleted
{
if (currentSession && currentSession.completed)
{
if ([currentSession.completed indexOfObject:kMXLoginFlowTypeEmailIdentity] != NSNotFound)
{
return YES;
}
}
return NO;
}
self.messageLabel.hidden = NO;
self.messageLabel.text = NSLocalizedStringFromTable(@"auth_accept_policies", @"Vector", nil);
- (BOOL)isMSISDNFlowSupported
{
if (currentSession)
{
for (MXLoginFlow *loginFlow in currentSession.flows)
{
if ([loginFlow.stages indexOfObject:kMXLoginFlowTypeMSISDN] != NSNotFound || [loginFlow.type isEqualToString:kMXLoginFlowTypeMSISDN])
{
return YES;
}
}
}
return NO;
}
self.termsView.hidden = NO;
self.currentLastContainer = self.termsView;
- (BOOL)isMSISDNFlowCompleted
{
if (currentSession && currentSession.completed)
{
if ([currentSession.completed indexOfObject:kMXLoginFlowTypeMSISDN] != NSNotFound)
{
return YES;
}
}
return NO;
}
self.termsView.delegate = self.delegate;
[self.termsView displayTermsWithTerms:loginTerms onAccepted:onAcceptedCallback];
- (BOOL)isRecaptchaFlowRequired
{
if (currentSession && currentSession.flows)
{
for (MXLoginFlow *loginFlow in currentSession.flows)
{
if ([loginFlow.stages indexOfObject:kMXLoginFlowTypeRecaptcha] == NSNotFound && ![loginFlow.type isEqualToString:kMXLoginFlowTypeRecaptcha])
{
return NO;
}
}
return YES;
}
return NO;
}
- (BOOL)isDummyFlowSupported
#pragma mark - Flow state
/**
Check if a flow (kMXLoginFlowType*) is part of the required flows steps.
@param flow the flow type to check.
@return YES if the the flow must be implemented.
*/
- (BOOL)isFlowSupported:(NSString *)flow
{
if (currentSession)
for (MXLoginFlow *loginFlow in currentSession.flows)
{
for (MXLoginFlow *loginFlow in currentSession.flows)
if ([loginFlow.type isEqualToString:flow] || [loginFlow.stages indexOfObject:flow] != NSNotFound)
{
if ([loginFlow.stages indexOfObject:kMXLoginFlowTypeDummy] != NSNotFound || [loginFlow.type isEqualToString:kMXLoginFlowTypeDummy])
{
return YES;
}
return YES;
}
}
return NO;
}
/**
Check if a flow (kMXLoginFlowType*) has already been completed.
@param flow the flow type to check.
@return YES if the the flow has been completedd.
*/
- (BOOL)isFlowCompleted:(NSString *)flow
{
if (currentSession.completed && [currentSession.completed indexOfObject:flow] != NSNotFound)
{
return YES;
}
return NO;
}
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.23.1" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.16.1"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -237,7 +237,7 @@
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<webView hidden="YES" contentMode="scaleAspectFit" translatesAutoresizingMaskIntoConstraints="NO" id="whs-Ob-uzD" customClass="MXKAuthenticationRecaptchaWebView">
<view hidden="YES" contentMode="scaleAspectFit" translatesAutoresizingMaskIntoConstraints="NO" id="whs-Ob-uzD">
<rect key="frame" x="0.0" y="27.5" width="600" height="500"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
@@ -246,7 +246,14 @@
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="accessibilityIdentifier" value="AuthInputsViewRecaptchaWebView"/>
</userDefinedRuntimeAttributes>
</webView>
</view>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Sz8-Gm-Piu" customClass="TermsView" customModule="Riot" customModuleProvider="target">
<rect key="frame" x="0.0" y="27.5" width="600" height="183"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="183" id="aiL-SB-f1k"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="AuthInputsView"/>
@@ -258,6 +265,7 @@
<constraint firstAttribute="trailing" secondItem="68j-f9-JG4" secondAttribute="trailing" constant="10" id="8Aa-YT-MP5"/>
<constraint firstAttribute="trailing" secondItem="UfH-jv-6w4" secondAttribute="trailing" id="8dz-wY-Kxx"/>
<constraint firstItem="whs-Ob-uzD" firstAttribute="centerX" secondItem="x74-04-ezp" secondAttribute="centerX" id="8lX-k1-85c"/>
<constraint firstItem="Sz8-Gm-Piu" firstAttribute="centerX" secondItem="x74-04-ezp" secondAttribute="centerX" id="B9b-wC-tsj"/>
<constraint firstItem="68j-f9-JG4" firstAttribute="top" secondItem="x74-04-ezp" secondAttribute="top" constant="8" id="BK1-XE-vz5"/>
<constraint firstItem="bXz-VI-5FS" firstAttribute="leading" secondItem="x74-04-ezp" secondAttribute="leading" id="Frq-sH-HZT"/>
<constraint firstItem="xOW-lo-QGC" firstAttribute="leading" secondItem="x74-04-ezp" secondAttribute="leading" id="NOu-LR-RvE"/>
@@ -265,11 +273,13 @@
<constraint firstAttribute="trailing" secondItem="xOW-lo-QGC" secondAttribute="trailing" id="SNm-WQ-Piu"/>
<constraint firstItem="xOW-lo-QGC" firstAttribute="top" secondItem="x74-04-ezp" secondAttribute="top" id="WmX-gO-hPJ"/>
<constraint firstItem="rb1-L5-udI" firstAttribute="leading" secondItem="x74-04-ezp" secondAttribute="leading" id="XAJ-ST-sWV"/>
<constraint firstItem="Sz8-Gm-Piu" firstAttribute="width" secondItem="x74-04-ezp" secondAttribute="width" id="ZWc-mu-VrY"/>
<constraint firstItem="68j-f9-JG4" firstAttribute="leading" secondItem="x74-04-ezp" secondAttribute="leading" constant="10" id="aYh-VJ-bss"/>
<constraint firstAttribute="trailing" secondItem="rb1-L5-udI" secondAttribute="trailing" id="c49-Cf-H9a"/>
<constraint firstItem="bXz-VI-5FS" firstAttribute="top" secondItem="x74-04-ezp" secondAttribute="top" id="enV-j0-cgR"/>
<constraint firstItem="whs-Ob-uzD" firstAttribute="top" secondItem="68j-f9-JG4" secondAttribute="bottom" id="g87-rp-bgb"/>
<constraint firstAttribute="height" constant="200" id="qBF-0J-3VM"/>
<constraint firstItem="Sz8-Gm-Piu" firstAttribute="top" secondItem="68j-f9-JG4" secondAttribute="bottom" id="sQW-Yb-hDW"/>
<constraint firstItem="IB7-1E-eeL" firstAttribute="top" secondItem="x74-04-ezp" secondAttribute="top" id="sZH-Qr-87A"/>
<constraint firstAttribute="trailing" secondItem="IB7-1E-eeL" secondAttribute="trailing" id="vU9-1q-KfI"/>
<constraint firstItem="whs-Ob-uzD" firstAttribute="width" secondItem="x74-04-ezp" secondAttribute="width" id="wa3-pP-FzX"/>
@@ -296,10 +306,11 @@
<outlet property="phoneContainerTopConstraint" destination="sZH-Qr-87A" id="p1Y-TU-0wX"/>
<outlet property="phoneSeparator" destination="0Uh-dj-10x" id="Jke-kf-F4W"/>
<outlet property="phoneTextField" destination="4Md-Fk-tj9" id="H5a-mC-cGM"/>
<outlet property="recaptchaWebView" destination="whs-Ob-uzD" id="0S8-PN-Ykm"/>
<outlet property="recaptchaContainer" destination="whs-Ob-uzD" id="0S8-PN-Ykm"/>
<outlet property="repeatPasswordContainer" destination="rb1-L5-udI" id="NjO-O7-WYX"/>
<outlet property="repeatPasswordSeparator" destination="ddx-5u-PbG" id="MtA-Rf-dhU"/>
<outlet property="repeatPasswordTextField" destination="BQM-LP-8Eq" id="mgM-dU-mJo"/>
<outlet property="termsView" destination="Sz8-Gm-Piu" id="Kue-Ju-pVb"/>
<outlet property="userLoginContainer" destination="xOW-lo-QGC" id="K4T-Jo-AQz"/>
<outlet property="userLoginContainerTopConstraint" destination="WmX-gO-hPJ" id="dSa-mL-YBL"/>
<outlet property="userLoginSeparator" destination="Kqj-Ol-DR6" id="ZjO-Gx-bXl"/>
@@ -0,0 +1,219 @@
/*
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import Foundation
import Reusable
final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var acceptButton: UIButton!
@objc weak var delegate: MXKAuthInputsViewDelegate?
private var acceptedCallback: (()->Void)?
/// NavigationVC to display a policy content
private var navigationController: RiotNavigationController?
/// The list of policies to be accepted by the end user
private var policies: [MXLoginPolicyData] = []
/// Policies already accepted by the end user
/// Combined with `policies`, this is the view model for `tableView`
private var acceptedPolicies: Set<Int> = []
/// The index of the policy being displayed fullscreen within `navigationController`
private var displayedPolicyIndex: Int?
// MARK: - Setup
convenience init() {
self.init(frame: CGRect.zero)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadNibContent()
commonInit()
}
override init(frame: CGRect) {
super.init(frame: frame)
loadNibContent()
commonInit()
}
override func layoutSubviews() {
super.layoutSubviews()
acceptButton.layer.cornerRadius = 5
}
private func commonInit() {
tableView.delegate = self
tableView.dataSource = self
tableView.separatorStyle = .none
tableView.register(TableViewCellWithCheckBoxAndLabel.nib(), forCellReuseIdentifier: TableViewCellWithCheckBoxAndLabel.defaultReuseIdentifier())
acceptButton.clipsToBounds = true
acceptButton.setTitle(NSLocalizedString("accept", tableName: "Vector", comment: ""), for: .normal)
acceptButton.setTitle(NSLocalizedString("accept", tableName: "Vector", comment: ""), for: .highlighted)
customizeViewRendering()
}
func customizeViewRendering() {
acceptButton.backgroundColor = kRiotColorGreen
}
// MARK: - Public
/// Display a list of policies the end user must accept.
///
/// - Parameters:
/// - terms: Terms data sent by the homeserver.
/// - onAccepted: block called when the user has accepted all of them.
@objc func displayTerms(terms: MXLoginTerms, onAccepted: @escaping () -> Void) {
acceptedCallback = onAccepted
let lang: String? = Bundle.mxk_language()
policies = terms.policiesData(forLanguage: lang, defaultLanguage: "en")
acceptedPolicies.removeAll()
reload()
}
// MARK: - Private
private func reload() {
tableView.reloadData()
// Enable the button only if the user has accepted all policies
acceptButton.isEnabled = (policies.count == acceptedPolicies.count)
acceptButton.alpha = acceptButton.isEnabled ? 1 : 0.5
}
@IBAction func didAcceptButtonTapped(_ sender: Any) {
if policies.count == acceptedPolicies.count {
acceptedCallback?()
}
}
// MARK: - UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return policies.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCellWithCheckBoxAndLabel.defaultReuseIdentifier(), for: indexPath) as! TableViewCellWithCheckBoxAndLabel
let policy = policies[indexPath.row]
let accepted = acceptedPolicies .contains(indexPath.row)
cell.label.text = policy.name
cell.isEnabled = accepted
cell.accessoryType = .disclosureIndicator
let gesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTapCheckbox))
gesture.numberOfTapsRequired = 1
gesture.numberOfTouchesRequired = 1
cell.checkBox.tag = indexPath.row
cell.checkBox?.isUserInteractionEnabled = true
if (cell.checkBox?.gestureRecognizers?.count == 0) {
cell.checkBox?.addGestureRecognizer(gesture)
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.displayPolicy(policyIndex: indexPath.row)
}
@objc private func didTapCheckbox(sender: UITapGestureRecognizer) {
guard let policyIndex = sender.view?.tag else {
return
}
if acceptedPolicies.contains(policyIndex) {
acceptedPolicies.remove(policyIndex)
} else {
acceptedPolicies.insert(policyIndex)
}
reload()
}
// MARK: - Policy content display
func displayPolicy(policyIndex: Int) {
displayedPolicyIndex = policyIndex
let policy = policies[policyIndex]
// Display the policy webpage into our webview
let webViewViewController: WebViewViewController = WebViewViewController(url: policy.url)
webViewViewController.title = policy.name
let leftBarButtonItem: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "back_icon"), style: .plain, target: self, action:#selector(didTapCancelOnPolicyScreen))
webViewViewController.navigationItem.leftBarButtonItem = leftBarButtonItem
let rightBarButtonItem: UIBarButtonItem = UIBarButtonItem(title: NSLocalizedString("accept", tableName: "Vector", comment: ""), style: .plain, target: self, action: #selector(didAcceptPolicy))
webViewViewController.navigationItem.rightBarButtonItem = rightBarButtonItem
navigationController = RiotNavigationController()
delegate?.authInputsView?(nil, present: navigationController, animated: false)
navigationController?.pushViewController(webViewViewController, animated: false)
}
@objc private func didTapCancelOnPolicyScreen() {
removePolicyScreen()
}
@objc private func didAcceptPolicy() {
if let displayedPolicyIndex = self.displayedPolicyIndex {
acceptedPolicies.insert(displayedPolicyIndex)
}
removePolicyScreen()
reload()
}
private func removePolicyScreen() {
displayedPolicyIndex = nil
navigationController?.dismiss(animated: false)
navigationController = nil
}
}
@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="TermsView" customModule="Riot" customModuleProvider="target">
<connections>
<outlet property="acceptButton" destination="pgo-gb-fHn" id="sV0-9y-b7D"/>
<outlet property="tableView" destination="l6d-Uv-u3V" id="ykF-cd-vcl"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="iN0-l3-epB" customClass="TermsView">
<rect key="frame" x="0.0" y="0.0" width="600" height="200"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" bounces="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" bouncesZoom="NO" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="l6d-Uv-u3V">
<rect key="frame" x="10" y="10" width="590" height="158"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="separatorInset" minX="15" minY="0.0" maxX="0.0" maxY="0.0"/>
</tableView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="pgo-gb-fHn">
<rect key="frame" x="180" y="168" width="240" height="32"/>
<constraints>
<constraint firstAttribute="width" constant="240" id="pZU-Wt-tc1"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="16"/>
<state key="normal" title="Accept">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<color key="titleShadowColor" red="0.66666666669999997" green="0.66666666669999997" blue="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<connections>
<action selector="didAcceptButtonTapped:" destination="-1" eventType="touchUpInside" id="mUx-Zz-ffi"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="pgo-gb-fHn" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="8T5-O0-con"/>
<constraint firstAttribute="bottom" secondItem="pgo-gb-fHn" secondAttribute="bottom" id="MP0-f7-neR"/>
<constraint firstAttribute="trailing" secondItem="l6d-Uv-u3V" secondAttribute="trailing" id="QFo-tz-WHJ"/>
<constraint firstItem="l6d-Uv-u3V" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="10" id="fUE-f8-ZPG"/>
<constraint firstAttribute="top" secondItem="l6d-Uv-u3V" secondAttribute="top" constant="-10" id="iAm-3I-sHR"/>
<constraint firstItem="l6d-Uv-u3V" firstAttribute="bottom" secondItem="pgo-gb-fHn" secondAttribute="top" id="kaa-aS-QqM"/>
</constraints>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
</view>
</objects>
</document>
+11 -10
View File
@@ -1,6 +1,7 @@
/*
Copyright 2016 OpenMarket Ltd
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -199,20 +200,17 @@
- (UIView *)createIncomingCallView
{
NSString *avatarThumbURL = [self.mainSession.matrixRestClient urlOfContentThumbnail:self.peer.avatarUrl
toFitViewSize:IncomingCallView.callerAvatarSize
withMethod:MXThumbnailingMethodCrop];
NSString *callInfo;
if (self.mxCall.isVideoCall)
callInfo = NSLocalizedStringFromTable(@"call_incoming_video", @"Vector", nil);
else
callInfo = NSLocalizedStringFromTable(@"call_incoming_voice", @"Vector", nil);
IncomingCallView *incomingCallView = [[IncomingCallView alloc] initWithCallerAvatarURL:avatarThumbURL
placeholderImage:self.picturePlaceholder
callerName:self.peer.displayname
callInfo:callInfo];
IncomingCallView *incomingCallView = [[IncomingCallView alloc] initWithCallerAvatar:self.peer.avatarUrl
mediaManager:self.mainSession.mediaManager
placeholderImage:self.picturePlaceholder
callerName:self.peer.displayname
callInfo:callInfo];
// Incoming call is retained by call vc so use weak to avoid retain cycle
__weak typeof(self) weakSelf = self;
@@ -396,8 +394,11 @@
if (peerAvatarURL)
{
// Retrieve the avatar in full resolution
NSString *avatarThumbURL = [self.mainSession.matrixRestClient urlOfContent:peerAvatarURL];
[self.callerImageView setImageURL:avatarThumbURL withType:nil andImageOrientation:UIImageOrientationUp previewImage:self.picturePlaceholder];
[self.callerImageView setImageURI:peerAvatarURL
withType:nil
andImageOrientation:UIImageOrientationUp
previewImage:self.picturePlaceholder
mediaManager:self.mainSession.mediaManager];
}
else
{
+15 -4
View File
@@ -19,6 +19,7 @@
NS_ASSUME_NONNULL_BEGIN
typedef void (^IncomingCallViewAction)();
@class MXMediaManager;
@interface IncomingCallView : UIView
@@ -37,10 +38,20 @@ typedef void (^IncomingCallViewAction)();
*/
@property (nonatomic, nullable, copy) IncomingCallViewAction onReject;
- (instancetype)initWithCallerAvatarURL:(NSString *)callerAvatarURL
placeholderImage:(UIImage *)placeholderImage
callerName:(NSString *)callerName
callInfo:(NSString *)callInfo;
/**
Contructors.
@param mxcAvatarURI the Matrix Content URI of the caller avatar.
@param mediaManager the media manager used to download this avatar if it is not cached yet.
@param placeholderImage
@param callerName
@param callInfo
*/
- (instancetype)initWithCallerAvatar:(NSString *)mxcAvatarURI
mediaManager:(MXMediaManager *)mediaManager
placeholderImage:(UIImage *)placeholderImage
callerName:(NSString *)callerName
callInfo:(NSString *)callInfo;
@end
+11 -3
View File
@@ -1,5 +1,6 @@
/*
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -46,7 +47,11 @@ static const CGFloat kButtonSize = 80.0;
return CGSizeMake(kAvatarSize, kAvatarSize);
}
- (instancetype)initWithCallerAvatarURL:(NSString *)callerAvatarURL placeholderImage:(UIImage *)placeholderImage callerName:(NSString *)callerName callInfo:(NSString *)callInfo
- (instancetype)initWithCallerAvatar:(NSString *)mxcAvatarURI
mediaManager:(MXMediaManager *)mediaManager
placeholderImage:(UIImage *)placeholderImage
callerName:(NSString *)callerName
callInfo:(NSString *)callInfo
{
self = [super initWithFrame:CGRectZero];
if (self)
@@ -59,10 +64,13 @@ static const CGFloat kButtonSize = 80.0;
self.callerImageView.clipsToBounds = YES;
self.callerImageView.mediaFolder = kMXMediaManagerAvatarThumbnailFolder;
self.callerImageView.enableInMemoryCache = YES;
[self.callerImageView setImageURL:callerAvatarURL
[self.callerImageView setImageURI:mxcAvatarURI
withType:nil
andImageOrientation:UIImageOrientationUp
previewImage:placeholderImage];
toFitViewSize:IncomingCallView.callerAvatarSize
withMethod:MXThumbnailingMethodCrop
previewImage:placeholderImage
mediaManager:mediaManager];
self.callerNameLabel = [[UILabel alloc] init];
self.callerNameLabel.backgroundColor = kRiotPrimaryBgColor;
@@ -1,5 +1,6 @@
/*
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -497,39 +498,78 @@
];
// Do some sanitisation by handling the potential image
MXWeakify(self);
sanitisedGroupLongDescription = [MXKTools sanitiseHTML:_group.summary.profile.longDescription withAllowedHTMLTags:allowedHTMLTags imageHandler:^NSString *(NSString *sourceURL, CGFloat width, CGFloat height) {
NSString *imageURL;
MXStrongifyAndReturnValueIfNil(self, nil);
NSString *localSourcePath;
if (width != -1 && height != -1)
{
CGSize size = CGSizeMake(width, height);
imageURL = [self.mxSession.matrixRestClient urlOfContentThumbnail:sourceURL toFitViewSize:size withMethod:MXThumbnailingMethodScale];
// Build the cache path for the a thumbnail of this image.
NSString *cacheFilePath = [MXMediaManager thumbnailCachePathForMatrixContentURI:sourceURL
andType:nil
inFolder:kMXMediaManagerDefaultCacheFolder
toFitViewSize:size
withMethod:MXThumbnailingMethodScale];
// Check whether the provided URL is a valid Matrix Content URI.
if (cacheFilePath)
{
// Download the thumbnail if it is not already stored in the cache.
if (![[NSFileManager defaultManager] fileExistsAtPath:cacheFilePath])
{
MXWeakify(self);
[self.mxSession.mediaManager downloadThumbnailFromMatrixContentURI:sourceURL
withType:nil
inFolder:kMXMediaManagerDefaultCacheFolder
toFitViewSize:size
withMethod:MXThumbnailingMethodScale
success:^(NSString *outputFilePath) {
MXStrongifyAndReturnIfNil(self);
[self refreshGroupLongDescription];
}
failure:nil];
}
else
{
// Update the local path
localSourcePath = [NSString stringWithFormat:@"file://%@", cacheFilePath];
}
}
}
else
{
imageURL = [self.mxSession.matrixRestClient urlOfContent:sourceURL];
// Build the cache path for this image.
NSString* cacheFilePath = [MXMediaManager cachePathForMatrixContentURI:sourceURL
andType:nil
inFolder:kMXMediaManagerDefaultCacheFolder];
// Check whether the provided URL is a valid Matrix Content URI.
if (cacheFilePath)
{
// Download the image if it is not already stored in the cache.
if (![[NSFileManager defaultManager] fileExistsAtPath:cacheFilePath])
{
MXWeakify(self);
[self.mxSession.mediaManager downloadMediaFromMatrixContentURI:sourceURL
withType:nil
inFolder:kMXMediaManagerDefaultCacheFolder
success:^(NSString *outputFilePath) {
MXStrongifyAndReturnIfNil(self);
[self refreshGroupLongDescription];
}
failure:nil];
}
else
{
// Update the local path
localSourcePath = [NSString stringWithFormat:@"file://%@", cacheFilePath];
}
}
}
return localSourcePath;
NSString *mimeType = nil;
// Check if the extension could not be deduced from url
if (![imageURL pathExtension].length)
{
// Set default mime type if no information is available
mimeType = @"image/jpeg";
}
NSString *cacheFilePath = [MXMediaManager cachePathForMediaWithURL:imageURL andType:mimeType inFolder:kMXMediaManagerDefaultCacheFolder];
if (![[NSFileManager defaultManager] fileExistsAtPath:cacheFilePath])
{
[MXMediaManager downloadMediaFromURL:imageURL andSaveAtFilePath:cacheFilePath success:^{
[self renderGroupLongDescription];
} failure:nil];
}
return [NSString stringWithFormat:@"file://%@", cacheFilePath];
}];
}
else
@@ -701,22 +741,25 @@
__block MXKImageView * avatarFullScreenView = [[MXKImageView alloc] initWithFrame:CGRectZero];
avatarFullScreenView.stretchable = YES;
MXWeakify(self);
[avatarFullScreenView setRightButtonTitle:[NSBundle mxk_localizedStringForKey:@"ok"] handler:^(MXKImageView* imageView, NSString* buttonTitle) {
MXStrongifyAndReturnIfNil(self);
[avatarFullScreenView dismissSelection];
[avatarFullScreenView removeFromSuperview];
avatarFullScreenView = nil;
isStatusBarHidden = NO;
self->isStatusBarHidden = NO;
// Trigger status bar update
[self setNeedsStatusBarAppearanceUpdate];
}];
NSString *avatarURL = [self.mainSession.matrixRestClient urlOfContent:_group.summary.profile.avatarUrl];
[avatarFullScreenView setImageURL:avatarURL
[avatarFullScreenView setImageURI:_group.summary.profile.avatarUrl
withType:nil
andImageOrientation:UIImageOrientationUp
previewImage:self.groupAvatar.image];
previewImage:self.groupAvatar.image
mediaManager:_mxSession.mediaManager];
[avatarFullScreenView showFullScreen];
isStatusBarHidden = YES;
@@ -1,5 +1,6 @@
/*
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -75,11 +76,13 @@
{
_roomAvatar.enableInMemoryCache = YES;
[_roomAvatar setImageURL:[mxSession.matrixRestClient urlOfContentThumbnail:groupRoom.avatarUrl
toFitViewSize:_roomAvatar.frame.size
withMethod:MXThumbnailingMethodCrop]
[_roomAvatar setImageURI:groupRoom.avatarUrl
withType:nil
andImageOrientation:UIImageOrientationUp previewImage:avatarImage];
andImageOrientation:UIImageOrientationUp
toFitViewSize:_roomAvatar.frame.size
withMethod:MXThumbnailingMethodCrop
previewImage:avatarImage
mediaManager:mxSession.mediaManager];
}
else
{
@@ -1,6 +1,7 @@
/*
Copyright 2016 OpenMarket Ltd
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1153,13 +1154,16 @@
__block MXKImageView * avatarFullScreenView = [[MXKImageView alloc] initWithFrame:CGRectZero];
avatarFullScreenView.stretchable = YES;
MXWeakify(self);
[avatarFullScreenView setRightButtonTitle:[NSBundle mxk_localizedStringForKey:@"ok"] handler:^(MXKImageView* imageView, NSString* buttonTitle) {
MXStrongifyAndReturnIfNil(self);
[avatarFullScreenView dismissSelection];
[avatarFullScreenView removeFromSuperview];
avatarFullScreenView = nil;
isStatusBarHidden = NO;
self->isStatusBarHidden = NO;
// Trigger status bar update
[self setNeedsStatusBarAppearanceUpdate];
}];
@@ -1168,15 +1172,16 @@
if (self.firstMatrixId)
{
MXUser *user = [self.mainSession userWithUserId:self.firstMatrixId];
avatarURL = [self.mainSession.matrixRestClient urlOfContent:user.avatarUrl];
avatarURL = user.avatarUrl;
}
// TODO: Display the orignal contact avatar when the contast is not a Matrix user
[avatarFullScreenView setImageURL:avatarURL
[avatarFullScreenView setImageURI:avatarURL
withType:nil
andImageOrientation:UIImageOrientationUp
previewImage:self.contactAvatar.image];
previewImage:self.contactAvatar.image
mediaManager:self.mainSession.mediaManager];
[avatarFullScreenView showFullScreen];
isStatusBarHidden = YES;
@@ -41,7 +41,7 @@
if ([searchDataSource.eventFormatter isSupportedAttachment:event])
{
// Note: event.eventType may be equal here to MXEventTypeRoomMessage or MXEventTypeSticker
attachment = [[MXKAttachment alloc] initWithEvent:event andMatrixSession:searchDataSource.mxSession];
attachment = [[MXKAttachment alloc] initWithEvent:event andMediaManager:searchDataSource.mxSession.mediaManager];
}
// Append the file size if any
@@ -1,6 +1,7 @@
/*
Copyright 2016 OpenMarket Ltd
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -74,29 +75,8 @@
if (bubbleData.isAttachmentWithThumbnail)
{
// Set attached media folders
self.attachmentImageView.mediaFolder = bubbleData.roomId;
NSString *mimetype = nil;
if (bubbleData.attachment.thumbnailInfo)
{
mimetype = bubbleData.attachment.thumbnailInfo[@"mimetype"];
}
else if (bubbleData.attachment.contentInfo)
{
mimetype = bubbleData.attachment.contentInfo[@"mimetype"];
}
NSString *url = bubbleData.attachment.thumbnailURL;
UIImage *preview = bubbleData.attachment.previewImage;
if (url.length || preview)
{
self.attachmentImageView.enableInMemoryCache = YES;
[self.attachmentImageView setImageURL:url withType:mimetype andImageOrientation:bubbleData.attachment.thumbnailOrientation previewImage:preview];
self.attachmentImageView.backgroundColor = kRiotPrimaryBgColor;
}
self.attachmentImageView.backgroundColor = kRiotPrimaryBgColor;
[self.attachmentImageView setAttachmentThumb:bubbleData.attachment];
}
self.iconImage.image = [self attachmentIcon:bubbleData.attachment.type];
@@ -1,6 +1,7 @@
/*
Copyright 2015 OpenMarket Ltd
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -61,11 +62,13 @@
{
_roomAvatar.enableInMemoryCache = YES;
[_roomAvatar setImageURL:[mxSession.matrixRestClient urlOfContentThumbnail:publicRoom.avatarUrl
toFitViewSize:_roomAvatar.frame.size
withMethod:MXThumbnailingMethodCrop]
[_roomAvatar setImageURI:publicRoom.avatarUrl
withType:nil
andImageOrientation:UIImageOrientationUp previewImage:avatarImage];
andImageOrientation:UIImageOrientationUp
toFitViewSize:_roomAvatar.frame.size
withMethod:MXThumbnailingMethodCrop
previewImage:avatarImage
mediaManager:mxSession.mediaManager];
}
else
{
@@ -304,7 +304,7 @@
if (roomMembers.count)
{
// Define the read receipts container, positioned on the right border of the bubble cell (Note the right margin 6 pts).
MXKReceiptSendersContainer* avatarsContainer = [[MXKReceiptSendersContainer alloc] initWithFrame:CGRectMake(bubbleCell.frame.size.width - 156, bottomPositionY - 13, 150, 12) andRestClient:self.mxSession.matrixRestClient];
MXKReceiptSendersContainer* avatarsContainer = [[MXKReceiptSendersContainer alloc] initWithFrame:CGRectMake(bubbleCell.frame.size.width - 156, bottomPositionY - 13, 150, 12) andMediaManager:self.mxSession.mediaManager];
// Custom avatar display
avatarsContainer.maxDisplayedAvatars = 5;
@@ -1101,38 +1101,31 @@
}
else if (view == memberTitleView.memberAvatarMask || view == self.roomMemberAvatarMask)
{
__weak typeof(self) weakSelf = self;
MXWeakify(self);
// Show the avatar in full screen
__block MXKImageView * avatarFullScreenView = [[MXKImageView alloc] initWithFrame:CGRectZero];
avatarFullScreenView.stretchable = YES;
[avatarFullScreenView setRightButtonTitle:[NSBundle mxk_localizedStringForKey:@"ok"] handler:^(MXKImageView* imageView, NSString* buttonTitle)
{
[avatarFullScreenView dismissSelection];
[avatarFullScreenView removeFromSuperview];
avatarFullScreenView = nil;
if (weakSelf)
{
// Restore the status bar
isStatusBarHidden = NO;
typeof(self) self = weakSelf;
[self setNeedsStatusBarAppearanceUpdate];
}
}];
[avatarFullScreenView setRightButtonTitle:[NSBundle mxk_localizedStringForKey:@"ok"]
handler:^(MXKImageView* imageView, NSString* buttonTitle) {
MXStrongifyAndReturnIfNil(self);
[avatarFullScreenView dismissSelection];
[avatarFullScreenView removeFromSuperview];
avatarFullScreenView = nil;
// Restore the status bar
self->isStatusBarHidden = NO;
[self setNeedsStatusBarAppearanceUpdate];
}];
NSString *avatarURL = nil;
if (self.mxRoomMember.avatarUrl)
{
avatarURL = [self.mainSession.matrixRestClient urlOfContent:self.mxRoomMember.avatarUrl];
}
[avatarFullScreenView setImageURL:avatarURL
[avatarFullScreenView setImageURI:self.mxRoomMember.avatarUrl
withType:nil
andImageOrientation:UIImageOrientationUp
previewImage:self.memberThumbnail.image];
previewImage:self.memberThumbnail.image
mediaManager:self.mainSession.mediaManager];
[avatarFullScreenView showFullScreen];
@@ -1,5 +1,6 @@
/*
Copyright 2017 Aram Sargsyan
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -26,7 +27,6 @@
id kRiotDesignValuesDidChangeThemeNotificationObserver;
}
@property (nonatomic) MXRestClient* restClient;
@property (nonatomic) MXSession *session;
@property (nonatomic) NSArray <MXRoomMember *> *roomMembers;
@@ -48,7 +48,6 @@
+ (void)openInViewController:(UIViewController *)viewController fromContainer:(MXKReceiptSendersContainer *)receiptSendersContainer withSession:(MXSession *)session
{
ReadReceiptsViewController *receiptsController = [[[self class] alloc] initWithNibName:NSStringFromClass([self class]) bundle:nil];
receiptsController.restClient = receiptSendersContainer.restClient;
receiptsController.session = session;
receiptsController.roomMembers = receiptSendersContainer.roomMembers;
@@ -210,12 +209,14 @@
if (indexPath.row < self.placeholders.count)
{
NSString *avatarUrl = self.roomMembers[indexPath.row].avatarUrl;
if (self.restClient && avatarUrl)
{
CGFloat side = CGRectGetWidth(cell.avatarImageView.frame);
avatarUrl = [self.restClient urlOfContentThumbnail:avatarUrl toFitViewSize:CGSizeMake(side, side) withMethod:MXThumbnailingMethodCrop];
}
[cell.avatarImageView setImageURL:avatarUrl withType:nil andImageOrientation:UIImageOrientationUp previewImage:self.placeholders[indexPath.row]];
CGFloat side = CGRectGetWidth(cell.avatarImageView.frame);
[cell.avatarImageView setImageURI:avatarUrl
withType:nil
andImageOrientation:UIImageOrientationUp
toFitViewSize:CGSizeMake(side, side)
withMethod:MXThumbnailingMethodCrop
previewImage:self.placeholders[indexPath.row]
mediaManager:self.session.mediaManager];
}
if (indexPath.row < self.receipts.count)
{
+15 -15
View File
@@ -1426,14 +1426,16 @@
if (userPictureView)
{
UIImage *preview = [AvatarGenerator generateAvatarForMatrixItem:self.mainSession.myUser.userId withDisplayName:self.mainSession.myUser.displayname];
NSString *avatarThumbURL = nil;
if (self.mainSession.myUser.avatarUrl)
{
// Suppose this url is a matrix content uri, we use SDK to get the well adapted thumbnail from server
avatarThumbURL = [self.mainSession.matrixRestClient urlOfContentThumbnail:self.mainSession.myUser.avatarUrl toFitViewSize:userPictureView.frame.size withMethod:MXThumbnailingMethodCrop];
}
// Suppose the avatar is stored unencrypted on the Matrix media repository.
userPictureView.enableInMemoryCache = YES;
[userPictureView setImageURL:avatarThumbURL withType:nil andImageOrientation:UIImageOrientationUp previewImage:preview];
[userPictureView setImageURI:self.mainSession.myUser.avatarUrl
withType:nil
andImageOrientation:UIImageOrientationUp
toFitViewSize:userPictureView.frame.size
withMethod:MXThumbnailingMethodCrop
previewImage:preview
mediaManager:self.mainSession.mediaManager];
[userPictureView.layer setCornerRadius:userPictureView.frame.size.width / 2];
userPictureView.clipsToBounds = YES;
}
@@ -1731,9 +1733,7 @@
// Set the avatar provided in preview data
if (roomPreviewData.roomAvatarUrl)
{
NSString *roomAvatarUrl = [self.mainSession.matrixRestClient urlOfContentThumbnail:roomPreviewData.roomAvatarUrl toFitViewSize:previewHeader.roomAvatar.frame.size withMethod:MXThumbnailingMethodCrop];
previewHeader.roomAvatarURL = roomAvatarUrl;
previewHeader.roomAvatarURL = roomPreviewData.roomAvatarUrl;
}
else if (roomPreviewData.roomId && roomPreviewData.roomName)
{
@@ -2333,7 +2333,7 @@
selectedEvent.sentState == MXEventSentStateSending)
{
// Upload id is stored in attachment url (nasty trick)
NSString *uploadId = roomBubbleTableViewCell.bubbleData.attachment.actualURL;
NSString *uploadId = roomBubbleTableViewCell.bubbleData.attachment.contentURL;
if ([MXMediaManager existingUploaderWithId:uploadId])
{
[currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_cancel_send", @"Vector", nil)
@@ -2357,7 +2357,7 @@
// Remove the outgoing message and its related cached file.
[[NSFileManager defaultManager] removeItemAtPath:roomBubbleTableViewCell.bubbleData.attachment.cacheFilePath error:nil];
[[NSFileManager defaultManager] removeItemAtPath:roomBubbleTableViewCell.bubbleData.attachment.cacheThumbnailPath error:nil];
[[NSFileManager defaultManager] removeItemAtPath:roomBubbleTableViewCell.bubbleData.attachment.thumbnailCachePath error:nil];
// Cancel and remove the outgoing message
[self.roomDataSource.room cancelSendingOperation:selectedEvent.eventId];
@@ -2418,8 +2418,8 @@
// Check whether download is in progress
if (level == 0 && selectedEvent.isMediaAttachment)
{
NSString *cacheFilePath = roomBubbleTableViewCell.bubbleData.attachment.cacheFilePath;
if ([MXMediaManager existingDownloaderWithOutputFilePath:cacheFilePath])
NSString *downloadId = roomBubbleTableViewCell.bubbleData.attachment.downloadId;
if ([MXMediaManager existingDownloaderWithIdentifier:downloadId])
{
[currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_cancel_download", @"Vector", nil)
style:UIAlertActionStyleDefault
@@ -2432,7 +2432,7 @@
[self cancelEventSelection];
// Get again the loader
MXMediaLoader *loader = [MXMediaManager existingDownloaderWithOutputFilePath:cacheFilePath];
MXMediaLoader *loader = [MXMediaManager existingDownloaderWithIdentifier:downloadId];
if (loader)
{
[loader cancel];
@@ -1,5 +1,6 @@
/*
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -65,14 +66,8 @@
{
MXKImageView *avatarView = [[MXKImageView alloc] initWithFrame:CGRectMake(12 * self.avatarsView.subviews.count, 0, 16, 16)];
// Handle user's picture
NSString *avatarThumbURL = nil;
if (nextBubbleData.senderAvatarUrl)
{
// Suppose this url is a matrix content uri, we use SDK to get the well adapted thumbnail from server
avatarThumbURL = [nextBubbleData.mxSession.matrixRestClient urlOfContentThumbnail:nextBubbleData.senderAvatarUrl toFitViewSize:avatarView.frame.size withMethod:MXThumbnailingMethodCrop];
}
// Handle user's picture by considering it is stored unencrypted on Matrix media repository
// Use the Riot style placeholder
if (!nextBubbleData.senderAvatarPlaceholder)
{
@@ -80,7 +75,13 @@
}
avatarView.enableInMemoryCache = YES;
[avatarView setImageURL:avatarThumbURL withType:nil andImageOrientation:UIImageOrientationUp previewImage: nextBubbleData.senderAvatarPlaceholder];
[avatarView setImageURI:nextBubbleData.senderAvatarUrl
withType:nil
andImageOrientation:UIImageOrientationUp
toFitViewSize:avatarView.frame.size
withMethod:MXThumbnailingMethodCrop
previewImage:nextBubbleData.senderAvatarPlaceholder
mediaManager:nextBubbleData.mxSession.mediaManager];
// Clear the default background color of a MXKImageView instance
avatarView.defaultBackgroundColor = [UIColor clearColor];
@@ -86,16 +86,17 @@
self.paginationTitleView.hidden = YES;
}
// Hanlde sender avatar
// Hanlde sender avatar (Supposed his avatar is stored unencrypted on Matrix media repo)
self.pictureView.hidden = NO;
NSString *avatarThumbURL = nil;
if (bubbleData.senderAvatarUrl)
{
// Suppose this url is a matrix content uri, we use SDK to get the well adapted thumbnail from server
avatarThumbURL = [bubbleData.mxSession.matrixRestClient urlOfContentThumbnail:bubbleData.senderAvatarUrl toFitViewSize:self.pictureView.frame.size withMethod:MXThumbnailingMethodCrop];
}
self.pictureView.enableInMemoryCache = YES;
[self.pictureView setImageURL:avatarThumbURL withType:nil andImageOrientation:UIImageOrientationUp previewImage: bubbleData.senderAvatarPlaceholder ? bubbleData.senderAvatarPlaceholder : self.picturePlaceholder];
[self.pictureView setImageURI:bubbleData.senderAvatarUrl
withType:nil
andImageOrientation:UIImageOrientationUp
toFitViewSize:self.pictureView.frame.size
withMethod:MXThumbnailingMethodCrop
previewImage:bubbleData.senderAvatarPlaceholder ? bubbleData.senderAvatarPlaceholder : self.picturePlaceholder
mediaManager:bubbleData.mxSession.mediaManager];
// Display sender's name except if the name appears in the displayed text (see emote and membership events)
if (bubbleData.shouldHideSenderName == NO)
@@ -139,8 +140,6 @@
// Display the sticker
self.attachmentView.backgroundColor = [UIColor clearColor];
self.attachmentView.mediaFolder = bubbleData.roomId;
self.attachmentView.enableInMemoryCache = YES;
[self.attachmentView setAttachmentThumb:bubbleData.attachment];
// Set the description
@@ -1,6 +1,7 @@
/*
Copyright 2016 OpenMarket Ltd
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -96,7 +97,13 @@
{
if (self.roomAvatarURL)
{
[self.roomAvatar setImageURL:self.roomAvatarURL withType:nil andImageOrientation:UIImageOrientationUp previewImage:[UIImage imageNamed:@"placeholder"]];
[self.roomAvatar setImageURI:self.roomAvatarURL
withType:nil
andImageOrientation:UIImageOrientationUp
toFitViewSize:self.roomAvatar.frame.size
withMethod:MXThumbnailingMethodCrop
previewImage:[UIImage imageNamed:@"placeholder"]
mediaManager:self.mxRoom.mxSession.mediaManager];
}
else
{
@@ -1,5 +1,6 @@
/*
Copyright 2017 Vector Creations Ltd
Copyright 2018 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -49,7 +50,20 @@
}
else if (cellData.thirdPartyProtocolInstance.icon)
{
[self.iconImageView setImageURL:cellData.thirdPartyProtocolInstance.icon withType:nil andImageOrientation:UIImageOrientationUp previewImage:[UIImage imageNamed:@"placeholder"]];
// Presently the thirdPartyProtocolInstance.icon is not a Matrix Content URI (https://github.com/matrix-org/synapse/issues/4175).
// Patch: We extract the expected URI from the URL
NSString *iconURL = cellData.thirdPartyProtocolInstance.icon;
NSString *mxMediaPrefix = [NSString stringWithFormat:@"/%@/download/", kMXContentPrefixPath];
NSRange range = [iconURL rangeOfString:mxMediaPrefix];
if (range.location != NSNotFound)
{
iconURL = [NSString stringWithFormat:@"%@%@", kMXContentUriScheme, [iconURL substringFromIndex:range.location + range.length]];
}
[self.iconImageView setImageURI:iconURL
withType:nil
andImageOrientation:UIImageOrientationUp
previewImage:[UIImage imageNamed:@"placeholder"]
mediaManager:cellData.mediaManager];
}
else
{
@@ -1451,7 +1451,13 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
{
profileCell.mxkImageView.enableInMemoryCache = YES;
[profileCell.mxkImageView setImageURL:[session.matrixRestClient urlOfContentThumbnail:myUser.avatarUrl toFitViewSize:profileCell.mxkImageView.frame.size withMethod:MXThumbnailingMethodCrop] withType:nil andImageOrientation:UIImageOrientationUp previewImage:avatarImage];
[profileCell.mxkImageView setImageURI:myUser.avatarUrl
withType:nil
andImageOrientation:UIImageOrientationUp
toFitViewSize:profileCell.mxkImageView.frame.size
withMethod:MXThumbnailingMethodCrop
previewImage:avatarImage
mediaManager:session.mediaManager];
}
else
{
+2 -2
View File
@@ -17,11 +17,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.7.7</string>
<string>0.7.8</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.7.7</string>
<string>0.7.8</string>
<key>ITSAppUsesNonExemptEncryption</key>
<true/>
<key>ITSEncryptionExportComplianceCode</key>
@@ -3,4 +3,9 @@
//
@import MatrixSDK;
@import MatrixKit;
#import "WebViewViewController.h"
#import "RiotNavigationController.h"
#import "RiotDesignValues.h"
#import "TableViewCellWithCheckBoxAndLabel.h"
@@ -58,7 +58,7 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
sharedInstance.pendingImages = [NSMutableArray array];
sharedInstance.imageUploadProgresses = [NSMutableDictionary dictionary];
[[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(onMediaUploadProgress:) name:kMXMediaUploadProgressNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(onMediaLoaderStateDidChange:) name:kMXMediaLoaderStateDidChangeNotification object:nil];
// Add observer to handle logout
[[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(checkUserAccount) name:kMXKAccountManagerDidRemoveAccountNotification object:nil];
@@ -503,21 +503,30 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
#pragma mark - Notifications
- (void)onMediaUploadProgress:(NSNotification *)notification
- (void)onMediaLoaderStateDidChange:(NSNotification *)notification
{
self.imageUploadProgresses[notification.object] = (NSNumber *)notification.userInfo[kMXMediaLoaderProgressValueKey];
if ([self.delegate respondsToSelector:@selector(shareExtensionManager:mediaUploadProgress:)])
{
const NSInteger totalImagesCount = self.pendingImages.count;
CGFloat totalProgress = 0.0;
for (NSNumber *progress in self.imageUploadProgresses.allValues)
MXMediaLoader *loader = (MXMediaLoader*)notification.object;
// Consider only upload progress
switch (loader.state) {
case MXMediaLoaderStateUploadInProgress:
{
totalProgress += progress.floatValue/totalImagesCount;
self.imageUploadProgresses[loader.uploadId] = (NSNumber *)loader.statisticsDict[kMXMediaLoaderProgressValueKey];
if ([self.delegate respondsToSelector:@selector(shareExtensionManager:mediaUploadProgress:)])
{
const NSInteger totalImagesCount = self.pendingImages.count;
CGFloat totalProgress = 0.0;
for (NSNumber *progress in self.imageUploadProgresses.allValues)
{
totalProgress += progress.floatValue/totalImagesCount;
}
[self.delegate shareExtensionManager:self mediaUploadProgress:totalProgress];
}
break;
}
[self.delegate shareExtensionManager:self mediaUploadProgress:totalProgress];
default:
break;
}
}
@@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>0.7.7</string>
<string>0.7.8</string>
<key>CFBundleVersion</key>
<string>0.7.7</string>
<string>0.7.8</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
+2 -2
View File
@@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>0.7.7</string>
<string>0.7.8</string>
<key>CFBundleVersion</key>
<string>0.7.7</string>
<string>0.7.8</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>