diff --git a/.gitignore b/.gitignore index 5d97bc8a50..260d787a95 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,8 @@ Pods/ # Do not track our workspace since it is created by CocoaPods *.xcworkspace + +# Fastlane +fastlane/report.xml +fastlane/Reports +fastlane/README.md \ No newline at end of file diff --git a/CHANGES.rst b/CHANGES.rst index 50184430e6..dac886b66c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,80 @@ +Changes in 0.7.x (2018-xx-xx) +=============================================== + +Improvements: + * 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). + +Changes in 0.7.7 (2018-10-31) +=============================================== + +Improvements: + * Upgrade MatrixKit version (v0.8.6). + +Bug fix: + * Notifications: old notifications can reappear (#1985). + +Changes in 0.7.6 (2018-10-05) +=============================================== + +Bug fix: + * 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). + +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). + +Bug fix: + * 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). + +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). + +Changes in 0.7.2 (2018-08-24) +=============================================== + +Improvements: + * Upgrade MatrixKit version (v0.8.2). + * Server Quota Notices in Riot (#1937). + +Bug fix: + * User defaults: the preset application language (if any) is ignored. + * Recents: Avoid to open a room twice (it crashed on room creation on quick HSes). + * Riot-bot: Do not try to create a room with it if the user homeserver is not federated. + +Changes in 0.7.1 (2018-08-17) +=============================================== + +Improvements: + * Upgrade MatrixKit version (v0.8.1). + +Bug fix: + * Empty app if initial /sync fails (#1975). + * Direct rooms can be lost on an initial /sync (vector-im/riot-ios/issues/1983). + * Fix possible race conditions in direct rooms management. + Changes in 0.7.0 (2018-08-10) =============================================== diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..cacbc44b66 --- /dev/null +++ b/Gemfile @@ -0,0 +1,8 @@ +source "https://rubygems.org" + +gem "xcode-install" +gem "fastlane" +gem "cocoapods", '~>1.5.3' + +plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') +eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..c877354711 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,207 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.0) + activesupport (4.2.10) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + atomos (0.1.3) + babosa (1.0.2) + claide (1.0.2) + cocoapods (1.5.3) + activesupport (>= 4.0.2, < 5) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.5.3) + cocoapods-deintegrate (>= 1.0.2, < 2.0) + cocoapods-downloader (>= 1.2.0, < 2.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-stats (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.3.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (~> 2.0.1) + gh_inspector (~> 1.0) + molinillo (~> 0.6.5) + nap (~> 1.0) + ruby-macho (~> 1.1) + xcodeproj (>= 1.5.7, < 2.0) + cocoapods-core (1.5.3) + activesupport (>= 4.0.2, < 6) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + cocoapods-deintegrate (1.0.2) + cocoapods-downloader (1.2.1) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.0) + cocoapods-stats (1.0.0) + cocoapods-trunk (1.3.1) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.1.0) + colored (1.2) + colored2 (3.1.2) + commander-fastlane (4.4.6) + highline (~> 1.7.2) + concurrent-ruby (1.0.5) + declarative (0.0.10) + declarative-option (0.1.0) + domain_name (0.5.20180417) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.5.0) + emoji_regex (0.1.1) + escape (0.0.4) + excon (0.62.0) + faraday (0.15.3) + multipart-post (>= 1.2, < 3) + faraday-cookie_jar (0.0.6) + faraday (>= 0.7.4) + http-cookie (~> 1.0.0) + faraday_middleware (0.12.2) + faraday (>= 0.7.4, < 1.0) + fastimage (2.1.4) + fastlane (2.105.2) + CFPropertyList (>= 2.3, < 4.0.0) + addressable (>= 2.3, < 3.0.0) + babosa (>= 1.0.2, < 2.0.0) + bundler (>= 1.12.0, < 2.0.0) + colored + commander-fastlane (>= 4.4.6, < 5.0.0) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (~> 0.1) + excon (>= 0.45.0, < 1.0.0) + faraday (~> 0.9) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 0.9) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-api-client (>= 0.21.2, < 0.24.0) + highline (>= 1.7.2, < 2.0.0) + json (< 3.0.0) + mini_magick (~> 4.5.1) + multi_json + multi_xml (~> 0.5) + multipart-post (~> 2.0.0) + plist (>= 3.1.0, < 4.0.0) + public_suffix (~> 2.0.0) + rubyzip (>= 1.2.2, < 2.0.0) + security (= 0.1.3) + simctl (~> 1.6.3) + slack-notifier (>= 2.0.0, < 3.0.0) + terminal-notifier (>= 1.6.2, < 2.0.0) + terminal-table (>= 1.4.5, < 2.0.0) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.6.0, < 2.0.0) + xcpretty (~> 0.3.0) + xcpretty-travis-formatter (>= 0.0.3) + fastlane-plugin-versioning (0.3.4) + fourflusher (2.0.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + google-api-client (0.23.9) + addressable (~> 2.5, >= 2.5.1) + googleauth (>= 0.5, < 0.7.0) + httpclient (>= 2.8.1, < 3.0) + mime-types (~> 3.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + signet (~> 0.9) + googleauth (0.6.6) + faraday (~> 0.12) + jwt (>= 1.4, < 3.0) + memoist (~> 0.12) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (~> 0.7) + highline (1.7.10) + http-cookie (1.0.3) + domain_name (~> 0.5) + httpclient (2.8.3) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + json (2.1.0) + jwt (2.1.0) + memoist (0.16.0) + mime-types (3.2.2) + mime-types-data (~> 3.2015) + mime-types-data (3.2018.0812) + mini_magick (4.5.1) + minitest (5.11.3) + molinillo (0.6.6) + multi_json (1.13.1) + multi_xml (0.6.0) + multipart-post (2.0.0) + nanaimo (0.2.6) + nap (1.1.0) + naturally (2.2.0) + netrc (0.11.0) + os (1.0.0) + plist (3.4.0) + public_suffix (2.0.5) + representable (3.0.4) + declarative (< 0.1.0) + declarative-option (< 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rouge (2.0.7) + ruby-macho (1.3.1) + rubyzip (1.2.2) + security (0.1.3) + signet (0.10.0) + addressable (~> 2.3) + faraday (~> 0.9) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simctl (1.6.5) + CFPropertyList + naturally + slack-notifier (2.3.2) + terminal-notifier (1.8.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + tty-cursor (0.6.0) + tty-screen (0.6.5) + tty-spinner (0.8.0) + tty-cursor (>= 0.5.0) + tzinfo (1.2.5) + thread_safe (~> 0.1) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.5) + unicode-display_width (1.4.0) + word_wrap (1.0.0) + xcode-install (2.4.4) + claide (>= 0.9.1, < 1.1.0) + fastlane (>= 2.1.0, < 3.0.0) + xcodeproj (1.6.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.2.6) + xcpretty (0.3.0) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.0) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + ruby + +DEPENDENCIES + cocoapods (~> 1.5.3) + fastlane + fastlane-plugin-versioning + xcode-install + +BUNDLED WITH + 1.16.4 diff --git a/Podfile b/Podfile index 2522b9ac87..790e0cbad8 100644 --- a/Podfile +++ b/Podfile @@ -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.3' +#$matrixKitVersion = '0.8.6' # The develop branch version $matrixKitVersion = 'develop' @@ -115,16 +115,6 @@ post_install do |installer| config.build_settings['ENABLE_BITCODE'] = 'NO' config.build_settings['SWIFT_VERSION'] = '4.0' # Required for PiwikTracker. Should be removed end - - # Set the right identity to build pods frameworks to be able to make release builds - # See https://github.com/CocoaPods/CocoaPods/issues/3156#issuecomment-102022787 - if target.to_s.include? 'Pods' - target.build_configurations.each do |config| - if !config.to_s.include? 'Debug' - config.build_settings['CODE_SIGN_IDENTITY[sdk=iphoneos*]'] = 'iPhone Distribution' - end - end - end end end diff --git a/Podfile.lock b/Podfile.lock index 313a443267..9caa87eb7f 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -143,10 +143,10 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: MatrixKit: - :commit: ebd5d28bfa667b302c77b80825085411be0a51f3 + :commit: dbb5140be4f907f005d9da65018972675b4ca8ad :git: https://github.com/matrix-org/matrix-ios-kit.git MatrixSDK: - :commit: f2806f7176dfefc22470c47763f6c48b4440dd87 + :commit: c524a2a11df721e3f771dec93ffc5f930aacba45 :git: https://github.com/matrix-org/matrix-ios-sdk.git PiwikTracker: :commit: dfb048f25f4eefbe13ff7515c3c1c2cad5d94491 @@ -172,6 +172,6 @@ SPEC CHECKSUMS: SwiftLint: 3207c1faa2240bf8973b191820a116113cd11073 WebRTC: f2a6203584745fe53532633397557876b5d71640 -PODFILE CHECKSUM: c6fedf6188c4d8f7803e2bcdc174aba8d49a4403 +PODFILE CHECKSUM: 2d57530ee506d5a8f295884a7cdf563322fd6362 COCOAPODS: 1.6.0.beta.2 diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index 26be777378..5627ddaf4e 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -166,7 +166,6 @@ 0250C5142122B68000034691 /* GDPRConsentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17982FE2119FED2001FD722 /* GDPRConsentViewController.swift */; }; 0250C5192122B68000034691 /* MXSession+Riot.m in Sources */ = {isa = PBXBuildFile; fileRef = 926FA53E1F4C132000F826C2 /* MXSession+Riot.m */; }; 0250C51E2122B68000034691 /* UsersDevicesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B1B556E520EE6C4C00210D55 /* UsersDevicesViewController.m */; }; - 0250C5202122B68000034691 /* MatrixSDK+Swift.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C1033F211DD1A100DFFB5D /* MatrixSDK+Swift.m */; }; 0250C5292122B68000034691 /* WidgetPickerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B1B5576220EE702800210D55 /* WidgetPickerViewController.m */; }; 0250C52B2122B68000034691 /* IntegrationManagerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B1B5576020EE702800210D55 /* IntegrationManagerViewController.m */; }; 0250C52D2122B68000034691 /* FilesSearchCellData.m in Sources */ = {isa = PBXBuildFile; fileRef = B16932EC20F3C3C800746532 /* FilesSearchCellData.m */; }; @@ -236,7 +235,6 @@ 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, ); }; }; 3284A35120A07C210044F922 /* postMessageAPI.js in Resources */ = {isa = PBXBuildFile; fileRef = 3284A35020A07C210044F922 /* postMessageAPI.js */; }; - 32C10340211DD1A100DFFB5D /* MatrixSDK+Swift.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C1033F211DD1A100DFFB5D /* MatrixSDK+Swift.m */; }; 599A0B2BF3E50939A4FBD2DD /* Pods_RiotPods_TchapTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08BA8F52677EE3F18661D478 /* Pods_RiotPods_TchapTests.framework */; }; 75123CD1FC3AEA01A1B0ABBE /* Pods_RiotPods_SiriIntents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 940A45C29F3CB0D58EFBCA8B /* Pods_RiotPods_SiriIntents.framework */; }; 926FA53F1F4C132000F826C2 /* MXSession+Riot.m in Sources */ = {isa = PBXBuildFile; fileRef = 926FA53E1F4C132000F826C2 /* MXSession+Riot.m */; }; @@ -777,8 +775,6 @@ 32BDC9A4211C34C90064AF51 /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/InfoPlist.strings; sourceTree = ""; }; 32BDC9A5211C34C90064AF51 /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/Localizable.strings; sourceTree = ""; }; 32BDC9A6211C34C90064AF51 /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/Vector.strings; sourceTree = ""; }; - 32C1033E211DD1A100DFFB5D /* MatrixSDK+Swift.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MatrixSDK+Swift.h"; sourceTree = ""; }; - 32C1033F211DD1A100DFFB5D /* MatrixSDK+Swift.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "MatrixSDK+Swift.m"; sourceTree = ""; }; 4AF7DFFA02629E46BC6A48DC /* 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 = ""; }; 4F5F4F8534177BF9B5F0CB94 /* Pods-RiotPods-TchapTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RiotPods-TchapTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RiotPods-TchapTests/Pods-RiotPods-TchapTests.debug.xcconfig"; sourceTree = ""; }; 926FA53D1F4C132000F826C2 /* MXSession+Riot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MXSession+Riot.h"; sourceTree = ""; }; @@ -2754,8 +2750,6 @@ F0D2ADA01F6AA5FD00A7097D /* MXRoomSummary+Riot.m */, 926FA53D1F4C132000F826C2 /* MXSession+Riot.h */, 926FA53E1F4C132000F826C2 /* MXSession+Riot.m */, - 32C1033E211DD1A100DFFB5D /* MatrixSDK+Swift.h */, - 32C1033F211DD1A100DFFB5D /* MatrixSDK+Swift.m */, ); path = Categories; sourceTree = ""; @@ -3692,7 +3686,6 @@ 02BEE18A212AB23A00098505 /* ThirdPartyIDPlatformInfoResolver.swift in Sources */, 0250C51E2122B68000034691 /* UsersDevicesViewController.m in Sources */, B109EF182170DFEB0018FA06 /* UserService.swift in Sources */, - 0250C5202122B68000034691 /* MatrixSDK+Swift.m in Sources */, B1BC6A212136CA7F00D32F8E /* Stylable.swift in Sources */, B15B866E21353C8D002782BE /* TextInputProperties.swift in Sources */, B1322FFC21301B5D0054A9DD /* AuthenticationServiceError.swift in Sources */, @@ -3826,7 +3819,6 @@ B17982FF2119FED2001FD722 /* GDPRConsentViewController.swift in Sources */, 926FA53F1F4C132000F826C2 /* MXSession+Riot.m in Sources */, B1B5574720EE6C4D00210D55 /* UsersDevicesViewController.m in Sources */, - 32C10340211DD1A100DFFB5D /* MatrixSDK+Swift.m in Sources */, B1B5577020EE702800210D55 /* WidgetPickerViewController.m in Sources */, B1B5576F20EE702800210D55 /* IntegrationManagerViewController.m in Sources */, B16932EE20F3C3C900746532 /* FilesSearchCellData.m in Sources */, diff --git a/Riot/Assets/bg.lproj/Vector.strings b/Riot/Assets/bg.lproj/Vector.strings index ad437d2867..17d0dc5381 100644 --- a/Riot/Assets/bg.lproj/Vector.strings +++ b/Riot/Assets/bg.lproj/Vector.strings @@ -71,7 +71,7 @@ "auth_username_in_use" = "Потребителското име е вече заето"; "auth_forgot_password" = "Забравена парола?"; "auth_email_not_found" = "Неуспешно изпращане на имейл: Този имейл адрес не беше открит"; -"auth_use_server_options" = "Използване на потребителски опции за сървър (разширени)"; +"auth_use_server_options" = "Потребителски опции за сървър (разширени)"; "auth_email_validation_message" = "Моля, проверете имейла си, за да продължите регистрацията"; "auth_msisdn_validation_title" = "Очакване на потвърждение"; "auth_msisdn_validation_message" = "Изпратихме Ви SMS с код за активиране. Моля, въведете този код по-долу."; @@ -189,8 +189,8 @@ "room_participants_action_remove" = "Премахни от тази стая"; "room_participants_action_ban" = "Блокирай в тази стая"; "room_participants_action_unban" = "Отблокирай"; -"room_participants_action_ignore" = "Скрий всички съобщения от този потребител"; -"room_participants_action_unignore" = "Покажи всички съобщения от този потребител"; +"room_participants_action_ignore" = "Скрий всички съобщения от потребителя"; +"room_participants_action_unignore" = "Покажи всички съобщения от потребителя"; "room_participants_action_set_moderator" = "Направи модератор"; "room_participants_action_set_admin" = "Направи администратор"; "room_participants_action_start_new_chat" = "Започни нов чат"; @@ -454,12 +454,6 @@ "do_not_ask_again" = "Не питай отново"; "camera_access_not_granted" = "%@ няма разрешение да използва камерата. Моля, проверете настройките за сигурност"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "Покана от %@"; -"room_displayname_room_invite" = "Покана за стая"; -"room_displayname_two_members" = "%@ и %@"; -"room_displayname_more_than_two_members" = "%@ и %u други"; -"room_displayname_no_title" = "Празна стая"; // Call "call_incoming_voice_prompt" = "Входящо гласово повикване от %@"; "call_incoming_video_prompt" = "Входящо видео повикване от %@"; @@ -552,3 +546,12 @@ "settings_labs_room_members_lazy_loading" = "Постепенно зареждане на членовете в стаи"; "settings_labs_room_members_lazy_loading_error_message" = "Сървърът Ви все още не поддържа постепенно зареждане на членовете в стаи. Опитайте по-късно."; "room_event_action_view_decrypted_source" = "Прегледай разшифрования източник"; +"room_recents_server_notice_section" = "СИСТЕМНИ УВЕДОМЛЕНИЯ"; +"room_resource_limit_exceeded_message_contact_1" = " Моля, "; +"room_resource_limit_exceeded_message_contact_2_link" = "свържете се с администратора на услугата,"; +"room_resource_limit_exceeded_message_contact_3" = " за да продължите да я използвате."; +"homeserver_connection_lost" = "Неуспешна връзка със сървъра."; +"room_resource_usage_limit_reached_message_1_default" = "Сървърът е достигнал някое от ограниченията си за ползване, така че "; +"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" = " за да увеличите този лимит."; diff --git a/Riot/Assets/ca.lproj/Vector.strings b/Riot/Assets/ca.lproj/Vector.strings index 2b5485964f..b95257160c 100644 --- a/Riot/Assets/ca.lproj/Vector.strings +++ b/Riot/Assets/ca.lproj/Vector.strings @@ -457,12 +457,6 @@ "do_not_ask_again" = "No preguntar més"; "camera_access_not_granted" = "%@ no té permís per usar la càmera, si us plau canvia els ajustos de privacitat"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "Convidat des de %@"; -"room_displayname_room_invite" = "Convida a la sala"; -"room_displayname_two_members" = "%@ i %@"; -"room_displayname_more_than_two_members" = "%@ i %u més"; -"room_displayname_no_title" = "Sala buida"; // Call "call_incoming_voice_prompt" = "Trucada de veu entrant de %@"; "call_incoming_video_prompt" = "Trucada de vídeo entrant de %@"; diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 1c0472bd4c..822d312024 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -58,7 +58,7 @@ "auth_username_in_use" = "Nutzername bereits verwendet"; "auth_forgot_password" = "Passwort vergessen?"; "auth_msisdn_validation_title" = "Verifizierung ausstehend"; -"auth_msisdn_validation_message" = "Wir sandten eine SMS mit einem Aktivierungs-Code. Bitte gebe den unten ein."; +"auth_msisdn_validation_message" = "Bitte gib unten den Aktivierungs-Code ein, den wir per SMS verschickt haben."; "auth_msisdn_validation_error" = "Telefonnummer kann nicht verifiziert werden."; "auth_reset_password_missing_password" = "Ein neues Passwort muss eingegeben werden."; "auth_reset_password_next_step_button" = "Ich habe meine E-Mail-Adresse verifiziert"; @@ -221,7 +221,7 @@ "settings_remove_prompt_title" = "Bestätigung"; "settings_remove_email_prompt_msg" = "Bist du sicher, dass du die E-Mail-Adresse %@ entfernen möchtest?"; "settings_email_address" = "E-Mail"; -"settings_email_address_placeholder" = "Gebe deine E-Mail-Adresse ein"; +"settings_email_address_placeholder" = "Gib deine E-Mail-Adresse ein"; "settings_add_email_address" = "Füge E-Mail-Adresse hinzu"; "settings_remove_phone_prompt_msg" = "Bist du sicher, dass du die Telefon-Nummer %@ entfernen möchtest?"; "settings_night_mode" = "Nacht Modus"; @@ -313,7 +313,7 @@ "room_preview_try_join_an_unknown_room" = "Du versuchst auf %@ zuzugreifen. Möchtest du dem Raum beitreten um teilzunehmen?"; "settings_config_identity_server" = "Identitätsserver ist %@"; "settings_labs" = "Labor"; -"settings_sign_out_e2e_warn" = "Du wirst die Ende-zu-Ende Schlüssel verlieren. Du kannst dann keine alten Nachrichten mehr in verschlüsselten Räumen auf diesem Gerät lesen."; +"settings_sign_out_e2e_warn" = "Du wirst die Ende-zu-Ende Schlüssel verlieren. Du kannst dann auf diesem Gerät in verschlüsselten Räumen keine alten Nachrichten mehr lesen."; "settings_phone_number" = "Telefon"; "settings_add_phone_number" = "Telefonnummer hinzufügen"; "settings_fail_to_update_profile" = "Profilaktualisierung fehlgeschlagen"; @@ -381,12 +381,6 @@ "rage_shake_prompt" = "Du scheinst das Gerät frustriert zu schütteln. Möchtest du einen Bug Report senden?"; "camera_access_not_granted" = "%@ hat keine Berechtigung die Kamera zu nutzen, bitte berechtigen"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "Einladung von %@"; -"room_displayname_room_invite" = "Raum-Einladung"; -"room_displayname_two_members" = "%@ und %@"; -"room_displayname_more_than_two_members" = "%@ und %u andere"; -"room_displayname_no_title" = "Leerer Raum"; // Call "call_incoming_voice_prompt" = "Eingehender Sprach-Anruf von %@"; "call_incoming_video_prompt" = "Eingehender Video-Anruf von %@"; @@ -553,3 +547,12 @@ "settings_labs_room_members_lazy_loading" = "Raummitglieder verzögert laden"; "settings_labs_room_members_lazy_loading_error_message" = "Dein Heimserver unterstützt das verzögerte Laden von Raummitgliedern noch nicht. Versuche es später erneut."; "room_event_action_view_decrypted_source" = "Zeige entschlüsselten Quellcode"; +"room_recents_server_notice_section" = "SYSTEMBENACHRICHTIGUNGEN"; +"room_resource_limit_exceeded_message_contact_1" = " Bitte "; +"room_resource_limit_exceeded_message_contact_2_link" = "kontaktiere deinen Dienst-Administrator"; +"room_resource_limit_exceeded_message_contact_3" = " um diesen Service weiter zu nutzen."; +"homeserver_connection_lost" = "Konnte keine Verbindung zum Heimserver herstellen."; +"room_resource_usage_limit_reached_message_1_default" = "Dieser Heimserver hat einen seiner Ressourcen-Limits überschritten, sodass "; +"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."; diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 08b8d3258b..e34fb4f237 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -133,6 +133,7 @@ "room_recents_conversations_section" = "ROOMS"; "room_recents_no_conversation" = "No rooms"; "room_recents_low_priority_section" = "LOW PRIORITY"; +"room_recents_server_notice_section" = "SYSTEM ALERTS"; "room_recents_invites_section" = "INVITES"; "room_recents_start_chat_with" = "Start chat"; "room_recents_create_empty_room" = "Create room"; @@ -277,6 +278,13 @@ "room_replacement_link" = "The conversation continues here."; "room_predecessor_information" = "This room is a continuation of another conversation."; "room_predecessor_link" = "Click here to see older messages."; +"room_resource_limit_exceeded_message_contact_1" = " Please "; +"room_resource_limit_exceeded_message_contact_2_link" = "contact your service administrator"; +"room_resource_limit_exceeded_message_contact_3" = " to continue using this service."; +"room_resource_usage_limit_reached_message_1_default" = "This homeserver has exceeded one of its resource limits so "; +"room_resource_usage_limit_reached_message_1_monthly_active_user" = "This homeserver has hit its Monthly Active User limit so "; +"room_resource_usage_limit_reached_message_2" = "some users will not be able to log in."; +"room_resource_usage_limit_reached_message_contact_3" = " to get this limit increased."; // Unknown devices "unknown_devices_alert_title" = "Room contains unknown devices"; @@ -330,7 +338,7 @@ "settings_sign_out" = "Sign Out"; "settings_sign_out_confirmation" = "Are you sure?"; -"settings_sign_out_e2e_warn" = "You will lose your end-to-end encryption keys. That means you will be no more able to read old messages in encrypted rooms on this device."; +"settings_sign_out_e2e_warn" = "You will lose your end-to-end encryption keys. That means you will no longer be able to read old messages in encrypted rooms on this device."; "settings_profile_picture" = "Profile Picture"; "settings_display_name" = "Display Name"; "settings_first_name" = "First Name"; @@ -537,6 +545,7 @@ "today" = "Today"; "yesterday" = "Yesterday"; "network_offline_prompt" = "The Internet connection appears to be offline."; +"homeserver_connection_lost" = "Could not connect to the homeserver."; "public_room_section_title" = "Public Rooms (at %@):"; "bug_report_prompt" = "The application has crashed last time. Would you like to submit a crash report?"; "rage_shake_prompt" = "You seem to be shaking the phone in frustration. Would you like to submit a bug report?"; @@ -544,13 +553,6 @@ "camera_access_not_granted" = "%@ doesn't have permission to use Camera, please change privacy settings"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "Invite from %@"; -"room_displayname_room_invite" = "Room Invite"; -"room_displayname_two_members" = "%@ and %@"; -"room_displayname_more_than_two_members" = "%@ and %u others"; -"room_displayname_no_title" = "Empty room"; - // Call "call_incoming_voice_prompt" = "Incoming voice call from %@"; "call_incoming_video_prompt" = "Incoming video call from %@"; diff --git a/Riot/Assets/es.lproj/InfoPlist.strings b/Riot/Assets/es.lproj/InfoPlist.strings new file mode 100644 index 0000000000..29135e9354 --- /dev/null +++ b/Riot/Assets/es.lproj/InfoPlist.strings @@ -0,0 +1,5 @@ +// Permissions usage explanations +"NSCameraUsageDescription" = "La cámara se utiliza para tomar fotos y vídeos, realizar llamadas de vídeo."; +"NSPhotoLibraryUsageDescription" = "La biblioteca de fotos se utiliza para enviar fotos y vídeos."; +"NSMicrophoneUsageDescription" = "El micrófono se utiliza para tomar vídeos, realizar llamadas."; +"NSContactsUsageDescription" = "Para mostrarte cuáles de tus contactos ya utilizan Riot o Matrix, podemos enviar las direcciones de correo electrónico y números telefónicos de tu agenda de contactos a tu Servidor de Identidad de Matrix. New Vector no almacena estos datos ni los utiliza para ningún otro propósito. Para obtener más información, por favor consulta la página de política de privacidad en los ajustes de la aplicación."; diff --git a/Riot/Assets/es.lproj/Localizable.strings b/Riot/Assets/es.lproj/Localizable.strings new file mode 100644 index 0000000000..a931b34de3 --- /dev/null +++ b/Riot/Assets/es.lproj/Localizable.strings @@ -0,0 +1,52 @@ +/* New message from a specific person, not referencing a room */ +"MSG_FROM_USER" = "Mensaje de %@"; +/* New message from a specific person in a named room */ +"MSG_FROM_USER_IN_ROOM" = "%@ publicó en %@"; +/* 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" = "%@ en %@: %@"; +/* 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" = "%@ te envió una imagen %@"; +/* New action message from a specific person in a named room. */ +"IMAGE_FROM_USER_IN_ROOM" = "%@ publicó una imagen %@ en %@"; +/* A single unread message in a room */ +"SINGLE_UNREAD_IN_ROOM" = "Recibiste un mensaje en %@"; +/* A single unread message */ +"SINGLE_UNREAD" = "Recibiste un mensaje"; +/* Multiple unread messages in a room */ +"UNREAD_IN_ROOM" = "%@ mensajes nuevos en %@"; +/* Multiple unread messages from a specific person, not referencing a room */ +"MSGS_FROM_USER" = "%@ mensajes nuevos en %@"; +/* Multiple unread messages from two people */ +"MSGS_FROM_TWO_USERS" = "%@ mensajes nuevos de %@ y %@"; +/* Multiple unread messages from three people */ +"MSGS_FROM_THREE_USERS" = "%@ mensajes nuevos de %@, %@ y %@"; +/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */ +"MSGS_FROM_TWO_PLUS_USERS" = "%@ mensajes nuevos de %@, %@ y otros"; +/* Multiple messages in two rooms */ +"MSGS_IN_TWO_ROOMS" = "%@ mensajes nuevos en %@ y %@"; +/* Look, stuff's happened, alright? Just open the app. */ +"MSGS_IN_TWO_PLUS_ROOMS" = "%@ mensajes nuevos en %@, %@ y otros"; +/* A user has invited you to a chat */ +"USER_INVITE_TO_CHAT" = "%@ te invitó a conversar"; +/* A user has invited you to an (unamed) group chat */ +"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ te invitó a una conversación en grupo"; +/* A user has invited you to a named room */ +"USER_INVITE_TO_NAMED_ROOM" = "%@ te invitó a %@"; +/* Incoming one-to-one voice call */ +"VOICE_CALL_FROM_USER" = "Llamada de %@"; +/* Incoming one-to-one video call */ +"VIDEO_CALL_FROM_USER" = "Llamada de vídeo de %@"; +/* Incoming unnamed voice conference invite from a specific person */ +"VOICE_CONF_FROM_USER" = "Llamada en grupo de %@"; +/* Incoming unnamed video conference invite from a specific person */ +"VIDEO_CONF_FROM_USER" = "Llamada de vídeo en grupo de %@"; +/* Incoming named voice conference invite from a specific person */ +"VOICE_CONF_NAMED_FROM_USER" = "Llamada en grupo de %@: '%@'"; +/* Incoming named video conference invite from a specific person */ +"VIDEO_CONF_NAMED_FROM_USER" = "Llamada de vídeo en grupo de %@: '%@'"; diff --git a/Riot/Assets/es.lproj/Vector.strings b/Riot/Assets/es.lproj/Vector.strings index 123f9877ad..c6af540455 100644 --- a/Riot/Assets/es.lproj/Vector.strings +++ b/Riot/Assets/es.lproj/Vector.strings @@ -1,84 +1,84 @@ // Titles "title_home" = "Inicio"; "title_favourites" = "Favoritos"; -"title_people" = "Contactos"; +"title_people" = "Personas"; "title_rooms" = "Salas"; -"warning" = "Atención"; +"warning" = "Advertencia"; // Actions "view" = "Ver"; -"next" = "SIguiente"; -"back" = "Anterior"; +"next" = "Siguiente"; +"back" = "Atrás"; "continue" = "Continuar"; "create" = "Crear"; "start" = "Iniciar"; "leave" = "Salir"; -"remove" = "Remover"; +"remove" = "Eliminar"; "invite" = "Invitar"; "retry" = "Re-intentar"; "on" = "Activado"; "off" = "Desactivado"; "cancel" = "Cancelar"; "save" = "Guardar"; -"join" = "Entrar"; +"join" = "Unirse"; "decline" = "Rechazar"; "accept" = "Aceptar"; -"preview" = "Vista previa"; +"preview" = "Vista Previa"; "camera" = "Cámara"; "voice" = "Voz"; "video" = "Vídeo"; -"active_call" = "Llamada activa"; -"active_call_details" = "Llamada activa (%@)"; -"later" = "Después"; +"active_call" = "Llamada Activa"; +"active_call_details" = "Llamada Activa (%@)"; +"later" = "Más Tarde"; "rename" = "Renombrar"; "collapse" = "colapsar"; // Authentication -"auth_login" = "Ingresar"; +"auth_login" = "Iniciar sesión"; "auth_register" = "Registrar"; "auth_submit" = "Enviar"; "auth_skip" = "Omitir"; -"auth_send_reset_email" = "Enviar Email de restauración"; -"auth_return_to_login" = "Regresar a pantalla de ingreso"; -"auth_user_id_placeholder" = "Email o nombre de usuario"; +"auth_send_reset_email" = "Enviar Correo Electrónico de Restauración"; +"auth_return_to_login" = "Regresar a la pantalla de inicio de sesión"; +"auth_user_id_placeholder" = "Correo electrónico o nombre de usuario"; "auth_password_placeholder" = "Contraseña"; -"auth_new_password_placeholder" = "Nueva contraseña"; +"auth_new_password_placeholder" = "Contraseña nueva"; "auth_user_name_placeholder" = "Nombre de usuario"; -"auth_optional_email_placeholder" = "Dirección de Email (opcional)"; -"auth_email_placeholder" = "Dirección Email"; +"auth_optional_email_placeholder" = "Dirección de correo electrónico (opcional)"; +"auth_email_placeholder" = "Dirección de correo electrónico"; "send_to" = "Enviar a %@"; "sending" = "Enviando"; -"auth_optional_phone_placeholder" = "Numero telefónico (opcional)"; -"auth_phone_placeholder" = "Numero telefónico"; -"auth_repeat_password_placeholder" = "Repita la contraseña"; -"auth_repeat_new_password_placeholder" = "Confirme su nueva contraseña"; -"auth_home_server_placeholder" = "LUR (ej. https://matrix.org)"; -"auth_identity_server_placeholder" = "LUR (ej. https://matrix.org)"; -"auth_invalid_login_param" = "Usuario y/o contraseña incorrecta"; -"auth_invalid_user_name" = "Nombres de usuario solo pueden contener letras, números, puntos, guiones y barras bajas"; -"auth_invalid_password" = "Contraseña muy corta (min 6)"; -"auth_invalid_email" = "Esto no parece un correo electrónico valido"; -"auth_invalid_phone" = "Esto no parece un número telefónico valido"; -"auth_missing_password" = "Contraseña ausente"; -"auth_add_email_message" = "Añade un correo electrónico a tu cuenta para poder ser descubierto por otros usuarios, y ser capaz de recomponer tu contraseña."; -"auth_add_phone_message" = "Añade un número telefónico a tu cuenta para ser descubierto por otros usuarios."; +"auth_optional_phone_placeholder" = "Número telefónico (opcional)"; +"auth_phone_placeholder" = "Número telefónico"; +"auth_repeat_password_placeholder" = "Repite la contraseña"; +"auth_repeat_new_password_placeholder" = "Confirma tu contraseña nueva"; +"auth_home_server_placeholder" = "URL (ej. https://matrix.org)"; +"auth_identity_server_placeholder" = "URL (ej. https://matrix.org)"; +"auth_invalid_login_param" = "Nombre de usuario y/o contraseña incorrectos"; +"auth_invalid_user_name" = "Los nombres de usuario solo pueden contener letras, números, puntos, guiones y guiones bajos"; +"auth_invalid_password" = "Contraseña demasiado corta (mínimo 6)"; +"auth_invalid_email" = "Esto no parece ser una dirección de correo electrónico válida"; +"auth_invalid_phone" = "Esto no parece ser un número telefónico válido"; +"auth_missing_password" = "Falta la contraseña"; +"auth_add_email_message" = "Añade una dirección de correo electrónico a tu cuenta para poder ser descubierto por otros usuarios, y ser capaz de restablecer tu contraseña."; +"auth_add_phone_message" = "Añade un número telefónico a tu cuenta para poder ser descubierto por otros usuarios."; "title_groups" = "Comunidades"; "deactivate_account_password_alert_title" = "Desactivar Cuenta"; "deactivate_account_validate_action" = "Desactivar cuenta"; -"deactivate_account_password_alert_message" = "Para continuar, ingrese su contraseña"; +"deactivate_account_password_alert_message" = "Para continuar, ingresa tu contraseña por favor"; "deactivate_account_forget_messages_information_part2_emphasize" = "Advertencia"; "deactivate_account_informations_part2_emphasize" = "Esta acción es irreversible."; -"rerequest_keys_alert_message" = "Por favor, inicie Riot en otro dispositivo que pueda descifrar el mensaje para que pueda enviar las claves a este dispositivo."; +"rerequest_keys_alert_message" = "Por favor, inicia Riot en otro dispositivo que pueda descifrar el mensaje para que pueda enviar las claves a este dispositivo."; // Re-request confirmation dialog "rerequest_keys_alert_title" = "Solicitud Enviada"; "auth_password_dont_match" = "Las contraseñas no coinciden"; "auth_username_in_use" = "Nombre de usuario en uso"; "auth_email_in_use" = "Esta dirección de correo electrónico ya está en uso"; -"auth_phone_in_use" = "Este número de teléfono ya está en uso"; -"auth_use_server_options" = "Usar opciones personalizadas del servidor (avanzado)"; -"auth_reset_password_missing_password" = "Se debe introducir una nueva contraseña."; +"auth_phone_in_use" = "Este número telefónico ya está en uso"; +"auth_use_server_options" = "Utilizar opciones personalizadas del servidor (avanzado)"; +"auth_reset_password_missing_password" = "Debes ingresar una contraseña nueva."; "auth_reset_password_next_step_button" = "He verificado mi dirección de correo electrónico"; "room_creation_appearance" = "Apariencia"; "room_creation_appearance_name" = "Nombre"; -"room_creation_make_public" = "Hacer público"; +"room_creation_make_public" = "Hacer pública"; "room_recents_create_empty_room" = "Crear sala"; // People tab "people_invites_section" = "INVITACIONES"; @@ -96,7 +96,7 @@ "search_default_placeholder" = "Buscar"; "search_no_result" = "No hay resultados"; "search_in_progress" = "Buscando…"; -"directory_searching_title" = "Buscando directorio.."; +"directory_searching_title" = "Buscando directorio…"; // Contacts "contacts_address_book_section" = "CONTACTOS LOCALES"; "contacts_address_book_matrix_users_toggle" = "Solo usuarios de Matrix"; @@ -106,6 +106,448 @@ "room_participants_one_participant" = "1 participante"; "room_participants_multi_participants" = "%d participantes"; "room_participants_remove_prompt_title" = "Confirmación"; -"room_participants_remove_prompt_msg" = "¿Estas seguro de que quieres eliminar a %@ de este chat?"; +"room_participants_remove_prompt_msg" = "¿Seguro que quieres eliminar a %@ de esta conversación?"; "room_participants_invite_prompt_title" = "Confirmación"; -"room_participants_invite_prompt_msg" = "¿Estás seguro de que quieres invitar a %@ a este chat?"; +"room_participants_invite_prompt_msg" = "¿Seguro que quieres invitar a %@ a esta conversación?"; +"auth_add_email_phone_message" = "Añade una dirección de correo electrónico y/o un número telefónico a tu cuenta para poder ser descubierto por otros usuarios. Además, la dirección de correo electrónico te permitirá restablecer tu contraseña."; +"auth_add_email_and_phone_message" = "Añade una dirección de correo electrónico y un número telefónico a tu cuenta para poder ser descubierto por otros usuarios. Además, la dirección de correo electrónico te permitirá restablecer tu contraseña."; +"auth_missing_email" = "Falta la dirección de correo electrónico"; +"auth_missing_phone" = "Falta el número telefónico"; +"auth_missing_email_or_phone" = "Falta la dirección de correo electrónico o el número telefónico"; +"auth_untrusted_id_server" = "El servidor de identidad no es de confianza"; +"auth_forgot_password" = "¿Olvidaste tu contraseña?"; +"auth_email_not_found" = "No se pudo enviar el correo electrónico: No se encontró esta dirección de correo electrónico"; +"auth_email_validation_message" = "Por favor consulta tu correo electrónico para continuar con el registro"; +"auth_msisdn_validation_title" = "Verificación Pendiente"; +"auth_msisdn_validation_message" = "Hemos enviado un SMS con un código de activación. Por favor, ingresa este código a continuación."; +"auth_msisdn_validation_error" = "No se pudo verificar el número telefónico."; +"auth_recaptcha_message" = "Este Servidor Doméstico quiere asegurarse de que no eres un robot"; +"auth_reset_password_message" = "Para restablecer tu contraseña, ingresa la dirección de correo electrónico vinculada a tu cuenta:"; +"auth_reset_password_missing_email" = "Debes ingresar la dirección de correo electrónico vinculada a tu cuenta."; +"auth_reset_password_email_validation_message" = "Se envió un correo electrónico a %@. Una vez que hayas seguido el enlace que contiene, haz clic a continuación."; +"auth_reset_password_error_unauthorized" = "No se pudo verificar la dirección de correo electrónico: asegúrate de hacer clic en el enlace del correo electrónico"; +"auth_reset_password_error_not_found" = "Tu dirección de correo electrónico no parece estar asociada a una ID de Matrix en este Servidor Doméstico."; +"auth_reset_password_success_message" = "Tu contraseña fue restablecida.\n\nSe ha cerrado sesión en todos tus dispositivos y ya no recibirás notificaciones push. Para volver a habilitar las notificaciones, vuelve a iniciar sesión en cada dispositivo."; +"auth_add_email_and_phone_warning" = "Todavía no es posible registrarse con correo electrónico y número telefónico a la vez, hasta que exista la API. Solo se tendrá en cuenta el número telefónico. Puedes añadir tu correo electrónico a tu perfil en ajustes."; +// Chat creation +"room_creation_title" = "Nueva Conversación"; +"room_creation_account" = "Cuenta"; +"room_creation_appearance_picture" = "Imagen de conversación (opcional)"; +"room_creation_privacy" = "Privacidad"; +"room_creation_private_room" = "Esta conversación es privada"; +"room_creation_public_room" = "Esta conversación es pública"; +"room_creation_make_public_prompt_title" = "¿Hacer pública esta conversación?"; +"room_creation_make_public_prompt_msg" = "¿Seguro que quieres hacer pública esta conversación? Cualquier persona podrá leer tus mensajes y unirse a la conversación."; +"room_creation_keep_private" = "Mantener privada"; +"room_creation_make_private" = "Hacer privada"; +"room_creation_wait_for_creation" = "Ya se está creando una sala. Espera por favor."; +"room_creation_invite_another_user" = "Buscar / invitar por ID de Usuario, Nombre o correo electrónico"; +// Room recents +"room_recents_directory_section" = "DIRECTORIO DE SALAS"; +"room_recents_directory_section_network" = "Red"; +"room_recents_favourites_section" = "FAVORITOS"; +"room_recents_people_section" = "PERSONAS"; +"room_recents_conversations_section" = "SALAS"; +"room_recents_no_conversation" = "No hay salas"; +"room_recents_low_priority_section" = "PRIORIDAD BAJA"; +"room_recents_invites_section" = "INVITACIONES"; +"room_recents_start_chat_with" = "Iniciar conversación"; +"room_recents_join_room" = "Unirse a la sala"; +"room_recents_join_room_title" = "Unirse a una sala"; +"room_recents_join_room_prompt" = "Escribe una ID o alias de sala"; +"search_people" = "Personas"; +"search_people_placeholder" = "Buscar por ID de Usuario, Nombre o correo electrónico"; +// Directory +"directory_cell_title" = "Explorar directorio"; +"directory_cell_description" = "%tu salas"; +"directory_search_results_title" = "Explorar resultados de directorio"; +"directory_search_results" = "%tu resultados encontrados para %@"; +"directory_search_results_more_than" = ">%tu resultados encontrados para %@"; +"directory_search_fail" = "Error al buscar datos"; +"contacts_address_book_no_contact" = "No hay contactos locales"; +"contacts_address_book_permission_required" = "Se requiere permiso para acceder a tus contactos locales"; +"contacts_address_book_permission_denied" = "No permitiste que Riot acceda a tus contactos locales"; +"contacts_user_directory_section" = "DIRECTORIO DE USUARIOS"; +"contacts_user_directory_offline_section" = "DIRECTORIO DE USUARIOS (desconectados)"; +"room_participants_leave_prompt_title" = "Salir de la sala"; +"room_participants_leave_prompt_msg" = "¿Seguro que quieres salir de la sala?"; +"room_participants_remove_third_party_invite_msg" = "Eliminar la invitación de terceros aún no es posible, hasta que exista la API"; +"room_participants_filter_room_members" = "Filtrar miembros de la sala"; +"room_participants_invite_another_user" = "Buscar / invitar por ID de Usuario, Nombre o correo electrónico"; +"room_participants_invite_malformed_id_title" = "Error en invitación"; +"room_participants_invite_malformed_id" = "ID mal formada. Debería ser una dirección de correo electrónico o una ID de Matrix como '@partelocal:dominio'"; +"room_participants_invited_section" = "INVITADO"; +"room_participants_online" = "En línea"; +"room_participants_offline" = "Desconectado"; +"room_participants_unknown" = "Desconocido"; +"room_participants_idle" = "En reposo"; +"room_participants_now" = "ahora"; +"room_participants_ago" = "hace"; +"room_participants_action_section_admin_tools" = "Herramientas de administración"; +"room_participants_action_section_direct_chats" = "Conversaciones directas"; +"room_participants_action_section_devices" = "Dispositivos"; +"room_participants_action_section_other" = "Otro"; +"room_participants_action_invite" = "Invitar"; +"room_participants_action_leave" = "Salir de esta sala"; +"room_participants_action_remove" = "Eliminar de esta sala"; +"room_participants_action_ban" = "Vetar de esta sala"; +"room_participants_action_unban" = "Quitar Veto"; +"room_participants_action_ignore" = "Ocultar todos los mensajes de este usuario"; +"room_participants_action_unignore" = "Mostrar todos los mensajes de este usuario"; +"room_participants_action_set_default_power_level" = "Restablecer a usuario normal"; +"room_participants_action_set_moderator" = "Convertir a moderador"; +"room_participants_action_set_admin" = "Convertir a administrador"; +"room_participants_action_start_new_chat" = "Iniciar nueva conversación"; +"room_participants_action_start_voice_call" = "Iniciar llamada de voz"; +"room_participants_action_start_video_call" = "Iniciar llamada de vídeo"; +"room_participants_action_mention" = "Mencionar"; +// Chat +"room_jump_to_first_unread" = "Ir al primer mensaje no leído"; +"room_new_message_notification" = "%d mensaje nuevo"; +"room_new_messages_notification" = "%d mensajes nuevos"; +"room_one_user_is_typing" = "%@ está escribiendo…"; +"room_two_users_are_typing" = "%@ y %@ están escribiendo…"; +"room_many_users_are_typing" = "%@, %@ y otros están escribiendo…"; +"room_message_placeholder" = "Enviar un mensaje (sin cifrar)…"; +"room_message_reply_to_placeholder" = "Enviar una respuesta (sin cifrar)…"; +"room_do_not_have_permission_to_post" = "No tienes permiso para publicar en esta sala"; +"encrypted_room_message_placeholder" = "Enviar un mensaje cifrado…"; +"encrypted_room_message_reply_to_placeholder" = "Enviar una respuesta cifrada…"; +"room_message_short_placeholder" = "Enviar un mensaje…"; +"room_message_reply_to_short_placeholder" = "Enviar una respuesta…"; +"room_offline_notification" = "Se perdió la conexión con el servidor."; +"room_unsent_messages_notification" = "Los mensajes no se enviaron. ¿%@ o %@ ahora?"; +"room_unsent_messages_unknown_devices_notification" = "No se envió el mensaje debido a dispositivos desconocidos presentes. ¿%@ o %@ ahora?"; +"room_recents_server_notice_section" = "ALERTAS DE SISTEMA"; +"room_ongoing_conference_call" = "Llamada de conferencia en curso. Unirse con %@ o %@."; +"room_ongoing_conference_call_with_close" = "Llamada de conferencia en curso. Unirse con %@ o %@. %@ la."; +"room_ongoing_conference_call_close" = "Cerrar"; +"room_conference_call_no_power" = "Necesitas permiso para gestionar llamadas de conferencia en esta sala"; +"room_prompt_resend" = "Reenviar todo"; +"room_prompt_cancel" = "cancelar todo"; +"room_resend_unsent_messages" = "Reenviar mensajes no enviados"; +"room_delete_unsent_messages" = "Eliminar mensajes no enviados"; +"room_event_action_copy" = "Copiar"; +"room_event_action_quote" = "Citar"; +"room_event_action_redact" = "Quitar"; +"room_event_action_more" = "Más"; +"room_event_action_share" = "Compartir"; +"room_event_action_permalink" = "Enlace Permanente"; +"room_event_action_view_source" = "Ver Fuente"; +"room_event_action_view_decrypted_source" = "Ver Fuente Descifrada"; +"room_event_action_report" = "Reportar contenido"; +"room_event_action_report_prompt_reason" = "Motivo para reportar este contenido"; +"room_event_action_kick_prompt_reason" = "Motivo para expulsar a este usuario"; +"room_event_action_ban_prompt_reason" = "Motivo para vetar a este usuario"; +"room_event_action_report_prompt_ignore_user" = "¿Quieres ocultar todos los mensajes de este usuario?"; +"room_event_action_save" = "Guardar"; +"room_event_action_resend" = "Reenviar"; +"room_event_action_delete" = "Eliminar"; +"room_event_action_cancel_send" = "Cancelar Envío"; +"room_event_action_cancel_download" = "Cancelar Descarga"; +"room_event_action_view_encryption" = "Información de Cifrado"; +"room_warning_about_encryption" = "El cifrado de extremo a extremo está en beta y puede no ser confiable.\n\nAún no deberías confiar en él para proteger tus datos.\n\nLos dispositivos todavía no podrán descifrar el historial desde antes de unirse a la sala.\n\nLos mensajes cifrados no serán visibles en clientes que aún no implementen el cifrado."; +"room_event_failed_to_send" = "Falló el envío"; +"room_action_send_photo_or_video" = "Enviar fotografía o vídeo"; +"room_action_send_sticker" = "Enviar pegatina"; +"room_replacement_information" = "Esta sala ha sido reemplazada y ya no está activa."; +"room_replacement_link" = "La conversación continúa aquí."; +"room_predecessor_information" = "Esta sala es una continuación de otra conversación."; +"room_predecessor_link" = "Haz clic aquí para ver mensajes más antiguos."; +"room_resource_limit_exceeded_message_contact_1" = " Por favor "; +"room_resource_limit_exceeded_message_contact_2_link" = "contacta al administrador de tu servicio"; +"room_resource_limit_exceeded_message_contact_3" = " para continuar utilizando este servicio."; +// Unknown devices +"unknown_devices_alert_title" = "La sala contiene dispositivos desconocidos"; +"unknown_devices_alert" = "Esta sala contiene dispositivos desconocidos que no han sido verificados.\nEsto significa que no hay garantía de que los dispositivos pertenezcan a los usuarios a los que dicen pertenecer.\nRecomendamos que pases por el proceso de verificación para cada dispositivo antes de continuar, pero puedes reenviar el mensaje sin verificarlos si prefieres."; +"unknown_devices_send_anyway" = "Enviar de Todos Modos"; +"unknown_devices_call_anyway" = "Llamar de todos modos"; +"unknown_devices_answer_anyway" = "Contestar de Todos Modos"; +"unknown_devices_verify" = "Verificar…"; +"unknown_devices_title" = "Dispositivos desconocidos"; +// Room Title +"room_title_new_room" = "Sala nueva"; +"room_title_multiple_active_members" = "%@/%@ miembros activos"; +"room_title_one_active_member" = "%@/%@ miembro activo"; +"room_title_invite_members" = "Invitar miembros"; +"room_title_members" = "%@ miembros"; +"room_title_one_member" = "1 miembro"; +// Room Preview +"room_preview_invitation_format" = "Has sido invitado por %@ a unirte a esta sala"; +"room_preview_subtitle" = "Esta es una vista previa de esta sala. Las interacciones dentro de la sala se han deshabilitado."; +"room_preview_unlinked_email_warning" = "Esta invitación fue enviada a %@, que no está asociado a esta cuenta. Quizás quieras iniciar sesión con otra cuenta, o añadir este correo electrónico a esta cuenta."; +"room_preview_try_join_an_unknown_room" = "Estás intentando acceder a %@. ¿Quieres unirte para participar en la discusión?"; +"room_preview_try_join_an_unknown_room_default" = "una sala"; +// Settings +"settings_title" = "Ajustes"; +"account_logout_all" = "Cerrar sesión de todas las cuentas"; +"settings_config_no_build_info" = "No hay información de compilación"; +"settings_mark_all_as_read" = "Marcar todos los mensajes como leídos"; +"settings_report_bug" = "Reportar error"; +"settings_config_home_server" = "Servidor doméstico es %@"; +"settings_config_identity_server" = "Servidor de identidad es %@"; +"settings_config_user_id" = "Sesión iniciada como %@"; +"settings_user_settings" = "AJUSTES DE USUARIO"; +"settings_notifications_settings" = "AJUSTES DE NOTIFICACIÓN"; +"settings_calls_settings" = "LLAMADAS"; +"settings_user_interface" = "INTERFAZ DE USUARIO"; +"settings_ignored_users" = "USUARIOS IGNORADOS"; +"settings_contacts" = "CONTACTOS LOCALES"; +"settings_advanced" = "AVANZADO"; +"settings_other" = "OTRO"; +"settings_labs" = "LABORATORIOS"; +"settings_flair" = "Mostrar insignia donde esté permitido"; +"settings_devices" = "DISPOSITIVOS"; +"settings_cryptography" = "CRIPTOGRAFÍA"; +"settings_deactivate_account" = "DESACTIVAR CUENTA"; +"settings_sign_out" = "Cerrar Sesión"; +"settings_sign_out_confirmation" = "¿Estás seguro?"; +"settings_sign_out_e2e_warn" = "Perderás tus claves de cifrado de extremo a extremo. Esto significa que no podrás leer mensajes antiguos en salas cifradas desde este dispositivo."; +"settings_profile_picture" = "Imagen de Perfil"; +"settings_display_name" = "Nombre Público"; +"settings_first_name" = "Nombre de Pila"; +"settings_surname" = "Apellido"; +"settings_remove_prompt_title" = "Confirmación"; +"settings_remove_email_prompt_msg" = "¿Seguro que quieres eliminar la dirección de correo electrónico %@?"; +"settings_remove_phone_prompt_msg" = "¿Seguro que quieres eliminar el número telefónico %@?"; +"settings_email_address" = "Correo Electrónico"; +"settings_email_address_placeholder" = "Ingresa tu dirección de correo electrónico"; +"settings_add_email_address" = "Añadir dirección de correo electrónico"; +"settings_phone_number" = "Teléfono"; +"settings_add_phone_number" = "Añadir número telefónico"; +"settings_night_mode" = "Modo Nocturno"; +"settings_fail_to_update_profile" = "Error al actualizar el perfil"; +"settings_enable_push_notif" = "Notificaciones en este dispositivo"; +"settings_show_decrypted_content" = "Mostrar contenido descifrado"; +"settings_global_settings_info" = "Los ajustes de notificación globales están disponibles en tu cliente web %@"; +"settings_pin_rooms_with_missed_notif" = "Fijar salas con notificaciones pendientes"; +"settings_pin_rooms_with_unread" = "Fijar salas con mensajes no leídos"; +"settings_on_denied_notification" = "Las notificaciones están denegadas para %@, por favor habilita notificaciones en los ajustes de tu dispositivo"; +"settings_enable_callkit" = "Integración de llamadas"; +"settings_callkit_info" = "Recibe llamadas entrantes en tu pantalla de bloqueo. Ve tus llamadas de Riot en el historial de llamadas del sistema. Si iCloud está habilitado, este historial de llamadas se compartirá con Apple."; +"settings_ui_language" = "Idioma"; +"settings_ui_theme" = "Tema"; +"settings_ui_theme_auto" = "Automático"; +"settings_ui_theme_light" = "Claro"; +"settings_ui_theme_dark" = "Oscuro"; +"settings_ui_theme_black" = "Negro"; +"settings_ui_theme_picker_title" = "Selecciona un tema"; +"settings_ui_theme_picker_message" = "\"Auto\" utiliza los ajustes de \"Invertir Colores\" de tu dispositivo"; +"settings_unignore_user" = "¿Mostrar todos los mensajes de %@?"; +"settings_contacts_discover_matrix_users" = "Utiliza correos electrónicos y números telefónicos para descubrir usuarios"; +"settings_contacts_phonebook_country" = "País de directorio telefónico"; +"settings_labs_e2e_encryption" = "Cifrado de Extremo a Extremo"; +"settings_labs_e2e_encryption_prompt_message" = "Debes iniciar sesión de nuevo para finalizar la configuración del cifrado."; +"settings_labs_room_members_lazy_loading" = "Cargar miembros de la sala con carga diferida"; +"settings_labs_room_members_lazy_loading_error_message" = "Tu servidor doméstico aún no admite la carga diferida de los miembros de la sala. Intenta más tarde."; +"settings_labs_create_conference_with_jitsi" = "Crear llamadas de conferencia con jitsi"; +"settings_version" = "Versión %@"; +"settings_olm_version" = "Versión de Olm %@"; +"settings_copyright" = "Derechos de autor"; +"settings_copyright_url" = "https://riot.im/copyright"; +"settings_term_conditions" = "Términos y Condiciones"; +"settings_term_conditions_url" = "https://riot.im/tac_apple"; +"settings_privacy_policy" = "Política de Privacidad"; +"settings_privacy_policy_url" = "https://riot.im/privacy"; +"settings_third_party_notices" = "Avisos de Terceros"; +"settings_send_crash_report" = "Enviar datos de uso e informes de fallas anónimos"; +"settings_enable_rageshake" = "Agitar con rabia para reportar un error"; +"settings_clear_cache" = "Borrar caché"; +"settings_change_password" = "Cambiar contraseña"; +"settings_old_password" = "contraseña anterior"; +"settings_new_password" = "contraseña nueva"; +"settings_confirm_password" = "confirmar contraseña"; +"settings_fail_to_update_password" = "No se pudo actualizar la contraseña"; +"settings_password_updated" = "Tu contraseña ha sido actualizada"; +"settings_crypto_device_name" = "Nombre de dispositivo: "; +"settings_crypto_device_id" = "\nID de Dispositivo: "; +"settings_crypto_device_key" = "\nClave de dispositivo: "; +"settings_crypto_export" = "Exportar claves"; +"settings_crypto_blacklist_unverified_devices" = "Cifrar solo a dispositivos verificados"; +"settings_deactivate_my_account" = "Desactivar mi cuenta"; +// Room Details +"room_details_title" = "Detalles de Sala"; +"room_details_people" = "Miembros"; +"room_details_files" = "Archivos"; +"room_details_settings" = "Ajustes"; +"room_details_photo" = "Imagen de Sala"; +"room_details_room_name" = "Nombre de Sala"; +"room_details_topic" = "Tema"; +"room_details_favourite_tag" = "Agregar a Favoritos"; +"room_details_low_priority_tag" = "Prioridad baja"; +"room_details_mute_notifs" = "Silenciar notificaciones"; +"room_details_direct_chat" = "Conversación Directa"; +"room_details_access_section" = "¿Quién puede acceder a esta sala?"; +"room_details_access_section_invited_only" = "Solo personas que han sido invitadas"; +"room_details_access_section_anyone_apart_from_guest" = "Cualquier persona que conozca el enlace a esta sala, excepto huéspedes"; +"room_details_access_section_anyone" = "Cualquier persona que conozca el enlace a esta sala, incluyendo huéspedes"; +"room_details_access_section_no_address_warning" = "Para crear un enlace a una sala, debe tener una dirección"; +"room_details_access_section_directory_toggle" = "Listar esta sala en el directorio de salas"; +"room_details_history_section" = "¿Quién puede leer el historial?"; +"room_details_history_section_anyone" = "Todos"; +"room_details_history_section_members_only" = "Solo miembros (desde el momento en que se selecciona esta opción)"; +"room_details_history_section_members_only_since_invited" = "Solo miembros (desde que fueron invitados)"; +"room_details_history_section_members_only_since_joined" = "Solo miembros (desde que se unieron)"; +"room_details_history_section_prompt_title" = "Advertencia de privacidad"; +"room_details_history_section_prompt_msg" = "Los cambios aplicados a quién puede leer el historial solo se aplicarán a mensajes futuros en esta sala. La visibilidad del historial existente no cambiará."; +"room_details_addresses_section" = "Direcciones"; +"room_details_no_local_addresses" = "Esta sala no tiene direcciones locales"; +"room_details_new_address" = "Añadir dirección nueva"; +"room_details_new_address_placeholder" = "Añadir dirección nueva (ej. #foo%@)"; +"room_details_addresses_invalid_address_prompt_title" = "Formato de alias inválido"; +"room_details_addresses_invalid_address_prompt_msg" = "%@ no es un formato de alias válido"; +"room_details_fail_to_add_room_aliases" = "No se pudieron agregar las nuevas direcciones de sala"; +"room_details_fail_to_update_room_canonical_alias" = "No se pudo actualizar la dirección principal"; +"room_details_addresses_disable_main_address_prompt_title" = "Advertencia de la dirección principal"; +"room_details_addresses_disable_main_address_prompt_msg" = "No tendrás una dirección principal especificada. La dirección principal por defecto para esta sala se elegirá al azar"; +"room_details_flair_invalid_id_prompt_title" = "Formato inválido"; +"room_details_flair_invalid_id_prompt_msg" = "%@ no es un identificador válido para una comunidad"; +"room_details_flair_section" = "Mostrar insignias para las comunidades"; +"room_details_new_flair_placeholder" = "Añadir nueva ID de comunidad (ej. +foo%@)"; +"room_details_banned_users_section" = "Usuarios vetados"; +"room_details_advanced_section" = "Avanzado"; +"room_details_advanced_room_id" = "ID de Sala:"; +"room_details_advanced_enable_e2e_encryption" = "Habilitar cifrado (advertencia: ¡no se puede volver a deshabilitar!)"; +"room_details_advanced_e2e_encryption_enabled" = "El cifrado está habilitado en esta sala"; +"room_details_advanced_e2e_encryption_disabled" = "El cifrado no está habilitado en esta sala."; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Cifrar solo a dispositivos verificados"; +"room_details_advanced_e2e_encryption_prompt_message" = "El cifrado de extremo a extremo es experimental y puede no ser confiable.\n\nAún no deberías confiar en él para proteger tus datos.\n\nLos dispositivos todavía no podrán descifrar el historial desde antes de unirse a la sala.\n\nUna vez que se habilita el cifrado en una sala no se puede volver a desactivar (por ahora).\n\nLos mensajes cifrados no serán visibles en clientes que aún no implementen el cifrado."; +"room_details_fail_to_update_avatar" = "No se pudo actualizar la imagen de la sala"; +"room_details_fail_to_update_room_name" = "No se pudo actualizar el nombre de la sala"; +"room_details_fail_to_update_topic" = "No se pudo actualizar el tema"; +"room_details_fail_to_update_room_guest_access" = "No se pudo actualizar el acceso de huéspedes en la sala"; +"room_details_fail_to_update_room_join_rule" = "No se pudo actualizar la regla de unión"; +"room_details_fail_to_update_room_directory_visibility" = "No se pudo actualizar la visibilidad en el directorio de salas"; +"room_details_fail_to_update_history_visibility" = "No se pudo actualizar la visibilidad del historial"; +"room_details_fail_to_remove_room_aliases" = "No se pudieron eliminar las direcciones de sala"; +"room_details_fail_to_update_room_communities" = "No se pudieron actualizar las comunidades relacionadas"; +"room_details_fail_to_update_room_direct" = "No se pudo actualizar la marca directa de esta sala"; +"room_details_fail_to_enable_encryption" = "No se pudo habilitar el cifrado en esta sala"; +"room_details_save_changes_prompt" = "¿Quieres guardar los cambios?"; +"room_details_set_main_address" = "Establecer como Dirección Principal"; +"room_details_unset_main_address" = "Dejar de Establecer como Dirección Principal"; +"room_details_copy_room_id" = "Copiar ID de Sala"; +"room_details_copy_room_address" = "Copiar Dirección de Sala"; +"room_details_copy_room_url" = "Copiar la URL de la Sala"; +// Group Details +"group_details_title" = "Detalles de Comunidad"; +"group_details_home" = "Inicio"; +"group_details_people" = "Personas"; +"group_details_rooms" = "Salas"; +// Group Home +"group_home_one_member_format" = "1 miembro"; +"group_home_multi_members_format" = "%tu miembros"; +"group_home_one_room_format" = "1 sala"; +"group_home_multi_rooms_format" = "%tu salas"; +"group_invitation_format" = "%@ te invitó a unirte a esta comunidad"; +// Group participants +"group_participants_add_participant" = "Añadir participante"; +"group_participants_leave_prompt_title" = "Salir del grupo"; +"group_participants_leave_prompt_msg" = "¿Seguro que quieres salir del grupo?"; +"group_participants_remove_prompt_title" = "Confirmación"; +"group_participants_remove_prompt_msg" = "¿Seguro que quieres eliminar %@ de este grupo?"; +"group_participants_invite_prompt_title" = "Confirmación"; +"group_participants_invite_prompt_msg" = "¿Seguro que quieres invitar a %@ a este grupo?"; +"group_participants_filter_members" = "Filtrar miembros de la comunidad"; +"group_participants_invite_another_user" = "Buscar / invitar por ID de Usuario o Nombre"; +"group_participants_invite_malformed_id_title" = "Falló la Invitación"; +"group_participants_invite_malformed_id" = "ID mal formada. Debería ser una ID de Matrix como '@partelocal:dominio'"; +"group_participants_invited_section" = "INVITADOS"; +// Group rooms +"group_rooms_filter_rooms" = "Filtrar salas de la comunidad"; +// Read Receipts +"read_receipts_list" = "Lista de Recibos de Lectura"; +"receipt_status_read" = "Leído: "; +// Media picker +"media_picker_library" = "Biblioteca"; +"media_picker_select" = "Seleccionar"; +// Directory +"directory_title" = "Directorio"; +"directory_server_picker_title" = "Seleccionar un directorio"; +"directory_server_all_rooms" = "Todas las salas en el servidor %@"; +"directory_server_all_native_rooms" = "Todas las salas nativas de Matrix"; +"directory_server_type_homeserver" = "Escribe un servidor doméstico desde donde listar las salas públicas"; +"directory_server_placeholder" = "matrix.org"; +// Events formatter +"event_formatter_member_updates" = "%tu cambios de membresía"; +"event_formatter_widget_added" = "componente %@ añadido por %@"; +"event_formatter_widget_removed" = "componente %@ eliminado por %@"; +"event_formatter_jitsi_widget_added" = "conferencia vozIP añadida por %@"; +"event_formatter_jitsi_widget_removed" = "conferencia vozIP eliminada por %@"; +"event_formatter_rerequest_keys_part1_link" = "Volver a solicitar las claves de cifrado"; +"event_formatter_rerequest_keys_part2" = " de tus otros dispositivos."; +// Others +"or" = "o"; +"you" = "Tú"; +"today" = "Hoy"; +"yesterday" = "Ayer"; +"network_offline_prompt" = "La conexión a Internet parece estar desconectada."; +"homeserver_connection_lost" = "No se pudo conectar al servidor doméstico."; +"public_room_section_title" = "Salas Públicas (en %@):"; +"bug_report_prompt" = "La aplicación falló en la última sesión. ¿Te gustaría enviar un informe de fallas?"; +"rage_shake_prompt" = "Parece que estás agitando el teléfono con frustración. ¿Te gustaría enviar un informe de error?"; +"do_not_ask_again" = "No preguntar de nuevo"; +"camera_access_not_granted" = "%@ no tiene permiso para utilizar la Cámara, por favor cambia los ajustes de privacidad"; +"large_badge_value_k_format" = "%.1fK"; +// Call +"call_incoming_voice_prompt" = "Llamada de voz entrante de %@"; +"call_incoming_video_prompt" = "Llamada de vídeo entrante de %@"; +"call_incoming_voice" = "Llamada entrante..."; +"call_incoming_video" = "Llamada de vídeo entrante..."; +"call_already_displayed" = "Ya hay una llamada en curso."; +"call_jitsi_error" = "No se ha podido unir a la llamada de conferencia."; +// No VoIP support +"no_voip_title" = "Llamada entrante"; +"no_voip" = "%@ te está llamando pero %@ aún no admite llamadas.\nPuedes ignorar esta notificación y contestar la llamada desde otro dispositivo o puedes rechazarla."; +// Crash report +"google_analytics_use_prompt" = "¿Te gustaría ayudar a mejorar %@ enviando automáticamente informes de fallas y datos de uso anónimos?"; +// Crypto +"e2e_enabling_on_app_update" = "Riot ahora admite cifrado de extremo a extremo pero debes volver a iniciar sesión para habilitarlo.\n\nPuedes hacerlo ahora o más tarde desde los ajustes de la aplicación."; +"e2e_need_log_in_again" = "Tienes que volver a iniciar sesión para generar claves de cifrado de extremo a extremo para este dispositivo y enviar la clave pública a tu servidor doméstico.\nEsto es por única vez; disculpas por la molestia."; +// Bug report +"bug_report_title" = "Informe de Error"; +"bug_report_description" = "Por favor describe el error. ¿Qué hiciste? ¿Qué esperabas que sucediera? ¿Qué sucedió realmente?"; +"bug_crash_report_title" = "Informe de Fallas"; +"bug_report_logs_description" = "Para diagnosticar problemas, los registros de este cliente se enviarán junto con este informe de error. Si prefieres enviar solo el texto anterior, por favor desmarca:"; +"bug_report_send_logs" = "Enviar registros"; +"bug_report_progress_zipping" = "Recolectando registros"; +// Share extension +"share_extension_auth_prompt" = "Inicia sesión en la aplicación principal para compartir contenido"; +// Room key request dialog +"e2e_room_key_request_title" = "Solicitud de clave de cifrado"; +"deactivate_account_informations_part1" = "Esto hará que tu cuenta quede permanentemente inutilizable. No podrás iniciar sesión, y nadie podrá volver a registrar la misma ID de usuario. Esto hará que tu cuenta salga de todas las salas en las cuales participa, y eliminará los datos de tu cuenta de tu servidor de identidad. "; +"bug_crash_report_description" = "Por favor describe lo que hacías antes de la falla:"; +"bug_report_send_screenshot" = "Enviar captura de pantalla"; +"bug_report_progress_uploading" = "Subiendo informe"; +"bug_report_send" = "Enviar"; +// Widget +"widget_no_power_to_manage" = "Necesitas permiso para gestionar los componentes en esta sala"; +"widget_creation_failure" = "La creación del componente falló"; +"widget_sticker_picker_no_stickerpacks_alert" = "Actualmente no tienes ningún paquete de pegatinas habilitado."; +"widget_sticker_picker_no_stickerpacks_alert_add_now" = "¿Añadir algunos ahora?"; +// Widget Integration Manager +"widget_integration_need_to_be_able_to_invite" = "Debes ser capaz de invitar usuarios para realizar esa acción."; +"widget_integration_unable_to_create" = "No es posible crear el componente."; +"widget_integration_failed_to_send_request" = "El envío de la solicitud falló."; +"widget_integration_room_not_recognised" = "No se reconoce esta sala."; +"widget_integration_positive_power_level" = "El nivel de autoridad debe ser un número entero positivo."; +"widget_integration_must_be_in_room" = "No estás en esta sala."; +"widget_integration_no_permission_in_room" = "No tienes permiso para realizar esa acción en esta sala."; +"widget_integration_missing_room_id" = "Falta el room_id en la solicitud."; +"widget_integration_missing_user_id" = "Falta el user_id en la solicitud."; +"widget_integration_room_not_visible" = "La sala %@ no está visible."; +"share_extension_failed_to_encrypt" = "Falló el envío. Comprueba los ajustes de cifrado para esta sala en la aplicación principal"; +"e2e_room_key_request_message_new_device" = "Añadiste un nuevo dispositivo '%@', que está solicitando claves de cifrado."; +"e2e_room_key_request_message" = "Tu dispositivo sin verificar '%@' está solicitando claves de cifrado."; +"e2e_room_key_request_start_verification" = "Iniciar verificación..."; +"e2e_room_key_request_share_without_verifying" = "Compartir sin verificar"; +"e2e_room_key_request_ignore_request" = "Ignorar solicitud"; +// GDPR +"gdpr_consent_not_given_alert_message" = "Para continuar utilizando el servidor doméstico %@, debes revisar y aceptar los términos y condiciones."; +"gdpr_consent_not_given_alert_review_now_action" = "Revisar ahora"; +"deactivate_account_title" = "Desactivar Cuenta"; +"deactivate_account_informations_part3" = "\n\nDesactivar tu cuenta "; +"deactivate_account_informations_part4_emphasize" = "no hace que por defecto olvidemos los mensajes que has enviado. "; +"deactivate_account_informations_part5" = "Si quieres que olvidemos tus mensajes, por favor marca la casilla a continuación\n\nLa visibilidad de mensajes en Matrix es similar a la del correo electrónico. Que olvidemos tus mensajes implica que los mensajes que hayas enviado no se compartirán con ningún usuario nuevo o no registrado, pero aquellos usuarios registrados que ya tengan acceso a estos mensajes seguirán teniendo acceso a su copia."; +"deactivate_account_forget_messages_information_part1" = "Por favor, olvida todos los mensajes enviados al desactivar mi cuenta ("; +"deactivate_account_forget_messages_information_part3" = ": esto provocará que los usuarios futuros vean conversaciones incompletas)"; diff --git a/Riot/Assets/eu.lproj/Vector.strings b/Riot/Assets/eu.lproj/Vector.strings index b5d62a62c5..45af38be82 100644 --- a/Riot/Assets/eu.lproj/Vector.strings +++ b/Riot/Assets/eu.lproj/Vector.strings @@ -54,8 +54,8 @@ "auth_user_name_placeholder" = "Erabiltzaile-izena"; "auth_add_email_message" = "Gehitu e-mail helbide bat zure kontura erabiltzaileek zu aurkitzea baimentzeko, eta zuk pasahitza berrezarri ahal izateko."; "auth_add_phone_message" = "Gehitu telefono zenbaki bat zure kontura beste erabiltzaileek zu aurkitzea ahalbidetzeko."; -"auth_optional_email_placeholder" = "E-mail helbidea (aukerazkoa)"; -"auth_optional_phone_placeholder" = "Telefono zenbakia (aukerazkoa)"; +"auth_optional_email_placeholder" = "E-mail helbidea (aukerakoa)"; +"auth_optional_phone_placeholder" = "Telefono zenbakia (aukerakoa)"; "auth_repeat_password_placeholder" = "Errepikatu pasahitza"; "auth_repeat_new_password_placeholder" = "Berretsi zure pasahitza"; "auth_invalid_login_param" = "Erabiltzaile-izen eta/edo pasahitz okerra"; @@ -131,8 +131,6 @@ "room_event_action_report_prompt_ignore_user" = "Erabiltzaile honen mezu guztiak ezkutatu nahi dituzu?"; "room_event_action_cancel_upload" = "Utzi igoera"; "room_event_action_cancel_download" = "Utzi deskarga"; -"room_displayname_room_invite" = "Gela gonbidapena"; -"room_displayname_no_title" = "Gela hutsa"; "room_participants_filter_room_members" = "Iragazi gelako kideak"; "room_recents_conversations_section" = "GELAK"; "room_recents_people_section" = "JENDEA"; @@ -227,7 +225,7 @@ "auth_reset_password_error_not_found" = "Zure e-mail helbidea ez dago antza hasiera zerbitzari honetako Matrix ID batekin lotuta."; "room_creation_account" = "Kontua"; "room_creation_appearance" = "Itxura"; -"room_creation_appearance_picture" = "Txateko irudia (aukerazkoa)"; +"room_creation_appearance_picture" = "Txateko irudia (aukerakoa)"; "room_creation_privacy" = "Pribatutasuna"; "room_creation_private_room" = "Txat hau pribatua da"; "room_creation_public_room" = "Txat hau publikoa da"; @@ -398,16 +396,12 @@ "public_room_section_title" = "Gela publikoak (%@ zerbitzarian):"; "camera_access_not_granted" = "%@(e)k ez du kamera erabiltzeko baimenik, aldatu pribatutasun ezarpenak"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "Gonbidatu %@ gelatik"; "auth_add_email_and_phone_warning" = "E-maila eta telefono zenbakia aldi berean erabiliz erregistratzea ez da onartzen APIa ez dagoen bitartean. Telefono zenbakia besterik ez da hartu aintzat. E-maila zure profilera gehitu dezakezu ezarpenetan."; "room_participants_remove_third_party_invite_msg" = "Hirugarrengoen gonbidapenak kentzea ez da onartzen APIa ez dagoen bitartean"; -"settings_sign_out_e2e_warn" = "Zure muturretik muturrerako zifratze gakoak galduko dituzu. Horrek esan nahi du ezin izango dituzula mezu zaharrak irakurri zifratutako geletan gailu honetatik."; +"settings_sign_out_e2e_warn" = "Zure muturretik muturrerako zifratze gakoak galduko dituzu. Horrek esan nahi du ezin izango dituzula mezu zaharrak gehiago irakurri zifratutako geletan gailu honetatik."; "settings_global_settings_info" = "Jakinarazpen orokorren ezarpenak eskuragarri daude zure %@ web bezeroan"; "settings_on_denied_notification" = "Jakinarazpenak ukatu dira %@(e)n, baimendu zure gailuaren ezarpenetan"; "room_details_history_section_prompt_msg" = "Historiala nork irakurri dezakeen aldatzea gelak honetara aurrerantzean bidalitako mezuei besterik ez zaie aplikatuako. Badagoen historialaren ikusgaitasuna ez da aldatuko."; -"room_displayname_two_members" = "%@ eta %@"; -"room_displayname_more_than_two_members" = "%@ eta beste %u"; // Call "call_incoming_voice_prompt" = "%@ erabiltzailearen deia jasotzen"; "call_incoming_video_prompt" = "%@ erabiltzailearen bideo-deia jasotzen"; @@ -555,3 +549,12 @@ "settings_labs_room_members_lazy_loading" = "Gelako kideen karga alferra"; "settings_labs_room_members_lazy_loading_error_message" = "Zure hasiera zerbitzariak ez du onartzen gelako kideen karga alferra. Saiatu geroago."; "room_event_action_view_decrypted_source" = "Ikusi deszifratutako iturria"; +"room_recents_server_notice_section" = "SISTEMAKO ALERTAK"; +"room_resource_limit_exceeded_message_contact_1" = " Mesedez "; +"room_resource_limit_exceeded_message_contact_2_link" = "Jarri zure zerbitzuaren administratzailearekin kontaktuan"; +"room_resource_limit_exceeded_message_contact_3" = " zerbitzu hau erabiltzen jarraitzeko."; +"homeserver_connection_lost" = "Ezin izan da hasiera zerbitzarira konektatu."; +"room_resource_usage_limit_reached_message_1_default" = "Hasiera zerbitzari honek bere baliabide mugetako bat jo du "; +"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."; diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings index 8d441c4f45..10611d05b7 100644 --- a/Riot/Assets/fr.lproj/Vector.strings +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -418,12 +418,6 @@ "do_not_ask_again" = "Ne plus demander"; "camera_access_not_granted" = "%@ n'a pas la permission pour utiliser l'appareil photo, veuillez modifier les options de vie privée"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "Invitation de %@"; -"room_displayname_room_invite" = "Invitation sur un salon"; -"room_displayname_two_members" = "%@ et %@"; -"room_displayname_more_than_two_members" = "%@ et %u autres"; -"room_displayname_no_title" = "Salon vide"; // Call "call_incoming_voice_prompt" = "Appel vocal entrant de %@"; "call_incoming_video_prompt" = "Appel vidéo entrant de %@"; @@ -553,3 +547,12 @@ "settings_labs_room_members_lazy_loading" = "Chargement différé des participants des salons"; "settings_labs_room_members_lazy_loading_error_message" = "Votre serveur d'accueil ne prend pas en charge le chargement différé des participants des salons. Réessayez plus tard."; "room_event_action_view_decrypted_source" = "Voir la source déchiffrée"; +"room_recents_server_notice_section" = "ALERTES SYSTÈME"; +"room_resource_limit_exceeded_message_contact_1" = " Veuillez "; +"room_resource_limit_exceeded_message_contact_2_link" = "contacter l'administrateur de votre service"; +"room_resource_limit_exceeded_message_contact_3" = " pour continuer à l'utiliser."; +"homeserver_connection_lost" = "Connexion impossible au serveur d'accueil."; +"room_resource_usage_limit_reached_message_1_default" = "Ce serveur d'accueil a dépassé une de ses limites de ressources donc "; +"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."; diff --git a/Riot/Assets/hu.lproj/Vector.strings b/Riot/Assets/hu.lproj/Vector.strings index cb848c9adb..cac3bae514 100644 --- a/Riot/Assets/hu.lproj/Vector.strings +++ b/Riot/Assets/hu.lproj/Vector.strings @@ -14,3 +14,550 @@ "remove" = "Eltávolítás"; "invite" = "Meghívás"; "retry" = "Újrapróbál"; +"cancel" = "Mégse"; +"save" = "Ment"; +// Room Details +"room_details_title" = "Szoba adatai"; +"next" = "Következő"; +"start" = "Indít"; +"on" = "Be"; +"off" = "Ki"; +"join" = "Csatlakozik"; +"decline" = "Elutasít"; +"accept" = "Elfogad"; +"preview" = "Előnézet"; +"camera" = "Kamera"; +"voice" = "Hang"; +"video" = "Videó"; +"active_call" = "Aktív hívás"; +"active_call_details" = "Aktív hívás (%@)"; +"later" = "Később"; +"rename" = "Átnevez"; +"collapse" = "összezár"; +"send_to" = "Küldés ide: %@"; +"sending" = "Küldés"; +// Authentication +"auth_login" = "Bejelentkezés"; +"auth_register" = "Regisztráció"; +"auth_submit" = "Elküld"; +"auth_skip" = "Kihagy"; +"auth_send_reset_email" = "Visszaállító e-mail küldése"; +"auth_return_to_login" = "Vissza a belépési képernyőre"; +"auth_user_id_placeholder" = "E-mail vagy felhasználói név"; +"auth_password_placeholder" = "Jelszó"; +"auth_new_password_placeholder" = "Új jelszó"; +"auth_user_name_placeholder" = "Felhasználói név"; +"auth_optional_email_placeholder" = "E-mail cím (nem kötelező)"; +"auth_email_placeholder" = "E-mail cím"; +"auth_optional_phone_placeholder" = "Telefonszám (nem kötelező)"; +"auth_phone_placeholder" = "Telefonszám"; +"auth_repeat_password_placeholder" = "Jelszó megerősítés"; +"auth_repeat_new_password_placeholder" = "Új jelszó megerősítés"; +"auth_home_server_placeholder" = "URL (pl. https://matrix.org)"; +"auth_identity_server_placeholder" = "URL (pl. https://matrix.org)"; +"auth_invalid_login_param" = "Hibás felhasználói név és/vagy jelszó"; +"auth_invalid_user_name" = "A felhasználói név tartalmazhat betűket, számokat, pontokat, kötőjeleket és aláhúzást"; +"auth_invalid_password" = "Jelszó túl rövid (min. 6 karakter)"; +"auth_invalid_email" = "Ez nem tűnik érvényes e-mail címnek"; +"auth_invalid_phone" = "Ez nem tűnik érvényes telefonszámnak"; +"auth_missing_password" = "Hiányzó jelszó"; +"auth_add_email_message" = "Adj hozzá egy e-mail címet a felhasználói fiókodhoz, hogy más felhasználók megtaláljanak és vissza tudd állítani a jelszavadat."; +"auth_add_phone_message" = "Add hozzá a telefonszámodat a felhasználói fiókodhoz, hogy más felhasználók megtaláljanak."; +"auth_add_email_phone_message" = "Add hozzá az e-mail címedet és/vagy a telefonszámodat a felhasználói fiókodhoz, hogy más felhasználók megtalálhassanak. E-mail címmel a jelszavadat is vissza tudod állítani."; +"auth_add_email_and_phone_message" = "Add hozzá az e-mail címedet és a telefonszámodat a felhasználói fiókodhoz, hogy más felhasználók megtalálhassanak. E-mail címmel a jelszavadat is vissza tudod állítani."; +"auth_missing_email" = "Hiányzó e-mail cím"; +"auth_missing_phone" = "Hiányzó telefonszám"; +"auth_missing_email_or_phone" = "Hiányzó e-mail cím vagy telefonszám"; +"auth_email_in_use" = "Ez az e-mail cím már használatban van"; +"auth_phone_in_use" = "Ez a telefonszám már használatban van"; +"auth_untrusted_id_server" = "Az azonosító szerver megbízhatatlan"; +"auth_password_dont_match" = "A jelszavak nem egyeznek meg"; +"auth_username_in_use" = "A felhasználói név használatban"; +"auth_forgot_password" = "Elfelejtetted a jelszót?"; +"auth_email_not_found" = "E-mail küldési hiba: Az e-mail cím nem található"; +"auth_use_server_options" = "Egyedi szerver beállítások használata (haladó)"; +"auth_email_validation_message" = "Ellenőrizd az e-mailedet a regisztráció folytatásához"; +"auth_msisdn_validation_title" = "Ellenőrzés folyamatban"; +"auth_msisdn_validation_message" = "Elküldtük az SMS aktivációs kódot. Írd be a kódot ide."; +"auth_msisdn_validation_error" = "Nem sikerült ellenőrizni a telefonszámot."; +"auth_recaptcha_message" = "Ez a Matrix szerver szeretne megbizonyosodni arról, hogy nem vagy robot"; +"auth_reset_password_message" = "A jelszó visszaállításához add meg az e-mail címet amit a felhasználói fiókhoz kötöttél:"; +"auth_reset_password_missing_email" = "A felhasználói fiókodhoz kötött jelszót kell megadni."; +"auth_reset_password_missing_password" = "Add meg az új jelszót."; +"auth_reset_password_email_validation_message" = "Az e-mailt elküldtük a %@ címre. Ha rákattintottál a linkre ami benne van utána kattints ide."; +"auth_reset_password_next_step_button" = "Ellenőriztem az e-mail címet"; +"auth_reset_password_error_unauthorized" = "E-mail cím ellenőrzése nem sikerült: bizonyosodj meg róla, hogy az e-mailben lévő linkre rákattintottál"; +"auth_reset_password_error_not_found" = "Úgy tűnik az e-mail címed nincs összekötve a matrix azonosítóddal a Matrix szerveren."; +"auth_reset_password_success_message" = "Visszaállítottuk a jelszavad.\n\nKijelentkeztettünk minden eszközödből és nem kapsz értesítéseket sem. Az értesítések újra engedélyezéséhez jelentkezz be újra az eszközökön."; +// Chat creation +"room_creation_title" = "Új csevegés"; +"room_creation_account" = "Fiók"; +"room_creation_appearance" = "Megjelenítés"; +"room_creation_appearance_name" = "Név"; +"room_creation_appearance_picture" = "Csevegés kép (nem kötelező)"; +"room_creation_privacy" = "Adatvédelem"; +"room_creation_private_room" = "Ez a csevegés zárt"; +"room_creation_public_room" = "Ez a csevegés nyilvános"; +"room_creation_make_public" = "Legyen nyilvános"; +"room_creation_make_public_prompt_title" = "Ezt a csevegést nyilvánossá teszed?"; +"auth_add_email_and_phone_warning" = "Nem lehet egyszerre e-mail címmel és telefonszámmal regisztrálni amíg az api ezt nem támogatja. Csak a telefonszám lesz figyelembe véve. Az e-mail címedet a fiók beállításoknál tudod hozzáadni."; +"room_creation_make_public_prompt_msg" = "Biztos, hogy ezt a beszélgetést nyilvánossá szeretnéd tenni? Bárki elolvashatja az üzeneteidet és csatlakozhat a csevegéshez."; +"room_creation_keep_private" = "Maradjon zárt"; +"room_creation_make_private" = "Legyen nyilvános"; +"room_creation_wait_for_creation" = "A szoba elkészítése folyamatban van. Kérlek várj."; +"room_creation_invite_another_user" = "Keresés / meghívás felhasználói azonosítás, név vagy e-mail cím alapján"; +// Room recents +"room_recents_directory_section" = "SZOBA KÖNYVTÁR"; +"room_recents_directory_section_network" = "Hálózat"; +"room_recents_favourites_section" = "KEDVENCEK"; +"room_recents_people_section" = "EMBEREK"; +"room_recents_conversations_section" = "SZOBÁK"; +"room_recents_no_conversation" = "Nincsenek szobák"; +"room_recents_low_priority_section" = "ALACSONY PRIORITÁS"; +"room_recents_invites_section" = "MEGHÍVÓK"; +"room_recents_start_chat_with" = "Beszélgetés indítása"; +"room_recents_create_empty_room" = "Szoba készítés"; +"room_recents_join_room" = "Belépés a szobába"; +"room_recents_join_room_title" = "Belépés a szobába"; +"room_recents_join_room_prompt" = "Írd be a szoba azonosítóját vagy a becenevét"; +// People tab +"people_invites_section" = "MEGHÍVÓK"; +"people_conversation_section" = "BESZÉLGETÉSEK"; +"people_no_conversation" = "Nincsenek beszélgetések"; +// Rooms tab +"room_directory_no_public_room" = "Nincsenek elérhető nyilvános szobák"; +// Groups tab +"group_invite_section" = "MEGHÍVÓK"; +"group_section" = "KÖZÖSSÉGEK"; +// Search +"search_rooms" = "Szobák"; +"search_messages" = "Üzenetek"; +"search_people" = "Emberek"; +"search_files" = "Fájlok"; +"search_default_placeholder" = "Keresés"; +"search_people_placeholder" = "Keresés felhasználói azonosítás, név vagy e-mail cím alapján"; +"search_no_result" = "Nincs találat"; +"search_in_progress" = "Keresés…"; +// Directory +"directory_cell_title" = "Keresés a könyvtárban"; +"directory_cell_description" = "%tu szobák"; +"directory_search_results_title" = "Találatok a könyvtár listában"; +"directory_search_results" = "%tu találat ehhez: %@"; +"directory_search_results_more_than" = ">%tu találat ehhez: %@"; +"directory_searching_title" = "Könyvtár keresés…"; +"directory_search_fail" = "Az adatot nem sikerült betölteni"; +// Contacts +"contacts_address_book_section" = "HELYI NÉVJEGYZÉK"; +"contacts_address_book_matrix_users_toggle" = "Csak Matrix felhasználók"; +"contacts_address_book_no_contact" = "Nincsenek helyi ismerősök"; +"contacts_address_book_permission_required" = "Jogosultság szükséges a helyi névjegyzék eléréséhez"; +"contacts_address_book_permission_denied" = "Nem engedted meg, hogy a Riot hozzáférjen a helyi névjegyzékhez"; +"contacts_user_directory_section" = "FELHASZNÁLÓI KÖNYVTÁR"; +"contacts_user_directory_offline_section" = "FELHASZNÁLÓI KÖNYVTÁR (kapcsolat nélküli)"; +// Chat participants +"room_participants_title" = "Résztvevők"; +"room_participants_add_participant" = "Résztvevők hozzáadása"; +"room_participants_one_participant" = "1 résztvevő"; +"room_participants_multi_participants" = "%d résztvevő"; +"room_participants_leave_prompt_title" = "Szoba elhagyása"; +"room_participants_leave_prompt_msg" = "Biztos, hogy el akarod hagyni a szobát?"; +"room_participants_remove_prompt_title" = "Megerősítés"; +"room_participants_remove_prompt_msg" = "Biztos, hogy törölni szeretnéd a csevegésből ezt: %@?"; +"room_participants_remove_third_party_invite_msg" = "Harmadik féltől származó meghívó törlése nem támogatott amíg nincs hozzá api"; +"room_participants_invite_prompt_title" = "Megerősítés"; +"room_participants_invite_prompt_msg" = "Biztos, hogy meg akarod hívni őt: %@?"; +"room_participants_filter_room_members" = "Szoba résztvevők szűrése"; +"room_participants_invite_another_user" = "Keresés / meghívás felhasználói név, név vagy e-mail cím alapján"; +"room_participants_invite_malformed_id_title" = "Meghívó hiba"; +"room_participants_invite_malformed_id" = "Érvénytelen azonosító. E-mail címnek vagy Matrix azonosítónak kell lennie mint: '@helyirész:domain'"; +"room_participants_invited_section" = "MEGHÍVOTT"; +"room_participants_online" = "Kapcsolódva"; +"room_participants_offline" = "Kapcsolat nélkül"; +"room_participants_unknown" = "Ismeretlen"; +"room_participants_idle" = "Tétlen"; +"room_participants_now" = "most"; +"room_participants_ago" = "óta"; +"room_participants_action_section_admin_tools" = "Adminisztrátori eszközök"; +"room_participants_action_section_direct_chats" = "Közvetlen csevegések"; +"room_participants_action_section_devices" = "Eszközök"; +"room_participants_action_section_other" = "Egyéb"; +"room_participants_action_invite" = "Meghívó"; +"room_participants_action_leave" = "Szoba elhagyása"; +"room_participants_action_remove" = "Eltávolítás a szobából"; +"room_participants_action_ban" = "Kitiltás a szobából"; +"room_participants_action_unban" = "Visszaenged"; +"room_participants_action_ignore" = "Minden üzenet kitakarása ettől a felhasználótól"; +"room_participants_action_unignore" = "Minden üzenet megmutatása ettől a felhasználótól"; +"room_participants_action_set_default_power_level" = "Visszaállítás normál felhasználónak"; +"room_participants_action_set_moderator" = "Legyen moderátor"; +"room_participants_action_set_admin" = "Legyen adminisztrátor"; +"room_participants_action_start_new_chat" = "Új beszélgetés indítása"; +"room_participants_action_start_voice_call" = "Hang hívás indítása"; +"room_participants_action_start_video_call" = "Videó hívás indítása"; +"room_participants_action_mention" = "Említ"; +// Chat +"room_jump_to_first_unread" = "Az első olvasatlan üzenetre ugrás"; +"room_new_message_notification" = "%d új üzenet"; +"room_new_messages_notification" = "%d új üzenet"; +"room_one_user_is_typing" = "%@ pötyög…"; +"room_two_users_are_typing" = "%@ és %@ pötyögnek…"; +"room_many_users_are_typing" = "%@, %@ és mások pötyögnek…"; +"room_message_placeholder" = "Üzenet küldése (titkosítás nélkül)…"; +"room_message_reply_to_placeholder" = "Válasz küldése (titkosítás nélkül)…"; +"room_do_not_have_permission_to_post" = "Ebbe a szobába nincs jogod írni"; +"encrypted_room_message_placeholder" = "Titkosított üzenet küldése…"; +"encrypted_room_message_reply_to_placeholder" = "Titkosított válasz küldése…"; +"room_message_short_placeholder" = "Üzenet küldése…"; +"room_message_reply_to_short_placeholder" = "Válasz küldése…"; +"room_offline_notification" = "A szerverrel megszakadt a kapcsolat."; +"room_unsent_messages_notification" = "Üzenet nincs elküldve. Most %@ vagy %@?"; +"room_unsent_messages_unknown_devices_notification" = "Az üzenet nincs elküldve, mert ismeretlen eszköz van jelen. Most %@ vagy %@?"; +"room_ongoing_conference_call" = "Konferencia hívás van folyamatban. Csatlakozol mint %@ vagy %@."; +"room_ongoing_conference_call_with_close" = "Konferencia hívás van folyamatban. Csatlakozol mint %@ vagy %@. %@."; +"room_ongoing_conference_call_close" = "Bezár"; +"room_conference_call_no_power" = "Jogosultságra van szükséged, hogy konferencia hívást kezelhess ebben a szobában"; +"room_prompt_resend" = "Mindet újraküld"; +"room_prompt_cancel" = "mind megszakítod"; +"room_resend_unsent_messages" = "Az elküldetlen üzenetek újraküldése"; +"room_delete_unsent_messages" = "Elküldetlen üzenetek törlése"; +"room_event_action_copy" = "Másol"; +"room_event_action_quote" = "Idéz"; +"room_event_action_redact" = "Kitakar"; +"room_event_action_more" = "További"; +"room_event_action_share" = "Megosztás"; +"room_event_action_permalink" = "Állandó hivatkozás"; +"room_event_action_view_source" = "Forrás megjelenítése"; +"room_event_action_view_decrypted_source" = "Visszafejtett forrás megjelenítése"; +"room_event_action_report" = "Tartalom bejelentése"; +"room_event_action_report_prompt_reason" = "Ok amiért a tartalmat bejelented"; +"room_event_action_kick_prompt_reason" = "Ok amiér kirúgod ezt a felhasználót"; +"room_event_action_ban_prompt_reason" = "Ok amiért kitiltod ezt a felhasználót"; +"room_event_action_report_prompt_ignore_user" = "El akarod rejteni az összes üzenetet ettől a felhasználótól?"; +"room_event_action_save" = "Mentés"; +"room_event_action_resend" = "Újraküld"; +"room_event_action_delete" = "Töröl"; +"room_event_action_cancel_send" = "Küldés megszakítása"; +"room_event_action_cancel_download" = "Letöltés megszakítása"; +"room_event_action_view_encryption" = "Titkosítási információ"; +"room_warning_about_encryption" = "Végponttól végpontig való titkosítás béta állapotú és lehet, hogy nem elég megbízható.\n\nMég ne bízz rá titkos adatot.\n\nAz eszközök még nem tudják visszafejteni az üzeneteket amiket azelőtt küldtek mielőtt csatlakoztak volna a szobához.\n\nTitkosított üzenetek nem jelennek meg azoknál a klienseknél amik nem támogatják a titkosítást."; +"room_event_failed_to_send" = "Hiba a küldénél"; +"room_action_send_photo_or_video" = "Kép vagy videó küldése"; +"room_action_send_sticker" = "Matrica küldése"; +"room_replacement_information" = "Ezt a szobát lecserélték és már nem aktív."; +"room_replacement_link" = "A beszélgetés itt folytatódik."; +"room_predecessor_information" = "Ez a szoba egy másik megbeszélés folytatása."; +"room_predecessor_link" = "Kattints ide a régi üzenetek megtekintéséhez."; +// Unknown devices +"unknown_devices_alert_title" = "A szoba ismeretlen eszközöket tartalmaz"; +"unknown_devices_alert" = "A szobában vannak ellenőrizetlen eszközök.\nEz azt jelenti, hogy nem garantálható, hogy az eszköz azé akiének mondja magát.\nJavasoljuk, hogy menj végig az ellenőrzési folyamaton mielőtt folytatod, de ha azt szeretnéd újraküldheted az üzenetet ellenőrzés nélkül is."; +"unknown_devices_send_anyway" = "Mindenképpen küld"; +"unknown_devices_call_anyway" = "Mindenképpen hív"; +"unknown_devices_answer_anyway" = "Mindenképpen válaszol"; +"unknown_devices_verify" = "Ellenőriz…"; +"unknown_devices_title" = "Ismeretlen eszközök"; +// Room Title +"room_title_new_room" = "Új szoba"; +"room_title_multiple_active_members" = "%@/%@ aktív felhasználó"; +"room_title_one_active_member" = "%@/%@ aktív felhasználó"; +"room_title_invite_members" = "Tagok meghívása"; +"room_title_members" = "%@ tag"; +"room_title_one_member" = "1 tag"; +// Room Preview +"room_preview_invitation_format" = "%@ meghívott, hogy lépj be ebbe a szobába"; +"room_preview_subtitle" = "Ez egy előnézete a szobának. A műveletek a szobával le vannak tiltva."; +"room_preview_unlinked_email_warning" = "Ezt a meghívót neki küldték: %@. Ami nincs összekötve ezzel a felhasználói fiókkal. Bejelentkezhetsz egy másik fiókba vagy add hozzá ezt az e-mail címet ehhez a fiókhoz."; +"room_preview_try_join_an_unknown_room" = "%@ szobát próbálod elérni. Szeretnél belépni, hogy részt vehess a beszélgetésben?"; +"room_preview_try_join_an_unknown_room_default" = "a szoba"; +// Settings +"settings_title" = "Beállítások"; +"account_logout_all" = "Kilép minden fiókból"; +"settings_config_no_build_info" = "Nincsenek fordítási információk"; +"settings_mark_all_as_read" = "Minden üzenetet olvasottnak jelöl"; +"settings_report_bug" = "Hiba jelentése"; +"settings_config_home_server" = "Matrix szerver: %@"; +"settings_config_identity_server" = "Azonosító szerver: %@"; +"settings_config_user_id" = "Bejelentkezve mint: %@"; +"settings_user_settings" = "FELHASZNÁLÓI BEÁLLÍTÁSOK"; +"settings_notifications_settings" = "ÉRTESÍTÉS BEÁLLÍTÁSOK"; +"settings_calls_settings" = "HÍVÁSOK"; +"settings_user_interface" = "FELHASZNÁLÓI FELÜLET"; +"settings_ignored_users" = "FIGYELMEN KÍVÜL HAGYOTT FELHASZNÁLÓK"; +"settings_contacts" = "HELYI KAPCSOLATOK"; +"settings_advanced" = "HALADÓ"; +"settings_other" = "MÁS"; +"settings_labs" = "LABOR"; +"settings_flair" = "Kitűző mutatása ahol lehet"; +"settings_devices" = "ESZKÖZÖK"; +"settings_cryptography" = "TITKOSÍTÁS"; +"settings_deactivate_account" = "FELFÜGGESZTETT FIÓK"; +"settings_sign_out" = "Kijelentkezés"; +"settings_sign_out_confirmation" = "Biztos vagy benne?"; +"settings_sign_out_e2e_warn" = "Elveszted a végponttól végpontig használt titkosító kulcsaidat. Ez azt jelenti, hogy nem fogod tudni elolvasni a titkosított szobákban a régi üzeneteket ezzel az eszközzel."; +"settings_profile_picture" = "Felhasználói kép"; +"settings_display_name" = "Megjelenítendő név"; +"settings_first_name" = "Utónév"; +"settings_surname" = "Családnév"; +"settings_remove_prompt_title" = "Megerősítés"; +"settings_remove_email_prompt_msg" = "Biztos, hogy törölni szeretnéd az összes e-mail címet: %@?"; +"settings_remove_phone_prompt_msg" = "Biztos, hogy törölni szeretnéd a telefonszámot: %@?"; +"settings_email_address" = "E-mail"; +"settings_email_address_placeholder" = "Add meg az e-mail címet"; +"settings_add_email_address" = "E-mail cím hozzáadása"; +"settings_phone_number" = "Telefon"; +"settings_add_phone_number" = "Telefonszám hozzáadása"; +"settings_night_mode" = "Éjszakai üzemmód"; +"settings_fail_to_update_profile" = "A felhasználói profilt nem sikerült frissíteni"; +"settings_enable_push_notif" = "Értesítések ezen az eszközön"; +"settings_show_decrypted_content" = "Visszafejtett tartalom mutatása"; +"settings_global_settings_info" = "Globális értesítési beállításokat a webes kliensedben találod: %@"; +"settings_pin_rooms_with_missed_notif" = "Szobák kitűzése elszalasztott értesítésekkel"; +"settings_pin_rooms_with_unread" = "Szobák kitűzése olvasatlan üzenetekkel"; +"settings_on_denied_notification" = "Az értesítések tiltva vannak ehhez: %@, kérlek engedélyezd az eszköz beállításaiban"; +"settings_enable_callkit" = "Beépített hívás"; +"settings_callkit_info" = "Hívások fogadása a zárolt képernyőn. Riot hívások megjelenítése a rendszer hívás naplójában. Ha az iCloud engedélyezett akkor a hívásnapló az Apple-el megosztásra kerül."; +"settings_ui_language" = "Nyelv"; +"settings_ui_theme" = "Téma"; +"settings_ui_theme_auto" = "Autó"; +"settings_ui_theme_light" = "Világos"; +"settings_ui_theme_dark" = "Sötét"; +"settings_ui_theme_black" = "Fekete"; +"settings_ui_theme_picker_title" = "Téma kiválasztása"; +"settings_ui_theme_picker_message" = "„Autó” az eszközöd „invertált színek” beállítását használja"; +"settings_unignore_user" = "Minden üzenet megjelenítése innen: %@?"; +"settings_contacts_discover_matrix_users" = "Felhasználók kereséséhez használja az e-mail címeket és telefonszámokat"; +"settings_contacts_phonebook_country" = "Telefonkönyv országa"; +"settings_labs_e2e_encryption" = "Végponttól végpontig titkosítás"; +"settings_labs_e2e_encryption_prompt_message" = "A titkosítás beállításának befejezéséhez újra be kell jelentkezni."; +"settings_labs_room_members_lazy_loading" = "Szoba tagság késleltetett betöltése"; +"settings_labs_room_members_lazy_loading_error_message" = "A Matrix szervered még nem támogatja a szoba tagság késleltetett betöltését. Próbáld később."; +"settings_labs_create_conference_with_jitsi" = "Konferencia hívás indítása Jitsivel"; +"settings_version" = "Verzió %@"; +"settings_olm_version" = "Olm verzió %@"; +"settings_copyright" = "Szerzői jog"; +"settings_copyright_url" = "https://riot.im/copyright"; +"settings_term_conditions" = "Felhasználási feltételek"; +"settings_term_conditions_url" = "https://riot.im/tac_apple"; +"settings_privacy_policy" = "Adatvédelmi szabályok"; +"settings_privacy_policy_url" = "https://riot.im/privacy"; +"settings_third_party_notices" = "Harmadik fél jegyzetek"; +"settings_send_crash_report" = "Személytelen összeomlás és felhasználási adatok küldése"; +"settings_enable_rageshake" = "Eszköz megrázása a hiba bejelentéséhez"; +"settings_clear_cache" = "Gyorsítótár kiürítése"; +"settings_change_password" = "Jelszó megváltoztatása"; +"settings_old_password" = "régi jelszó"; +"settings_new_password" = "új jelszó"; +"settings_confirm_password" = "jelszó megerősítése"; +"settings_fail_to_update_password" = "A jelszó frissítése nem sikerült"; +"settings_password_updated" = "A jelszavad frissítve"; +"settings_crypto_device_name" = "Eszköz neve: "; +"settings_crypto_device_id" = "\nEszköz azonosítója: "; +"settings_crypto_device_key" = "\nEszköz kulcsa: "; +"settings_crypto_export" = "Kulcsok kimentése"; +"settings_crypto_blacklist_unverified_devices" = "Csak ellenőrzött eszközöknek titkosít"; +"settings_deactivate_my_account" = "Felhasználói fiókom felfüggesztése"; +"room_details_people" = "Tagok"; +"room_details_files" = "Fájlok"; +"room_details_settings" = "Beállítások"; +"room_details_photo" = "Szoba képe"; +"room_details_room_name" = "Szoba neve"; +"room_details_topic" = "Téma"; +"room_details_favourite_tag" = "Kedvenc"; +"room_details_low_priority_tag" = "Alacsony prioritás"; +"room_details_mute_notifs" = "Értesítések elnémítása"; +"room_details_direct_chat" = "Közvetlen csevegés"; +"room_details_access_section" = "Ki érheti el a szobát?"; +"room_details_access_section_invited_only" = "Csak olyan emberek akiket meghívtak"; +"room_details_access_section_anyone_apart_from_guest" = "Bárki aki tudja a szoba linkjét kivéve a vendég felhasználók"; +"room_details_access_section_anyone" = "Bárki aki ismeri a szoba linkjét beleértve a vendég felhasználókat"; +"room_details_access_section_no_address_warning" = "A szobának kell egy cím, hogy hivatkozni lehessen rá"; +"room_details_access_section_directory_toggle" = "Mutasd ezt a szobát a szobák jegyzékében"; +"room_details_history_section" = "Ki olvashatja a régi üzeneteket?"; +"room_details_history_section_anyone" = "Bárki"; +"room_details_history_section_members_only" = "Csak tagok (attól a ponttól kezdve, hogy ez be lett állítva)"; +"room_details_history_section_members_only_since_invited" = "Csak tagok (amióta meg lettek hívva)"; +"room_details_history_section_members_only_since_joined" = "Csak tagok (amióta csatlakoztak)"; +"room_details_history_section_prompt_title" = "Adatvédelmi figyelmeztetés"; +"room_details_history_section_prompt_msg" = "A változtatás, hogy ki tudja elolvasni a régi üzeneteket csak az új üzenetekre vonatkozik. Az eddigi üzenetek láthatósága nem változik."; +"room_details_addresses_section" = "Címek"; +"room_details_no_local_addresses" = "Ennek a szobának nincsenek helyi címei"; +"room_details_new_address" = "Új cím hozzáadása"; +"room_details_new_address_placeholder" = "Új cím hozzáadása (pl.: #foo%@)"; +"room_details_addresses_invalid_address_prompt_title" = "Érvénytelen becenév formátum"; +"room_details_addresses_invalid_address_prompt_msg" = "%@ nem érvényes becenév formátum"; +"room_details_addresses_disable_main_address_prompt_title" = "Elsődleges cím figyelmeztetés"; +"room_details_addresses_disable_main_address_prompt_msg" = "A szobának nem adtál meg elsődleges címet. Az alapértelmezett cím véletlenszerűen lesz kiválasztva"; +"room_details_flair_section" = "Közösségi kitűzők megmutatása"; +"room_details_new_flair_placeholder" = "Új közösségi azonosító hozzáadása (pl.: +foo%@)"; +"room_details_flair_invalid_id_prompt_title" = "Érvénytelen formátum"; +"room_details_flair_invalid_id_prompt_msg" = "%@ nem érvényes közösségi azonosító"; +"room_details_banned_users_section" = "Kitiltott felhasználók"; +"room_details_advanced_section" = "Haladó"; +"room_details_advanced_room_id" = "Szoba azonosító:"; +"room_details_advanced_enable_e2e_encryption" = "Titkosítás engedélyezése (figyelmeztetés: utána már nem lehet kikapcsolni!)"; +"room_details_advanced_e2e_encryption_enabled" = "A titkosítás a szobához be van kapcsolva"; +"room_details_advanced_e2e_encryption_disabled" = "A titkosítás a szobához nincs engedélyezve."; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Csak ellenőrzött eszközre titkosít"; +"room_details_advanced_e2e_encryption_prompt_message" = "A végponttól végpontig titkosítás kísérleti állapotban van és lehet, hogy nem elég megbízható.\n\nNe bízz rá titkos adatot.\n\nJelenleg az eszközök nem lesznek képesek visszafejteni üzeneteket azelőttről, hogy a szobához csatlakoztak.\n\nHa egy szobához be lett kapcsolva a titkosítás már nem lehet újra kikapcsolni (egyenlőre).\n\nTitkosított üzeneteket a titkosítást nem támogató kliensek nem tudják megjeleníteni."; +"room_details_fail_to_update_avatar" = "A szoba képét nem sikerült frissíteni"; +"room_details_fail_to_update_room_name" = "A szoba nevét nem sikerült frissíteni"; +"room_details_fail_to_update_topic" = "A témát nem sikerült frissíteni"; +"room_details_fail_to_update_room_guest_access" = "A szoba vendég hozzáférését nem sikerült frissíteni"; +"room_details_fail_to_update_room_join_rule" = "A csatlakozási szabályt nem sikerült frissíteni"; +"room_details_fail_to_update_room_directory_visibility" = "A szoba listában a láthatóságot nem sikerült frissíteni"; +"room_details_fail_to_update_history_visibility" = "A régi üzenetek láthatóságát nem sikerült frissíteni"; +"room_details_fail_to_add_room_aliases" = "Új szoba címet nem sikerült hozzáadni"; +"room_details_fail_to_remove_room_aliases" = "A szoba címet nem sikerült törölni"; +"room_details_fail_to_update_room_canonical_alias" = "Az elsődleges címet nem sikerült frissíteni"; +"room_details_fail_to_update_room_communities" = "A kapcsolódó közösségeket nem sikerült frissíteni"; +"room_details_fail_to_update_room_direct" = "A „közvetlen” jelölőt ehhez a szobához nem sikerült frissíteni"; +"room_details_fail_to_enable_encryption" = "A szobában a titkosítást nem sikerült engedélyezni"; +"room_details_save_changes_prompt" = "A változásokat el szeretnéd menteni?"; +"room_details_set_main_address" = "Elsődleges cím megadása"; +"room_details_unset_main_address" = "Az elsődleges cím törlése"; +"room_details_copy_room_id" = "Szoba azonosító másolása"; +"room_details_copy_room_address" = "Szoba cím másolása"; +"room_details_copy_room_url" = "Szoba URL másolása"; +// Group Details +"group_details_title" = "Közösség részletek"; +"group_details_home" = "Kezdőlap"; +"group_details_people" = "Emberek"; +"group_details_rooms" = "Szobák"; +// Group Home +"group_home_one_member_format" = "1 tag"; +"group_home_multi_members_format" = "%tu tag"; +"group_home_one_room_format" = "1 szoba"; +"group_home_multi_rooms_format" = "%tu szoba"; +"group_invitation_format" = "%@ meghívott ebbe a közösségbe"; +// Group participants +"group_participants_add_participant" = "Résztvevő hozzáadása"; +"group_participants_leave_prompt_title" = "Csoport elhagyása"; +"group_participants_leave_prompt_msg" = "Biztos, hogy el szeretnéd hagyni a csoportot?"; +"group_participants_remove_prompt_title" = "Megerősítés"; +"group_participants_remove_prompt_msg" = "Biztos, hogy kitörlöd a csoportból: %@?"; +"group_participants_invite_prompt_title" = "Megerősítés"; +"group_participants_invite_prompt_msg" = "Biztos, hogy meg akarod hívni ebbe a csoportba: %@?"; +"group_participants_filter_members" = "Közösség tagok szűrése"; +"group_participants_invite_another_user" = "Keresés / meghívás felhasználói azonosító vagy név alapján"; +"group_participants_invite_malformed_id_title" = "Meghívás hiba"; +"group_participants_invite_malformed_id" = "Hibás azonosító. Matrix azonosítónak kell lennie mint '@helyirész:domain'"; +"group_participants_invited_section" = "MEGHÍVVA"; +// Group rooms +"group_rooms_filter_rooms" = "Közösségi szobák szűrése"; +// Read Receipts +"read_receipts_list" = "Olvasási visszaigazolás lista"; +"receipt_status_read" = "Olvasta: "; +// Media picker +"media_picker_library" = "Könyvtár"; +"media_picker_select" = "Kiválaszt"; +// Directory +"directory_title" = "Mappa"; +"directory_server_picker_title" = "Mappa kiválasztása"; +"directory_server_all_rooms" = "%@ szerveren az összes szoba"; +"directory_server_all_native_rooms" = "Minden eredeti Matrix szoba"; +"directory_server_type_homeserver" = "Add meg a Matrix szervert aminek a nyilvános szobáit listázni szeretnéd"; +"directory_server_placeholder" = "matrix.org"; +// Events formatter +"event_formatter_member_updates" = "%tu tagság változás"; +"event_formatter_widget_added" = "%@ kisalkalmazás innen: %@"; +"event_formatter_widget_removed" = "%@ kisalkalmazást törölte: %@"; +"event_formatter_jitsi_widget_added" = "VoIP konferenciát hozzáadta: %@"; +"event_formatter_jitsi_widget_removed" = "VoIP konferenciát törölte: %@"; +"event_formatter_rerequest_keys_part1_link" = "Titkosító kulcsok újrakérése"; +"event_formatter_rerequest_keys_part2" = " a többi eszközödtől."; +// Others +"or" = "vagy"; +"you" = "Te"; +"today" = "Ma"; +"yesterday" = "Tegnap"; +"network_offline_prompt" = "Úgy tűnik nincs Internet kapcsolatod."; +"public_room_section_title" = "Nyilvános szobák (%@):"; +"bug_report_prompt" = "Az alkalmazás legutóbb összeomlott. Szeretnél jelentést küldeni az összeomlásról?"; +"rage_shake_prompt" = "Úgy tűnik idegességedben rázod a telefont. Szeretnél egy hibát bejelenteni?"; +"do_not_ask_again" = "Ne kérdezd legközelebb"; +"camera_access_not_granted" = "%@ -nak/nek nincs joga a kamerát használni, kérlek változtasd meg az adatvédelmi beállításokat"; +"large_badge_value_k_format" = "%.1fK"; +// room display name +"room_displayname_invite_from" = "Meghívó innen: %@"; +"room_displayname_room_invite" = "Szoba meghívó"; +"room_displayname_two_members" = "%@ és %@"; +"room_displayname_more_than_two_members" = "%@ és %u mások"; +"room_displayname_no_title" = "Üres szoba"; +// Call +"call_incoming_voice_prompt" = "Bejövő hanghívás innen: %@"; +"call_incoming_video_prompt" = "Beérkező videó hívás innen: %@"; +"call_incoming_voice" = "Bejövő hívás..."; +"call_incoming_video" = "Bejövő videó hívás..."; +"call_already_displayed" = "Egy hívás már folyamatban van."; +"call_jitsi_error" = "Nem sikerült a konferenciához csatlakozni."; +// No VoIP support +"no_voip_title" = "Bejövő hívás"; +"no_voip" = "%@ hív téged de %@ egyenlőre nem támogatja a hívásokat.\nFigyelmen kívül hagyhatod ezt az értesítést és másik eszközről válaszolhatsz a hívásra vagy elutasíthatod azt."; +// Crash report +"google_analytics_use_prompt" = "Szeretnél segíteni személytelen összeomlás és felhasználási adatok küldésével a(z) %@ fejlesztésében?"; +// Crypto +"e2e_enabling_on_app_update" = "Riot most már támogatja a végponttól végpontig titkosítást de újra be kell jelentkezned.\n\nMegteheted most vagy később az alkalmazás beállításainál."; +"e2e_need_log_in_again" = "Vissza kell jelentkezned, hogy az eszközödhöz a végponttól végpontig titkosítási kulcsokat létrehozzuk és a nyilvános kulcsokat elküldjük a Matrix szerverednek.\nEz egy egyszeri alkalom; elnézést a kellemetlenségért."; +// Bug report +"bug_report_title" = "Hiba bejelentés"; +"bug_report_description" = "Kérlek írd le a hibát. Mit csináltál? Mit szerettél volna, hogy történjen? Végül mi történt?"; +"bug_crash_report_title" = "Összeomlás bejelentése"; +"bug_crash_report_description" = "Kérlek írd le mit tettél mielőtt összeomlott:"; +"bug_report_logs_description" = "A probléma okának meghatározásához a kliens elküldi a naplókat ezzel a hiba bejelentéssel. Ha csak az alábbi szöveget szeretnéd elküldeni kérlek szedd ki a pipát:"; +"bug_report_send_logs" = "Naplók küldése"; +"bug_report_send_screenshot" = "Képernyőkép küldése"; +"bug_report_progress_zipping" = "Naplóbejegyzések gyűjtése"; +"bug_report_progress_uploading" = "Bejelentés feltöltése"; +"bug_report_send" = "Küld"; +// Widget +"widget_no_power_to_manage" = "A szobában a kisalkalmazások kezeléséhez jogosultságra van szükséged"; +"widget_creation_failure" = "Kisalkalmazás elkészítése sikertelen"; +"widget_sticker_picker_no_stickerpacks_alert" = "Jelenleg egyetlen matrica csomag sincs engedélyezve."; +"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Szeretnél most hozzáadni párat?"; +// Widget Integration Manager +"widget_integration_need_to_be_able_to_invite" = "Ahhoz, hogy ezt megtedd tudnod kell meghívni felhasználókat."; +"widget_integration_unable_to_create" = "A kisalkalmazást nem sikerült elkészíteni."; +"widget_integration_failed_to_send_request" = "A kérés elküldése sikertelen."; +"widget_integration_room_not_recognised" = "A szoba ismeretlen."; +"widget_integration_positive_power_level" = "A hozzáférési szintnek pozitív egész számnak kell lennie."; +"widget_integration_must_be_in_room" = "Nem vagy jelen ebben a szobában."; +"widget_integration_no_permission_in_room" = "Ebben a szobában nincs jogod ezt megtenni."; +"widget_integration_missing_room_id" = "room_id hiányzik a kérésből."; +"widget_integration_missing_user_id" = "user_id hiányzik a kérésből."; +"widget_integration_room_not_visible" = "%@ szoba nem látható."; +// Share extension +"share_extension_auth_prompt" = "Tartalom közléséhez jelentkezz be a fő alkalmazásba"; +"share_extension_failed_to_encrypt" = "Küldés sikertelen. Ellenőrizd a titkosítási beállításokat a fő alkalmazásban ehhez a szobához"; +// Room key request dialog +"e2e_room_key_request_title" = "Titkosítási kulcs kérése"; +"e2e_room_key_request_message_new_device" = "Új eszközt '%@' adtál hozzá, ami most titkosítási kulcsokat kér."; +"e2e_room_key_request_message" = "Az ellenőrizetlen eszközöd '%@' titkosítási kulcsokat kér."; +"e2e_room_key_request_start_verification" = "Ellenőrzés indítása..."; +"e2e_room_key_request_share_without_verifying" = "Megosztás ellenőrzés nélkül"; +"e2e_room_key_request_ignore_request" = "Kérés figyelmen kívül hagyása"; +// GDPR +"gdpr_consent_not_given_alert_message" = "A %@ Matrix szerver további használatához el kell olvasnod és el kell fogadnod a felhasználási feltételeket."; +"gdpr_consent_not_given_alert_review_now_action" = "Most átnézem"; +"deactivate_account_title" = "Felhasználói fiók felfüggesztése"; +"deactivate_account_informations_part1" = "Ez a felhasználói fiókodat végleg használhatatlanná teszi. Nem leszel képes újra belépni, és senki más sem lesz képes újra ezzel a felhasználói azonosítóval regisztrálni. Így a felhasználód elhagyja az összes szobát amiben benn volt, és törli a fiók adatokat az azonosító szerverről. "; +"deactivate_account_informations_part2_emphasize" = "Ez a művelet visszavonhatatlan."; +"deactivate_account_informations_part3" = "\n\nFelhasználói fiókod felfüggesztése "; +"deactivate_account_informations_part4_emphasize" = "alapesetben nem jelenti azt, hogy minden eddig küldött üzenetedet elfelejtjük. "; +"deactivate_account_informations_part5" = "Ha azt szeretnéd, hogy felejtsük el minden üzenetedet, kérlek jelöld meg a jelölőnégyzetet alább\n\nAz üzenet láthatósága a Matrixban hasonló mint az e-mail. Az hogy elfelejtjük az üzeneteidet azt jelenti, hogy a továbbiakban az üzeneteket amiket küldtél nem osztjuk meg nem regisztrált felhasználókkal, de azok a regisztrált felhasználók akik már hozzáfértek ezekhez az üzenetekhez továbbra is hozzáférnek a saját másolatukhoz."; +"deactivate_account_forget_messages_information_part1" = "Kérlek felejtsétek el az összes üzenetet amit küldtem amikor a fiókom felfüggesztem ("; +"deactivate_account_forget_messages_information_part2_emphasize" = "Figyelmeztetés"; +"deactivate_account_forget_messages_information_part3" = ": ezzel a jövőben a felhasználók hiányos csevegést fognak csak látni)"; +"deactivate_account_validate_action" = "Felhasználói fiók felfüggesztése"; +"deactivate_account_password_alert_title" = "Felhasználói fiók felfüggesztése"; +"deactivate_account_password_alert_message" = "A folytatáshoz add meg a jelszavadat"; +// Re-request confirmation dialog +"rerequest_keys_alert_title" = "Kérés elküldve"; +"rerequest_keys_alert_message" = "Kérlek indítsd el a Riot-ot egy másik eszközödön amelyik vissza tudja fejteni az üzenetet, hogy el tudja küldeni a kulcsokat ennek az eszköznek."; +"room_recents_server_notice_section" = "RENDSZER FIGYELMEZTETÉSEK"; +"room_resource_limit_exceeded_message_contact_1" = " Kérlek "; +"room_resource_limit_exceeded_message_contact_2_link" = "vedd fel a kapcsolatot a szolgáltatás adminisztrátorával"; +"room_resource_limit_exceeded_message_contact_3" = " , hogy tovább használhasd a szolgáltatást."; +"homeserver_connection_lost" = "A Matrix szerverhez nem lehet kapcsolódni."; +"room_resource_usage_limit_reached_message_1_default" = "Ez a Matrix szerver túllépte egyik erőforrás korlátját így "; +"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."; diff --git a/Riot/Assets/is.lproj/Vector.strings b/Riot/Assets/is.lproj/Vector.strings index 2a0be5a92a..99391ec2da 100644 --- a/Riot/Assets/is.lproj/Vector.strings +++ b/Riot/Assets/is.lproj/Vector.strings @@ -259,9 +259,6 @@ "network_offline_prompt" = "Internettenging virðist vera ótengd."; "do_not_ask_again" = "Ekki spyrja aftur"; "large_badge_value_k_format" = "%.1fK"; -"room_displayname_two_members" = "%@ og %@"; -"room_displayname_more_than_two_members" = "%@ og %u til viðbótar"; -"room_displayname_no_title" = "Tóm spjallrás"; // Call "call_incoming_voice_prompt" = "Innhringing raddsamtals frá %@"; "call_incoming_video_prompt" = "Innhringing myndsamtals frá %@"; @@ -425,9 +422,6 @@ "directory_server_type_homeserver" = "Skrifaðu heimanetþjón til að telja upp opinberar spjallrásir á"; "bug_report_prompt" = "Forritið hrundi síðast. Myndirðu vilja senda inn villuskýrslu?"; "rage_shake_prompt" = "Það er eins og þú sért að hrista símann ákveðið. Myndirðu vilja senda villuskýrslu?"; -// room display name -"room_displayname_invite_from" = "Boð frá %@"; -"room_displayname_room_invite" = "Boð á spjallrás"; "call_jitsi_error" = "Mistókst að taka þátt í símafundi."; "bug_report_description" = "Lýstu villunni. Hvað varstu að gera? Hverju áttirðu von á? Hvað gerðist í raun?"; "bug_crash_report_description" = "Lýstu því hvað þú varst að gera þegar forritið hrundi (á ensku):"; diff --git a/Riot/Assets/ko.lproj/InfoPlist.strings b/Riot/Assets/ko.lproj/InfoPlist.strings new file mode 100644 index 0000000000..d253e9c238 --- /dev/null +++ b/Riot/Assets/ko.lproj/InfoPlist.strings @@ -0,0 +1,5 @@ +// Permissions usage explanations +"NSCameraUsageDescription" = "카메라는 사진과 영상 촬영, 영상통화를 하는데 쓰입니다."; +"NSPhotoLibraryUsageDescription" = "포토 라이브러리는 사진과 영상을 보내는데 쓰입니다."; +"NSMicrophoneUsageDescription" = "마이크는 영상 촬영, 통화에 쓰입니다."; +"NSContactsUsageDescription" = "연락처에 있는 상대가 이미 Riot이나 Matrix를 이용하고 있다는 걸 보여주기 위해 연락처의 이메일 주소와 전화번호를 Matrix 아이덴티티 서버로 보낼 수 있습니다. 새 Vector는 이 자료를 저장하거나 다른 용도로 사용하지 않습니다. 자세한 내용은 애플리케이션 설정에 있는 개인정보 보호정책을 읽어주세요."; diff --git a/Riot/Assets/ko.lproj/Localizable.strings b/Riot/Assets/ko.lproj/Localizable.strings new file mode 100644 index 0000000000..09d3383716 --- /dev/null +++ b/Riot/Assets/ko.lproj/Localizable.strings @@ -0,0 +1,30 @@ +/* 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" = "%@ 보낸 사진 %@"; +/* A single unread message in a room */ +"SINGLE_UNREAD_IN_ROOM" = "%@에서 메시지를 받았습니다."; +/* A single unread message */ +"SINGLE_UNREAD" = "메시지를 받았습니다."; +/* 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" = "%@가 그룹 대화에 당신을 초대했습니다."; +/* 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" = "%@이 건 영상그룹통화"; diff --git a/Riot/Assets/ko.lproj/Vector.strings b/Riot/Assets/ko.lproj/Vector.strings new file mode 100644 index 0000000000..cd578248f9 --- /dev/null +++ b/Riot/Assets/ko.lproj/Vector.strings @@ -0,0 +1,24 @@ +// 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" = "저장"; +"preview" = "미리보기"; +"camera" = "카메라"; diff --git a/Riot/Assets/nl.lproj/Vector.strings b/Riot/Assets/nl.lproj/Vector.strings index 82d82bd622..e3156c8d2b 100644 --- a/Riot/Assets/nl.lproj/Vector.strings +++ b/Riot/Assets/nl.lproj/Vector.strings @@ -404,12 +404,6 @@ "rage_shake_prompt" = "Het ziet er naar uit dat je de telefoon in frustratie schudt. Wil je een foutmelding indienen?"; "camera_access_not_granted" = "%@ heeft geen permission om de Camera te gebruiken, verander de privacy instellingen"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "Uitnodiging van %@"; -"room_displayname_room_invite" = "Ruimte Uitnodiging"; -"room_displayname_two_members" = "%@ en %@"; -"room_displayname_more_than_two_members" = "%@ en %u anderen"; -"room_displayname_no_title" = "Lege ruimte"; // Call "call_incoming_voice_prompt" = "Inkomende spraakoproep van %@"; "call_incoming_video_prompt" = "Inkomende video oproep van %@"; @@ -570,3 +564,6 @@ "deactivate_account_password_alert_title" = "Account deactiveren"; "deactivate_account_password_alert_message" = "Voer je wachtwoord in om verder te gaan"; "room_event_action_view_decrypted_source" = "Bekijk ontsleutelde bron"; +"room_message_reply_to_placeholder" = "Verstuur een antwoord (onversleuteld)…"; +"encrypted_room_message_reply_to_placeholder" = "Verstuur een versleuteld antwoord…"; +"room_message_reply_to_short_placeholder" = "Verstuur een antwoord…"; diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index d45422cc9d..32eea684f1 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -154,3 +154,8 @@ "room_participants_leave_prompt_msg" = "Você tem certeza que deseja sair da sala?"; "room_participants_remove_prompt_title" = "Confirmação"; "room_participants_remove_prompt_msg" = "Você tem certeza que deseja remover %@ desta conversa?"; +// Chat creation +"room_creation_title" = "Nova Sala"; +"room_creation_account" = "Conta"; +// Room recents +"room_recents_directory_section" = "LISTA PÚBLICA DE SALAS"; diff --git a/Riot/Assets/ru.lproj/Vector.strings b/Riot/Assets/ru.lproj/Vector.strings index a4e6114fc3..c3ef0320ec 100644 --- a/Riot/Assets/ru.lproj/Vector.strings +++ b/Riot/Assets/ru.lproj/Vector.strings @@ -3,13 +3,13 @@ "title_favourites" = "Избранное"; "title_people" = "Люди"; "title_rooms" = "Комнаты"; -"warning" = "Внимание"; +"warning" = "Предупреждение"; // Actions "view" = "Просмотр"; "back" = "Назад"; "continue" = "Продолжить"; "create" = "Создать"; -"start" = "Старт"; +"start" = "Начать"; "leave" = "Покинуть"; "remove" = "Удалить"; "invite" = "Пригласить"; @@ -17,7 +17,7 @@ "retry" = "Попробовать снова"; "cancel" = "Отмена"; "save" = "Сохранить"; -"join" = "Войти"; +"join" = "Присоединиться"; "accept" = "Принять"; "decline" = "Отклонить"; "camera" = "Камера"; @@ -194,7 +194,7 @@ "room_delete_unsent_messages" = "Удалить неотправленные сообщения"; "room_event_action_copy" = "Скопировать"; "room_event_action_quote" = "Цитировать"; -"room_event_action_redact" = "Редактировать"; +"room_event_action_redact" = "Удалить"; "room_event_action_more" = "Больше"; "room_event_action_share" = "Поделиться"; "room_event_action_permalink" = "Постоянная ссылка"; @@ -365,15 +365,9 @@ "network_offline_prompt" = "Подключение к интернету отключено."; "public_room_section_title" = "Публичные комнаты (в%@):"; "bug_report_prompt" = "Приложение некорректно завершило работу в прошлый раз. Хотите отправить отчет о сбое?"; -"rage_shake_prompt" = "Вы потрясли свой телефон и нам показалось, что вы в отчаянии от использования Riot. Хотите отправить отчет об ошибке?"; +"rage_shake_prompt" = "Похоже вы трясёте телефоном от безысходности. Хотите отправить отчет об ошибке?"; "camera_access_not_granted" = "%@ не имеет разрешения на использование камеры, пожалуйста, измените настройки конфиденциальности"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "Приглашение от %@"; -"room_displayname_room_invite" = "Приглашение в комнату"; -"room_displayname_two_members" = "%@ и %@"; -"room_displayname_more_than_two_members" = "%@ и %u другие"; -"room_displayname_no_title" = "Пустая комната"; // Call "call_incoming_voice_prompt" = "Входящий голосовой вызов от %@"; "call_incoming_video_prompt" = "Входящий видеозвонок от %@"; @@ -385,7 +379,7 @@ "e2e_enabling_on_app_update" = "Riot теперь поддерживает сквозное шифрование, но вам нужно снова войти в систему, чтобы включить его.\n\nВы можете сделать это сейчас или позже из настроек приложения."; "e2e_need_log_in_again" = "Вам нужно войти в систему, чтобы сгенерировать ключи шифрования для этого устройства и отправлять публичный ключ вашему серверу.\nЭто необходимо только один раз; извините за неудобства."; // Bug report -"bug_report_title" = "Отчет об ошибке"; +"bug_report_title" = "Сообщить об ошибке"; "bug_report_description" = "Опишите ошибку. Что сделали? Чего ожидали? Что на самом деле произошло?"; "bug_crash_report_title" = "Отчет о сбое"; "bug_crash_report_description" = "Пожалуйста, опишите, что вы делали до сбоя:"; @@ -395,8 +389,8 @@ "bug_report_progress_zipping" = "Сбор журналов"; "bug_report_progress_uploading" = "Отправка отчета"; "bug_report_send" = "Отправить"; -"on" = "Вкл"; -"off" = "Выкл"; +"on" = "Включить"; +"off" = "Выключить"; "preview" = "Просмотр"; "room_creation_account" = "Учетная запись"; "directory_searching_title" = "Поиск в каталоге…"; @@ -410,7 +404,7 @@ "unknown_devices_alert" = "Эта комната содержит устройства, которые еще не были проверены.\nЭто означает, что нет гарантии, что устройства принадлежат пользователям, тем, за кого они сами себя выдают.\nПеред продолжением рекомендуется пройти процедуру проверки для каждого устройства, но при желании можно повторно отправить сообщение без проверки."; "room_preview_try_join_an_unknown_room" = "Вы пытаетесь получить доступ к %@. Хотите присоединиться к обсуждению?"; "settings_config_no_build_info" = "Нет информации о выпуске"; -"settings_sign_out_e2e_warn" = "Будут утеряны сквозные ключи шифрования. Это означает, что вы не сможете читать старые сообщения в зашифрованных комнатах на этом устройстве."; +"settings_sign_out_e2e_warn" = "Будут утеряны сквозные ключи шифрования. Это означает, что вы больше не сможете читать старые сообщения в зашифрованных комнатах на этом устройстве."; "settings_remove_email_prompt_msg" = "Вы действительно хотите удалить адрес электронной почты %@?"; "settings_remove_phone_prompt_msg" = "Вы действительно хотите удалить номер телефона %@?"; "settings_pin_rooms_with_missed_notif" = "Закрепить комнаты с пропущенными уведомлениями"; @@ -551,3 +545,15 @@ "room_replacement_link" = "Этот разговор продолжается здесь."; "room_predecessor_information" = "Эта комната является продолжением другого разговора."; "room_predecessor_link" = "Нажмите здесь, чтобы просмотреть старые сообщения."; +"room_recents_server_notice_section" = "СИСТЕМНЫЕ ПРЕДУПРЕЖДЕНИЯ"; +"room_resource_limit_exceeded_message_contact_1" = " Пожалуйста "; +"room_resource_limit_exceeded_message_contact_2_link" = "обратитесь к администратору сервиса"; +"room_resource_limit_exceeded_message_contact_3" = " для продолжения его использования."; +"room_event_action_view_decrypted_source" = "Посмотреть расшифрованные исходники"; +"room_resource_usage_limit_reached_message_1_default" = "Этот сервер превысил один из лимитов ресурсов, так что "; +"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_labs_room_members_lazy_loading" = "Ленивая подгрузка собеседников"; +"settings_labs_room_members_lazy_loading_error_message" = "Ваш сервер не поддерживает ленивую подгрузку собеседников. Попробуйте позже."; +"homeserver_connection_lost" = "Невозможно соединиться с этим сервером."; diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 17de371cba..bca8dc756e 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -354,11 +354,6 @@ "network_offline_prompt" = "Lidhja Internet duket se është jashtë linje."; "public_room_section_title" = "Dhoma Publike (at %@):"; "do_not_ask_again" = "Mos pyet sërish"; -// room display name -"room_displayname_invite_from" = "Ftesë nga %@"; -"room_displayname_room_invite" = "Ftesë Dhome"; -"room_displayname_more_than_two_members" = "%@ dhe %u të tjerë"; -"room_displayname_no_title" = "Dhomë e zbrazët"; // Call "call_incoming_voice_prompt" = "Thirrje audio ardhëse nga %@"; "call_incoming_video_prompt" = "Thirrje video ardhëse nga %@"; diff --git a/Riot/Assets/vi.lproj/Vector.strings b/Riot/Assets/vi.lproj/Vector.strings index 6c0b358059..3058ca2c09 100644 --- a/Riot/Assets/vi.lproj/Vector.strings +++ b/Riot/Assets/vi.lproj/Vector.strings @@ -420,12 +420,6 @@ "do_not_ask_again" = "Đừng hỏi lại"; "camera_access_not_granted" = "%@ không có quyền để sử dụng máy ảnh, vui lòng thay đổi thiết lập riêng tư"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "Mời từ %@"; -"room_displayname_room_invite" = "Phòng mời"; -"room_displayname_two_members" = "%@ và %@"; -"room_displayname_more_than_two_members" = "%@ và %u người khác"; -"room_displayname_no_title" = "Phòng trống"; // Call "call_incoming_voice_prompt" = "Cuộc gọi thoại đến từ %@"; "call_incoming_video_prompt" = "Cuộc gọi video đến từ %@"; diff --git a/Riot/Assets/zh_Hans.lproj/InfoPlist.strings b/Riot/Assets/zh_Hans.lproj/InfoPlist.strings index bd5557878b..8f0ee35732 100644 --- a/Riot/Assets/zh_Hans.lproj/InfoPlist.strings +++ b/Riot/Assets/zh_Hans.lproj/InfoPlist.strings @@ -1,5 +1,5 @@ // Permissions usage explanations -"NSCameraUsageDescription" = "Riot 需要使用摄像头权限以拍摄照片、录制视频或进行视频聊天。"; -"NSPhotoLibraryUsageDescription" = "Riot 需要使用图库权限以发送图片与视频。"; -"NSMicrophoneUsageDescription" = "Riot 需要使用麦克风权限以便录制视频或进行通话。"; -"NSContactsUsageDescription" = "Riot 需要使用通讯录权限以 Riot 内部通过邮箱地址或手机号码搜索用户。"; +"NSCameraUsageDescription" = "摄像头权限用于拍摄照片、录制视频或进行视频聊天。"; +"NSPhotoLibraryUsageDescription" = "照片库访问权限用于发送图片与视频。"; +"NSMicrophoneUsageDescription" = "麦克风权限用于录制视频或进行通话。"; +"NSContactsUsageDescription" = "为了向您显示哪些联系人已在使用 Riot 或 Matrix,我们可将您通讯录中的邮件地址和电话号码发送到 Matrix 身份认证服务器。 新版的 Vector.im 不会存储此数据或将其用于任何其他目的。有关详细信息,请参阅应用程序设置中的隐私策略页面。"; diff --git a/Riot/Assets/zh_Hans.lproj/Localizable.strings b/Riot/Assets/zh_Hans.lproj/Localizable.strings index d102ed8690..e7d4fb0b2b 100644 --- a/Riot/Assets/zh_Hans.lproj/Localizable.strings +++ b/Riot/Assets/zh_Hans.lproj/Localizable.strings @@ -5,17 +5,17 @@ /* 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" = "%@ (%@):%@"; +"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" = "%@ 给您发了一张图片:%@"; +"IMAGE_FROM_USER" = "%@ 向您发送了一张图片:%@"; /* New action message from a specific person in a named room. */ -"IMAGE_FROM_USER_IN_ROOM" = "%@ 发了一张图片:%@ (来自聊天室 %@)"; +"IMAGE_FROM_USER_IN_ROOM" = "%@ 发送了一张图片:%@(来自 %@)"; /* A single unread message in a room */ -"SINGLE_UNREAD_IN_ROOM" = "你收到了一条消息 (来自聊天室 %@)"; +"SINGLE_UNREAD_IN_ROOM" = "您收到了一条消息(来自 %@)"; /* A single unread message */ "SINGLE_UNREAD" = "你收到了一条消息"; /* Multiple unread messages in a room */ @@ -27,7 +27,7 @@ /* 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" = "%@ 条未读消息 (来自 %@、%@ 和更多)"; +"MSGS_FROM_TWO_PLUS_USERS" = "%@ 条未读消息 (来自 %@、%@ 及更多)"; /* Multiple messages in two rooms */ "MSGS_IN_TWO_ROOMS" = "%@ 条未读消息 (来自聊天室 %@ 和 %@)"; /* Look, stuff's happened, alright? Just open the app. */ @@ -38,3 +38,15 @@ "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" = "来自 %@ 的视频会议:“%@”"; diff --git a/Riot/Assets/zh_Hans.lproj/Vector.strings b/Riot/Assets/zh_Hans.lproj/Vector.strings index 5f94b21fa4..d4a91bb8a3 100644 --- a/Riot/Assets/zh_Hans.lproj/Vector.strings +++ b/Riot/Assets/zh_Hans.lproj/Vector.strings @@ -6,8 +6,8 @@ "warning" = "警告"; // Actions "view" = "视图"; -"next" = "下一个"; -"back" = "上一个"; +"next" = "下一步"; +"back" = "返回"; "continue" = "继续"; "create" = "新建"; "start" = "开始"; @@ -53,7 +53,7 @@ "auth_invalid_email" = "这不像是一个有效的邮箱地址"; "auth_invalid_phone" = "这不像是一个有效的手机号码"; "auth_missing_password" = "缺少密码"; -"auth_add_email_message" = "添加一个邮箱地址这样可以其他用户用户发现你,并让你可以重置密码。"; +"auth_add_email_message" = "添加邮箱地址以允许其他用户发现您,并允许您重置密码。"; "auth_add_phone_message" = "添加一个手机号码让其他用户能够发现你。"; "auth_add_email_phone_message" = "添加一个邮箱地址和/或一个手机号码这样可以其他用户用户发现你,并让你可以利用电子邮件重置密码。"; "auth_add_email_and_phone_message" = "添加一个邮箱地址和一个手机号码这样可以其他用户用户发现你,并让你可以利用电子邮件重置密码。"; @@ -92,7 +92,7 @@ "room_creation_make_public_prompt_msg" = "你确认要让此聊天公开吗?任何人都可以读到您的消息并加入此聊天。"; "room_creation_keep_private" = "保持私密"; "room_creation_make_private" = "使其变成私密"; -"room_creation_wait_for_creation" = "已经创建了一个聊天室。请等待。"; +"room_creation_wait_for_creation" = "聊天室已创建。请稍候。"; "room_creation_invite_another_user" = "通过用户 ID、名称或电子邮件搜索 / 邀请"; // Room recents "room_recents_directory_section" = "聊天室目录"; @@ -106,7 +106,7 @@ "room_recents_start_chat_with" = "开始聊天"; "room_recents_create_empty_room" = "创建聊天室"; "room_recents_join_room" = "加入聊天室"; -"room_recents_join_room_title" = "加入一个聊天室"; +"room_recents_join_room_title" = "加入聊天室"; "room_recents_join_room_prompt" = "输入房间 ID 或者房间别名"; // People tab "people_invites_section" = "邀请"; @@ -182,12 +182,12 @@ "room_jump_to_first_unread" = "跳到第一条未读信息"; "room_new_message_notification" = "%d 条未读消息"; "room_new_messages_notification" = "%d 条未读消息"; -"room_one_user_is_typing" = "%@ 正在打字…"; -"room_two_users_are_typing" = "%@ 和 %@ 正在打字…"; -"room_many_users_are_typing" = "%@、%@ 和 %@ 正在打字…"; -"room_message_placeholder" = "发送一条消息(非加密)…"; -"encrypted_room_message_placeholder" = "发送一条加密消息…"; -"room_message_short_placeholder" = "发送一条消息…"; +"room_one_user_is_typing" = "%@ 正在输入…"; +"room_two_users_are_typing" = "%@ 和 %@ 正在输入…"; +"room_many_users_are_typing" = "%@、%@ 和 %@ 正在输入…"; +"room_message_placeholder" = "发送消息(非加密)…"; +"encrypted_room_message_placeholder" = "发送加密消息…"; +"room_message_short_placeholder" = "发送消息…"; "room_offline_notification" = "到服务器的连接已经丢失。"; "room_unsent_messages_notification" = "消息没有发送。现在 %@ 或 %@ ?"; "room_unsent_messages_unknown_devices_notification" = "由于未知设备在线所以消息没有发送。现在 %@ 或 %@?"; @@ -202,7 +202,7 @@ "room_event_action_more" = "移动"; "room_event_action_share" = "分享"; "room_event_action_permalink" = "永久链接"; -"room_event_action_view_source" = "查看源"; +"room_event_action_view_source" = "查看源数据"; "room_event_action_report" = "报告内容"; "room_event_action_report_prompt_reason" = "报告内容的原因"; "room_event_action_report_prompt_ignore_user" = "你想隐藏所有来自此用户的消息吗?"; @@ -267,18 +267,18 @@ "settings_add_email_address" = "添加邮箱地址"; "settings_phone_number" = "手机号码"; "settings_add_phone_number" = "添加手机号码"; -"settings_night_mode" = "午夜模式"; -"settings_fail_to_update_profile" = "更新档案失败"; -"settings_enable_push_notif" = "在此设备上通知"; -"settings_global_settings_info" = "全局通知设置在您的 %@ 网页客户端"; -"settings_pin_rooms_with_missed_notif" = "按错失的消息固定聊天室"; -"settings_pin_rooms_with_unread" = "按未读的消息固定聊天室"; -"settings_on_denied_notification" = "给 %@ 的通知已被拒绝,请在设备设置里允许"; +"settings_night_mode" = "夜间模式"; +"settings_fail_to_update_profile" = "个人档案更新失败"; +"settings_enable_push_notif" = "在此设备上发送通知"; +"settings_global_settings_info" = "全局通知设置可在 %@ 的网页客户端中修改"; +"settings_pin_rooms_with_missed_notif" = "置顶含有错过的通知的聊天室"; +"settings_pin_rooms_with_unread" = "置顶含有未读消息的聊天室"; +"settings_on_denied_notification" = "%@ 的通知请求被拒绝,请在系统设置中允许"; "settings_unignore_user" = "显示所有来自 %@ 的消息?"; "settings_contacts_discover_matrix_users" = "使用电子邮件和手机号码来发现用户"; "settings_contacts_phonebook_country" = "电话本国家"; "settings_labs_e2e_encryption" = "端对端加密"; -"settings_labs_e2e_encryption_prompt_message" = "要完成加密设置您须重新登录。"; +"settings_labs_e2e_encryption_prompt_message" = "为了应用加密设置,您须重新登录。"; "settings_version" = "版本 %@"; "settings_olm_version" = "Olm 版本 %@"; "settings_copyright" = "版权"; @@ -383,12 +383,6 @@ "rage_shake_prompt" = "你似乎在沮丧地摇晃手机。您要提交 bug 报告吗?"; "camera_access_not_granted" = "%@ 没有使用摄像头的权限,请修改隐私设置"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "从 %@ 邀请"; -"room_displayname_room_invite" = "聊天室邀请"; -"room_displayname_two_members" = "%@ 和 %@"; -"room_displayname_more_than_two_members" = "%@ 和 %u 个其他人"; -"room_displayname_no_title" = "空聊天室"; // Call "call_incoming_voice_prompt" = "来自 %@ 的语音通话"; "call_incoming_video_prompt" = "来自 %@ 的视频通话"; @@ -438,12 +432,12 @@ "settings_enable_callkit" = "集成通话"; "settings_ui_theme" = "主题"; "settings_ui_theme_auto" = "自动"; -"settings_ui_theme_light" = "清郎"; -"settings_ui_theme_dark" = "暗黑"; +"settings_ui_theme_light" = "浅色"; +"settings_ui_theme_dark" = "深色"; "settings_ui_theme_black" = "纯黑"; -"settings_ui_theme_picker_title" = "选择一个主题"; +"settings_ui_theme_picker_title" = "请选择主题"; "settings_ui_theme_picker_message" = "“自动”表示使用设备的“反色”设置"; -"settings_labs_create_conference_with_jitsi" = "使用 jitsi 创建一个会议通话"; +"settings_labs_create_conference_with_jitsi" = "使用 jitsi 创建会议通话"; "title_groups" = "社区"; // Groups tab "group_invite_section" = "邀请"; @@ -502,3 +496,35 @@ "widget_creation_failure" = "小部件创建失败"; // Room key request dialog "e2e_room_key_request_title" = "密钥共享请求"; +"room_recents_server_notice_section" = "系统警告"; +"room_message_reply_to_placeholder" = "发送回复(未加密)…"; +"encrypted_room_message_reply_to_placeholder" = "发送加密回复…"; +"room_message_reply_to_short_placeholder" = "发送回复…"; +"room_event_action_view_decrypted_source" = "查看经过解密的源数据"; +"room_action_send_photo_or_video" = "发送照片或视频"; +"room_action_send_sticker" = "发送贴纸"; +"room_resource_limit_exceeded_message_contact_1" = " 请 "; +"room_resource_limit_exceeded_message_contact_2_link" = "联系您的服务管理员"; +"room_resource_limit_exceeded_message_contact_3" = " 以继续使用本服务。"; +"settings_deactivate_account" = "注销账户"; +"settings_labs_room_members_lazy_loading" = "延迟加载聊天室成员"; +"settings_labs_room_members_lazy_loading_error_message" = "您的主服务器尚不支持延迟加载聊天室成员。请稍后再试。"; +"settings_deactivate_my_account" = "注销我的账户"; +"event_formatter_jitsi_widget_added" = ""; +"event_formatter_rerequest_keys_part1_link" = "重新请求加密密钥"; +"event_formatter_rerequest_keys_part2" = " (从您的其他设备中)。"; +"homeserver_connection_lost" = "无法连接至主服务器。"; +"call_jitsi_error" = "电话会议加入失败。"; +"deactivate_account_forget_messages_information_part2_emphasize" = "警告"; +"deactivate_account_validate_action" = "注销账户"; +"deactivate_account_password_alert_title" = "注销账户"; +// Re-request confirmation dialog +"rerequest_keys_alert_title" = "请求已发送"; +"settings_callkit_info" = "在您的锁屏界面接听 Riot 来电。在系统通话记录中显示 Riot 通话记录。若您已启用 iCloud,通话记录将会与 Apple 共享。"; +"room_replacement_link" = "对话自此继续。"; +"room_predecessor_information" = "本聊天室延续了另一对话。"; +"room_predecessor_link" = "点击查看更早消息。"; +"room_resource_usage_limit_reached_message_1_default" = "此主服务器已超出某一资源使用限制,导致 "; +"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" = " 若想提高限制。"; diff --git a/Riot/Assets/zh_Hant.lproj/InfoPlist.strings b/Riot/Assets/zh_Hant.lproj/InfoPlist.strings index 55763d6cfd..3f162f1b5e 100644 --- a/Riot/Assets/zh_Hant.lproj/InfoPlist.strings +++ b/Riot/Assets/zh_Hant.lproj/InfoPlist.strings @@ -2,4 +2,4 @@ "NSCameraUsageDescription" = "相機權限會用來拍攝照片與影片,以及進行視訊通話。"; "NSPhotoLibraryUsageDescription" = "照片圖庫的權限會用來傳送照片與影片。"; "NSMicrophoneUsageDescription" = "麥克風的權限會用來拍攝影片與進行通話。"; -"NSContactsUsageDescription" = "聯絡資訊的權限會用來在 Riot 上透過電子郵件或電話號碼搜尋使用者。"; +"NSContactsUsageDescription" = "為了要顯示您的聯絡人中哪些人已在使用 Riot 或 Matrix,我們將會傳送聯絡資訊內的電子郵件位址與電話給您的 Matrix 身份伺服器。New Vector 不會儲存這些資訊,也不會將這些資訊用於其他目的。請檢視應用程式設定的隱私權政策頁面來取得更多資訊。"; diff --git a/Riot/Assets/zh_Hant.lproj/Localizable.strings b/Riot/Assets/zh_Hant.lproj/Localizable.strings index 68f6644891..cbdbc08473 100644 --- a/Riot/Assets/zh_Hant.lproj/Localizable.strings +++ b/Riot/Assets/zh_Hant.lproj/Localizable.strings @@ -19,34 +19,34 @@ /* Multiple unread messages from a specific person, not referencing a room */ "MSGS_FROM_USER" = "%@ 個新訊息在 %@"; /* Multiple unread messages from two people */ -"MSGS_FROM_TWO_USERS" = "%@ 個新訊息從 %@ 與 %@ 而來"; +"MSGS_FROM_TWO_USERS" = "%@ 個新訊息來自 %@ 與 %@"; /* Multiple unread messages from three people */ -"MSGS_FROM_THREE_USERS" = "%@ 個新訊息從 %@、%@ 與 %@ 而來"; +"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" = "%@ 個新訊息從 %@、%@ 與其他人而來"; +"MSGS_FROM_TWO_PLUS_USERS" = "%@ 個新訊息來自 %@、%@ 與其他人"; /* Multiple messages in two rooms */ -"MSGS_IN_TWO_ROOMS" = "%@ 個新訊息在 %@ 與 %@"; +"MSGS_IN_TWO_ROOMS" = "%@ 個新訊息來自 %@ 與 %@"; /* Look, stuff's happened, alright? Just open the app. */ -"MSGS_IN_TWO_PLUS_ROOMS" = "%@ 個新訊息在 %@、%@ 與其他人"; +"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" = "%@ 已經邀請您到 %@"; +"USER_INVITE_TO_NAMED_ROOM" = "%@ 已經邀請您加入 %@"; /* Incoming one-to-one voice call */ -"VOICE_CALL_FROM_USER" = "從 %@ 而來的通話"; +"VOICE_CALL_FROM_USER" = "來自 %@ 的通話"; /* Incoming one-to-one video call */ -"VIDEO_CALL_FROM_USER" = "從 %@ 而來的視訊通話"; +"VIDEO_CALL_FROM_USER" = "來自 %@ 的視訊通話"; /* Incoming unnamed voice conference invite from a specific person */ -"VOICE_CONF_FROM_USER" = "從 %@ 而來的群組通話"; +"VOICE_CONF_FROM_USER" = "來自 %@ 的群組通話"; /* Incoming unnamed video conference invite from a specific person */ -"VIDEO_CONF_FROM_USER" = "從 %@ 而來的視訊群組通話"; +"VIDEO_CONF_FROM_USER" = "來自 %@ 的視訊群組通話"; /* Incoming named voice conference invite from a specific person */ -"VOICE_CONF_NAMED_FROM_USER" = "從 %@ 而來的群組通話:'%@'"; +"VOICE_CONF_NAMED_FROM_USER" = "來自 %@ 的群組通話:'%@'"; /* Incoming named video conference invite from a specific person */ -"VIDEO_CONF_NAMED_FROM_USER" = "從 %@ 而來的視訊群組通話:'%@'"; +"VIDEO_CONF_NAMED_FROM_USER" = "來自 %@ 的視訊群組通話:'%@'"; /* A single unread message in a room */ -"SINGLE_UNREAD_IN_ROOM" = "你在 %@ 中收到了一則訊息"; +"SINGLE_UNREAD_IN_ROOM" = "您在 %@ 中收到了一則訊息"; /* A single unread message */ -"SINGLE_UNREAD" = "你收到了一則訊息"; +"SINGLE_UNREAD" = "您收到了一則訊息"; diff --git a/Riot/Assets/zh_Hant.lproj/Vector.strings b/Riot/Assets/zh_Hant.lproj/Vector.strings index 6b39e51dd7..6c120218eb 100644 --- a/Riot/Assets/zh_Hant.lproj/Vector.strings +++ b/Riot/Assets/zh_Hant.lproj/Vector.strings @@ -68,7 +68,7 @@ "auth_missing_email_or_phone" = "缺少電子郵件位址或電話號碼"; "auth_email_in_use" = "這個電子郵件位址已被使用"; "auth_phone_in_use" = "這個電話號碼已被使用"; -"auth_untrusted_id_server" = "這個驗證伺服器不受信任"; +"auth_untrusted_id_server" = "這個身份伺服器不受信任"; "auth_password_dont_match" = "兩次密碼輸入不吻合"; "auth_username_in_use" = "使用者名稱已被使用"; "auth_forgot_password" = "忘記密碼?"; @@ -84,7 +84,7 @@ "today" = "今天"; "yesterday" = "昨天"; "room_ongoing_conference_call_close" = "關閉"; -"bug_report_send_logs" = "傳送記錄"; +"bug_report_send_logs" = "傳送記錄檔"; "bug_report_send" = "傳送"; "room_event_action_resend" = "重新傳送"; "room_event_action_view_source" = "檢視來源"; @@ -101,7 +101,7 @@ "auth_reset_password_missing_password" = "一個新的密碼必須被輸入。"; "auth_reset_password_next_step_button" = "我已經驗證了我的電子郵件地址"; "auth_reset_password_error_unauthorized" = "電子郵件地址驗證失敗: 請確保你已點擊郵件中的連結"; -"auth_reset_password_error_not_found" = "您的電子郵件地址似乎未在此家伺服器上與 Matrix ID 關聯。"; +"auth_reset_password_error_not_found" = "您的電子郵件地址似乎沒有與在此家伺服器上的 Matrix ID 綁定。"; "room_creation_account" = "帳號"; "room_creation_appearance_name" = "名稱"; "room_recents_start_chat_with" = "開始聊天"; @@ -197,8 +197,8 @@ "room_recents_join_room_prompt" = "輸入聊天室 ID 或別名"; // People tab "people_invites_section" = "邀請"; -"people_conversation_section" = "聊天"; -"people_no_conversation" = "沒有聊天"; +"people_conversation_section" = "對話"; +"people_no_conversation" = "沒有對話"; // Rooms tab "room_directory_no_public_room" = "沒有公開的聊天室"; // Groups tab @@ -268,7 +268,7 @@ "room_message_short_placeholder" = "傳送訊息…"; "room_unsent_messages_notification" = "訊息未被傳送。現在 %@ 或 %@ 嗎?"; "room_unsent_messages_unknown_devices_notification" = "由於存在未知的裝置導致訊息未被傳送。現在 %@ 或 %@ 嗎?"; -"room_conference_call_no_power" = "您需要管理此聊天室會議電話的權限"; +"room_conference_call_no_power" = "您需要管理此聊天室群組通話的權限"; "room_prompt_resend" = "全部重新傳送"; "room_prompt_cancel" = "全部取消"; "room_resend_unsent_messages" = "重送未傳送訊息"; @@ -285,7 +285,7 @@ "room_event_action_save" = "儲存"; "room_event_action_cancel_send" = "取消傳送"; "room_event_action_cancel_download" = "取消下載"; -"room_warning_about_encryption" = "點對點加密仍在測試階段,可能不太可靠。\n\n目前您不該認為他能保護您的資料。\n\n裝置將未能解密加入聊天室前的歷史紀錄。\n\n加密訊息無法顯示在尚未實施加密功能的用戶端。"; +"room_warning_about_encryption" = "點對點加密仍在測試階段,可能不太可靠。\n\n目前您不該認為他能保護您的資料。\n\n裝置將無法解密加入聊天室前的對話紀錄。\n\n加密過的訊息將無法在尚未提供加密功能的用戶端顯示。"; "room_event_failed_to_send" = "傳送失敗"; "room_action_send_photo_or_video" = "傳送照片或影片"; "room_action_send_sticker" = "傳送貼圖"; @@ -311,8 +311,8 @@ "settings_config_no_build_info" = "沒有編譯訊息"; "settings_mark_all_as_read" = "將所有訊息設為已讀"; "settings_report_bug" = "回報 bug"; -"settings_config_home_server" = "主伺服器為 %@"; -"settings_config_identity_server" = "身分認證伺服器為 %@"; +"settings_config_home_server" = "家伺服器為 %@"; +"settings_config_identity_server" = "身份伺服器為 %@"; "settings_config_user_id" = "以 %@ 登入"; "settings_user_settings" = "使用者設定"; "settings_notifications_settings" = "通知設定"; @@ -339,15 +339,15 @@ "settings_night_mode" = "午夜模式"; "settings_fail_to_update_profile" = "更新個人檔案失敗"; "settings_enable_push_notif" = "在此裝置上啟用通知"; -"settings_show_decrypted_content" = "顯示已解密內容"; -"settings_global_settings_info" = "全域通知設定可透過 %@ 網頁用戶端修改"; -"room_ongoing_conference_call" = "會議電話進行中。 以 %@ 或 %@ 加入。"; -"room_ongoing_conference_call_with_close" = "會議電話進行中。 以 %@ 或 %@ 加入。%@ 該通話。"; +"settings_show_decrypted_content" = "顯示已解密的內容"; +"settings_global_settings_info" = "全域通知設定可在 %@ 網頁用戶端上修改"; +"room_ongoing_conference_call" = "群組通話進行中。 以 %@ 或 %@ 加入。"; +"room_ongoing_conference_call_with_close" = "群組通話進行中。 以 %@ 或 %@ 加入。%@ 該通話。"; "settings_pin_rooms_with_missed_notif" = "釘選含有錯過的通知的聊天室"; "settings_pin_rooms_with_unread" = "釘選含有未讀訊息的聊天室"; "settings_on_denied_notification" = "因 %@ 的通知不被允許,請在裝置設定中允許"; "settings_enable_callkit" = "整合式通話"; -"settings_callkit_info" = "提供在鎖定畫面接聽來電、在通話紀錄中顯示使用 Riot 的通話。 如果已啟用 iCloud ,則通話歷史紀錄會與蘋果公司共享。"; +"settings_callkit_info" = "提供在鎖定畫面接聽 Riot 來電、在通話紀錄中顯示 Riot 通話。 如果您已啟用 iCloud ,則會與蘋果公司共享通話紀錄。"; "settings_ui_language" = "語言"; "settings_ui_theme" = "主題"; "settings_ui_theme_auto" = "自動"; @@ -361,7 +361,7 @@ "settings_contacts_phonebook_country" = "電話簿所屬國家"; "settings_labs_e2e_encryption" = "點對點加密"; "settings_labs_e2e_encryption_prompt_message" = "為完成加密設定,您必須重新登入。"; -"settings_labs_create_conference_with_jitsi" = "使用 jitsi 建立會議電話"; +"settings_labs_create_conference_with_jitsi" = "使用 jitsi 建立群組通話"; "settings_version" = "版本 %@"; "settings_olm_version" = "Olm 版本 %@"; "settings_copyright" = "版權"; @@ -409,7 +409,7 @@ "room_details_advanced_enable_e2e_encryption" = "啟用加密 (警告: 啟用後無法停用)"; "room_details_advanced_e2e_encryption_disabled" = "此聊天室未啟用加密。"; "room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "只匯出到已驗證的裝置"; -"room_details_advanced_e2e_encryption_prompt_message" = "點對點加密仍在測試階段,可能不夠可靠。\n\n現在您不該認為他能保護您的資料。\n\n裝置尚未能解密在加入聊天室前的聊天紀錄。\n\n一個聊天室一旦啟用加密功能,將無法關閉 (目前)。\n\n加密過的訊息將無法在尚未提供加密功能的用戶端顯示。"; +"room_details_advanced_e2e_encryption_prompt_message" = "點對點加密仍在測試階段,可能不夠可靠。\n\n現在您不該認為他能保護您的資料。\n\n裝置尚未能解密在加入聊天室前的聊天紀錄。\n\n一個聊天室一旦啟用加密功能,將無法關閉 (就目前而言)。\n\n加密過的訊息將無法在尚未提供加密功能的用戶端顯示。"; "room_details_fail_to_update_avatar" = "更新聊天室圖片失敗"; "room_details_fail_to_update_room_name" = "更新聊天室名稱失敗"; "room_details_fail_to_update_topic" = "更新主題失敗"; @@ -460,14 +460,14 @@ "directory_server_picker_title" = "選擇一個目錄"; "directory_server_all_rooms" = "在 %@ 伺服器上的所有聊天室"; "directory_server_all_native_rooms" = "所有本地 Matrix 聊天室"; -"directory_server_type_homeserver" = "輸入一個主伺服器來列出所有公開聊天室"; +"directory_server_type_homeserver" = "輸入一個家伺服器來列出所有公開聊天室"; "directory_server_placeholder" = "matrix.org"; // Events formatter -"event_formatter_member_updates" = "%tu 成員身分改變"; +"event_formatter_member_updates" = "%tu 成員身份改變"; "event_formatter_widget_added" = "%@ widget 已由 %@ 新增"; "event_formatter_widget_removed" = "%@ widget 已由 %@ 移除"; -"event_formatter_jitsi_widget_added" = "VoIP 會議已由 %@ 新增"; -"event_formatter_jitsi_widget_removed" = "VoIP 會議已由 %@ 移除"; +"event_formatter_jitsi_widget_added" = "VoIP 群組通話已由 %@ 新增"; +"event_formatter_jitsi_widget_removed" = "VoIP 群組通話已由 %@ 移除"; "event_formatter_rerequest_keys_part1_link" = "重新請求加密金鑰"; "event_formatter_rerequest_keys_part2" = " 從您的其他裝置。"; // Others @@ -480,19 +480,13 @@ "do_not_ask_again" = "不再詢問"; "camera_access_not_granted" = "%@ 沒有使用相機的權限,請修改隱私權設定"; "large_badge_value_k_format" = "%.1fK"; -// room display name -"room_displayname_invite_from" = "從 %@ 邀請"; -"room_displayname_room_invite" = "聊天室邀請"; -"room_displayname_two_members" = "%@ 和 %@"; -"room_displayname_more_than_two_members" = "%@ 和 %u 個其他人"; -"room_displayname_no_title" = "空的聊天室"; // Call "call_incoming_voice_prompt" = "來自 %@ 的語音通話"; "call_incoming_video_prompt" = "來自 %@ 的視訊通話"; "call_incoming_voice" = "收到來電…"; "call_incoming_video" = "收到視訊來電…"; "call_already_displayed" = "已有通話進行中。"; -"call_jitsi_error" = "加入會議通話失敗。"; +"call_jitsi_error" = "加入群組通話失敗。"; // No VoIP support "no_voip_title" = "來電"; "no_voip" = "%@ 正在撥打給您,但 %@ 尚不支援通話。\n您可以忽略此通知透過其他裝置接聽或拒絕接聽。"; @@ -504,7 +498,7 @@ "bug_report_title" = "錯誤回報"; "bug_report_send_screenshot" = "傳送螢幕截圖"; "e2e_room_key_request_start_verification" = "開始驗證…"; -"e2e_need_log_in_again" = "您需要登入回帳號以為此設備產生點對點加密密鑰並將公鑰送出到您的主伺服器。\n這僅需要做一次,很抱歉造成您的困擾。"; +"e2e_need_log_in_again" = "您需要登入回帳號以便為此設備產生點對點加密密鑰並將公鑰送出到您的家伺服器。\n這僅需要做一次,很抱歉造成您的困擾。"; "bug_crash_report_title" = "崩潰報告"; // Widget "widget_no_power_to_manage" = "您需要相關權限以管理此聊天室的 widget"; @@ -514,7 +508,7 @@ "rerequest_keys_alert_message" = "請在其他可解密訊息的裝置開啟 Riot 以將密鑰傳送到此裝置。"; "bug_report_description" = "請描述此錯誤。您做了什麼? 本來應該發生什麼? 以及實際發生什麼?"; "bug_crash_report_description" = "請描述您在崩潰前做了什麼:"; -"bug_report_logs_description" = "為了診斷問題,此用戶端的紀錄將會隨此錯誤報告送出。 如果您只想傳送上面的文字,請取消:"; +"bug_report_logs_description" = "為了診斷問題,此用戶端的記錄檔將會隨此錯誤報告送出。 如果您只想傳送上面的文字,請取消:"; "widget_integration_missing_room_id" = "在請求中遺失 room_id 。"; "widget_integration_missing_user_id" = "在請求中遺失 user_id 。"; "widget_integration_room_not_visible" = "%@ 聊天室不可見。"; @@ -524,19 +518,29 @@ "e2e_room_key_request_message_new_device" = "您新增的裝置 '%@', 正在請求加密密鑰。"; "e2e_room_key_request_message" = "您未驗證的裝置 '%@' 正在請求加密密鑰。"; // GDPR -"gdpr_consent_not_given_alert_message" = "如要繼續使用此主伺服器,您必須同意該合約條款。"; +"gdpr_consent_not_given_alert_message" = "如要繼續使用此家伺服器,您必須同意該合約條款。"; "gdpr_consent_not_given_alert_review_now_action" = "現在重新檢視"; "deactivate_account_title" = "註銷帳號"; "deactivate_account_informations_part1" = "這會使您的帳號永久無法使用。 您將不能以此帳號登入且任何人都將無法以此帳號的ID重新進行註冊。這會使您的帳號立即離開所有參加的聊天室,並從身份伺服器上將您帳號的詳細資料移除。 "; "deactivate_account_informations_part2_emphasize" = "此動作無法回復。"; "deactivate_account_informations_part3" = "\n\n註銷您的帳號 "; "deactivate_account_informations_part4_emphasize" = "在預設情況下我們並不會遺忘您曾傳送的訊息。 "; -"deactivate_account_informations_part5" = "如果您希望我們遺忘您曾傳送的訊息,請勾選下方的方格\n\n在 Matrix 中,訊息的可見性如同電子郵件。我們遺忘了您曾傳送的訊息表示這些訊息將不會與任何新註冊或未註冊使用者分享,但已有權限讀取您傳送的訊息的已註冊使用者仍能從他們的副本中讀取。"; +"deactivate_account_informations_part5" = "如果您希望我們遺忘您曾傳送的訊息,請選取下方的欄位\n\n在 Matrix 中,訊息的可見性如同電子郵件。我們遺忘了您曾傳送的訊息表示這些訊息將不會與任何新註冊或未註冊的使用者分享,但過去已有權限讀取您的訊息的已註冊使用者仍能從他們的副本中讀取。"; "deactivate_account_forget_messages_information_part1" = "當我註銷我的帳號時,請遺忘所有我曾傳送的訊息 ("; "deactivate_account_forget_messages_information_part2_emphasize" = "警告"; -"deactivate_account_forget_messages_information_part3" = ": 這會導致未來的使用者看到不不完整的對話歷史紀錄)"; +"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" = "已傳送請求"; +"room_message_reply_to_placeholder" = "送出回覆(未加密)…"; +"encrypted_room_message_reply_to_placeholder" = "送出加密的回覆…"; +"room_message_reply_to_short_placeholder" = "送出回覆…"; +"room_event_action_view_decrypted_source" = "檢視已解密的來源"; +"room_predecessor_link" = "輕觸此處以檢視更早以前的訊息。"; +"room_replacement_information" = "此聊天室已被取代且不再使用。"; +"room_replacement_link" = "對話自此延續。"; +"room_predecessor_information" = "此聊天室是另一對話的延續。"; +"settings_labs_room_members_lazy_loading" = "延遲載入聊天室成員"; +"settings_labs_room_members_lazy_loading_error_message" = "您的家伺服器尚未支援延遲載入聊天室成員。 請稍後再試。"; diff --git a/Riot/Categories/MXRoomSummary+Riot.m b/Riot/Categories/MXRoomSummary+Riot.m index 78465b325f..0367f2436f 100644 --- a/Riot/Categories/MXRoomSummary+Riot.m +++ b/Riot/Categories/MXRoomSummary+Riot.m @@ -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 @@ - (void)setRoomAvatarImageIn:(MXKImageView*)mxkImageView { 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 { diff --git a/Riot/Categories/MatrixSDK+Swift.h b/Riot/Categories/MatrixSDK+Swift.h deleted file mode 100644 index f87280d89a..0000000000 --- a/Riot/Categories/MatrixSDK+Swift.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - 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 - -/** - IMPORTANT: This file must be removed once the pod 'MatrixSDK/SwiftSupport' can - be pushed. - - Methods are redefined here to skip NS_REFINED_FOR_SWIFT defined in their declaration. - */ - -@interface MXSession (Swift) - -- (MXHTTPOperation*)createRoomFromSwift:(NSString*)name - visibility:(MXRoomDirectoryVisibility)visibility - roomAlias:(NSString*)roomAlias - topic:(NSString*)topic - invite:(NSArray*)inviteArray - invite3PID:(NSArray*)invite3PIDArray - isDirect:(BOOL)isDirect - preset:(MXRoomPreset)preset - success:(void (^)(void))success - failure:(void (^)(NSError *error))failure; - -@end - - -@interface MXRoomSummary (Swift) - -@property (nonatomic, readonly) MXMembership membershipFromSwift; - -@end - diff --git a/Riot/Categories/MatrixSDK+Swift.m b/Riot/Categories/MatrixSDK+Swift.m deleted file mode 100644 index b0b03c8281..0000000000 --- a/Riot/Categories/MatrixSDK+Swift.m +++ /dev/null @@ -1,52 +0,0 @@ -/* - 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 - -#import "MatrixSDK+Swift.h" - -@implementation MXSession (Swift) - -- (MXHTTPOperation*)createRoomFromSwift:(NSString*)name - visibility:(MXRoomDirectoryVisibility)visibility - roomAlias:(NSString*)roomAlias - topic:(NSString*)topic - invite:(NSArray*)inviteArray - invite3PID:(NSArray*)invite3PIDArray - isDirect:(BOOL)isDirect - preset:(MXRoomPreset)preset - success:(void (^)(void))success - failure:(void (^)(NSError *error))failure -{ - return [self createRoom:name visibility:visibility roomAlias:roomAlias topic:topic invite:inviteArray invite3PID:invite3PIDArray isDirect:isDirect preset:preset success:^(MXRoom *room) { - - if (success) - { - success(); - } - } failure:failure]; -} - -@end - -@implementation MXRoomSummary (Swift) - -- (MXMembership)membershipFromSwift -{ - return self.membership; -} - -@end diff --git a/Riot/Constants/RiotDesignValues.h b/Riot/Constants/RiotDesignValues.h index a6db623b6f..35c4d05c88 100644 --- a/Riot/Constants/RiotDesignValues.h +++ b/Riot/Constants/RiotDesignValues.h @@ -53,6 +53,7 @@ extern UIColor *kRiotColorRed; extern UIColor *kRiotColorIndigo; extern UIColor *kRiotColorOrange; extern UIColor *kRiotColorBlue; +extern UIColor *kRiotColorCuriousBlue; #pragma mark - Riot Standard Room Member Power Level extern NSInteger const kRiotRoomModeratorLevel; diff --git a/Riot/Constants/RiotDesignValues.m b/Riot/Constants/RiotDesignValues.m index f80f860e53..168882a5b0 100644 --- a/Riot/Constants/RiotDesignValues.m +++ b/Riot/Constants/RiotDesignValues.m @@ -43,6 +43,7 @@ UIColor *kRiotColorIndigo; UIColor *kRiotColorOrange; UIColor *kRiotColorBlue; +UIColor *kRiotColorCuriousBlue; // Riot Background Colors UIColor *kRiotBgColorWhite; @@ -97,7 +98,8 @@ + (void)load kRiotColorIndigo = UIColorFromRGB(0xBD79CC); kRiotColorOrange = UIColorFromRGB(0xF8A15F); kRiotColorBlue = UIColorFromRGB(0x81BDDB); - + kRiotColorCuriousBlue = UIColorFromRGB(0x2A9EDB); + kRiotBgColorWhite = [UIColor whiteColor]; kRiotBgColorBlack = UIColorFromRGB(0x2D2D2D); kRiotBgColorOLEDBlack = [UIColor blackColor]; diff --git a/Riot/Managers/OnBoarding/OnBoardingManager.swift b/Riot/Managers/OnBoarding/OnBoardingManager.swift index f16f70076f..fbfc7c8447 100644 --- a/Riot/Managers/OnBoarding/OnBoardingManager.swift +++ b/Riot/Managers/OnBoarding/OnBoardingManager.swift @@ -48,31 +48,33 @@ final public class OnBoardingManager: NSObject { success?() return } - -// // Create DM room with Riot-bot -// -// let httpOperation = self.session.createRoom(name: nil, visibility: .private, alias: nil, topic: nil, invite: [Constants.riotBotMatrixId], invite3PID: nil, isDirect: true, preset: .trustedPrivateChat) { (response) in -// -// switch response { -// case .success(_): -// success?() -// case .failure(let error): -// NSLog("[OnBoardingManager] Create chat with riot-bot failed"); -// failure?(error) -// } -// } -// -// // Make multipe tries, until we get a response -// httpOperation.maxNumberOfTries = Constants.createRiotBotDMRequestMaxNumberOfTries - - // Create DM room with Riot-bot + // Check first that the user homeserver is federated with the Riot-bot homeserver + self.session.matrixRestClient.avatarUrl(forUser: Constants.riotBotMatrixId) { (response) in + + switch response { + case .success(_): - let httpOperation = self.session.createRoom(fromSwift: nil, visibility: kMXRoomDirectoryVisibilityPrivate, roomAlias: nil, topic: nil, invite: [Constants.riotBotMatrixId], invite3PID: nil, isDirect: true, preset: kMXRoomPresetTrustedPrivateChat, success: success, failure: nil) + // Create DM room with Riot-bot + let httpOperation = self.session.createRoom(name: nil, visibility: .private, alias: nil, topic: nil, invite: [Constants.riotBotMatrixId], invite3PID: nil, isDirect: true, preset: .trustedPrivateChat) { (response) in + switch response { + case .success(_): + success?() + case .failure(let error): + NSLog("[OnBoardingManager] Create chat with riot-bot failed"); + failure?(error) + } + } - // Make multipe tries, until we get a response - httpOperation?.maxNumberOfTries = Constants.createRiotBotDMRequestMaxNumberOfTries + // Make multipe tries, until we get a response + httpOperation.maxNumberOfTries = Constants.createRiotBotDMRequestMaxNumberOfTries + + case .failure(let error): + NSLog("[OnBoardingManager] riot-bot is unknown or the user hs is non federated. Do not try to create a room with riot-bot"); + failure?(error) + } + } } // MARK: - Private @@ -85,8 +87,7 @@ final public class OnBoardingManager: NSObject { var isUSerJoinedARoom = false for roomSummary in roomSummaries { - // if case .join = roomSummary.membership { - if case __MXMembershipJoin = roomSummary.membershipFromSwift { + if case .join = roomSummary.membership { isUSerJoinedARoom = true break } diff --git a/Riot/Managers/Widgets/WidgetManager.m b/Riot/Managers/Widgets/WidgetManager.m index 360a359dad..c225e140ef 100644 --- a/Riot/Managers/Widgets/WidgetManager.m +++ b/Riot/Managers/Widgets/WidgetManager.m @@ -527,7 +527,6 @@ - (void)save NSUserDefaults *userDefaults = [MXKAppSettings standardAppSettings].sharedUserDefaults; [userDefaults setObject:scalarTokens forKey:@"scalarTokens"]; - [userDefaults synchronize]; } @end diff --git a/Riot/Model/Room/RoomPreviewData.m b/Riot/Model/Room/RoomPreviewData.m index 05da6d20f5..a55c0eae21 100644 --- a/Riot/Model/Room/RoomPreviewData.m +++ b/Riot/Model/Room/RoomPreviewData.m @@ -97,11 +97,11 @@ - (void)peekInRoom:(void (^)(BOOL succeeded))completion self->_roomAvatarUrl = peekingRoom.summary.avatar; self->_roomTopic = [MXTools stripNewlineCharacters:peekingRoom.summary.topic];; - self->_roomAliases = self.roomDataSource.roomState.aliases; + self->_roomAliases = peekingRoom.summary.aliases; // Room members count // Note that room members presence/activity is not available - self->_numJoinedMembers = self.roomDataSource.roomState.membersCount.joined; + self->_numJoinedMembers = peekingRoom.summary.membersCount.joined; completion(YES); }]; diff --git a/Riot/Modules/BugReport/BugReportViewController.m b/Riot/Modules/BugReport/BugReportViewController.m index 1c9a6a91e1..7e9ceaed03 100644 --- a/Riot/Modules/BugReport/BugReportViewController.m +++ b/Riot/Modules/BugReport/BugReportViewController.m @@ -306,6 +306,9 @@ - (IBAction)onSendButtonPress:(id)sender userInfo[@"default_app_language"] = [[NSBundle mainBundle] preferredLocalizations][0]; // The language chosen by the OS userInfo[@"app_language"] = [NSBundle mxk_language] ? [NSBundle mxk_language] : userInfo[@"default_app_language"]; // The language chosen by the user + // Application settings + userInfo[@"lazy_loading"] = [MXKAppSettings standardAppSettings].syncWithLazyLoadOfRoomMembers ? @"ON" : @"OFF"; + NSDate *currentDate = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; diff --git a/Riot/Modules/Call/CallViewController.m b/Riot/Modules/Call/CallViewController.m index 22c18845d6..cbc3cae384 100644 --- a/Riot/Modules/Call/CallViewController.m +++ b/Riot/Modules/Call/CallViewController.m @@ -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. @@ -202,20 +203,17 @@ - (void)destroy - (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; @@ -399,8 +397,11 @@ - (void)updatePeerInfoDisplay 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 { diff --git a/Riot/Modules/Call/Views/IncomingCallView.h b/Riot/Modules/Call/Views/IncomingCallView.h index 9b437c1ee9..12164d8d81 100644 --- a/Riot/Modules/Call/Views/IncomingCallView.h +++ b/Riot/Modules/Call/Views/IncomingCallView.h @@ -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 diff --git a/Riot/Modules/Call/Views/IncomingCallView.m b/Riot/Modules/Call/Views/IncomingCallView.m index 0d442232c6..d956ceccef 100644 --- a/Riot/Modules/Call/Views/IncomingCallView.m +++ b/Riot/Modules/Call/Views/IncomingCallView.m @@ -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 @@ + (CGSize)callerAvatarSize 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 @@ - (instancetype)initWithCallerAvatarURL:(NSString *)callerAvatarURL placeholderI 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; diff --git a/Riot/Modules/Common/Recents/CellData/RecentCellData.m b/Riot/Modules/Common/Recents/CellData/RecentCellData.m index 6b28e95287..a9def48fd3 100644 --- a/Riot/Modules/Common/Recents/CellData/RecentCellData.m +++ b/Riot/Modules/Common/Recents/CellData/RecentCellData.m @@ -60,7 +60,7 @@ - (void)update roomDisplayname = self.roomSummary.displayname; if (!roomDisplayname.length) { - roomDisplayname = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil); + roomDisplayname = [NSBundle mxk_localizedStringForKey:@"room_displayname_empty_room"]; } } diff --git a/Riot/Modules/GlobalSearch/Files/CellData/FilesSearchCellData.m b/Riot/Modules/GlobalSearch/Files/CellData/FilesSearchCellData.m index 2fd863cdb6..f39daa4449 100644 --- a/Riot/Modules/GlobalSearch/Files/CellData/FilesSearchCellData.m +++ b/Riot/Modules/GlobalSearch/Files/CellData/FilesSearchCellData.m @@ -41,7 +41,7 @@ - (instancetype)initWithSearchResult:(MXSearchResult *)searchResult2 andSearchDa 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 @@ -101,7 +101,7 @@ - (void)setShouldShowRoomDisplayName:(BOOL)shouldShowRoomDisplayName2 roomDisplayName = room.summary.displayname; if (!roomDisplayName.length) { - roomDisplayName = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil); + roomDisplayName = [NSBundle mxk_localizedStringForKey:@"room_displayname_empty_room"]; } } else diff --git a/Riot/Modules/GlobalSearch/Files/Views/FilesSearchTableViewCell.m b/Riot/Modules/GlobalSearch/Files/Views/FilesSearchTableViewCell.m index de045e5fb9..29f8ccb5dc 100644 --- a/Riot/Modules/GlobalSearch/Files/Views/FilesSearchTableViewCell.m +++ b/Riot/Modules/GlobalSearch/Files/Views/FilesSearchTableViewCell.m @@ -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 @@ - (void)render:(MXKCellData*)cellData 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]; diff --git a/Riot/Modules/PublicRoomList/Views/PublicRoomTableViewCell.m b/Riot/Modules/PublicRoomList/Views/PublicRoomTableViewCell.m index 5cd611a528..a8fbca4cc9 100644 --- a/Riot/Modules/PublicRoomList/Views/PublicRoomTableViewCell.m +++ b/Riot/Modules/PublicRoomList/Views/PublicRoomTableViewCell.m @@ -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 @@ - (void)render:(MXPublicRoom *)publicRoom withMatrixSession:(MXSession*)mxSessio { _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 { diff --git a/Riot/SupportingFiles/Info.plist b/Riot/SupportingFiles/Info.plist index b6e65fd52b..ebf7260c85 100644 --- a/Riot/SupportingFiles/Info.plist +++ b/Riot/SupportingFiles/Info.plist @@ -17,11 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.7.0 + 0.7.7 CFBundleSignature ???? CFBundleVersion - 0.7.0 + 0.7.7 ITSAppUsesNonExemptEncryption ITSEncryptionExportComplianceCode diff --git a/Riot/SupportingFiles/Riot-Bridging-Header.h b/Riot/SupportingFiles/Riot-Bridging-Header.h index 02b3ba1652..59026bb56d 100644 --- a/Riot/SupportingFiles/Riot-Bridging-Header.h +++ b/Riot/SupportingFiles/Riot-Bridging-Header.h @@ -4,4 +4,3 @@ @import MatrixSDK; #import "WebViewViewController.h" -#import "MatrixSDK+Swift.h" diff --git a/Riot/SupportingFiles/Riot.entitlements b/Riot/SupportingFiles/Riot.entitlements index edee34b653..779cd8dff1 100644 --- a/Riot/SupportingFiles/Riot.entitlements +++ b/Riot/SupportingFiles/Riot.entitlements @@ -10,6 +10,7 @@ applinks:vector.im applinks:riot.im applinks:www.riot.im + webcredentials:riot.im com.apple.developer.siri diff --git a/Riot/Utils/EventFormatter.m b/Riot/Utils/EventFormatter.m index 1fa3e4aaae..b6130f1eb7 100644 --- a/Riot/Utils/EventFormatter.m +++ b/Riot/Utils/EventFormatter.m @@ -275,230 +275,6 @@ - (NSString*)senderAvatarUrlForEvent:(MXEvent*)event withRoomState:(MXRoomState* return senderAvatarUrl; } -#pragma mark - MXRoomSummaryUpdating - -- (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary withStateEvents:(NSArray *)stateEvents roomState:(MXRoomState *)roomState -{ - BOOL ret = [super session:session updateRoomSummary:summary withStateEvents:stateEvents roomState:roomState]; - - // Check whether the room display name and/or the room avatar url should be updated at Riot level. - BOOL refreshRiotRoomDisplayName = NO; - BOOL refreshRiotRoomAvatarURL = NO; - - for (MXEvent *event in stateEvents) - { - switch (event.eventType) - { - case MXEventTypeRoomName: - case MXEventTypeRoomAliases: - case MXEventTypeRoomCanonicalAlias: - { - refreshRiotRoomDisplayName = YES; - break; - } - case MXEventTypeRoomMember: - { - refreshRiotRoomDisplayName = YES; - // Do not break here to check avatar url too. - } - case MXEventTypeRoomAvatar: - { - refreshRiotRoomAvatarURL = YES; - break; - } - default: - break; - } - - if (refreshRiotRoomDisplayName && refreshRiotRoomAvatarURL) - { - break; - } - } - - if (refreshRiotRoomDisplayName) - { - NSString *riotRoomDisplayName = [self riotRoomDisplayNameFromRoomState:roomState]; - - if (riotRoomDisplayName.length && ![summary.displayname isEqualToString:riotRoomDisplayName]) - { - summary.displayname = riotRoomDisplayName; - ret = YES; - } - } - if (refreshRiotRoomAvatarURL) - { - NSString *riotRoomAvatarURL = [self riotRoomAvatarURLFromRoomState:roomState]; - - if (riotRoomAvatarURL.length && ![summary.avatar isEqualToString:riotRoomAvatarURL]) - { - summary.avatar = riotRoomAvatarURL; - ret = YES; - } - } - - return ret; -} - -#pragma mark - Riot room display name - -- (NSString *)riotRoomDisplayNameFromRoomState:(MXRoomState *)roomState -{ - // this algo is the one defined in - // https://github.com/matrix-org/matrix-js-sdk/blob/develop/lib/models/room.js#L617 - // calculateRoomName(room, userId) - - // This display name is @"" for an "empty room" without display name (We name "empty room" a room in which the current user is the only active member). - - if (roomState.name.length > 0) - { - return roomState.name; - } - - NSString *alias = roomState.canonicalAlias; - - if (!alias) - { - // For rooms where canonical alias is not defined, we use the 1st alias as a workaround - NSArray *aliases = roomState.aliases; - - if (aliases.count) - { - alias = [aliases[0] copy]; - } - } - - // check if there is non empty alias. - if ([alias length] > 0) - { - return alias; - } - - NSString* myUserId = mxSession.myUser.userId; - - NSArray* members = roomState.members.members; - NSMutableArray* othersActiveMembers = [[NSMutableArray alloc] init]; - NSMutableArray* activeMembers = [[NSMutableArray alloc] init]; - - for(MXRoomMember* member in members) - { - if (member.membership != MXMembershipLeave) - { - if (![member.userId isEqualToString:myUserId]) - { - [othersActiveMembers addObject:member]; - } - - [activeMembers addObject:member]; - } - } - - // sort the members by their creation (oldest first) - othersActiveMembers = [[othersActiveMembers sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { - - uint64_t originServerTs1 = 0; - uint64_t originServerTs2 = 0; - - MXRoomMember* member1 = (MXRoomMember*)obj1; - MXRoomMember* member2 = (MXRoomMember*)obj2; - - if (member1.originalEvent) - { - originServerTs1 = member1.originalEvent.originServerTs; - } - - if (member2.originalEvent) - { - originServerTs2 = member2.originalEvent.originServerTs; - } - - if (originServerTs1 == originServerTs2) - { - return NSOrderedSame; - } - else - { - return originServerTs1 > originServerTs2 ? NSOrderedDescending : NSOrderedAscending; - } - }] mutableCopy]; - - - NSString* displayName = @""; - - if (othersActiveMembers.count == 0) - { - if (activeMembers.count == 1) - { - MXRoomMember* member = [activeMembers objectAtIndex:0]; - - if (member.membership == MXMembershipInvite) - { - if (member.originalEvent.sender) - { - // extract who invited us to the room - displayName = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_displayname_invite_from", @"Vector", nil), [roomState.members memberName:member.originalEvent.sender]]; - } - else - { - displayName = NSLocalizedStringFromTable(@"room_displayname_room_invite", @"Vector", nil); - } - } - } - } - else if (othersActiveMembers.count == 1) - { - MXRoomMember* member = [othersActiveMembers objectAtIndex:0]; - - displayName = [roomState.members memberName:member.userId]; - } - else if (othersActiveMembers.count == 2) - { - MXRoomMember* member1 = [othersActiveMembers objectAtIndex:0]; - MXRoomMember* member2 = [othersActiveMembers objectAtIndex:1]; - - displayName = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_displayname_two_members", @"Vector", nil), [roomState.members memberName:member1.userId], [roomState.members memberName:member2.userId]]; - } - else - { - MXRoomMember* member = [othersActiveMembers objectAtIndex:0]; - displayName = [NSString stringWithFormat:NSLocalizedStringFromTable(@"room_displayname_more_than_two_members", @"Vector", nil), [roomState.members memberName:member.userId], othersActiveMembers.count - 1]; - } - - return displayName; -} - -#pragma mark - Riot room avatar url - -- (NSString *)riotRoomAvatarURLFromRoomState:(MXRoomState *)roomState -{ - NSString* roomAvatarUrl = roomState.avatar; - - if (!roomAvatarUrl) - { - // If the room has only two members, use the avatar of the second member. - if (roomState.membersCount.members == 2) - { - NSString* myUserId = mxSession.myUser.userId; - - NSArray* members = roomState.members.members; - for (MXRoomMember *roomMember in members) - { - if (![roomMember.userId isEqualToString:myUserId]) - { - // Use the avatar of this member only if he joined or he is invited. - if (MXMembershipJoin == roomMember.membership || MXMembershipInvite == roomMember.membership) - { - roomAvatarUrl = roomMember.avatarUrl; - } - break; - } - } - } - } - - return roomAvatarUrl; -} - #pragma mark - Timestamp formatting - (NSString*)dateStringFromDate:(NSDate *)date withTime:(BOOL)time diff --git a/Riot/Utils/Tools.h b/Riot/Utils/Tools.h index 434f782e15..3239f3e042 100644 --- a/Riot/Utils/Tools.h +++ b/Riot/Utils/Tools.h @@ -54,4 +54,15 @@ */ + (NSURL*)fixURLWithSeveralHashKeys:(NSURL*)url; +#pragma mark - String utilities + +/** + Change the alpha value of all text colors of an attibuted string. + + @param alpha the alpha value to apply. + @param attributedString the attributed string to update. + @return a new attributed string. + */ ++ (NSAttributedString *)setTextColorAlpha:(CGFloat)alpha inAttributedString:(NSAttributedString*)attributedString; + @end diff --git a/Riot/Utils/Tools.m b/Riot/Utils/Tools.m index 02837a6bcf..d0093a8ce1 100644 --- a/Riot/Utils/Tools.m +++ b/Riot/Utils/Tools.m @@ -117,4 +117,29 @@ + (NSURL *)fixURLWithSeveralHashKeys:(NSURL *)url return fixedURL; } +#pragma mark - String utilities + ++ (NSAttributedString *)setTextColorAlpha:(CGFloat)alpha inAttributedString:(NSAttributedString*)attributedString +{ + NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; + + // Check all attributes one by one + [string enumerateAttributesInRange:NSMakeRange(0, attributedString.length) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) + { + // Replace only colored texts + if (attrs[NSForegroundColorAttributeName]) + { + UIColor *color = attrs[NSForegroundColorAttributeName]; + color = [color colorWithAlphaComponent:0.2]; + + NSMutableDictionary *newAttrs = [NSMutableDictionary dictionaryWithDictionary:attrs]; + newAttrs[NSForegroundColorAttributeName] = color; + + [string setAttributes:newAttrs range:range]; + } + }]; + + return string; +} + @end diff --git a/RiotShareExtension/Managers/ShareExtensionManager.m b/RiotShareExtension/Managers/ShareExtensionManager.m index 7cae6fac41..541b5892d9 100644 --- a/RiotShareExtension/Managers/ShareExtensionManager.m +++ b/RiotShareExtension/Managers/ShareExtensionManager.m @@ -58,7 +58,7 @@ + (instancetype)sharedManager 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 @@ - (BOOL)areAttachmentsFullyLoaded #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; } } diff --git a/RiotShareExtension/Modules/Share/Listing/RoomsListViewController.m b/RiotShareExtension/Modules/Share/Listing/RoomsListViewController.m index 3f888bff0d..9c3f126d7a 100644 --- a/RiotShareExtension/Modules/Share/Listing/RoomsListViewController.m +++ b/RiotShareExtension/Modules/Share/Listing/RoomsListViewController.m @@ -129,7 +129,7 @@ - (void)showShareAlertForRoomPath:(NSIndexPath *)indexPath NSString *roomName = recentCellData.roomSummary.displayname; if (!roomName.length) { - roomName = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil); + roomName = [NSBundle mxk_localizedStringForKey:@"room_displayname_empty_room"]; } UIAlertController *alertController = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:NSLocalizedStringFromTable(@"send_to", @"Vector", nil), roomName] message:nil preferredStyle:UIAlertControllerStyleAlert]; diff --git a/RiotShareExtension/Modules/Share/Listing/Views/RecentRoomTableViewCell.m b/RiotShareExtension/Modules/Share/Listing/Views/RecentRoomTableViewCell.m index 121f32b0b7..4796cc841c 100644 --- a/RiotShareExtension/Modules/Share/Listing/Views/RecentRoomTableViewCell.m +++ b/RiotShareExtension/Modules/Share/Listing/Views/RecentRoomTableViewCell.m @@ -66,7 +66,7 @@ - (void)render:(MXKCellData *)cellData self.roomTitleLabel.text = roomCellData.roomSummary.displayname; if (!self.roomTitleLabel.text.length) { - self.roomTitleLabel.text = NSLocalizedStringFromTable(@"room_displayname_no_title", @"Vector", nil); + self.roomTitleLabel.text = [NSBundle mxk_localizedStringForKey:@"room_displayname_empty_room"]; } self.directRoomBorderView.hidden = !roomCellData.roomSummary.isDirect; diff --git a/RiotShareExtension/SupportingFiles/Info.plist b/RiotShareExtension/SupportingFiles/Info.plist index e0876d88c3..95e81ebb13 100644 --- a/RiotShareExtension/SupportingFiles/Info.plist +++ b/RiotShareExtension/SupportingFiles/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 0.7.0 + 0.7.7 CFBundleVersion - 0.7.0 + 0.7.7 NSExtension NSExtensionAttributes diff --git a/SiriIntents/Info.plist b/SiriIntents/Info.plist index fd88a42480..d44d66a1b5 100644 --- a/SiriIntents/Info.plist +++ b/SiriIntents/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 0.7.0 + 0.7.7 CFBundleVersion - 0.7.0 + 0.7.7 NSExtension NSExtensionAttributes diff --git a/Tchap/Modules/Application/Legacy/LegacyAppDelegate.m b/Tchap/Modules/Application/Legacy/LegacyAppDelegate.m index 8f2d44ce44..ac62dd107c 100644 --- a/Tchap/Modules/Application/Legacy/LegacyAppDelegate.m +++ b/Tchap/Modules/Application/Legacy/LegacyAppDelegate.m @@ -413,10 +413,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( { // Move this setting into the shared userDefaults object to apply it to the extensions. [sharedUserDefaults setObject:language forKey:@"appLanguage"]; - [sharedUserDefaults synchronize]; - + [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"appLanguage"]; - [[NSUserDefaults standardUserDefaults] synchronize]; } } [NSBundle mxk_setLanguage:language]; @@ -568,6 +566,18 @@ - (void)applicationDidBecomeActive:(UIApplication *)application } // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + + // Check if an initial sync failure occured while the app was in background + MXSession *mainSession = self.mxSessions.firstObject; + if (mainSession.state == MXSessionStateInitialSyncFailed) + { + // Inform the end user why the app appears blank + NSError *error = [NSError errorWithDomain:NSURLErrorDomain + code:NSURLErrorCannotConnectToHost + userInfo:@{NSLocalizedDescriptionKey : NSLocalizedStringFromTable(@"homeserver_connection_lost", @"Vector", nil)}]; + + [self showErrorAsAlert:error]; + } // Register to GDPR consent not given notification [self registerUserConsentNotGivenNotification]; @@ -2488,6 +2498,8 @@ - (void)logoutSendingRequestServer:(BOOL)sendLogoutServerRequest } // Note: Keep App settings + // But enforce usage of member lazy loading + [MXKAppSettings standardAppSettings].syncWithLazyLoadOfRoomMembers = YES; // Reset the contact manager [[MXKContactManager sharedManager] reset]; @@ -2736,7 +2748,15 @@ - (void)enableLocalNotificationsFromMatrixSession:(MXSession*)mxSession { return; } - + + // If the app is doing an initial sync, ignore all events from which we + // did not receive a notification from APNS/PushKit + if (!mxSession.isEventStreamInitialised && !self->incomingPushPayloads[event.eventId]) + { + NSLog(@"[AppDelegate][Push] enableLocalNotificationsFromMatrixSession: Initial sync in progress. Ignore event %@", event.eventId); + return; + } + // Sanity check if (event.eventId && event.roomId && rule) { @@ -2789,7 +2809,6 @@ - (void)checkDeviceId:(MXSession*)mxSession if (!isErrorNotificationSuspended && ![[NSUserDefaults standardUserDefaults] boolForKey:@"deviceIdAtStartupChecked"]) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"deviceIdAtStartupChecked"]; - [[NSUserDefaults standardUserDefaults] synchronize]; // Check if there is a device id if (!mxSession.matrixRestClient.credentials.deviceId) @@ -3793,20 +3812,17 @@ - (void)dismissGDPRConsent - (void)gdprConsentViewControllerDidConsentToGDPRWithSuccess:(GDPRConsentViewController *)gdprConsentViewController { MXSession *session = mxSessionArray.firstObject; - + + // Leave the GDPR consent right now + [self dismissGDPRConsent]; + + // And create the room with riot bot in // self.onBoardingManager = [[OnBoardingManager alloc] initWithSession:session]; MXWeakify(self); - MXWeakify(gdprConsentViewController); - - [gdprConsentViewController startActivityIndicator]; - void (^createRiotBotDMcompletion)(void) = ^() { - MXStrongifyAndReturnIfNil(self); - - [weakgdprConsentViewController stopActivityIndicator]; - [self dismissGDPRConsent]; + self.onBoardingManager = nil; }; diff --git a/Tchap/Modules/Avatar/AvatarImageViewModel.swift b/Tchap/Modules/Avatar/AvatarImageViewModel.swift index f579431ec6..115804ccb1 100644 --- a/Tchap/Modules/Avatar/AvatarImageViewModel.swift +++ b/Tchap/Modules/Avatar/AvatarImageViewModel.swift @@ -19,12 +19,28 @@ import Foundation @objcMembers final class AvatarImageViewModel: NSObject { - let thumbStringUrl: String? + let avatarContentURI: String? + let mediaManager: MXMediaManager? + let thumbnailSize: CGSize? + let thumbnailingMethod: MXThumbnailingMethod? let placeholderImage: UIImage let shape: AvatarImageShape - init(thumbStringUrl: String?, placeholderImage: UIImage, shape: AvatarImageShape) { - self.thumbStringUrl = thumbStringUrl + + init(avatarContentURI: String?, mediaManager: MXMediaManager?, placeholderImage: UIImage, shape: AvatarImageShape) { + self.avatarContentURI = avatarContentURI + self.mediaManager = mediaManager + self.thumbnailSize = nil + self.thumbnailingMethod = nil + self.placeholderImage = placeholderImage + self.shape = shape + } + + init(avatarContentURI: String?, mediaManager: MXMediaManager?, thumbnailSize: CGSize, thumbnailingMethod: MXThumbnailingMethod, placeholderImage: UIImage, shape: AvatarImageShape) { + self.avatarContentURI = avatarContentURI + self.mediaManager = mediaManager + self.thumbnailSize = thumbnailSize + self.thumbnailingMethod = thumbnailingMethod self.placeholderImage = placeholderImage self.shape = shape } diff --git a/Tchap/Modules/Room/CellData/RoomBubbleCellData.m b/Tchap/Modules/Room/CellData/RoomBubbleCellData.m index 23e434e318..55aa3051eb 100644 --- a/Tchap/Modules/Room/CellData/RoomBubbleCellData.m +++ b/Tchap/Modules/Room/CellData/RoomBubbleCellData.m @@ -19,6 +19,7 @@ #import "EventFormatter.h" #import "AvatarGenerator.h" +#import "Tools.h" static NSAttributedString *timestampVerticalWhitespace = nil; static NSAttributedString *readReceiptVerticalWhitespace = nil; @@ -194,12 +195,7 @@ - (NSAttributedString*)refreshAttributedTextMessage if (selectedComponentIndex != NSNotFound && selectedComponentIndex != index && componentString.length) { // Apply alpha to blur this component - NSMutableAttributedString *customComponentString = [[NSMutableAttributedString alloc] initWithAttributedString:componentString]; - UIColor *color = [componentString attribute:NSForegroundColorAttributeName atIndex:0 effectiveRange:nil]; - color = [color colorWithAlphaComponent:0.2]; - - [customComponentString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, customComponentString.length)]; - componentString = customComponentString; + componentString = [Tools setTextColorAlpha:.2 inAttributedString:componentString]; } // Check whether the timestamp is displayed for this component, and check whether a vertical whitespace is required @@ -238,12 +234,7 @@ - (NSAttributedString*)refreshAttributedTextMessage if (selectedComponentIndex != NSNotFound && selectedComponentIndex != index && componentString.length) { // Apply alpha to blur this component - NSMutableAttributedString *customComponentString = [[NSMutableAttributedString alloc] initWithAttributedString:componentString]; - UIColor *color = [componentString attribute:NSForegroundColorAttributeName atIndex:0 effectiveRange:nil]; - color = [color colorWithAlphaComponent:0.2]; - - [customComponentString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, customComponentString.length)]; - componentString = customComponentString; + componentString = [Tools setTextColorAlpha:.2 inAttributedString:componentString]; } // Check whether the timestamp is displayed diff --git a/Tchap/Modules/Room/DataSources/RoomDataSource.m b/Tchap/Modules/Room/DataSources/RoomDataSource.m index 7abcc6cb96..24a60e6fd4 100644 --- a/Tchap/Modules/Room/DataSources/RoomDataSource.m +++ b/Tchap/Modules/Room/DataSources/RoomDataSource.m @@ -69,6 +69,26 @@ - (instancetype)initWithRoomId:(NSString *)roomId andMatrixSession:(MXSession *) return self; } +- (void)finalizeInitialization +{ + [super finalizeInitialization]; + + // Sadly, we need to make sure we have fetched all room members from the HS + // to be able to display read receipts + if (![self.mxSession.store hasLoadedAllRoomMembersForRoom:self.roomId]) + { + [self.room members:^(MXRoomMembers *roomMembers) { + NSLog(@"[MXKRoomDataSource] finalizeRoomDataSource: All room members have been retrieved"); + + // Refresh the full table + [self.delegate dataSource:self didCellChange:nil]; + + } failure:^(NSError *error) { + NSLog(@"[MXKRoomDataSource] finalizeRoomDataSource: Cannot retrieve all room members"); + }]; + } +} + - (void)updateEventFormatter { // Set a new event formatter @@ -284,7 +304,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N 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; diff --git a/Tchap/Modules/Room/Members/Detail/RoomMemberDetailsViewController.m b/Tchap/Modules/Room/Members/Detail/RoomMemberDetailsViewController.m index e55e82170d..b644d2b4fd 100644 --- a/Tchap/Modules/Room/Members/Detail/RoomMemberDetailsViewController.m +++ b/Tchap/Modules/Room/Members/Detail/RoomMemberDetailsViewController.m @@ -900,16 +900,11 @@ - (void)handleTapGesture:(UITapGestureRecognizer*)tapGestureRecognizer [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]; diff --git a/Tchap/Modules/Room/ReadReceiptsDetail/ReadReceiptsViewController.m b/Tchap/Modules/Room/ReadReceiptsDetail/ReadReceiptsViewController.m index 28f0a10a5f..09ffafd0c5 100644 --- a/Tchap/Modules/Room/ReadReceiptsDetail/ReadReceiptsViewController.m +++ b/Tchap/Modules/Room/ReadReceiptsDetail/ReadReceiptsViewController.m @@ -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 @@ @interface ReadReceiptsViewController () *roomMembers; @@ -48,7 +48,6 @@ @implementation ReadReceiptsViewController + (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 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N 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) { diff --git a/Tchap/Modules/Room/RoomViewController.m b/Tchap/Modules/Room/RoomViewController.m index 65a7eb4712..a3cd979ad3 100644 --- a/Tchap/Modules/Room/RoomViewController.m +++ b/Tchap/Modules/Room/RoomViewController.m @@ -114,7 +114,7 @@ #import "GeneratedInterface-Swift.h" -@interface RoomViewController () +@interface RoomViewController () { // The preview header PreviewView *previewHeader; @@ -147,7 +147,10 @@ @interface RoomViewController () String? { - guard let avatarUrl = avatarUrl else { - return nil - } - return self.session.matrixRestClient.url(ofContentThumbnail: avatarUrl, toFitViewSize: self.avatarImageSize, with: MXThumbnailingMethodCrop) - } } diff --git a/Tchap/Modules/Settings/SettingsViewController.m b/Tchap/Modules/Settings/SettingsViewController.m index b6146daebf..de59cdf9f4 100644 --- a/Tchap/Modules/Settings/SettingsViewController.m +++ b/Tchap/Modules/Settings/SettingsViewController.m @@ -239,6 +239,7 @@ - (void)viewDidLoad [self.tableView registerClass:MXKTableViewCellWithLabelAndSwitch.class forCellReuseIdentifier:[MXKTableViewCellWithLabelAndSwitch defaultReuseIdentifier]]; [self.tableView registerClass:MXKTableViewCellWithLabelAndMXKImageView.class forCellReuseIdentifier:[MXKTableViewCellWithLabelAndMXKImageView defaultReuseIdentifier]]; [self.tableView registerClass:TableViewCellWithPhoneNumberTextField.class forCellReuseIdentifier:[TableViewCellWithPhoneNumberTextField defaultReuseIdentifier]]; + [self.tableView registerNib:MXKTableViewCellWithTextView.nib forCellReuseIdentifier:[MXKTableViewCellWithTextView defaultReuseIdentifier]]; // Enable self sizing cells self.tableView.rowHeight = UITableViewAutomaticDimension; @@ -1142,6 +1143,20 @@ - (MXKTableViewCell*)getDefaultTableViewCell:(UITableView*)tableView return cell; } +- (MXKTableViewCellWithTextView*)textViewCellForTableView:(UITableView*)tableView atIndexPath:(NSIndexPath *)indexPath +{ + MXKTableViewCellWithTextView *textViewCell = [tableView dequeueReusableCellWithIdentifier:[MXKTableViewCellWithTextView defaultReuseIdentifier] forIndexPath:indexPath]; + + textViewCell.mxkTextView.textColor = self.currentStyle.primaryTextColor; + textViewCell.mxkTextView.font = [UIFont systemFontOfSize:17]; + textViewCell.mxkTextView.backgroundColor = [UIColor clearColor]; + textViewCell.mxkTextViewLeadingConstraint.constant = tableView.separatorInset.left; + textViewCell.mxkTextViewTrailingConstraint.constant = tableView.separatorInset.right; + textViewCell.mxkTextView.accessibilityIdentifier = nil; + + return textViewCell; +} + - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger section = indexPath.section; @@ -1226,7 +1241,13 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N { 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 { @@ -1664,12 +1685,9 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N { if (row == CRYPTOGRAPHY_INFO_INDEX) { - MXKTableViewCell *cryptoCell = [self getDefaultTableViewCell:tableView]; - - cryptoCell.textLabel.attributedText = [self cryptographyInformation]; - cryptoCell.textLabel.numberOfLines = 0; + MXKTableViewCellWithTextView *cryptoCell = [self textViewCellForTableView:tableView atIndexPath:indexPath]; - cryptoCell.selectionStyle = UITableViewCellSelectionStyleNone; + cryptoCell.mxkTextView.attributedText = [self cryptographyInformation]; cell = cryptoCell; } @@ -3097,7 +3115,6 @@ - (void)languagePickerViewController:(MXKLanguagePickerViewController *)language // Store user settings NSUserDefaults *sharedUserDefaults = [MXKAppSettings standardAppSettings].sharedUserDefaults; [sharedUserDefaults setObject:language forKey:@"appLanguage"]; - [sharedUserDefaults synchronize]; // Do a reload in order to recompute strings in the new language // Note that "reloadMatrixSessions:NO" will reset room summaries diff --git a/Tchap/SupportingFiles/Tchap-Bridging-Header.h b/Tchap/SupportingFiles/Tchap-Bridging-Header.h index 0990bb925a..57fa9e8153 100644 --- a/Tchap/SupportingFiles/Tchap-Bridging-Header.h +++ b/Tchap/SupportingFiles/Tchap-Bridging-Header.h @@ -4,7 +4,6 @@ @import MatrixSDK; #import "WebViewViewController.h" -#import "MatrixSDK+Swift.h" #import "LegacyAppDelegate.h" #import "SegmentedViewController.h" #import "RoomsViewController.h" diff --git a/fastlane/.env.default b/fastlane/.env.default new file mode 100644 index 0000000000..7dd6de4b65 --- /dev/null +++ b/fastlane/.env.default @@ -0,0 +1,47 @@ +## Project configuration + +PROJECT_PATH=Riot.xcodeproj +SCHEME=Riot + +MAIN_TARGET=Riot +SHARE_EXTENSION_TARGET=RiotShareExtension +SIRI_INTENTS_EXTENSION_TARGET=SiriIntents + +MAIN_BUNDLE_ID=im.vector.app +SHARE_EXTENSION_BUNDLE_ID=im.vector.app.shareExtension +SIRI_INTENTS_EXTENSION_BUNDLE_ID=im.vector.app.SiriIntents + +## Build configuration + +DERIVED_DATA_PATH=build +IPA_NAME=Riot +ARCHIVE_PATH=out/Riot.xcarchive +BUILD_OUTPUT_DIRECTORY=out + +## Provisioning profiles files + +PROVISIONING_PROFILES_PATH=./provisioning_profiles/ + +MAIN_PROVISIONING_PROFILE_FILENAME=main.mobileprovision +SHARE_EXTENSION_PROVISIONING_PROFILE_FILENAME=share_extension.mobileprovision +SIRI_INTENTS_EXTENSION_PROVISIONING_PROFILE_FILENAME=siri_intents.mobileprovision + +## App Store code signing + +APPSTORE_CODESIGNING_IDENTITY="iPhone Distribution: Vector Creations Limited (7J4U792NQT)" +APPSTORE_SIGNING_CERTIFICATE="iPhone Distribution: Vector Creations Limited (7J4U792NQT)" + +APPSTORE_MAIN_PROVISIONING_PROFILE_SPECIFIER="Vector App Store" +APPSTORE_SHARE_EXTENSION_PROVISIONING_PROFILE_SPECIFIER="Vector Share Extension: App Store" +APPSTORE_SIRI_INTENTS_EXTENSION_PROVISIONING_PROFILE_SPECIFIER="Vector Siri Intents: App Store" + +## Ad-Hoc code signing + +ADHOC_MAIN_PROVISIONING_PROFILE_SPECIFIER="Vector Ad Hoc" +ADHOC_SHARE_EXTENSION_PROVISIONING_PROFILE_SPECIFIER="Vector Share Extension: Ad Hoc +ADHOC_SIRI_INTENTS_EXTENSION_PROVISIONING_PROFILE_SPECIFIER="Vector Siri Intents: Ad Hoc" + +## Account information + +TEAM_ID=7J4U792NQT +# APPLE_ID is set as shell environment variable on the machine running fastlane diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 0000000000..b0c0e24b39 --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1,5 @@ +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile + +apple_id ENV["APPLE_ID"] +team_id ENV["TEAM_ID"] \ No newline at end of file diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 0000000000..3a6d42ddc6 --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,236 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +fastlane_require 'dotenv' + +default_platform(:ios) +platform :ios do + + #### Pre #### + + before_all do + # Ensure used Xcode version + xcversion(version: "~> 9.4.1") + end + + #### Public #### + + desc "Builds an adhoc ipa" + lane :adhoc do |options| + + options[:adhoc] = true + build_release(options) + end + + desc "Builds (and upload) an ipa for the App Store" + lane :app_store do |options| + + build_release(options) + + # Upload ipa to TestFlight + #upload_to_testflight( + # skip_submission: true, # Only upload the build + # skip_waiting_for_build_processing: true # Don't wait for the build to process + #) + end + + #### Private #### + + desc "Download App Store or Ad-Hoc provisioning profiles" + private_lane :build_release do |options| + + UI.user_error!("'APPLE_ID' environment variable should be set to use this lane") unless !ENV["APPLE_ID"].to_s.empty? + + build_number = options[:build_number] + UI.user_error!("'build_number' parameter is missing") unless !build_number.to_s.empty? + + # ad-hoc or app-store? + adhoc = options.fetch(:adhoc, false) + + # Retrieve GIT branch name + git_branch_name = git_branch + UI.user_error!("Unable to retrieve GIT branch name") unless !git_branch_name.to_s.empty? + + # Fetch team id from Appfile + team_id = CredentialsManager::AppfileConfig.try_fetch_value(:team_id) + UI.user_error!("Fail to fetch team id from Appfile") unless !team_id.to_s.empty? + + # Generate versioning preprocessor macros + additional_preprocessor_definitions_hash = release_versioning_preprocessor_definitions(git_branch: git_branch_name, build_number: build_number) + additional_preprocessor_definitions = additional_preprocessor_definitions_hash.map { |k,v| "#{k}=\"#{v}\"" }.join(' ') + + # Generate xcodebuild additional arguments + xcargs_hash = { + 'GCC_PREPROCESSOR_DEFINITIONS' => "$(GCC_PREPROCESSOR_DEFINITIONS) #{additional_preprocessor_definitions}" + } + + xcargs = xcargs_hash.map { |k,v| "#{k}=#{v.shellescape}" }.join(' ') + + # Clear derived data + clear_derived_data(derived_data_path: ENV["DERIVED_DATA_PATH"]) + + # Setup project provisioning profiles + download_provisioning_profiles(adhoc: adhoc) + disable_automatic_code_signing + update_project_provisioning_profiles + + # Update build number + update_build_number(build_number: build_number) + + # Perform a pod install + cocoapods(repo_update: true) + + # Select a config + if adhoc + export_method = "ad-hoc" + main_provisioning_profile = ENV["ADHOC_MAIN_PROVISIONING_PROFILE_SPECIFIER"] + share_extension_provisioning_profile = ENV["ADHOC_SHARE_EXTENSION_PROVISIONING_PROFILE_SPECIFIER"] + siri_intents_provisioning_profile = ENV["ADHOC_SIRI_INTENTS_EXTENSION_PROVISIONING_PROFILE_SPECIFIER"] + else + export_method = "app-store" + main_provisioning_profile = ENV["APPSTORE_MAIN_PROVISIONING_PROFILE_SPECIFIER"] + share_extension_provisioning_profile = ENV["APPSTORE_SHARE_EXTENSION_PROVISIONING_PROFILE_SPECIFIER"] + siri_intents_provisioning_profile = ENV["APPSTORE_SIRI_INTENTS_EXTENSION_PROVISIONING_PROFILE_SPECIFIER"] + end + + # Build app and create ipa + build_app( + clean: true, + scheme: ENV["SCHEME"], + xcargs: xcargs, + export_method: export_method, + derived_data_path: ENV["DERIVED_DATA_PATH"], + archive_path: ENV["ARCHIVE_PATH"], + output_directory: ENV["BUILD_OUTPUT_DIRECTORY"], + output_name: "#{ENV['IPA_NAME']}.ipa", + codesigning_identity: ENV["APPSTORE_CODESIGNING_IDENTITY"], + export_options: { + method: export_method, + signingStyle: "manual", + teamID: team_id, + signingCertificate: ENV["APPSTORE_SIGNING_CERTIFICATE"], + provisioningProfiles: { + ENV["MAIN_BUNDLE_ID"] => main_provisioning_profile, + ENV["SHARE_EXTENSION_BUNDLE_ID"] => share_extension_provisioning_profile, + ENV["SIRI_INTENTS_EXTENSION_BUNDLE_ID"] => siri_intents_provisioning_profile + } + } + ) + end + + #### Private #### + + desc "Download App Store or Ad-Hoc provisioning profiles" + private_lane :download_provisioning_profiles do |options| + adhoc = options.fetch(:adhoc, false) + + output_path = ENV["PROVISIONING_PROFILES_PATH"] + skip_certificate_verification = true + + # Main application + get_provisioning_profile( + app_identifier: ENV["MAIN_BUNDLE_ID"], + adhoc: adhoc, + skip_certificate_verification: skip_certificate_verification, + output_path: output_path, + filename: ENV["MAIN_PROVISIONING_PROFILE_FILENAME"], + readonly: true + ) + # Share extension + get_provisioning_profile( + app_identifier: ENV["SHARE_EXTENSION_BUNDLE_ID"], + adhoc: adhoc, + skip_certificate_verification: skip_certificate_verification, + output_path: output_path, + filename: ENV["SHARE_EXTENSION_PROVISIONING_PROFILE_FILENAME"], + readonly: true + ) + # Siri Intents extension + get_provisioning_profile( + app_identifier: ENV["SIRI_INTENTS_EXTENSION_BUNDLE_ID"], + adhoc: adhoc, + skip_certificate_verification: skip_certificate_verification, + output_path: output_path, + filename: ENV["SIRI_INTENTS_EXTENSION_PROVISIONING_PROFILE_FILENAME"], + readonly: true + ) + end + + desc "Update provisioning profiles for each target" + private_lane :update_project_provisioning_profiles do + provisioning_profiles_path = ENV["PROVISIONING_PROFILES_PATH"] + build_configuration = 'Release' + xcodeproj = ENV["PROJECT_PATH"] + + # Main application + update_project_provisioning( + xcodeproj: xcodeproj, + profile: "#{provisioning_profiles_path}#{ENV["MAIN_PROVISIONING_PROFILE_FILENAME"]}", + target_filter: ENV["MAIN_TARGET"], + build_configuration: build_configuration + ) + # Share extension + update_project_provisioning( + xcodeproj: xcodeproj, + profile: "#{provisioning_profiles_path}#{ENV["SHARE_EXTENSION_PROVISIONING_PROFILE_FILENAME"]}", + target_filter: ENV["SHARE_EXTENSION_TARGET"], + build_configuration: build_configuration + ) + # Siri Intents extension + update_project_provisioning( + xcodeproj: xcodeproj, + profile: "#{provisioning_profiles_path}#{ENV["SIRI_INTENTS_EXTENSION_PROVISIONING_PROFILE_FILENAME"]}", + target_filter: ENV["SIRI_INTENTS_EXTENSION_TARGET"], + build_configuration: build_configuration + ) + end + + desc "Update application build number for all targets" + private_lane :update_build_number do |options| + build_number = options[:build_number] + + # Main application + increment_build_number_in_plist( + build_number: build_number, + target: ENV["MAIN_TARGET"] + ) + # Share extension + increment_build_number_in_plist( + build_number: build_number, + target: ENV["SHARE_EXTENSION_TARGET"] + ) + # Siri Intents extension + increment_build_number_in_plist( + build_number: build_number, + target: ENV["SIRI_INTENTS_EXTENSION_TARGET"] + ) + end + + desc "Returns version identifiers hash to inject in GCC_PREPROCESSOR_DEFINITIONS for release builds" + private_lane :release_versioning_preprocessor_definitions do |options| + preprocessor_definitions = Hash.new + + git_branch_name = options[:git_branch] + build_number = options[:build_number] + + if !git_branch_name.to_s.empty? + preprocessor_definitions["GIT_BRANCH"] = git_branch_name.sub("origin/", "") + end + + if !build_number.to_s.empty? + preprocessor_definitions["BUILD_NUMBER"] = build_number + end + + preprocessor_definitions + end + +end diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile new file mode 100644 index 0000000000..87578f80af --- /dev/null +++ b/fastlane/Pluginfile @@ -0,0 +1,5 @@ +# Autogenerated by fastlane +# +# Ensure this file is checked in to source control! + +gem 'fastlane-plugin-versioning'