mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-05-08 00:47:41 +02:00
Merge pull request #6795 from vector-im/release/1.9.8/release
Release 1.9.8
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
--swiftversion 5.6
|
||||
|
||||
--exclude build, CommonKit, Config, DesignKit, fastlane, Pods, Riot, RiotNSE, RiotShareExtension, RiotTests, SiriIntents, Tools, Variants, vendor
|
||||
|
||||
--disable wrapMultiLineStatementBraces
|
||||
--disable hoistPatternLet
|
||||
|
||||
--commas inline
|
||||
--ifdef no-indent
|
||||
--nospaceoperators ...,..<
|
||||
--stripunusedargs closure-only
|
||||
--trimwhitespace nonblank-lines
|
||||
--wrapparameters after-first
|
||||
--redundanttype inferred
|
||||
--emptybraces spaced
|
||||
+35
@@ -1,3 +1,38 @@
|
||||
## Changes in 1.9.8 (2022-10-04)
|
||||
|
||||
🙌 Improvements
|
||||
|
||||
- UserSessions: Extended device information (PSG-772). ([#6766](https://github.com/vector-im/element-ios/pull/6766))
|
||||
- Settings: Add labs flags for new session manager (PSG-792, PSG-799). ([#6780](https://github.com/vector-im/element-ios/pull/6780))
|
||||
- User session details: Include browser version for web sessions (PSG-761). ([#6788](https://github.com/vector-im/element-ios/pull/6788))
|
||||
- Upgrade MatrixSDK version ([v0.24.0](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.24.0)).
|
||||
- Include concrete device model in user agent (PSG-754) ([#6742](https://github.com/vector-im/element-ios/issues/6742))
|
||||
- CryptoV2: Manual device verification ([#6781](https://github.com/vector-im/element-ios/issues/6781))
|
||||
- User sessions: Add support for MSC3881 ([#6787](https://github.com/vector-im/element-ios/issues/6787))
|
||||
|
||||
🐛 Bugfixes
|
||||
|
||||
- Voiceover: Add labels to User Menu and My Spaces buttons on the All Chats view. ([#6580](https://github.com/vector-im/element-ios/issues/6580))
|
||||
- Media: Avoid redundant reloads on media viewer. ([#6717](https://github.com/vector-im/element-ios/issues/6717))
|
||||
- Pass country code into MSISDN requests ([#6723](https://github.com/vector-im/element-ios/issues/6723))
|
||||
- Fix render of links with both characters requiring percent encoding and markdown-like syntax ([#6748](https://github.com/vector-im/element-ios/issues/6748))
|
||||
- Fix crash when scrolling chat list ([#6749](https://github.com/vector-im/element-ios/issues/6749))
|
||||
- App Layout: Unable to send message after filtering for room ([#6755](https://github.com/vector-im/element-ios/issues/6755))
|
||||
- App Layout: Fix missing toolbar for users with no rooms. ([#6796](https://github.com/vector-im/element-ios/pull/6796))
|
||||
- Fix code block background colour ([#6778](https://github.com/vector-im/element-ios/issues/6778))
|
||||
- Fix navigation bars visibility on iOS 16. ([#6799](https://github.com/vector-im/element-ios/pull/6799))
|
||||
|
||||
🧱 Build
|
||||
|
||||
- Fix crash when scrolling chat list ([#6757](https://github.com/vector-im/element-ios/pull/6757))
|
||||
|
||||
🚧 In development 🚧
|
||||
|
||||
- Device manager: User session details screen. ([#6693](https://github.com/vector-im/element-ios/issues/6693))
|
||||
- Device manager: Session overview screen. ([#6753](https://github.com/vector-im/element-ios/issues/6753))
|
||||
- Device Manager: Link current session to session overview. ([#6770](https://github.com/vector-im/element-ios/issues/6770))
|
||||
|
||||
|
||||
## Changes in 1.9.7 (2022-09-28)
|
||||
|
||||
🙌 Improvements
|
||||
|
||||
@@ -15,5 +15,5 @@
|
||||
//
|
||||
|
||||
// Version
|
||||
MARKETING_VERSION = 1.9.7
|
||||
CURRENT_PROJECT_VERSION = 1.9.7
|
||||
MARKETING_VERSION = 1.9.8
|
||||
CURRENT_PROJECT_VERSION = 1.9.8
|
||||
|
||||
@@ -420,8 +420,4 @@ final class BuildSettings: NSObject {
|
||||
|
||||
// MARK: - New App Layout
|
||||
static let newAppLayoutEnabled = true
|
||||
|
||||
// MARK: - Device manager
|
||||
|
||||
static let deviceManagerEnabled = false
|
||||
}
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
import Foundation
|
||||
import MatrixSDK
|
||||
|
||||
#if !os(OSX)
|
||||
import DeviceKit
|
||||
#endif
|
||||
|
||||
/// CommonConfiguration is the central point to setup settings for MatrixSDK, MatrixKit and common configurations for all targets.
|
||||
class CommonConfiguration: NSObject, Configurable {
|
||||
|
||||
@@ -66,8 +70,13 @@ class CommonConfiguration: NSObject, Configurable {
|
||||
// Disable identicon use
|
||||
sdkOptions.disableIdenticonUseForUserAvatar = true
|
||||
|
||||
// Set up user agent
|
||||
if let userAgent = makeASCIIUserAgent() {
|
||||
sdkOptions.httpAdditionalHeaders = ["User-Agent": userAgent]
|
||||
}
|
||||
|
||||
// Pass httpAdditionalHeaders to the SDK
|
||||
sdkOptions.httpAdditionalHeaders = BuildSettings.httpAdditionalHeaders
|
||||
sdkOptions.httpAdditionalHeaders = (sdkOptions.httpAdditionalHeaders ?? [:]).merging(BuildSettings.httpAdditionalHeaders, uniquingKeysWith: { _, value in value })
|
||||
|
||||
// Disable key backup on common
|
||||
sdkOptions.enableKeyBackupWhenStartingMXCrypto = false
|
||||
@@ -80,6 +89,61 @@ class CommonConfiguration: NSObject, Configurable {
|
||||
sdkOptions.authEnableRefreshTokens = BuildSettings.authEnableRefreshTokens
|
||||
// Configure key provider delegate
|
||||
MXKeyProvider.sharedInstance().delegate = EncryptionKeyManager.shared
|
||||
|
||||
sdkOptions.enableNewClientInformationFeature = RiotSettings.shared.enableClientInformationFeature
|
||||
}
|
||||
|
||||
private func makeASCIIUserAgent() -> String? {
|
||||
guard var userAgent = makeUserAgent() else {
|
||||
return nil
|
||||
}
|
||||
if !userAgent.canBeConverted(to: .ascii) {
|
||||
let mutableUserAgent = NSMutableString(string: userAgent)
|
||||
if CFStringTransform(mutableUserAgent, nil, "Any-Latin; Latin-ASCII; [:^ASCII:] Remove" as CFString, false) {
|
||||
userAgent = mutableUserAgent as String
|
||||
}
|
||||
}
|
||||
return userAgent
|
||||
}
|
||||
|
||||
private func makeUserAgent() -> String? {
|
||||
let appInfo = AppInfo.current
|
||||
let clientName = appInfo.displayName
|
||||
let clientVersion = appInfo.appVersion?.bundleShortVersion ?? "unknown"
|
||||
|
||||
#if os(iOS)
|
||||
return String(
|
||||
format: "%@/%@ (%@; iOS %@; Scale/%0.2f)",
|
||||
clientName,
|
||||
clientVersion,
|
||||
Device.current.safeDescription,
|
||||
UIDevice.current.systemVersion,
|
||||
UIScreen.main.scale)
|
||||
#elseif os(tvOS)
|
||||
return String(
|
||||
format: "%@/%@ (%@; tvOS %@; Scale/%0.2f)",
|
||||
clientName,
|
||||
clientVersion,
|
||||
Device.current.safeDescription,
|
||||
UIDevice.current.systemVersion,
|
||||
UIScreen.main.scale)
|
||||
#elseif os(watchOS)
|
||||
return String(
|
||||
format: "%@/%@ (%@; watchOS %@; Scale/%0.2f)",
|
||||
clientName,
|
||||
clientVersion,
|
||||
Device.current.safeDescription,
|
||||
WKInterfaceDevice.current.systemVersion,
|
||||
WKInterfaceDevice.currentDevice.screenScale)
|
||||
#elseif os(OSX)
|
||||
return String(
|
||||
format: "%@/%@ (Mac; Mac OS X %@)",
|
||||
clientName,
|
||||
clientVersion,
|
||||
NSProcessInfo.processInfo.operatingSystemVersionString)
|
||||
#else
|
||||
return nil
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ use_frameworks!
|
||||
# - `{ :specHash => {sdk spec hash}` to depend on specific pod options (:git => …, :podspec => …) for MatrixSDK repo. Used by Fastfile during CI
|
||||
#
|
||||
# Warning: our internal tooling depends on the name of this variable name, so be sure not to change it
|
||||
$matrixSDKVersion = '= 0.23.19'
|
||||
$matrixSDKVersion = '= 0.24.0'
|
||||
# $matrixSDKVersion = :local
|
||||
# $matrixSDKVersion = { :branch => 'develop'}
|
||||
# $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } }
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
{
|
||||
"pins" : [
|
||||
{
|
||||
"identity" : "devicekit",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/devicekit/DeviceKit",
|
||||
"state" : {
|
||||
"revision" : "20e0991f3975916ab0f6d58db84d8bc64f883537",
|
||||
"version" : "4.7.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "maplibre-gl-native-distribution",
|
||||
"kind" : "remoteSourceControl",
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "user_sessions_inactive.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
Riot/Assets/Images.xcassets/DeviceManager/user_sessions_inactive.imageset/user_sessions_inactive.svg
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="32" height="32" rx="8" fill="#F4F6FA"/>
|
||||
<g clip-path="url(#clip0_1002_97918)">
|
||||
<path d="M13.3333 9.33301C12.6 9.33301 12 9.93301 12 10.6663L12.0067 12.7863C12.0067 13.1397 12.1467 13.473 12.3933 13.7263L14.6667 15.9997L12.3933 18.2863C12.1467 18.533 12.0067 18.873 12.0067 19.2263L12 21.333C12 22.0663 12.6 22.6663 13.3333 22.6663H18.6667C19.4 22.6663 20 22.0663 20 21.333V19.2263C20 18.873 19.86 18.533 19.6133 18.2863L17.3333 15.9997L19.6067 13.733C19.86 13.4797 20 13.1397 20 12.7863V10.6663C20 9.93301 19.4 9.33301 18.6667 9.33301H13.3333ZM18.6667 19.273V20.6663C18.6667 21.033 18.3667 21.333 18 21.333H14C13.6333 21.333 13.3333 21.033 13.3333 20.6663V19.273C13.3333 19.093 13.4067 18.9263 13.5267 18.7997L16 16.333L18.4733 18.8063C18.5933 18.9263 18.6667 19.0997 18.6667 19.273Z" fill="#737D8C"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_1002_97918">
|
||||
<rect width="16" height="16" fill="white" transform="translate(8 8)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
+12
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "user_sessions_unverified.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="32" height="32" rx="8" fill="#FF5B55" fill-opacity="0.06"/>
|
||||
<path d="M9 16.27V10.05L16 8L23 10.05V16.27C23 22.63 16 24 16 24C16 24 9 22.63 9 16.27Z" fill="#FF4B55"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.235 13.3814C15.1975 12.9539 15.5125 12.5789 15.94 12.5489C16.36 12.5189 16.735 12.8339 16.78 13.2614V13.3814L16.54 16.3814C16.5175 16.6589 16.285 16.8689 16.0075 16.8689H15.9625C15.7 16.8464 15.4975 16.6439 15.475 16.3814L15.235 13.3814ZM16.659 18.3381C16.659 18.7026 16.3635 18.9981 15.999 18.9981C15.6345 18.9981 15.339 18.7026 15.339 18.3381C15.339 17.9736 15.6345 17.6781 15.999 17.6781C16.3635 17.6781 16.659 17.9736 16.659 18.3381Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 789 B |
@@ -64,16 +64,16 @@
|
||||
"auth_reset_password_next_step_button" = "Ich habe meine E-Mail-Adresse verifiziert";
|
||||
"auth_reset_password_email_validation_message" = "Eine E-Mail wurde an %@ gesendet. Wenn du dem Link dort gefolgt bist, klicke unten.";
|
||||
// Chat creation
|
||||
"room_creation_title" = "Neuer Chat";
|
||||
"room_creation_title" = "Neue Unterhaltung";
|
||||
"room_creation_account" = "Konto";
|
||||
"room_creation_appearance" = "Aussehen";
|
||||
"room_creation_appearance_name" = "Name";
|
||||
"room_creation_appearance_picture" = "Avatar (optional)";
|
||||
"room_creation_privacy" = "Datenschutz";
|
||||
"room_creation_private_room" = "Dieser Chat ist privat";
|
||||
"room_creation_public_room" = "Dieser Chat ist öffentlich";
|
||||
"room_creation_private_room" = "Diese Unterhaltung ist privat";
|
||||
"room_creation_public_room" = "Diese Unterhaltung ist öffentlich";
|
||||
"room_creation_make_public" = "Mache öffentlich";
|
||||
"room_creation_make_public_prompt_title" = "Diesen Chat öffentlich machen?";
|
||||
"room_creation_make_public_prompt_title" = "Diese Unterhaltung öffentlich machen?";
|
||||
"room_creation_keep_private" = "Privat lassen";
|
||||
"room_creation_make_private" = "Mache privat";
|
||||
"room_creation_wait_for_creation" = "Es wird gerade schon ein Raum erstellt. Bitte warten.";
|
||||
@@ -85,7 +85,7 @@
|
||||
"room_recents_no_conversation" = "Keine Räume";
|
||||
"room_recents_low_priority_section" = "NIEDRIGE PRIORITÄT";
|
||||
"room_recents_invites_section" = "EINLADUNGEN";
|
||||
"room_recents_start_chat_with" = "Starte Chat";
|
||||
"room_recents_start_chat_with" = "Unterhaltung beginnen";
|
||||
"room_recents_create_empty_room" = "Erstelle Raum";
|
||||
"room_recents_join_room" = "Tritt Raum bei";
|
||||
"room_recents_join_room_title" = "Trete einem Raum bei";
|
||||
@@ -121,9 +121,9 @@
|
||||
"room_participants_leave_prompt_title" = "Raum verlassen";
|
||||
"room_participants_leave_prompt_msg" = "Bist du sicher, dass du den Raum verlassen willst?";
|
||||
"room_participants_remove_prompt_title" = "Bestätigung";
|
||||
"room_participants_remove_prompt_msg" = "Bist du sicher, dass du %@ aus dem Chat entfernen möchtest?";
|
||||
"room_participants_remove_prompt_msg" = "Bist du sicher, dass du %@ aus der Unterhaltung entfernen möchtest?";
|
||||
"room_participants_invite_prompt_title" = "Bestätigung";
|
||||
"room_participants_invite_prompt_msg" = "Bist du sicher, dass du %@ in diesen Chat einladen möchtest?";
|
||||
"room_participants_invite_prompt_msg" = "Bist du sicher, dass du %@ in diese Unterhaltung einladen möchtest?";
|
||||
"room_participants_filter_room_members" = "Mitglieder filtern";
|
||||
"room_participants_invite_malformed_id_title" = "Fehler beim Einladen";
|
||||
"room_participants_invited_section" = "EINGELADEN";
|
||||
@@ -131,7 +131,7 @@
|
||||
"room_participants_offline" = "Offline";
|
||||
"room_participants_unknown" = "Unbekannt";
|
||||
"room_participants_now" = "jetzt";
|
||||
"room_participants_action_section_direct_chats" = "Direkte Chats";
|
||||
"room_participants_action_section_direct_chats" = "Direktnachrichten";
|
||||
"room_participants_action_section_devices" = "Sitzungen";
|
||||
"room_participants_action_section_other" = "Optionen";
|
||||
"room_participants_action_invite" = "Einladen";
|
||||
@@ -142,7 +142,7 @@
|
||||
"room_participants_action_unignore" = "Alle Nachrichten dieser Person zeigen";
|
||||
"room_participants_action_set_moderator" = "Moderationsrechte vergeben";
|
||||
"room_participants_action_set_admin" = "Administrationsrechte vergeben";
|
||||
"room_participants_action_start_new_chat" = "Starte neuen Chat";
|
||||
"room_participants_action_start_new_chat" = "Unterhaltung beginnen";
|
||||
"room_participants_action_start_video_call" = "Starte Video-Anruf";
|
||||
"room_participants_action_mention" = "Erwähnen";
|
||||
// Chat
|
||||
@@ -239,7 +239,7 @@
|
||||
"settings_new_password" = "Neues Passwort";
|
||||
"settings_confirm_password" = "Bestätige Passwort";
|
||||
"settings_password_updated" = "Das Passwort deines Matrix-Kontos wurde aktualisiert";
|
||||
"settings_crypto_device_name" = "Öffentlicher Sitzungs-Name: ";
|
||||
"settings_crypto_device_name" = "Sitzungsname: ";
|
||||
"settings_crypto_device_key" = "\nSitzungs-Schlüssel:\n";
|
||||
"settings_crypto_export" = "Schlüssel exportieren";
|
||||
"room_details_settings" = "Einstellungen";
|
||||
@@ -303,7 +303,7 @@
|
||||
"room_participants_action_start_voice_call" = "Starte Sprach-Anruf";
|
||||
"room_ongoing_conference_call" = "Laufender Konferenz-Anruf. Trete bei als %@ oder %@.";
|
||||
"room_event_action_redact" = "Entfernen";
|
||||
"room_warning_about_encryption" = "Ende-zu-Ende Verschlüsselung ist in Beta und ist evtl. nicht zuverlässig.\n\nMan sollte noch nicht darauf vertrauen, dass die Daten sicher sind.\n\nGeräte werden Nachrichten von vor dem Beitritt des Raumes nicht entschlüsseln können.\n\nVerschlüsselte Nachrichten sind nicht lesbar auf Clients, die die Verschlüsselung noch nicht implementiert haben.";
|
||||
"room_warning_about_encryption" = "Ende-zu-Ende-Verschlüsselung ist in Beta und ist evtl. nicht zuverlässig.\n\nMan sollte noch nicht darauf vertrauen, dass die Daten sicher sind.\n\nGeräte werden Nachrichten von vor dem Beitritt des Raumes nicht entschlüsseln können.\n\nVerschlüsselte Nachrichten sind nicht lesbar in Anwendungen, die die Verschlüsselung noch nicht implementiert haben.";
|
||||
"unknown_devices_alert" = "Dieser Raum enthält unbekannte Sitzungen, die nicht verifiziert wurden.\nDas bedeutet, es gibt keine Garantie, dass sie den angegebenen Benutzern gehört.\nWir empfehlen eine Überprüfung für jedes Gerät, bevor du weitermachst. Du kannst die Nachricht auch ohne Verifizierung erneut senden.";
|
||||
"room_preview_unlinked_email_warning" = "Diese Einladung wurde an %@ gesendet, welche diesem Konto nicht zugeordnet ist. Möglicherweise möchtest du dich mit einem anderen Konto anmelden oder diese E-Mail zu deinem Konto hinzufügen.";
|
||||
"room_preview_try_join_an_unknown_room" = "Du versuchst auf %@ zuzugreifen. Möchtest du dem Raum beitreten um teilzunehmen?";
|
||||
@@ -313,12 +313,12 @@
|
||||
"settings_phone_number" = "Telefon";
|
||||
"settings_add_phone_number" = "Telefonnummer hinzufügen";
|
||||
"settings_fail_to_update_profile" = "Profilaktualisierung fehlgeschlagen";
|
||||
"settings_global_settings_info" = "Globale Benachrichtigungseinstellungen sind auf deinem %@ web-Client verfügbar";
|
||||
"settings_global_settings_info" = "Globale Benachrichtigungseinstellungen sind in deiner %@ Web-Anwendung verfügbar";
|
||||
"settings_pin_rooms_with_missed_notif" = "Pinnen von Räumen mit verpassten Benachrichtigungen";
|
||||
"settings_pin_rooms_with_unread" = "Pinnen von Räumen mit ungelesenen Nachrichten";
|
||||
"settings_contacts_discover_matrix_users" = "Entdecke andere Benutzer mittels E-Mail-Adressen oder Telefonnummern";
|
||||
"settings_labs_e2e_encryption_prompt_message" = "Zum Fertigstellen der Verschlüsselung bitte neu anmelden.";
|
||||
"settings_third_party_notices" = "Anmerkungen von Dritten";
|
||||
"settings_third_party_notices" = "Drittanbieter-Lizenzen";
|
||||
"settings_clear_cache" = "Cache löschen";
|
||||
"settings_fail_to_update_password" = "Passwortänderung des Matrix-Kontos fehlgeschlagen";
|
||||
"settings_crypto_device_id" = "\nSitzungs-ID: ";
|
||||
@@ -391,7 +391,7 @@
|
||||
"bug_report_description" = "Beschreibe den Fehler. Was hast du gemacht? Was hast du erwartet? Was ist tatsächlich passiert?";
|
||||
"bug_crash_report_title" = "Absturzmeldung";
|
||||
"bug_crash_report_description" = "Bitte beschreibe was du vor dem Absturz gemacht hast:";
|
||||
"bug_report_logs_description" = "Um Probleme analysieren zu können werden Protokolldateien dieses Clients mit dem Fehlerbericht gesendet. Wenn du nur den Text oben senden willst, bitte abwählen:";
|
||||
"bug_report_logs_description" = "Um Probleme analysieren zu können, werden Protokolldateien dieser Anwendung mit dem Fehlerbericht gesendet. Wenn du nur den Text oben senden willst, bitte abwählen:";
|
||||
"bug_report_send_logs" = "Sende Protokolldateien";
|
||||
"bug_report_send_screenshot" = "Sende Bildschirmfoto";
|
||||
"bug_report_progress_zipping" = "Sammele Protokolle";
|
||||
@@ -427,7 +427,7 @@
|
||||
"send_to" = "Sende an %@";
|
||||
"sending" = "Senden";
|
||||
"room_event_failed_to_send" = "Senden fehlgeschlagen";
|
||||
"room_details_direct_chat" = "Direkter Chat";
|
||||
"room_details_direct_chat" = "Direktnachrichten";
|
||||
"room_details_fail_to_update_room_direct" = "Setzen der Direktkennzeichnung in diesem Raum fehlgeschlagen";
|
||||
"event_formatter_widget_added" = "Widget %@ wurde von %@ hinzugefügt";
|
||||
"event_formatter_widget_removed" = "Widget %@ wurde von %@ entfernt";
|
||||
@@ -610,14 +610,14 @@
|
||||
"key_backup_recover_invalid_passphrase" = "Sicherung konnte mit dieser Phrase nicht entschlüsselt werden: Bitte stelle sicher, dass du die richtige Sicherungsphrase eingegeben hast.";
|
||||
"key_backup_recover_invalid_recovery_key_title" = "Ungültiger Sicherungsschlüssel";
|
||||
"key_backup_recover_invalid_recovery_key" = "Sicherung konnte mit diesem Schlüssel nicht entschlüsselt werden: Bitte stelle sicher, dass du den richtigen Sicherungsschlüssel eingegeben hast.";
|
||||
"key_backup_recover_from_passphrase_info" = "Nutze deine Sicherungsphrase um deinen sicheren Chatverlauf zu entschlüsseln";
|
||||
"key_backup_recover_from_passphrase_info" = "Nutze deine Sicherungsphrase, um deinen sicheren Nachrichtenverlauf zu entschlüsseln";
|
||||
"key_backup_recover_from_passphrase_passphrase_title" = "Eingeben";
|
||||
"key_backup_recover_from_passphrase_passphrase_placeholder" = "Phrase eingeben";
|
||||
"key_backup_recover_from_passphrase_recover_action" = "Historie entschlüsseln";
|
||||
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Kennst deine Sicherungsphrase nicht? Du kannst ";
|
||||
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "deinen Sicherungsschlüssel nutzen";
|
||||
"key_backup_recover_from_passphrase_lost_passphrase_action_part3" = ".";
|
||||
"key_backup_recover_from_recovery_key_info" = "Nutze deinen Sicherungsschlüssel, um deine Chatverläufe zu entschlüsseln";
|
||||
"key_backup_recover_from_recovery_key_info" = "Nutze deinen Sicherungsschlüssel, um deinen Nachrichtenverlauf zu entschlüsseln";
|
||||
"key_backup_recover_from_recovery_key_recovery_key_title" = "Eingeben";
|
||||
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Sicherungsschlüssel eingeben";
|
||||
"key_backup_recover_from_recovery_key_recover_action" = "Verlauf entschlüsseln";
|
||||
@@ -649,7 +649,7 @@
|
||||
"key_backup_setup_intro_manual_export_action" = "Manueller Schlüssel-Export";
|
||||
// String for App Store
|
||||
"store_short_description" = "Sicherer, dezentralisierter Chat/VoIP";
|
||||
"store_full_description" = "Element ist die neue Art von Messenger- und Kooperations-App, die:\n\n1. dir die Kontrolle gibt deine Privatsphäre zu schützen,\n2. dir die Kommunikation mit anderen Personen im Matrix-Netzwerk und darüber hinaus Integration in Apps wie Slack ermöglicht,\n3. dich vor Werbung, Datenerfassung, Hintertüren und geschlossene Plattformen schützt,\n4. dich durch End-to-End-Verschlüsselung absichert und mit Quersignaturen andere überprüft.\n\nElement unterscheidet sich grundlegend von anderen Messaging- und Kooperations-Diensten, da es dezentralisiert und open-source ist.\n\nMit Element kannst du dich selbst hosten oder einen Host auswählen, sodass du Datenschutz, Eigentum und Kontrolle über deine Daten und Konversationen hast. Du erhältst Zugriff auf ein offenes Netzwerk und bist nicht auf Element-Nutzer beschränkt. Und es ist sehr sicher.\n\nElement ist in der Lage, all dies zu tun, da es mit Matrix arbeitet - dem Standard für offene, dezentrale Kommunikation.\n\nMit Element hast du die Kontrolle, indem du auswählen kannst, wer deine Konversationen hostet. In der Element-App kannst du verschiedene Hosts auswählen:\n\n1. Hole dir ein kostenloses Konto auf dem öffentlichen Server von matrix.org\n2. Hoste dein Konto selbst, indem du einen Server auf deiner eigenen Hardware ausführst\n3. Melde dich für ein Konto auf einem benutzerdefinierten Server an, indem du einfach die Hosting-Plattform von Element Matrix Services abonnierst\n\nWarum Element?\n\nBESITZE DEINE DATEN: Du entscheidest, wo deine Daten und Nachrichten aufbewahrt werden sollen. Du besitzt und kontrollierst sie, nicht irgendein MEGAKONZERN, die deine Daten verwertet oder Dritten Zugriff gewährt.\n\nOPEN MESSAGING UND ZUSAMMENARBEIT: Du kannst mit allen anderen Mitgliedern des Matrix-Netzwerks chatten, unabhängig davon, ob sie Element oder eine andere Matrix-App verwenden, sogar selbst wenn sie ein anderes Messaging-System wie Slack, IRC oder XMPP verwenden.\n\nSUPERSICHER: Echte End-to-End-Verschlüsselung (nur diejenigen in der Konversation können Nachrichten entschlüsseln) und Quersignierung, um die Geräte der Konversationsteilnehmer zu überprüfen.\n\nVOLLSTÄNDIGE KOMMUNIKATION: Messaging, Sprach- und Videoanrufe, Dateifreigabe, Bildschirmfreigabe und eine ganze Reihe von Integrationen, Bots und Widgets. Baue Räume, Gemeinschaften, bleib in Kontakt und erledige Dinge.\n\nÜBERALL, WO DU BIST: Bleibe mit dem vollständig synchronisierten Nachrichtenverlauf auf all deinen Geräten und im Internet (unter https://element.io/app) unabhängig voneinander in Kontakt.";
|
||||
"store_full_description" = "Element ist die neue Art von Kommunikations- und Kooperations-App, die:\n\n1. dir die Kontrolle gibt, deine Privatsphäre zu schützen\n2. dir die Kommunikation mit anderen Personen im Matrix-Netzwerk und darüber hinaus Integration in Apps wie Slack ermöglicht\n3. dich vor Werbung, Datenerfassung, Hintertüren und geschlossene Plattformen schützt\n4. dich durch Ende-zu-Ende-Verschlüsselung absichert und mit Quersignaturen andere überprüft\n\nElement unterscheidet sich grundlegend von anderen Kommunikations- und Kooperations-Diensten, da es dezentralisiert und Open-Source ist.\n\nElement lässt dir die Wahl, ob du einen eigenen Server betreibst oder einen bestehenden wählst, sodass du Datenschutz, Eigentum und Kontrolle über deine Daten und Konversationen hast. Du erhältst Zugriff auf ein offenes Netzwerk und bist nicht auf Element-Nutzer beschränkt. Und es ist sehr sicher.\n\nElement ist in der Lage, all dies zu tun, da es mit Matrix arbeitet – dem Standard für offene, dezentrale Kommunikation.\n\nMit Element hast du die Kontrolle, indem du auswählen kannst, bei wem deine Unterhaltungen liegen. In der Element-App kannst du verschiedene Betreiber auswählen:\n\n1. Hole dir ein kostenloses Konto auf dem öffentlichen Server von matrix.org\n2. Beherberge dein Konto selbst, indem du einen Server auf deiner eigenen Hardware betreibst\n3. Registriere ein Konto auf einem maßgeschneiderten Server, indem du einfach die Element-Matrix-Services abonnierst\n\nWarum Element?\n\nBESITZE DEINE DATEN: Du entscheidest, wo deine Daten und Nachrichten aufbewahrt werden sollen. Du besitzt und kontrollierst sie, nicht irgendein MEGAKONZERN, der deine Daten verwertet oder dritten Zugriff gewährt.\n\nOFFENE KOMMUNIKATION UND ZUSAMMENARBEIT: Du kannst mit allen anderen Mitgliedern des Matrix-Netzwerks schreiben, unabhängig davon, ob sie Element oder eine andere Matrix-App verwenden, selbst wenn sie eine andere Plattform wie beispielsweise Slack, IRC oder XMPP verwenden.\n\nSUPER SICHER: Echte Ende-zu-Ende-Verschlüsselung (nur diejenigen in der Konversation können Nachrichten entschlüsseln) und Quersignierung, um die Geräte der Konversationsteilnehmer zu überprüfen.\n\nVOLLSTÄNDIGE KOMMUNIKATION: Schreiben, Sprach- und Videoanrufe, Dateifreigabe, Bildschirmfreigabe und eine ganze Reihe von Integrationen, Bots und Widgets. Erschaffe Räume, Gemeinschaften, bleib in Kontakt und erledige Dinge.\n\nÜBERALL, WO DU BIST: Bleibe mit dem vollständig synchronisierten Nachrichtenverlauf auf all deinen Geräten und im Internet (unter https://element.io/app) unabhängig voneinander in Kontakt.";
|
||||
"auth_login_single_sign_on" = "Anmelden";
|
||||
"auth_autodiscover_invalid_response" = "Ungültige Antwort beim Entdecken des Heimservers";
|
||||
"room_message_unable_open_link_error_message" = "Konnte Link nicht öffnen.";
|
||||
@@ -751,7 +751,7 @@
|
||||
// MARK: Start
|
||||
"device_verification_start_title" = "Verifizieren durch Vergleichen eines kurzen Textes";
|
||||
"device_verification_start_wait_partner" = "Warten auf Annahme durch Partner…";
|
||||
"device_verification_start_use_legacy" = "Passiert nichts? Noch nicht alle Clients unterstützen die interaktive Verifizierung. Verwende die alte Verifizierungsmethode.";
|
||||
"device_verification_start_use_legacy" = "Passiert nichts? Noch nicht alle Anwendungen unterstützen die interaktive Verifizierung. Verwende die alte Verifizierungsmethode.";
|
||||
"device_verification_start_use_legacy_action" = "Verwende alte Verifizierungsmethode";
|
||||
// MARK: Verify
|
||||
"device_verification_verify_title_emoji" = "Überprüfe diese Sitzung indem du bestätigst, dass das folgende Emoji auf dem Bildschirm des Gegenüber angezeigt wird";
|
||||
@@ -797,7 +797,7 @@
|
||||
"photo_library_access_not_granted" = "%@ hat keine Berechtigung zum Zugriff auf die Fotobibliothek. Bitte ändere die Datenschutzeinstellungen";
|
||||
"auth_forgot_password_error_no_configured_identity_server" = "Es ist kein Identitätsserver konfiguriert: Füge einen hinzu, um das Kennwort deines Matrix-Kontos zurückzusetzen.";
|
||||
"room_creation_error_invite_user_by_email_without_identity_server" = "Es ist kein Identitätsserver konfiguriert, sodass du keine Teilnehmenden mit einer E-Mail hinzufügen kannst.";
|
||||
"room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Es ist kein Identitätsserver konfiguriert, sodass du keinen Chat mit einem Kontakt über eine E-Mail starten kannst.";
|
||||
"room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Da kein Identitätsserver konfiguriert wurde, kannst du keine Unterhaltung mittels E-Mail-Adresse beginnen.";
|
||||
// Service terms
|
||||
"service_terms_modal_title" = "Nutzungsbedingungen";
|
||||
"service_terms_modal_accept_button" = "Akzeptieren";
|
||||
@@ -1003,7 +1003,7 @@
|
||||
"security_settings_secure_backup_delete" = "Backup löschen";
|
||||
"security_settings_crosssigning_info_ok" = "Quersignierung ist bereit zur Anwendung.";
|
||||
"security_settings_crosssigning_reset" = "Zurücksetzen";
|
||||
"security_settings_coming_soon" = "Entschuldigung, diese Funktion ist noch nicht für %@ iOS verfügbar. Bitte nutze einen anderen Matrix-Client, um es einzurichten. %@ iOS wird es benutzen.";
|
||||
"security_settings_coming_soon" = "Entschuldigung, diese Funktion ist noch nicht für %@ iOS verfügbar. Bitte nutze eine andere Matrix-Anwendung, um es einzurichten. %@ iOS wird es benutzen.";
|
||||
"security_settings_user_password_description" = "Bestätige deine Identität durch Eingabe des Passworts deines Matrix-Kontos";
|
||||
// AuthenticatedSessionViewControllerFactory
|
||||
"authenticated_session_flow_not_supported" = "Diese App unterstützt nicht diese Authentifizierungsmethode für deinen Heimserver.";
|
||||
@@ -1051,7 +1051,7 @@
|
||||
"key_verification_self_verify_unverified_sessions_alert_message" = "Verifiziere alle deine Sitzungen, um sicher zu stellen, dass dein Konto und deine Nachrichten sicher sind.";
|
||||
"key_verification_self_verify_unverified_sessions_alert_validate_action" = "Überprüfung";
|
||||
"device_verification_self_verify_wait_new_sign_in_title" = "Diese Anmeldung verifizieren";
|
||||
"device_verification_self_verify_wait_additional_information" = "Dies funktioniert mit %@ oder einem anderen Matrix-Client, der Quersignierung unterstützt.";
|
||||
"device_verification_self_verify_wait_additional_information" = "Dies funktioniert mit %@ oder einer anderen Matrix-Anwendung, die Quersignierung unterstützt.";
|
||||
"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Sicherungsschlüssel verwenden";
|
||||
"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Sicherungsphrase oder -schlüssel verwenden";
|
||||
"device_verification_self_verify_wait_recover_secrets_additional_information" = "Falls du keinen Zugang zu einer existierenden Sitzung hast";
|
||||
@@ -1062,7 +1062,7 @@
|
||||
"key_verification_verify_sas_additional_information" = "Für ultimative Sicherheit verwende ein anderes vertrauenswürdiges Kommunikationsmittel oder mache es persönlich.";
|
||||
"key_verification_manually_verify_device_title" = "Verifiziere manuell mit einem Text";
|
||||
"key_verification_manually_verify_device_instruction" = "Vergleiche die folgenden Zeichen mit den Einstellungen in der Sitzung des anderen Nutzers und bestätige:";
|
||||
"key_verification_manually_verify_device_name_title" = "Name der Sitzung";
|
||||
"key_verification_manually_verify_device_name_title" = "Sitzungsname";
|
||||
"key_verification_manually_verify_device_id_title" = "Sitzungs-ID";
|
||||
"key_verification_manually_verify_device_key_title" = "Sitzungsschlüssel";
|
||||
"key_verification_manually_verify_device_additional_information" = "Falls sie nicht übereinstimmen, wurde die Kommunikation vielleicht kompromittiert.";
|
||||
@@ -1178,19 +1178,19 @@
|
||||
"searchable_directory_x_network" = "%@ Netzwerk";
|
||||
"searchable_directory_search_placeholder" = "Name oder ID";
|
||||
"create_room_title" = "Neuer Raum";
|
||||
"create_room_section_header_name" = "Raumname";
|
||||
"create_room_section_header_name" = "NAME";
|
||||
"create_room_placeholder_name" = "Name";
|
||||
"create_room_section_header_topic" = "THEMA (OPTIONAL)";
|
||||
"create_room_placeholder_topic" = "Um was geht es in diesem Raum?";
|
||||
"create_room_section_header_encryption" = "Raumverschlüsselung";
|
||||
"create_room_section_header_encryption" = "VERSCHLÜSSELUNG";
|
||||
"create_room_enable_encryption" = "Verschlüsselung aktivieren";
|
||||
"create_room_section_footer_encryption" = "Verschlüsselung kann im Nachhinein nicht deaktiviert werden.";
|
||||
"create_room_section_header_type" = "Raumtyp";
|
||||
"create_room_section_header_type" = "BEITRITTSBERECHTIGTE";
|
||||
"create_room_type_private" = "Privater Raum (nur Eingeladene)";
|
||||
"create_room_type_public" = "Öffentlicher Raum (jeder hat Zugriff)";
|
||||
"create_room_section_footer_type" = "Personen können einen privaten Raum nur mit Einladung betreten.";
|
||||
"create_room_show_in_directory" = "Im Raumverzeichnis zeigen";
|
||||
"create_room_section_header_address" = "Raum-Adresse";
|
||||
"create_room_section_header_address" = "ADRESSE";
|
||||
"create_room_placeholder_address" = "#testraum:matrix.org";
|
||||
"room_info_list_room_encrypted" = "Nachrichten in diesem Raum sind Ende-zu-Ende verschlüsselt";
|
||||
"room_info_list_one_member" = "1 Mitglied";
|
||||
@@ -1241,9 +1241,9 @@
|
||||
// MARK: - Favourites
|
||||
|
||||
"favourites_empty_view_title" = "Favorisierte Räume und Personen";
|
||||
"favourites_empty_view_information" = "Um einen Lieblingschat hinzuzufügen, halte diesen gedrückt und wähle den Stern aus. Du findest deine Lieblingschats gesammelt hier.";
|
||||
"home_empty_view_information" = "Die sichere Chat-App für Teams, Freunde und Organisationen. Tippe unten auf das +, um Leute und Räume hinzuzufügen.";
|
||||
"rooms_empty_view_information" = "Noch keine Chat-Räume vorhanden. Tippe auf das +, um einem Raum beizutreten oder einen neuen zu erstellen.";
|
||||
"favourites_empty_view_information" = "Du kannst Unterhaltungen favorisieren – am schnellsten geht das, indem du sie gedrückt hältst. Tippe auf den Stern und schon werden sie hier angezeigt.";
|
||||
"home_empty_view_information" = "Die sichere Kommunikations-App für Gruppen, Freunde und Organisationen. Tippe unten auf das +, um Personen und Räume hinzuzufügen.";
|
||||
"rooms_empty_view_information" = "Räume sind großartig für Gruppenunterhaltungen, ob privat oder öffentlich. Tippe auf +, bestehende Räume zu finden oder neue zu erstellen.";
|
||||
"invite_friends_share_text" = "Hey! Sprich mit mir auf %@: %@";
|
||||
|
||||
// MARK: - Invite friends
|
||||
@@ -1318,7 +1318,7 @@
|
||||
"room_accessibility_video_call" = "Videoanruf";
|
||||
"room_message_replying_to" = "%@ anworten";
|
||||
"room_message_editing" = "Bearbeitung";
|
||||
"space_beta_announce_information" = "Spaces bieten neue Möglichkeiten um Räume und Personen zu gruppieren. Sie sind noch nicht auf iOS verfügbar, aber du kannst sie jetzt schon mit Web und Desktop nutzen.";
|
||||
"space_beta_announce_information" = "Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren. Sie sind noch nicht auf iOS verfügbar, aber du kannst sie jetzt schon mit Web und Desktop nutzen.";
|
||||
"space_feature_unavailable_information" = "Spaces bieten neue Möglichkeiten um Räume und Personen zu gruppieren.\n\nBald werden sie auch hier verfügbar sein. Für den Moment kannst du ihnen auf einer der anderen Plattformen beitreten und hier auf alle Räume zugreifen, denen du dort beitrittst.";
|
||||
"space_beta_announce_subtitle" = "Die verbesserte Version von Communities";
|
||||
"space_beta_announce_title" = "Spaces sind bald verfügbar";
|
||||
@@ -1423,8 +1423,8 @@
|
||||
"settings_messages_containing_at_room" = "@room";
|
||||
"settings_messages_containing_user_name" = "Meinem Benutzernamen";
|
||||
"settings_messages_containing_display_name" = "Meinem Anzeigenamen";
|
||||
"settings_encrypted_group_messages" = "Verschlüsselten Gruppenchats";
|
||||
"settings_group_messages" = "Gruppenchats";
|
||||
"settings_encrypted_group_messages" = "Verschlüsselte Gruppennachrichten";
|
||||
"settings_group_messages" = "Gruppennachrichten";
|
||||
"settings_encrypted_direct_messages" = "Verschlüsselten Direktnachrichten";
|
||||
"settings_direct_messages" = "Direktnachrichten";
|
||||
"settings_notify_me_for" = "Benachrichtige mich bei";
|
||||
@@ -1500,7 +1500,7 @@
|
||||
"contacts_address_book_permission_denied_alert_title" = "Kontakte deaktiviert";
|
||||
"poll_edit_form_create_options" = "Erstelle Optionen";
|
||||
"settings_discovery_accept_terms" = "Bedingungen des Identitätsservers akzeptieren";
|
||||
"find_your_contacts_message" = "Lass dir von %@ deine Kontakte anzeigen um schnell mit denen zu chatten, die du am besten kennst.";
|
||||
"find_your_contacts_message" = "Lass dir von %@ deine Kontakte anzeigen, um schnell mit denen zu schreiben, die du am besten kennst.";
|
||||
"poll_timeline_votes_count" = "%lu Stimmen";
|
||||
"poll_timeline_one_vote" = "1 Stimme";
|
||||
"poll_edit_form_add_option" = "Option hinzufügen";
|
||||
@@ -1627,7 +1627,7 @@
|
||||
"room_event_action_reply_in_thread" = "Thread";
|
||||
"room_event_action_view_in_room" = "Im Raum anzeigen";
|
||||
"location_sharing_open_open_street_maps" = "In OpenStreetMap öffnen";
|
||||
"onboarding_use_case_title" = "Mit wem wirst du am meisten chatten?";
|
||||
"onboarding_use_case_title" = "Mit wem wirst du am meisten schreiben?";
|
||||
"onboarding_use_case_message" = "Wir helfen dir, dich zu verbinden";
|
||||
"onboarding_use_case_personal_messaging" = "Freunde und Familie";
|
||||
"onboarding_use_case_work_messaging" = "Teams";
|
||||
@@ -1694,7 +1694,7 @@
|
||||
"set_default_power_level" = "Berechtigungsstufe zurücksetzen";
|
||||
"set_moderator" = "Moderator setzen";
|
||||
"set_admin" = "Administrator setzen";
|
||||
"start_chat" = "Chat starten";
|
||||
"start_chat" = "Unterhaltung beginnen";
|
||||
"start_voice_call" = "Sprachanruf starten";
|
||||
"start_video_call" = "Videoanruf starten";
|
||||
"mention" = "Erwähnung";
|
||||
@@ -1872,7 +1872,7 @@
|
||||
"attachment_cancel_upload" = "Hochladen abbrechen?";
|
||||
"attachment_multiselection_size_prompt" = "Bilder senden als:";
|
||||
"attachment_multiselection_original" = "Originalgröße";
|
||||
"attachment_e2e_keys_file_prompt" = "Diese Datei enthält von einem Matrixclient exportierte Schlüssel.\nMöchtest du den Dateiinhalt sehen oder die Schlüssel importieren?";
|
||||
"attachment_e2e_keys_file_prompt" = "Diese Datei enthält von einer Matrix-Anwendung exportierte Schlüssel.\nMöchtest du den Dateiinhalt sehen oder die Schlüssel importieren?";
|
||||
"attachment_e2e_keys_import" = "Importiere...";
|
||||
// Contacts
|
||||
"contact_mx_users" = "Matrixbenutzer";
|
||||
@@ -1888,12 +1888,12 @@
|
||||
"format_time_d" = "t";
|
||||
// E2E import
|
||||
"e2e_import_room_keys" = "Importiere Raumschlüssel";
|
||||
"e2e_import_prompt" = "Dieser Prozess erlaubt es dir, Schlüssel zu importieren, die du vorher von einem anderen Matrixclient exportiert hast. Du kannst anschließend alle Nachrichten entschlüsseln, die auch bereits der andere Client entschlüsseln konnte.\nDie Exportdatei ist mit einer Passphrase geschützt. Gib die Passphrase hier ein, um die Datei zu importieren.";
|
||||
"e2e_import_prompt" = "Dieser Prozess erlaubt es dir, Schlüssel zu importieren, die du vorher von einer anderen Matrix-Anwendung exportiert hast. Du kannst anschließend alle Nachrichten entschlüsseln, die auch bereits die andere Anwendung entschlüsseln konnte.\nDie Exportdatei ist mit einer Passphrase geschützt. Gib die Passphrase hier ein, um die Datei zu importieren.";
|
||||
"e2e_import" = "Importieren";
|
||||
"e2e_passphrase_enter" = "Passphrase eingeben";
|
||||
// E2E export
|
||||
"e2e_export_room_keys" = "Exportiere Raumschlüssel";
|
||||
"e2e_export_prompt" = "Dieser Prozess erlaubt den Export von Schlüsseln, die du in verschlüsselten Räumen empfangen hast, in eine lokale Datei. Du kannst dann die Datei in einem anderen Matrixclient in Zukunft importieren, so dass dieser Client die Nachrichten auch entschlüsseln kann.\nDie exportierte Datei wird jedem der sie lesen kann erlauben, alle verschlüsselten Nachrichten sehen können, also verwahre die Datei sicher.";
|
||||
"e2e_export_prompt" = "Dieser Prozess erlaubt den Export von Schlüsseln, die du in verschlüsselten Räumen empfangen hast, in eine lokale Datei. Du kannst dann die Datei in einer anderen Matrix-Anwendung importieren, sodass diese die Nachrichten auch entschlüsseln kann.\nDie exportierte Datei wird jedem, der sie lesen kann, erlauben, alle verschlüsselten Nachrichten sehen können, also verwahre die Datei sicher.";
|
||||
"e2e_export" = "Exportiere";
|
||||
"e2e_passphrase_confirm" = "Passphrase bestätigen";
|
||||
"e2e_passphrase_empty" = "Die Passphrase darf nicht leer sein";
|
||||
@@ -2025,7 +2025,7 @@
|
||||
"membership_ban" = "Gesperrt";
|
||||
"num_members_one" = "%@ Benutzer";
|
||||
"num_members_other" = "%@ Benutzer";
|
||||
"kick" = "Entfernen";
|
||||
"kick" = "Aus Unterhaltung entfernen";
|
||||
"ban" = "Sperren";
|
||||
"unban" = "Entsperren";
|
||||
"message_unsaved_changes" = "Es gibt nicht gespeicherte Änderungen. Verlassen wird diese verwerfen.";
|
||||
@@ -2046,7 +2046,7 @@
|
||||
|
||||
// room details dialog screen
|
||||
// contacts list screen
|
||||
"invitation_message" = "Ich würde gerne über Matrix mit dir chatten. Du kannst dich auf https://matrix.org darüber informieren.";
|
||||
"invitation_message" = "Ich würde gerne über Matrix mit dir schreiben. Du kannst dich auf https://matrix.org darüber informieren.";
|
||||
// Settings screen
|
||||
"settings_title_config" = "Konfiguration";
|
||||
"settings_title_notifications" = "Benachrichtigungen";
|
||||
@@ -2054,7 +2054,7 @@
|
||||
"notification_settings_disable_all" = "Alle Benachrichtigungen ausschalten";
|
||||
"notification_settings_enable_notifications" = "Benachrichtigungen einschalten";
|
||||
"notification_settings_enable_notifications_warning" = "Alle Benachrichtigungen sind momentan für alle Geräte ausgeschaltet.";
|
||||
"notification_settings_global_info" = "Benachrichtigungseinstellungen werden in deinem Benutzerkonto gespeichert und zwischen allen Clients die das unterstützen geteilt (inklusive Desktop Benachrichtigungen). \n\nRegeln werden der Reihe nach angewandt; die erste Regel, die zutrifft, bestimmt das Resultat für die Nachricht.\nPro-Wort-Benachrichtigungen sind wichtiger als Pro-Raum-Benachrichtigungen, die wichtiger sind wie Pro-Absender-Benachrichtigungen.\nBei mehrfachen Regeln des gleichen Typs wird die erste in der Liste die zutrifft angewendet.";
|
||||
"notification_settings_global_info" = "Benachrichtigungseinstellungen werden in deinem Benutzerkonto gespeichert und zwischen allen Anwendungen, die das unterstützen geteilt (inklusive Desktop-Benachrichtigungen). \n\nRegeln werden der Reihe nach angewandt; die erste Regel, die zutrifft, bestimmt das Resultat für die Nachricht.\nPro-Wort-Benachrichtigungen sind wichtiger als Pro-Raum-Benachrichtigungen, die wiederum wichtiger als Pro-Absender-Benachrichtigungen sind.\nBei mehrfachen Regeln des gleichen Typs wird, die erste in der Liste, die zutrifft, angewandt.";
|
||||
"notification_settings_per_word_notifications" = "Pro-Wort-Benachrichtigungen";
|
||||
"notification_settings_per_word_info" = "Suchwörter ignorieren Groß-/Kleinschreibung und können ein *-Platzhalter enthalten. Beispiele:\nfoo findet den String foo umgeben durch Trennzeichen (Satzzeichen, Leerzeichen, Zeilenanfang/ende).\nfoo* findet Worte die mit foo beginnen.\n*foo* findet jedes Wort das foo an beliebiger Stelle enthält.";
|
||||
"notification_settings_always_notify" = "Immer benachrichtigen";
|
||||
@@ -2129,7 +2129,7 @@
|
||||
"room_displayname_all_other_members_left" = "%@ (Verlassen)";
|
||||
"notice_error_unformattable_event" = "** Nachricht kann nicht dargestellt werden. Bitte erstelle einen Bug-Report";
|
||||
"home_syncing" = "Synchronisiere";
|
||||
"settings_labs_use_only_latest_user_avatar_and_name" = "Immer aktuelle Profilbilder und Nicknamen anzeigen";
|
||||
"settings_labs_use_only_latest_user_avatar_and_name" = "Aktuelle Profilbilder und Anzeigenamen im Verlauf anzeigen";
|
||||
"room_participants_leave_success" = "Raum verlassen";
|
||||
"room_participants_leave_processing" = "Verlassen";
|
||||
"onboarding_display_name_title" = "Wähle einen Anzeigenamen";
|
||||
@@ -2220,7 +2220,7 @@
|
||||
"authentication_forgot_password_waiting_button" = "E-Mail erneut senden";
|
||||
"authentication_verify_email_input_title" = "Gib deine E-Mail-Adresse ein";
|
||||
/* The placeholder will show the full Matrix ID that has been entered. */
|
||||
"authentication_registration_username_footer_available" = "Andere Nutzer können dich als %@ finden";
|
||||
"authentication_registration_username_footer_available" = "Andere können dich als %@ finden";
|
||||
"authentication_registration_username" = "Nutzername";
|
||||
"onboarding_celebration_message" = "Dein kannst dein Profil jederzeit in den Einstellungen ändern";
|
||||
"authentication_registration_password_footer" = "8 Zeichen oder mehr";
|
||||
@@ -2351,7 +2351,7 @@
|
||||
|
||||
// Mark: - Space Creation
|
||||
|
||||
"spaces_creation_hint" = "Spaces sind eine neue Art, Räume und Personen zu gruppieren.";
|
||||
"spaces_creation_hint" = "Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren.";
|
||||
"space_settings_current_address_message" = "Dein Space ist sichtbar unter\n%@";
|
||||
"space_settings_update_failed_message" = "Aktualisieren der Space-Einstellungen fehlgeschlagen. Erneut versuchen?";
|
||||
"space_settings_access_section" = "Wer hat Zugriff auf diesen Space?";
|
||||
@@ -2398,7 +2398,7 @@
|
||||
"room_access_space_chooser_other_spaces_section" = "Andere Spaces oder Räume";
|
||||
"room_access_settings_screen_setting_room_access" = "Lege Raumzugriff fest";
|
||||
"room_access_settings_screen_upgrade_alert_upgrading" = "Raum upgraden";
|
||||
"room_access_settings_screen_upgrade_alert_upgrade_button" = "Upgrade";
|
||||
"room_access_settings_screen_upgrade_alert_upgrade_button" = "Aktualisieren";
|
||||
"room_access_settings_screen_upgrade_alert_auto_invite_switch" = "Mitglieder automatisch zu neuem Raum einladen";
|
||||
"room_access_settings_screen_upgrade_alert_message" = "Jeder in %@ kann diesen Raum finden und ihm beitreten - jeden manuell einzuladen ist nicht nötig. Du kannst diese Einstellung jederzeit ändern.";
|
||||
"room_access_settings_screen_upgrade_alert_title" = "Raum upgraden";
|
||||
@@ -2448,16 +2448,16 @@
|
||||
"room_invites_empty_view_title" = "Nichts neues.";
|
||||
"all_chats_edit_layout_add_filters_title" = "Filtere deine Nachrichten";
|
||||
"all_chats_edit_layout_unreads" = "Ungelesene";
|
||||
"all_chats_section_title" = "Chats";
|
||||
"all_chats_section_title" = "Unterhaltungen";
|
||||
|
||||
// Mark: - All Chats
|
||||
|
||||
"all_chats_title" = "Alle Chats";
|
||||
"all_chats_title" = "Alle Unterhaltungen";
|
||||
"all_chats_empty_view_title" = "%@\nsieht ein bisschen leer aus.";
|
||||
"all_chats_all_filter" = "Alle";
|
||||
"all_chats_edit_layout_show_filters" = "Filter anzeigen";
|
||||
"all_chats_edit_menu_leave_space" = "%@ verlassen";
|
||||
"all_chats_onboarding_page_title3" = "Feedback geben";
|
||||
"all_chats_onboarding_page_title3" = "Rückmeldung geben";
|
||||
"room_invites_empty_view_information" = "Hier erscheinen deine Einladungen.";
|
||||
"all_chats_onboarding_try_it" = "Probiere es aus";
|
||||
"threads_discourage_information_1" = "Dein Heimserver unterstützt aktuell keine Threads, weshalb diese Funktion unzuverlässig sein könnte. Manche Thread-Nachrichten könnten nicht zuverlässig verfügbar sein. ";
|
||||
@@ -2465,29 +2465,59 @@
|
||||
"spaces_create_subspace_title" = "Sub-Space erstellen";
|
||||
"room_access_settings_screen_upgrade_alert_note" = "Bitte beachte, dass das Upgrade eine neue Version dieses Raums erstellt. Alle aktuellen Nachrichten bleiben in diesem archivierten Raum.";
|
||||
"invite_to" = "Zu %@ einladen";
|
||||
"all_chats_empty_unreads_placeholder_message" = "Hier werden ungelesene Nachrichten angezeigt, wenn welche vorhanden sind.";
|
||||
"all_chats_empty_unreads_placeholder_message" = "Hier werden deine ungelesenen Nachrichten erscheinen, wenn du welche hast.";
|
||||
"all_chats_edit_layout_show_recents" = "Historie anzeigen";
|
||||
"all_chats_empty_list_placeholder_title" = "Keine ungelesenen Nachrichten vorhanden.";
|
||||
"all_chats_empty_list_placeholder_title" = "Du bist auf dem neuesten Stand.";
|
||||
"spaces_explore_rooms_format" = "%@ erkunden";
|
||||
"room_access_settings_screen_upgrade_alert_message_no_param" = "Jeder in einem übergeordneten Space kann diesen Raum finden und ihm beitreten - jeden manuell einzuladen ist nicht nötig. Du kannst diese Einstellung jederzeit ändern.";
|
||||
"room_access_settings_screen_public_message" = "Sichtbar und zugänglich für jeden.";
|
||||
"room_access_settings_screen_restricted_message" = "Sichtbar und betretbar für jeden Nutzer in einem Space.\nDu wählst, für welche Spaces dies gilt.";
|
||||
"room_access_settings_screen_private_message" = "Nur sichtbar und betretbar für eingeladene Personen.";
|
||||
"location_sharing_allow_background_location_message" = "Wenn du deinen Live-Standort teilen möchtest, benötigt Element den Standortzugriff auch im Hintergrund. Um den Zugriff zu ermöglichen, tippe auf Einstellungen > Standort und wähle ‘Immer‘ aus";
|
||||
"space_selector_empty_view_information" = "Spaces sind ein Weg um Räume und Personen zu gruppieren. Erstelle einen Space um loszulegen.";
|
||||
"all_chats_onboarding_title" = "Was ist neu?";
|
||||
"space_selector_empty_view_information" = "Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren. Erstelle einen Space, um zu beginnen.";
|
||||
"all_chats_onboarding_title" = "Was ist neu";
|
||||
"all_chats_onboarding_page_message3" = "Drücke auf dein Profil um uns Wissen zu lassen, was du denkst.";
|
||||
"all_chats_onboarding_page_message2" = "Greife auf deine Spaces (unten-links) schneller und einfacher denn je zu.";
|
||||
"all_chats_onboarding_page_message2" = "Greife auf deine Spaces (unten links) schneller und einfacher denn je zu.";
|
||||
"all_chats_onboarding_page_title2" = "Auf Spaces zugreifen";
|
||||
"all_chats_onboarding_page_message1" = "Um Element zu vereinfachen, sind Tabs nun optional. Verwalte diese mit dem Menü oben-rechts.";
|
||||
"all_chats_empty_view_information" = "Die alles-in-einem sichere Chat-App für Teams, Freunde und Organisationen. Erstelle einen Chat oder trete einem existierenden Raum bei, um zu starten.";
|
||||
"all_chats_empty_space_information" = "Spaces sind ein neuer Weg um Räume und Personen zu gruppieren. Füge einen existierenden Raum hinzu oder erstelle einen neuen, indem du den Knopf unten-rechts verwendest.";
|
||||
"all_chats_onboarding_page_message1" = "Um dein Element zu vereinfachen, sind Tabs nun optional. Verwalte sie mit dem Menü oben rechts.";
|
||||
"all_chats_empty_view_information" = "Die Komplettlösung für sichere Kommunikation unter Freunden, in Gruppen oder in Organisationen. Erstelle eine Unterhaltung oder trete einem bestehenden Raum bei, um loszulegen.";
|
||||
"all_chats_empty_space_information" = "Spaces sind eine neue Möglichkeit, Räume und Personen zu gruppieren. Füge einen bestehenden Raum hinzu oder erstelle einen neuen mit der Schaltfläche unten rechts.";
|
||||
"all_chats_edit_layout_sorting_options_title" = "Sortiere deine Nachrichten nach";
|
||||
"space_detail_nav_title" = "Space-Details";
|
||||
"all_chats_onboarding_page_title1" = "Willkommen zum neuen Layout!";
|
||||
"all_chats_onboarding_page_title1" = "Willkommen in einer neuen Übersicht!";
|
||||
"all_chats_edit_menu_space_settings" = "Space-Einstellungen";
|
||||
"all_chats_user_menu_settings" = "Benutzer-Einstellungen";
|
||||
"all_chats_user_menu_settings" = "Nutzereinstellungen";
|
||||
"room_recents_recently_viewed_section" = "Kürzlich angesehen";
|
||||
"all_chats_nothing_found_placeholder_message" = "Versuche, deine Suche anzupassen.";
|
||||
"all_chats_edit_layout_recents" = "Historie";
|
||||
"all_chats_edit_layout" = "Layout-Einstellungen";
|
||||
"all_chats_edit_layout" = "Layouteinstellungen";
|
||||
"spaces_creation_new_rooms_message" = "Wir werden für jedes Thema einen Raum erstellen.";
|
||||
"create_room_section_footer_type_public" = "Sichtbar und betretbar für alle eingeladenen Personen, nicht nur jene, die sich im Space befinden.";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
"existing" = "Bestehend";
|
||||
"device_name_web" = "%@ Web";
|
||||
"spaces_subspace_creation_visibility_title" = "Welche Art von Subspace möchtest du erstellen?";
|
||||
"all_chats_edit_layout_pin_spaces_title" = "Spaces anpinnen";
|
||||
"all_chats_edit_layout_add_filters_message" = "Filtere deine Nachrichten automatisch in Kategorien deiner Wahl";
|
||||
"all_chats_edit_layout_add_section_message" = "Abschnitt an Startseite für schnellen Zugriff anpinnen";
|
||||
"all_chats_edit_layout_add_section_title" = "Abschnitt zur Startseite hinzufügen";
|
||||
"device_name_desktop" = "%@ Desktop";
|
||||
"user_sessions_overview_current_session_section_title" = "AKTUELLE SITZUNG";
|
||||
"user_sessions_overview_other_sessions_section_title" = "ANDERE SITZUNGEN";
|
||||
"device_name_unknown" = "Unbekannte Anwendung";
|
||||
"device_name_mobile" = "%@ Mobil";
|
||||
"user_session_item_details" = "%@ · Neueste Aktivität %@";
|
||||
"user_session_unverified_additional_info" = "Verifiziere deine aktuelle Sitzung für besonders sichere Kommunikation.";
|
||||
"user_session_verified_additional_info" = "Deine aktuelle Sitzung ist für sichere Kommunikation bereit.";
|
||||
"user_session_learn_more" = "Mehr erfahren";
|
||||
"user_session_view_details" = "Details anzeigen";
|
||||
"user_session_verify_action" = "Sitzung verifizieren";
|
||||
"user_session_unverified_short" = "Nicht verifiziert";
|
||||
"user_session_verified_short" = "Verifiziert";
|
||||
"user_session_unverified" = "Nicht verifizierte Sitzungen";
|
||||
"user_session_verified" = "Verifizierte Sitzungen";
|
||||
"user_sessions_overview_other_sessions_section_info" = "Für bestmögliche Sicherheit verifiziere deine Sitzungen und melde dich von allen ab, die du nicht erkennst oder nutzt.";
|
||||
"settings_labs_enable_new_app_layout" = "Neues App-Layout";
|
||||
"room_first_message_placeholder" = "Schreibe deine erste Nachricht …";
|
||||
|
||||
@@ -762,6 +762,8 @@ Tap the + to start adding people.";
|
||||
"settings_labs_enable_auto_report_decryption_errors" = "Auto Report Decryption Errors";
|
||||
"settings_labs_use_only_latest_user_avatar_and_name" = "Show latest avatar and name for users in message history";
|
||||
"settings_labs_enable_live_location_sharing" = "Live location sharing - share current location (active development, and temporarily, locations persist in room history)";
|
||||
"settings_labs_enable_new_session_manager" = "New session manager";
|
||||
"settings_labs_enable_new_client_info_feature" = "Record the client name, version, and url to recognise sessions more easily in session manager";
|
||||
"settings_labs_enable_new_app_layout" = "New Application Layout";
|
||||
|
||||
"settings_version" = "Version %@";
|
||||
@@ -2103,10 +2105,7 @@ Tap the + to start adding people.";
|
||||
"spaces_creation_in_many_spaces" = "in %@ spaces";
|
||||
"spaces_creation_in_one_space" = "in 1 space";
|
||||
|
||||
"spaces_invite_people" = "Invite people";
|
||||
"spaces_add_room" = "Add room";
|
||||
"spaces_add_room_missing_permission_message" = "You do not have permissions to add rooms to this space.";
|
||||
"spaces_add_space" = "Add space";
|
||||
|
||||
// Mark: Leave space
|
||||
|
||||
@@ -2193,6 +2192,7 @@ Tap the + to start adding people.";
|
||||
|
||||
"room_recents_recently_viewed_section" = "Recently viewed";
|
||||
|
||||
"all_chats_user_menu_accessibility_label" = "User menu";
|
||||
"all_chats_user_menu_settings" = "User settings";
|
||||
|
||||
"all_chats_edit_menu_leave_space" = "Leave %@";
|
||||
@@ -2358,10 +2358,21 @@ To enable access, tap Settings> Location and select Always";
|
||||
|
||||
"user_sessions_overview_title" = "Sessions";
|
||||
|
||||
"user_sessions_overview_other_sessions_section_title" = "OTHER SESSIONS";
|
||||
"user_sessions_overview_security_recommendations_section_title" = "Security recommendations";
|
||||
"user_sessions_overview_security_recommendations_section_info" = "Improve your account security by following these recommendations.";
|
||||
|
||||
"user_sessions_overview_security_recommendations_unverified_title" = "Unverified sessions";
|
||||
"user_sessions_overview_security_recommendations_unverified_info" = "Verify or sign out from unverified sessions.";
|
||||
|
||||
"user_sessions_overview_security_recommendations_inactive_title" = "Inactive sessions";
|
||||
"user_sessions_overview_security_recommendations_inactive_info" = "Consider signing out from old sessions (90 days or older) you don’t use anymore.";
|
||||
|
||||
"user_sessions_overview_other_sessions_section_title" = "Other sessions";
|
||||
"user_sessions_overview_other_sessions_section_info" = "For best security, verify your sessions and sign out from any session that you don’t recognize or use anymore.";
|
||||
|
||||
"user_sessions_overview_current_session_section_title" = "CURRENT SESSION";
|
||||
"user_sessions_overview_current_session_section_title" = "Current session";
|
||||
|
||||
"user_sessions_view_all_action" = "View all (%d)";
|
||||
|
||||
"user_session_verified" = "Verified session";
|
||||
"user_session_unverified" = "Unverified session";
|
||||
@@ -2374,6 +2385,9 @@ To enable access, tap Settings> Location and select Always";
|
||||
"user_session_verified_additional_info" = "Your current session is ready for secure messaging.";
|
||||
"user_session_unverified_additional_info" = "Verify your current session for enhanced secure messaging.";
|
||||
|
||||
"user_session_push_notifications" = "Push notifications";
|
||||
"user_session_push_notifications_message" = "When turned on, this session will receive push notifications.";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
|
||||
@@ -2384,6 +2398,24 @@ To enable access, tap Settings> Location and select Always";
|
||||
"device_name_mobile" = "%@ Mobile";
|
||||
"device_name_unknown" = "Unknown client";
|
||||
|
||||
"user_session_details_title" = "Session details";
|
||||
"user_session_details_session_section_header" = "Session";
|
||||
"user_session_details_application_section_header" = "Application";
|
||||
"user_session_details_device_section_header" = "Device";
|
||||
"user_session_details_session_name" = "Session name";
|
||||
"user_session_details_session_id" = "Session ID";
|
||||
"user_session_details_session_section_footer" = "Copy any data by tapping on it and holding it down.";
|
||||
"user_session_details_device_ip_address" = "IP address";
|
||||
"user_session_details_device_ip_location" = "IP location";
|
||||
"user_session_details_device_model" = "Model";
|
||||
"user_session_details_device_browser" = "Browser";
|
||||
"user_session_details_device_os" = "Operating System";
|
||||
"user_session_details_application_name" = "Name";
|
||||
"user_session_details_application_version" = "Version";
|
||||
"user_session_details_application_url" = "URL";
|
||||
"user_session_overview_current_session_title" = "Current session";
|
||||
"user_session_overview_session_title" = "Session";
|
||||
"user_session_overview_session_details_button_title" = "Session details";
|
||||
// MARK: - MatrixKit
|
||||
|
||||
|
||||
@@ -2693,12 +2725,9 @@ To enable access, tap Settings> Location and select Always";
|
||||
"user_id_title" = "User ID:";
|
||||
"offline" = "offline";
|
||||
"unsent" = "Unsent";
|
||||
"error" = "Error";
|
||||
"error_common_message" = "An error occured. Please try again later.";
|
||||
"not_supported_yet" = "Not supported yet";
|
||||
"default" = "default";
|
||||
"private" = "Private";
|
||||
"public" = "Public";
|
||||
"power_level" = "Power Level";
|
||||
"network_error_not_reachable" = "Please check your network connectivity";
|
||||
"user_id_placeholder" = "ex: @bob:homeserver";
|
||||
|
||||
@@ -2430,10 +2430,32 @@
|
||||
"all_chats_empty_unreads_placeholder_message" = "Kui sul on lugemata sõnumeid, siis nad on siit leitavad.";
|
||||
"all_chats_empty_list_placeholder_title" = "Ei tea... kõik vist on nüüd tehtud.";
|
||||
"all_chats_empty_view_information" = "Paljude võimalustega turvaline suhtlusrakendus sõprade, kogukondade ja tiimide jaoks. Alustamiseks loo mõni uus vestlus või liitu olemasoleva jututoaga.";
|
||||
"all_chats_empty_space_information" = "Kogukonnad on võimalus jututubade ja inimeste ühendamiseks. Kasutades all vasakul olevat nuppu lisa mõni olemasolev jututuba või loo uus.";
|
||||
"all_chats_empty_space_information" = "Kogukonnad on võimalus jututubade ja inimeste ühendamiseks. Kasutades all paremal olevat nuppu lisa mõni olemasolev jututuba või loo uus.";
|
||||
"all_chats_empty_view_title" = "%@\ntundub olema tühjavõitu.";
|
||||
"spaces_explore_rooms_format" = "Uuri kogukonda: %@";
|
||||
|
||||
// User sessions management
|
||||
"user_sessions_settings" = "Halda sessioone";
|
||||
"invite_to" = "Saada kutse siia: %@";
|
||||
"device_name_unknown" = "Tundmatu klientrakendus";
|
||||
"device_name_mobile" = "%@ Mobile";
|
||||
"device_name_web" = "%@ Web";
|
||||
"device_name_desktop" = "%@ Desktop";
|
||||
"user_session_item_details" = "%@ · Viimati kasutusel %@";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
"user_session_unverified_additional_info" = "Turvalise sõnumivahetuse nimel palun verifitseeri oma praegune sessioon.";
|
||||
"user_session_verified_additional_info" = "Sinu praegune sessioon on valmis turvaliseks sõnumivahetuseks.";
|
||||
"user_session_learn_more" = "Loe lisateavet";
|
||||
"user_session_view_details" = "Vaata lisateavet";
|
||||
"user_session_verify_action" = "Verifitseeri sessioon";
|
||||
"user_session_unverified_short" = "Verifitseerimata";
|
||||
"user_session_verified_short" = "Verifitseeritud";
|
||||
"user_session_unverified" = "Verifitseerimata sessioon";
|
||||
"user_session_verified" = "Verifitseeritud sessioon";
|
||||
"user_sessions_overview_current_session_section_title" = "PRAEGUNE SESSIOON";
|
||||
"user_sessions_overview_other_sessions_section_info" = "Parima turvalisuse nimel verifitseeri kõik oma sessioonid ning logi välja neist, mida sa enam ei kasuta.";
|
||||
"user_sessions_overview_other_sessions_section_title" = "MUUD SESSIOONID";
|
||||
"settings_labs_enable_new_app_layout" = "Rakenduse uus paigutus";
|
||||
"room_first_message_placeholder" = "Saada oma esimene sõnum…";
|
||||
|
||||
@@ -2485,3 +2485,25 @@
|
||||
// User sessions management
|
||||
"user_sessions_settings" = "Munkamenetek kezelése";
|
||||
"invite_to" = "Meghívó ide: %@";
|
||||
"device_name_unknown" = "Ismeretlen kliens";
|
||||
"device_name_mobile" = "%@ Mobil";
|
||||
"device_name_desktop" = "%@ Alkalmazás";
|
||||
"device_name_web" = "%@ Web";
|
||||
"user_session_item_details" = "%@ · Utolsó aktivitás %@";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
"user_session_unverified_additional_info" = "Az aktuális munkamenet készen áll a biztonságos üzenetküldésre.";
|
||||
"user_session_verified_additional_info" = "Az aktuális munkamenet készen áll a biztonságos üzenetküldésre.";
|
||||
"user_session_learn_more" = "Tudj meg többet";
|
||||
"user_session_view_details" = "Részletek megtekintése";
|
||||
"user_session_verify_action" = "Munkamenet hitelesítése";
|
||||
"user_session_unverified_short" = "Ellenőrizetlen";
|
||||
"user_session_verified_short" = "Hitelesített";
|
||||
"user_session_unverified" = "Ellenőrizetlen munkamenet";
|
||||
"user_session_verified" = "Ellenőrzött munkamenet";
|
||||
"user_sessions_overview_current_session_section_title" = "JELENLEGI MUNKAMENET";
|
||||
"user_sessions_overview_other_sessions_section_info" = "A legjobb biztonság érdekében ellenőrizd a munkameneteket, és jelentkezz ki minden olyan munkamenetből, melyet már nem ismersz fel vagy nem használsz.";
|
||||
"user_sessions_overview_other_sessions_section_title" = "TOVÁBBI MUNKAMENETEK";
|
||||
"settings_labs_enable_new_app_layout" = "Új alkalmazás kinézet";
|
||||
"room_first_message_placeholder" = "Küld el az első üzenetedet…";
|
||||
|
||||
@@ -2692,3 +2692,25 @@
|
||||
// User sessions management
|
||||
"user_sessions_settings" = "Kelola sesi";
|
||||
"invite_to" = "Undang ke %@";
|
||||
"device_name_unknown" = "Klien tidak diketahui";
|
||||
"device_name_mobile" = "%@ Ponsel";
|
||||
"device_name_web" = "%@ Web";
|
||||
"device_name_desktop" = "%@ Desktop";
|
||||
"user_session_item_details" = "%@ · Aktivitas terakhir %@";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
"user_session_unverified_additional_info" = "Verifikasi sesi Anda saat ini untuk perpesanan aman yang baik.";
|
||||
"user_session_verified_additional_info" = "Sesi Anda saat ini siap untuk perpesanan aman.";
|
||||
"user_session_learn_more" = "Pelajari lebih lanjut";
|
||||
"user_session_view_details" = "Tampilkan detail";
|
||||
"user_session_verify_action" = "Verifikasi sesi";
|
||||
"user_session_unverified_short" = "Belum diverifikasi";
|
||||
"user_session_verified_short" = "Terverifikasi";
|
||||
"user_session_unverified" = "Sesi belum diverifikasi";
|
||||
"user_session_verified" = "Sesi terverifikasi";
|
||||
"user_sessions_overview_current_session_section_title" = "SESI SAAT INI";
|
||||
"user_sessions_overview_other_sessions_section_info" = "Untuk keamanan yang terbaik, verifikasi sesi Anda dan keluarkan dari sesi yang Anda tidak kenal atau tidak digunakan lagi.";
|
||||
"user_sessions_overview_other_sessions_section_title" = "SESI LAINNYA";
|
||||
"settings_labs_enable_new_app_layout" = "Tata Letak Aplikasi Baru";
|
||||
"room_first_message_placeholder" = "Kirim pesan pertama Anda…";
|
||||
|
||||
@@ -1279,7 +1279,7 @@
|
||||
"settings_key_backup_info_signout_warning" = "Taktu öryggisafrit af dulritunarlyklunum áður en þú skráir þig út svo þeir tapist ekki.";
|
||||
"settings_key_backup_info_none" = "Dulritunarlyklarnir þínir eru ekki öryggisafritaðir úr þessari setu.";
|
||||
"settings_key_backup_info_checking" = "Athuga…";
|
||||
"settings_deactivate_my_account" = "Gera notandaaðganginn minn óvirkann";
|
||||
"settings_deactivate_my_account" = "Gera notandaaðganginn endanlega óvirkan";
|
||||
"settings_add_3pid_invalid_password_message" = "Ógild auðkenni";
|
||||
"settings_add_3pid_password_title_msidsn" = "Bæta við símanúmeri";
|
||||
"settings_add_3pid_password_title_email" = "Bæta við tölvupóstfangi";
|
||||
@@ -1462,7 +1462,7 @@
|
||||
"auth_reset_password_error_not_found" = "Tölvupóstfangið þitt lítur ekki út fyrir að vera tengt við Matrix-auðkenni á þessum heimaþjóni.";
|
||||
"auth_login_single_sign_on" = "Skrá inn";
|
||||
"onboarding_use_case_existing_server_button" = "Tengjast þjóni";
|
||||
"onboarding_use_case_skip_button" = "sleppt þessari spurningu";
|
||||
"onboarding_use_case_skip_button" = "Sleppa þessari spurningu";
|
||||
"onboarding_use_case_community_messaging" = "Samfélög";
|
||||
"onboarding_use_case_work_messaging" = "Teymi";
|
||||
"onboarding_use_case_personal_messaging" = "Vinir og fjölskylda";
|
||||
@@ -1714,7 +1714,7 @@
|
||||
"contacts_address_book_permission_denied_alert_title" = "Tengiliðir óvirkir";
|
||||
"directory_search_results_title" = "Vafra í niðurstöðum möppu";
|
||||
/* The placeholder string contains onboarding_use_case_skip_button as a tappable action */
|
||||
"onboarding_use_case_not_sure_yet" = "Ekki ennþá viss? Þú getur %@";
|
||||
"onboarding_use_case_not_sure_yet" = "Ekki ennþá viss? %@";
|
||||
"call_invite_expired" = "Boð í símtal er útrunnið";
|
||||
"notification_settings_suppress_from_bots" = "Útiloka tilkynningar frá vélmennum";
|
||||
"notification_settings_sender_hint" = "@notandi:lén.is";
|
||||
@@ -1966,7 +1966,7 @@
|
||||
"security_settings_crosssigning_complete_security" = "Algjört öryggi";
|
||||
"settings_key_backup_info" = "Öryggi dulritaðra skilaboða er tryggt með enda-í-enda dulritun. Einungis þú og viðtakendurnir hafa dulritunarlyklana til að lesa slík skilaboð.";
|
||||
"settings_labs_enable_ringing_for_group_calls" = "Hringing fyrir hópsímtöl";
|
||||
"onboarding_use_case_message" = "Við munum hjálpa þér að tengjast.";
|
||||
"onboarding_use_case_message" = "Við munum hjálpa þér að tengjast";
|
||||
"callbar_only_single_active_group" = "Ýttu til að taka þátt í hópsímtalinu (%@)";
|
||||
"call_video_with_user" = "Myndsímtal við %@";
|
||||
"notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Þú gerðir skilaboð héðan í frá sýnileg fyrir alla meðlimi spjallrásarinnar síðan þeir skráðu sig.";
|
||||
@@ -1980,7 +1980,7 @@
|
||||
"location_sharing_live_timer_selector_long" = "í 8 klukkustundir";
|
||||
"location_sharing_live_timer_selector_medium" = "í 1 klukkustund";
|
||||
"location_sharing_live_timer_selector_short" = "í 15 mínútur";
|
||||
"location_sharing_live_list_item_stop_sharing_action" = "Hætta deilingu";
|
||||
"location_sharing_live_list_item_stop_sharing_action" = "Stöðva";
|
||||
"location_sharing_live_list_item_current_user_display_name" = "Þú";
|
||||
"location_sharing_live_list_item_last_update_invalid" = "Síðasta uppfærsla óþekkt";
|
||||
"location_sharing_live_list_item_last_update" = "Uppfært fyrir %@ síðan";
|
||||
@@ -2091,8 +2091,8 @@
|
||||
"threads_beta_title" = "Spjallþræðir";
|
||||
"threads_notice_done" = "Náði því";
|
||||
"onboarding_celebration_button" = "Hefjumst handa";
|
||||
"onboarding_celebration_message" = "Kjörstillingarnar þínar hafa verið vistaðar.";
|
||||
"onboarding_celebration_title" = "Nú ertu tilbúin(n)!";
|
||||
"onboarding_celebration_message" = "Farðu hvenær sem er í stillingarnar til að breyta notandasniðinu þínu.";
|
||||
"onboarding_celebration_title" = "Lítur vel út!";
|
||||
"onboarding_avatar_accessibility_label" = "Auðkennismynd";
|
||||
"onboarding_avatar_message" = "Þú getur breytt þessu hvenær sem er.";
|
||||
"onboarding_avatar_title" = "Bættu við auðkennismynd";
|
||||
@@ -2116,3 +2116,64 @@
|
||||
"joining" = "Gengur til liðs við spjallrás";
|
||||
// String for App Store
|
||||
"store_short_description" = "Öruggt dreifvinnsluspjall/VoIP";
|
||||
"device_name_unknown" = "Óþekkt forrit (biðlari)";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
"user_session_learn_more" = "Kanna nánar";
|
||||
"user_session_view_details" = "Skoða nánar";
|
||||
"user_session_verify_action" = "Sannprófa setu";
|
||||
"user_session_unverified_short" = "Óstaðfest";
|
||||
"user_session_verified_short" = "Staðfest";
|
||||
"user_session_unverified" = "Óstaðfest seta";
|
||||
"user_session_verified" = "Staðfest seta";
|
||||
|
||||
// MARK: User sessions management
|
||||
|
||||
"user_sessions_overview_title" = "Setur";
|
||||
"space_selector_create_space" = "Búa til svæði";
|
||||
"all_chats_onboarding_try_it" = "Prófaðu það";
|
||||
"all_chats_edit_menu_space_settings" = "Stillingar svæðis";
|
||||
"all_chats_edit_menu_leave_space" = "Yfirgefa %@";
|
||||
"room_recents_recently_viewed_section" = "Nýlega skoðað";
|
||||
"all_chats_nothing_found_placeholder_title" = "Ekkert fannst.";
|
||||
"all_chats_empty_list_placeholder_title" = "Þú hefur klárað allt.";
|
||||
"all_chats_all_filter" = "Allt";
|
||||
"all_chats_edit_layout_show_filters" = "Sýna síur";
|
||||
"all_chats_edit_layout_show_recents" = "Birta nýlegt";
|
||||
"all_chats_edit_layout_unreads" = "Ólesið";
|
||||
"all_chats_edit_layout_recents" = "Nýlegt";
|
||||
|
||||
// Mark: Leave space
|
||||
|
||||
"leave_space_action" = "Yfirgefa svæði";
|
||||
"spaces_creation_email_invites_title" = "Bjóddu félögum þínum";
|
||||
"spaces_creation_empty_room_name_error" = "Nafn er nauðsynlegt";
|
||||
"spaces_explore_rooms_format" = "Kanna %@";
|
||||
"room_info_back_button_title" = "Upplýsingar um spjallrás";
|
||||
"secrets_setup_recovery_passphrase_information" = "Settu inn öryggisfrasa sem aðeins þú þekkir, þetta er notað til að verja leyndarmálin sem þú geymir á netþjóninum þínum.";
|
||||
"room_access_settings_screen_title" = "Hver hefur aðgang að þessari spjallrás?";
|
||||
"settings_presence_offline_mode" = "Ónettengdur hamur";
|
||||
"room_accessibility_record_voice_message" = "Taka upp talskilaboð";
|
||||
"authentication_recaptcha_title" = "Ertu mannvera?";
|
||||
"authentication_verify_msisdn_invalid_phone_number" = "Ógilt símanúmer";
|
||||
"authentication_verify_msisdn_waiting_button" = "Endursenda kóða";
|
||||
"authentication_verify_msisdn_text_field_placeholder" = "Símanúmer";
|
||||
"authentication_verify_msisdn_input_title" = "Settu inn símanúmerið þitt";
|
||||
"authentication_choose_password_not_verified_message" = "Athugaðu pósthólfið þitt";
|
||||
"authentication_choose_password_submit_button" = "Endurstilla lykilorð";
|
||||
"authentication_choose_password_text_field_placeholder" = "Nýtt lykilorð";
|
||||
"authentication_choose_password_input_title" = "Veldu nýtt lykilorð";
|
||||
"authentication_forgot_password_waiting_button" = "Senda tölvupóst aftur";
|
||||
"authentication_forgot_password_waiting_title" = "Athugaðu tölvupóstinn þinn.";
|
||||
"authentication_forgot_password_text_field_placeholder" = "Tölvupóstur";
|
||||
"authentication_forgot_password_input_title" = "Settu inn tölvupóstfangið þitt";
|
||||
"authentication_verify_email_waiting_button" = "Senda tölvupóst aftur";
|
||||
"authentication_verify_email_waiting_title" = "Skoðaðu tölvupóstinn þinn.";
|
||||
"authentication_verify_email_text_field_placeholder" = "Tölvupóstfang";
|
||||
"authentication_verify_email_input_title" = "Settu inn tölvupóstfangið þitt";
|
||||
"authentication_server_selection_server_url" = "Slóð á heimaþjón";
|
||||
"authentication_login_forgot_password" = "Gleymt lykilorð";
|
||||
"authentication_login_username" = "Notandanafn / tölvupóstfang / símanúmer";
|
||||
"authentication_login_title" = "Velkomin(n) aftur!";
|
||||
"authentication_registration_username" = "Notandanafn";
|
||||
|
||||
@@ -2465,3 +2465,25 @@
|
||||
// User sessions management
|
||||
"user_sessions_settings" = "Gestisci sessioni";
|
||||
"invite_to" = "Invita in %@";
|
||||
"device_name_unknown" = "Client sconosciuto";
|
||||
"device_name_mobile" = "%@ Mobile";
|
||||
"device_name_web" = "%@ Web";
|
||||
"device_name_desktop" = "%@ Desktop";
|
||||
"user_session_item_details" = "%@ · Ultima attività %@";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
"user_session_unverified_additional_info" = "Verifica la tua sessione attuale per messaggi più sicuri.";
|
||||
"user_session_verified_additional_info" = "La tua sessione attuale è pronta per i messaggi sicuri.";
|
||||
"user_session_learn_more" = "Maggiori informazioni";
|
||||
"user_session_view_details" = "Vedi dettagli";
|
||||
"user_session_verify_action" = "Verifica la sessione";
|
||||
"user_session_unverified_short" = "Non verificata";
|
||||
"user_session_verified_short" = "Verificata";
|
||||
"user_session_unverified" = "Sessione non verificata";
|
||||
"user_session_verified" = "Sessione verificata";
|
||||
"user_sessions_overview_current_session_section_title" = "SESSIONE ATTUALE";
|
||||
"user_sessions_overview_other_sessions_section_info" = "Per una maggiore sicurezza, verifica le tue sessioni e disconnetti quelle che non riconosci o che non usi più.";
|
||||
"user_sessions_overview_other_sessions_section_title" = "ALTRE SESSIONI";
|
||||
"settings_labs_enable_new_app_layout" = "Nuova disposizione dell'applicazione";
|
||||
"room_first_message_placeholder" = "Invia il tuo primo messaggio…";
|
||||
|
||||
@@ -142,8 +142,8 @@
|
||||
"contacts_address_book_matrix_users_toggle" = "Matrix利用者のみ";
|
||||
"contacts_address_book_no_contact" = "端末内電話帳に連絡先がありません";
|
||||
"contacts_address_book_permission_required" = "端末内電話帳へのアクセス権限が必要です";
|
||||
"contacts_user_directory_section" = "利用者一覧";
|
||||
"contacts_user_directory_offline_section" = "利用者一覧(オフライン)";
|
||||
"contacts_user_directory_section" = "ユーザー一覧";
|
||||
"contacts_user_directory_offline_section" = "ユーザー一覧 (オフライン)";
|
||||
// Chat participants
|
||||
"room_participants_title" = "参加者";
|
||||
"room_participants_add_participant" = "参加者を追加";
|
||||
@@ -172,7 +172,7 @@
|
||||
"room_participants_action_section_devices" = "セッション一覧";
|
||||
"room_participants_action_section_other" = "オプション";
|
||||
"room_participants_action_invite" = "招待";
|
||||
"room_participants_action_leave" = "このルームを出る";
|
||||
"room_participants_action_leave" = "このルームを退出";
|
||||
"room_participants_action_remove" = "このルームから削除";
|
||||
"room_participants_action_ban" = "このルームからブロック";
|
||||
"room_participants_action_unban" = "ブロックを解除";
|
||||
@@ -208,7 +208,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" = "メッセージへのリンクをコピー";
|
||||
@@ -332,7 +332,7 @@
|
||||
"room_details_low_priority_tag" = "低優先度";
|
||||
"room_details_mute_notifs" = "発言があっても通知しない";
|
||||
"room_details_direct_chat" = "対話";
|
||||
"room_details_access_section" = "ルームにアクセスできる人";
|
||||
"room_details_access_section" = "このルームにアクセスできる人は?";
|
||||
"room_details_access_section_invited_only" = "招待された人のみ";
|
||||
"room_details_access_section_anyone_apart_from_guest" = "ルームのリンクを知っている人なら誰でも(ゲストユーザーを除く)";
|
||||
"room_details_access_section_anyone" = "ルームのリンクを知っている人なら誰でも(ゲストユーザーを含む)";
|
||||
@@ -541,7 +541,7 @@
|
||||
"deactivate_account_forget_messages_information_part3" = ":これは将来のユーザーに会話の不完全なビューが表示される)";
|
||||
"deactivate_account_validate_action" = "無効なアカウント";
|
||||
"deactivate_account_password_alert_title" = "無効なアカウント";
|
||||
"deactivate_account_password_alert_message" = "続行するには、パスワードを入力してください";
|
||||
"deactivate_account_password_alert_message" = "続行するには、Matrix アカウントのパスワードを入力してください";
|
||||
// Re-request confirmation dialog
|
||||
"rerequest_keys_alert_title" = "要求が送信されました";
|
||||
"rerequest_keys_alert_message" = "鍵をこのセッションに送信できるように、メッセージを復号化できる他の端末で%@を起動してください。";
|
||||
@@ -565,12 +565,12 @@
|
||||
|
||||
"room_info_list_one_member" = "1人のメンバー";
|
||||
"create_room_placeholder_address" = "#testroom:matrix.org";
|
||||
"create_room_section_header_address" = "ルームのアドレス";
|
||||
"create_room_show_in_directory" = "このルームを一覧に掲載";
|
||||
"create_room_section_header_address" = "アドレス";
|
||||
"create_room_show_in_directory" = "ルーム一覧に掲載";
|
||||
"create_room_section_footer_type" = "非公開のルームは、ルームに招待された人のみ参加できます。";
|
||||
"create_room_type_public" = "公開ルーム (誰でも参加可能)";
|
||||
"create_room_type_private" = "非公開ルーム (招待者のみ参加可能)";
|
||||
"create_room_section_header_type" = "ルームの種類";
|
||||
"create_room_section_header_type" = "アクセスできる人";
|
||||
"create_room_section_footer_encryption" = "暗号化はあとから無効にすることはできません。";
|
||||
"create_room_section_header_encryption" = "ルームの暗号化";
|
||||
"create_room_placeholder_topic" = "トピック";
|
||||
@@ -674,7 +674,7 @@
|
||||
"room_details_access_section_directory_toggle_for_dm" = "ルーム一覧に掲載";
|
||||
"room_details_access_section_anyone_apart_from_guest_for_dm" = "リンクを知っている人なら誰でも(ゲストユーザーを除く)";
|
||||
"room_details_access_section_anyone_for_dm" = "リンクを知っている人なら誰でも(ゲストユーザーを含む)";
|
||||
"room_details_access_section_for_dm" = "誰がアクセスできますか?";
|
||||
"room_details_access_section_for_dm" = "これにアクセスできる人は?";
|
||||
"room_details_photo_for_dm" = "写真";
|
||||
"room_details_integrations" = "インテグレーション";
|
||||
"room_details_search" = "ルーム内検索";
|
||||
@@ -707,7 +707,7 @@
|
||||
"settings_key_backup_info_version" = "鍵のバックアップのバージョン:%@";
|
||||
"settings_key_backup_info_none" = "あなたの鍵は、このセッションからバックアップされていません。";
|
||||
"settings_key_backup_info_checking" = "確認しています…";
|
||||
"settings_add_3pid_password_message" = "続けるにはパスワードを入力してください";
|
||||
"settings_add_3pid_password_message" = "続行するには、Matrix アカウントのパスワードを入力してください";
|
||||
"settings_add_3pid_invalid_password_message" = "無効な認証情報";
|
||||
"settings_add_3pid_password_title_email" = "メールアドレスを追加";
|
||||
"settings_integrations_allow_description" = "インテグレーションマネージャー(%@)を使用して、ボット、ブリッジ、ウィジェット、ステッカーパックを管理します。\n\n設定データを受け取り、お客様に代わってウィジェットの変更、ルーム招待の送信、権限の設定を行うことができます。";
|
||||
@@ -735,7 +735,7 @@
|
||||
"room_participants_action_security_status_warning" = "警告";
|
||||
"room_participants_action_security_status_complete_security" = "セキュリティーを確認";
|
||||
"room_participants_action_security_status_verify" = "認証";
|
||||
"room_participants_action_security_status_verified" = "認証済";
|
||||
"room_participants_action_security_status_verified" = "検証済み";
|
||||
"room_participants_action_section_security" = "セキュリティー";
|
||||
"room_participants_start_new_chat_error_using_user_email_without_identity_server" = "IDサーバーが設定されていないため、メールアドレスを使って連絡先とチャットを開始することができません。";
|
||||
"room_participants_filter_room_members_for_dm" = "メンバーを検索";
|
||||
@@ -870,7 +870,7 @@
|
||||
"user_verification_session_details_additional_information_untrusted_other_user" = "ユーザーがこのセッションを信頼するまでは、セッションとの間で送受信されるメッセージには警告が表示されます。また、手動で認証することもできます。";
|
||||
"user_verification_session_details_information_untrusted_other_user" = " 新しいセッションを使ってサインインしました:";
|
||||
"user_verification_session_details_information_untrusted_current_user" = "このセッションを認証することで、信頼できるものとしてマークし、暗号化されたメッセージへのアクセスを許可します。";
|
||||
"user_verification_session_details_information_trusted_other_user_part2" = " 認証済:";
|
||||
"user_verification_session_details_information_trusted_other_user_part2" = " 検証済み:";
|
||||
"user_verification_session_details_information_trusted_other_user_part1" = "このセッションは安全なものとして信頼されています。なぜなら ";
|
||||
"user_verification_session_details_information_trusted_current_user" = "このセッションは、認証されたため安全なものとして信頼されています。";
|
||||
"user_verification_session_details_untrusted_title" = "信頼されていません";
|
||||
@@ -928,7 +928,7 @@
|
||||
|
||||
"key_verification_incoming_request_incoming_alert_message" = "%@は認証を要求しています";
|
||||
"key_verification_tile_conclusion_warning_title" = "信頼されていないサインイン";
|
||||
"key_verification_tile_conclusion_done_title" = "認証済";
|
||||
"key_verification_tile_conclusion_done_title" = "検証済み";
|
||||
"key_verification_tile_request_incoming_approval_decline" = "却下";
|
||||
"key_verification_tile_request_incoming_approval_accept" = "承認";
|
||||
"key_verification_tile_request_status_accepted" = "あなたは承認しました";
|
||||
@@ -1283,7 +1283,7 @@
|
||||
"room_event_encryption_info_device_id" = "ID\n";
|
||||
"room_event_encryption_info_device_verification" = "認証\n";
|
||||
"room_event_encryption_info_device_fingerprint" = "Ed25519 fingerprint\n";
|
||||
"room_event_encryption_info_device_verified" = "認証済";
|
||||
"room_event_encryption_info_device_verified" = "検証済み";
|
||||
"room_event_encryption_info_device_not_verified" = "認証されていない";
|
||||
"room_event_encryption_info_device_blocked" = "ブラックリストに載せた";
|
||||
"room_event_encryption_info_verify" = "認証しています…";
|
||||
@@ -1512,7 +1512,7 @@
|
||||
"notice_room_invite_by_you" = "%@を招待しました";
|
||||
"notice_room_invite_you" = "%@があなたを招待しました";
|
||||
"notice_room_join_by_you" = "参加しました";
|
||||
"notice_room_leave_by_you" = "退出しました";
|
||||
"notice_room_leave_by_you" = "あなたが退出しました";
|
||||
"notice_room_kick_by_you" = "%@をキックしました";
|
||||
"notice_room_unban_by_you" = "%@のブロックを解除しました";
|
||||
"notice_room_ban_by_you" = "%@をブロックしました";
|
||||
@@ -1587,7 +1587,7 @@
|
||||
"biometrics_usage_reason" = "アプリを開くには認証が必要です";
|
||||
"settings_sending_media" = "画像と動画の送信";
|
||||
"invite_friends_share_text" = "%@ での連絡先: %@";
|
||||
"side_menu_action_invite_friends" = "招待する";
|
||||
"side_menu_action_invite_friends" = "友だちを招待する";
|
||||
"call_more_actions_change_audio_device" = "オーディオデバイスを変更";
|
||||
"call_more_actions_dialpad" = "ダイヤルパッド";
|
||||
"onboarding_splash_login_button_title" = "既にアカウントを持っています";
|
||||
@@ -1656,7 +1656,7 @@
|
||||
"space_topic" = "説明文";
|
||||
"spaces_creation_cancel_message" = "進捗状況は失われます。";
|
||||
"spaces_creation_cancel_title" = "スペースの作成を停止しますか?";
|
||||
"create_room_section_footer_type_private" = "招待した人のみが検索や参加できます。";
|
||||
"create_room_section_footer_type_private" = "招待した人のみが検索・参加できます。";
|
||||
|
||||
// MARK: - Searchable Directory View Controller
|
||||
|
||||
@@ -1668,3 +1668,128 @@
|
||||
// MARK: Sign out warning
|
||||
|
||||
"sign_out_existing_key_backup_alert_title" = "サインアウトしてよろしいですか?";
|
||||
"find_your_contacts_message" = "%@ であなたの連絡先を表示し、知人とのチャットを素早く始めます。";
|
||||
"find_your_contacts_footer" = "この設定はいつでも無効にできます";
|
||||
"find_your_contacts_button_title" = "連絡先を検索する";
|
||||
"find_your_contacts_title" = "連絡先をリストアップする";
|
||||
|
||||
// Mark: - Room avatar view
|
||||
|
||||
"room_avatar_view_accessibility_label" = "アバター";
|
||||
|
||||
// MARK: - Invite friends
|
||||
|
||||
"invite_friends_action" = "友だちを %@ に招待する";
|
||||
"call_transfer_error_title" = "エラー";
|
||||
"home_context_menu_mark_as_read" = "既読にする";
|
||||
"home_context_menu_normal_priority" = "通常優先度";
|
||||
"home_context_menu_low_priority" = "低優先度";
|
||||
"home_context_menu_unmute" = "ミュート解除";
|
||||
"home_context_menu_mute" = "ミュート";
|
||||
|
||||
// MARK: - Call Transfer
|
||||
"call_transfer_title" = "転送";
|
||||
"room_info_back_button_title" = "ルーム情報";
|
||||
"create_room_processing" = "ルーム作成中";
|
||||
"call_transfer_users" = "ユーザー";
|
||||
"home_context_menu_notifications" = "通知";
|
||||
"home_context_menu_make_dm" = "連絡先に移動";
|
||||
"home_context_menu_make_room" = "ルームに移動";
|
||||
"leave_space_title" = "%@ を退出";
|
||||
"room_participants_leave_success" = "ルームを退出しました";
|
||||
"room_participants_leave_processing" = "退出中";
|
||||
"event_formatter_group_call_leave" = "退出";
|
||||
"home_context_menu_leave" = "退出";
|
||||
|
||||
// Mark: Leave space
|
||||
|
||||
"leave_space_action" = "スペースを退出";
|
||||
"leave_space_selection_title" = "ルームを選択";
|
||||
"create_room_section_footer_type_restricted" = "誰でもスペース名で検索・参加できます。";
|
||||
"create_room_suggest_room" = "スペースメンバーにおすすめ";
|
||||
"create_room_show_in_directory_footer" = "他の人が検索・参加できるようになります。";
|
||||
"create_room_promotion_header" = "PR";
|
||||
"searchable_directory_search_placeholder" = "名前または ID";
|
||||
"room_suggestion_settings_screen_title" = "スペースにおすすめのルームを作成";
|
||||
"room_suggestion_settings_screen_message" = "おすすめのルームは、スペースメンバーに参加を推奨するものとして PR されます。";
|
||||
|
||||
// Room suggestion Settings
|
||||
"room_suggestion_settings_screen_nav_title" = "おすすめのルーム";
|
||||
"room_details_promote_room_suggest_title" = "スペースメンバーへのおすすめ";
|
||||
"settings_default" = "デフォルトの通知";
|
||||
"pin_protection_reset_alert_action_reset" = "リセット";
|
||||
"authentication_recaptcha_title" = "あなたは人間ですか?";
|
||||
"authentication_verify_msisdn_waiting_button" = "コードを再送信";
|
||||
"authentication_choose_password_submit_button" = "パスワードをリセット";
|
||||
"authentication_choose_password_signout_all_devices" = "全ての端末からサインアウト";
|
||||
"authentication_choose_password_text_field_placeholder" = "新しいパスワード";
|
||||
"authentication_terms_title" = "プライバシーポリシー";
|
||||
"authentication_verify_msisdn_text_field_placeholder" = "電話番号";
|
||||
"password_validation_error_contain_symbol" = "記号を含める";
|
||||
"password_validation_error_contain_number" = "数字を含める";
|
||||
"password_validation_error_contain_uppercase_letter" = "大文字を含める";
|
||||
"password_validation_error_contain_lowercase_letter" = "小文字を含める";
|
||||
/* The placeholder will show a number */
|
||||
"password_validation_error_max_length" = "%d 文字以下";
|
||||
/* The placeholder will show a number */
|
||||
"password_validation_error_min_length" = "%d 文字以上";
|
||||
|
||||
// MARK: Password Validation
|
||||
"password_validation_info_header" = "以下の条件を満たすパスワードを設定してください:";
|
||||
"space_selector_empty_view_title" = "まだスペースがありません";
|
||||
"all_chats_empty_list_placeholder_title" = "未読はありません";
|
||||
"all_chats_empty_unreads_placeholder_message" = "未読のメッセージがある場合は、ここに表示されます。";
|
||||
"room_notifs_settings_account_settings" = "アカウント設定";
|
||||
"room_access_settings_screen_upgrade_alert_upgrading" = "ルームをアップグレードしています";
|
||||
"room_access_settings_screen_upgrade_alert_upgrade_button" = "アップグレード";
|
||||
"room_access_settings_screen_edit_spaces" = "スペースを編集";
|
||||
"room_access_settings_screen_upgrade_required" = "アップグレードが必要";
|
||||
"room_access_settings_screen_upgrade_alert_title" = "ルームをアップグレード";
|
||||
"room_access_settings_screen_public_message" = "誰でも検索・参加できます。";
|
||||
"room_access_settings_screen_private_message" = "招待された人だけが検索・参加できます。";
|
||||
"room_access_settings_screen_message" = "誰が %@ を検索・参加できるか選択してください。";
|
||||
"space_settings_access_section" = "このスペースにアクセスできる人は?";
|
||||
"room_access_settings_screen_title" = "このルームにアクセスできる人は?";
|
||||
"room_notifs_settings_none" = "なし";
|
||||
|
||||
// Room Notification Settings
|
||||
"room_notifs_settings_notify_me_for" = "以下の場合に通知";
|
||||
"room_details_access_row_title" = "アクセス";
|
||||
"room_details_notifs" = "通知";
|
||||
"location_sharing_invalid_power_level_title" = "ライブ現在地共有に必要な権限がありません";
|
||||
"settings_labs_enable_live_location_sharing" = "ライブ現在地共有 - 現在地を共有します (開発中の機能、位置情報が一時的にルームの履歴に残ります)";
|
||||
"event_formatter_message_deleted" = "削除済みのメッセージ";
|
||||
"home_context_menu_unfavourite" = "お気に入りから削除";
|
||||
"home_context_menu_favourite" = "お気に入り";
|
||||
"all_chats_user_menu_settings" = "ユーザー設定";
|
||||
"all_chats_edit_layout_show_filters" = "フィルターを表示";
|
||||
"all_chats_edit_layout_show_recents" = "最近使用したものを表示";
|
||||
"all_chats_edit_layout_alphabetical_order" = "A-Z で並び替え";
|
||||
"all_chats_edit_layout_activity_order" = "アクティビティで並び替え";
|
||||
"space_selector_create_space" = "スペースを作成";
|
||||
"space_selector_empty_view_information" = "スペースは、ルームや連絡先をグループ化する方法です。以下からスペースを作成できます。";
|
||||
"all_chats_all_filter" = "全て";
|
||||
"all_chats_edit_layout_recents" = "最近";
|
||||
"all_chats_edit_layout_unreads" = "未読";
|
||||
"all_chats_section_title" = "チャット";
|
||||
|
||||
// Mark: - All Chats
|
||||
|
||||
"all_chats_title" = "全てのチャット";
|
||||
"location_sharing_live_loading" = "ライブ現在地共有を読み込み中...";
|
||||
"location_sharing_live_list_item_stop_sharing_action" = "停止";
|
||||
"location_sharing_live_list_item_current_user_display_name" = "あなた";
|
||||
"live_location_sharing_banner_stop" = "停止";
|
||||
"live_location_sharing_ended" = "ライブ現在地共有が終了";
|
||||
"live_location_sharing_banner_title" = "ライブ現在地共有が有効";
|
||||
"location_sharing_invalid_authorization_settings" = "設定";
|
||||
|
||||
// MARK: Live location sharing
|
||||
|
||||
"location_sharing_live_share_title" = "ライブ現在地共有";
|
||||
"service_terms_modal_decline_button" = "拒否する";
|
||||
"service_terms_modal_accept_button" = "同意する";
|
||||
"service_terms_modal_description_identity_server" = "この操作により、端末の連絡先にあなたの電話番号や電子メールを保存している人があなたを検索できるようになります。";
|
||||
|
||||
// Service terms
|
||||
"service_terms_modal_title_message" = "続行するには、以下の利用規約に同意してください";
|
||||
|
||||
@@ -2230,7 +2230,7 @@
|
||||
"settings_labs_enable_auto_report_decryption_errors" = "Auto Reportar Erros de Decriptação";
|
||||
"room_preview_decline_invitation_options" = "Você quer declinar o convite ou ignorar esta(e) usuária(o)?";
|
||||
"threads_beta_cancel" = "Não agora";
|
||||
"threads_beta_enable" = "Teste aí";
|
||||
"threads_beta_enable" = "Experimentar";
|
||||
"threads_beta_information_link" = "Saber mais";
|
||||
"threads_beta_information" = "Mantenha discussões organizadas com threads.\n\nThreads ajudam manter suas conversas em-tópico e fáceis de rastrear. ";
|
||||
"threads_beta_title" = "Threads";
|
||||
@@ -2446,12 +2446,12 @@
|
||||
// Mark: - Room invites
|
||||
|
||||
"room_invites_empty_view_title" = "Nada novo.";
|
||||
"all_chats_onboarding_try_it" = "Testa aí";
|
||||
"all_chats_onboarding_try_it" = "Experimentar";
|
||||
"all_chats_onboarding_title" = "O que tem de novo";
|
||||
"all_chats_onboarding_page_message3" = "Toque em seu perfil para nos deixar sabendo do que você acha.";
|
||||
"all_chats_onboarding_page_title3" = "Dar Feedback";
|
||||
"all_chats_onboarding_page_message2" = "Acesse seus Espaços (esquerdo fundo) mais rápido e fácil que jamais antes.";
|
||||
"all_chats_onboarding_page_title2" = "Acessar Espaços";
|
||||
"all_chats_onboarding_page_title3" = "Dê Feedback";
|
||||
"all_chats_onboarding_page_message2" = "Acesse seus Espaços (esquerda fundo) mais rápido e fácil que jamais antes.";
|
||||
"all_chats_onboarding_page_title2" = "Acesse Espaços";
|
||||
"all_chats_onboarding_page_message1" = "Para simplificar seu Element, abas são agora opcionais. Gerencie-as usando o menu direito topo.";
|
||||
"all_chats_onboarding_page_title1" = "Boas vindas a uma nova visão!";
|
||||
"all_chats_nothing_found_placeholder_message" = "Tente ajustar sua pesquisa.";
|
||||
@@ -2466,3 +2466,25 @@
|
||||
// User sessions management
|
||||
"user_sessions_settings" = "Gerenciar sessões";
|
||||
"invite_to" = "Convidar para %@";
|
||||
"device_name_unknown" = "Cliente desconhecido";
|
||||
"device_name_mobile" = "%@ Mobile";
|
||||
"device_name_web" = "%@ Web";
|
||||
"device_name_desktop" = "%@ Desktop";
|
||||
"user_session_item_details" = "%@ · Última atividade %@";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
"user_session_unverified_additional_info" = "Verifique sua sessão atual para mensageria segura melhorada.";
|
||||
"user_session_verified_additional_info" = "Sua sessão atual está pronta para mensageria segura.";
|
||||
"user_session_learn_more" = "Saber mais";
|
||||
"user_session_view_details" = "Visualizar detalhes";
|
||||
"user_session_verify_action" = "Verificar sessão";
|
||||
"user_session_unverified_short" = "Não-verificada";
|
||||
"user_session_verified_short" = "Verificada";
|
||||
"user_session_unverified" = "Sessão não-verificada";
|
||||
"user_session_verified" = "Sessão verificada";
|
||||
"user_sessions_overview_current_session_section_title" = "SESSÃO ATUAL";
|
||||
"user_sessions_overview_other_sessions_section_info" = "Para melhor segurança, verifique suas sessões e faça signout de qualquer sessão que você não reconhece ou usa mais.";
|
||||
"user_sessions_overview_other_sessions_section_title" = "OUTRAS SESSÕES";
|
||||
"settings_labs_enable_new_app_layout" = "Novo Layout de Aplicativo";
|
||||
"room_first_message_placeholder" = "Envie sua primeira mensagem…";
|
||||
|
||||
@@ -2688,3 +2688,25 @@
|
||||
// User sessions management
|
||||
"user_sessions_settings" = "Spravovať relácie";
|
||||
"invite_to" = "Pozvať do %@";
|
||||
"device_name_web" = "%@ Web";
|
||||
"device_name_unknown" = "Neznámy klient";
|
||||
"device_name_mobile" = "%@ Mobil";
|
||||
"device_name_desktop" = "%@ Stolný počítač";
|
||||
"user_session_item_details" = "%@ · Posledná aktivita %@";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
"user_session_unverified_additional_info" = "Overte svoju aktuálnu reláciu pre vylepšené bezpečné zasielanie správ.";
|
||||
"user_session_verified_additional_info" = "Vaša aktuálna relácia je pripravená na bezpečné zasielanie správ.";
|
||||
"user_session_learn_more" = "Zistiť viac";
|
||||
"user_session_view_details" = "Zobraziť podrobnosti";
|
||||
"user_session_verify_action" = "Overiť reláciu";
|
||||
"user_session_unverified_short" = "Neoverené";
|
||||
"user_session_verified_short" = "Overené";
|
||||
"user_session_unverified" = "Neoverená relácia";
|
||||
"user_session_verified" = "Overená relácia";
|
||||
"user_sessions_overview_current_session_section_title" = "AKTUÁLNA RELÁCIA";
|
||||
"user_sessions_overview_other_sessions_section_info" = "V záujme čo najlepšieho zabezpečenia overte svoje relácie a odhláste sa z každej relácie, ktorú už nepoznáte alebo nepoužívate.";
|
||||
"user_sessions_overview_other_sessions_section_title" = "OSTATNÉ RELÁCIE";
|
||||
"settings_labs_enable_new_app_layout" = "Nové usporiadanie aplikácie";
|
||||
"room_first_message_placeholder" = "Pošlite svoju prvú správu…";
|
||||
|
||||
@@ -1908,6 +1908,32 @@
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
<br/><br/>
|
||||
</li>
|
||||
<li>
|
||||
<b>DeviceKit</b> (<a href="https://github.com/devicekit/DeviceKit">https://github.com/devicekit/DeviceKit</a>)
|
||||
<br/><br/>
|
||||
MIT License
|
||||
<br/><br/>
|
||||
Copyright (c) 2015 Dennis Weissmann
|
||||
<br/><br/>
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
<br/><br/>
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
<br/><br/>
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
<br/><br/>
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -227,7 +227,7 @@
|
||||
"room_directory_no_public_room" = "Загальнодоступних кімнат немає";
|
||||
"settings_security" = "БЕЗПЕКА";
|
||||
"settings_pin_rooms_with_missed_notif" = "Приколоти кімнати із пропущеними сповіщеннями";
|
||||
"settings_global_settings_info" = "Глобальні налаштування сповіщень доступні у вашому %@ веб-клієнті";
|
||||
"settings_global_settings_info" = "Глобальні налаштування сповіщень доступні у вашому %@ вебклієнті";
|
||||
"settings_enable_push_notif" = "Сповіщення на цьому пристрої";
|
||||
"settings_fail_to_update_profile" = "Не вдалося оновити профіль";
|
||||
"settings_night_mode" = "Нічний режим";
|
||||
@@ -684,7 +684,7 @@
|
||||
"space_beta_announce_badge" = "БЕТА";
|
||||
"space_beta_announce_title" = "Простори скоро з'являться";
|
||||
"space_beta_announce_subtitle" = "Нова версія спільнот";
|
||||
"space_beta_announce_information" = "Простори — це новий спосіб об'єднати кімнати та людей. Їх ще не додано на iOS, але ви вже можете користуватися ними у вебпереглядачі та на комп'ютері.";
|
||||
"space_beta_announce_information" = "Простори — це новий спосіб об'єднати кімнати та людей. Їх ще не додано на iOS, але ви вже можете користуватися ними у браузері та на комп'ютері.";
|
||||
|
||||
// No VoIP support
|
||||
"no_voip_title" = "Вхідний виклик";
|
||||
@@ -1066,7 +1066,7 @@
|
||||
"room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Поки жоден сервер ідентифікації не налаштований, ви не можете почати бесіду з кимось за адресою е-пошти.";
|
||||
"find_your_contacts_message" = "Дозвольте %@ показувати ваші контакти, щоб ви могли швидко почати бесіду з тими, кого знаєте найкраще.";
|
||||
"find_your_contacts_title" = "Почніть із переліку своїх контактів";
|
||||
"store_full_description" = "Element — застосунок для листування й співпраці нового покоління:\n\n1. Надає вам контроль над збереженням вашої приватності\n2. Дає змогу спілкуватися з будь-ким у мережі Matrix і навіть за її межами, інтегруючись із такими застосунками, як Slack\n3. Оберігає вас від реклами, збору даних, бекдорів і прив'язаності до провайдера\n4. Захищає вас наскрізним шифруванням і звіркою інших перехресним підписуванням\n\nElement суттєво відрізняється від інших застосунків для листування й співпраці тим, що децентралізований і має відкритий код.\n\nElement дає змогу самостійно встановити сервер або обрати з-поміж загальнодоступних, щоб ви зберігали приватність своїх даних і розмов, власність і контроль над ними. Він надає вам доступ до відкритої мережі; тож ви можете спілкуватися з користувачами інших застосунків, не лише Element. А ще він добре захищений.\n\nElement здатен на це все завдяки своїй основі Matrix — стандарту відкритого, децентралізованого спілкування.\n\nElement надає вам контроль, даючи змогу обрати, в кого зберігаються ваші розмови. У застосунку Element ви можете обрати між такими шляхами:\n\n1. Зареєструвати безплатний обліковий запис на загальнодоступному сервері matrix.org\n2. Самостійно розмістити свій обліковий запис, встановивши сервер на власному обладнанні\n3. Отримати обліковий запис на виділеному сервері, просто передплативши хостинг-платформу Element Matrix Services\n\nЧому Element?\n\nВОЛОДІЙТЕ СВОЇМИ ДАНИМИ: Ви обираєте, де зберігати свої дані й повідомлення. Ви володієте й керуєте ними, не якась МЕГАКОРПОРАЦІЯ, що аналізує ваші дані й передає їх стороннім особам.\n\nВІДКРИТЕ ЛИСТУВАННЯ Й СПІВПРАЦЯ: Можете розмовляти з будь-ким іншим у мережі Matrix незалежно від того, використовують вони Element, інший застосунок Matrix чи навіть сторонню систему листування на зразок Slack, IRC чи XMPP.\n\nНАДБЕЗПЕКА: Справжнє наскрізне шифрування (лише учасники розмови можуть розшифрувати повідомлення) й звірка пристроїв учасників розмови перехресним підписуванням.\n\nДОСКОНАЛЕ СПІЛКУВАННЯ: Листуйтеся, робіть голосові й відеовиклики, діліться файлами, транслюйте екран, підʼєднуйте різноманітні інтеграції, ботів і віджети. Розбудовуйте кімнати, спільноти, будьте на звʼязку й досягайте цілей.\n\nСКРІЗЬ, ДЕ ВИ: Будьте на зв'язку, де б ви не були, завдяки повній синхронізації історії повідомлень між усіма вашим пристроями та онлайн-клієнтом https://app.element.io.";
|
||||
"store_full_description" = "Element — застосунок для листування й співпраці нового покоління:\n\n1. Надає вам контроль над збереженням вашої приватності\n2. Дає змогу спілкуватися з будь-ким у мережі Matrix і навіть за її межами, інтегруючись із такими застосунками, як Slack\n3. Оберігає вас від реклами, збору даних, бекдорів і прив'язаності до провайдера\n4. Захищає вас наскрізним шифруванням і звіркою інших перехресним підписуванням\n\nElement суттєво відрізняється від інших застосунків для листування й співпраці тим, що децентралізований і має відкритий код.\n\nElement дає змогу самостійно встановити сервер або обрати з-поміж загальнодоступних, щоб ви зберігали приватність своїх даних і розмов, власність і контроль над ними. Він надає вам доступ до відкритої мережі; тож ви можете спілкуватися з користувачами інших застосунків, не лише Element. А ще він добре захищений.\n\nElement здатен на це все завдяки своїй основі Matrix — стандарту відкритого, децентралізованого спілкування.\n\nElement надає вам контроль, даючи змогу обрати, в кого зберігаються ваші розмови. У застосунку Element ви можете обрати між такими шляхами:\n\n1. Зареєструвати безплатний обліковий запис на загальнодоступному сервері matrix.org\n2. Самостійно розмістити свій обліковий запис, встановивши сервер на власному обладнанні\n3. Отримати обліковий запис на виділеному сервері, просто передплативши хостинг-платформу Element Matrix Services\n\nЧому Element?\n\nВОЛОДІЙТЕ СВОЇМИ ДАНИМИ: Ви обираєте, де зберігати свої дані й повідомлення. Ви володієте й керуєте ними, не якась МЕГАКОРПОРАЦІЯ, що аналізує ваші дані й передає їх стороннім особам.\n\nВІДКРИТЕ ЛИСТУВАННЯ Й СПІВПРАЦЯ: Можете розмовляти з будь-ким іншим у мережі Matrix незалежно від того, використовують вони Element, інший застосунок Matrix чи навіть сторонню систему листування на зразок Slack, IRC чи XMPP.\n\nНАДБЕЗПЕКА: Справжнє наскрізне шифрування (лише учасники розмови можуть розшифрувати повідомлення) й звірка пристроїв учасників розмови перехресним підписуванням.\n\nДОСКОНАЛЕ СПІЛКУВАННЯ: Листуйтеся, робіть голосові й відеовиклики, діліться файлами, транслюйте екран, підʼєднуйте різноманітні інтеграції, ботів і віджети. Розбудовуйте кімнати, спільноти, будьте на звʼязку й досягайте цілей.\n\nСКРІЗЬ, ДЕ ВИ: Будьте на зв'язку, де б ви не були, завдяки повній синхронізації історії повідомлень між усіма вашими пристроями та вебклієнтом https://app.element.io.";
|
||||
"security_settings_crosssigning_info_not_bootstrapped" = "Перехресне підписування ще не налаштовано.";
|
||||
"security_settings_crosssigning" = "ПЕРЕХРЕСНЕ ПІДПИСУВАННЯ";
|
||||
"security_settings_backup" = "РЕЗЕРВНЕ КОПІЮВАННЯ ПОВІДОМЛЕНЬ";
|
||||
@@ -1386,7 +1386,7 @@
|
||||
"room_intro_cell_information_room_without_topic_sentence2_part2" = " щоб люди знали, про що ця кімната.";
|
||||
"room_intro_cell_information_dm_sentence2" = "У цій розмові лише ви двоє, більше ніхто не може приєднатися.";
|
||||
"room_intro_cell_information_multiple_dm_sentence2" = "У цій розмові лише ви, поки хтось із вас не запросить іще когось приєднатися.";
|
||||
"space_feature_unavailable_subtitle" = "Простори ще не готові на iOS, але доступні у вебпереглядачі та на комп'ютері";
|
||||
"space_feature_unavailable_subtitle" = "Простори ще не готові на iOS, але доступні у браузері та на комп'ютері";
|
||||
"space_feature_unavailable_information" = "Простори — новий спосіб групувати кімнати й людей.\n\nСкоро ми їх допрацюємо. Якщо приєднаєтеся до простору на іншій платформі, всі його кімнати стануть доступні й тут.";
|
||||
|
||||
// Success from secure backup
|
||||
@@ -1408,7 +1408,7 @@
|
||||
"spaces_suggested_room" = "Пропоновано";
|
||||
"room_details_access_section_anyone_for_dm" = "Будь-хто з посиланням, зокрема гості";
|
||||
"spaces_no_room_found_detail" = "Деяких результатів може бути не видно, бо вони закриті й потребують запрошення.";
|
||||
"spaces_no_member_found_detail" = "Шукаєте когось, хто ще не в %@? Запросіть їх вебпереглядачем або комп'ютером.";
|
||||
"spaces_no_member_found_detail" = "Шукаєте когось, хто ще не в %@? Запросіть їх через браузер або комп'ютер.";
|
||||
"spaces_invites_coming_soon_title" = "Запрошення ще в розробці";
|
||||
"spaces_coming_soon_detail" = "Ця можливість ще не втілена, але скоро буде. Поки що можете зробити це в %@ на комп'ютері.";
|
||||
"space_participants_action_remove" = "Вилучити з цього простору";
|
||||
@@ -1560,7 +1560,7 @@
|
||||
"widget_integration_manager_disabled" = "Необхідно увімкнути менеджер інтеграцій у налаштуваннях";
|
||||
"widget_menu_remove" = "Вилучити для всіх";
|
||||
"widget_menu_revoke_permission" = "Відкликати мій доступ";
|
||||
"widget_menu_open_outside" = "Відкрити у переглядачі";
|
||||
"widget_menu_open_outside" = "Відкрити у браузері";
|
||||
"widget_menu_refresh" = "Оновити";
|
||||
"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Додати зараз?";
|
||||
"widget_sticker_picker_no_stickerpacks_alert" = "На разі жоден пакунок наліпок не увімкнено.";
|
||||
@@ -2690,3 +2690,25 @@
|
||||
// User sessions management
|
||||
"user_sessions_settings" = "Керувати сеансами";
|
||||
"invite_to" = "Запросити до %@";
|
||||
"device_name_unknown" = "Невідомий клієнт";
|
||||
"device_name_mobile" = "%@ Мобільний";
|
||||
"device_name_web" = "%@ Браузер";
|
||||
"device_name_desktop" = "%@ Комп'ютер";
|
||||
"user_session_item_details" = "%@ · Остання активність %@";
|
||||
|
||||
// First item is client name and second item is session display name
|
||||
"user_session_name" = "%@: %@";
|
||||
"user_session_unverified_additional_info" = "Звірте свій поточний сеанс для посилення безпеки обміну повідомленнями.";
|
||||
"user_session_verified_additional_info" = "Ваш поточний сеанс готовий до безпечного обміну повідомленнями.";
|
||||
"user_session_learn_more" = "Докладніше";
|
||||
"user_session_view_details" = "Переглянути подробиці";
|
||||
"user_session_verify_action" = "Звірити сеанс";
|
||||
"user_session_unverified_short" = "Не звірений";
|
||||
"user_session_verified_short" = "Звірений";
|
||||
"user_session_unverified" = "Не звірений сеанс";
|
||||
"user_session_verified" = "Звірений сеанс";
|
||||
"user_sessions_overview_current_session_section_title" = "ПОТОЧНИЙ СЕАНС";
|
||||
"user_sessions_overview_other_sessions_section_info" = "Звірте свої сеанси та вийдіть з усіх сеансів, які ви більше не розпізнаєте або не використовуєте для кращої безпеки.";
|
||||
"user_sessions_overview_other_sessions_section_title" = "ІНШІ СЕАНСИ";
|
||||
"settings_labs_enable_new_app_layout" = "Новий вигляд застосунку";
|
||||
"room_first_message_placeholder" = "Надішліть своє перше повідомлення…";
|
||||
|
||||
@@ -107,6 +107,8 @@ internal class Asset: NSObject {
|
||||
internal static let deviceTypeWeb = ImageAsset(name: "device_type_web")
|
||||
internal static let userSessionUnverified = ImageAsset(name: "user_session_unverified")
|
||||
internal static let userSessionVerified = ImageAsset(name: "user_session_verified")
|
||||
internal static let userSessionsInactive = ImageAsset(name: "user_sessions_inactive")
|
||||
internal static let userSessionsUnverified = ImageAsset(name: "user_sessions_unverified")
|
||||
internal static let e2eBlocked = ImageAsset(name: "e2e_blocked")
|
||||
internal static let e2eUnencrypted = ImageAsset(name: "e2e_unencrypted")
|
||||
internal static let e2eWarning = ImageAsset(name: "e2e_warning")
|
||||
|
||||
@@ -247,6 +247,10 @@ public class VectorL10n: NSObject {
|
||||
public static var allChatsTitle: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_title")
|
||||
}
|
||||
/// User menu
|
||||
public static var allChatsUserMenuAccessibilityLabel: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_user_menu_accessibility_label")
|
||||
}
|
||||
/// User settings
|
||||
public static var allChatsUserMenuSettings: String {
|
||||
return VectorL10n.tr("Vector", "all_chats_user_menu_settings")
|
||||
@@ -7379,6 +7383,14 @@ public class VectorL10n: NSObject {
|
||||
public static var settingsLabsEnableNewAppLayout: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_enable_new_app_layout")
|
||||
}
|
||||
/// Record the client name, version, and url to recognise sessions more easily in session manager
|
||||
public static var settingsLabsEnableNewClientInfoFeature: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_enable_new_client_info_feature")
|
||||
}
|
||||
/// New session manager
|
||||
public static var settingsLabsEnableNewSessionManager: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_enable_new_session_manager")
|
||||
}
|
||||
/// Ring for group calls
|
||||
public static var settingsLabsEnableRingingForGroupCalls: String {
|
||||
return VectorL10n.tr("Vector", "settings_labs_enable_ringing_for_group_calls")
|
||||
@@ -8471,6 +8483,66 @@ public class VectorL10n: NSObject {
|
||||
public static var userIdTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_id_title")
|
||||
}
|
||||
/// Name
|
||||
public static var userSessionDetailsApplicationName: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_application_name")
|
||||
}
|
||||
/// Application
|
||||
public static var userSessionDetailsApplicationSectionHeader: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_application_section_header")
|
||||
}
|
||||
/// URL
|
||||
public static var userSessionDetailsApplicationUrl: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_application_url")
|
||||
}
|
||||
/// Version
|
||||
public static var userSessionDetailsApplicationVersion: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_application_version")
|
||||
}
|
||||
/// Browser
|
||||
public static var userSessionDetailsDeviceBrowser: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_device_browser")
|
||||
}
|
||||
/// IP address
|
||||
public static var userSessionDetailsDeviceIpAddress: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_device_ip_address")
|
||||
}
|
||||
/// IP location
|
||||
public static var userSessionDetailsDeviceIpLocation: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_device_ip_location")
|
||||
}
|
||||
/// Model
|
||||
public static var userSessionDetailsDeviceModel: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_device_model")
|
||||
}
|
||||
/// Operating System
|
||||
public static var userSessionDetailsDeviceOs: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_device_os")
|
||||
}
|
||||
/// Device
|
||||
public static var userSessionDetailsDeviceSectionHeader: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_device_section_header")
|
||||
}
|
||||
/// Session ID
|
||||
public static var userSessionDetailsSessionId: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_session_id")
|
||||
}
|
||||
/// Session name
|
||||
public static var userSessionDetailsSessionName: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_session_name")
|
||||
}
|
||||
/// Copy any data by tapping on it and holding it down.
|
||||
public static var userSessionDetailsSessionSectionFooter: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_session_section_footer")
|
||||
}
|
||||
/// Session
|
||||
public static var userSessionDetailsSessionSectionHeader: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_session_section_header")
|
||||
}
|
||||
/// Session details
|
||||
public static var userSessionDetailsTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_session_details_title")
|
||||
}
|
||||
/// %@ · Last activity %@
|
||||
public static func userSessionItemDetails(_ p1: String, _ p2: String) -> String {
|
||||
return VectorL10n.tr("Vector", "user_session_item_details", p1, p2)
|
||||
@@ -8483,6 +8555,26 @@ public class VectorL10n: NSObject {
|
||||
public static func userSessionName(_ p1: String, _ p2: String) -> String {
|
||||
return VectorL10n.tr("Vector", "user_session_name", p1, p2)
|
||||
}
|
||||
/// Current session
|
||||
public static var userSessionOverviewCurrentSessionTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_session_overview_current_session_title")
|
||||
}
|
||||
/// Session details
|
||||
public static var userSessionOverviewSessionDetailsButtonTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_session_overview_session_details_button_title")
|
||||
}
|
||||
/// Session
|
||||
public static var userSessionOverviewSessionTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_session_overview_session_title")
|
||||
}
|
||||
/// Push notifications
|
||||
public static var userSessionPushNotifications: String {
|
||||
return VectorL10n.tr("Vector", "user_session_push_notifications")
|
||||
}
|
||||
/// When turned on, this session will receive push notifications.
|
||||
public static var userSessionPushNotificationsMessage: String {
|
||||
return VectorL10n.tr("Vector", "user_session_push_notifications_message")
|
||||
}
|
||||
/// Unverified session
|
||||
public static var userSessionUnverified: String {
|
||||
return VectorL10n.tr("Vector", "user_session_unverified")
|
||||
@@ -8515,7 +8607,7 @@ public class VectorL10n: NSObject {
|
||||
public static var userSessionViewDetails: String {
|
||||
return VectorL10n.tr("Vector", "user_session_view_details")
|
||||
}
|
||||
/// CURRENT SESSION
|
||||
/// Current session
|
||||
public static var userSessionsOverviewCurrentSessionSectionTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_overview_current_session_section_title")
|
||||
}
|
||||
@@ -8523,10 +8615,34 @@ public class VectorL10n: NSObject {
|
||||
public static var userSessionsOverviewOtherSessionsSectionInfo: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_overview_other_sessions_section_info")
|
||||
}
|
||||
/// OTHER SESSIONS
|
||||
/// Other sessions
|
||||
public static var userSessionsOverviewOtherSessionsSectionTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_overview_other_sessions_section_title")
|
||||
}
|
||||
/// Consider signing out from old sessions (90 days or older) you don’t use anymore.
|
||||
public static var userSessionsOverviewSecurityRecommendationsInactiveInfo: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_overview_security_recommendations_inactive_info")
|
||||
}
|
||||
/// Inactive sessions
|
||||
public static var userSessionsOverviewSecurityRecommendationsInactiveTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_overview_security_recommendations_inactive_title")
|
||||
}
|
||||
/// Improve your account security by following these recommendations.
|
||||
public static var userSessionsOverviewSecurityRecommendationsSectionInfo: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_overview_security_recommendations_section_info")
|
||||
}
|
||||
/// Security recommendations
|
||||
public static var userSessionsOverviewSecurityRecommendationsSectionTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_overview_security_recommendations_section_title")
|
||||
}
|
||||
/// Verify or sign out from unverified sessions.
|
||||
public static var userSessionsOverviewSecurityRecommendationsUnverifiedInfo: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_overview_security_recommendations_unverified_info")
|
||||
}
|
||||
/// Unverified sessions
|
||||
public static var userSessionsOverviewSecurityRecommendationsUnverifiedTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_overview_security_recommendations_unverified_title")
|
||||
}
|
||||
/// Sessions
|
||||
public static var userSessionsOverviewTitle: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_overview_title")
|
||||
@@ -8535,6 +8651,10 @@ public class VectorL10n: NSObject {
|
||||
public static var userSessionsSettings: String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_settings")
|
||||
}
|
||||
/// View all (%d)
|
||||
public static func userSessionsViewAllAction(_ p1: Int) -> String {
|
||||
return VectorL10n.tr("Vector", "user_sessions_view_all_action", p1)
|
||||
}
|
||||
/// If you didn’t sign in to this session, your account may be compromised.
|
||||
public static var userVerificationSessionDetailsAdditionalInformationUntrustedCurrentUser: String {
|
||||
return VectorL10n.tr("Vector", "user_verification_session_details_additional_information_untrusted_current_user")
|
||||
|
||||
@@ -496,12 +496,12 @@ class CallPresenter: NSObject {
|
||||
#if canImport(JitsiMeetSDK)
|
||||
JMCallKitProxy.removeListener(self)
|
||||
|
||||
guard let session = sessions.first else {
|
||||
guard let sessionInfo = sessions.first else {
|
||||
return
|
||||
}
|
||||
|
||||
if let widgetEventsListener = widgetEventsListener {
|
||||
session.removeListener(widgetEventsListener)
|
||||
sessionInfo.removeListener(widgetEventsListener)
|
||||
}
|
||||
widgetEventsListener = nil
|
||||
#endif
|
||||
@@ -872,11 +872,11 @@ extension CallPresenter: JMCallKitListener {
|
||||
|
||||
}
|
||||
|
||||
func providerDidActivateAudioSession(session: AVAudioSession) {
|
||||
func providerDidActivateAudioSession(sessionInfo: AVAudioSession) {
|
||||
|
||||
}
|
||||
|
||||
func providerDidDeactivateAudioSession(session: AVAudioSession) {
|
||||
func providerDidDeactivateAudioSession(sessionInfo: AVAudioSession) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -163,7 +163,15 @@ final class RiotSettings: NSObject {
|
||||
NotificationCenter.default.post(name: RiotSettings.didUpdateLiveLocationSharingActivation, object: self)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Flag indicating if the new session manager is enabled
|
||||
@UserDefault(key: "enableNewSessionManager", defaultValue: false, storage: defaults)
|
||||
var enableNewSessionManager
|
||||
|
||||
/// Flag indicating if the new client information feature is enabled
|
||||
@UserDefault(key: "enableClientInformationFeature", defaultValue: false, storage: defaults)
|
||||
var enableClientInformationFeature
|
||||
|
||||
// MARK: Calls
|
||||
|
||||
/// Indicate if `allowStunServerFallback` settings has been set once.
|
||||
|
||||
@@ -93,6 +93,12 @@ FOUNDATION_EXPORT NSString *const RecentsViewControllerDataReadyNotification;
|
||||
*/
|
||||
@property (nonatomic, weak) RootTabEmptyView *emptyView;
|
||||
|
||||
/**
|
||||
The bottom anchor used to layout `emptyView` in the absence of a FAB.
|
||||
If this value is `nil` the empty view will be anchored to the bottom of its superview.
|
||||
*/
|
||||
@property (nonatomic, weak) NSLayoutYAxisAnchor *emptyViewBottomAnchor;
|
||||
|
||||
/**
|
||||
The screen timer used for analytics if they've been enabled. The default value is nil.
|
||||
*/
|
||||
|
||||
@@ -2226,7 +2226,8 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro
|
||||
[self.view addSubview:emptyView];
|
||||
}
|
||||
|
||||
emptyViewBottomConstraint = [emptyView.bottomAnchor constraintEqualToAnchor:emptyView.superview.bottomAnchor];
|
||||
NSLayoutYAxisAnchor *bottomAnchor = self.emptyViewBottomAnchor ?: emptyView.superview.bottomAnchor;
|
||||
emptyViewBottomConstraint = [emptyView.bottomAnchor constraintEqualToAnchor:bottomAnchor constant:-1]; // 1pt spacing for UIToolbar's divider.
|
||||
|
||||
emptyView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
|
||||
|
||||
@@ -73,14 +73,6 @@ class VectorHostingController: UIHostingController<AnyView> {
|
||||
bottomSheetPreferences?.setup(viewController: self)
|
||||
}
|
||||
|
||||
override func viewWillAppear(_ animated: Bool) {
|
||||
super.viewWillAppear(animated)
|
||||
|
||||
if isNavigationBarHidden {
|
||||
self.navigationController?.isNavigationBarHidden = true
|
||||
}
|
||||
}
|
||||
|
||||
override func viewDidAppear(_ animated: Bool) {
|
||||
super.viewDidAppear(animated)
|
||||
|
||||
@@ -93,6 +85,14 @@ class VectorHostingController: UIHostingController<AnyView> {
|
||||
}
|
||||
}
|
||||
|
||||
override func viewWillLayoutSubviews() {
|
||||
super.viewWillLayoutSubviews()
|
||||
|
||||
if let navigationController = navigationController, navigationController.isNavigationBarHidden != isNavigationBarHidden {
|
||||
navigationController.isNavigationBarHidden = isNavigationBarHidden
|
||||
}
|
||||
}
|
||||
|
||||
override func viewDidLayoutSubviews() {
|
||||
super.viewDidLayoutSubviews()
|
||||
|
||||
|
||||
@@ -370,6 +370,7 @@ class AllChatsCoordinator: NSObject, SplitViewMasterCoordinatorProtocol {
|
||||
button.menu = menu
|
||||
button.showsMenuAsPrimaryAction = true
|
||||
button.autoresizingMask = [.flexibleHeight, .flexibleWidth]
|
||||
button.accessibilityLabel = VectorL10n.allChatsUserMenuAccessibilityLabel
|
||||
view.addSubview(button)
|
||||
self.avatarMenuButton = button
|
||||
|
||||
|
||||
@@ -75,6 +75,23 @@ class AllChatsViewController: HomeViewController {
|
||||
|
||||
private var currentAlert: UIAlertController?
|
||||
|
||||
@IBOutlet private var toolbar: UIToolbar!
|
||||
private var isToolbarHidden: Bool = false {
|
||||
didSet {
|
||||
if isViewLoaded {
|
||||
toolbar.transform = isToolbarHidden ? CGAffineTransform(translationX: 0, y: 2 * toolbarHeight) : .identity
|
||||
self.view.layoutIfNeeded()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func setToolbarHidden(_ isHidden: Bool, animated: Bool) {
|
||||
UIView.animate(withDuration: animated ? 0.3 : 0) {
|
||||
self.isToolbarHidden = isHidden
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - SplitViewMasterViewControllerProtocol
|
||||
|
||||
// References on the currently selected room
|
||||
@@ -91,6 +108,8 @@ class AllChatsViewController: HomeViewController {
|
||||
|
||||
// Tell whether the onboarding screen is preparing.
|
||||
private(set) var isOnboardingInProgress: Bool = false
|
||||
|
||||
private var toolbarHeight: CGFloat = 0
|
||||
|
||||
// MARK: - Lifecycle
|
||||
|
||||
@@ -107,6 +126,9 @@ class AllChatsViewController: HomeViewController {
|
||||
recentsTableView.register(RecentsInvitesTableViewCell.nib, forCellReuseIdentifier: RecentsInvitesTableViewCell.reuseIdentifier)
|
||||
recentsTableView.contentInsetAdjustmentBehavior = .automatic
|
||||
|
||||
toolbarHeight = toolbar.frame.height
|
||||
emptyViewBottomAnchor = toolbar.topAnchor
|
||||
|
||||
updateUI()
|
||||
|
||||
navigationItem.largeTitleDisplayMode = .automatic
|
||||
@@ -122,8 +144,7 @@ class AllChatsViewController: HomeViewController {
|
||||
override func viewWillAppear(_ animated: Bool) {
|
||||
super.viewWillAppear(animated)
|
||||
|
||||
self.navigationController?.isToolbarHidden = false
|
||||
self.navigationController?.toolbar.tintColor = ThemeService.shared().theme.colors.accent
|
||||
self.toolbar.tintColor = ThemeService.shared().theme.colors.accent
|
||||
if self.navigationItem.searchController == nil {
|
||||
self.navigationItem.searchController = searchController
|
||||
}
|
||||
@@ -164,12 +185,6 @@ class AllChatsViewController: HomeViewController {
|
||||
}
|
||||
}
|
||||
|
||||
override func viewWillDisappear(_ animated: Bool) {
|
||||
super.viewWillDisappear(animated)
|
||||
|
||||
self.navigationController?.isToolbarHidden = true
|
||||
}
|
||||
|
||||
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
|
||||
super.viewWillTransition(to: size, with: coordinator)
|
||||
|
||||
@@ -372,8 +387,8 @@ class AllChatsViewController: HomeViewController {
|
||||
|
||||
let scrollPosition = scrollPosition(of: scrollView)
|
||||
|
||||
if !self.recentsTableView.isDragging && scrollPosition == 0 && self.navigationController?.isToolbarHidden == true {
|
||||
self.navigationController?.setToolbarHidden(false, animated: true)
|
||||
if !self.recentsTableView.isDragging && scrollPosition == 0 && self.isToolbarHidden == true {
|
||||
self.setToolbarHidden(false, animated: true)
|
||||
}
|
||||
|
||||
guard self.recentsTableView.isDragging else {
|
||||
@@ -385,8 +400,8 @@ class AllChatsViewController: HomeViewController {
|
||||
}
|
||||
|
||||
let isToolBarHidden: Bool = scrollPosition - initialScrollPosition > 0
|
||||
if isToolBarHidden != self.navigationController?.isToolbarHidden {
|
||||
self.navigationController?.setToolbarHidden(isToolBarHidden, animated: true)
|
||||
if isToolBarHidden != self.isToolbarHidden {
|
||||
self.setToolbarHidden(isToolBarHidden, animated: true)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -494,13 +509,21 @@ class AllChatsViewController: HomeViewController {
|
||||
}
|
||||
|
||||
private func updateToolbar(with menu: UIMenu) {
|
||||
self.navigationController?.isToolbarHidden = false
|
||||
guard isViewLoaded else {
|
||||
return
|
||||
}
|
||||
|
||||
self.isToolbarHidden = false
|
||||
self.update(with: ThemeService.shared().theme)
|
||||
self.setToolbarItems([
|
||||
UIBarButtonItem(image: Asset.Images.allChatsSpacesIcon.image, style: .done, target: self, action: #selector(self.showSpaceSelectorAction(sender: ))),
|
||||
|
||||
let spacesButton = UIBarButtonItem(image: Asset.Images.allChatsSpacesIcon.image, style: .done, target: self, action: #selector(self.showSpaceSelectorAction(sender: )))
|
||||
spacesButton.accessibilityLabel = VectorL10n.spaceSelectorTitle
|
||||
|
||||
self.toolbar.items = [
|
||||
spacesButton,
|
||||
UIBarButtonItem.flexibleSpace(),
|
||||
UIBarButtonItem(image: Asset.Images.allChatsEditIcon.image, menu: menu)
|
||||
], animated: true)
|
||||
]
|
||||
}
|
||||
|
||||
private func showCreateSpace(parentSpaceId: String?) {
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="AllChatsViewController" customModule="Element" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="recentsTableView" destination="orV-HH-88x" id="lgA-2k-pXJ"/>
|
||||
<outlet property="stickyHeadersBottomContainer" destination="EXH-mK-0eB" id="95Y-KP-bwF"/>
|
||||
<outlet property="stickyHeadersBottomContainerHeightConstraint" destination="SNq-Js-N7s" id="vom-iM-s6W"/>
|
||||
<outlet property="toolbar" destination="osO-1z-CZg" id="xRm-cJ-bNi"/>
|
||||
<outlet property="view" destination="iN0-l3-epB" id="NUQ-LI-M61"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
@@ -25,25 +24,24 @@
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</tableView>
|
||||
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EXH-mK-0eB">
|
||||
<rect key="frame" x="0.0" y="667" width="375" height="0.0"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<accessibility key="accessibilityConfiguration" identifier="RecentsVCStickyHeadersBottomContainer"/>
|
||||
<toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="osO-1z-CZg">
|
||||
<rect key="frame" x="0.0" y="623" width="375" height="44"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" id="SNq-Js-N7s"/>
|
||||
<constraint firstAttribute="height" constant="44" id="7k8-Ot-vpH"/>
|
||||
</constraints>
|
||||
</view>
|
||||
<items/>
|
||||
</toolbar>
|
||||
</subviews>
|
||||
<viewLayoutGuide key="safeArea" id="4qf-KS-Fc9"/>
|
||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="orV-HH-88x" secondAttribute="trailing" id="3Np-64-AUe"/>
|
||||
<constraint firstItem="4qf-KS-Fc9" firstAttribute="bottom" secondItem="orV-HH-88x" secondAttribute="bottom" id="Bka-Zz-CEr"/>
|
||||
<constraint firstItem="EXH-mK-0eB" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="bottom" id="Kmg-aC-GOO"/>
|
||||
<constraint firstItem="EXH-mK-0eB" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="S3i-DW-PUB"/>
|
||||
<constraint firstAttribute="trailing" secondItem="EXH-mK-0eB" secondAttribute="trailing" id="bPP-yu-FTa"/>
|
||||
<constraint firstItem="osO-1z-CZg" firstAttribute="trailing" secondItem="4qf-KS-Fc9" secondAttribute="trailing" id="T2o-XM-BgN"/>
|
||||
<constraint firstItem="orV-HH-88x" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="dTn-zC-Axs"/>
|
||||
<constraint firstItem="osO-1z-CZg" firstAttribute="leading" secondItem="4qf-KS-Fc9" secondAttribute="leading" id="mq4-BS-JFN"/>
|
||||
<constraint firstItem="osO-1z-CZg" firstAttribute="bottom" secondItem="4qf-KS-Fc9" secondAttribute="bottom" id="ups-Ek-9Zs"/>
|
||||
<constraint firstItem="orV-HH-88x" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="xMc-15-1wS"/>
|
||||
<constraint firstItem="4qf-KS-Fc9" firstAttribute="bottom" secondItem="orV-HH-88x" secondAttribute="bottom" id="zCp-Ju-dvr"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="140" y="137.18140929535232"/>
|
||||
</view>
|
||||
|
||||
+3
-2
@@ -172,8 +172,9 @@ final class KeyVerificationVerifyByScanningViewModel: KeyVerificationVerifyBySca
|
||||
|
||||
// Remove pending QR code transaction, as we are going to use SAS verification
|
||||
self.removePendingQRCodeTransaction()
|
||||
|
||||
if keyVerificationTransaction is MXSASTransaction == false || keyVerificationTransaction.isIncoming {
|
||||
|
||||
// Check due to legacy implementation of key verification which could pass incorrect type of transaction
|
||||
if keyVerificationTransaction is MXIncomingSASTransaction {
|
||||
MXLog.debug("[KeyVerificationVerifyByScanningViewModel] SAS transaction should be outgoing")
|
||||
self.unregisterTransactionDidStateChangeNotification()
|
||||
self.update(viewState: .error(KeyVerificationVerifyByScanningViewModelError.unknown))
|
||||
|
||||
@@ -209,6 +209,7 @@ extension UserVerificationCoordinator: KeyVerificationManuallyVerifyCoordinatorD
|
||||
self.presenter.toPresentable().dismiss(animated: true) {
|
||||
self.remove(childCoordinator: coordinator)
|
||||
}
|
||||
delegate?.userVerificationCoordinatorDidComplete(self)
|
||||
}
|
||||
|
||||
func keyVerificationManuallyVerifyCoordinatorDidCancel(_ coordinator: KeyVerificationManuallyVerifyCoordinatorType) {
|
||||
|
||||
@@ -77,8 +77,14 @@ final class UserVerificationCoordinatorBridgePresenter: NSObject {
|
||||
} else {
|
||||
userVerificationCoordinator = UserVerificationCoordinator(presenter: self.presenter, session: self.session, userId: self.userId, userDisplayName: self.userDisplayName)
|
||||
}
|
||||
|
||||
userVerificationCoordinator.delegate = self
|
||||
userVerificationCoordinator.start()
|
||||
self.coordinator = userVerificationCoordinator
|
||||
}
|
||||
}
|
||||
|
||||
extension UserVerificationCoordinatorBridgePresenter: UserVerificationCoordinatorDelegate {
|
||||
func userVerificationCoordinatorDidComplete(_ coordinator: UserVerificationCoordinatorType) {
|
||||
delegate?.userVerificationCoordinatorBridgePresenterDelegateDidComplete(self)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,10 +166,11 @@ private extension CMarkNode {
|
||||
private extension String {
|
||||
/// Returns array of URLs detected inside the String.
|
||||
var containedUrls: [NSTextCheckingResult] {
|
||||
guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
|
||||
guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue),
|
||||
let percentEncoded = self.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else {
|
||||
return []
|
||||
}
|
||||
|
||||
return detector.matches(in: self, options: [], range: NSRange(location: 0, length: self.utf16.count))
|
||||
return detector.matches(in: percentEncoded, options: [], range: NSRange(location: 0, length: percentEncoded.utf16.count))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,6 +346,11 @@
|
||||
|
||||
- (void)displayAttachments:(NSArray*)attachmentArray focusOn:(NSString*)eventId
|
||||
{
|
||||
if ([attachmentArray isEqualToArray:attachments] && eventId.length == 0)
|
||||
{
|
||||
// neither the attachments nor the focus changed, can be ignored
|
||||
return;
|
||||
}
|
||||
NSString *currentAttachmentEventId = eventId;
|
||||
NSString *currentAttachmentOriginalFileName = nil;
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#define TABLEVIEW_ROW_CELL_HEIGHT 46
|
||||
#define TABLEVIEW_SECTION_HEADER_HEIGHT 28
|
||||
|
||||
@interface RoomMemberDetailsViewController () <UIGestureRecognizerDelegate, DeviceTableViewCellDelegate, RoomMemberTitleViewDelegate, KeyVerificationCoordinatorBridgePresenterDelegate>
|
||||
@interface RoomMemberDetailsViewController () <UIGestureRecognizerDelegate, DeviceTableViewCellDelegate, RoomMemberTitleViewDelegate, KeyVerificationCoordinatorBridgePresenterDelegate, UserVerificationCoordinatorBridgePresenterDelegate>
|
||||
{
|
||||
RoomMemberTitleView* memberTitleView;
|
||||
|
||||
@@ -449,6 +449,7 @@
|
||||
session:self.mxRoom.mxSession
|
||||
userId:self.mxRoomMember.userId
|
||||
userDisplayName:self.mxRoomMember.displayname];
|
||||
userVerificationCoordinatorBridgePresenter.delegate = self;
|
||||
[userVerificationCoordinatorBridgePresenter start];
|
||||
self.userVerificationCoordinatorBridgePresenter = userVerificationCoordinatorBridgePresenter;
|
||||
}
|
||||
@@ -1345,4 +1346,11 @@
|
||||
keyVerificationCoordinatorBridgePresenter = nil;
|
||||
}
|
||||
|
||||
#pragma mark - UserVerificationCoordinatorBridgePresenterDelegate
|
||||
|
||||
- (void)userVerificationCoordinatorBridgePresenterDelegateDidComplete:(UserVerificationCoordinatorBridgePresenter *)coordinatorBridgePresenter
|
||||
{
|
||||
[self refreshUserEncryptionTrustLevel];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -45,7 +45,7 @@ enum {
|
||||
};
|
||||
|
||||
|
||||
@interface ManageSessionViewController ()
|
||||
@interface ManageSessionViewController () <UserVerificationCoordinatorBridgePresenterDelegate>
|
||||
{
|
||||
// The device to display
|
||||
MXDevice *device;
|
||||
@@ -649,6 +649,7 @@ enum {
|
||||
userId:self.mainSession.myUser.userId
|
||||
userDisplayName:nil
|
||||
deviceId:device.deviceId];
|
||||
userVerificationCoordinatorBridgePresenter.delegate = self;
|
||||
[userVerificationCoordinatorBridgePresenter start];
|
||||
self.userVerificationCoordinatorBridgePresenter = userVerificationCoordinatorBridgePresenter;
|
||||
}
|
||||
@@ -701,4 +702,11 @@ enum {
|
||||
self.reauthenticationCoordinatorBridgePresenter = reauthenticationPresenter;
|
||||
}
|
||||
|
||||
#pragma mark - UserVerificationCoordinatorBridgePresenterDelegate
|
||||
|
||||
- (void)userVerificationCoordinatorBridgePresenterDelegateDidComplete:(UserVerificationCoordinatorBridgePresenter *)coordinatorBridgePresenter
|
||||
{
|
||||
[self reloadDeviceWithCompletion:^{}];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -172,7 +172,9 @@ typedef NS_ENUM(NSUInteger, LABS_ENABLE)
|
||||
LABS_ENABLE_RINGING_FOR_GROUP_CALLS_INDEX = 0,
|
||||
LABS_ENABLE_THREADS_INDEX,
|
||||
LABS_ENABLE_AUTO_REPORT_DECRYPTION_ERRORS,
|
||||
LABS_ENABLE_LIVE_LOCATION_SHARING
|
||||
LABS_ENABLE_LIVE_LOCATION_SHARING,
|
||||
LABS_ENABLE_NEW_SESSION_MANAGER,
|
||||
LABS_ENABLE_NEW_CLIENT_INFO_FEATURE
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSUInteger, SECURITY)
|
||||
@@ -403,7 +405,7 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
|
||||
Section *sectionSecurity = [Section sectionWithTag:SECTION_TAG_SECURITY];
|
||||
[sectionSecurity addRowWithTag:SECURITY_BUTTON_INDEX];
|
||||
|
||||
if (BuildSettings.deviceManagerEnabled)
|
||||
if (RiotSettings.shared.enableNewSessionManager)
|
||||
{
|
||||
// NOTE: Add device manager entry point in the security section atm for debug purpose
|
||||
[sectionSecurity addRowWithTag:DEVICE_MANAGER_INDEX];
|
||||
@@ -595,6 +597,8 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
|
||||
{
|
||||
[sectionLabs addRowWithTag:LABS_ENABLE_LIVE_LOCATION_SHARING];
|
||||
}
|
||||
[sectionLabs addRowWithTag:LABS_ENABLE_NEW_SESSION_MANAGER];
|
||||
[sectionLabs addRowWithTag:LABS_ENABLE_NEW_CLIENT_INFO_FEATURE];
|
||||
sectionLabs.headerTitle = [VectorL10n settingsLabs];
|
||||
if (sectionLabs.hasAnyRows)
|
||||
{
|
||||
@@ -2532,6 +2536,30 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
|
||||
{
|
||||
cell = [self buildLiveLocationSharingCellForTableView:tableView atIndexPath:indexPath];
|
||||
}
|
||||
else if (row == LABS_ENABLE_NEW_SESSION_MANAGER)
|
||||
{
|
||||
MXKTableViewCellWithLabelAndSwitch *labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
|
||||
|
||||
labelAndSwitchCell.mxkLabel.text = [VectorL10n settingsLabsEnableNewSessionManager];
|
||||
labelAndSwitchCell.mxkSwitch.on = RiotSettings.shared.enableNewSessionManager;
|
||||
labelAndSwitchCell.mxkSwitch.onTintColor = ThemeService.shared.theme.tintColor;
|
||||
|
||||
[labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(toggleEnableNewSessionManager:) forControlEvents:UIControlEventTouchUpInside];
|
||||
|
||||
cell = labelAndSwitchCell;
|
||||
}
|
||||
else if (row == LABS_ENABLE_NEW_CLIENT_INFO_FEATURE)
|
||||
{
|
||||
MXKTableViewCellWithLabelAndSwitch *labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath];
|
||||
|
||||
labelAndSwitchCell.mxkLabel.text = [VectorL10n settingsLabsEnableNewClientInfoFeature];
|
||||
labelAndSwitchCell.mxkSwitch.on = RiotSettings.shared.enableClientInformationFeature;
|
||||
labelAndSwitchCell.mxkSwitch.onTintColor = ThemeService.shared.theme.tintColor;
|
||||
|
||||
[labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(toggleEnableNewClientInfoFeature:) forControlEvents:UIControlEventTouchUpInside];
|
||||
|
||||
cell = labelAndSwitchCell;
|
||||
}
|
||||
}
|
||||
else if (section == SECTION_TAG_SECURITY)
|
||||
{
|
||||
@@ -3277,6 +3305,19 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
|
||||
[[AppDelegate theDelegate] restoreEmptyDetailsViewController];
|
||||
}
|
||||
|
||||
- (void)toggleEnableNewSessionManager:(UISwitch *)sender
|
||||
{
|
||||
RiotSettings.shared.enableNewSessionManager = sender.isOn;
|
||||
[self updateSections];
|
||||
}
|
||||
|
||||
- (void)toggleEnableNewClientInfoFeature:(UISwitch *)sender
|
||||
{
|
||||
BOOL isEnabled = sender.isOn;
|
||||
RiotSettings.shared.enableClientInformationFeature = isEnabled;
|
||||
MXSDKOptions.sharedInstance.enableNewClientInformationFeature = isEnabled;
|
||||
}
|
||||
|
||||
- (void)togglePinRoomsWithMissedNotif:(UISwitch *)sender
|
||||
{
|
||||
RiotSettings.shared.pinRoomsWithMissedNotificationsOnHome = sender.isOn;
|
||||
@@ -3702,11 +3743,13 @@ ChangePasswordCoordinatorBridgePresenterDelegate>
|
||||
msisdn = [NSString stringWithFormat:@"+%@", [e164 substringFromIndex:2]];
|
||||
}
|
||||
|
||||
NSString *countryCode = newPhoneNumberCell.isoCountryCode;
|
||||
|
||||
[self showAuthenticationIfNeededForAdding:kMX3PIDMediumMSISDN withSession:session completion:^(NSDictionary *authParams) {
|
||||
[self startActivityIndicator];
|
||||
|
||||
__block MX3PidAddSession *new3Pid;
|
||||
new3Pid = [session.threePidAddManager startAddPhoneNumberSessionWithPhoneNumber:msisdn countryCode:nil success:^{
|
||||
new3Pid = [session.threePidAddManager startAddPhoneNumberSessionWithPhoneNumber:msisdn countryCode:countryCode success:^{
|
||||
|
||||
[self showValidationMsisdnDialogWithMessage:[VectorL10n accountMsisdnValidationMessage] for3PidAddSession:new3Pid threePidAddManager:session.threePidAddManager authenticationParameters:authParams];
|
||||
|
||||
|
||||
@@ -461,8 +461,8 @@ static NSString *const kEventFormatterTimeFormat = @"HH:mm";
|
||||
{
|
||||
calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
|
||||
|
||||
// Use the secondary bg color to set the background color in the default CSS.
|
||||
NSUInteger bgColor = [MXKTools rgbValueWithColor:ThemeService.shared.theme.headerBackgroundColor];
|
||||
// Use the selected bg color to set the code block background color in the default CSS.
|
||||
NSUInteger bgColor = [MXKTools rgbValueWithColor:ThemeService.shared.theme.selectedBackgroundColor];
|
||||
self.defaultCSS = [NSString stringWithFormat:@" \
|
||||
pre,code { \
|
||||
background-color: #%06lX; \
|
||||
|
||||
@@ -24,6 +24,9 @@ schemes:
|
||||
disableMainThreadChecker: true
|
||||
targets:
|
||||
- RiotTests
|
||||
gatherCoverageData: true
|
||||
coverageTargets:
|
||||
- Riot
|
||||
|
||||
targets:
|
||||
Riot:
|
||||
@@ -39,6 +42,7 @@ targets:
|
||||
- package: Mapbox
|
||||
- package: OrderedCollections
|
||||
- package: SwiftOGG
|
||||
- package: DeviceKit
|
||||
|
||||
configFiles:
|
||||
Debug: Debug.xcconfig
|
||||
|
||||
@@ -31,6 +31,9 @@ targets:
|
||||
platform: iOS
|
||||
type: app-extension
|
||||
|
||||
dependencies:
|
||||
- package: DeviceKit
|
||||
|
||||
configFiles:
|
||||
Debug: Debug.xcconfig
|
||||
Release: Release.xcconfig
|
||||
|
||||
@@ -31,6 +31,9 @@ targets:
|
||||
platform: iOS
|
||||
type: app-extension
|
||||
|
||||
dependencies:
|
||||
- package: DeviceKit
|
||||
|
||||
configFiles:
|
||||
Debug: Debug.xcconfig
|
||||
Release: Release.xcconfig
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -14,14 +14,12 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import Combine
|
||||
import SwiftUI
|
||||
|
||||
typealias AnalyticsPromptViewModelType = StateStoreViewModel<AnalyticsPromptViewState, AnalyticsPromptViewAction>
|
||||
|
||||
typealias AnalyticsPromptViewModelType = StateStoreViewModel<AnalyticsPromptViewState,
|
||||
Never,
|
||||
AnalyticsPromptViewAction>
|
||||
class AnalyticsPromptViewModel: AnalyticsPromptViewModelType {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
@@ -22,17 +22,16 @@ struct AnalyticsPromptCoordinatorParameters {
|
||||
}
|
||||
|
||||
final class AnalyticsPromptCoordinator: Coordinator, Presentable {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private let parameters: AnalyticsPromptCoordinatorParameters
|
||||
private let analyticsPromptHostingController: UIViewController
|
||||
private var _analyticsPromptViewModel: Any? = nil
|
||||
private let analyticsPromptHostingController: VectorHostingController
|
||||
private var _analyticsPromptViewModel: Any?
|
||||
|
||||
fileprivate var analyticsPromptViewModel: AnalyticsPromptViewModel {
|
||||
return _analyticsPromptViewModel as! AnalyticsPromptViewModel
|
||||
_analyticsPromptViewModel as! AnalyticsPromptViewModel
|
||||
}
|
||||
|
||||
// MARK: Public
|
||||
@@ -60,6 +59,7 @@ final class AnalyticsPromptCoordinator: Coordinator, Presentable {
|
||||
let view = AnalyticsPrompt(viewModel: viewModel.context)
|
||||
_analyticsPromptViewModel = viewModel
|
||||
analyticsPromptHostingController = VectorHostingController(rootView: view)
|
||||
analyticsPromptHostingController.isNavigationBarHidden = true
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
@@ -84,6 +84,6 @@ final class AnalyticsPromptCoordinator: Coordinator, Presentable {
|
||||
}
|
||||
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.analyticsPromptHostingController
|
||||
analyticsPromptHostingController
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -25,4 +25,3 @@ struct AnalyticsPromptStrings: AnalyticsPromptStringsProtocol {
|
||||
withAllowedTags: ["b", "p"],
|
||||
font: UIFont.systemFont(ofSize: UIFont.systemFontSize))
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import RiotSwiftUI
|
||||
import XCTest
|
||||
|
||||
class AnalyticsPromptUITests: MockScreenTestCase {
|
||||
/// Verify that the prompt is displayed correctly for new users.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -18,7 +18,6 @@ import SwiftUI
|
||||
|
||||
/// A prompt that asks the user whether they would like to enable Analytics or not.
|
||||
struct AnalyticsPrompt: View {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -17,7 +17,6 @@
|
||||
import SwiftUI
|
||||
|
||||
struct AnalyticsPromptCheckmarkItem: View {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
@@ -40,7 +39,7 @@ struct AnalyticsPromptCheckmarkItem: View {
|
||||
let range = NSRange(location: 0, length: attributedString.length)
|
||||
let string = attributedString.string as NSString
|
||||
|
||||
attributedString.enumerateAttributes(in: range, options: []) { attributes, range, stop in
|
||||
attributedString.enumerateAttributes(in: range, options: []) { attributes, range, _ in
|
||||
var isBold = false
|
||||
|
||||
if let font = attributes[.font] as? UIFont {
|
||||
@@ -54,7 +53,7 @@ struct AnalyticsPromptCheckmarkItem: View {
|
||||
}
|
||||
|
||||
init(string: String) {
|
||||
self.components = [StringComponent(string: string, isBold: false)]
|
||||
components = [StringComponent(string: string, isBold: false)]
|
||||
}
|
||||
|
||||
// MARK: - Views
|
||||
@@ -75,11 +74,10 @@ struct AnalyticsPromptCheckmarkItem: View {
|
||||
// MARK: - Previews
|
||||
|
||||
struct AnalyticsPromptCheckmarkItem_Previews: PreviewProvider {
|
||||
|
||||
static let strings = MockAnalyticsPromptStrings()
|
||||
|
||||
static var previews: some View {
|
||||
VStack(alignment:.leading) {
|
||||
VStack(alignment: .leading) {
|
||||
AnalyticsPromptCheckmarkItem(attributedString: strings.point1)
|
||||
AnalyticsPromptCheckmarkItem(attributedString: strings.point2)
|
||||
AnalyticsPromptCheckmarkItem(attributedString: strings.longString)
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
+2
-4
@@ -16,11 +16,9 @@
|
||||
|
||||
import SwiftUI
|
||||
|
||||
typealias AuthenticationChoosePasswordViewModelType = StateStoreViewModel<AuthenticationChoosePasswordViewState,
|
||||
Never,
|
||||
AuthenticationChoosePasswordViewAction>
|
||||
class AuthenticationChoosePasswordViewModel: AuthenticationChoosePasswordViewModelType, AuthenticationChoosePasswordViewModelProtocol {
|
||||
typealias AuthenticationChoosePasswordViewModelType = StateStoreViewModel<AuthenticationChoosePasswordViewState, AuthenticationChoosePasswordViewAction>
|
||||
|
||||
class AuthenticationChoosePasswordViewModel: AuthenticationChoosePasswordViewModelType, AuthenticationChoosePasswordViewModelProtocol {
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
+1
-2
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -17,7 +17,6 @@
|
||||
import Foundation
|
||||
|
||||
protocol AuthenticationChoosePasswordViewModelProtocol {
|
||||
|
||||
var callback: (@MainActor (AuthenticationChoosePasswordViewModelResult) -> Void)? { get set }
|
||||
var context: AuthenticationChoosePasswordViewModelType.Context { get }
|
||||
|
||||
|
||||
+2
-3
@@ -14,8 +14,8 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import CommonKit
|
||||
import SwiftUI
|
||||
|
||||
struct AuthenticationChoosePasswordCoordinatorParameters {
|
||||
let loginWizard: LoginWizard
|
||||
@@ -29,7 +29,6 @@ enum AuthenticationChoosePasswordCoordinatorResult {
|
||||
}
|
||||
|
||||
final class AuthenticationChoosePasswordCoordinator: Coordinator, Presentable {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
@@ -79,7 +78,7 @@ final class AuthenticationChoosePasswordCoordinator: Coordinator, Presentable {
|
||||
}
|
||||
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.authenticationChoosePasswordHostingController
|
||||
authenticationChoosePasswordHostingController
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -34,7 +34,7 @@ enum MockAuthenticationChoosePasswordScreenState: MockScreenState, CaseIterable
|
||||
}
|
||||
|
||||
/// Generate the view struct for the screen state.
|
||||
var screenView: ([Any], AnyView) {
|
||||
var screenView: ([Any], AnyView) {
|
||||
let viewModel: AuthenticationChoosePasswordViewModel
|
||||
switch self {
|
||||
case .emptyPassword:
|
||||
|
||||
+1
-2
@@ -14,8 +14,8 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import RiotSwiftUI
|
||||
import XCTest
|
||||
|
||||
class AuthenticationChoosePasswordUITests: MockScreenTestCase {
|
||||
func testEmptyPassword() {
|
||||
@@ -93,7 +93,6 @@ class AuthenticationChoosePasswordUITests: MockScreenTestCase {
|
||||
XCTAssertTrue(signoutAllDevicesToggle.exists, "Sign out all devices toggle should exist")
|
||||
XCTAssertTrue(signoutAllDevicesToggle.isOn, "Sign out all devices should be checked")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension XCUIElement {
|
||||
|
||||
+1
-3
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -19,7 +19,6 @@ import XCTest
|
||||
@testable import RiotSwiftUI
|
||||
|
||||
class AuthenticationChoosePasswordViewModelTests: XCTestCase {
|
||||
|
||||
@MainActor func testInitialState() async {
|
||||
let viewModel = AuthenticationChoosePasswordViewModel()
|
||||
let context = viewModel.context
|
||||
@@ -29,5 +28,4 @@ class AuthenticationChoosePasswordViewModelTests: XCTestCase {
|
||||
XCTAssert(context.viewState.hasInvalidPassword, "The view model should start with an invalid password.")
|
||||
XCTAssertFalse(context.signoutAllDevices, "The view model should start with sign out of all devices unchecked.")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+2
-3
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -17,7 +17,6 @@
|
||||
import SwiftUI
|
||||
|
||||
struct AuthenticationChoosePasswordScreen: View {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
@@ -100,7 +99,7 @@ struct AuthenticationChoosePasswordScreen: View {
|
||||
configuration: UIKitTextInputConfiguration(returnKeyType: .done,
|
||||
isSecureTextEntry: true),
|
||||
onCommit: submit)
|
||||
.accessibilityIdentifier("passwordTextField")
|
||||
.accessibilityIdentifier("passwordTextField")
|
||||
}
|
||||
|
||||
/// Sends the `send` view action so long as a valid email address has been input.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -37,11 +37,11 @@ extension AuthenticationHomeserverViewData {
|
||||
showLoginForm: true,
|
||||
showRegistrationForm: true,
|
||||
ssoIdentityProviders: [
|
||||
SSOIdentityProvider(id: "1", name: "Apple", brand: "apple", iconURL: nil),
|
||||
SSOIdentityProvider(id: "2", name: "Facebook", brand: "facebook", iconURL: nil),
|
||||
SSOIdentityProvider(id: "3", name: "GitHub", brand: "github", iconURL: nil),
|
||||
SSOIdentityProvider(id: "4", name: "GitLab", brand: "gitlab", iconURL: nil),
|
||||
SSOIdentityProvider(id: "5", name: "Google", brand: "google", iconURL: nil)
|
||||
SSOIdentityProvider(id: "1", name: "Apple", brand: "apple", iconURL: nil),
|
||||
SSOIdentityProvider(id: "2", name: "Facebook", brand: "facebook", iconURL: nil),
|
||||
SSOIdentityProvider(id: "3", name: "GitHub", brand: "github", iconURL: nil),
|
||||
SSOIdentityProvider(id: "4", name: "GitLab", brand: "gitlab", iconURL: nil),
|
||||
SSOIdentityProvider(id: "5", name: "Google", brand: "google", iconURL: nil)
|
||||
])
|
||||
}
|
||||
|
||||
@@ -68,5 +68,4 @@ extension AuthenticationHomeserverViewData {
|
||||
showRegistrationForm: false,
|
||||
ssoIdentityProviders: [])
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -78,7 +78,7 @@ enum LoginError: String, Error {
|
||||
case resetPasswordNotStarted
|
||||
}
|
||||
|
||||
@objcMembers
|
||||
@objcMembers
|
||||
class HomeserverAddress: NSObject {
|
||||
/// Sanitizes a user entered homeserver address with the following rules
|
||||
/// - Trim any whitespace.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -18,7 +18,6 @@ import SwiftUI
|
||||
|
||||
/// A button that displays the icon and name of an SSO provider.
|
||||
struct AuthenticationSSOButton: View {
|
||||
|
||||
// MARK: - Constants
|
||||
|
||||
enum Brand: String {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -19,7 +19,6 @@ import SwiftUI
|
||||
/// A view that shows information about the chosen homeserver,
|
||||
/// along with an edit button to pick a different one.
|
||||
struct AuthenticationServerInfoSection: View {
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
@Environment(\.theme) private var theme
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
+8
-4
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -18,6 +18,7 @@ import Foundation
|
||||
|
||||
protocol AuthenticationRestClient: AnyObject {
|
||||
// MARK: Configuration
|
||||
|
||||
var homeserver: String! { get }
|
||||
var identityServer: String! { get set }
|
||||
var credentials: MXCredentials! { get }
|
||||
@@ -26,24 +27,27 @@ protocol AuthenticationRestClient: AnyObject {
|
||||
init(homeServer: URL, unrecognizedCertificateHandler handler: MXHTTPClientOnUnrecognizedCertificate?)
|
||||
|
||||
// MARK: Login
|
||||
|
||||
var loginFallbackURL: URL { get }
|
||||
func wellKnown() async throws -> MXWellKnown
|
||||
func getLoginSession() async throws -> MXAuthenticationSession
|
||||
func login(parameters: LoginParameters) async throws -> MXCredentials
|
||||
func login(parameters: [String : Any]) async throws -> MXCredentials
|
||||
func login(parameters: [String: Any]) async throws -> MXCredentials
|
||||
|
||||
// MARK: Registration
|
||||
|
||||
var registerFallbackURL: URL { get }
|
||||
func getRegisterSession() async throws -> MXAuthenticationSession
|
||||
func isUsernameAvailable(_ username: String) async throws -> Bool
|
||||
func register(parameters: RegistrationParameters) async throws -> MXLoginResponse
|
||||
func register(parameters: [String : Any]) async throws -> MXLoginResponse
|
||||
func register(parameters: [String: Any]) async throws -> MXLoginResponse
|
||||
func requestTokenDuringRegistration(for threePID: RegisterThreePID, clientSecret: String, sendAttempt: UInt) async throws -> RegistrationThreePIDTokenResponse
|
||||
|
||||
// MARK: Forgot Password
|
||||
|
||||
func forgetPassword(for email: String, clientSecret: String, sendAttempt: UInt) async throws -> String
|
||||
func resetPassword(parameters: CheckResetPasswordParameters) async throws
|
||||
func resetPassword(parameters: [String : Any]) async throws
|
||||
func resetPassword(parameters: [String: Any]) async throws
|
||||
}
|
||||
|
||||
extension MXRestClient: AuthenticationRestClient { }
|
||||
|
||||
+7
-8
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -39,7 +39,6 @@ protocol AuthenticationServiceDelegate: AnyObject {
|
||||
|
||||
@objcMembers
|
||||
class AuthenticationService: NSObject {
|
||||
|
||||
/// The shared service object.
|
||||
static let shared = AuthenticationService()
|
||||
|
||||
@@ -97,7 +96,7 @@ class AuthenticationService: NSObject {
|
||||
let hsUrl = universalLink.homeserverUrl
|
||||
let isUrl = universalLink.identityServerUrl
|
||||
|
||||
if hsUrl == nil && isUrl == nil {
|
||||
if hsUrl == nil, isUrl == nil {
|
||||
MXLog.debug("[AuthenticationService] handleServerProvisioningLink: no hsUrl or isUrl")
|
||||
return false
|
||||
}
|
||||
@@ -166,7 +165,7 @@ class AuthenticationService: NSObject {
|
||||
|
||||
// The state and client are set after trying the registration flow to
|
||||
// ensure the existing state isn't wiped out when an error occurs.
|
||||
self.state = AuthenticationState(flow: flow, homeserver: homeserver)
|
||||
state = AuthenticationState(flow: flow, homeserver: homeserver)
|
||||
self.client = client
|
||||
}
|
||||
|
||||
@@ -200,9 +199,9 @@ class AuthenticationService: NSObject {
|
||||
// completeness revert to the default homeserver if requested anyway.
|
||||
let address = useDefaultServer ? BuildSettings.serverConfigDefaultHomeserverUrlString : state.homeserver.addressFromUser ?? state.homeserver.address
|
||||
let identityServer = state.identityServer
|
||||
self.state = AuthenticationState(flow: .login,
|
||||
homeserverAddress: address,
|
||||
identityServer: identityServer)
|
||||
state = AuthenticationState(flow: .login,
|
||||
homeserverAddress: address,
|
||||
identityServer: identityServer)
|
||||
}
|
||||
|
||||
/// Continues an SSO flow when completion comes via a deep link.
|
||||
@@ -289,7 +288,7 @@ class AuthenticationService: NSObject {
|
||||
|
||||
let identityProviders = loginFlowResponse.flows?.compactMap { $0 as? MXLoginSSOFlow }.first?.identityProviders ?? []
|
||||
return LoginFlowResult(supportedLoginTypes: loginFlowResponse.flows?.compactMap { $0 } ?? [],
|
||||
ssoIdentityProviders: identityProviders.sorted { $0.name < $1.name }.map { $0.ssoIdentityProvider },
|
||||
ssoIdentityProviders: identityProviders.sorted { $0.name < $1.name }.map(\.ssoIdentityProvider),
|
||||
homeserverAddress: client.homeserver)
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -29,7 +29,7 @@ struct AuthenticationState {
|
||||
|
||||
init(flow: AuthenticationFlow, homeserverAddress: String, identityServer: String? = nil) {
|
||||
self.flow = flow
|
||||
self.homeserver = Homeserver(address: homeserverAddress)
|
||||
homeserver = Homeserver(address: homeserverAddress)
|
||||
self.identityServer = identityServer
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ struct AuthenticationState {
|
||||
|
||||
/// Needs authentication fallback for login
|
||||
var needsLoginFallback: Bool {
|
||||
return preferredLoginMode.isUnsupported
|
||||
preferredLoginMode.isUnsupported
|
||||
}
|
||||
|
||||
/// Needs authentication fallback for registration
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -93,4 +93,3 @@ enum LoginMode {
|
||||
struct ResetPasswordData {
|
||||
let addThreePIDSessionID: String
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -110,7 +110,7 @@ struct CheckResetPasswordParameters: DictionaryEncodable {
|
||||
}
|
||||
|
||||
init(clientSecret: String, sessionID: String, newPassword: String, signoutAllDevices: Bool) {
|
||||
self.auth = AuthenticationParameters.resetPasswordParameters(clientSecret: clientSecret, sessionID: sessionID)
|
||||
auth = AuthenticationParameters.resetPasswordParameters(clientSecret: clientSecret, sessionID: sessionID)
|
||||
self.newPassword = newPassword
|
||||
self.signoutAllDevices = signoutAllDevices
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -40,7 +40,7 @@ class LoginWizard {
|
||||
self.client = client
|
||||
self.sessionCreator = sessionCreator
|
||||
|
||||
self.state = State()
|
||||
state = State()
|
||||
}
|
||||
|
||||
/// Login to the homeserver.
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -114,7 +114,7 @@ struct FlowResult {
|
||||
}
|
||||
|
||||
/// Whether fallback registration should be used due to unsupported stages.
|
||||
var needsFallback : Bool {
|
||||
var needsFallback: Bool {
|
||||
missingStages.filter(\.isMandatory).contains { stage in
|
||||
if case .other = stage { return true } else { return false }
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
+3
-4
@@ -63,7 +63,7 @@ class RegistrationWizard {
|
||||
self.client = client
|
||||
self.sessionCreator = sessionCreator
|
||||
|
||||
self.state = State()
|
||||
state = State()
|
||||
}
|
||||
|
||||
/// Call this method to get the possible registration flow of the current homeserver.
|
||||
@@ -164,7 +164,7 @@ class RegistrationWizard {
|
||||
/// Send the code received by SMS to validate a msisdn.
|
||||
/// If the code is correct, the registration request will be executed to validate the msisdn.
|
||||
func handleValidateThreePID(code: String) async throws -> RegistrationResult {
|
||||
return try await validateThreePid(code: code)
|
||||
try await validateThreePid(code: code)
|
||||
}
|
||||
|
||||
/// Useful to poll the homeserver when waiting for the email to be validated by the user.
|
||||
@@ -197,7 +197,6 @@ class RegistrationWizard {
|
||||
throw RegistrationError.missingThreePIDURL
|
||||
}
|
||||
|
||||
|
||||
let validationBody = ThreePIDValidationCodeBody(clientSecret: state.clientSecret,
|
||||
sessionID: threePIDData.registrationResponse.sessionID,
|
||||
code: code)
|
||||
@@ -278,7 +277,7 @@ class RegistrationWizard {
|
||||
/// Checks for a dummy stage and handles it automatically when possible.
|
||||
private func handleDummyStage(flowResult: FlowResult) async throws -> RegistrationResult {
|
||||
// If the dummy stage is mandatory, do the dummy stage now
|
||||
guard flowResult.missingStages.contains(where: { $0.isDummy }) else { return .flowResponse(flowResult) }
|
||||
guard flowResult.missingStages.contains(where: \.isDummy) else { return .flowResponse(flowResult) }
|
||||
return try await dummy()
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -29,7 +29,6 @@ protocol SessionCreatorProtocol {
|
||||
|
||||
/// A struct that provides common functionality to create a new session.
|
||||
struct SessionCreator: SessionCreatorProtocol {
|
||||
|
||||
private let accountManager: MXKAccountManager
|
||||
|
||||
init(withAccountManager accountManager: MXKAccountManager = .shared()) {
|
||||
@@ -44,7 +43,7 @@ struct SessionCreator: SessionCreatorProtocol {
|
||||
}
|
||||
|
||||
if removeOtherAccounts {
|
||||
let otherAccounts = accountManager.accounts.filter({ $0.mxCredentials.userId != credentials.userId })
|
||||
let otherAccounts = accountManager.accounts.filter { $0.mxCredentials.userId != credentials.userId }
|
||||
for account in otherAccounts {
|
||||
accountManager.removeAccount(account, completion: nil)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -53,13 +53,13 @@ struct RegistrationThreePIDTokenResponse {
|
||||
///
|
||||
/// If this field is not present, the client can assume that verification will happen without the client's involvement provided
|
||||
/// the homeserver advertises this specification version in the /versions response (ie: r0.5.0).
|
||||
var submitURL: String? = nil
|
||||
var submitURL: String?
|
||||
|
||||
// MARK: - Additional data that may be needed
|
||||
|
||||
var msisdn: String? = nil
|
||||
var formattedMSISDN: String? = nil
|
||||
var success: Bool? = nil
|
||||
var msisdn: String?
|
||||
var formattedMSISDN: String?
|
||||
var success: Bool?
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case sessionID = "sid"
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
+2
-4
@@ -16,11 +16,9 @@
|
||||
|
||||
import SwiftUI
|
||||
|
||||
typealias AuthenticationForgotPasswordViewModelType = StateStoreViewModel<AuthenticationForgotPasswordViewState,
|
||||
Never,
|
||||
AuthenticationForgotPasswordViewAction>
|
||||
class AuthenticationForgotPasswordViewModel: AuthenticationForgotPasswordViewModelType, AuthenticationForgotPasswordViewModelProtocol {
|
||||
typealias AuthenticationForgotPasswordViewModelType = StateStoreViewModel<AuthenticationForgotPasswordViewState, AuthenticationForgotPasswordViewAction>
|
||||
|
||||
class AuthenticationForgotPasswordViewModel: AuthenticationForgotPasswordViewModelType, AuthenticationForgotPasswordViewModelProtocol {
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
+1
-2
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -17,7 +17,6 @@
|
||||
import Foundation
|
||||
|
||||
protocol AuthenticationForgotPasswordViewModelProtocol {
|
||||
|
||||
var callback: (@MainActor (AuthenticationForgotPasswordViewModelResult) -> Void)? { get set }
|
||||
var context: AuthenticationForgotPasswordViewModelType.Context { get }
|
||||
|
||||
|
||||
+2
-3
@@ -14,8 +14,8 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import CommonKit
|
||||
import SwiftUI
|
||||
|
||||
struct AuthenticationForgotPasswordCoordinatorParameters {
|
||||
let navigationRouter: NavigationRouterType
|
||||
@@ -32,7 +32,6 @@ enum AuthenticationForgotPasswordCoordinatorResult {
|
||||
}
|
||||
|
||||
final class AuthenticationForgotPasswordCoordinator: Coordinator, Presentable {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
@@ -83,7 +82,7 @@ final class AuthenticationForgotPasswordCoordinator: Coordinator, Presentable {
|
||||
}
|
||||
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.authenticationForgotPasswordHostingController
|
||||
authenticationForgotPasswordHostingController
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -33,7 +33,7 @@ enum MockAuthenticationForgotPasswordScreenState: MockScreenState, CaseIterable
|
||||
}
|
||||
|
||||
/// Generate the view struct for the screen state.
|
||||
var screenView: ([Any], AnyView) {
|
||||
var screenView: ([Any], AnyView) {
|
||||
let viewModel: AuthenticationForgotPasswordViewModel
|
||||
switch self {
|
||||
case .emptyAddress:
|
||||
|
||||
+1
-2
@@ -14,8 +14,8 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import RiotSwiftUI
|
||||
import XCTest
|
||||
|
||||
class AuthenticationForgotPasswordUITests: MockScreenTestCase {
|
||||
func testEmptyAddress() {
|
||||
@@ -98,5 +98,4 @@ class AuthenticationForgotPasswordUITests: MockScreenTestCase {
|
||||
XCTAssertTrue(backButton.exists, "Back button should be shown.")
|
||||
XCTAssertEqual(backButton.label, "Back")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-2
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -19,7 +19,6 @@ import XCTest
|
||||
@testable import RiotSwiftUI
|
||||
|
||||
class AuthenticationForgotPasswordViewModelTests: XCTestCase {
|
||||
|
||||
var viewModel: AuthenticationForgotPasswordViewModelProtocol!
|
||||
var context: AuthenticationForgotPasswordViewModelType.Context!
|
||||
|
||||
|
||||
+1
-2
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -18,7 +18,6 @@ import SwiftUI
|
||||
|
||||
/// The form shown to enter an email address.
|
||||
struct AuthenticationForgotPasswordForm: View {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
+1
-2
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -17,7 +17,6 @@
|
||||
import SwiftUI
|
||||
|
||||
struct AuthenticationForgotPasswordScreen: View {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
@@ -57,7 +57,7 @@ struct AuthenticationLoginViewState: BindableState {
|
||||
/// Data about the selected homeserver.
|
||||
var homeserver: AuthenticationHomeserverViewData
|
||||
/// Whether a new homeserver is currently being loaded.
|
||||
var isLoading: Bool = false
|
||||
var isLoading = false
|
||||
/// View state that can be bound to from SwiftUI.
|
||||
var bindings: AuthenticationLoginBindings
|
||||
|
||||
|
||||
@@ -16,12 +16,9 @@
|
||||
|
||||
import SwiftUI
|
||||
|
||||
typealias AuthenticationLoginViewModelType = StateStoreViewModel<AuthenticationLoginViewState,
|
||||
Never,
|
||||
AuthenticationLoginViewAction>
|
||||
typealias AuthenticationLoginViewModelType = StateStoreViewModel<AuthenticationLoginViewState, AuthenticationLoginViewAction>
|
||||
|
||||
class AuthenticationLoginViewModel: AuthenticationLoginViewModelType, AuthenticationLoginViewModelProtocol {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Public
|
||||
@@ -52,7 +49,7 @@ class AuthenticationLoginViewModel: AuthenticationLoginViewModelType, Authentica
|
||||
case .fallback:
|
||||
Task { await callback?(.fallback) }
|
||||
case .continueWithSSO(let provider):
|
||||
Task { await callback?(.continueWithSSO(provider))}
|
||||
Task { await callback?(.continueWithSSO(provider)) }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -17,7 +17,6 @@
|
||||
import Foundation
|
||||
|
||||
protocol AuthenticationLoginViewModelProtocol {
|
||||
|
||||
var callback: (@MainActor (AuthenticationLoginViewModelResult) -> Void)? { get set }
|
||||
var context: AuthenticationLoginViewModelType.Context { get }
|
||||
|
||||
|
||||
+2
-2
@@ -14,9 +14,9 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import CommonKit
|
||||
import MatrixSDK
|
||||
import SwiftUI
|
||||
|
||||
struct AuthenticationLoginCoordinatorParameters {
|
||||
let navigationRouter: NavigationRouterType
|
||||
@@ -47,7 +47,6 @@ enum AuthenticationLoginCoordinatorResult: CustomStringConvertible {
|
||||
}
|
||||
|
||||
final class AuthenticationLoginCoordinator: Coordinator, Presentable {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
@@ -96,6 +95,7 @@ final class AuthenticationLoginCoordinator: Coordinator, Presentable {
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
|
||||
func start() {
|
||||
MXLog.debug("[AuthenticationLoginCoordinator] did start.")
|
||||
Task { await setupViewModel() }
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -35,7 +35,7 @@ enum MockAuthenticationLoginScreenState: MockScreenState, CaseIterable {
|
||||
}
|
||||
|
||||
/// Generate the view struct for the screen state.
|
||||
var screenView: ([Any], AnyView) {
|
||||
var screenView: ([Any], AnyView) {
|
||||
let viewModel: AuthenticationLoginViewModel
|
||||
switch self {
|
||||
case .matrixDotOrg:
|
||||
@@ -52,7 +52,6 @@ enum MockAuthenticationLoginScreenState: MockScreenState, CaseIterable {
|
||||
viewModel = AuthenticationLoginViewModel(homeserver: .mockFallback)
|
||||
}
|
||||
|
||||
|
||||
// can simulate service and viewModel actions here if needs be.
|
||||
|
||||
return (
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import RiotSwiftUI
|
||||
import XCTest
|
||||
|
||||
class AuthenticationLoginUITests: MockScreenTestCase {
|
||||
func testMatrixDotOrg() {
|
||||
@@ -120,5 +120,4 @@ class AuthenticationLoginUITests: MockScreenTestCase {
|
||||
XCTAssertTrue(fallbackButton.exists, "The fallback button should be shown for \(state).")
|
||||
XCTAssertTrue(fallbackButton.isEnabled, "The fallback button should be enabled for \(state).")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
import SwiftUI
|
||||
|
||||
struct AuthenticationLoginScreen: View {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
@@ -52,7 +51,7 @@ struct AuthenticationLoginScreen: View {
|
||||
loginForm
|
||||
}
|
||||
|
||||
if viewModel.viewState.homeserver.showLoginForm && viewModel.viewState.showSSOButtons {
|
||||
if viewModel.viewState.homeserver.showLoginForm, viewModel.viewState.showSSOButtons {
|
||||
Text(VectorL10n.or)
|
||||
.foregroundColor(theme.colors.secondaryContent)
|
||||
.padding(.top, 16)
|
||||
@@ -63,10 +62,9 @@ struct AuthenticationLoginScreen: View {
|
||||
.padding(.top, 16)
|
||||
}
|
||||
|
||||
if !viewModel.viewState.homeserver.showLoginForm && !viewModel.viewState.showSSOButtons {
|
||||
if !viewModel.viewState.homeserver.showLoginForm, !viewModel.viewState.showSSOButtons {
|
||||
fallbackButton
|
||||
}
|
||||
|
||||
}
|
||||
.readableFrame()
|
||||
.padding(.horizontal, 16)
|
||||
@@ -104,8 +102,8 @@ struct AuthenticationLoginScreen: View {
|
||||
autocorrectionType: .no),
|
||||
onEditingChanged: usernameEditingChanged,
|
||||
onCommit: { isPasswordFocused = true })
|
||||
.accessibilityIdentifier("usernameTextField")
|
||||
.padding(.bottom, 7)
|
||||
.accessibilityIdentifier("usernameTextField")
|
||||
.padding(.bottom, 7)
|
||||
|
||||
RoundedBorderTextField(placeHolder: VectorL10n.authPasswordPlaceholder,
|
||||
text: $viewModel.password,
|
||||
@@ -114,7 +112,7 @@ struct AuthenticationLoginScreen: View {
|
||||
isSecureTextEntry: true),
|
||||
onEditingChanged: passwordEditingChanged,
|
||||
onCommit: submit)
|
||||
.accessibilityIdentifier("passwordTextField")
|
||||
.accessibilityIdentifier("passwordTextField")
|
||||
|
||||
Button { viewModel.send(viewAction: .forgotPassword) } label: {
|
||||
Text(VectorL10n.authenticationLoginForgotPassword)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -16,12 +16,9 @@
|
||||
|
||||
import SwiftUI
|
||||
|
||||
typealias AuthenticationReCaptchaViewModelType = StateStoreViewModel<AuthenticationReCaptchaViewState,
|
||||
Never,
|
||||
AuthenticationReCaptchaViewAction>
|
||||
typealias AuthenticationReCaptchaViewModelType = StateStoreViewModel<AuthenticationReCaptchaViewState, AuthenticationReCaptchaViewAction>
|
||||
|
||||
class AuthenticationReCaptchaViewModel: AuthenticationReCaptchaViewModelType, AuthenticationReCaptchaViewModelProtocol {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
|
||||
+1
-2
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -17,7 +17,6 @@
|
||||
import Foundation
|
||||
|
||||
protocol AuthenticationReCaptchaViewModelProtocol {
|
||||
|
||||
var callback: (@MainActor (AuthenticationReCaptchaViewModelResult) -> Void)? { get set }
|
||||
var context: AuthenticationReCaptchaViewModelType.Context { get }
|
||||
|
||||
|
||||
+2
-3
@@ -14,8 +14,8 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import CommonKit
|
||||
import SwiftUI
|
||||
|
||||
struct AuthenticationReCaptchaCoordinatorParameters {
|
||||
let registrationWizard: RegistrationWizard
|
||||
@@ -26,7 +26,6 @@ struct AuthenticationReCaptchaCoordinatorParameters {
|
||||
}
|
||||
|
||||
final class AuthenticationReCaptchaCoordinator: Coordinator, Presentable {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
// MARK: Private
|
||||
@@ -76,7 +75,7 @@ final class AuthenticationReCaptchaCoordinator: Coordinator, Presentable {
|
||||
}
|
||||
|
||||
func toPresentable() -> UIViewController {
|
||||
return self.authenticationReCaptchaHostingController
|
||||
authenticationReCaptchaHostingController
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2021 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -31,7 +31,7 @@ enum MockAuthenticationReCaptchaScreenState: MockScreenState, CaseIterable {
|
||||
}
|
||||
|
||||
/// Generate the view struct for the screen state.
|
||||
var screenView: ([Any], AnyView) {
|
||||
var screenView: ([Any], AnyView) {
|
||||
let viewModel: AuthenticationReCaptchaViewModel
|
||||
switch self {
|
||||
case .standard:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user