diff --git a/CHANGES.md b/CHANGES.md index c8f9b1ae3..698e5f4a3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,69 @@ +## Changes in 1.8.3 (2022-02-25) + +🙌 Improvements + +- Upgrade MatrixSDK version ([v0.22.4](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.22.4)). + +🐛 Bugfixes + +- Unified Search: Fix a bug where the room directory wasn't working. ([#5672](https://github.com/vector-im/element-ios/issues/5672)) +- Fixed crashes on implicitly unwrapped optionals in the PlainRoomTimelineCellDecorator. ([#5673](https://github.com/vector-im/element-ios/issues/5673)) +- L10n: Fix defaulting to English language ([#5674](https://github.com/vector-im/element-ios/issues/5674)) +- RoomDataSource: Do not reload room data source on back pagination for new threads. ([#5694](https://github.com/vector-im/element-ios/issues/5694)) + + +## Changes in 1.8.2 (2022-02-22) + +✨ Features + +- Add Onboarding Use Case selection screen after the splash screen. ([#5160](https://github.com/vector-im/element-ios/issues/5160)) + +🙌 Improvements + +- Upgrade MatrixSDK version ([v0.22.2](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.22.2)). +- ActivityCenter: Use ActivityCenter to show loading indicators on the home screen (in DEBUG builds only) ([#4829](https://github.com/vector-im/element-ios/issues/4829)) +- Enabled poll editing and undisclosed polls. Added support for unstable poll prefixes. ([#5114](https://github.com/vector-im/element-ios/issues/5114)) +- Filter: update placeholder text and icon ([#5250](https://github.com/vector-im/element-ios/issues/5250)) +- Create Room: Update avatar placeholder & add remove button ([#5251](https://github.com/vector-im/element-ios/issues/5251)) +- Search: remove bubbles background ([#5471](https://github.com/vector-im/element-ios/issues/5471)) +- Exclude all files and directories from iCloud and iTunes backup ([#5498](https://github.com/vector-im/element-ios/issues/5498)) +- ThreadListViewModel: Use new apis to fetch threads. ([#5540](https://github.com/vector-im/element-ios/issues/5540)) +- Search: Use bundled aggregations if provided. ([#5562](https://github.com/vector-im/element-ios/issues/5562)) +- MXKRoomDataSource: Stop pagination in a thread when the root event received. ([#5582](https://github.com/vector-im/element-ios/issues/5582)) +- Add support for UserProperties to analytics and capture FTUE use case selection. ([#5590](https://github.com/vector-im/element-ios/issues/5590)) +- Add attribution to location sharing maps. ([#5609](https://github.com/vector-im/element-ios/issues/5609)) +- Onboarding: Use a different green spinner during onboarding and use the one presented by the LegacyAppDelegate only when logged in. ([#5621](https://github.com/vector-im/element-ios/issues/5621)) +- MXKRoomDataSource: Enable usage of thread timelines. ([#5629](https://github.com/vector-im/element-ios/issues/5629)) + +🐛 Bugfixes + +- Home Tab: Initial support for navigating through the room lists using voiceover. ([#1433](https://github.com/vector-im/element-ios/issues/1433)) +- Authent: fix phone number validation through custom URL ([#3562](https://github.com/vector-im/element-ios/issues/3562)) +- Fix registration to be compliant with the Matrix specification. This allows registering for accounts on Conduit servers. Contributed by @aaronraimist. ([#3736](https://github.com/vector-im/element-ios/issues/3736)) +- Fix proximity sensor staying on and sleep timer staying disabled after call ends ([#4103](https://github.com/vector-im/element-ios/issues/4103)) +- Fonts: Fix dynamic type only working after a fresh launch on SwiftUI views. ([#5027](https://github.com/vector-im/element-ios/issues/5027)) +- Fixed arithmetical exception errors when changing poll responses. ([#5114](https://github.com/vector-im/element-ios/issues/5114)) +- Wordings: Replace "kick" and all affiliate word by "remove" ([#5346](https://github.com/vector-im/element-ios/issues/5346)) +- Markdown/HTML: Fix HTTP links containing Markdown formatting ([#5355](https://github.com/vector-im/element-ios/issues/5355)) +- Message Bubbles: Fix read marker appearing part way thru a message. ([#5521](https://github.com/vector-im/element-ios/issues/5521)) +- HomeViewController: Refresh section badges and tab bar badges on updates. ([#5537](https://github.com/vector-im/element-ios/issues/5537)) +- Update the tintColor in ThemeV1 to sRGB to match the Compound and ThemeV2. ([#5545](https://github.com/vector-im/element-ios/issues/5545)) +- Message bubbles: Increase text message width. ([#5550](https://github.com/vector-im/element-ios/issues/5550)) +- Message bubbles: Fix edited text message `edited` link not working. ([#5553](https://github.com/vector-im/element-ios/issues/5553)) +- Message bubbles: Fix horizontal lines between messages. ([#5555](https://github.com/vector-im/element-ios/issues/5555)) +- App Launch: Fix a potential issue where the green spinner is kept on screen when the room lists are ready. ([#5559](https://github.com/vector-im/element-ios/issues/5559)) +- Authentication: Fix reCaptcha failing to indicate success. ([#5602](https://github.com/vector-im/element-ios/issues/5602)) +- Timeline: scroll to the bottom when opening a notification ([#5639](https://github.com/vector-im/element-ios/issues/5639)) + +Others + +- Fixed or ignored various project warnings for better DevX ([#5513](https://github.com/vector-im/element-ios/pull/5513)) +- SwiftGen: Objective-C support for assets helpers ([#5533](https://github.com/vector-im/element-ios/pull/5533)) +- Fix introspect not being able to theme the SwiftUI navigation bars. ([#5556](https://github.com/vector-im/element-ios/pull/5556)) +- Message bubbles: Reduce sender name bottom margin for text message. ([#5634](https://github.com/vector-im/element-ios/pull/5634)) +- Message bubbles: Use layout constants instead magic numbers. ([#5409](https://github.com/vector-im/element-ios/issues/5409)) + + ## Changes in 1.8.1 (2022-02-16) 🙌 Improvements diff --git a/CommonKit/Source/Activity/Tests/ActivityPresenterSpy.swift b/CommonKit/Source/UserIndicators/Tests/UserIndicatorPresenterSpy.swift similarity index 92% rename from CommonKit/Source/Activity/Tests/ActivityPresenterSpy.swift rename to CommonKit/Source/UserIndicators/Tests/UserIndicatorPresenterSpy.swift index 2a0d03249..8be85ff9c 100644 --- a/CommonKit/Source/Activity/Tests/ActivityPresenterSpy.swift +++ b/CommonKit/Source/UserIndicators/Tests/UserIndicatorPresenterSpy.swift @@ -16,7 +16,7 @@ import Foundation -class ActivityPresenterSpy: ActivityPresentable { +class UserIndicatorPresenterSpy: UserIndicatorPresentable { var intel = [String]() func present() { diff --git a/CommonKit/Source/Activity/Tests/ActivityCenterTests.swift b/CommonKit/Source/UserIndicators/Tests/UserIndicatorQueueTests.swift similarity index 51% rename from CommonKit/Source/Activity/Tests/ActivityCenterTests.swift rename to CommonKit/Source/UserIndicators/Tests/UserIndicatorQueueTests.swift index a1e375851..50c2e458d 100644 --- a/CommonKit/Source/Activity/Tests/ActivityCenterTests.swift +++ b/CommonKit/Source/UserIndicators/Tests/UserIndicatorQueueTests.swift @@ -17,36 +17,36 @@ import Foundation import XCTest -class ActivityCenterTests: XCTestCase { - var activities: [Activity]! - var center: ActivityCenter! +class UserIndicatorQueueTests: XCTestCase { + var indicators: [UserIndicator]! + var queue: UserIndicatorQueue! override func setUp() { - activities = [] - center = ActivityCenter() + indicators = [] + queue = UserIndicatorQueue() } - func makeRequest() -> ActivityRequest { - return ActivityRequest( - presenter: ActivityPresenterSpy(), + func makeRequest() -> UserIndicatorRequest { + return UserIndicatorRequest( + presenter: UserIndicatorPresenterSpy(), dismissal: .manual ) } - func testStartsActivityWhenAdded() { - let activity = center.add(makeRequest()) - XCTAssertEqual(activity.state, .executing) + func testStartsIndicatorWhenAdded() { + let indicator = queue.add(makeRequest()) + XCTAssertEqual(indicator.state, .executing) } - func testSecondActivityIsPending() { - center.add(makeRequest()).store(in: &activities) - let activity = center.add(makeRequest()) - XCTAssertEqual(activity.state, .pending) + func testSecondIndicatorIsPending() { + queue.add(makeRequest()).store(in: &indicators) + let indicator = queue.add(makeRequest()) + XCTAssertEqual(indicator.state, .pending) } - func testSecondActivityIsExecutingWhenFirstCompleted() { - let first = center.add(makeRequest()) - let second = center.add(makeRequest()) + func testSecondIndicatorIsExecutingWhenFirstCompleted() { + let first = queue.add(makeRequest()) + let second = queue.add(makeRequest()) first.cancel() diff --git a/CommonKit/Source/Activity/Tests/ActivityTests.swift b/CommonKit/Source/UserIndicators/Tests/UserIndicatorTests.swift similarity index 56% rename from CommonKit/Source/Activity/Tests/ActivityTests.swift rename to CommonKit/Source/UserIndicators/Tests/UserIndicatorTests.swift index 11cc7eec2..e0722af8f 100644 --- a/CommonKit/Source/Activity/Tests/ActivityTests.swift +++ b/CommonKit/Source/UserIndicators/Tests/UserIndicatorTests.swift @@ -17,20 +17,20 @@ import Foundation import XCTest -class ActivityTests: XCTestCase { - var presenter: ActivityPresenterSpy! +class UserIndicatorTests: XCTestCase { + var presenter: UserIndicatorPresenterSpy! override func setUp() { super.setUp() - presenter = ActivityPresenterSpy() + presenter = UserIndicatorPresenterSpy() } - func makeActivity(dismissal: ActivityDismissal = .manual, callback: @escaping () -> Void = {}) -> Activity { - let request = ActivityRequest( + func makeIndicator(dismissal: UserIndicatorDismissal = .manual, callback: @escaping () -> Void = {}) -> UserIndicator { + let request = UserIndicatorRequest( presenter: presenter, dismissal: dismissal ) - return Activity( + return UserIndicator( request: request, completion: callback ) @@ -38,58 +38,58 @@ class ActivityTests: XCTestCase { // MARK: - State - func testNewActivityIsPending() { - let activity = makeActivity() - XCTAssertEqual(activity.state, .pending) + func testNewIndicatorIsPending() { + let indicator = makeIndicator() + XCTAssertEqual(indicator.state, .pending) } - func testStartedActivityIsExecuting() { - let activity = makeActivity() - activity.start() - XCTAssertEqual(activity.state, .executing) + func testStartedIndicatorIsExecuting() { + let indicator = makeIndicator() + indicator.start() + XCTAssertEqual(indicator.state, .executing) } - func testCancelledActivityIsCompleted() { - let activity = makeActivity() - activity.cancel() - XCTAssertEqual(activity.state, .completed) + func testCancelledIndicatorIsCompleted() { + let indicator = makeIndicator() + indicator.cancel() + XCTAssertEqual(indicator.state, .completed) } // MARK: - Presenter - func testStartingActivityPresentsUI() { - let activity = makeActivity() - activity.start() + func testStartingIndicatorPresentsUI() { + let indicator = makeIndicator() + indicator.start() XCTAssertEqual(presenter.intel, ["present()"]) } func testAllowStartingOnlyOnce() { - let activity = makeActivity() - activity.start() + let indicator = makeIndicator() + indicator.start() presenter.intel = [] - activity.start() + indicator.start() XCTAssertEqual(presenter.intel, []) } - func testCancellingActivityDismissesUI() { - let activity = makeActivity() - activity.start() + func testCancellingIndicatorDismissesUI() { + let indicator = makeIndicator() + indicator.start() presenter.intel = [] - activity.cancel() + indicator.cancel() XCTAssertEqual(presenter.intel, ["dismiss()"]) } func testAllowCancellingOnlyOnce() { - let activity = makeActivity() - activity.start() - activity.cancel() + let indicator = makeIndicator() + indicator.start() + indicator.cancel() presenter.intel = [] - activity.cancel() + indicator.cancel() XCTAssertEqual(presenter.intel, []) } @@ -98,9 +98,9 @@ class ActivityTests: XCTestCase { func testDismissAfterTimeout() { let interval: TimeInterval = 0.01 - let activity = makeActivity(dismissal: .timeout(interval)) + let indicator = makeIndicator(dismissal: .timeout(interval)) - activity.start() + indicator.start() let exp = expectation(description: "") DispatchQueue.main.asyncAfter(deadline: .now() + interval) { @@ -108,19 +108,19 @@ class ActivityTests: XCTestCase { } waitForExpectations(timeout: 1) - XCTAssertEqual(activity.state, .completed) + XCTAssertEqual(indicator.state, .completed) } // MARK: - Completion callback func testTriggersCallbackWhenCompleted() { var didComplete = false - let activity = makeActivity { + let indicator = makeIndicator { didComplete = true } - activity.start() + indicator.start() - activity.cancel() + indicator.cancel() XCTAssertTrue(didComplete) } diff --git a/CommonKit/Source/Activity/Activity.swift b/CommonKit/Source/UserIndicators/UserIndicator.swift similarity index 59% rename from CommonKit/Source/Activity/Activity.swift rename to CommonKit/Source/UserIndicators/UserIndicator.swift index d72e87800..72338013d 100644 --- a/CommonKit/Source/Activity/Activity.swift +++ b/CommonKit/Source/UserIndicators/UserIndicator.swift @@ -17,27 +17,27 @@ import Foundation import UIKit -/// An `Activity` represents the state of a temporary visual indicator, such as activity indicator, success notification or an error message. It does not directly manage the UI, instead it delegates to a `presenter` +/// A `UserIndicator` represents the state of a temporary visual indicator, such as loading spinner, success notification or an error message. It does not directly manage the UI, instead it delegates to a `presenter` /// whenever the UI should be shown or hidden. /// -/// More than one `Activity` may be requested by the system at the same time (e.g. global syncing vs local refresh), -/// and the `ActivityCenter` will ensure that only one activity is shown at a given time, putting the other in a pending queue. +/// More than one `UserIndicator` may be requested by the system at the same time (e.g. global syncing vs local refresh), +/// and the `UserIndicatorQueue` will ensure that only one indicator is shown at a given time, putting the other in a pending queue. /// -/// A client that requests an activity can specify a default timeout after which the activity is dismissed, or it has to be manually +/// A client that requests an indicator can specify a default timeout after which the indicator is dismissed, or it has to be manually /// responsible for dismissing it via `cancel` method, or by deallocating itself. -public class Activity { - enum State { +public class UserIndicator { + public enum State { case pending case executing case completed } - private let request: ActivityRequest + private let request: UserIndicatorRequest private let completion: () -> Void - private(set) var state: State + public private(set) var state: State - public init(request: ActivityRequest, completion: @escaping () -> Void) { + public init(request: UserIndicatorRequest, completion: @escaping () -> Void) { self.request = request self.completion = completion @@ -45,7 +45,7 @@ public class Activity { } deinit { - cancel() + complete() } internal func start() { @@ -66,11 +66,11 @@ public class Activity { } } - /// Cancel the activity, triggering any dismissal action / animation + /// Cancel the indicator, triggering any dismissal action / animation /// - /// Note: clients can call this method directly, if they have access to the `Activity`. - /// Once cancelled, `ActivityCenter` will automatically start the next `Activity` in the queue. - func cancel() { + /// Note: clients can call this method directly, if they have access to the `UserIndicator`. + /// Once cancelled, `UserIndicatorQueue` will automatically start the next `UserIndicator` in the queue. + public func cancel() { complete() } @@ -87,8 +87,16 @@ public class Activity { } } -public extension Activity { - func store(in collection: inout C) where C: RangeReplaceableCollection, C.Element == Activity { +public extension UserIndicator { + func store(in collection: inout C) where C: RangeReplaceableCollection, C.Element == UserIndicator { collection.append(self) } } + +public extension Collection where Element == UserIndicator { + func cancelAll() { + forEach { + $0.cancel() + } + } +} diff --git a/CommonKit/Source/Activity/ActivityDismissal.swift b/CommonKit/Source/UserIndicators/UserIndicatorDismissal.swift similarity index 69% rename from CommonKit/Source/Activity/ActivityDismissal.swift rename to CommonKit/Source/UserIndicators/UserIndicatorDismissal.swift index 69405c579..874a4f1ed 100644 --- a/CommonKit/Source/Activity/ActivityDismissal.swift +++ b/CommonKit/Source/UserIndicators/UserIndicatorDismissal.swift @@ -16,10 +16,10 @@ import Foundation -/// Different ways in which an `Activity` can be dismissed -public enum ActivityDismissal { - /// The `Activity` will not manage the dismissal, but will expect the calling client to do so manually +/// Different ways in which a `UserIndicator` can be dismissed +public enum UserIndicatorDismissal { + /// The `UserIndicator` will not manage the dismissal, but will expect the calling client to do so manually case manual - /// The `Activity` will be automatically dismissed after `TimeInterval` + /// The `UserIndicator` will be automatically dismissed after `TimeInterval` case timeout(TimeInterval) } diff --git a/CommonKit/Source/Activity/ActivityPresentable.swift b/CommonKit/Source/UserIndicators/UserIndicatorPresentable.swift similarity index 65% rename from CommonKit/Source/Activity/ActivityPresentable.swift rename to CommonKit/Source/UserIndicators/UserIndicatorPresentable.swift index 5bb489fcc..00a90913e 100644 --- a/CommonKit/Source/Activity/ActivityPresentable.swift +++ b/CommonKit/Source/UserIndicators/UserIndicatorPresentable.swift @@ -16,10 +16,10 @@ import Foundation -/// A presenter associated with and called by an `Activity`, and responsible for the underlying view shown on the screen. -public protocol ActivityPresentable { - /// Called when the `Activity` is started (manually or by the `ActivityCenter`) +/// A presenter associated with and called by a `UserIndicator`, and responsible for the underlying view shown on the screen. +public protocol UserIndicatorPresentable { + /// Called when the `UserIndicator` is started (manually or by the `UserIndicatorQueue`) func present() - /// Called when the `Activity` is manually cancelled or completed + /// Called when the `UserIndicator` is manually cancelled or completed func dismiss() } diff --git a/CommonKit/Source/Activity/ActivityCenter.swift b/CommonKit/Source/UserIndicators/UserIndicatorQueue.swift similarity index 52% rename from CommonKit/Source/Activity/ActivityCenter.swift rename to CommonKit/Source/UserIndicators/UserIndicatorQueue.swift index 9d9e0c704..b66014c0f 100644 --- a/CommonKit/Source/Activity/ActivityCenter.swift +++ b/CommonKit/Source/UserIndicators/UserIndicatorQueue.swift @@ -16,11 +16,11 @@ import Foundation -/// A shared activity center with a single FIFO queue which will ensure only one activity is shown at a given time. +/// A FIFO queue which will ensure only one user indicator is shown at a given time. /// -/// `ActivityCenter` offers a `shared` center that can be used by any clients, but clients are also allowed -/// to create local `ActivityCenter` if the context requres multiple simultaneous activities. -public class ActivityCenter { +/// `UserIndicatorQueue` offers a `shared` queue that can be used by any clients app-wide, but clients are also allowed +/// to create local `UserIndicatorQueue` if the context requres multiple simultaneous indicators. +public class UserIndicatorQueue { private class Weak { weak var element: T? init(_ element: T) { @@ -28,27 +28,27 @@ public class ActivityCenter { } } - public static let shared = ActivityCenter() - private var queue = [Weak]() + public static let shared = UserIndicatorQueue() + private var queue = [Weak]() - /// Add a new activity to the queue by providing a request. + /// Add a new indicator to the queue by providing a request. /// - /// The queue will start the activity right away, if there are no currently running activities, - /// otherwise the activity will be put on hold. - public func add(_ request: ActivityRequest) -> Activity { - let activity = Activity(request: request) { [weak self] in + /// The queue will start the indicator right away, if there are no currently running indicators, + /// otherwise the indicator will be put on hold. + public func add(_ request: UserIndicatorRequest) -> UserIndicator { + let indicator = UserIndicator(request: request) { [weak self] in self?.startNextIfIdle() } - queue.append(Weak(activity)) + queue.append(Weak(indicator)) startNextIfIdle() - return activity + return indicator } private func startNextIfIdle() { cleanup() - if let activity = queue.first?.element, activity.state == .pending { - activity.start() + if let indicator = queue.first?.element, indicator.state == .pending { + indicator.start() } } diff --git a/CommonKit/Source/Activity/ActivityRequest.swift b/CommonKit/Source/UserIndicators/UserIndicatorRequest.swift similarity index 65% rename from CommonKit/Source/Activity/ActivityRequest.swift rename to CommonKit/Source/UserIndicators/UserIndicatorRequest.swift index f009fc211..83e882c0e 100644 --- a/CommonKit/Source/Activity/ActivityRequest.swift +++ b/CommonKit/Source/UserIndicators/UserIndicatorRequest.swift @@ -16,12 +16,12 @@ import Foundation -/// A request used to create an underlying `Activity`, allowing clients to only specify the visual aspects of an activity. -public struct ActivityRequest { - internal let presenter: ActivityPresentable - internal let dismissal: ActivityDismissal +/// A request used to create an underlying `UserIndicator`, allowing clients to only specify the visual aspects of an indicator. +public struct UserIndicatorRequest { + internal let presenter: UserIndicatorPresentable + internal let dismissal: UserIndicatorDismissal - public init(presenter: ActivityPresentable, dismissal: ActivityDismissal) { + public init(presenter: UserIndicatorPresentable, dismissal: UserIndicatorDismissal) { self.presenter = presenter self.dismissal = dismissal } diff --git a/Config/AppVersion.xcconfig b/Config/AppVersion.xcconfig index de6ddc959..dc0864384 100644 --- a/Config/AppVersion.xcconfig +++ b/Config/AppVersion.xcconfig @@ -15,5 +15,5 @@ // // Version -MARKETING_VERSION = 1.8.2 -CURRENT_PROJECT_VERSION = 1.8.2 +MARKETING_VERSION = 1.8.4 +CURRENT_PROJECT_VERSION = 1.8.4 diff --git a/Config/BuildSettings.swift b/Config/BuildSettings.swift index 3348ba964..99e8e3b0b 100644 --- a/Config/BuildSettings.swift +++ b/Config/BuildSettings.swift @@ -156,20 +156,35 @@ final class BuildSettings: NSObject { static let roomsAllowToJoinPublicRooms: Bool = true // MARK: - Analytics - #if DEBUG - /// Host to use for PostHog analytics during development. Set to nil to disable analytics in debug builds. - static let analyticsHost: String? = "https://posthog-poc.lab.element.dev" - /// Public key for submitting analytics during development. Set to nil to disable analytics in debug builds. - static let analyticsKey: String? = "rs-pJjsYJTuAkXJfhaMmPUNBhWliDyTKLOOxike6ck8" - #else - /// Host to use for PostHog analytics. Set to nil to disable analytics. - static let analyticsHost: String? = "https://posthog.hss.element.io" - /// Public key for submitting analytics. Set to nil to disable analytics. - static let analyticsKey: String? = "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO" - #endif - /// The URL to open with more information about analytics terms. - static let analyticsTermsURL = URL(string: "https://element.io/cookie-policy")! + /// A type that represents how to set up the analytics module in the app. + /// + /// **Note:** Analytics are disabled by default for forks. + /// If you are maintaining a fork, set custom configurations. + struct AnalyticsConfiguration { + /// Whether or not analytics should be enabled. + let isEnabled: Bool + /// The host to use for PostHog analytics. + let host: String + /// The public key for submitting analytics. + let apiKey: String + /// The URL to open with more information about analytics terms. + let termsURL: URL + } + + #if DEBUG + /// The configuration to use for analytics during development. Set `isEnabled` to false to disable analytics in debug builds. + static let analyticsConfiguration = AnalyticsConfiguration(isEnabled: BuildSettings.baseBundleIdentifier.starts(with: "im.vector.app"), + host: "https://posthog-poc.lab.element.dev", + apiKey: "rs-pJjsYJTuAkXJfhaMmPUNBhWliDyTKLOOxike6ck8", + termsURL: URL(string: "https://element.io/cookie-policy")!) + #else + /// The configuration to use for analytics. Set `isEnabled` to false to disable analytics. + static let analyticsConfiguration = AnalyticsConfiguration(isEnabled: BuildSettings.baseBundleIdentifier.starts(with: "im.vector.app"), + host: "https://posthog.hss.element.io", + apiKey: "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO", + termsURL: URL(string: "https://element.io/cookie-policy")!) + #endif // MARK: - Bug report @@ -211,7 +226,7 @@ final class BuildSettings: NSObject { static let allowInviteExernalUsers: Bool = true /// Whether a screen uses legacy local activity indicators or improved app-wide indicators - static var appActivityIndicators: Bool { + static var useAppUserIndicators: Bool { #if DEBUG return false #else @@ -361,6 +376,9 @@ final class BuildSettings: NSObject { // MARK: - Authentication Options static let authEnableRefreshTokens = false + // MARK: - Onboarding + static let onboardingShowAccountPersonalisation = false + // MARK: - Unified Search static let unifiedSearchScreenShowPublicDirectory = true diff --git a/DesignKit/Source/FontsSwiftUI.swift b/DesignKit/Source/FontsSwiftUI.swift index ddf6a1754..a12a537ff 100644 --- a/DesignKit/Source/FontsSwiftUI.swift +++ b/DesignKit/Source/FontsSwiftUI.swift @@ -23,7 +23,7 @@ import SwiftUI @available(iOS 14.0, *) public struct FontSwiftUI: Fonts { - public let uiFonts: ElementFonts + public let uiFonts: FontsUIKit public var largeTitle: Font @@ -66,27 +66,27 @@ public struct FontSwiftUI: Fonts { public var caption2SB: Font public init(values: ElementFonts) { - self.uiFonts = values + self.uiFonts = FontsUIKit(values: values) - self.largeTitle = Font(values.largeTitle) - self.largeTitleB = Font(values.largeTitleB) - self.title1 = Font(values.title1) - self.title1B = Font(values.title1B) - self.title2 = Font(values.title2) - self.title2B = Font(values.title2B) - self.title3 = Font(values.title3) - self.title3SB = Font(values.title3SB) - self.headline = Font(values.headline) - self.subheadline = Font(values.subheadline) - self.body = Font(values.body) - self.bodySB = Font(values.bodySB) - self.callout = Font(values.callout) - self.calloutSB = Font(values.calloutSB) - self.footnote = Font(values.footnote) - self.footnoteSB = Font(values.footnoteSB) - self.caption1 = Font(values.caption1) - self.caption1SB = Font(values.caption1SB) - self.caption2 = Font(values.caption2) - self.caption2SB = Font(values.caption2SB) + self.largeTitle = values.largeTitle.font + self.largeTitleB = values.largeTitleB.font + self.title1 = values.title1.font + self.title1B = values.title1B.font + self.title2 = values.title2.font + self.title2B = values.title2B.font + self.title3 = values.title3.font + self.title3SB = values.title3SB.font + self.headline = values.headline.font + self.subheadline = values.subheadline.font + self.body = values.body.font + self.bodySB = values.bodySB.font + self.callout = values.callout.font + self.calloutSB = values.calloutSB.font + self.footnote = values.footnote.font + self.footnoteSB = values.footnoteSB.font + self.caption1 = values.caption1.font + self.caption1SB = values.caption1SB.font + self.caption2 = values.caption2.font + self.caption2SB = values.caption2SB.font } } diff --git a/DesignKit/Source/FontsUIkit.swift b/DesignKit/Source/FontsUIkit.swift index 3067d03a1..ec65cdaa6 100644 --- a/DesignKit/Source/FontsUIkit.swift +++ b/DesignKit/Source/FontsUIkit.swift @@ -63,25 +63,25 @@ import UIKit public var caption2SB: UIFont public init(values: ElementFonts) { - self.largeTitle = values.largeTitle - self.largeTitleB = values.largeTitleB - self.title1 = values.title1 - self.title1B = values.title1B - self.title2 = values.title2 - self.title2B = values.title2B - self.title3 = values.title3 - self.title3SB = values.title3SB - self.headline = values.headline - self.subheadline = values.subheadline - self.body = values.body - self.bodySB = values.bodySB - self.callout = values.callout - self.calloutSB = values.calloutSB - self.footnote = values.footnote - self.footnoteSB = values.footnoteSB - self.caption1 = values.caption1 - self.caption1SB = values.caption1SB - self.caption2 = values.caption2 - self.caption2SB = values.caption2SB + self.largeTitle = values.largeTitle.uiFont + self.largeTitleB = values.largeTitleB.uiFont + self.title1 = values.title1.uiFont + self.title1B = values.title1B.uiFont + self.title2 = values.title2.uiFont + self.title2B = values.title2B.uiFont + self.title3 = values.title3.uiFont + self.title3SB = values.title3SB.uiFont + self.headline = values.headline.uiFont + self.subheadline = values.subheadline.uiFont + self.body = values.body.uiFont + self.bodySB = values.bodySB.uiFont + self.callout = values.callout.uiFont + self.calloutSB = values.calloutSB.uiFont + self.footnote = values.footnote.uiFont + self.footnoteSB = values.footnoteSB.uiFont + self.caption1 = values.caption1.uiFont + self.caption1SB = values.caption1SB.uiFont + self.caption2 = values.caption2.uiFont + self.caption2SB = values.caption2SB.uiFont } } diff --git a/DesignKit/Variants/Fonts/ElementFonts.swift b/DesignKit/Variants/Fonts/ElementFonts.swift index 6612d3dc1..d7538c905 100644 --- a/DesignKit/Variants/Fonts/ElementFonts.swift +++ b/DesignKit/Variants/Fonts/ElementFonts.swift @@ -14,12 +14,42 @@ // limitations under the License. // -import UIKit +import SwiftUI /// Fonts at https://www.figma.com/file/X4XTH9iS2KGJ2wFKDqkyed/Compound?node-id=1362%3A0 @objcMembers public class ElementFonts { + // MARK: - Types + + /// A wrapper to provide both a `UIFont` and a SwiftUI `Font` in the same type. + /// The need for this comes from `Font` not adapting for dynamic type until the app + /// is restarted (or working at all in Xcode Previews) when initialised from a `UIFont` + /// (even if that font was created with the appropriate metrics). + public struct SharedFont { + public let uiFont: UIFont + /// The underlying font for the `font` property. This is stored + /// as an optional `Any` due to unavailability on iOS 12. + private let _font: Any? + + @available(iOS 13.0, *) + public var font: Font { + _font as! Font + } + + @available(iOS, deprecated: 13.0, message: "Use init(uiFont:font:) instead and remove this initialiser.") + init(uiFont: UIFont) { + self.uiFont = uiFont + self._font = nil + } + + @available(iOS 13.0, *) + init(uiFont: UIFont, font: Font) { + self.uiFont = uiFont + self._font = font + } + } + // MARK: - Setup public init() { @@ -35,85 +65,217 @@ public class ElementFonts { } // MARK: - Fonts protocol -extension ElementFonts: Fonts { +extension ElementFonts: Fonts { - public var largeTitle: UIFont { - return self.font(forTextStyle: .largeTitle) + public var largeTitle: SharedFont { + let uiFont = self.font(forTextStyle: .largeTitle) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .largeTitle) + } else { + return SharedFont(uiFont: uiFont) + } } - public var largeTitleB: UIFont { - return self.largeTitle.vc_bold + public var largeTitleB: SharedFont { + let uiFont = self.largeTitle.uiFont.vc_bold + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .largeTitle.bold()) + } else { + return SharedFont(uiFont: uiFont) + } } - public var title1: UIFont { - return self.font(forTextStyle: .title1) + public var title1: SharedFont { + let uiFont = self.font(forTextStyle: .title1) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .title) + } else { + return SharedFont(uiFont: uiFont) + } } - public var title1B: UIFont { - return self.title1.vc_bold + public var title1B: SharedFont { + let uiFont = self.title1.uiFont.vc_bold + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .title.bold()) + } else { + return SharedFont(uiFont: uiFont) + } } - public var title2: UIFont { - return self.font(forTextStyle: .title2) + public var title2: SharedFont { + let uiFont = self.font(forTextStyle: .title2) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: Font(uiFont)) + } else if #available(iOS 14.0, *) { + return SharedFont(uiFont: uiFont, font: .title2) + } else { + return SharedFont(uiFont: uiFont) + } } - public var title2B: UIFont { - return self.title2.vc_bold + public var title2B: SharedFont { + let uiFont = self.title2.uiFont.vc_bold + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: Font(uiFont)) + } else if #available(iOS 14.0, *) { + return SharedFont(uiFont: uiFont, font: .title2.bold()) + } else { + return SharedFont(uiFont: uiFont) + } } - public var title3: UIFont { - return self.font(forTextStyle: .title3) + public var title3: SharedFont { + let uiFont = self.font(forTextStyle: .title3) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: Font(uiFont)) + } else if #available(iOS 14.0, *) { + return SharedFont(uiFont: uiFont, font: .title3) + } else { + return SharedFont(uiFont: uiFont) + } } - public var title3SB: UIFont { - return self.title3.vc_semiBold + public var title3SB: SharedFont { + let uiFont = self.title3.uiFont.vc_semiBold + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: Font(uiFont)) + } else if #available(iOS 14.0, *) { + return SharedFont(uiFont: uiFont, font: .title3.weight(.semibold)) + } else { + return SharedFont(uiFont: uiFont) + } } - public var headline: UIFont { - return self.font(forTextStyle: .headline) + public var headline: SharedFont { + let uiFont = self.font(forTextStyle: .headline) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .headline) + } else { + return SharedFont(uiFont: uiFont) + } } - public var subheadline: UIFont { - return self.font(forTextStyle: .subheadline) + public var subheadline: SharedFont { + let uiFont = self.font(forTextStyle: .subheadline) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .subheadline) + } else { + return SharedFont(uiFont: uiFont) + } } - public var body: UIFont { - return self.font(forTextStyle: .body) + public var body: SharedFont { + let uiFont = self.font(forTextStyle: .body) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .body) + } else { + return SharedFont(uiFont: uiFont) + } } - public var bodySB: UIFont { - return self.body.vc_semiBold + public var bodySB: SharedFont { + let uiFont = self.body.uiFont.vc_semiBold + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .body.weight(.semibold)) + } else { + return SharedFont(uiFont: uiFont) + } } - public var callout: UIFont { - return self.font(forTextStyle: .callout) + public var callout: SharedFont { + let uiFont = self.font(forTextStyle: .callout) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .callout) + } else { + return SharedFont(uiFont: uiFont) + } } - public var calloutSB: UIFont { - return self.callout.vc_semiBold + public var calloutSB: SharedFont { + let uiFont = self.callout.uiFont.vc_semiBold + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .callout.weight(.semibold)) + } else { + return SharedFont(uiFont: uiFont) + } } - public var footnote: UIFont { - return self.font(forTextStyle: .footnote) + public var footnote: SharedFont { + let uiFont = self.font(forTextStyle: .footnote) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .footnote) + } else { + return SharedFont(uiFont: uiFont) + } } - public var footnoteSB: UIFont { - return self.footnote.vc_semiBold + public var footnoteSB: SharedFont { + let uiFont = self.footnote.uiFont.vc_semiBold + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .footnote.weight(.semibold)) + } else { + return SharedFont(uiFont: uiFont) + } } - public var caption1: UIFont { - return self.font(forTextStyle: .caption1) + public var caption1: SharedFont { + let uiFont = self.font(forTextStyle: .caption1) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .caption) + } else { + return SharedFont(uiFont: uiFont) + } } - public var caption1SB: UIFont { - return self.caption1.vc_semiBold + public var caption1SB: SharedFont { + let uiFont = self.caption1.uiFont.vc_semiBold + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: .caption.weight(.semibold)) + } else { + return SharedFont(uiFont: uiFont) + } } - public var caption2: UIFont { - return self.font(forTextStyle: .caption2) + public var caption2: SharedFont { + let uiFont = self.font(forTextStyle: .caption2) + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: Font(uiFont)) + } else if #available(iOS 14.0, *) { + return SharedFont(uiFont: uiFont, font: .caption2) + } else { + return SharedFont(uiFont: uiFont) + } } - public var caption2SB: UIFont { - return self.caption2.vc_semiBold + public var caption2SB: SharedFont { + let uiFont = self.caption2.uiFont.vc_semiBold + + if #available(iOS 13.0, *) { + return SharedFont(uiFont: uiFont, font: Font(uiFont)) + } else if #available(iOS 14.0, *) { + return SharedFont(uiFont: uiFont, font: .caption2.weight(.semibold)) + } else { + return SharedFont(uiFont: uiFont) + } } } diff --git a/Podfile b/Podfile index b37f3c61b..cbc8d341e 100644 --- a/Podfile +++ b/Podfile @@ -13,7 +13,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.22.1' +$matrixSDKVersion = '= 0.22.4' # $matrixSDKVersion = :local # $matrixSDKVersion = { :branch => 'develop'} # $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } } diff --git a/Podfile.lock b/Podfile.lock index 8636a4170..0a61ed977 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -56,16 +56,16 @@ PODS: - LoggerAPI (1.9.200): - Logging (~> 1.1) - Logging (1.4.0) - - MatrixSDK (0.22.1): - - MatrixSDK/Core (= 0.22.1) - - MatrixSDK/Core (0.22.1): + - MatrixSDK (0.22.4): + - MatrixSDK/Core (= 0.22.4) + - MatrixSDK/Core (0.22.4): - AFNetworking (~> 4.0.0) - GZIP (~> 1.3.0) - libbase58 (~> 0.1.4) - OLMKit (~> 3.2.5) - Realm (= 10.16.0) - SwiftyBeaver (= 1.9.5) - - MatrixSDK/JingleCallStack (0.22.1): + - MatrixSDK/JingleCallStack (0.22.4): - JitsiMeetSDK (= 3.10.2) - MatrixSDK/Core - OLMKit (3.2.5): @@ -115,8 +115,8 @@ DEPENDENCIES: - KeychainAccess (~> 4.2.2) - KTCenterFlowLayout (~> 1.3.1) - libPhoneNumber-iOS (~> 0.9.13) - - MatrixSDK (= 0.22.1) - - MatrixSDK/JingleCallStack (= 0.22.1) + - MatrixSDK (= 0.22.4) + - MatrixSDK/JingleCallStack (= 0.22.4) - OLMKit - PostHog (~> 1.4.4) - ReadMoreTextView (~> 3.0.1) @@ -208,7 +208,7 @@ SPEC CHECKSUMS: libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75 LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d Logging: beeb016c9c80cf77042d62e83495816847ef108b - MatrixSDK: 12c1a56e037f629e493cbcd615fd13cfc58cee3a + MatrixSDK: 0991e467a7da936fc5f7cdf0a277cd86a55cb4c0 OLMKit: 9fb4799c4a044dd2c06bda31ec31a12191ad30b5 PostHog: 4b6321b521569092d4ef3a02238d9435dbaeb99f ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d @@ -225,6 +225,6 @@ SPEC CHECKSUMS: zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb -PODFILE CHECKSUM: 03d59acfc44f69c0727a98aff6c5cbc2470844ef +PODFILE CHECKSUM: f8aca20e36984b48793a1bfb90f4fe8d5a134f7d COCOAPODS: 1.11.2 diff --git a/Riot/Assets/Images.xcassets/Onboarding/onboarding_congratulations_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Onboarding/onboarding_congratulations_icon.imageset/Contents.json new file mode 100644 index 000000000..abd9b2f32 --- /dev/null +++ b/Riot/Assets/Images.xcassets/Onboarding/onboarding_congratulations_icon.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "user.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/Riot/Assets/Images.xcassets/Onboarding/onboarding_congratulations_icon.imageset/user.svg b/Riot/Assets/Images.xcassets/Onboarding/onboarding_congratulations_icon.imageset/user.svg new file mode 100644 index 000000000..0321e191f --- /dev/null +++ b/Riot/Assets/Images.xcassets/Onboarding/onboarding_congratulations_icon.imageset/user.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 1c6bc5911..c8244e25a 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -45,7 +45,7 @@ "auth_optional_phone_placeholder" = "Telefon-Nummer (optional)"; "auth_phone_placeholder" = "Telefon-Nummer"; "auth_repeat_password_placeholder" = "Wiederhole Passwort"; -"auth_repeat_new_password_placeholder" = "Bestätige dein neues Passwort"; +"auth_repeat_new_password_placeholder" = "Bestätige das neue Passwort für dein Matrix-Konto"; "auth_invalid_user_name" = "Nutzernamen dürfen nur Buchstaben, Nummern, Punkte, Binde- und Unterstriche enthalten"; "auth_invalid_password" = "Passwort zu kurz (min. 6 Zeichen)"; "auth_invalid_email" = "Dies sieht nicht nach eine validen E-Mail-Adresse aus"; @@ -56,7 +56,7 @@ "auth_missing_email_or_phone" = "Fehlende E-Mail-Adresse oder Telefon-Nummer"; "auth_password_dont_match" = "Passwörter stimmen nicht überein"; "auth_username_in_use" = "Benutzername bereits verwendet"; -"auth_forgot_password" = "Passwort vergessen?"; +"auth_forgot_password" = "Passwort des Matrix-Kontos vergessen?"; "auth_msisdn_validation_title" = "Verifizierung ausstehend"; "auth_msisdn_validation_message" = "Bitte gib unten den Aktivierungs-Code ein, den wir per SMS verschickt haben."; "auth_msisdn_validation_error" = "Telefonnummer kann nicht verifiziert werden."; @@ -137,7 +137,7 @@ "room_participants_action_invite" = "Einladen"; "room_participants_action_leave" = "Diesen Raum verlassen"; "room_participants_action_remove" = "Aus diesem Raum entfernen"; -"room_participants_action_ban" = "Aus diesem Raum bannen"; +"room_participants_action_ban" = "Aus diesem Raum verbannen"; "room_participants_action_ignore" = "Alle Nachrichten dieser Person verbergen"; "room_participants_action_unignore" = "Alle Nachrichten dieser Person zeigen"; "room_participants_action_set_moderator" = "Moderationsrechte vergeben"; @@ -166,7 +166,7 @@ "room_event_action_quote" = "Zitieren"; "room_event_action_more" = "Mehr"; "room_event_action_share" = "Teilen"; -"room_event_action_permalink" = "Permalink"; +"room_event_action_permalink" = "Link zur Nachricht kopieren"; "room_event_action_view_source" = "Zeige Quelltext"; "room_event_action_report" = "Inhalt melden"; "room_event_action_report_prompt_reason" = "Grund fürs Melden dieses Inhalts"; @@ -234,11 +234,11 @@ "settings_term_conditions" = "Geschäftsbedingungen"; "settings_privacy_policy" = "Datenschutzerklärung"; "settings_send_crash_report" = "Sende anonyme Absturz- und Nutzungsdaten"; -"settings_change_password" = "Passwort ändern"; +"settings_change_password" = "Passwort deines Matrix-Kontos ändern"; "settings_old_password" = "altes Passwort"; "settings_new_password" = "neues Passwort"; "settings_confirm_password" = "bestätige Passwort"; -"settings_password_updated" = "Dein Passwort wurde aktualisiert"; +"settings_password_updated" = "Das Passwort deines Matrix-Kontos wurde aktualisiert"; "settings_crypto_device_name" = "Öffentlicher Sitzungs-Name: "; "settings_crypto_device_key" = "\nSitzungs-Schlüssel:\n"; "settings_crypto_export" = "Schlüssel exportieren"; @@ -262,7 +262,7 @@ "room_details_no_local_addresses" = "Dieser Raum hat keine lokalen Adressen"; "room_details_new_address" = "Füge neue Adresse hinzu"; "room_details_new_address_placeholder" = "Füge neue Adresse hinzu (z.B. #foo%@)"; -"room_details_banned_users_section" = "Gebannte Nutzer"; +"room_details_banned_users_section" = "Verbannte Personen"; "room_details_advanced_section" = "Erweitert"; "room_details_advanced_room_id" = "Raum-ID:"; "room_details_advanced_enable_e2e_encryption" = "Aktivere Verschlüsselung (Warnung: Nicht deaktivierbar!)"; @@ -279,11 +279,11 @@ "auth_use_server_options" = "Individuelle Server-Optionen"; "auth_email_validation_message" = "Prüfe dein E-Mail-Konto um mit der Registrierung fortzufahren"; "auth_recaptcha_message" = "Dieser Heimserver will sicherstellen dass du kein Roboter bist"; -"auth_reset_password_message" = "E-Mail-Adresse angeben, um das Passwort zurückzusetzen:"; +"auth_reset_password_message" = "Um das Passwort deines Matrix-Kontos zurückzusetzen, gib die mit deinem Konto verbundene E-Mail-Adresse an:"; "auth_reset_password_missing_email" = "Die E-Mail-Adresse die mit dem Konto verbunden ist muss eingegeben werden."; "auth_reset_password_error_unauthorized" = "Konnte E-Mail-Adresse nicht verifizieren. Klicke den Link in der Registrierungs-E-Mail"; "auth_reset_password_error_not_found" = "Diese E-Mail-Adresse ist nicht mit einer Matrix-ID auf diesem Heimserver verknüpft."; -"auth_reset_password_success_message" = "Dein Passwort wurde zurückgesetzt.\n\nDu wurdest aus allen Sitzungen abgemeldet, diese bekommen jetzt keine Push-Benachrichtigungen mehr. Um diese wieder einzuschalten, melde dich auf den Geräten erneut an."; +"auth_reset_password_success_message" = "Das Passwort deines Matrix-Kontos wurde zurückgesetzt.\n\nDu wurdest aus allen Sitzungen abgemeldet und bekommst keine Push-Benachrichtigungen mehr. Um diese zu reaktivieren, melde dich jeweils auf allen Geräten erneut an."; "auth_add_email_and_phone_warning" = "Registrierung mit E-Mail und Telefonnummer zugleich ist noch nicht unterstützt. Nur die Telefonnummer wird berücksichtigt. Du kannst deine E-Mail-Adresse in deinem Profil ergänzen."; "room_creation_make_public_prompt_msg" = "Sicher, dass du diesen Raum öffentlich machen willst? Jeder kann deine Nachrichten lesen und dem Raum beitreten."; "room_creation_invite_another_user" = "Benutzer-ID, Name oder E-Mail"; @@ -320,7 +320,7 @@ "settings_labs_e2e_encryption_prompt_message" = "Zum Fertigstellen der Verschlüsselung bitte neu anmelden."; "settings_third_party_notices" = "Anmerkungen von Dritten"; "settings_clear_cache" = "Cache löschen"; -"settings_fail_to_update_password" = "Passwortänderung fehlgeschlagen"; +"settings_fail_to_update_password" = "Passwortänderung des Matrix-Kontos fehlgeschlagen"; "settings_crypto_device_id" = "\nSitzungs-ID: "; "settings_crypto_blacklist_unverified_devices" = "Verschlüssele nur zu verifizierten Sitzungen"; "room_details_people" = "Mitglieder"; @@ -505,7 +505,7 @@ "e2e_room_key_request_message_new_device" = "Du hast die neue Sitzung '%@' hinzugefügt, welche Verschlüsselungs-Schlüssel anfordert."; "room_do_not_have_permission_to_post" = "Du hast keine Berechtigung Nachrichten in diesem Raum zu senden"; "room_event_action_kick_prompt_reason" = "Grund für das Entfernen des Benutzers"; -"room_event_action_ban_prompt_reason" = "Grund für die Verbannung des Benutzers"; +"room_event_action_ban_prompt_reason" = "Grund für die Verbannung der Person"; "room_action_send_photo_or_video" = "Foto oder Video senden"; "room_action_send_sticker" = "Aufkleber senden"; "settings_deactivate_account" = "DEAKTIVIERTES KONTO"; @@ -526,7 +526,7 @@ "deactivate_account_forget_messages_information_part3" = ": Dies wird dafür sorgen, dass zukünftige Nutzer eine unvollständige Konversation sehen)"; "deactivate_account_validate_action" = "Konto deaktiveren"; "deactivate_account_password_alert_title" = "Konto deaktivieren"; -"deactivate_account_password_alert_message" = "Zum Fortfahren, Passwort eingeben"; +"deactivate_account_password_alert_message" = "Zum Fortfahren, gib bitte das Passwort deines Matrix-Kontos ein"; "event_formatter_rerequest_keys_part1_link" = "Verschlüsselungsschlüssel neu anfordern"; "event_formatter_rerequest_keys_part2" = " von deinen anderen Sitzungen anfragen."; // Re-request confirmation dialog @@ -585,7 +585,7 @@ "key_backup_setup_intro_setup_action_without_existing_backup" = "Beginne Schlüsselsicherung zu nutzen"; "key_backup_setup_intro_setup_action_with_existing_backup" = "Benutze Schlüsselsicherung"; "key_backup_setup_passphrase_title" = "Sichere dein Backup mit einer Sicherungsphrase"; -"key_backup_setup_passphrase_info" = "Wir speichern eine verschlüsselte Kopie deiner Schlüssel auf unserem Server. Schütze sie mit einer Passphrase, um sie sicher zu halten.\n\nFür maximale Sicherheit sollte sich dies von deinem Kontopasswort unterscheiden."; +"key_backup_setup_passphrase_info" = "Wir speichern eine verschlüsselte Kopie deiner Schlüssel auf unserem Server. Schütze sie mit einer Passphrase, um sie sicher zu halten.\n\nFür maximale Sicherheit sollte sich dies von dem Passwort deines Matrix-Kontos unterscheiden."; "key_backup_setup_passphrase_passphrase_title" = "Eingeben"; "key_backup_setup_passphrase_passphrase_placeholder" = "Sicherungsphrase eingeben"; "key_backup_setup_passphrase_passphrase_valid" = "Gut!"; @@ -801,7 +801,7 @@ "image_picker_action_library" = "Aus der Mediathek auswählen"; "camera_unavailable" = "Die Kamera ist auf deinem Gerät nicht verfügbar"; "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 dein Kennwort zurückzusetzen."; +"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."; // Service terms @@ -810,9 +810,9 @@ "service_terms_modal_accept_button" = "Akzeptieren"; "service_terms_modal_description_for_identity_server" = "Für andere auffindbar sein"; "service_terms_modal_description_for_integration_manager" = "Bots, Brücken, Widgets und Aufkleberpakete verwenden"; -"auth_email_is_required" = "Es ist kein Identitätsserver konfiguriert, sodass du keine E-Mail-Adresse hinzufügen kannst, um dein Kennwort in Zukunft zurückzusetzen."; -"auth_phone_is_required" = "Es ist kein Identitätsserver konfiguriert, sodass du keine Telefonnummer hinzufügen kannst, um dein Kennwort in Zukunft zurückzusetzen."; -"auth_reset_password_error_is_required" = "Es ist kein Identitätsserver konfiguriert: Füge einen in die Serveroptionen ein, um dein Kennwort zurückzusetzen."; +"auth_email_is_required" = "Es ist kein Identitätsserver konfiguriert, sodass du keine E-Mail-Adresse hinzufügen kannst, um das Kennwort deines Matrix-Kontos in Zukunft zurückzusetzen."; +"auth_phone_is_required" = "Es ist kein Identitätsserver konfiguriert, sodass du keine Telefonnummer hinzufügen kannst, um das Kennwort deines Matrix-Kontos in Zukunft zurückzusetzen."; +"auth_reset_password_error_is_required" = "Es ist kein Identitätsserver konfiguriert: Füge einen in die Serveroptionen ein, um das Kennwort deines Matrix-Kontos zurückzusetzen."; // Errors "error_user_already_logged_in" = "Du versuchst anscheinend, eine Verbindung zu einem anderen Heimserver herzustellen. Möchtest du dich abmelden?"; "contacts_address_book_no_identity_server" = "Kein Identitätsserver konfiguriert"; @@ -888,7 +888,7 @@ "identity_server_settings_alert_disconnect_still_sharing_3pid" = "Du teilst noch deine persönlichen Daten mit dem Identitätsserver %@.\n\nWir empfehlen dir deine E-Mail-Adresse und Telefonnummer zu entfernen, bevor du die Verbindung zum Identitätsserver trennst."; "settings_add_3pid_password_title_email" = "E-Mail-Adresse hinzufügen"; "settings_add_3pid_password_title_msidsn" = "Telefonnummer hinzufügen"; -"settings_add_3pid_password_message" = "Um fortzufahren, bitte Passwort eingeben"; +"settings_add_3pid_password_message" = "Um fortzufahren, gib bitte das Passwort deines Matrix-Kontos ein"; "settings_add_3pid_invalid_password_message" = "Ungültige Anmeldedaten"; "identity_server_settings_disconnect_info" = "Eine Trennung vom Identitätsserver bedeutet, dass du weder von anderen Nutzer gefunden werden, noch diese dich per E-Mail oder Telefonnummer einladen können."; "error_not_supported_on_mobile" = "Dies ist in der Mobilvariante von %@ nicht möglich."; @@ -1012,7 +1012,7 @@ "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_user_password_description" = "Bestätige deine Identität durch Eingabe des Kontopassworts"; +"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."; "secure_key_backup_setup_intro_title" = "Sichere Datensicherung"; @@ -1020,7 +1020,7 @@ "room_participants_action_security_status_complete_security" = "Vollständige Sicherheit"; "external_link_confirmation_title" = "Überprüfe diesen Link genau"; "external_link_confirmation_message" = "Der Link %@ bringt dich auf eine andere Seite: %@\n\nSicher, dass du fortfahren möchtest?"; -"security_settings_crypto_sessions_description_2" = "Wenn du dich nicht angemeldet hast, ändere dein Passwort und setze die Sichere Sicherheitskopie zurück."; +"security_settings_crypto_sessions_description_2" = "Wenn du dich nicht angemeldet hast, ändere das Passwort deines Matrix-Kontos und setze die Sichere Sicherheitskopie zurück."; "security_settings_secure_backup_description" = "Sichere die Schlüssel, um Datenverlust zu verhindern. Sie werden mit einem Sicherungsschlüssel gesichert."; "security_settings_crosssigning_info_exists" = "Dein Konto hat eine Quersignatur-Identität, aber dieser Sitzung wird noch nicht vertraut. Vervollständige die Sicherheit auf diese Sitzung."; "security_settings_crosssigning_info_trusted" = "Quersignierung ist aktiviert. Du kannst anderen Nutzern und deinen anderen Sitzungen basierend auf der Quersignatur vertrauen, aber du kannst in dieser Sitzung keine Quersignierung durchführen, da sie keine privaten Quersignatur-Schlüssel enthält. Vervollständige die Sicherheit dieser Sitzung."; @@ -1076,8 +1076,8 @@ "key_verification_manually_verify_device_additional_information" = "Falls sie nicht übereinstimmen, wurde die Kommunikation vielleicht kompromittiert."; "key_verification_verified_new_session_title" = "Neue Sitzung verifiziert!"; "key_verification_verified_other_session_information" = "Du kannst nun sichere Nachrichten in deiner anderen Sitzung lesen. Andere Benutzer wissen, dass sie ihr vertrauen können."; -"key_verification_verified_new_session_information" = "Du kannst nun sichere Nachrichten auf deinem neuen Gerät lesen. Andere Benutzer wissen, dass sie es vertrauen können."; -"key_verification_verified_this_session_information" = "Du kannst nun sichere Nachrichten auf diesem Gerät lesen. Andere Benutzer wissen, dass sie es vertrauen können."; +"key_verification_verified_new_session_information" = "Du kannst nun sichere Nachrichten auf deinem neuen Gerät lesen. Andere Benutzer wissen, dass sie ihm vertrauen können."; +"key_verification_verified_this_session_information" = "Du kannst nun sichere Nachrichten auf diesem Gerät lesen. Andere Benutzer wissen, dass sie ihm vertrauen können."; "key_verification_verified_user_information" = "Nachrichten mit diesem Gegenüber sind Ende-zu-Ende verschlüsselt und können nicht von Dritten gelesen werden."; "key_verification_bootstrap_not_setup_title" = "Fehler"; "key_verification_bootstrap_not_setup_message" = "Du musst erst die Quersignatur einrichten."; @@ -1134,7 +1134,7 @@ "secrets_setup_recovery_key_storage_alert_message" = "✓ Drucke ihn aus und bewahre ihn an einem sicheren Ort auf\n✓ Speichere ihn auf einem USB-Stick oder einem Sicherungslaufwerk\n✓ Kopiere ihn zu deinem persönlichen Speicher im Netz"; "secrets_setup_recovery_passphrase_title" = "Setze Sicherheitsphrase"; "secrets_setup_recovery_passphrase_information" = "Gib eine Sicherheitsphrase ein, welche nur du kennst und deine Daten auf dem Server geheim halten soll."; -"secrets_setup_recovery_passphrase_additional_information" = "Benutze dein Kontopasswort nicht mehrfach."; +"secrets_setup_recovery_passphrase_additional_information" = "Benutze nicht das Passwort deines Matrix-Kontos."; "secrets_setup_recovery_passphrase_validate_action" = "Fertig"; "secrets_setup_recovery_passphrase_confirm_information" = "Gib deine Sicherheitsphrase zur Bestätigung erneut ein."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Bestätigen"; @@ -1231,7 +1231,7 @@ "secrets_recovery_reset_action_part_1" = "Wiederherstellungsoptionen vergessen oder verloren? "; "less" = "Weniger"; -"secrets_reset_authentication_message" = "Gib dein Kontopasswort ein, um zu bestätigen"; +"secrets_reset_authentication_message" = "Gib zum Bestätigen das Passwort deines Matrix-Kontos ein"; "secrets_reset_reset_action" = "Zurücksetzen"; "secrets_reset_warning_message" = "Du wirst ohne Nachrichtenverlauf, Nachrichten, vertraute Geräte oder vertraute Benutzer neustarten."; "secrets_reset_warning_title" = "Falls du alles zurücksetzt"; @@ -1248,7 +1248,7 @@ // MARK: - Favourites -"favourites_empty_view_title" = "Lieblingsräume und -nutzer"; +"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."; @@ -1476,7 +1476,7 @@ "spaces_empty_space_title" = "Dieser Space hat (noch) keine Räume"; "spaces_explore_rooms" = "Räume erkunden"; "leave_space_and_all_rooms_action" = "Alle Räume und Spaces verlassen"; -"leave_space_only_action" = "Keine Räume verlassen"; +"leave_space_only_action" = "Keine Räume und Subspaces verlassen"; "spaces_left_panel_title" = "Spaces"; "room_recents_suggested_rooms_section" = "VORGESCHLAGENE RÄUME"; "spaces_home_space_title" = "Start"; @@ -1603,3 +1603,35 @@ "poll_edit_form_poll_type_open_description" = "Ergebnisse werden direkt nach Stimmabgabe angezeigt"; "poll_edit_form_poll_type_open" = "Offene Umfrage"; "poll_edit_form_update_failure_title" = "Aktualisierung der Umfrage fehlgeschlagen"; +"threads_empty_tip" = "Hinweis: Tippe auf eine Nachricht und wähle „Thread“ um einen neuen zu starten."; +"threads_empty_info_my" = "Antworte auf einen laufenden Thread oder tippe auf eine Nachricht und wähle „Thread“ um einen neuen zu starten."; +"home_context_menu_normal_priority" = "Normale Priorität"; +"home_context_menu_low_priority" = "Niedrige Priorität"; +"home_context_menu_unfavourite" = "Aus Favoriten entfernen"; +"home_context_menu_favourite" = "Favorisieren"; +"location_sharing_post_failure_subtitle" = "%@ konnte deinen Standort nicht versenden. Bitte versuche es später erneut."; +"location_sharing_post_failure_title" = "Wir konnten deinen Standort nicht versenden"; +"home_context_menu_leave" = "Verlassen"; +"home_context_menu_unmute" = "Stummschaltung aufheben"; +"home_context_menu_mute" = "Stummschalten"; +"home_context_menu_notifications" = "Benachrichtigungen"; +"home_context_menu_make_room" = "Zu Räume verschieben"; +"home_context_menu_make_dm" = "Zu Personen verschieben"; +"event_formatter_message_deleted" = "Nachricht gelöscht"; +"settings_labs_enable_threads" = "Threads"; +"message_from_a_thread" = "Aus einem Thread"; +"threads_empty_show_all_threads" = "Alle Threads anzeigen"; +"threads_empty_info_all" = "Threads helfen dabei, dass deine Konversationen beim Thema und leicht nachverfolgbar bleiben."; +"threads_empty_title" = "Organisiere Diskussionen mit Threads"; +"threads_action_my_threads" = "Meine Threads"; +"threads_action_all_threads" = "Alle Threads"; +"threads_title" = "Threads"; +"thread_copy_link_to_thread" = "Link in Thread kopieren"; + +// MARK: Threads +"room_thread_title" = "Thread"; +"room_accessibility_thread_more" = "Mehr"; +"room_accessibility_threads" = "Threads"; +"room_event_copy_link_info" = "Link in die Zwischenablage kopiert."; +"room_event_action_reply_in_thread" = "Thread"; +"room_event_action_view_in_room" = "Im Raum anzeigen"; diff --git a/Riot/Assets/en.lproj/Untranslated.strings b/Riot/Assets/en.lproj/Untranslated.strings new file mode 100644 index 000000000..d55b74231 --- /dev/null +++ b/Riot/Assets/en.lproj/Untranslated.strings @@ -0,0 +1,23 @@ +/* + Copyright 2015 OpenMarket Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +/** These strings will be ignored by Weblate. Useful for WIP **/ + +// MARK: Onboarding Personalisation WIP +"onboarding_congratulations_title" = "Congratulations!"; +"onboarding_congratulations_message" = "Your account\n%@\nhas been created."; +"onboarding_congratulations_personalise_button" = "Personalise profile"; +"onboarding_congratulations_home_button" = "Take me home"; diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index b57cc962f..3becf4b89 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -298,6 +298,8 @@ Tap the + to start adding people."; "room_participants_leave_prompt_title_for_dm" = "Leave"; "room_participants_leave_prompt_msg" = "Are you sure you want to leave the room?"; "room_participants_leave_prompt_msg_for_dm" = "Are you sure you want to leave?"; +"room_participants_leave_processing" = "Leaving"; +"room_participants_leave_success" = "Left room"; "room_participants_remove_prompt_title" = "Confirmation"; "room_participants_remove_prompt_msg" = "Are you sure you want to remove %@ from this chat?"; "room_participants_remove_third_party_invite_prompt_msg" = "Are you sure you want to revoke this invite?"; @@ -1792,6 +1794,7 @@ Tap the + to start adding people."; "home_context_menu_low_priority" = "Low priority"; "home_context_menu_normal_priority" = "Normal priority"; "home_context_menu_leave" = "Leave"; +"home_syncing" = "Syncing"; // MARK: - Favourites diff --git a/Riot/Assets/et.lproj/Vector.strings b/Riot/Assets/et.lproj/Vector.strings index 77da3b78c..172becd1e 100644 --- a/Riot/Assets/et.lproj/Vector.strings +++ b/Riot/Assets/et.lproj/Vector.strings @@ -53,7 +53,7 @@ "auth_optional_phone_placeholder" = "Telefoninumber (kui soovid)"; "auth_phone_placeholder" = "Telefoninumber"; "auth_repeat_password_placeholder" = "Korda salasõna"; -"auth_repeat_new_password_placeholder" = "Korda uut salasõna"; +"auth_repeat_new_password_placeholder" = "Korda uut Matrix'i konto salasõna"; "auth_home_server_placeholder" = "URL (näiteks https://matrix.org)"; "auth_identity_server_placeholder" = "URL (näiteks https://vector.im)"; "auth_invalid_login_param" = "Vigane kasutajanimi ja/või salasõna"; @@ -70,13 +70,13 @@ "auth_missing_email_or_phone" = "E-posti aadress või telefoninumber on puudu"; "auth_email_in_use" = "See e-posti aadress on juba kasutusel"; "auth_phone_in_use" = "See telefoninumber on juba kasutusel"; -"auth_email_is_required" = "Ühtegi isikutuvastusserverit pole seadistatud ning sul ei ole võimalik lisada oma e-posti aadressi hilisemaks võimalikuks salasõna muutmiseks."; -"auth_phone_is_required" = "Ühtegi isikutuvastusserverit pole seadistatud ning sul ei ole võimalik lisada oma telefoninumbrit hilisemaks võimalikuks salasõna muutmiseks."; +"auth_email_is_required" = "Ühtegi isikutuvastusserverit pole seadistatud ning sul ei ole võimalik lisada oma e-posti aadressi hilisemaks võimalikuks Matrix'i konto salasõna muutmiseks."; +"auth_phone_is_required" = "Ühtegi isikutuvastusserverit pole seadistatud ning sul ei ole võimalik lisada oma telefoninumbrit hilisemaks võimalikuks Matrix'i konto salasõna muutmiseks."; "auth_untrusted_id_server" = "See isikutuvastusserver pole usaldusväärne"; "auth_password_dont_match" = "Salasõnad ei klapi omavahel"; "auth_username_in_use" = "Selline kasutajanimi on juba olemas"; -"auth_forgot_password" = "Kas unustasid oma salasõna?"; -"auth_forgot_password_error_no_configured_identity_server" = "Ühtegi isikutuvastusserverit pole seadistatud: salasõna taastamiseks määra see."; +"auth_forgot_password" = "Kas unustasid oma Matrix'i konto salasõna?"; +"auth_forgot_password_error_no_configured_identity_server" = "Ühtegi isikutuvastusserverit pole seadistatud: Matrix'i konto salasõna taastamiseks määra see."; "auth_email_not_found" = "E-kirja saatmine ei õnnestunud: sellist e-posti aadressi ei leidu"; "auth_use_server_options" = "Kohandatud serveriseadistused"; "auth_email_validation_message" = "Registreerimise jätkamiseks palun vaata oma e-posti"; @@ -84,15 +84,15 @@ "auth_msisdn_validation_message" = "Me oleme SMS'iga saatnud aktiveerimiskoodi. Palun sisesta see kood siia."; "auth_msisdn_validation_error" = "Telefoninumbri verifitseerimine ei õnnestunud."; "auth_recaptcha_message" = "See server soovib kindlaks teha, et sa ei ole robot"; -"auth_reset_password_message" = "Salasõna taastamiseks sisesta sinu kontoga seotud e-posti aadress:"; +"auth_reset_password_message" = "Matrix'i konto salasõna taastamiseks sisesta sinu kontoga seotud e-posti aadress:"; "auth_reset_password_missing_email" = "Sa pead sisestama oma kontoga seotud e-posti aadressi."; "auth_reset_password_missing_password" = "Palun sisesta uus salasõna."; "auth_reset_password_email_validation_message" = "Saatsime e-kirja %@ aadressile. Kui oled avanud selles kirjas leidunud lingi, siis palun vajuta järgnevat nuppu."; "auth_reset_password_next_step_button" = "Ma olen teinud läbi oma e-posti aadressi kontrolli"; "auth_reset_password_error_unauthorized" = "E-posti aadressi kontrollimine ei õnnestunud: palun vaata, et sa kindlasti klõpsisid saabunud kirjas olnud viidet"; "auth_reset_password_error_not_found" = "Sinu e-posti aadress ei tundu olema selles koduserveris seotud Matrixi kasutajatunnusega."; -"auth_reset_password_error_is_required" = "Ühtegi isikutuvastusserverit pole seadistatud: salasõna taastamiseks määra see serveri sätetes."; -"auth_reset_password_success_message" = "Sinu salasõna on vahetatud. \n \nSa oled välja logitud kõikidest oma seni kasutusel olnud sessioonidest ega saa enam teateid ega sõnumeid. Nende uuesti lugemiseks palun logi igas seadmes tagasi Matrix'i võrku."; +"auth_reset_password_error_is_required" = "Ühtegi isikutuvastusserverit pole seadistatud: Matrix'i konto salasõna taastamiseks määra see serveri sätetes."; +"auth_reset_password_success_message" = "Sinu Matrix'i konto salasõna on vahetatud. \n \nSa oled välja logitud kõikidest oma seni kasutusel olnud sessioonidest ega saa enam teateid ega sõnumeid. Nende uuesti lugemiseks palun logi igas seadmes tagasi Matrix'i võrku."; "auth_add_email_and_phone_warning" = "Registreerimine kasutades korraga nii e-posti aadressi kui ka telefoninumbrit ei ole senise API versiooni puhul veel võimalik. Hetkel läheb arvesse vaid telefoninumber. Sa võid hiljem lisada e-posti aadressi oma kasutajaprofiili seadetest."; "auth_accept_policies" = "Palun vaata üle kõik selle koduserveri kasutustingimused ja nõustu nendega:"; "auth_autodiscover_invalid_response" = "Vigane koduserveri tuvastamise päringu vastus"; @@ -209,7 +209,7 @@ "deactivate_account_forget_messages_information_part2_emphasize" = "Hoiatus"; "deactivate_account_validate_action" = "Kas eemaldame selle konto kasutusest"; "deactivate_account_password_alert_title" = "Eemalda konto"; -"deactivate_account_password_alert_message" = "Jätkamiseks palun sisesta oma salasõna"; +"deactivate_account_password_alert_message" = "Jätkamiseks palun sisesta oma Matrix'i konto salasõna"; "auth_login_single_sign_on" = "Logi sisse"; // Room recents "room_recents_directory_section" = "JUTUTUBADE LOEND"; @@ -251,7 +251,7 @@ "room_event_action_redact" = "Eemalda"; "room_event_action_more" = "Veel"; "room_event_action_share" = "Jaga"; -"room_event_action_permalink" = "Püsiviide"; +"room_event_action_permalink" = "Kopeeri link sõnumisse"; "room_event_action_view_source" = "Vaata lähtekoodi"; "room_event_action_view_decrypted_source" = "Näita dekrüptitud lähtekoodi"; "room_event_action_report" = "Teata kahtlasest sisust"; @@ -487,7 +487,7 @@ "settings_add_email_address" = "Lisa e-posti aadress"; "settings_phone_number" = "Telefon"; "settings_add_phone_number" = "Lisa telefoninumber"; -"settings_change_password" = "Muuda salasõna"; +"settings_change_password" = "Muuda Matrix'i konto salasõna"; "settings_fail_to_update_profile" = "Profiili uuendamine ei õnnestunud"; "settings_global_settings_info" = "Üldised teavituste seadistused leiduvad sinu %@ veebikliendis"; "settings_pin_rooms_with_missed_notif" = "Klammerda jututoad, kus leidub lugemata teavitusi"; @@ -524,11 +524,11 @@ "settings_old_password" = "vana salasõna"; "settings_new_password" = "uus salasõna"; "settings_confirm_password" = "korda uut salasõna"; -"settings_fail_to_update_password" = "Salasõna uuendamine ei õnnestunud"; -"settings_password_updated" = "Sinu salasõna on muudetud"; +"settings_fail_to_update_password" = "Matrix'i konto salasõna uuendamine ei õnnestunud"; +"settings_password_updated" = "Sinu Matrix'i konto salasõna on muudetud"; "settings_add_3pid_password_title_email" = "Lisa e-posti aadress"; "settings_add_3pid_password_title_msidsn" = "Lisa telefoninumber"; -"settings_add_3pid_password_message" = "Jätkamiseks palun sisesta oma salasõna"; +"settings_add_3pid_password_message" = "Jätkamiseks palun sisesta oma Matrix'i konto salasõna"; "settings_add_3pid_invalid_password_message" = "Vigane kasutajanimi või salasõna"; "settings_crypto_device_name" = "Sessiooni nimi: "; "settings_crypto_device_id" = "\nSessiooni tunnus: "; @@ -537,7 +537,7 @@ "settings_crypto_blacklist_unverified_devices" = "Kasuta krüptimist vaid verifitseeritud sessioonides"; "settings_deactivate_my_account" = "Eemalda minu konto kasutusest"; "security_settings_crypto_sessions_loading" = "Laadin sessioone…"; -"security_settings_user_password_description" = "Tuvasta oma isik sisestades salasõna"; +"security_settings_user_password_description" = "Tuvasta oma isik sisestades Matrix'i konto salasõna"; // Manage session "manage_session_title" = "Halda sessiooni"; "manage_session_info" = "SESSIOONI TEAVE"; @@ -766,7 +766,7 @@ // Security settings "security_settings_title" = "Turvalisus"; "security_settings_crypto_sessions" = "MINU SESSIOONID"; -"security_settings_crypto_sessions_description_2" = "Kui sa ei tunne ära mõnda oma sisselogimissessiooni, siis muuda ära oma salasõna ja tee võtmetest uus turvaline varukoopia."; +"security_settings_crypto_sessions_description_2" = "Kui sa ei tunne ära mõnda oma sisselogimissessiooni, siis muuda ära oma Matrix'i konto salasõna ja tee võtmetest uus turvaline varukoopia."; "security_settings_secure_backup" = "TURVALINE VARUNDUS"; "security_settings_secure_backup_description" = "Selleks puhuks, kui sa kaotad ligipääsu kõikidele oma sessioonidele, tee varukoopia oma krüptovõtmetest ja kasutajakonto seadistustest. Unikaalse turvavõtmega tagad selle, et sinu varukoopia on kaitstud."; "security_settings_secure_backup_setup" = "Võta kasutusele"; @@ -794,7 +794,7 @@ "key_backup_setup_intro_manual_export_info" = "(Lisaseadistused)"; "key_backup_setup_intro_manual_export_action" = "Ekspordi võtmed käsitsi"; "key_backup_setup_passphrase_title" = "Krüpti oma varukoopia turvafraasiga"; -"key_backup_setup_passphrase_info" = "Me salvestame krüptitud varukoopia sinu krüptovõtmetest meie serveris. Tagamaks, et keegi ei saa seda kasutada, krüpti varukoopia paroolifraasiga.\n\n Parima turvalisuse jaoks peaks paroolifraas olema erinev sinu konto salasõnast."; +"key_backup_setup_passphrase_info" = "Me salvestame krüptitud varukoopia sinu krüptovõtmetest meie serveris. Tagamaks, et keegi ei saa seda kasutada, krüpti varukoopia paroolifraasiga.\n\n Parima turvalisuse jaoks peaks paroolifraas olema erinev sinu Matrix'i konto salasõnast."; "key_backup_setup_passphrase_passphrase_title" = "Sisesta"; "key_backup_setup_passphrase_passphrase_placeholder" = "Sisesta paroolifraas"; "key_backup_setup_passphrase_passphrase_valid" = "Tore!"; @@ -1057,7 +1057,7 @@ "secrets_setup_recovery_key_storage_alert_message" = "✓ Trüki välja ja hoia turvalises kohas\n✓ Salvesta ta mälupulgale või välisele kõvakattale\n✓ Kopeeri ta sinu isiklikku salvestusruumi mõnes andmepilves"; "secrets_setup_recovery_passphrase_title" = "Määra turvafraas"; "secrets_setup_recovery_passphrase_information" = "Andmete kaitsmiseks sinu koduserveris sisesta turvafraas, mida vaid sina tead."; -"secrets_setup_recovery_passphrase_additional_information" = "Palun ära kasuta selleks oma tavalist konto salasõna."; +"secrets_setup_recovery_passphrase_additional_information" = "Palun ära kasuta selleks oma Matrix'i konto salasõna."; "secrets_setup_recovery_passphrase_validate_action" = "Valmis"; "secrets_setup_recovery_passphrase_confirm_information" = "Kinnituseks sisesta turvafraas uuesti."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Kinnita"; @@ -1181,7 +1181,7 @@ "room_details_advanced_e2e_encryption_enabled_for_dm" = "Krüptimine on selles jututoas kasutusel"; "room_details_advanced_e2e_encryption_disabled_for_dm" = "Krüptimine ei ole selles jututoas kasutusel."; "pin_protection_kick_user_alert_message" = "Liiga palju vigu PIN-koodi sisestamisel ning sa oled nüüd välja logitud"; -"secrets_reset_authentication_message" = "Kinnitamaks seda muudatust, sisesta oma konto salasõna"; +"secrets_reset_authentication_message" = "Kinnitamaks seda muudatust, sisesta oma Matrix'i konto salasõna"; "secrets_reset_reset_action" = "Taasta algolek"; "secrets_reset_warning_message" = "Siis alustad nii, et kadunud on ajalugu, sõnumid ning usaldatud seadmed ja kasutajad."; "secrets_reset_warning_title" = "Kui sa alustad kõigega algusest"; @@ -1563,3 +1563,35 @@ "poll_edit_form_update_failure_subtitle" = "Palun proovi uuesti"; "poll_edit_form_update_failure_title" = "Küsitluse muutmine ei õnnestunud"; "poll_edit_form_poll_type" = "Küsitluse tüüp"; +"location_sharing_post_failure_subtitle" = "%@ ei saanud sinu asukohta edastada. Palun proovi hiljem uuesti."; +"location_sharing_post_failure_title" = "Sinu asukoha saatmine ei õnnestunud"; +"home_context_menu_leave" = "Lahku"; +"home_context_menu_normal_priority" = "Tavalise tähtsusega"; +"home_context_menu_low_priority" = "Vähetähtis"; +"home_context_menu_unfavourite" = "Eemalda lemmikute hulgast"; +"home_context_menu_favourite" = "Lemmik"; +"home_context_menu_unmute" = "Eemalda summutamine"; +"home_context_menu_mute" = "Summuta"; +"home_context_menu_notifications" = "Teavitused"; +"home_context_menu_make_dm" = "Tõsta otsevestluste alla"; +"home_context_menu_make_room" = "Tõsta jututubade alla"; +"event_formatter_message_deleted" = "Sõnum on kustutatud"; +"settings_labs_enable_threads" = "Sõnumid jutulõngana"; +"message_from_a_thread" = "Jutulõngast"; +"threads_empty_show_all_threads" = "Näita kõiki jutulõngasid"; +"threads_empty_tip" = "Soovitus: uue jutulõnga alustamiseks klõpsi sõnumit ja vali „Jutulõng“."; +"threads_empty_info_my" = "Vasta olemasolevasse jutulõnga või uue jutulõnga alustamiseks klõpsi sõnumit ja vali „Jutulõng“."; +"threads_empty_info_all" = "Jutulõngad aitavad hoida vestlused teemakohastena ning mugavalt loetavatena."; +"threads_empty_title" = "Halda vestlusi jutulõngadena"; +"threads_action_my_threads" = "Minu jutulõngad"; +"threads_action_all_threads" = "Kõik jutulõngad"; +"threads_title" = "Jutulõngad"; +"thread_copy_link_to_thread" = "Kopeeri jutulõnga link"; + +// MARK: Threads +"room_thread_title" = "Jutulõng"; +"room_accessibility_thread_more" = "Veel"; +"room_accessibility_threads" = "Jutulõngad"; +"room_event_copy_link_info" = "Link on kopeeritud lõikelauale."; +"room_event_action_reply_in_thread" = "Jutulõng"; +"room_event_action_view_in_room" = "Vaata jututoas"; diff --git a/Riot/Assets/fr.lproj/Localizable.strings b/Riot/Assets/fr.lproj/Localizable.strings index 97b1481bb..84ef90f6f 100644 --- a/Riot/Assets/fr.lproj/Localizable.strings +++ b/Riot/Assets/fr.lproj/Localizable.strings @@ -116,3 +116,6 @@ /** General **/ "NOTIFICATION" = "Notification"; + +/* New file message from a specific person, not referencing a room. */ +"LOCATION_FROM_USER" = "%@ a partagé sa localisation"; diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings index d30a43e9e..0e0d9676b 100644 --- a/Riot/Assets/fr.lproj/Vector.strings +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -47,7 +47,7 @@ "auth_optional_phone_placeholder" = "Numéro de téléphone (facultatif)"; "auth_phone_placeholder" = "Numéro de téléphone"; "auth_repeat_password_placeholder" = "Répéter le mot de passe"; -"auth_repeat_new_password_placeholder" = "Confirmer le nouveau mot de passe"; +"auth_repeat_new_password_placeholder" = "Confirmer le nouveau mot de passe de votre compte Matrix"; "auth_invalid_login_param" = "Nom d’utilisateur et/ou mot de passe incorrect"; "auth_invalid_user_name" = "Les noms d’utilisateur ne peuvent contenir que des lettres, des chiffres, des points, des traits d’union ou des tirets bas"; "auth_invalid_password" = "Mot de passe trop court (min 6)"; @@ -70,14 +70,14 @@ "auth_msisdn_validation_message" = "Nous vous avons envoyé un SMS avec un code d’activation. Merci de le recopier ci-dessous."; "auth_msisdn_validation_error" = "Impossible de vérifier votre numéro de téléphone."; "auth_recaptcha_message" = "Ce serveur d’accueil voudrait s’assurer que vous n’êtes pas un robot"; -"auth_reset_password_message" = "Pour réinitialiser votre mot de passe, saisissez l’adresse e-mail liée à votre compte :"; +"auth_reset_password_message" = "Pour réinitialiser le mot de passe de votre compte Matrix, saisissez l’adresse e-mail liée à votre compte :"; "auth_reset_password_missing_email" = "Vous devez saisir l’adresse e-mail liée à votre compte."; "auth_reset_password_missing_password" = "Vous devez spécifier un nouveau mot de passe."; "auth_reset_password_email_validation_message" = "Un e-mail a été envoyé à %@. Cliquez d’abord sur le lien dans l’e-mail, puis ci-dessous."; "auth_reset_password_next_step_button" = "J’ai vérifié mon adresse e-mail"; "auth_reset_password_error_unauthorized" = "Impossible de vérifier l’adresse e-mail : assurez-vous de cliquer sur le lien dans l’e-mail"; "auth_reset_password_error_not_found" = "Votre adresse e-mail ne semble pas associée à un identifiant Matrix sur ce serveur d’accueil."; -"auth_reset_password_success_message" = "Votre mot de passe a été réinitialisé.\n\nVous avez été déconnecté de toutes vos sessions et ne recevrez plus de notifications. Pour réactiver les notifications, reconnectez-vous sur chaque appareil."; +"auth_reset_password_success_message" = "Le mot de passe de votre compte Matrix a été réinitialisé.\n\nVous avez été déconnecté de toutes vos sessions et ne recevrez plus de notifications. Pour réactiver les notifications, reconnectez-vous sur chaque appareil."; "auth_add_email_and_phone_warning" = "L’inscription avec un e-mail et un numéro de téléphone à la fois n’est pas prise en charge tant que l’API n'existe pas. Seul votre numéro de téléphone sera pris en compte. Vous pourrez ajouter l’adresse e-mail dans vos options de profil."; // Chat creation "room_creation_title" = "Nouvelle discussion"; @@ -206,7 +206,7 @@ "room_event_action_redact" = "Effacer"; "room_event_action_more" = "Plus"; "room_event_action_share" = "Partager"; -"room_event_action_permalink" = "Permalien"; +"room_event_action_permalink" = "Copier le lien vers le message"; "room_event_action_view_source" = "Voir la source"; "room_event_action_report" = "Signaler le contenu"; "room_event_action_report_prompt_reason" = "Raison pour le signalement du contenu"; @@ -292,12 +292,12 @@ "settings_send_crash_report" = "Envoyer des rapports d’anomalies anonymes et des statistiques d’utilisation"; "settings_enable_rageshake" = "Secouer l’appareil pour signaler un bug"; "settings_clear_cache" = "Vider le cache"; -"settings_change_password" = "Changer de mot de passe"; +"settings_change_password" = "Changer le mot de passe de votre compte Matrix"; "settings_old_password" = "ancien mot de passe"; "settings_new_password" = "nouveau mot de passe"; "settings_confirm_password" = "confirmer le mot de passe"; -"settings_fail_to_update_password" = "Échec de la modification du mot de passe"; -"settings_password_updated" = "Votre mot de passe a été modifié"; +"settings_fail_to_update_password" = "Échec de la modification du mot de passe du compte Matrix"; +"settings_password_updated" = "Le mot de passe de votre compte Matrix a été modifié"; "settings_crypto_device_name" = "Nom de la session : "; "settings_crypto_device_id" = "\nIdentifiant de la session : "; "settings_crypto_device_key" = "\nClé de la session :\n"; @@ -526,7 +526,7 @@ "deactivate_account_forget_messages_information_part3" = ": les futurs utilisateurs auront alors une vue incomplète des conversations)"; "deactivate_account_validate_action" = "Désactiver le compte"; "deactivate_account_password_alert_title" = "Désactiver le compte"; -"deactivate_account_password_alert_message" = "Pour continuer, veuillez renseigner votre mot de passe"; +"deactivate_account_password_alert_message" = "Pour continuer, veuillez renseigner le mot de passe de votre compte Matrix"; "event_formatter_rerequest_keys_part1_link" = "Redemander les clés de chiffrement"; "event_formatter_rerequest_keys_part2" = " depuis vos autres sessions."; // Re-request confirmation dialog @@ -584,7 +584,7 @@ "key_backup_setup_intro_title" = "Ne perdez jamais vos messages chiffrés"; "key_backup_setup_intro_info" = "Les messages des salons chiffrés sont sécurisés avec un chiffrement de bout en bout. Seuls vous et le(s) destinataire(s) avez les clés pour lire ces messages.\n\nSauvegardez vos clés de façon sécurisée pour éviter de les perdre."; "key_backup_setup_intro_setup_action" = "Configurer"; -"key_backup_setup_passphrase_info" = "Nous conserverons une copie chiffrée de vos clés sur notre serveur. Protégez votre sauvegarde avec une phrase secrète pour qu’elle soit en sécurité.\n\nPour une sécurité maximale, elle devrait être différente du mot de passe de votre compte."; +"key_backup_setup_passphrase_info" = "Nous conserverons une copie chiffrée de vos clés sur notre serveur. Protégez votre sauvegarde avec une phrase secrète pour qu’elle soit en sécurité.\n\nPour une sécurité maximale, elle devrait être différente du mot de passe de votre compte Matrix."; "key_backup_setup_passphrase_passphrase_title" = "Saisir"; "key_backup_setup_passphrase_passphrase_placeholder" = "Saisir la phrase secrète"; "key_backup_setup_passphrase_passphrase_valid" = "Super !"; @@ -816,7 +816,7 @@ "image_picker_action_library" = "Choisir dans la médiathèque"; "camera_unavailable" = "L’appareil photo n’est pas disponible sur votre appareil"; "photo_library_access_not_granted" = "%@ n’a pas la permission pour accéder à la médiathèque, veuillez modifier les options de confidentialité"; -"auth_forgot_password_error_no_configured_identity_server" = "Aucun serveur d’identité n’est configuré : ajoutez-en un pour réinitialiser votre mot de passe."; +"auth_forgot_password_error_no_configured_identity_server" = "Aucun serveur d’identité n’est configuré : ajoutez-en un pour réinitialiser le mot de passe de votre compte Matrix."; "room_creation_error_invite_user_by_email_without_identity_server" = "Aucun serveur d’identité n’est configuré donc vous ne pouvez pas ajouter de participant avec un e-mail."; "room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Aucun serveur d’identité n’est configuré donc vous ne pouvez pas commencer de discussion avec un contact en utilisant un e-mail."; // Service terms @@ -845,9 +845,9 @@ "auth_add_email_message_2" = "Définissez une adresse e-mail pour la récupération de compte, et pour être éventuellement découvrable par les personnes qui vous connaissent."; "auth_add_phone_message_2" = "Définissez un numéro de téléphone pour être éventuellement découvrable par les personnes qui vous connaissent."; "auth_add_email_phone_message_2" = "Définissez une adresse e-mail pour la récupération de compte. Vous pouvez ensuite utiliser votre e-mail ou votre numéro de téléphone pour être découvrable par les personnes qui vous connaissent."; -"auth_email_is_required" = "Aucun serveur d’identité n’est configuré donc vous ne pouvez pas ajouter d’adresse e-mail pour pouvoir réinitialiser votre mot de passe ultérieurement."; -"auth_phone_is_required" = "Aucun serveur d’identité n’est configuré donc vous ne pouvez pas ajouter de numéro de téléphone pour pouvoir réinitialiser votre mot de passe ultérieurement."; -"auth_reset_password_error_is_required" = "Aucun serveur d’identité n’est configuré : ajoutez-en un dans les options du serveur pour réinitialiser votre mot de passe."; +"auth_email_is_required" = "Aucun serveur d’identité n’est configuré donc vous ne pouvez pas ajouter d’adresse e-mail pour pouvoir réinitialiser le mot de passe de votre compte Matrix ultérieurement."; +"auth_phone_is_required" = "Aucun serveur d’identité n’est configuré donc vous ne pouvez pas ajouter de numéro de téléphone pour pouvoir réinitialiser le mot de passe de votre compte Matrix ultérieurement."; +"auth_reset_password_error_is_required" = "Aucun serveur d’identité n’est configuré : ajoutez-en un dans les options du serveur pour réinitialiser le mot de passe de votre compte Matrix."; "contacts_address_book_no_identity_server" = "Aucun serveur d’identité n’est configuré"; "settings_discovery_settings" = "DÉCOUVERTE"; "settings_identity_server_settings" = "SERVEUR D’IDENTITÉ"; @@ -908,7 +908,7 @@ "service_terms_modal_message_identity_server" = "Acceptez les conditions du serveur d’identité (%@) pour découvrir des contacts."; "settings_add_3pid_password_title_email" = "Ajouter une adresse e-mail"; "settings_add_3pid_password_title_msidsn" = "Ajouter un numéro de téléphone"; -"settings_add_3pid_password_message" = "Pour continuer, saisissez votre mot de passe"; +"settings_add_3pid_password_message" = "Pour continuer, saisissez le mot de passe de votre compte Matrix"; "settings_add_3pid_invalid_password_message" = "Informations d’authentification invalides"; "error_not_supported_on_mobile" = "Vous ne pouvez pas faire cela depuis %@ mobile."; "widget_menu_refresh" = "Actualiser"; @@ -1130,7 +1130,7 @@ "secrets_setup_recovery_key_storage_alert_message" = "✓ Imprimez-la et stockez-la dans un endroit sûr\n✓ Sauvegardez-la sur une clé USB ou un disque de sauvegarde\n✓ Copiez-la sur votre stockage personnel dans le cloud"; "secrets_setup_recovery_passphrase_title" = "Définir une phrase de sécurité"; "secrets_setup_recovery_passphrase_information" = "Saisissez une phrase de sécurité que vous seul connaissez, utilisée pour sécuriser les secrets sur votre serveur."; -"secrets_setup_recovery_passphrase_additional_information" = "N’utilisez pas le mot de passe de votre compte."; +"secrets_setup_recovery_passphrase_additional_information" = "N’utilisez pas le mot de passe de votre compte Matrix."; "secrets_setup_recovery_passphrase_validate_action" = "Terminé"; "secrets_setup_recovery_passphrase_confirm_information" = "Saisissez à nouveau votre phrase de sécurité pour la confirmer."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Confirmer"; @@ -1139,13 +1139,13 @@ "authenticated_session_flow_not_supported" = "Cette application ne prend par en charge le mécanisme d’authentification de votre serveur d’accueil."; "secure_backup_setup_banner_title" = "Sauvegarde sécurisée"; "secure_backup_setup_banner_subtitle" = "Protection afin d’éviter de perdre l’accès aux messages et données chiffrés"; -"security_settings_crypto_sessions_description_2" = "Si vous ne reconnaissez pas une connexion, changez votre mot de passe et réinitialisez la sauvegarde sécurisée."; +"security_settings_crypto_sessions_description_2" = "Si vous ne reconnaissez pas une connexion, changez le mot de passe de votre compte Matrix et réinitialisez la sauvegarde sécurisée."; "security_settings_secure_backup" = "SAUVEGARDE SÉCURISÉE"; "security_settings_secure_backup_description" = "Sauvegardez vos clés de chiffrement et les données de votre compte au où vous perdriez l’accès à vos sessions. Vos clés seront protégées par une clé de sécurité unique."; "security_settings_secure_backup_setup" = "Configurer"; "security_settings_secure_backup_synchronise" = "Synchroniser"; "security_settings_secure_backup_delete" = "Supprimer la sauvegarde"; -"security_settings_user_password_description" = "Confirmez votre identité en saisissant le mot de passe de votre compte"; +"security_settings_user_password_description" = "Confirmez votre identité en saisissant le mot de passe de votre compte Matrix"; "secure_key_backup_setup_existing_backup_error_title" = "Une sauvegarde pour les messages existe déjà"; "secure_key_backup_setup_existing_backup_error_info" = "Déverrouillez-la pour la réutiliser dans la sauvegarde sécurisée ou supprimez-la pour créer une nouvelle sauvegarde de messages dans la sauvegarde sécurisée."; "secure_key_backup_setup_existing_backup_error_unlock_it" = "La déverrouiller"; @@ -1285,7 +1285,7 @@ // MARK: - Major update "major_update_title" = "Riot est désormais %@"; -"secrets_reset_authentication_message" = "Saisir votre mot de passe de compte pour confirmer"; +"secrets_reset_authentication_message" = "Saisissez le mot de passe de votre compte Matrix pour confirmer"; "secrets_reset_reset_action" = "Réinitialiser"; "secrets_reset_warning_message" = "Vous allez reprendre sans historique, sans message, appareil ou utilisateur de confiance."; "secrets_reset_warning_title" = "Si vous réinitialisez tout"; @@ -1640,3 +1640,35 @@ "poll_edit_form_update_failure_subtitle" = "Veuillez réessayer"; "poll_edit_form_update_failure_title" = "Échec lors de la mise à jour du sondage"; "poll_edit_form_poll_type" = "Type de sondage"; +"location_sharing_post_failure_subtitle" = "%# n’a pas pu envoyer votre localisation. Merci de réessayer plus tard."; +"location_sharing_post_failure_title" = "Nous n’avons pas pu envoyer votre localisation"; +"home_context_menu_leave" = "Partir"; +"home_context_menu_unfavourite" = "Retirer des favoris"; +"home_context_menu_favourite" = "Mettre en favoris"; +"home_context_menu_unmute" = "Retirer la sourdine"; +"home_context_menu_mute" = "Mettre en sourdine"; +"home_context_menu_notifications" = "Notifications"; +"home_context_menu_make_room" = "Déplacer vers Salons"; +"home_context_menu_make_dm" = "Déplacer vers Personnes"; +"event_formatter_message_deleted" = "Message supprimé"; +"settings_labs_enable_threads" = "Fils de discussion"; +"message_from_a_thread" = "Depuis un fil de discussion"; +"threads_empty_show_all_threads" = "Afficher tous les fils de discussion"; +"threads_empty_tip" = "Astuce : appuyez sur un message puis sur « Fil » pour en commencer un nouveau."; +"threads_empty_info_my" = "Répondez à un fil de discussion actif, ou appuyez sur un message et utilisez « Fil » pour en commencer un nouveau."; +"threads_empty_info_all" = "Les fils de discussion vous permettent de centrer vos conversations sur un sujet, et de les suivre facilement."; +"threads_empty_title" = "Gardez vos conversations organisées avec les fils de discussion"; +"threads_action_my_threads" = "Mes fils"; +"threads_action_all_threads" = "Tous les fils"; +"threads_title" = "Fils"; +"thread_copy_link_to_thread" = "Copier le lien vers le fil"; + +// MARK: Threads +"room_thread_title" = "Fil"; +"room_accessibility_thread_more" = "Plus"; +"room_accessibility_threads" = "Fils"; +"room_event_copy_link_info" = "Lien copié dans le presse-papier."; +"room_event_action_reply_in_thread" = "Fil"; +"room_event_action_view_in_room" = "Afficher dans le salon"; +"home_context_menu_normal_priority" = "Priorité normale"; +"home_context_menu_low_priority" = "Basse priorité"; diff --git a/Riot/Assets/he.lproj/Localizable.strings b/Riot/Assets/he.lproj/Localizable.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/he.lproj/Localizable.strings @@ -0,0 +1 @@ + diff --git a/Riot/Assets/he.lproj/Vector.strings b/Riot/Assets/he.lproj/Vector.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/he.lproj/Vector.strings @@ -0,0 +1 @@ + diff --git a/Riot/Assets/hu.lproj/Vector.strings b/Riot/Assets/hu.lproj/Vector.strings index e7d700ffa..2b2bf8853 100644 --- a/Riot/Assets/hu.lproj/Vector.strings +++ b/Riot/Assets/hu.lproj/Vector.strings @@ -52,7 +52,7 @@ "auth_optional_phone_placeholder" = "Telefonszám (nem kötelező)"; "auth_phone_placeholder" = "Telefonszám"; "auth_repeat_password_placeholder" = "Jelszó megerősítés"; -"auth_repeat_new_password_placeholder" = "Új jelszó megerősítés"; +"auth_repeat_new_password_placeholder" = "Új Matrix fiók jelszó megerősítés"; "auth_home_server_placeholder" = "URL (pl. https://matrix.org)"; "auth_identity_server_placeholder" = "URL (pl. https://vector.im)"; "auth_invalid_login_param" = "Hibás felhasználói név és/vagy jelszó"; @@ -73,7 +73,7 @@ "auth_untrusted_id_server" = "Az azonosító szerver megbízhatatlan"; "auth_password_dont_match" = "A jelszavak nem egyeznek meg"; "auth_username_in_use" = "A felhasználónév foglalt"; -"auth_forgot_password" = "Elfelejtetted a jelszót?"; +"auth_forgot_password" = "Elfelejtetted a Matrix fiók jelszót?"; "auth_email_not_found" = "E-mail küldési hiba: Az e-mail cím nem található"; "auth_use_server_options" = "Egyedi szerver beállítások használata (haladó)"; "auth_email_validation_message" = "Ellenőrizd az e-mailedet a regisztráció folytatásához"; @@ -81,14 +81,14 @@ "auth_msisdn_validation_message" = "Elküldtük az SMS aktivációs kódot. Írd be a kódot ide."; "auth_msisdn_validation_error" = "Nem sikerült ellenőrizni a telefonszámot."; "auth_recaptcha_message" = "Ez a Matrix szerver szeretne megbizonyosodni arról, hogy nem vagy robot"; -"auth_reset_password_message" = "A jelszó visszaállításához add meg az e-mail címet amit a felhasználói fiókhoz kötöttél:"; +"auth_reset_password_message" = "A Matrix fiók jelszó visszaállításához add meg az e-mail címet amit a felhasználói fiókhoz kötöttél:"; "auth_reset_password_missing_email" = "A felhasználói fiókodhoz kötött jelszót kell megadni."; "auth_reset_password_missing_password" = "Add meg az új jelszót."; "auth_reset_password_email_validation_message" = "Az e-mailt elküldtük a %@ címre. Ha rákattintottál a linkre ami benne van utána kattints ide."; "auth_reset_password_next_step_button" = "Ellenőriztem az e-mail címet"; "auth_reset_password_error_unauthorized" = "E-mail cím ellenőrzése nem sikerült: bizonyosodj meg róla, hogy az e-mailben lévő linkre rákattintottál"; "auth_reset_password_error_not_found" = "Úgy tűnik az e-mail címed nincs összekötve a Matrix azonosítóddal a Matrix szerveren."; -"auth_reset_password_success_message" = "Visszaállítottuk a jelszavad.\n\nKijelentkeztettünk minden munkamenetedből és nem kapsz értesítéseket sem. Az értesítések újra engedélyezéséhez jelentkezz be újra az eszközökön."; +"auth_reset_password_success_message" = "Visszaállítottuk a Matrix fiók jelszavad.\n\nKijelentkeztettünk minden munkamenetedből és nem kapsz értesítéseket sem. Az értesítések újra engedélyezéséhez jelentkezz be újra az eszközökön."; // Chat creation "room_creation_title" = "Új csevegés"; "room_creation_account" = "Fiók"; @@ -224,7 +224,7 @@ "room_event_action_redact" = "Töröl"; "room_event_action_more" = "További"; "room_event_action_share" = "Megosztás"; -"room_event_action_permalink" = "Állandó hivatkozás"; +"room_event_action_permalink" = "Üzenet hivatkozás másolása"; "room_event_action_view_source" = "Forrás megjelenítése"; "room_event_action_view_decrypted_source" = "Visszafejtett forrás megjelenítése"; "room_event_action_report" = "Tartalom bejelentése"; @@ -338,12 +338,12 @@ "settings_send_crash_report" = "Személytelen összeomlás és felhasználási adatok küldése"; "settings_enable_rageshake" = "Eszköz megrázása a hiba bejelentéséhez"; "settings_clear_cache" = "Gyorsítótár kiürítése"; -"settings_change_password" = "Jelszó megváltoztatása"; +"settings_change_password" = "Matrix fiók jelszó megváltoztatása"; "settings_old_password" = "régi jelszó"; "settings_new_password" = "új jelszó"; "settings_confirm_password" = "jelszó megerősítése"; -"settings_fail_to_update_password" = "A jelszó frissítése nem sikerült"; -"settings_password_updated" = "A jelszavad frissítve"; +"settings_fail_to_update_password" = "A Matrix fiók jelszó frissítése nem sikerült"; +"settings_password_updated" = "A Matrix fiók jelszavad frissítve"; "settings_crypto_device_name" = "Munkamenet neve: "; "settings_crypto_device_id" = "\nMunkamenet azonosítója: "; "settings_crypto_device_key" = "\nMunkamenet kulcsa:\n"; @@ -543,7 +543,7 @@ "deactivate_account_forget_messages_information_part3" = ": ezzel a jövőben a felhasználók hiányos csevegést fognak csak látni)"; "deactivate_account_validate_action" = "Felhasználói fiók felfüggesztése"; "deactivate_account_password_alert_title" = "Felhasználói fiók felfüggesztése"; -"deactivate_account_password_alert_message" = "A folytatáshoz add meg a jelszavadat"; +"deactivate_account_password_alert_message" = "A folytatáshoz add meg a Matrix fiók jelszavadat"; // Re-request confirmation dialog "rerequest_keys_alert_title" = "Kérés elküldve"; "rerequest_keys_alert_message" = "Kérlek indítsd el a %@et egy másik eszközödön amelyik vissza tudja fejteni az üzenetet, hogy el tudja küldeni a kulcsokat ennek a munkamenetnek."; @@ -589,7 +589,7 @@ "key_backup_setup_intro_title" = "Soha ne veszítsd el a titkosított üzeneteidet"; "key_backup_setup_intro_info" = "Titkosított szobákban az üzenetek végponttól-végpontig vannak titkosítva. Csak te és a címzettek rendelkeznek a kulcsokkal az üzenetek visszafejtéséhez.\n\nMentsd el megfelelően a kulcsaidat, hogy ne veszítsd el őket."; "key_backup_setup_intro_setup_action" = "Beállítás"; -"key_backup_setup_passphrase_info" = "A kulcsaid titkosított másolatát elmentjük a szerverünkre. Védd a mentést jelmondattal.\n\nA maximális biztonság érdekében ez a jelmondat különbözzön a felhasználói fiókhoz használttól."; +"key_backup_setup_passphrase_info" = "A kulcsaid titkosított másolatát elmentjük a szerverünkre. Védd a mentést jelmondattal.\n\nA maximális biztonság érdekében ez a jelmondat különbözzön a felhasználói Matrix fiókhoz használttól."; "key_backup_setup_passphrase_passphrase_title" = "Bead"; "key_backup_setup_passphrase_passphrase_placeholder" = "Jelmondat bevitele"; "key_backup_setup_passphrase_passphrase_valid" = "Szuper!"; @@ -813,7 +813,7 @@ "room_event_action_reaction_history" = "Reakciók története"; // MARK: Reaction history "reaction_history_title" = "Reakciók"; -"auth_forgot_password_error_no_configured_identity_server" = "Azonosítási szerver nincs beállítva: a jelszó visszaállításhoz adj hozzá egyet."; +"auth_forgot_password_error_no_configured_identity_server" = "Azonosítási szerver nincs beállítva: a Matrix fiók jelszó visszaállításhoz adj hozzá egyet."; "room_creation_error_invite_user_by_email_without_identity_server" = "Azonosítási szerver nincs beállítva, így e-mail cím alapján nem tudsz hozzáadni résztvevőt."; "room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Azonosítási szerver nincs beállítva, így e-mail cím alapján nem tudsz beszélgetést kezdeményezni."; "room_action_camera" = "Fotó vagy videó készítése"; @@ -850,9 +850,9 @@ "auth_add_email_message_2" = "E-mail cím beállítása fiók visszaállításhoz és, hogy később az ismerősök megtalálhassanak."; "auth_add_phone_message_2" = "Telefonszám beállítása, hogy később az ismerősök megtalálhassanak."; "auth_add_email_phone_message_2" = "E-mail cím beállítása fiók visszaállításhoz. Használj később e-mail címet vagy telefonszámot, hogy az ismerősök megtalálhassanak."; -"auth_email_is_required" = "Azonosítási szerver nincs beállítva, így nem tudsz hozzáadni e-mail címet amivel vissza lehetne állítani a jelszót a későbbiekben."; -"auth_phone_is_required" = "Azonosítási szerver nincs beállítva, így nem tudsz hozzáadni telefonszámot, hogy vissza lehetne állítani a jelszót a későbbiekben."; -"auth_reset_password_error_is_required" = "Azonosítási szerver nincs beállítva: adj hozzá egyet a szerver beállításoknál, hogy a jelszót vissza lehessen állítani."; +"auth_email_is_required" = "Azonosítási szerver nincs beállítva, így nem tudsz hozzáadni e-mail címet amivel vissza lehetne állítani a Matrix fiók jelszót a későbbiekben."; +"auth_phone_is_required" = "Azonosítási szerver nincs beállítva, így nem tudsz hozzáadni telefonszámot, hogy vissza lehetne állítani a Matrix fiók jelszót a későbbiekben."; +"auth_reset_password_error_is_required" = "Azonosítási szerver nincs beállítva: adj hozzá egyet a szerver beállításoknál, hogy a Matrix fiók jelszót vissza lehessen állítani."; "contacts_address_book_no_identity_server" = "Azonosítási szerver nincs beállítva"; "settings_discovery_settings" = "FELDERÍTÉS"; "settings_identity_server_settings" = "AZONOSÍTÁSI SZERVER"; @@ -913,7 +913,7 @@ "service_terms_modal_message_identity_server" = "Az azonosítási szerver (%@) felhasználási feltételeit el kell fogadnod, hogy ismerősöket kereshess."; "settings_add_3pid_password_title_email" = "E-mail cím hozzáadása"; "settings_add_3pid_password_title_msidsn" = "Telefonszám hozzáadása"; -"settings_add_3pid_password_message" = "A folytatáshoz add meg a jelszavadat"; +"settings_add_3pid_password_message" = "A folytatáshoz add meg a Matrix fiók jelszavadat"; "settings_add_3pid_invalid_password_message" = "Érvénytelen jelszó"; "error_not_supported_on_mobile" = "%@ mobilról ezt nem teheted meg."; "widget_menu_refresh" = "Frissítés"; @@ -1119,7 +1119,7 @@ "security_settings_secure_backup_setup" = "Beállítás"; "security_settings_secure_backup_synchronise" = "Szinkronizál"; "security_settings_secure_backup_delete" = "Mentés törlése"; -"security_settings_user_password_description" = "A fiók jelszó megadásával erősítsd meg a személyazonosságodat"; +"security_settings_user_password_description" = "A Matrix fiók jelszó megadásával erősítsd meg a személyazonosságodat"; "secure_key_backup_setup_intro_title" = "Biztonsági Mentés"; "secure_key_backup_setup_intro_info" = "A titkosított üzenetekhez és adatokhoz való hozzáférés elvesztése esetén használható biztonsági tartalék a titkosított kulcsok a szerveredre való elmentésével."; "secure_key_backup_setup_intro_use_security_key_title" = "Használd a Biztonsági Kulcsot"; @@ -1139,14 +1139,14 @@ "secrets_setup_recovery_key_done_action" = "Kész"; "secrets_setup_recovery_key_storage_alert_title" = "Tartsd biztonságban"; "secrets_setup_recovery_passphrase_title" = "Biztonsági Jelmondat beállítása"; -"secrets_setup_recovery_passphrase_additional_information" = "Ne a fiók jelszavadat használd."; +"secrets_setup_recovery_passphrase_additional_information" = "Ne a Matrix fiók jelszavadat használd."; "secrets_setup_recovery_passphrase_validate_action" = "Kész"; "secrets_setup_recovery_passphrase_confirm_information" = "A megerősítéshez add meg újra a Biztonsági Jelmondatot."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Megerősítés"; "secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Jelmondat megerősítése"; "cross_signing_setup_banner_title" = "Titkosítás beállítása"; "cross_signing_setup_banner_subtitle" = "A többi eszközödet ellenőrizd egyszerűen"; -"security_settings_crypto_sessions_description_2" = "Ha ez a bejelentkezés nem ismerős, akkor változtasd meg a jelszavad és újra állítsd be a Biztonsági Mentést."; +"security_settings_crypto_sessions_description_2" = "Ha ez a bejelentkezés nem ismerős, akkor változtasd meg a Matrix fiók jelszavad és újra állítsd be a Biztonsági Mentést."; "security_settings_secure_backup_description" = "Mentsd el a titkosítási kulcsokat a fiókadatokkal arra az esetre ha elvesztenéd a hozzáférést a munkameneteidhez. A kulcsok egy egyedi Biztonsági Kulccsal lesznek védve."; // AuthenticatedSessionViewControllerFactory "authenticated_session_flow_not_supported" = "Ez az alkalmazás nem támogatja a matrix szervered azonosítási mechanizmusát."; @@ -1244,7 +1244,7 @@ "room_info_list_one_member" = "1 tag"; "room_info_list_several_members" = "%@ tag"; "room_info_list_section_other" = "Más"; -"secrets_reset_authentication_message" = "A fiók jelszavaddal erősítsd meg"; +"secrets_reset_authentication_message" = "A Matrix fiók jelszavaddal erősítsd meg"; "secrets_reset_reset_action" = "Visszaállít"; "secrets_reset_warning_message" = "Tiszta lappal indulsz, üzenetek, megbízható eszközök és felhasználók nélkül."; "secrets_reset_warning_title" = "Ha mindent visszaállítasz"; @@ -1626,3 +1626,35 @@ "poll_edit_form_update_failure_subtitle" = "Kérlek próbáld újra"; "poll_edit_form_update_failure_title" = "A szavazást nem sikerült frissíteni"; "poll_edit_form_poll_type" = "Szavazás típusa"; +"location_sharing_post_failure_subtitle" = "%@ a helyadatodat nem lehet elküldeni. Próbáld újra később."; +"location_sharing_post_failure_title" = "A földrajzi helyzetét nem lehet elküldeni"; +"home_context_menu_leave" = "Elhagyás"; +"home_context_menu_normal_priority" = "Normál prioritás"; +"home_context_menu_low_priority" = "Alacsony prioritás"; +"home_context_menu_unfavourite" = "Törlés a kedvencekből"; +"home_context_menu_favourite" = "Kedvencek"; +"home_context_menu_unmute" = "Némítás kikapcsolása"; +"home_context_menu_mute" = "Némítás"; +"home_context_menu_notifications" = "Értesítések"; +"home_context_menu_make_room" = "Szobák közé mozgatás"; +"home_context_menu_make_dm" = "Közvetlen beszélgetések közé helyezés"; +"event_formatter_message_deleted" = "Üzenet törölve"; +"settings_labs_enable_threads" = "Üzenetszálas beszélgetés"; +"message_from_a_thread" = "Az üzenetszálból"; +"threads_empty_show_all_threads" = "Minden üzenetszál megjelenítése"; +"threads_empty_tip" = "Tipp: Koppints az üzenetre és használd az „Üzenetszál”-at új indításhoz."; +"threads_empty_info_my" = "Válaszolj egy már meglévő üzenetszálba vagy koppints az üzenetre és használd az „Üzenetszál”-at új indításhoz."; +"threads_empty_info_all" = "Az üzenetszálak segítenek a különböző témájú beszélgetések figyelemmel kísérésében."; +"threads_empty_title" = "Beszélgetések üzenetszálakba rendezése"; +"threads_action_my_threads" = "Üzenetszálaim"; +"threads_action_all_threads" = "Minden üzenetszál"; +"threads_title" = "Üzenetszálak"; +"thread_copy_link_to_thread" = "Üzenetszálra mutató hivatkozás másolása"; + +// MARK: Threads +"room_thread_title" = "Üzenetszál"; +"room_accessibility_thread_more" = "Több"; +"room_accessibility_threads" = "Üzenetszálak"; +"room_event_copy_link_info" = "Hivatkozás a vágólapra másolva."; +"room_event_action_reply_in_thread" = "Üzenetszál"; +"room_event_action_view_in_room" = "Megjelenítés szobában"; diff --git a/Riot/Assets/id.lproj/Vector.strings b/Riot/Assets/id.lproj/Vector.strings index 28dd88f35..87c75e41c 100644 --- a/Riot/Assets/id.lproj/Vector.strings +++ b/Riot/Assets/id.lproj/Vector.strings @@ -3,7 +3,7 @@ "auth_invalid_login_param" = "Nama pengguna dan/atau kata sandi tidak benar"; "auth_identity_server_placeholder" = "URL (contoh https://vector.im)"; "auth_home_server_placeholder" = "URL (contoh https://matrix.org)"; -"auth_repeat_new_password_placeholder" = "Konfirmasi kata sandi baru Anda"; +"auth_repeat_new_password_placeholder" = "Konfirmasi kata sandi akun Matrix baru Anda"; "auth_repeat_password_placeholder" = "Ulangi kata sandi"; "auth_phone_placeholder" = "Nomor telepon"; "auth_optional_phone_placeholder" = "Nomor telepon (opsional)"; @@ -73,13 +73,13 @@ "auth_email_validation_message" = "Silakan periksa surel Anda untuk melanjutkan pendaftaran"; "auth_use_server_options" = "Gunakan opsi server khusus (lanjutan)"; "auth_email_not_found" = "Gagal mengirim surel: Alamat email ini tidak ditemukan"; -"auth_forgot_password_error_no_configured_identity_server" = "Tidak ada server identitas yang dikonfigurasikan: tambahkan satu untuk mengatur ulang kata sandi Anda."; -"auth_forgot_password" = "Lupa kata sandi?"; +"auth_forgot_password_error_no_configured_identity_server" = "Tidak ada server identitas yang dikonfigurasikan: tambahkan satu untuk mengatur ulang kata sandi akun Matrix Anda."; +"auth_forgot_password" = "Lupa kata sandi akun Matrix?"; "auth_username_in_use" = "Nama pengguna telah dipakai"; "auth_password_dont_match" = "Kata sandi tidak cocok"; "auth_untrusted_id_server" = "Server identitas tidak dipercaya"; -"auth_phone_is_required" = "Tidak ada server identitas yang dikonfigurasi sehingga Anda tidak dapat menambahkan nomor telepon untuk mengatur ulang kata sandi Anda di masa depan."; -"auth_email_is_required" = "Tidak ada server identitas yang dikonfigurasi sehingga Anda tidak dapat menambahkan alamat email untuk mengatur ulang kata sandi Anda di masa depan."; +"auth_phone_is_required" = "Tidak ada server identitas yang dikonfigurasi sehingga Anda tidak dapat menambahkan nomor telepon untuk mengatur ulang kata sandi akun Matrix Anda di masa depan."; +"auth_email_is_required" = "Tidak ada server identitas yang dikonfigurasi sehingga Anda tidak dapat menambahkan alamat email untuk mengatur ulang kata sandi akun Matrix Anda di masa depan."; "auth_phone_in_use" = "Nomor telepon ini sudah dipakai"; "auth_email_in_use" = "Surel ini sudah dipakai"; "auth_missing_email_or_phone" = "Tidak ada surel atau nomor telepon"; @@ -133,7 +133,7 @@ "settings_integrations_allow_button" = "Kelola integrasi"; "settings_enable_callkit" = "Panggilan yang diintegrasi"; "settings_night_mode" = "Mode Malam"; -"settings_change_password" = "Ubah kata sandi"; +"settings_change_password" = "Ubah kata sandi akun Matrix"; "settings_first_name" = "Nama Depan"; "settings_display_name" = "Nama Tampilan"; "settings_profile_picture" = "Gambar Profil"; @@ -498,7 +498,7 @@ "room_event_action_delete" = "Hapus"; "room_event_action_resend" = "Kirim Ulang"; "room_event_action_save" = "Simpan"; -"room_event_action_permalink" = "Tautan"; +"room_event_action_permalink" = "Salin tautan ke pesan"; "room_event_action_share" = "Bagikan"; "room_event_action_more" = "Lainnya"; "room_event_action_redact" = "Hapus"; @@ -522,8 +522,8 @@ "room_participants_now" = "sekarang"; "room_participants_idle" = "Idle"; "room_participants_unknown" = "Tidak diketahui"; -"room_participants_offline" = "Offline"; -"room_participants_online" = "Online"; +"room_participants_offline" = "Luring"; +"room_participants_online" = "Daring"; "room_participants_invited_section" = "DIUNDANG"; "room_participants_invite_prompt_title" = "Konfirmasi"; "room_participants_remove_prompt_title" = "Konfirmasi"; @@ -595,14 +595,14 @@ "room_creation_account" = "Akun"; "social_login_list_title_sign_up" = "Atau"; "social_login_list_title_sign_in" = "Atau"; -"auth_reset_password_error_is_required" = "Tidak ada server identitas yang diatur: tambahkan di pengaturan server untuk mengatur ulang kata sandi Anda."; +"auth_reset_password_error_is_required" = "Tidak ada server identitas yang diatur: tambahkan di pengaturan server untuk mengatur ulang kata sandi akun Matrix Anda."; "auth_reset_password_error_not_found" = "Alamat email Anda terlihat tidak diasosiasikan dengan sebuah ID Matrix di homeserver ini."; "auth_reset_password_error_unauthorized" = "Gagal untuk memverifikasi alamat email: pastikan Anda membuka tautan yang ada di email"; "auth_reset_password_next_step_button" = "Saya telah memverifikasi alamat email saya"; "auth_reset_password_email_validation_message" = "Sebuah email telah dikirim ke %@. Setelah Anda membuka tautan yang ada, klik di bawah."; "auth_reset_password_missing_password" = "Sebuah kata sandi baru harus dimasukkan."; "auth_reset_password_missing_email" = "Alamat email yang tertaut dengan akun Anda harus dimasukkan."; -"auth_reset_password_message" = "Untuk mengatur ulang kata sandi Anda, masukkan alamat email yang tertaut ke akun Anda:"; +"auth_reset_password_message" = "Untuk mengatur ulang kata sandi akun Matrix Anda, masukkan alamat email yang tertaut ke akun Anda:"; "auth_recaptcha_message" = "Homeserver ini ingin memastikan bahwa Anda bukan sebuah robot"; "auth_msisdn_validation_error" = "Tidak dapat memverifikasi nomor telepon."; "auth_msisdn_validation_message" = "Kami telah mengirim sebuah SMS dengan kode aktivasi. Silakan masukkan kodenya di bawah."; @@ -667,7 +667,7 @@ // GDPR "gdpr_consent_not_given_alert_message" = "Untuk terus menggunakan homeserver %@, Anda harus menyetujui syarat dan ketentuannya."; "share_extension_failed_to_encrypt" = "Gagal untuk mengirim. Periksa di aplikasi utama pengaturan enkripsi untuk ruangan ini"; -"bug_report_logs_description" = "Untuk mendiagnosis masalah, log dari klien ini akan dikirim dengan laporan bug ini. Jika Anda lebih memilih untuk hanya mengirim teks di atas, harap hapus centang:"; +"bug_report_logs_description" = "Untuk mendiagnosis masalah, catat dari klien ini akan dikirim dengan laporan kutu ini. Jika Anda lebih memilih untuk hanya mengirim teks di atas, harap hapus centang:"; "bug_report_description" = "Harap jelaskan bugnya. Apa yang Anda lakukan? Apa yang Anda harapkan terjadi? Apa yang sebenarnya terjadi?"; "e2e_key_backup_wrong_version" = "Cadangan kunci pesan aman baru telah terdeteksi.\n\nJika ini bukan Anda, atur Frasa Keamanan baru di Pengaturan."; @@ -680,7 +680,7 @@ "call_no_stun_server_error_message_1" = "Mohon hubungi administrator homeserver %@ Anda untuk mengatur sebuah server TURN supaya panggilan dapat bekerja dengan handal."; "rage_shake_prompt" = "Anda tampaknya menggoyangkan telepon dengan frustrasi. Apakah Anda ingin mengirimkan laporan bug?"; "bug_report_prompt" = "Aplikasi telah crash terakhir kali. Apakah Anda ingin mengirimkan laporan crash?"; -"room_notifs_settings_encrypted_room_notice" = "Harap dicatat bahwa notifikasi sebutan & keyword tidak tersedia di ruang terenkripsi di ponsel."; +"room_notifs_settings_encrypted_room_notice" = "Harap dicatat bahwa notifikasi sebutan & kata kunci tidak tersedia di ruang terenkripsi di ponsel."; "room_details_addresses_disable_main_address_prompt_msg" = "Anda tidak akan memiliki alamat utama yang ditentukan. Alamat utama default untuk ruangan ini akan dipilih secara acak"; "room_details_history_section_prompt_msg" = "Perubahan siapa yang dapat membaca riwayat hanya akan berlaku untuk pesan berikutnya di ruang ini. Visibilitas riwayat yang ada tidak akan berubah."; "identity_server_settings_alert_error_terms_not_accepted" = "Anda harus menerima syaratnya %@ untuk menyetelnya sebagai server identitas."; @@ -696,7 +696,7 @@ "security_settings_blacklist_unverified_devices_description" = "Verifikasi semua sesi pengguna untuk menandainya sebagai terpercaya dan kirim pesan ke mereka."; "security_settings_crosssigning_info_exists" = "Akun Anda memiliki identitas penandatanganan silang, tetapi belum dipercayai oleh sesi ini. Selesaikan keamanan sesi ini."; "security_settings_secure_backup_description" = "Cadangkan kunci enkripsi Anda dengan data akun Anda untuk berjaga-jaga jika Anda kehilangan akses ke sesi Anda. Kunci Anda akan diamankan dengan Kunci Keamanan yang unik."; -"security_settings_crypto_sessions_description_2" = "Jika Anda tidak tahu sebuah login, ubah kata sandi Anda dan atur ulang Cadangan Aman."; +"security_settings_crypto_sessions_description_2" = "Jika Anda tidak tahu sebuah login, ubah kata sandi akun Matrix Anda dan atur ulang Cadangan Aman."; "settings_identity_server_no_is_description" = "Anda saat ini tidak menggunakan sebuah server identitas. Untuk menemukan dan dapat ditemukan oleh kontak yang Anda tahu, tambahkan satu di atas."; "settings_identity_server_description" = "Dengan menggunakan set server identitas di atas, Anda dapat menemukan dan dapat ditemukan oleh kontak yang ada yang Anda kenal."; "settings_discovery_three_pid_details_information_phone_number" = "Kelola preferensi untuk nomor telepon ini, yang dapat digunakan pengguna lain untuk menemukan Anda dan digunakan untuk mengundang Anda ke ruangan. Tambahkan atau hapus nomor telepon di Akun."; @@ -823,7 +823,7 @@ "room_details_access_section_anyone_apart_from_guest_for_dm" = "Siapa saja yang tahu linknya, selain dari tamu"; "identity_server_settings_alert_error_invalid_identity_server" = "%@ bukan server identitas yang valid."; "identity_server_settings_alert_no_terms_title" = "Server identitas tidak mempunyai kebijakan layanan"; -"security_settings_user_password_description" = "Konfirmasi identitas Anda dengan memasukkan kata sandi akun Anda"; +"security_settings_user_password_description" = "Konfirmasi identitas Anda dengan memasukkan kata sandi akun Matrix Anda"; "security_settings_secure_backup_info_valid" = "Sesi ini mencadangkan kunci Anda."; "version_check_modal_title_deprecated" = "Kami tidak mendukung iOS %@ lagi"; "version_check_modal_title_supported" = "Kami mengakhiri dukungan untuk iOS %@"; @@ -838,7 +838,7 @@ "voice_message_release_to_send" = "Tahan untuk merekam, lepaskan untuk mengirim"; "spaces_empty_space_title" = "Space ini belum ada ruangan"; "create_room_show_in_directory" = "Tampilkan ruangan di direktori"; -"secrets_reset_authentication_message" = "Masukkan kata sandi akun Anda untuk mengkonfirmasi"; +"secrets_reset_authentication_message" = "Masukkan kata sandi akun Matrix Anda untuk mengkonfirmasi"; "secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Masukkan Kunci Keamanan Anda untuk melanjutkan."; "secrets_recovery_with_key_information_unlock_secure_backup_with_phrase" = "Masukkan Frasa Keamanan Anda untuk melanjutkan."; @@ -988,7 +988,7 @@ "settings_key_backup_info_progress_done" = "Semua kunci telah dicadangkan"; "settings_key_backup_info_progress" = "Mencadangkan %@ kunci…"; "settings_key_backup_info_version" = "Versi Cadangan Kunci: %@"; -"settings_fail_to_update_password" = "Gagal untuk memperbarui kata sandi"; +"settings_fail_to_update_password" = "Gagal untuk memperbarui kata sandi akun Matrix"; "settings_labs_enable_ringing_for_group_calls" = "Dering untuk panggilan grup"; "settings_enable_push_notif" = "Notifikasi di perangkat ini"; "settings_fail_to_update_profile" = "Gagal untuk memperbarui profil"; @@ -1418,7 +1418,7 @@ // Bug report "bug_report_title" = "Laporan Bug"; -"deactivate_account_password_alert_message" = "Untuk melanjutkan, mohon masukkan kata sandi Anda"; +"deactivate_account_password_alert_message" = "Untuk melanjutkan, mohon masukkan kata sandi akun Matrix Anda"; "widget_integration_must_be_in_room" = "Anda tidak berada di ruangan ini."; "settings_devices_description" = "Nama publik sesi dapat dilihat oleh orang yang berkomunikasi dengan Anda"; "settings_key_backup_delete_confirmation_prompt_msg" = "Apakah Anda yakin? Anda akan kehilangan pesan terenkripsi jika kunci Anda tidak dicadangkan secara benar."; @@ -1438,7 +1438,7 @@ "settings_ui_theme_picker_message_invert_colours" = "\"Otomatis\" menggunakan pengaturan \"Balikkan Warna\" perangkat Anda"; "settings_ui_theme_picker_message_match_system_theme" = "\"Otomatis\" mencocokkan dengan tema sistem perangkat Anda"; "settings_calls_stun_server_fallback_description" = "Izinkan server panggilan %@ cadangan saat server homeserver Anda tidak menawarkannya (alamat IP Anda akan dibagikan selama panggilan)."; -"settings_mentions_and_keywords_encryption_notice" = "Anda tidak akan dapat notifikasi untuk sebutan & keyword di ruangan terenkripsi di ponsel."; +"settings_mentions_and_keywords_encryption_notice" = "Anda tidak akan dapat notifikasi untuk sebutan & kata kunci di ruangan terenkripsi di ponsel."; "settings_notifications_disabled_alert_message" = "Untuk mengaktifkan notifikasi, pergi ke pengaturan perangkat Anda."; "settings_global_settings_info" = "Pengaturan notifikasi global tersedia di klien web %@ Anda"; "settings_confirm_media_size_description" = "Saat ini aktif, Anda akan diminta untuk mengkonfirmasi ukuran gambar dan video yang akan dikirim."; @@ -1523,7 +1523,7 @@ "security_settings_crosssigning_info_not_bootstrapped" = "Penandatanganan silang belum disiapkan."; "settings_key_backup_button_connect" = "Hubungkan sesi ini ke Cadangan Kunci"; "settings_key_backup_info_trust_signature_valid_device_unverified" = "Cadangan memiliki tanda tangan dari %@"; -"settings_add_3pid_password_message" = "Untuk melanjutkan, mohon masukkan kata sandi Anda"; +"settings_add_3pid_password_message" = "Untuk melanjutkan, mohon masukkan kata sandi akun Matrix Anda"; "settings_send_crash_report" = "Kirim crash & data penggunaan anonim"; "secure_key_backup_setup_cancel_alert_message" = "Jika Anda membatalkan sekarang, Anda mungkin kehilangan pesan & data terenkripsi jika Anda kehilangan akses ke login Anda.\n\nAnda juga dapat mengatur Cadangan Aman & kelola kunci Anda di Pengaturan."; "room_participants_security_information_room_encrypted" = "Pesan di ruangan ini dienkripsi secara ujung-ke-ujung.\n\nPesan Anda diamankan dengan kunci dan hanya Anda dan penerima punya kunci uniknya untuk membukanya."; @@ -1539,7 +1539,7 @@ // Success from passphrase "key_backup_setup_success_from_passphrase_info" = "Kunci Anda sedang dicadangkan.\n\nKunci Keamanan Anda adalah jaring pengaman — Anda dapat menggunakannya untuk memulihkan akses ke pesan terenkripsi jika Anda lupa frasa sandi.\n\nSimpan Kunci Keamanan Anda di suatu tempat yang sangat aman, seperti pengelola kata sandi (atau brankas)."; -"key_backup_setup_passphrase_info" = "Kami akan menyimpan salinan terenkripsi dari kunci Anda di server kami. Lindungi cadangan Anda dengan frasa agar tetap aman.\n\nUntuk keamanan maksimum, ini harus berbeda dari kata sandi akun Anda."; +"key_backup_setup_passphrase_info" = "Kami akan menyimpan salinan terenkripsi dari kunci Anda di server kami. Lindungi cadangan Anda dengan frasa agar tetap aman.\n\nUntuk keamanan maksimum, ini harus berbeda dari kata sandi akun Matrix Anda."; "key_backup_setup_intro_info" = "Pesan di ruang terenkripsi diamankan dengan enkripsi ujung-ke-ujung. Hanya Anda dan penerima yang memiliki kunci untuk membaca pesan ini.\n\nCadangkan kunci Anda dengan aman untuk menghindari kehilangannya."; "deactivate_account_informations_part5" = "Jika Anda ingin kami melupakan pesan Anda, silakan centang kotak di bawah ini\n\nVisibilitas pesan di Matrix mirip dengan email. Kami melupakan pesan Anda berarti bahwa pesan yang telah Anda kirim tidak akan dibagikan dengan pengguna baru atau tidak terdaftar, tetapi pengguna terdaftar yang sudah memiliki akses ke pesan ini akan tetap memiliki akses ke salinannya."; "deactivate_account_informations_part1" = "Ini akan membuat akun Anda tidak dapat digunakan secara permanen. Anda tidak akan dapat masuk, dan tidak seorang pun dapat mendaftarkan ulang ID pengguna yang sama. Ini akan menyebabkan akun Anda meninggalkan semua ruangan yang diikutinya, dan akan menghapus detail akun Anda dari server identitas Anda. "; @@ -1552,7 +1552,7 @@ "unknown_devices_alert" = "Ruangan ini berisi sesi tidak dikenal yang belum diverifikasi.\nIni berarti tidak ada jaminan bahwa sesi tersebut adalah milik pengguna yang mereka klaim.\nKami menyarankan Anda memverifikasinya untuk setiap sesi sebelum melanjutkan, tetapi Anda dapat mengirim ulang pesan tanpa memverifikasi jika Anda mau."; "room_warning_about_encryption" = "Enkripsi ujung-ke-ujung masih dalam beta dan mungkin tidak dapat dihandalkan.\n\nAnda seharusnya tidak mempercayainya dulu untuk mengamankan data.\n\nPerangkat masih belum dapat mendekripsi riwayat sebelum mereka bergabung ke ruangannya.\n\nPesan terenkripsi masih belum terlihat di client yang belum mengimplementasikan enkripsi."; "auth_add_email_and_phone_warning" = "Pendaftaran dengan email dan nomor telepon sekaligus belum didukung sampai API-nya sudah ada. Hanya nomor telepon yang akan diperhitungkan. Anda dapat menambahkan email Anda di profil Anda di pengaturan."; -"auth_reset_password_success_message" = "Kata sandi Anda telah diatur ulang.\n\nAnda telah dikeluarkan dari semua sesi dan tidak akan menerima lagi notifikasi push. Untuk mengaktifkan ulang notifikasi, masuk ulang di setiap perangkat."; +"auth_reset_password_success_message" = "Kata sandi akun Matrix Anda telah diatur ulang.\n\nAnda telah dikeluarkan dari semua sesi dan tidak akan menerima lagi notifikasi push. Untuk mengaktifkan ulang notifikasi, masuk ulang di setiap perangkat."; "spaces_add_rooms_coming_soon_title" = "Penambahan ruangan akan segera datang"; "leave_space_and_all_rooms_action" = "Tinggalkan semua ruangan dan space"; "space_beta_announce_subtitle" = "Versi baru dari komunitas"; @@ -1562,7 +1562,7 @@ "pin_protection_confirm_pin_to_disable" = "Konfirmasi PIN untuk menonaktifkan PIN"; "pin_protection_choose_pin" = "Buat sebuah PIN untuk keamanan"; "cross_signing_setup_banner_subtitle" = "Verifikasi perangkat Anda yang lain dengan mudah"; -"secrets_setup_recovery_passphrase_additional_information" = "Jangan menggunakan kata sandi akun Anda."; +"secrets_setup_recovery_passphrase_additional_information" = "Jangan menggunakan kata sandi akun Matrix Anda."; "secrets_recovery_with_key_invalid_recovery_key_title" = "Tidak dapat mengakses penyimpanan rahasia"; "secrets_recovery_with_passphrase_invalid_passphrase_title" = "Tidak dapat mengakses penyimpanan rahasia"; @@ -1616,7 +1616,7 @@ "security_settings_crosssigning_info_ok" = "Penandatanganan silang siap dipakai."; "settings_discovery_error_message" = "Sebuah kesalahan terjadi. Mohon coba lagi."; "settings_crypto_blacklist_unverified_devices" = "Enkripsi ke sesi terverifikasi saja"; -"settings_password_updated" = "Kata sandi Anda telah diperbarui"; +"settings_password_updated" = "Kata sandi akun Matrix Anda telah diperbarui"; "settings_enable_rageshake" = "Rage shake untuk melaporkan bug"; // No VoIP support @@ -1653,11 +1653,11 @@ "poll_edit_form_create_options" = "Buat opsi"; "poll_edit_form_input_placeholder" = "Tulis sesuatu"; "poll_edit_form_question_or_topic" = "Pertanyaan atau topik"; -"poll_edit_form_poll_question_or_topic" = "Pertanyaan atau topik poll"; +"poll_edit_form_poll_question_or_topic" = "Pertanyaan atau topik pemungutan suara"; // Mark: - Polls -"poll_edit_form_create_poll" = "Buat poll"; +"poll_edit_form_create_poll" = "Buat pemungutan suara"; "share_extension_send_now" = "Kirim sekarang"; "share_extension_low_quality_video_message" = "Kirim dalam %@ untuk kualitas yang lebih baik, atau kirim dengan kualitas rendah di bawah."; "share_extension_low_quality_video_title" = "Video akan dikirim dalam kualitas rendah"; @@ -1665,7 +1665,7 @@ "settings_about" = "TENTANG"; "poll_timeline_not_closed_action" = "OK"; "poll_timeline_not_closed_subtitle" = "Mohon coba lagi"; -"poll_timeline_not_closed_title" = "Gagal untuk mengakhiri poll"; +"poll_timeline_not_closed_title" = "Gagal untuk mengakhiri pemungutan suara"; "poll_timeline_vote_not_registered_action" = "OK"; "poll_timeline_vote_not_registered_subtitle" = "Maaf, suara Anda tidak diberikan, mohon coba lagi"; "poll_timeline_vote_not_registered_title" = "Suara tidak diberikan"; @@ -1680,10 +1680,10 @@ "poll_timeline_one_vote" = "1 suara"; "poll_edit_form_post_failure_action" = "OK"; "poll_edit_form_post_failure_subtitle" = "Silakan coba lagi"; -"poll_edit_form_post_failure_title" = "Gagal untuk mengirim poll"; +"poll_edit_form_post_failure_title" = "Gagal untuk mengirim pemungutan suara"; "settings_labs_enabled_polls" = "Poll"; -"room_event_action_end_poll" = "Akhiri poll"; -"room_event_action_remove_poll" = "Hapus poll"; +"room_event_action_end_poll" = "Akhiri pemungutan suara"; +"room_event_action_remove_poll" = "Hapus pemungutan suara"; "analytics_prompt_stop" = "Berhenti membagikan"; "analytics_prompt_yes" = "Iya, saya tidak keberatan"; "analytics_prompt_not_now" = "Jangan sekarang"; @@ -1735,10 +1735,42 @@ // Onboarding "onboarding_splash_register_button_title" = "Buat akun"; -"poll_edit_form_poll_type_closed_description" = "Hasil akan ditampilkan ketika Anda mengakhiri poll-nya"; +"poll_edit_form_poll_type_closed_description" = "Hasil akan ditampilkan ketika Anda mengakhiri pemungutan suara"; "poll_edit_form_poll_type_closed" = "Poll tertutup"; "poll_edit_form_poll_type_open_description" = "Pemberi suara akan melihat hasilnya ketika telah memberikan suara"; -"poll_edit_form_poll_type_open" = "Buka poll"; +"poll_edit_form_poll_type_open" = "Buka pemungutan suara"; "poll_edit_form_update_failure_subtitle" = "Silakan coba lagi"; -"poll_edit_form_update_failure_title" = "Gagal untuk memperbarui poll"; -"poll_edit_form_poll_type" = "Tipe poll"; +"poll_edit_form_update_failure_title" = "Gagal untuk memperbarui pemungutan suara"; +"poll_edit_form_poll_type" = "Tipe pemungutan suara"; +"location_sharing_post_failure_subtitle" = "%@ tidak dapat mengirimkan lokasi Anda. Silakan coba lagi nanti."; +"location_sharing_post_failure_title" = "Kami tidak dapat mengirimkan lokasi Anda"; +"home_context_menu_leave" = "Tinggalkan"; +"home_context_menu_normal_priority" = "Prioritas normal"; +"home_context_menu_low_priority" = "Prioritas rendah"; +"home_context_menu_unfavourite" = "Hilangkan dari Favorit"; +"home_context_menu_favourite" = "Favorit"; +"home_context_menu_unmute" = "Hilangkan bisuan"; +"home_context_menu_mute" = "Bisukan"; +"home_context_menu_notifications" = "Notifikasi"; +"home_context_menu_make_room" = "Pindah ke Ruangan"; +"home_context_menu_make_dm" = "Pindah ke Orang"; +"event_formatter_message_deleted" = "Pesan dihapus"; +"settings_labs_enable_threads" = "Perpesanan utasan"; +"message_from_a_thread" = "Dari sebuah utasan"; +"threads_empty_show_all_threads" = "Tampilkan semua utasan"; +"threads_empty_tip" = "Tip: Ketuk pada sebuah pesan dan gunakan “Utasan” untuk memulai yang baru."; +"threads_empty_info_my" = "Balas ke utasan yang sedang terjadi atau ketuk pada sebuah pesan dan gunakan “Utasan” untuk memulai yang baru."; +"threads_empty_info_all" = "Utasan membantu membuat obrolan sesuai topik dan mudah untuk dilacak."; +"threads_empty_title" = "Buat diskusi tetap teratur dengan utasan"; +"threads_action_my_threads" = "Utasan saya"; +"threads_action_all_threads" = "Semua utasan"; +"threads_title" = "Utasan"; +"thread_copy_link_to_thread" = "Salin tautan ke utasan"; + +// MARK: Threads +"room_thread_title" = "Utasan"; +"room_accessibility_thread_more" = "Lainnya"; +"room_accessibility_threads" = "Utasan"; +"room_event_copy_link_info" = "Tautan disalin ke papan klip."; +"room_event_action_reply_in_thread" = "Utasan"; +"room_event_action_view_in_room" = "Tampilkan di ruangan"; diff --git a/Riot/Assets/it.lproj/Vector.strings b/Riot/Assets/it.lproj/Vector.strings index 9a80d83b0..abb600606 100644 --- a/Riot/Assets/it.lproj/Vector.strings +++ b/Riot/Assets/it.lproj/Vector.strings @@ -34,7 +34,7 @@ "auth_optional_phone_placeholder" = "Numero di telefono (opzionale)"; "auth_phone_placeholder" = "Numero di telefono"; "auth_repeat_password_placeholder" = "Ripeti la password"; -"auth_repeat_new_password_placeholder" = "Conferma la nuova password"; +"auth_repeat_new_password_placeholder" = "Conferma la nuova password dell'account Matrix"; "auth_home_server_placeholder" = "URL (es. https://matrix.org)"; "auth_identity_server_placeholder" = "URL (es. https://vector.im)"; "auth_invalid_login_param" = "Nome utente e/o password non corretti"; @@ -52,12 +52,12 @@ "auth_missing_email_or_phone" = "Indirizzo email o numero di telefono mancante"; "auth_email_in_use" = "Questo indirizzo email è già in uso"; "auth_phone_in_use" = "Questo numero di telefono è già in uso"; -"auth_forgot_password" = "Password dimenticata?"; +"auth_forgot_password" = "Password dell'account Matrix dimenticata?"; "auth_email_validation_message" = "Per favore controlla la tua email per proseguire la registrazione"; "auth_msisdn_validation_title" = "In attesa di verifica"; "auth_msisdn_validation_message" = "Ti è stato spedito un SMS con il codice di attivazione. Per favore inserisci il codice qui sotto."; "auth_msisdn_validation_error" = "Impossibile verificare il numero di telefono."; -"auth_reset_password_message" = "Per ripristinare la password inserisci l'indirizzo email associato al tuo account:"; +"auth_reset_password_message" = "Per ripristinare la password dell'account Matrix inserisci l'indirizzo email associato al tuo account:"; // String for App Store "store_short_description" = "Conversazioni sicure e decentralizzate"; // Actions @@ -90,7 +90,7 @@ "auth_reset_password_next_step_button" = "Ho verificato il mio indirizzo email"; "auth_reset_password_error_unauthorized" = "Verifica indirizzo email fallita: assicurati di aver cliccato sul link contenuto nell'email"; "auth_reset_password_error_not_found" = "Il tuo indirizzo email non sembra associato a nessun ID utente registrato su questo Home Server."; -"auth_reset_password_success_message" = "La tua password è stata ripristinata.\n\nSei stato disconnesso da tutte le sessioni e non riceverai più alcuna notifica. Per riabilitare le notifiche, riconnettiti su ciascun dispositivo."; +"auth_reset_password_success_message" = "La password del tuo account Matrix è stata ripristinata.\n\nSei stato disconnesso da tutte le sessioni e non riceverai più alcuna notifica. Per riabilitare le notifiche, riconnettiti su ciascun dispositivo."; "auth_add_email_and_phone_warning" = "Al momento non è ancora possibile registrarsi contemporaneamente con indirizzo email e numero di telefono e quindi verrà utilizzato solo il numero di telefono. Puoi aggiungere la tua email al tuo profilo dall menù Impostazioni."; "auth_accept_policies" = "Per favore, rileggi e accetta i termini di servizio di questo Home Server:"; "auth_autodiscover_invalid_response" = "Risposta Home Server non valida"; @@ -230,7 +230,7 @@ "room_event_action_redact" = "Rimuovi"; "room_event_action_more" = "Altro"; "room_event_action_share" = "Condividi"; -"room_event_action_permalink" = "Permalink"; +"room_event_action_permalink" = "Copia link nel messaggio"; "room_event_action_view_source" = "Vedi il codice sorgente"; "room_event_action_view_decrypted_source" = "Vedi il codice sorgente decifrato"; "room_event_action_report" = "Segnala il contenuto"; @@ -319,7 +319,7 @@ "settings_add_email_address" = "Aggiungi indirizzo email"; "settings_phone_number" = "Telefono"; "settings_add_phone_number" = "Aggiungi numero di telefono"; -"settings_change_password" = "Cambia password"; +"settings_change_password" = "Cambia password dell'account Matrix"; "settings_night_mode" = "Modalità notte"; "settings_fail_to_update_profile" = "Errore nell'aggiornamento del profilo"; "settings_enable_push_notif" = "Notifiche per questo dispositivo"; @@ -356,8 +356,8 @@ "settings_old_password" = "vecchia password"; "settings_new_password" = "nuova password"; "settings_confirm_password" = "conferma password"; -"settings_fail_to_update_password" = "Aggiornamento password fallito"; -"settings_password_updated" = "La tua password è stata aggiornata"; +"settings_fail_to_update_password" = "Aggiornamento password dell'account Matrix fallito"; +"settings_password_updated" = "La password del tuo account Matrix è stata aggiornata"; "settings_crypto_device_name" = "Nome sessione: "; "settings_crypto_device_id" = "\nID sessione: "; "settings_crypto_device_key" = "\nChiave sessione:\n"; @@ -580,7 +580,7 @@ "deactivate_account_forget_messages_information_part3" = ": gli utenti futuri vedranno un elenco incompleto di conversazioni)"; "deactivate_account_validate_action" = "Disattiva account"; "deactivate_account_password_alert_title" = "Disattiva account"; -"deactivate_account_password_alert_message" = "Per proseguire, inserisci la tua password"; +"deactivate_account_password_alert_message" = "Per continuare, inserisci la password del tuo account Matrix"; // Re-request confirmation dialog "rerequest_keys_alert_title" = "Richiesta inviata"; "rerequest_keys_alert_message" = "Avvia %@ su un altro dispositivo che possa decifrare il messaggio, in modo da poter inviare le chiavi a questa sessione."; @@ -594,7 +594,7 @@ "key_backup_setup_intro_manual_export_info" = "(Avanzato)"; "key_backup_setup_intro_manual_export_action" = "Esporta manualmente le chiavi"; "key_backup_setup_passphrase_title" = "Proteggi il tuo backup con una frase di sicurezza"; -"key_backup_setup_passphrase_info" = "Sul tuo Home Server verrà effettuato un Backup cifrato delle tue chiavi crittograficher. Proteggi il Backup con una frase di sicurezza perchè sia al sicuro.\n \nPer una massima sicurezza, la password del Backup dovrebbe essere diversa dalla password del tuo account."; +"key_backup_setup_passphrase_info" = "Conserveremo una copia cifrata delle tue chiavi sul nostro server. Proteggi il tuo backup con una frase di sicurezza per tenerlo sicuro.\n \nPer la massima sicurezza, dovrebbe essere diversa dalla password del tuo account Matrix."; "key_backup_setup_passphrase_passphrase_title" = "Inserisci"; "key_backup_setup_passphrase_passphrase_placeholder" = "Inserisci frase"; "key_backup_setup_passphrase_passphrase_valid" = "Bene!"; @@ -651,7 +651,7 @@ "sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Non voglio i miei messaggi cifrati"; "sign_out_key_backup_in_progress_alert_cancel_action" = "Attendo"; "close" = "Chiudi"; -"auth_forgot_password_error_no_configured_identity_server" = "Non è stato configurato alcun server d'identità: aggiungine uno per ripristinare la password."; +"auth_forgot_password_error_no_configured_identity_server" = "Non è stato configurato alcun server d'identità: aggiungine uno per ripristinare la password dell'account Matrix."; "auth_softlogout_signed_out" = "Sei uscito"; "auth_softlogout_sign_in" = "Accedi"; "auth_softlogout_reason" = "L'amministratore dell'Home Server (%1$@) ti ha disconnesso dal tuo account %2$@ (%3$@)."; @@ -820,9 +820,9 @@ "auth_add_email_message_2" = "Imposta un'email per il ripristino dell'account in caso di problemi e, se vuoi, anche per farti trovare da chi conosce quell'indirizzo email."; "auth_add_phone_message_2" = "Aggiungi un numero di telefono se vuoi farti trovare da chi lo conosce."; "auth_add_email_phone_message_2" = "Imposta un'email per il ripristino dell'account in caso di problemi. Email e telefono potranno essere usati anche per farti trovare dagli altri utenti."; -"auth_email_is_required" = "Non è stato configurato alcun server d'identità, perciò non puoi aggiungere un indirizzo email per ripristinare la tua password in futuro."; -"auth_phone_is_required" = "Non è stato configurato alcun server d'identità, perciò non puoi aggiungere un numero di telefono per ripristinare la tua password in futuro."; -"auth_reset_password_error_is_required" = "Non è stato configurato alcun server d'identità: aggiungine uno nelle opzioni server per ripristinare la password."; +"auth_email_is_required" = "Non è stato configurato alcun server d'identità, perciò non puoi aggiungere un indirizzo email per ripristinare la tua password dell'account Matrix in futuro."; +"auth_phone_is_required" = "Non è stato configurato alcun server d'identità, perciò non puoi aggiungere un numero di telefono per ripristinare la tua password dell'account Matrix in futuro."; +"auth_reset_password_error_is_required" = "Non è stato configurato alcun server d'identità: aggiungine uno nelle opzioni server per ripristinare la password dell'account Matrix."; "contacts_address_book_no_identity_server" = "Nessun server d'identità configurato"; "settings_discovery_settings" = "SCOPRI"; "settings_identity_server_settings" = "SERVER D'IDENTITÀ"; @@ -883,7 +883,7 @@ "error_invite_3pid_with_no_identity_server" = "Aggiungi un server d'identità nelle impostazioni per poter invitare utenti tramite email."; "settings_add_3pid_password_title_email" = "Aggiungi indirizzo email"; "settings_add_3pid_password_title_msidsn" = "Aggiungi numero di telefono"; -"settings_add_3pid_password_message" = "Per continuare, inserisci la tua password"; +"settings_add_3pid_password_message" = "Per continuare, inserisci la password del tuo account Matrix"; "settings_add_3pid_invalid_password_message" = "Credenziali non valide"; "error_not_supported_on_mobile" = "Non puoi farlo da %@ mobile."; "widget_menu_refresh" = "Ricarica"; @@ -1104,7 +1104,7 @@ "secrets_setup_recovery_key_storage_alert_message" = "✓ Stampala e conservala in un posto sicuro\n✓ Salvala in una chiave USB o disco di backup\n✓ Copiala nel tuo archivio cloud pesonale"; "secrets_setup_recovery_passphrase_title" = "Imposta una frase di sicurezza"; "secrets_setup_recovery_passphrase_information" = "Inserisci una frase di sicurezza che conosci solo tu, usata per proteggere i segreti nel tuo server."; -"secrets_setup_recovery_passphrase_additional_information" = "Non usare la password del tuo account."; +"secrets_setup_recovery_passphrase_additional_information" = "Non usare la password del tuo account Matrix."; "secrets_setup_recovery_passphrase_validate_action" = "Fatto"; "secrets_setup_recovery_passphrase_confirm_information" = "Inserisci la frase di sicurezza di nuovo per confermarla."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Conferma"; @@ -1113,13 +1113,13 @@ "authenticated_session_flow_not_supported" = "Questa app non supporta il metodo di autenticazione del tuo homeserver."; "secure_backup_setup_banner_title" = "Backup Sicuro"; "secure_backup_setup_banner_subtitle" = "Proteggiti dalla perdita dei messaggi e dati crittografati"; -"security_settings_crypto_sessions_description_2" = "Se non riconosci un accesso, modifica la password e reimposta il Backup Sicuro."; +"security_settings_crypto_sessions_description_2" = "Se non riconosci un accesso, modifica la password dell'account Matrix e reimposta il Backup Sicuro."; "security_settings_secure_backup" = "BACKUP SICURO"; "security_settings_secure_backup_description" = "Fai un backup delle chiavi crittografiche con i dati del tuo account in caso tu perda l'accesso alle tue sessioni. Le chiavi saranno protette con una chiave di sicurezza univoca."; "security_settings_secure_backup_setup" = "Configura"; "security_settings_secure_backup_synchronise" = "Sincronizza"; "security_settings_secure_backup_delete" = "Elimina backup"; -"security_settings_user_password_description" = "Conferma la tua identità inserendo la password del tuo account"; +"security_settings_user_password_description" = "Conferma la tua identità inserendo la password dell'account Matrix"; // Events formatter with you "event_formatter_widget_added_by_you" = "Hai aggiunto il widget: %@"; "event_formatter_widget_removed_by_you" = "Hai rimosso il widget: %@"; @@ -1215,7 +1215,7 @@ "room_details_advanced_e2e_encryption_enabled_for_dm" = "La crittografia è attiva"; "room_details_advanced_e2e_encryption_disabled_for_dm" = "La crittografia non è attiva."; "pin_protection_kick_user_alert_message" = "Troppi errori, sei stato disconnesso"; -"secrets_reset_authentication_message" = "Inserisci la password del tuo account per confermare"; +"secrets_reset_authentication_message" = "Inserisci la password del tuo account Matrix per confermare"; "secrets_reset_reset_action" = "Reimposta"; "secrets_reset_warning_message" = "Ricomincerai senza cronologia, messaggi, dispositivi o utenti fidati."; "secrets_reset_warning_title" = "Se reimposti tutto"; @@ -1597,3 +1597,35 @@ "poll_edit_form_update_failure_subtitle" = "Riprova"; "poll_edit_form_update_failure_title" = "Aggiornamento del sondaggio fallito"; "poll_edit_form_poll_type" = "Tipo sondaggio"; +"location_sharing_post_failure_subtitle" = "%@ non ha potuto rilevare la tua posizione. Riprova più tardi."; +"location_sharing_post_failure_title" = "Non siamo riusciti ad inviare la tua posizione"; +"home_context_menu_leave" = "Esci"; +"home_context_menu_normal_priority" = "Priorità normale"; +"home_context_menu_low_priority" = "Bassa priorità"; +"home_context_menu_unfavourite" = "Rimuovi dai preferiti"; +"home_context_menu_favourite" = "Preferito"; +"home_context_menu_unmute" = "Riattiva audio"; +"home_context_menu_mute" = "Silenzioso"; +"home_context_menu_notifications" = "Notifiche"; +"home_context_menu_make_room" = "Sposta in Stanze"; +"home_context_menu_make_dm" = "Sposta in Persone"; +"event_formatter_message_deleted" = "Messaggio eliminato"; +"settings_labs_enable_threads" = "Messaggi in conversazioni"; +"message_from_a_thread" = "Da una conversazione"; +"threads_empty_show_all_threads" = "Mostra tutte le conversazioni"; +"threads_empty_tip" = "Consiglio: tocca un messaggio e usa “Conversazione” per iniziarne una."; +"threads_empty_info_my" = "Rispondi ad una conversazione in corso o tocca un messaggio e usa “Conversazione” per iniziarne una nuova."; +"threads_empty_info_all" = "Le conversazioni ti aiutano a tenere le tue discussioni in tema e rintracciabili."; +"threads_empty_title" = "Tieni le discussioni organizzate in conversazioni"; +"threads_action_my_threads" = "Le mie conversazioni"; +"threads_action_all_threads" = "Tutte le conversazioni"; +"threads_title" = "Conversazioni"; +"thread_copy_link_to_thread" = "Copia link nella conversazione"; + +// MARK: Threads +"room_thread_title" = "Conversazione"; +"room_accessibility_thread_more" = "Altro"; +"room_accessibility_threads" = "Conversazioni"; +"room_event_copy_link_info" = "Link copiato negli appunti."; +"room_event_action_reply_in_thread" = "Conversazione"; +"room_event_action_view_in_room" = "Vedi nella stanza"; diff --git a/Riot/Assets/ja.lproj/InfoPlist.strings b/Riot/Assets/ja.lproj/InfoPlist.strings index 7b9dfeb15..29532a6d2 100644 --- a/Riot/Assets/ja.lproj/InfoPlist.strings +++ b/Riot/Assets/ja.lproj/InfoPlist.strings @@ -1,5 +1,8 @@ // Permissions usage explanations -"NSCameraUsageDescription" = "ビデオ通話や写真撮影、動画撮影などを行うときにカメラを使用します。"; +"NSCameraUsageDescription" = "カメラは、ビデオ通話や写真撮影、動画撮影に使用されます。"; "NSPhotoLibraryUsageDescription" = "フォトライブラリは、写真や動画の送信に使用されます。"; -"NSMicrophoneUsageDescription" = "マイクは動画撮影や通話に使用されます。"; -"NSContactsUsageDescription" = "連絡先のどれがElementまたはMatrixを既に使用しているかを表示するために、あなたのアドレス帳にあるメールアドレスと電話番号をMatrix Identity Serverに送信することができます。 New Vectorはこのデータを保存したり、他の目的に使用したりしません。 詳細については、アプリケーション設定のプライバシーポリシーページを参照してください。"; +"NSMicrophoneUsageDescription" = "Elementは通話、動画撮影、ボイスメッセージの録音にマイクへのアクセスを必要としています。"; +"NSContactsUsageDescription" = "Elementは、あなたが連絡先をチャットに招待できるように、連絡先を表示します。"; +"NSCalendarsUsageDescription" = "予定されているミーティングをアプリで確認することができます。"; +"NSFaceIDUsageDescription" = "Face IDはアプリへのアクセスに使用されます。"; +"NSLocationWhenInUseUsageDescription" = "位置情報を共有する際には、地図を表示するためのアクセスをElementに付与する必要があります。"; diff --git a/Riot/Assets/ja.lproj/Localizable.strings b/Riot/Assets/ja.lproj/Localizable.strings index a2cbb08e6..b47601f88 100644 --- a/Riot/Assets/ja.lproj/Localizable.strings +++ b/Riot/Assets/ja.lproj/Localizable.strings @@ -31,9 +31,9 @@ /* A user has invited you to a chat */ "USER_INVITE_TO_CHAT" = "%@ さんがあなたを対話に招待しました"; /* A user has invited you to an (unamed) group chat */ -"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ さんがあなたを部屋へ招待しました"; +"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ さんがあなたをルームへ招待しました"; /* A user has invited you to a named room */ -"USER_INVITE_TO_NAMED_ROOM" = "%@ さんが部屋 %@ へ招待しました"; +"USER_INVITE_TO_NAMED_ROOM" = "%@ さんがルーム %@ へ招待しました"; /* Incoming one-to-one voice call */ "VOICE_CALL_FROM_USER" = "%@ さんから通話着信"; /* Incoming one-to-one video call */ @@ -53,7 +53,7 @@ /** Key verification **/ -"KEY_VERIFICATION_REQUEST_FROM_USER" = "%@は検証したい"; +"KEY_VERIFICATION_REQUEST_FROM_USER" = "%@は検証を求めています"; /* New message indicator on a room */ "MESSAGE_IN_X" = "%@ 内のメッセージ"; @@ -74,3 +74,6 @@ /* New message indicator on unknown room */ "MESSAGE" = "メッセージ"; +/** General **/ + +"NOTIFICATION" = "通知"; diff --git a/Riot/Assets/ja.lproj/Vector.strings b/Riot/Assets/ja.lproj/Vector.strings index 6ee67bd59..6e9584a13 100644 --- a/Riot/Assets/ja.lproj/Vector.strings +++ b/Riot/Assets/ja.lproj/Vector.strings @@ -1,17 +1,17 @@ // Titles "title_home" = "ホーム"; "title_favourites" = "お気に入り"; -"title_people" = "対話"; +"title_people" = "連絡先"; "title_rooms" = "ルーム"; "warning" = "警告"; // Actions "view" = "表示"; "next" = "次へ"; "back" = "戻る"; -"continue" = "続く"; +"continue" = "続ける"; "create" = "作成"; "start" = "開始"; -"leave" = "保存しない"; +"leave" = "退出"; "remove" = "削除"; "invite" = "招待"; "retry" = "再試行"; @@ -22,16 +22,16 @@ "join" = "参加"; "decline" = "断る"; "accept" = "受諾"; -"preview" = "下見"; +"preview" = "プレビュー"; "camera" = "カメラ"; "voice" = "音声"; "video" = "映像"; "active_call" = "通話開始"; -"active_call_details" = "通話開始 (%@)"; +"active_call_details" = "通話開始(%@)"; "later" = "後で"; "rename" = "名前変更"; "collapse" = "たたむ"; -"send_to" = "%@ さんへ送信"; +"send_to" = "%@さんへ送信"; "sending" = "送信中"; // Authentication "auth_login" = "ログイン"; @@ -40,104 +40,104 @@ "auth_skip" = "省く"; "auth_send_reset_email" = "初期化メール送信"; "auth_return_to_login" = "ログイン画面へ戻る"; -"auth_user_id_placeholder" = "ユーザ名または電子メール"; +"auth_user_id_placeholder" = "ユーザー名または電子メール"; "auth_password_placeholder" = "パスワード"; "auth_new_password_placeholder" = "新しいパスワード"; -"auth_user_name_placeholder" = "ユーザ名"; -"auth_optional_email_placeholder" = "電子メールアドレス (任意で)"; -"auth_email_placeholder" = "電子メールアドレス"; -"auth_optional_phone_placeholder" = "電話番号 (任意で)"; +"auth_user_name_placeholder" = "ユーザー名"; +"auth_optional_email_placeholder" = "メールアドレス(任意)"; +"auth_email_placeholder" = "メールアドレス"; +"auth_optional_phone_placeholder" = "電話番号(任意)"; "auth_phone_placeholder" = "電話番号"; "auth_repeat_password_placeholder" = "パスワード再確認"; "auth_repeat_new_password_placeholder" = "新しいパスワードを再確認"; "auth_home_server_placeholder" = "URL (例 https://matrix.org)"; "auth_identity_server_placeholder" = "URL (例 https://vector.im)"; -"auth_invalid_login_param" = "ユーザ名かパスワードが正しくありません"; -"auth_invalid_user_name" = "ユーザ名は半角英数字、ドット、ハイフン、アンダスコアのみで記して下さい"; +"auth_invalid_login_param" = "ユーザー名かパスワードが正しくありません"; +"auth_invalid_user_name" = "ユーザー名は半角英数字、ドット、ハイフン、アンダスコアのみで記して下さい"; "auth_invalid_password" = "パスワードが短すぎます(最小6文字)"; -"auth_invalid_email" = "正しくない電子メールアドレスのようです"; +"auth_invalid_email" = "メールアドレスの形式が正しくありません"; "auth_invalid_phone" = "正しくない電話番号のようです"; -"auth_missing_password" = "パスワードが違います"; +"auth_missing_password" = "パスワードが入力されていません"; "auth_add_email_message" = "電子メールアドレスを登録すると, 誰かがあなたを検索をしたり, パスワード紛失時に初期化のメールを送ることができます."; "auth_add_phone_message" = "電話番号を登録すると, 誰かがあなたを電話番号で検索できるようになります."; "auth_add_email_phone_message" = "電子メールアドレスや電話番号を登録すると, それらを使用して誰かがあなたを検索できるようになります. 電子メールアドレスは, パスワード紛失時に初期化の連絡をするためにも使用されます."; "auth_add_email_and_phone_message" = "電子メールアドレスや電話番号を登録すると, それらを使用して誰かがあなたを検索できるようになります. 電子メールアドレスは, パスワード紛失時に初期化の連絡をするためにも使用されます."; -"auth_missing_email" = "電子メールアドレスが違います"; -"auth_missing_phone" = "電話番号が違います"; -"auth_missing_email_or_phone" = "電子メールアドレスまたは電話番号が違います"; -"auth_email_in_use" = "この電子メールアドレスは既に使われています"; +"auth_missing_email" = "メールアドレスが入力されていません"; +"auth_missing_phone" = "電話番号が入力されていません"; +"auth_missing_email_or_phone" = "メールアドレスまたは電話番号が入力されていません"; +"auth_email_in_use" = "このメールアドレスは既に使われています"; "auth_phone_in_use" = "この電話番号は既に使用されています"; -"auth_untrusted_id_server" = "この認証サーバは信用されていません"; +"auth_untrusted_id_server" = "この認証サーバーは信用されていません"; "auth_password_dont_match" = "パスワードが一致しません"; -"auth_username_in_use" = "ユーザ名はすでに使用されています"; +"auth_username_in_use" = "ユーザー名は既に使用されています"; "auth_forgot_password" = "パスワードを忘れましたか?"; -"auth_email_not_found" = "電子メールの送信に失敗しました: メールアドレスが見つかりません"; -"auth_use_server_options" = "接続先サーバを指定する(追加設定)"; +"auth_email_not_found" = "電子メールの送信に失敗しました:メールアドレスが見つかりません"; +"auth_use_server_options" = "接続先サーバーを指定する(追加設定)"; "auth_email_validation_message" = "登録を続行するには電子メールを確認して下さい"; "auth_msisdn_validation_title" = "認証を確認中"; -"auth_msisdn_validation_message" = "SMSで認証番号を送りました. 以下にその番号を入力してください."; +"auth_msisdn_validation_message" = "SMSで認証番号を送りました。以下にその番号を入力してください。"; "auth_msisdn_validation_error" = "電話番号を認証できません。"; -"auth_recaptcha_message" = "接続先サーバ側が、機械による自動登録ではなく、あなたが人間であることを確認したいとのことです"; -"auth_reset_password_message" = "パスワードを初期化するには, アカウントに登録されている電子メールアドレスを入力してください:"; -"auth_reset_password_missing_email" = "あなたのアカウントに登録された電子メールアドレスの入力が必要です."; -"auth_reset_password_missing_password" = "新しいパスワードの入力が必要です."; -"auth_reset_password_email_validation_message" = "%@ へ電子メールが送信されました. リンクをたどったら以下をクリックしてください."; -"auth_reset_password_next_step_button" = "自分用電子メールアドレスで認証をします"; -"auth_reset_password_error_unauthorized" = "電子メールアドレスの確認に失敗しました: 電子メールのリンクをクリックしたことを確認してください"; -"auth_reset_password_error_not_found" = "あなたの電子メールアドレスは、接続先サーバ上のMatrix IDと関連付けられていないようです。"; -"auth_reset_password_success_message" = "あなたのパスワードは初期化されました.\n\nあなたはすべてのセッションから切断しており、プッシュ通知を受け取ることはありません。通知を再度有効にするには、各端末に再度ログインします。"; -"auth_add_email_and_phone_warning" = "電子メールと電話番号の同時登録は, まだシステムが対応できません. 電話番号だけの登録は可能です. お手数おかけしますが, 後ほど個人情報設定から電子メールアドレスを登録してください."; +"auth_recaptcha_message" = "このホームサーバーは、あなたがロボットではないことの確認を求めています"; +"auth_reset_password_message" = "Matrixのアカウントのパスワードを初期化するには、アカウントに登録されているメールアドレスを入力してください:"; +"auth_reset_password_missing_email" = "あなたのアカウントに登録されたメールアドレスの入力が必要です。"; +"auth_reset_password_missing_password" = "新しいパスワードの入力が必要です。"; +"auth_reset_password_email_validation_message" = "%@ へ電子メールが送信されました。リンクをたどったら以下をクリックしてください。"; +"auth_reset_password_next_step_button" = "メールアドレスを認証しました"; +"auth_reset_password_error_unauthorized" = "メールアドレスの確認に失敗しました:電子メールのリンクをクリックしたことを確認してください"; +"auth_reset_password_error_not_found" = "あなたのメールアドレスは、接続先サーバー上のMatrix IDと関連付けられていないようです。"; +"auth_reset_password_success_message" = "あなたのパスワードは初期化されました。\n\nあなたは全てのセッションから切断しており、プッシュ通知を受け取ることはありません。通知を再度有効にするには、各端末に再度ログインします。"; +"auth_add_email_and_phone_warning" = "電子メールと電話番号の同時登録は、まだシステムが対応できません。電話番号だけの登録は可能です。お手数おかけしますが、後ほど個人情報設定からメールアドレスを登録してください。"; // Chat creation -"room_creation_title" = "新しい対話"; +"room_creation_title" = "チャットを開始"; "room_creation_account" = "アカウント"; "room_creation_appearance" = "外観"; "room_creation_appearance_name" = "名前"; -"room_creation_appearance_picture" = "チャット画像 (任意)"; +"room_creation_appearance_picture" = "チャット画像(任意)"; "room_creation_privacy" = "個人情報保護"; "room_creation_private_room" = "この会話は非公開です"; "room_creation_public_room" = "この会話は公開されます"; -"room_creation_make_public" = "パブリックにする"; -"room_creation_make_public_prompt_title" = "このチャットをパブリックしますか?"; -"room_creation_make_public_prompt_msg" = "このチャットをパブリックしてもよろしいですか? 誰でもあなたのメッセージを読んでチャットに参加できます。"; -"room_creation_keep_private" = "プライベートに保つ"; -"room_creation_make_private" = "プライベートにする"; -"room_creation_wait_for_creation" = "ルームはすでに作成されています。 お待ちください。"; -"room_creation_invite_another_user" = "ユーザID, 表示名, 電子メールで検索と招待"; +"room_creation_make_public" = "公開"; +"room_creation_make_public_prompt_title" = "このチャットを公開しますか?"; +"room_creation_make_public_prompt_msg" = "このチャットを公開してもよろしいですか?誰でもあなたのメッセージを読んでチャットに参加できます。"; +"room_creation_keep_private" = "非公開に保つ"; +"room_creation_make_private" = "非公開にする"; +"room_creation_wait_for_creation" = "ルームは既に作成されています。お待ちください。"; +"room_creation_invite_another_user" = "ユーザーID、表示名、電子メールで検索と招待"; // Room recents "room_recents_directory_section" = "ルーム一覧"; "room_recents_favourites_section" = "お気に入り"; -"room_recents_people_section" = "対話"; +"room_recents_people_section" = "連絡先"; "room_recents_conversations_section" = "ルーム"; "room_recents_no_conversation" = "ルームがありません"; "room_recents_low_priority_section" = "低優先度"; "room_recents_invites_section" = "招待中"; -"room_recents_start_chat_with" = "対話を開始"; +"room_recents_start_chat_with" = "チャットを開始"; "room_recents_create_empty_room" = "ルームを作成"; "room_recents_join_room" = "ルームへ参加"; "room_recents_join_room_title" = "ルームへ参加"; -"room_recents_join_room_prompt" = "ルームIDまたはルームのエイリアスを入力します"; +"room_recents_join_room_prompt" = "ルームIDまたはルームのエイリアスを入力"; // People tab "people_invites_section" = "招待中"; "people_conversation_section" = "会話"; "people_no_conversation" = "会話なし"; // Rooms tab -"room_directory_no_public_room" = "利用可能なパブリックのルームはありません"; +"room_directory_no_public_room" = "利用可能な公開ルームはありません"; // Search "search_rooms" = "ルーム"; -"search_messages" = "発言"; -"search_people" = "対話"; +"search_messages" = "メッセージ"; +"search_people" = "連絡先"; "search_files" = "添付ファイル"; "search_default_placeholder" = "検索"; -"search_people_placeholder" = "ユーザID, 表示名, 電子メールで検索"; +"search_people_placeholder" = "ユーザーID、表示名、電子メールで検索"; "search_no_result" = "結果なし"; -"search_in_progress" = "検索中…"; +"search_in_progress" = "検索しています…"; // Directory "directory_cell_title" = "ルーム一覧を見る"; "directory_cell_description" = "%tu ルーム"; "directory_search_results_title" = "ルーム一覧検索結果"; -"directory_search_results" = "%tu 件の検索結果 for %@"; -"directory_search_results_more_than" = ">%tu 件の検索結果 for %@"; -"directory_searching_title" = "ルーム一覧を検索中…"; +"directory_search_results" = "%@の検索結果%tu件"; +"directory_search_results_more_than" = ">%@の検索結果%tu件"; +"directory_searching_title" = "ルーム一覧を検索しています…"; "directory_search_fail" = "一覧を取得できませんでした"; // Contacts "contacts_address_book_section" = "端末の電話帳"; @@ -146,117 +146,117 @@ "contacts_address_book_permission_required" = "端末内電話帳へのアクセス権限が必要です"; "contacts_address_book_permission_denied" = "端末の電話帳をElementアプリが読み取ることは許可されていません"; "contacts_user_directory_section" = "利用者一覧"; -"contacts_user_directory_offline_section" = "利用者一覧 (切断中)"; +"contacts_user_directory_offline_section" = "利用者一覧(オフライン)"; // Chat participants "room_participants_title" = "参加者"; "room_participants_add_participant" = "参加者を追加"; -"room_participants_one_participant" = "参加者 1名"; -"room_participants_multi_participants" = "参加者 %d名"; -"room_participants_leave_prompt_title" = "ルームを出る"; -"room_participants_leave_prompt_msg" = "ルームを退室して本当によろしいですか?"; +"room_participants_one_participant" = "参加者1名"; +"room_participants_multi_participants" = "参加者%d名"; +"room_participants_leave_prompt_title" = "ルームを退出"; +"room_participants_leave_prompt_msg" = "ルームを退出してよろしいですか?"; "room_participants_remove_prompt_title" = "確認"; -"room_participants_remove_prompt_msg" = "本当に %@ さんをチャットから退去させますか?"; +"room_participants_remove_prompt_msg" = "本当に%@をチャットから退去させますか?"; "room_participants_remove_third_party_invite_msg" = "サードパーティの招待を削除することは、APIが存在するまでサポートされていません"; "room_participants_invite_prompt_title" = "確認"; -"room_participants_invite_prompt_msg" = "本当に %@ さんをチャットへ招待しますか?"; -"room_participants_filter_room_members" = "参加者を検索"; -"room_participants_invite_another_user" = "ユーザID, 表示名, 電子メールで検索と招待"; +"room_participants_invite_prompt_msg" = "%@をチャットに招待してよろしいですか?"; +"room_participants_filter_room_members" = "ルームのメンバーを絞り込む"; +"room_participants_invite_another_user" = "ユーザーID、名前、電子メールで検索、招待"; "room_participants_invite_malformed_id_title" = "招待エラー"; -"room_participants_invite_malformed_id" = "不正なIDです。電子メールアドレスを用いるか、'@localpart:domain' のような Matrix IDを使用してください"; +"room_participants_invite_malformed_id" = "不正なIDです。メールアドレスを用いるか、'@localpart:domain'のようなMatrix IDを使用してください"; "room_participants_invited_section" = "招待中"; -"room_participants_online" = "接続中"; -"room_participants_offline" = "切断中"; -"room_participants_unknown" = "状態不明"; -"room_participants_idle" = "待機中"; +"room_participants_online" = "オンライン"; +"room_participants_offline" = "オフライン"; +"room_participants_unknown" = "不明"; +"room_participants_idle" = "アイドル"; "room_participants_now" = "現在"; "room_participants_ago" = "前"; "room_participants_action_section_admin_tools" = "管理者権限操作"; -"room_participants_action_section_direct_chats" = "対話"; -"room_participants_action_section_devices" = "セッション"; +"room_participants_action_section_direct_chats" = "非公開のチャット"; +"room_participants_action_section_devices" = "セッション一覧"; "room_participants_action_section_other" = "オプション"; "room_participants_action_invite" = "招待"; "room_participants_action_leave" = "このルームを出る"; -"room_participants_action_remove" = "このルームから退室させる"; -"room_participants_action_ban" = "このルームからブロックする"; -"room_participants_action_unban" = "ブロック解除"; -"room_participants_action_ignore" = "この参加者の発言を全て非表示にする"; -"room_participants_action_unignore" = "この参加者の発言を全て表示する"; -"room_participants_action_set_default_power_level" = "権限を一般参加者へ変更"; -"room_participants_action_set_moderator" = "権限を司会者へ変更"; +"room_participants_action_remove" = "このルームから削除"; +"room_participants_action_ban" = "このルームからブロック"; +"room_participants_action_unban" = "ブロックを解除"; +"room_participants_action_ignore" = "このユーザーの発言を全て非表示にする"; +"room_participants_action_unignore" = "このユーザーの発言を全て表示"; +"room_participants_action_set_default_power_level" = "権限を一般ユーザーへ変更"; +"room_participants_action_set_moderator" = "権限をモデレーターへ変更"; "room_participants_action_set_admin" = "権限を管理者へ変更"; -"room_participants_action_start_new_chat" = "対話を開始"; +"room_participants_action_start_new_chat" = "チャットを開始"; "room_participants_action_start_voice_call" = "音声通話を開始"; "room_participants_action_start_video_call" = "映像付き音声通話を開始"; -"room_participants_action_mention" = "指名して呼掛け"; +"room_participants_action_mention" = "メンション"; // Chat "room_jump_to_first_unread" = "最初の未読位置へ移動"; -"room_new_message_notification" = "%d 新しい発言"; -"room_new_messages_notification" = "%d 新しい発言"; -"room_one_user_is_typing" = "%@ さんが文字入力中…"; -"room_two_users_are_typing" = "%@ さん、 %@ さんが文字入力中…"; -"room_many_users_are_typing" = "%@ さん、 %@ さん他が文字入力中…"; -"room_message_placeholder" = "ここに送信文を入力 (暗号なし)…"; +"room_new_message_notification" = "%d件の新しい発言"; +"room_new_messages_notification" = "%d件の新しい発言"; +"room_one_user_is_typing" = "%@さんが入力しています…"; +"room_two_users_are_typing" = "%@さん、%@さんが入力しています…"; +"room_many_users_are_typing" = "%@さん、%@さん他が入力しています…"; +"room_message_placeholder" = "返信を送る(未暗号化)…"; "encrypted_room_message_placeholder" = "暗号文を送信…"; "room_message_short_placeholder" = "ここに送信文を入力…"; -"room_offline_notification" = "サーバとの接続が失われました."; -"room_unsent_messages_notification" = "文章が送信できませんでした."; -"room_unsent_messages_unknown_devices_notification" = "未知のセッションが存在するために文章が送信されませんでした."; -"room_ongoing_conference_call" = "会議通話実施中。 %@ または %@で参加してください。"; -"room_ongoing_conference_call_with_close" = "会議通話実施中。%@または%@で参加してください。 %@。"; +"room_offline_notification" = "サーバーとの接続が失われました。"; +"room_unsent_messages_notification" = "メッセージを送信できませんでした。"; +"room_unsent_messages_unknown_devices_notification" = "未知のセッションが存在するために文章が送信されませんでした。"; +"room_ongoing_conference_call" = "会議通話実施中。%@または%@で参加してください。"; +"room_ongoing_conference_call_with_close" = "会議通話実施中。%@または%@で参加してください。%@。"; "room_ongoing_conference_call_close" = "閉じる"; "room_conference_call_no_power" = "このルームで会議通話を管理する権限が必要です"; "room_prompt_resend" = "全て再送信"; "room_prompt_cancel" = "全て中止"; "room_resend_unsent_messages" = "未送信の文を再送信"; "room_delete_unsent_messages" = "未送信の文を削除"; -"room_event_action_copy" = "複写"; +"room_event_action_copy" = "コピー"; "room_event_action_quote" = "引用"; "room_event_action_redact" = "移動して削除"; "room_event_action_more" = "さらに"; "room_event_action_share" = "共有"; -"room_event_action_permalink" = "直リンク"; -"room_event_action_view_source" = "ソースコードを表示"; +"room_event_action_permalink" = "メッセージへのリンクをコピー"; +"room_event_action_view_source" = "ソースを表示"; "room_event_action_report" = "発言を報告"; "room_event_action_report_prompt_reason" = "この発言を報告する理由"; -"room_event_action_report_prompt_ignore_user" = "このユーザからのすべての発言を非表示にしますか?"; +"room_event_action_report_prompt_ignore_user" = "このユーザーからの全ての発言を非表示にしますか?"; "room_event_action_save" = "保存"; "room_event_action_resend" = "再送信"; "room_event_action_delete" = "削除"; "room_event_action_cancel_send" = "送信中止"; "room_event_action_cancel_download" = "ダウンロード中止"; "room_event_action_view_encryption" = "暗号についての情報"; -"room_warning_about_encryption" = "End-to-end 暗号化はベータ版であり、信頼性が低い場合があります。\n\n発言を保護するためにはまだ信用すべきではありません。\n\n端末が参加するより前の発言履歴を復号化することはまだできません。\n\n暗号化された発言は、まだ暗号化を実装していないクライアントでは表示されません。"; +"room_warning_about_encryption" = "エンドツーエンド暗号化はベータ版であり、信頼性が低い場合があります。\n\n発言を保護するためにはまだ信用すべきではありません。\n\n端末が参加するより前の発言履歴を復号化することはまだできません。\n\n暗号化された発言は、まだ暗号化を実装していないクライアントでは表示されません。"; "room_event_failed_to_send" = "送信失敗"; // Unknown devices -"unknown_devices_alert_title" = "部屋に未知のセッションが存在します"; -"unknown_devices_alert" = "この部屋には、確認されていない未知のセッションが含まれています。\nすなわち、セッションがをユーザ本人が所有しているという保証はありません。\n続ける前に各セッションの確認を行うことをおすすめしますが、確認することなく発言を再送信することができます。"; +"unknown_devices_alert_title" = "ルームに未知のセッションが存在します"; +"unknown_devices_alert" = "このルームには、確認されていない未知のセッションが含まれています。\nすなわち、セッションがをユーザー本人が所有しているという保証はありません。\n続ける前に各セッションの確認を行うことをおすすめしますが、確認することなく発言を再送信することができます。"; "unknown_devices_send_anyway" = "とにかく送る"; -"unknown_devices_call_anyway" = "とにかく通話する"; -"unknown_devices_answer_anyway" = "とにかく応答する"; +"unknown_devices_call_anyway" = "とにかく通話"; +"unknown_devices_answer_anyway" = "とにかく応答"; "unknown_devices_verify" = "確認…"; "unknown_devices_title" = "未知のセッション"; // Room Title -"room_title_new_room" = "新しい部屋"; -"room_title_multiple_active_members" = "全%@人中 %@人が回線接続"; -"room_title_one_active_member" = "全%@人中 %@人が回線接続"; +"room_title_new_room" = "新しいルーム"; +"room_title_multiple_active_members" = "全%@人中%@人が回線接続"; +"room_title_one_active_member" = "全%@人中%@人が回線接続"; "room_title_invite_members" = "招待中"; -"room_title_members" = "%@名の参加者"; -"room_title_one_member" = "1名の参加者"; +"room_title_members" = "%@名のメンバー"; +"room_title_one_member" = "1名のメンバー"; // Room Preview -"room_preview_invitation_format" = "あなたは %@ さんに呼ばれてこの部屋へ参加しました"; -"room_preview_subtitle" = "これは部屋の下見です。発言があっても部屋は更新されません。"; -"room_preview_unlinked_email_warning" = "このアカウントに関連付けられていない %@ 宛に招待が送信されました。別のアカウントでログインするか、メールアドレスをこのアカウントに追加することができます。"; -"room_preview_try_join_an_unknown_room" = "あなたは %@ へ接続しようとしています。この会議に参加しますか?"; -"room_preview_try_join_an_unknown_room_default" = "部屋"; +"room_preview_invitation_format" = "あなたは%@さんに呼ばれてこのルームへ参加しました"; +"room_preview_subtitle" = "これはルームのプレビューです。ルームでのやり取りは無効化されています。"; +"room_preview_unlinked_email_warning" = "このアカウントに関連付けられていない%@宛に招待が送信されました。別のアカウントでログインするか、メールアドレスをこのアカウントに追加することができます。"; +"room_preview_try_join_an_unknown_room" = "あなたは%@へ接続しようとしています。この会議に参加しますか?"; +"room_preview_try_join_an_unknown_room_default" = "ルーム"; // Settings "settings_title" = "設定"; -"account_logout_all" = "すべてのアカウントを回線切断する"; +"account_logout_all" = "全てのアカウントを回線切断"; "settings_config_no_build_info" = "ビルド情報がありません"; "settings_mark_all_as_read" = "全ての発言を既読にする"; -"settings_report_bug" = "不具合報告"; -"settings_config_home_server" = "接続先サーバは %@"; +"settings_report_bug" = "バグレポート"; +"settings_config_home_server" = "接続先サーバーは %@"; "settings_config_identity_server" = "認証サーバは %@"; -"settings_config_user_id" = "%@ でログインしています"; +"settings_config_user_id" = "%@でログインしています"; "settings_user_settings" = "利用者設定"; "settings_notifications_settings" = "通知設定"; "settings_calls_settings" = "通話"; @@ -270,26 +270,26 @@ "settings_cryptography" = "暗号化"; "settings_sign_out" = "通信完全切断"; "settings_sign_out_confirmation" = "本当によろしいですか?"; -"settings_sign_out_e2e_warn" = "あなたはend-to-end暗号鍵を紛失してしまったようです。すなわち、この端末で暗号化された部屋の昔の発言を読むことができなくなります。"; +"settings_sign_out_e2e_warn" = "あなたはエンドツーエンド暗号鍵を失ってしまいます。この端末で暗号化されたルームの昔の発言を読むことができなくなります。"; "settings_profile_picture" = "自分のアイコン画像"; "settings_display_name" = "表示名"; "settings_first_name" = "名"; "settings_surname" = "姓"; "settings_remove_prompt_title" = "確認"; -"settings_remove_email_prompt_msg" = "電子メールアドレス %@ を本当に削除してよろしいですか?"; +"settings_remove_email_prompt_msg" = "メールアドレス %@ を本当に削除してよろしいですか?"; "settings_remove_phone_prompt_msg" = "電話番号 %@ を本当に削除してよろしいですか?"; "settings_email_address" = "電子メール"; -"settings_email_address_placeholder" = "あなたの電子メールアドレスを入力してください"; -"settings_add_email_address" = "電子メールアドレスを追加"; +"settings_email_address_placeholder" = "あなたのメールアドレスを入力してください"; +"settings_add_email_address" = "メールアドレスを追加"; "settings_phone_number" = "電話番号"; "settings_add_phone_number" = "電話番号を追加"; "settings_night_mode" = "夜間おやすみモード"; "settings_fail_to_update_profile" = "自己紹介設定の更新に失敗しました"; "settings_enable_push_notif" = "この端末での通知"; "settings_show_decrypted_content" = "復号化された文章を表示"; -"settings_global_settings_info" = "あなたの %@ webクライアント上で、全体の通知設定が可能です"; -"settings_pin_rooms_with_missed_notif" = "通知の届かなかった部屋をピン止めする"; -"settings_callkit_info" = "画面がロックされているときに着信がありました。Elementの着信はシステムの通話履歴で確認できます。 iCloudが有効になっている場合、この通話履歴はAppleと共有されます。"; +"settings_global_settings_info" = "あなたの%@ webクライアント上で、全体の通知設定が可能です"; +"settings_pin_rooms_with_missed_notif" = "逃した通知があるルームを固定"; +"settings_callkit_info" = "画面がロックされているときに着信がありました。Elementの着信はシステムの通話履歴で確認できます。iCloudが有効になっている場合、この通話履歴はAppleと共有されます。"; "settings_ui_language" = "言語"; "settings_ui_theme" = "外観"; "settings_ui_theme_auto" = "自動"; @@ -300,18 +300,18 @@ "settings_unignore_user" = "%@さんからのメッセージを見ますか?"; "settings_contacts_discover_matrix_users" = "電子メールと電話番号をユーザの検索に使用"; "settings_contacts_phonebook_country" = "電話帳の国番号"; -"settings_labs_e2e_encryption" = "End-to-End暗号"; +"settings_labs_e2e_encryption" = "エンドツーエンド暗号化"; "settings_labs_e2e_encryption_prompt_message" = "暗号化の設定を完了するためには再度ログインしてください。"; "settings_labs_matrix_apps" = "Matrixアプリ"; -"settings_labs_create_conference_with_jitsi" = "jitsiの会議通話を作成する"; -"settings_version" = "Version %@"; -"settings_olm_version" = "Olm バージョン %@"; +"settings_labs_create_conference_with_jitsi" = "jitsiの会議通話を作成"; +"settings_version" = "バージョン %@"; +"settings_olm_version" = "Olmバージョン %@"; "settings_copyright" = "著作権"; "settings_term_conditions" = "利用規約"; "settings_privacy_policy" = "個人情報保護方針"; "settings_third_party_notices" = "外部ライブラリの規約"; "settings_send_crash_report" = "匿名利用状況と誤動作情報を送信"; -"settings_enable_rageshake" = "バグ報告のため端末を揺さぶる"; +"settings_enable_rageshake" = "バグレポートのため端末を振る"; "settings_clear_cache" = "一時保存を消去"; "settings_change_password" = "パスワード変更"; "settings_old_password" = "今までのパスワード"; @@ -322,96 +322,96 @@ "settings_crypto_device_name" = "セッション名: "; "settings_crypto_device_id" = "\nセッションID: "; "settings_crypto_device_key" = "\nセッションキー:\n"; -"settings_crypto_export" = "暗号鍵を外部へ保存"; +"settings_crypto_export" = "鍵をエクスポート"; "settings_crypto_blacklist_unverified_devices" = "検証されたセッションのみで暗号化"; // Room Details -"room_details_title" = "部屋の詳細"; -"room_details_people" = "参加者"; +"room_details_title" = "ルームの詳細"; +"room_details_people" = "メンバー"; "room_details_files" = "アップロード"; "room_details_settings" = "設定"; -"room_details_photo" = "部屋の画像アイコン"; -"room_details_room_name" = "部屋名"; +"room_details_photo" = "ルームの画像アイコン"; +"room_details_room_name" = "ルーム名"; "room_details_topic" = "トピック"; "room_details_favourite_tag" = "お気に入り"; "room_details_low_priority_tag" = "低優先度"; "room_details_mute_notifs" = "発言があっても通知しない"; "room_details_direct_chat" = "対話"; -"room_details_access_section" = "誰を部屋に入室可能としますか?"; -"room_details_access_section_invited_only" = "この部屋に招待された人のみ参加可能"; -"room_details_access_section_anyone_apart_from_guest" = "誰でも部屋に参加できる (ゲストユーザは不可)"; -"room_details_access_section_anyone" = "誰でも部屋に参加できる (ゲストユーザも許可)"; -"room_details_access_section_no_address_warning" = "この部屋へのリンクを作成するには、部屋の住所表記が必要です"; -"room_details_access_section_directory_toggle" = "部屋一覧へ公開する"; -"room_details_history_section" = "誰をこの部屋の発言履歴を読めるようにしますか?"; +"room_details_access_section" = "誰がルームにアクセスできますか?"; +"room_details_access_section_invited_only" = "招待された人のみ"; +"room_details_access_section_anyone_apart_from_guest" = "ルームのリンクを知っている人なら誰でも(ゲストユーザーを除く)"; +"room_details_access_section_anyone" = "ルームのリンクを知っている人なら誰でも(ゲストユーザーを含む)"; +"room_details_access_section_no_address_warning" = "このルームへのリンクを作成するには、ルームのアドレスが必要です"; +"room_details_access_section_directory_toggle" = "ルーム一覧へ公開"; +"room_details_history_section" = "誰をこのルームの発言履歴を読めるようにしますか?"; "room_details_history_section_anyone" = "誰でも"; -"room_details_history_section_members_only" = "参加者のみ (この設定を選択した時点から)"; -"room_details_history_section_members_only_since_invited" = "参加者のみ (招待を送った時点から)"; -"room_details_history_section_members_only_since_joined" = "参加者のみ (参加した時点から)"; +"room_details_history_section_members_only" = "メンバーのみ (この設定を選択した時点から)"; +"room_details_history_section_members_only_since_invited" = "メンバーのみ(招待を送った時点から)"; +"room_details_history_section_members_only_since_joined" = "メンバーのみ (参加した時点から)"; "room_details_history_section_prompt_title" = "個人情報の警告"; "room_details_history_section_prompt_msg" = "発言履歴を読むことができる人の変更は、以後の発言にのみ適用されます。既存の発言履歴の可視性は変更されません。"; -"room_details_addresses_section" = "住所表記"; -"room_details_no_local_addresses" = "この部屋はサーバ内住所表記がありません"; -"room_details_new_address" = "新しい住所表記を追加"; +"room_details_addresses_section" = "アドレス"; +"room_details_no_local_addresses" = "このルームにはローカルアドレスがありません"; +"room_details_new_address" = "新しいアドレスを追加"; "room_details_new_address_placeholder" = "新しいアドレスを追加(例 #foo%@)"; -"room_details_addresses_invalid_address_prompt_title" = "住所表記が正しくありません"; -"room_details_addresses_invalid_address_prompt_msg" = "%@ は正しくない形式の住所表記です"; -"room_details_addresses_disable_main_address_prompt_title" = "代表住所表記の警告"; -"room_details_addresses_disable_main_address_prompt_msg" = "代表住所表記が設定されていません. この部屋の代表住所表記は無作為に選択、設定されます"; +"room_details_addresses_invalid_address_prompt_title" = "不正なエイリアスのフォーマット"; +"room_details_addresses_invalid_address_prompt_msg" = "%@はエイリアスの正しいフォーマットではありません"; +"room_details_addresses_disable_main_address_prompt_title" = "メインアドレスの警告"; +"room_details_addresses_disable_main_address_prompt_msg" = "メインアドレスが設定されていません。このルームのメインアドレスは無作為に選択、設定されます"; "room_details_banned_users_section" = "ブロックされたユーザー"; "room_details_advanced_section" = "拡張設定"; -"room_details_advanced_room_id" = "部屋の固有ID:"; -"room_details_advanced_enable_e2e_encryption" = "暗号化を開始(警告: 部屋の暗号を中止することはできません!)"; -"room_details_advanced_e2e_encryption_enabled" = "この部屋の発言は暗号化されています"; -"room_details_advanced_e2e_encryption_disabled" = "この部屋の発言は暗号化されていません。"; +"room_details_advanced_room_id" = "ルームの固有ID:"; +"room_details_advanced_enable_e2e_encryption" = "暗号化を有効にする(警告: 有効後にこれを無効にすることはできません!)"; +"room_details_advanced_e2e_encryption_enabled" = "このルームの発言は暗号化されています"; +"room_details_advanced_e2e_encryption_disabled" = "このルームの発言は暗号化されていません。"; "room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "検証されたセッションのみで暗号化"; -"room_details_fail_to_update_avatar" = "部屋のアイコン画像の更新に失敗しました"; -"room_details_fail_to_update_room_name" = "部屋名の更新に失敗しました"; -"room_details_fail_to_update_topic" = "部屋の説明の更新に失敗しました"; -"room_details_fail_to_update_room_guest_access" = "部屋のゲスト参加者設定の更新に失敗しました"; -"room_details_fail_to_update_room_join_rule" = "入室規則の更新に失敗しました"; -"room_details_fail_to_update_room_directory_visibility" = "部屋一覧の可視設定の更新に失敗しました"; -"room_details_fail_to_update_history_visibility" = "発言履歴の可視範囲の設定更新に失敗しました"; -"room_details_fail_to_add_room_aliases" = "部屋住所の新規追加に失敗しました"; -"room_details_fail_to_remove_room_aliases" = "部屋住所の削除に失敗しました"; -"room_details_fail_to_update_room_canonical_alias" = "代表部屋住所の更新に失敗しました"; -"room_details_fail_to_update_room_direct" = "部屋の対話タグの変更に失敗しました"; -"room_details_fail_to_enable_encryption" = "部屋の暗号化の開始に失敗しました"; +"room_details_fail_to_update_avatar" = "ルームのアイコン画像の更新に失敗"; +"room_details_fail_to_update_room_name" = "ルーム名の更新に失敗"; +"room_details_fail_to_update_topic" = "ルームの説明の更新に失敗"; +"room_details_fail_to_update_room_guest_access" = "ゲストによるルームへのアクセスの設定更新に失敗"; +"room_details_fail_to_update_room_join_rule" = "参加ルールの更新に失敗"; +"room_details_fail_to_update_room_directory_visibility" = "ルーム一覧の可視設定の更新に失敗"; +"room_details_fail_to_update_history_visibility" = "発言履歴の可視範囲の設定更新に失敗"; +"room_details_fail_to_add_room_aliases" = "新しいルームアドレスの追加に失敗"; +"room_details_fail_to_remove_room_aliases" = "ルームアドレスの削除に失敗"; +"room_details_fail_to_update_room_canonical_alias" = "メインアドレスの更新に失敗"; +"room_details_fail_to_update_room_direct" = "ルームの対話タグの変更に失敗"; +"room_details_fail_to_enable_encryption" = "ルームの暗号化の開始に失敗"; "room_details_save_changes_prompt" = "変更を保存しますか?"; -"room_details_set_main_address" = "代表住所表記を設定"; -"room_details_unset_main_address" = "代表住所表記を設定解除"; -"room_details_copy_room_id" = "部屋固有IDをコピー"; -"room_details_copy_room_address" = "部屋の住所表記をコピー"; -"room_details_copy_room_url" = "部屋のURLをコピー"; +"room_details_set_main_address" = "メインアドレスを設定"; +"room_details_unset_main_address" = "メインアドレスの設定を解除"; +"room_details_copy_room_id" = "ルーム固有IDをコピー"; +"room_details_copy_room_address" = "ルームのアドレスをコピー"; +"room_details_copy_room_url" = "ルームのURLをコピー"; // Read Receipts "read_receipts_list" = "既読一覧を見る"; -"receipt_status_read" = "既読状況: "; +"receipt_status_read" = "既読状況: "; // Media picker "media_picker_library" = "ライブラリ"; "media_picker_select" = "選択"; // Directory -"directory_title" = "部屋一覧"; -"directory_server_picker_title" = "部屋一覧を選択"; -"directory_server_all_rooms" = "%@ サーバ上の全ての部屋"; -"directory_server_all_native_rooms" = "全てのMatrix連携部屋"; -"directory_server_type_homeserver" = "公開部屋一覧を表示するための接続サーバを入力してください"; +"directory_title" = "ルーム一覧"; +"directory_server_picker_title" = "ルーム一覧を選択"; +"directory_server_all_rooms" = "%@ サーバー上の全てのルーム"; +"directory_server_all_native_rooms" = "全てのMatrix連携ルーム"; +"directory_server_type_homeserver" = "公開ルーム一覧を表示するための接続サーバーを入力してください"; "directory_server_placeholder" = "matrix.org"; // Events formatter -"event_formatter_member_updates" = "%tu 権限が変更されました"; -"event_formatter_widget_added" = "%@ ウィジェットが %@ さんにより追加されました"; -"event_formatter_widget_removed" = "%@ ウィジェットが %@ さんにより削除されました"; -"event_formatter_jitsi_widget_added" = "音声会議が %@ さんにより追加されました"; -"event_formatter_jitsi_widget_removed" = "音声会議が %@ さんにより削除されました"; +"event_formatter_member_updates" = "%tu権限が変更されました"; +"event_formatter_widget_added" = "%@ウィジェットが %@ さんにより追加されました"; +"event_formatter_widget_removed" = "%@ウィジェットが %@ さんにより削除されました"; +"event_formatter_jitsi_widget_added" = "音声会議が%@ さんにより追加されました"; +"event_formatter_jitsi_widget_removed" = "音声会議が%@ さんにより削除されました"; // Others "or" = "または"; "you" = "あなた"; "today" = "今日"; "yesterday" = "昨日"; "network_offline_prompt" = "インターネットへの接続が切れているようです。"; -"public_room_section_title" = "公開部屋 (at %@):"; -"bug_report_prompt" = "前回アプリが異常終了しました。不具合報告を送信しますか?"; -"rage_shake_prompt" = "あなたは不満があって端末を揺らしているようです。不具合報告をしますか?"; -"do_not_ask_again" = "再度質問しない"; -"camera_access_not_granted" = "%@ はカメラを使用する権限を持っていません。個人情報保護設定の変更をお願いします"; +"public_room_section_title" = "公開ルーム(%@ にて):"; +"bug_report_prompt" = "前回アプリが異常終了しました。バグレポートを送信しますか?"; +"rage_shake_prompt" = "あなたは不満があって端末を揺らしているようです。バグレポートをしますか?"; +"do_not_ask_again" = "再び表示しない"; +"camera_access_not_granted" = "%@はカメラを使用する権限を持っていません。個人情報保護設定の変更をお願いします"; "large_badge_value_k_format" = "%.1fK"; // room display name "room_displayname_invite_from" = "%@ から招待されました"; @@ -422,67 +422,67 @@ // Call "call_incoming_voice_prompt" = "%@ さんから通話の着信中"; "call_incoming_video_prompt" = "%@ さんから映像つき通話の着信中"; -"call_incoming_voice" = "通話着信中…"; +"call_incoming_voice" = "着信中…"; "call_incoming_video" = "ビデオ通話の着信中…"; -"call_already_displayed" = "すでに通話中です。"; +"call_already_displayed" = "既に通話中です。"; "call_jitsi_error" = "会議通話への参加に失敗しました。"; // No VoIP support "no_voip_title" = "通話着信中"; -"no_voip" = "%@ さんから通話の着信がありましたが、 %@ は通話をまだサポートしていません。\nこの通知を無視して、別の端末から着信に応答することも、拒否することもできます。"; +"no_voip" = "%@さんから通話の着信がありましたが、%@は通話をまだサポートしていません。\nこの通知を無視して、別の端末から着信に応答することも、拒否することもできます。"; // Crash report "google_analytics_use_prompt" = "匿名の誤動作報告と使用状況データを自動的に報告して%@の改善に役立てますか?"; // Crypto "e2e_enabling_on_app_update" = "Elementはエンドツーエンド暗号化をサポートするようになりましたが、有効にするには再びログインする必要があります。\n\nアプリの設定から再ログインできます。今すぐ、または後からでも構いません。"; -"e2e_need_log_in_again" = "このセッションのエンドツーエンド暗号化キーを生成し、公開キーをホームサーバーに送信するには、再度ログインする必要があります。\nこれは一度だけです。 ご不便おかけしてすみません。"; +"e2e_need_log_in_again" = "再度ログインして、このセッションのエンドツーエンド暗号鍵を生成し、公開鍵をホームサーバーに送信する必要があります。\nご迷惑をおかけしますが、ご了承ください。"; // Bug report -"bug_report_title" = "不具合報告"; +"bug_report_title" = "バグレポート"; "bug_report_description" = "誤動作の内容と状況の説明をお願い致します。あなたは何をしましたか?何が起こると思いますか?実際何が起こったのですか?"; "bug_crash_report_title" = "異常終了報告"; "bug_crash_report_description" = "異常停止する前にあなたがしていたことを記してください:"; -"bug_report_logs_description" = "開発者が問題を診断するために、このElementの動作記録が不具合報告と一緒に送信されます。上記文章のみを送信したい場合は以下のチェックを解除してください:"; -"bug_report_send_logs" = "動作記録を送信"; +"bug_report_logs_description" = "開発者が問題を診断するために、このElementのログがバグレポートと一緒に送信されます。上記文章のみを送信したい場合は以下のチェックを解除してください:"; +"bug_report_send_logs" = "ログを送信"; "bug_report_send_screenshot" = "画面のスクリーンショット画像を送信"; -"bug_report_progress_zipping" = "動作記録を収集する"; +"bug_report_progress_zipping" = "ログを収集"; "bug_report_progress_uploading" = "報告を送信しています"; "bug_report_send" = "送信"; // Widget -"widget_no_power_to_manage" = "あなたがこの部屋でウィジェットを管理するための権限が必要です"; +"widget_no_power_to_manage" = "あなたがこのルームでウィジェットを管理するための権限が必要です"; "widget_creation_failure" = "ウィジェットの作成に失敗しました"; // Widget Integration Manager -"widget_integration_need_to_be_able_to_invite" = "それを行うにはユーザを招待する権限が必要です。"; +"widget_integration_need_to_be_able_to_invite" = "それを行うにはユーザーを招待する権限が必要です。"; "widget_integration_unable_to_create" = "ウィジェットを作成できません。"; "widget_integration_failed_to_send_request" = "リクエストの送信に失敗しました。"; -"widget_integration_room_not_recognised" = "この部屋では認められません。"; +"widget_integration_room_not_recognised" = "このルームでは認められません。"; "widget_integration_positive_power_level" = "権限の数値は正の整数で入力してください。"; -"widget_integration_must_be_in_room" = "あなたはこの部屋に所属していません。"; -"widget_integration_no_permission_in_room" = "あなたはこの部屋で権限がありません。"; -"widget_integration_missing_room_id" = "部屋固有IDの要求に失敗しました。"; -"widget_integration_missing_user_id" = "ユーザ固有IDの要求に失敗しました。"; -"widget_integration_room_not_visible" = "部屋 %@ は見えません。"; +"widget_integration_must_be_in_room" = "あなたはこのルームに所属していません。"; +"widget_integration_no_permission_in_room" = "あなたはこのルームで権限がありません。"; +"widget_integration_missing_room_id" = "ルーム固有IDの要求に失敗しました。"; +"widget_integration_missing_user_id" = "ユーザー固有IDの要求に失敗しました。"; +"widget_integration_room_not_visible" = "ルーム %@ は見えません。"; // Share extension -"share_extension_auth_prompt" = "コンテンツを共有するためにメインのアプリにログインする"; -"share_extension_failed_to_encrypt" = "送信に失敗しました。この部屋の暗号設定をメインの端末で確認して下さい"; +"share_extension_auth_prompt" = "メインのアプリにログインしてコンテンツを共有"; +"share_extension_failed_to_encrypt" = "送信に失敗しました。このルームの暗号設定をメインの端末で確認して下さい"; "room_details_advanced_e2e_encryption_prompt_message" = "End-to-end暗号化は実験的なものであり、信頼性が低い場合があります。\n\n発言を保護するためにはまだそれを信用すべきではありません。\n\n端末は、まだ参加する前の発言履歴を復号化することはできません。\n\n部屋の暗号化が今から有効になったら、もう無効にすることはできません。\n\n暗号化された発言は、まだ暗号化を実装していないアプリでは表示されません。"; "settings_enable_callkit" = "呼び出しの統合"; -"settings_pin_rooms_with_unread" = "未読のある部屋をピン止めする"; -"title_groups" = "コミュニティ"; +"settings_pin_rooms_with_unread" = "未読のあるルームを固定"; +"title_groups" = "コミュニティー"; "room_recents_server_notice_section" = "システムアラート"; // Groups tab "group_invite_section" = "招待"; -"group_section" = "コミュニティ"; -"room_message_reply_to_placeholder" = "返信を送る (暗号化されていない)…"; +"group_section" = "コミュニティー"; +"room_message_reply_to_placeholder" = "返信を送る(暗号化されていない)…"; "room_do_not_have_permission_to_post" = "このルームに投稿する権限がありません"; -"encrypted_room_message_reply_to_placeholder" = "暗号化された返信を送る…"; +"encrypted_room_message_reply_to_placeholder" = "暗号化された返信を送信…"; "room_message_reply_to_short_placeholder" = "返信を送る…"; "room_event_action_view_decrypted_source" = "復号化されたソースを見る"; "room_event_action_kick_prompt_reason" = "このユーザーを追放する理由"; "room_action_send_photo_or_video" = "写真か動画を送る"; "room_action_send_sticker" = "スタンプ送信"; -"room_replacement_information" = "このルームは交換されており、もうアクティブではありません。"; -"room_replacement_link" = "会話はここで続けられます。"; -"room_predecessor_information" = "この部屋は別の会話の続きです。"; -"room_predecessor_link" = "より古いメッセージを見るにはここをタップしてください。"; -"room_resource_limit_exceeded_message_contact_2_link" = "サービス管理者に連絡する"; +"room_replacement_information" = "このルームは交換されており、使用されていません。"; +"room_replacement_link" = "こちらから継続中の会話を確認する。"; +"room_predecessor_information" = "このルームは別の会話の続きです。"; +"room_predecessor_link" = "以前のメッセージを見るには、ここをタップしてください。"; +"room_resource_limit_exceeded_message_contact_2_link" = "サービス管理者に連絡"; "room_resource_limit_exceeded_message_contact_3" = " このサービスの使用を継続するには。"; "room_resource_usage_limit_reached_message_1_default" = "このホームサーバーはリソース制限の1つを超えています "; "room_resource_usage_limit_reached_message_1_monthly_active_user" = "このホームサーバーは月間アクティブユーザー数制限を超えています "; @@ -492,46 +492,46 @@ "settings_labs_room_members_lazy_loading" = "遅延ロードルームのメンバー"; "settings_labs_room_members_lazy_loading_error_message" = "あなたのホームサーバーはまだルームメンバーの遅延ロードをサポートしていません。 後で試してください。"; "settings_deactivate_my_account" = "アカウントを無効にします"; -"room_details_flair_section" = "コミュニティの特色を表示"; -"room_details_new_flair_placeholder" = "新しいコミュニティIDを追加 (例 +foo%@)"; +"room_details_flair_section" = "コミュニティーの特色を表示"; +"room_details_new_flair_placeholder" = "新しいコミュニティーIDを追加(例 +foo%@)"; "room_details_flair_invalid_id_prompt_title" = "無効な形式"; -"room_details_flair_invalid_id_prompt_msg" = "%@はコミュニティの有効な識別子ではありません"; -"room_details_fail_to_update_room_communities" = "関連コミュニティを更新できない"; +"room_details_flair_invalid_id_prompt_msg" = "%@はコミュニティーの有効な識別子ではありません"; +"room_details_fail_to_update_room_communities" = "関連するコミュニティーの更新に失敗"; // Group Details -"group_details_title" = "コミュニティの詳細"; +"group_details_title" = "コミュニティーの詳細"; "group_details_home" = "ホーム"; "group_details_people" = "人々"; -"group_details_rooms" = "部屋"; +"group_details_rooms" = "ルーム"; // Group Home -"group_home_one_member_format" = "1 メンバー"; -"group_home_multi_members_format" = "%tu メンバー"; -"group_home_one_room_format" = "1 部屋"; -"group_home_multi_rooms_format" = "%tu 部屋"; -"group_invitation_format" = "%@がこのコミュニティにあなたを招待しました"; +"group_home_one_member_format" = "1メンバー"; +"group_home_multi_members_format" = "%tuメンバー"; +"group_home_one_room_format" = "1ルーム"; +"group_home_multi_rooms_format" = "%tuルーム"; +"group_invitation_format" = "%@がこのコミュニティーにあなたを招待しました"; // Group participants "group_participants_add_participant" = "参加者を追加"; "group_participants_leave_prompt_title" = "グループを退出"; -"group_participants_leave_prompt_msg" = "本当にグループを退出しますか?"; +"group_participants_leave_prompt_msg" = "グループを退出してよろしいですか?"; "group_participants_remove_prompt_title" = "確認"; -"group_participants_remove_prompt_msg" = "本当にこのグループから%@を削除しますか?"; +"group_participants_remove_prompt_msg" = "このグループから%@を削除してよろしいですか?"; "group_participants_invite_prompt_title" = "確認"; -"group_participants_invite_prompt_msg" = "本当にこのグループに%@を招待しますか?"; -"group_participants_filter_members" = "コミュニティメンバーをフィルタリング"; +"group_participants_invite_prompt_msg" = "このグループに%@を招待してよろしいですか?"; +"group_participants_filter_members" = "コミュニティーのメンバーを絞り込む"; "group_participants_invite_another_user" = "ユーザーIDまたは名前による検索/招待"; "group_participants_invite_malformed_id_title" = "招待エラー"; -"group_participants_invite_malformed_id" = "不正なID。 '@localpart:domain' のようなMatrix IDでなければなりません"; -"group_participants_invited_section" = "招待した"; +"group_participants_invite_malformed_id" = "不正なID。'@localpart:domain'のようなMatrix IDでなければなりません"; +"group_participants_invited_section" = "招待中"; // Group rooms -"group_rooms_filter_rooms" = "コミュニティルームをフィルタリング"; -"event_formatter_rerequest_keys_part1_link" = "暗号鍵の再要求"; -"event_formatter_rerequest_keys_part2" = " あなたの他のセッションから。"; +"group_rooms_filter_rooms" = "コミュニティールームをフィルタリング"; +"event_formatter_rerequest_keys_part1_link" = "暗号鍵を再要求"; +"event_formatter_rerequest_keys_part2" = " あなたの他のセッションに。"; "homeserver_connection_lost" = "ホームサーバーに接続できませんでした。"; "widget_sticker_picker_no_stickerpacks_alert" = "現在、ステッカーパックを有効にしていません。"; "widget_sticker_picker_no_stickerpacks_alert_add_now" = "今すぐ追加しますか?"; // Room key request dialog -"e2e_room_key_request_title" = "暗号化キー要求"; -"e2e_room_key_request_message_new_device" = "暗号化キーを要求している新しい端末 '%@'を追加しました。"; -"e2e_room_key_request_message" = "検証されていない端末 '%@'が暗号化キーを要求しています。"; +"e2e_room_key_request_title" = "暗号鍵の要求"; +"e2e_room_key_request_message_new_device" = "暗号鍵を要求している新しい端末 '%@' を追加しました。"; +"e2e_room_key_request_message" = "検証されていない端末 '%@' が暗号鍵を要求しています。"; "e2e_room_key_request_start_verification" = "検証を始めます…"; "e2e_room_key_request_share_without_verifying" = "検証せずに共有"; "e2e_room_key_request_ignore_request" = "要求を無視"; @@ -539,24 +539,24 @@ "gdpr_consent_not_given_alert_message" = "%@ホームサーバーを引き続き使用するには、利用規約を確認して同意する必要があります。"; "gdpr_consent_not_given_alert_review_now_action" = "今レビュー"; "deactivate_account_title" = "無効なアカウント"; -"deactivate_account_informations_part1" = "これにより、アカウントは永久に使用できなくなります。 ログインすることはできず、誰も同じユーザーIDを再登録することはできません。 これにより、あなたのアカウントは参加しているすべての部屋から退去し、あなたのIDサーバーからアカウントの詳細が削除されます。 "; +"deactivate_account_informations_part1" = "これにより、アカウントは永久に使用できなくなります。ログインすることはできず、誰も同じユーザーIDを再登録することはできません。これにより、あなたのアカウントは参加している全てのルームから退去し、あなたのIDサーバーからアカウントの詳細が削除されます。 "; "deactivate_account_informations_part2_emphasize" = "この動作は元に戻せません。"; "deactivate_account_informations_part3" = "\n\nアカウントの無効化 "; "deactivate_account_informations_part4_emphasize" = "デフォルトではあなたが送信したメッセージを忘れることはありません。 "; -"deactivate_account_informations_part5" = "あなたのメッセージを忘れたければ、下のボックスにチェックを入れてください\n\nMatrixのメッセージの可視性はEメールと似ています。 forgettingメッセージは、送信したメッセージは新規または未登録のユーザーと共有されませんが、既にこれらのメッセージにアクセスしている登録ユーザーは引き続き自分のコピーにアクセスできます。"; -"deactivate_account_forget_messages_information_part1" = "アカウントが無効になったときに送信したすべてのメッセージを忘れてください ("; +"deactivate_account_informations_part5" = "メッセージの履歴の消去を望む場合は、以下のボックスにチェックを入れてください。\n\nMatrixのメッセージの見え方は、電子メールと同様のものです。メッセージの履歴を消去すると、あなたが送信したメッセージは、新規または未登録のユーザーに共有されることはありませんが、既にメッセージを取得している登録ユーザーは、今後もそのコピーにアクセスできます。"; +"deactivate_account_forget_messages_information_part1" = "アカウントが無効になったときに送信した全てのメッセージを忘れてください ("; "deactivate_account_forget_messages_information_part2_emphasize" = "警告"; "deactivate_account_forget_messages_information_part3" = ":これは将来のユーザーに会話の不完全なビューが表示される)"; "deactivate_account_validate_action" = "無効なアカウント"; "deactivate_account_password_alert_title" = "無効なアカウント"; "deactivate_account_password_alert_message" = "続行するには、パスワードを入力してください"; // Re-request confirmation dialog -"rerequest_keys_alert_title" = "リクエスト送信"; -"rerequest_keys_alert_message" = "この端末にキーを送信できるように、メッセージを復号化できる別の端末でElementを起動してください。"; +"rerequest_keys_alert_title" = "要求が送信されました"; +"rerequest_keys_alert_message" = "鍵をこのセッションに送信できるように、メッセージを復号化できる他の端末で%@を起動してください。"; "room_event_action_ban_prompt_reason" = "このユーザーをブロックする理由"; "room_resource_limit_exceeded_message_contact_1" = " お願い "; "settings_ui_theme_black" = "Black"; -"settings_flair" = "特色を表示する"; +"settings_flair" = "特色を表示"; // String for App Store "store_short_description" = "セキュアな分散型チャット/VoIP"; "close" = "閉じる"; @@ -567,44 +567,44 @@ "room_message_unable_open_link_error_message" = "リンクを開くことができません。"; "user_verification_session_details_verify_action_other_user" = "手動で確認"; "room_info_list_section_other" = "その他"; -"room_info_list_several_members" = "%@ 人のメンバー"; +"room_info_list_several_members" = "%@人のメンバー"; // MARK: - Room Info -"room_info_list_one_member" = "1 人のメンバー"; +"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_footer_type" = "プライベートな部屋は、部屋に招待された人のみ参加できます。"; -"create_room_type_public" = "公開された部屋"; -"create_room_type_private" = "プライベートな部屋"; -"create_room_section_header_type" = "部屋の種類"; +"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_footer_encryption" = "暗号化はあとから無効にすることはできません。"; -"create_room_section_header_encryption" = "部屋の暗号化"; +"create_room_section_header_encryption" = "ルームの暗号化"; "create_room_placeholder_topic" = "トピック"; -"create_room_section_header_topic" = "部屋のトピック (任意)"; +"create_room_section_header_topic" = "ルームのトピック(任意)"; "create_room_placeholder_name" = "名前"; -"create_room_section_header_name" = "部屋の名前"; +"create_room_section_header_name" = "ルーム名"; // MARK: - Create Room -"create_room_title" = "新しい部屋"; +"create_room_title" = "新しいルーム"; "create_room_enable_encryption" = "暗号化を有効にする"; "room_details_room_name_for_dm" = "名前"; -"room_participants_security_information_room_encrypted_for_dm" = "ここで送受信されるメッセージはエンドツーエンド暗号化されます。\n\nメッセージは安全に保護されており、あなたと宛先のみがメッセージの閲覧に必要な鍵を所持します。"; -"room_participants_security_information_room_not_encrypted_for_dm" = "ここで送受信されるメッセージはエンドツーエンド暗号化されません。"; +"room_participants_security_information_room_encrypted_for_dm" = "ここで送受信されるメッセージはエンドツーエンド暗号化されています。\n\nメッセージは安全に保護されており、メッセージのロックを解除するための固有の鍵は、あなたと受信者だけが持っています。"; +"room_participants_security_information_room_not_encrypted_for_dm" = "ここでのメッセージはエンドツーエンド暗号化されていません。"; // Mark: - Room creation introduction cell "room_intro_cell_add_participants_action" = "参加者を追加"; -"room_participants_security_information_room_encrypted" = "このルームで送受信されるメッセージはエンドツーエンド暗号化されます。\n\nメッセージは安全に保護されており、このルームの参加者のみがメッセージの閲覧に必要な鍵を所持します。"; +"room_participants_security_information_room_encrypted" = "このルームのメッセージはエンドツーエンド暗号化されています。\n\nメッセージは安全に保護されており、メッセージのロックを解除するための固有の鍵は、あなたと受信者だけが持っています。"; "room_participants_security_information_room_not_encrypted" = "このルームのメッセージはエンドツーエンド暗号化されていません。"; "room_intro_cell_information_dm_sentence1_part3" = ". "; -"callbar_active_and_single_paused" = "ひとつのアクティブな通話 (%@) · ひとつの一時停止された通話"; +"callbar_active_and_single_paused" = "1つのアクティブな通話(%@)· 1つの一時停止された通話"; // Call Bar -"callbar_only_single_active" = "アクティブな通話(%@)"; -"settings_add_3pid_password_title_msidsn" = "電話番号の追加する"; +"callbar_only_single_active" = "タップして通話(%@)に戻る"; +"settings_add_3pid_password_title_msidsn" = "電話番号を追加"; "device_verification_emoji_scissors" = "ハサミ"; "device_verification_emoji_paperclip" = "ペーパークリップ"; "device_verification_emoji_pencil" = "鉛筆"; @@ -632,21 +632,21 @@ // Widget Picker "widget_picker_title" = "インテグレーションマネージャー"; "widget_integration_manager_disabled" = "設定でインテグレーションマネージャーを有効にする必要があります"; -"widget_menu_remove" = "すべて取り除く"; +"widget_menu_remove" = "全て取り除く"; "widget_menu_revoke_permission" = "アクセスを取り消す"; -"widget_menu_open_outside" = "ブラウザを開く"; +"widget_menu_open_outside" = "ブラウザーで開く"; "widget_menu_refresh" = "リフレッシュ"; -"widget_integrations_server_failed_to_connect" = "インテグレーションサーバーへの説を句が失敗しました"; +"widget_integrations_server_failed_to_connect" = "インテグレーションサーバーへの接続が失敗しました"; // Widget "widget_no_integrations_server_configured" = "インテグレーションサーバーが設定されていません"; -"bug_report_background_mode" = "バックグラウンドで継続する"; +"bug_report_background_mode" = "バックグラウンドで継続"; "e2e_key_backup_wrong_version_button_wasme" = "これはわたしです"; "e2e_key_backup_wrong_version_button_settings" = "設定"; -"e2e_key_backup_wrong_version" = "新しいメッセージキーのバックアップが検出されました。\n\nこれがあなたによるものでばい場合は、設定から新しいパスフレーズを設定してください。"; +"e2e_key_backup_wrong_version" = "メッセージの鍵の新しい安全なバックアップが検出されました。\n\nこれがあなたによるものではない場合は、設定から新しいパスフレーズを設定してください。"; // Key backup wrong version -"e2e_key_backup_wrong_version_title" = "新しいキーのバックアップ"; +"e2e_key_backup_wrong_version_title" = "新しい鍵のバックアップ"; "call_no_stun_server_error_use_fallback_button" = "%@を使ってみてください"; "call_actions_unhold" = "やり直す"; "call_no_stun_server_error_message_2" = "代わりに、%@のパブリックサーバーを使用することもできますが、これは信頼性が低くあなたのIPアドレスがそのサーバーと共有されてしまいます。これは、設定から管理することができます"; @@ -655,19 +655,19 @@ "room_does_not_exist" = "%@は存在しません"; "photo_library_access_not_granted" = "%@はフォトライブラリにアクセスする権限がありません"; "camera_unavailable" = "お使いの端末ではカメラを利用できません"; -"event_formatter_widget_removed_by_you" = "ウィジェットを削除しました: %@"; +"event_formatter_widget_removed_by_you" = "ウィジェットを削除しました:%@"; "event_formatter_jitsi_widget_removed_by_you" = "VoIPカンファレンスを削除しました"; "event_formatter_jitsi_widget_added_by_you" = "VoIPカンファレンスを追加しました"; // Events formatter with you -"event_formatter_widget_added_by_you" = "ウィジェットを追加しました: %@"; +"event_formatter_widget_added_by_you" = "ウィジェットを追加しました:%@"; "event_formatter_call_back" = "かけ直す"; "event_formatter_call_you_declined" = "通話を拒否しました"; "event_formatter_call_you_currently_in" = "通話中です"; "event_formatter_call_has_ended" = "通話は有効です"; "event_formatter_call_video" = "ビデオ通話"; "event_formatter_call_voice" = "音声通話"; -"event_formatter_message_edited_mention" = "(編集済み)"; +"event_formatter_message_edited_mention" = "(編集済)"; "image_picker_action_library" = "ライブラリを選ぶ"; // Image picker @@ -679,55 +679,55 @@ "room_details_advanced_e2e_encryption_enabled_for_dm" = "ここは暗号化が有効です"; "room_details_advanced_room_id_for_dm" = "ID:"; "room_details_no_local_addresses_for_dm" = "ここにはローカルアドレスがありません"; -"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_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_photo_for_dm" = "写真"; "room_details_integrations" = "インテグレーション"; -"room_details_search" = "部屋(ルーム)を探す"; +"room_details_search" = "ルーム(部屋)を探す"; "room_details_title_for_dm" = "詳細"; "identity_server_settings_alert_error_invalid_identity_server" = "%@は有効なIDサーバーではありません。"; "identity_server_settings_alert_error_terms_not_accepted" = "IDサーバーとして設定するには%@の条件を受け入れる必要があります。"; -"identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "とにかく切断する"; +"identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "無視して切断"; "identity_server_settings_alert_disconnect_still_sharing_3pid" = "あなたはまだIDサーバー%@で個人データを共有しています。\n\n切断する前にメールアドレスと電話番号をIDサーバーから削除することをお勧めします。"; "identity_server_settings_alert_disconnect_button" = "接続を解除"; "identity_server_settings_alert_disconnect" = "IDサーバー%@を接続解除しますか?"; "identity_server_settings_alert_disconnect_title" = "IDサーバーを接続解除"; -"identity_server_settings_alert_change" = "IDサーバー%1$@を切断し、代わりに %2$@に接続しますか?"; -"identity_server_settings_alert_change_title" = "IDサーバーを変更する"; +"identity_server_settings_alert_change" = "IDサーバー%1$@を切断し、代わりに%2$@に接続しますか?"; +"identity_server_settings_alert_change_title" = "IDサーバーを変更"; "identity_server_settings_alert_no_terms" = "選択したIDサーバーには利用規約がありません。そのサーバーの所有者を信頼できる場合にのみ続行してください。"; "identity_server_settings_alert_no_terms_title" = "IDサーバーには利用規約がありません"; "identity_server_settings_disconnect" = "接続を解除"; "identity_server_settings_disconnect_info" = "IDサーバーとの接続を解除すると、他のユーザーから発見されなくなり、メールや電話で他のユーザーを招待することができるようになります。"; -"identity_server_settings_change" = "変更する"; -"identity_server_settings_add" = "追加する"; -"identity_server_settings_place_holder" = "IDサーバーを入力する"; -"identity_server_settings_no_is_description" = "現在、ID サーバーを使用していません。知り合いを発見したり、発見できるようにするには、上記に追加してください。"; +"identity_server_settings_change" = "変更"; +"identity_server_settings_add" = "追加"; +"identity_server_settings_place_holder" = "IDサーバーを入力"; +"identity_server_settings_no_is_description" = "現在、IDサーバーを使用していません。あなたの知っている連絡先を発見したり、その連絡先から発見されるようにするには、以上でIDサーバーを追加してください。"; "identity_server_settings_description" = "あなたは%@を使って、あなたの知り合いを発見し、また向こうから発見できるようにしています。"; -"security_settings_complete_security_alert_title" = "セキュリティを完了します"; -"security_settings_crosssigning_complete_security" = "セキュリティーを完了する"; -"security_settings_crosssigning_bootstrap" = "独立したクロス署名"; -"settings_devices_description" = "セッションのパブリックネームはコミュニケーションをとる相手に表示されます"; +"security_settings_complete_security_alert_title" = "セキュリティーを確認"; +"security_settings_crosssigning_complete_security" = "セキュリティーを確認"; +"security_settings_crosssigning_bootstrap" = "設定"; +"settings_devices_description" = "セッションの公開名は、あなたとやり取りする人々に対して表示されます"; "settings_key_backup_delete_confirmation_prompt_title" = "バックアップの削除"; -"settings_key_backup_info_valid" = "このセッションは鍵のバックアップをされています。"; -"settings_key_backup_info_algorithm" = "アルゴリズム: %@"; -"settings_key_backup_info_version" = "キーのバックアップバージョン: %@"; -"settings_key_backup_info_none" = "あなたのキーはこのセッションからバックアップされていません。"; -"settings_key_backup_info_checking" = "確認中…"; +"settings_key_backup_info_valid" = "このセッションは鍵をバックアップしています。"; +"settings_key_backup_info_algorithm" = "アルゴリズム:%@"; +"settings_key_backup_info_version" = "鍵のバックアップのバージョン:%@"; +"settings_key_backup_info_none" = "あなたの鍵は、このセッションからバックアップされていません。"; +"settings_key_backup_info_checking" = "確認しています…"; "settings_add_3pid_password_message" = "続けるにはパスワードを入力してください"; "settings_add_3pid_invalid_password_message" = "無効な認証情報"; -"settings_add_3pid_password_title_email" = "メールアドレスを追加する"; +"settings_add_3pid_password_title_email" = "メールアドレスを追加"; "settings_integrations_allow_description" = "インテグレーションマネージャー(%@)を使用して、ボット、ブリッジ、ウィジェット、ステッカーパックを管理します。\n\n設定データを受け取り、お客様に代わってウィジェットの変更、ルーム招待の送信、権限の設定を行うことができます。"; "settings_integrations_allow_button" = "インテグレーションを管理"; -"settings_calls_stun_server_fallback_button" = "フォールバックコールアシストサーバを許可する"; -"settings_key_backup" = "キーのバックアップ"; +"settings_calls_stun_server_fallback_button" = "フォールバックコールアシストサーバーを許可"; +"settings_key_backup" = "鍵のバックアップ"; "settings_integrations" = "インテグレーション"; "settings_discovery_settings" = "ディスカバリー"; "room_multiple_typing_notification" = "%@とその他のユーザーが入力中です"; -"external_link_confirmation_message" = "リンク%@は別のサイトに移動します: %@\n\n本当に続けますか?"; +"external_link_confirmation_message" = "リンク%@は別のサイトに移動します:%@\n\n本当に続けますか?"; "room_event_action_delete_confirmation_title" = "未送信メッセージを削除"; -"room_unsent_messages_cancel_message" = "このルームにある未送信のメッセージをすべて削除してもよろしいですか?"; +"room_unsent_messages_cancel_message" = "このルームにある未送信のメッセージを全て削除してもよろしいですか?"; "room_unsent_messages_cancel_title" = "未送信メッセージを削除"; "room_message_replying_to" = "%@に返信中"; "room_message_editing" = "編集中"; @@ -738,23 +738,23 @@ "room_member_power_level_short_admin" = "管理者"; "room_member_power_level_moderator_in" = "モデレーターは%@"; "room_member_power_level_admin_in" = "管理者は%@"; -"room_participants_security_loading" = "読み込み中…"; -"room_participants_action_security_status_loading" = "読み込み中…"; +"room_participants_security_loading" = "読み込んでいます…"; +"room_participants_action_security_status_loading" = "読み込んでいます…"; "room_participants_action_security_status_warning" = "警告"; -"room_participants_action_security_status_complete_security" = "セキュリティーを完了する"; +"room_participants_action_security_status_complete_security" = "セキュリティーを確認"; "room_participants_action_security_status_verify" = "検証"; -"room_participants_action_security_status_verified" = "検証済み"; -"room_participants_action_section_security" = "セキュリティ"; +"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" = "メンバーをフィルター"; +"room_participants_filter_room_members_for_dm" = "メンバーを絞り込む"; "room_participants_remove_third_party_invite_prompt_msg" = "招待を取り消してよろしいですか?"; "room_participants_leave_prompt_msg_for_dm" = "退出してよろしいですか?"; -"room_participants_leave_prompt_title_for_dm" = "退出する"; +"room_participants_leave_prompt_title_for_dm" = "退出"; "contacts_address_book_no_identity_server" = "IDサーバーが設定されていません"; -"rooms_empty_view_information" = "ルームはプライベートでもパブリックでも、あらゆるグループチャットに最適です。+をタップすると、既にあるルームを見つけたり、新しいルームを作ることができます。"; +"rooms_empty_view_information" = "ルームは非公開でも公開でも、あらゆるグループチャットに最適です。+をタップすると、既にあるルームを見つけたり、新しいルームを作ったりすることができます。"; "rooms_empty_view_title" = "ルーム"; -"people_empty_view_information" = "誰とでも安全にチャットできます。+をタップすると会話相手を追加できます。"; -"people_empty_view_title" = "参加者"; +"people_empty_view_information" = "誰とでも安全にチャットできます。+をタップすると連絡先を追加できます。"; +"people_empty_view_title" = "連絡先"; "room_creation_error_invite_user_by_email_without_identity_server" = "IDサーバーが設定されていないため、メールで参加者を追加することができません。"; // Errors @@ -768,34 +768,34 @@ // Social login "social_login_list_title_continue" = "続きはこちら"; -"auth_softlogout_clear_data_sign_out_msg" = "このデバイスに現在保存されているすべてのデータを消去してよろしいですか?再びサインインするとアカウントデータやメッセージにアクセスできます。"; -"auth_softlogout_clear_data_sign_out_title" = "本当によろしいですか?"; -"auth_softlogout_clear_data_button" = "すべてのデータをクリアする"; -"auth_softlogout_clear_data_message_2" = "このデバイスの使用を終了する場合や、別のアカウントにサインインしたい場合は、クリアしてください。"; -"auth_softlogout_clear_data_message_1" = "警告: 個人データ(暗号化キーを含む)がこのデバイスにまだ保存されています。"; +"auth_softlogout_clear_data_sign_out_msg" = "この端末に現在保存されている全てのデータを消去してよろしいですか?再びサインインするとアカウントデータやメッセージにアクセスできます。"; +"auth_softlogout_clear_data_sign_out_title" = "続行してよろしいですか?"; +"auth_softlogout_clear_data_button" = "全てのデータをクリア"; +"auth_softlogout_clear_data_message_2" = "この端末の使用を終了する場合や、別のアカウントにサインインしたい場合は、クリアしてください。"; +"auth_softlogout_clear_data_message_1" = "警告:個人データ(暗号鍵を含む)がこの端末にまだ保存されています。"; "callbar_return" = "かけ直す"; -"callbar_active_and_multiple_paused" = "アクティブな通話 (%@) · %@ の一時停止された通話"; +"callbar_active_and_multiple_paused" = "アクティブな通話(%@)· %@の一時停止された通話"; "callbar_only_multiple_paused" = "一時停止した%@の通話"; "callbar_only_single_paused" = "通話の一時停止"; "store_promotional_text" = "オープンネットワーク上でプライバシーを保護したチャットアプリ。あなた自身でコントロールできるように非中央集権化(分散化)されています。データマイニング、バックドア、サードパーティによるアクセスはありません。"; -"auth_softlogout_clear_data" = "個人データをクリアする"; -"auth_softlogout_recover_encryption_keys" = "サインインして、このデバイスにのみ保存されている暗号化キーを復元します。どのデバイスでも、あなたのセキュアなメッセージをすべて読むために必要です。"; +"auth_softlogout_clear_data" = "個人データをクリア"; +"auth_softlogout_recover_encryption_keys" = "暗号化されたメッセージがどの端末でも読めるように、サインインしてこの端末にのみ保存されている暗号鍵を取り戻してください。"; "auth_softlogout_reason" = "ホームサーバー(%1$@)の管理者が%2$@(%3$@)からサインアウトさせました。"; "auth_softlogout_sign_in" = "サインイン"; "auth_softlogout_signed_out" = "サインアウトしました"; "auth_autodiscover_invalid_response" = "無効なホームサーバー発見レスポンス"; "auth_accept_policies" = "このホームサーバーのポリシーを確認して同意してください:"; -"auth_reset_password_error_is_required" = "IDサーバーが設定されていません: パスワードをリセットするためにサーバーオプションに追加してください。"; -"auth_forgot_password_error_no_configured_identity_server" = "IDサーバーが設定されていません: パスワードをリセットするためにIDサーバーを追加してください。"; +"auth_reset_password_error_is_required" = "IDサーバーが設定されていません:パスワードをリセットするためにサーバーオプションに追加してください。"; +"auth_forgot_password_error_no_configured_identity_server" = "IDサーバーが設定されていません:パスワードをリセットするためにIDサーバーを追加してください。"; "auth_phone_is_required" = "IDサーバーが設定されていないので、パスワードをリセットするために電話番号を追加することはできません。"; "auth_email_is_required" = "IDサーバーが設定されていないので、パスワードをリセットするためにメールアドレスを追加することはできません。"; -"auth_add_email_phone_message_2" = "アカウント回復のためにメールを設定します。これを行うとメールアドレスや電話番号を使って、あなたのことを知っている人が発見できるようになります。"; -"auth_add_phone_message_2" = "電話番号を設定し、オプションとして自分を知っている人が発見できるようにします。"; -"auth_add_email_message_2" = "アカウント回復のためにメールを設定し、オプションとして自分のことを知っている人が発見できるようにします。"; +"auth_add_email_phone_message_2" = "アカウント復旧用のメールアドレスを設定します。後からオプションでメールアドレスや電話番号を使用して知人に見つけてもらえるようにできます。"; +"auth_add_phone_message_2" = "電話番号を設定します。後からオプションで知人に見つけてもらえるようにできます。"; +"auth_add_email_message_2" = "アカウント復旧用のメールアドレスを設定します。後からオプションで知人に見つけてもらえるようにできます。"; "less" = "たたむ"; "more" = "もっと"; "switch" = "切り替え"; -"joined" = "参加済み"; +"joined" = "参加済"; "skip" = "スキップ"; // Identity server settings @@ -804,116 +804,116 @@ // AuthenticatedSessionViewControllerFactory "authenticated_session_flow_not_supported" = "このアプリは、ホームサーバーの認証機構をサポートしていません。"; "manage_session_sign_out" = "セッションからサインアウト"; -"manage_session_not_trusted" = "信頼できない"; -"manage_session_trusted" = "信頼済み"; +"manage_session_not_trusted" = "信頼されていません"; +"manage_session_trusted" = "信頼済"; "manage_session_name" = "セッション名"; "manage_session_info" = "セッションの情報"; // Manage session "manage_session_title" = "セッションを管理"; -"security_settings_user_password_description" = "アカウントのパスワードを入力して本人確認を行う"; +"security_settings_user_password_description" = "アカウントのパスワードを入力して本人確認を行ってください"; "security_settings_coming_soon" = "申し訳ありません。このアクションはElement iOSではまだ利用できません。他のMatrixクライアントを使って設定してください。将来的にはElement iOSでも実装される予定です。"; -"security_settings_complete_security_alert_message" = "現在のセッションのセキュリティを完了させる必要があります。"; -"security_settings_blacklist_unverified_devices_description" = "すべてのセッションを検証して、信頼できるものとしてマークしメッセージを送信します。"; +"security_settings_complete_security_alert_message" = "現在のセッションのセキュリティーを完了させる必要があります。"; +"security_settings_blacklist_unverified_devices_description" = "全てのセッションを検証して、信頼できるものとしてマークしメッセージを送信します。"; "security_settings_blacklist_unverified_devices" = "信頼していないセッションにはメッセージを送信しない"; "security_settings_advanced" = "上級者向け"; -"security_settings_export_keys_manually" = "手動でキーをエクスポートする"; +"security_settings_export_keys_manually" = "手動で鍵をエクスポート"; "security_settings_cryptography" = "暗号技術"; "security_settings_crosssigning_reset" = "クロス署名をリセット"; "security_settings_crosssigning_info_ok" = "クロス署名が有効です。"; -"security_settings_crosssigning_info_trusted" = "クロス署名が有効になっています。クロス署名に基づいて他のユーザーや自分の他のセッションを信頼することはできますが、このセッションにはクロス署名用の秘密鍵がないため、このセッションからクロス署名を行うことはできません。このセッションのセキュリティを完了してください。"; -"security_settings_crosssigning_info_exists" = "アカウントにはクロス署名IDがありますが、このセッションはまだ信頼されていません。 このセッションのセキュリティを完了してください。"; +"security_settings_crosssigning_info_trusted" = "クロス署名が有効になっています。クロス署名に基づいて他のユーザーや自分の他のセッションを信頼することはできますが、このセッションにはクロス署名用の秘密鍵がないため、このセッションからクロス署名を行うことはできません。このセッションのセキュリティーを完了してください。"; +"security_settings_crosssigning_info_exists" = "アカウントにはクロス署名IDがありますが、このセッションはまだ信頼されていません。このセッションのセキュリティーを完了してください。"; "security_settings_crosssigning_info_not_bootstrapped" = "クロス署名がまだ行われていません。"; "security_settings_crosssigning" = "クロス署名"; "security_settings_backup" = "メッセージのバックアップ"; -"security_settings_secure_backup_delete" = "削除"; +"security_settings_secure_backup_delete" = "バックアップの削除"; "security_settings_secure_backup_synchronise" = "同期"; -"security_settings_secure_backup_setup" = "セットアップ"; -"security_settings_secure_backup_description" = "暗号化キーをサーバーにバックアップすることにより、暗号化されたメッセージとデータへのアクセスが失われるのを防ぎます。"; +"security_settings_secure_backup_setup" = "設定"; +"security_settings_secure_backup_description" = "セッションにアクセスできなくなる場合に備えて、アカウントデータと暗号鍵をバックアップします。鍵は一意のセキュリティーキーで保護されます。"; "security_settings_secure_backup" = "安全なバックアップ"; -"security_settings_crypto_sessions_description_2" = "ログインが認識されない場合は、パスワードを変更してバックアップをリセットしてください。"; -"security_settings_crypto_sessions_loading" = "セッションを読み込み中…"; +"security_settings_crypto_sessions_description_2" = "見覚えのないログインがある場合は、Matrixアカウントのパスワードを変更し、バックアップをリセットしてください。"; +"security_settings_crypto_sessions_loading" = "セッションを読み込んでいます…"; "security_settings_crypto_sessions" = "セッション"; // Security settings -"security_settings_title" = "セキュリティ"; -"settings_show_NSFW_public_rooms" = "NSFWパブリックルームを表示する"; -"settings_identity_server_no_is_description" = "現在、ID サーバーを使用していません。知り合いを発見したり発見されるようにするには1つ連絡先を追加します。"; +"security_settings_title" = "セキュリティー"; +"settings_show_NSFW_public_rooms" = "NSFWパブリックルームを表示"; +"settings_identity_server_no_is_description" = "現在、IDサーバーを使用していません。あなたの知っている連絡先を発見したり、その連絡先から発見されるようにするには、以上でIDサーバーを追加してください。"; "settings_identity_server_no_is" = "IDサーバーが設定されていません"; "settings_identity_server_description" = "上記で設定したIDサーバーを使って、自分の知り合いを発見したり、発見されたりすることができます。"; -"settings_discovery_three_pid_details_enter_sms_code_action" = "SMSアクティベーションコードを入力する"; +"settings_discovery_three_pid_details_enter_sms_code_action" = "SMSアクティベーションコードを入力"; "settings_discovery_three_pid_details_cancel_email_validation_action" = "メールの検証をキャンセル"; "settings_discovery_three_pid_details_revoke_action" = "取り消し"; "settings_discovery_three_pid_details_share_action" = "共有"; -"settings_discovery_three_pid_details_title_email" = "メールアドレスを管理する"; -"settings_discovery_three_pid_details_title_phone_number" = "電話番号を管理する"; +"settings_discovery_three_pid_details_title_email" = "メールアドレスを管理"; +"settings_discovery_three_pid_details_title_phone_number" = "電話番号を管理"; "settings_discovery_three_pid_details_information_phone_number" = "他のユーザーがあなたを発見したり、ルームに招待する際に使用できる電話番号の設定を管理します。アカウントへ電話番号の追加や削除ができます。"; "settings_discovery_three_pid_details_information_email" = "他のユーザーがあなたを発見したり、ルームに招待する際に使用できるメールアドレスの設定を管理します。アカウントへメールアドレスの追加や削除ができます。"; "settings_discovery_error_message" = "エラーが発生しました。再試行してください。"; "settings_discovery_three_pids_management_information_part3" = "。"; "settings_discovery_three_pids_management_information_part2" = "ユーザー設定"; -"settings_discovery_three_pids_management_information_part1" = "他のユーザーがあなたを発見したり、部屋に招待する際に使用するメールアドレスや電話番号を管理できます。このリストにメールアドレスや電話番号を追加したり、削除したりすることができます。 "; -"settings_discovery_terms_not_signed" = "メールアドレスや電話番号で自分を発見できるようにするには、IDサーバー(%@)の利用規約に同意する必要があります。"; -"settings_discovery_no_identity_server" = "現在、IDサーバーを使用していません。知り合いがあなたを発見できるようにするには、IDサーバーを追加してください。"; +"settings_discovery_three_pids_management_information_part1" = "他のユーザーがあなたを発見したり、ルームに招待する際に使用するメールアドレスや電話番号を管理できます。このリストにメールアドレスや電話番号を追加したり、削除したりすることができます。 "; +"settings_discovery_terms_not_signed" = "メールアドレスか電話番号でアカウントを見つけてもらえるようにするには、IDサーバー(%@)の利用規約への同意が必要です。"; +"settings_discovery_no_identity_server" = "現在、IDサーバーを使用していません。あなたの知っている連絡先から発見されるようにするには、IDサーバーを追加してください。"; "settings_key_backup_delete_confirmation_prompt_msg" = "よろしいですか?鍵が適切にバックアップされていないと、暗号化されたメッセージを失うことがあります。"; -"settings_key_backup_button_connect" = "このセッションをキーバックアップに接続する"; -"settings_key_backup_button_delete" = "バックアップの消去"; -"settings_key_backup_button_restore" = "バックアップからの復旧"; -"settings_key_backup_button_create" = "キーバックアップをする"; -"settings_key_backup_info_trust_signature_invalid_device_unverified" = "バックアップには%@からの無効な署名があります"; -"settings_key_backup_info_trust_signature_invalid_device_verified" = "バックアップには%@からの無効な署名があります"; -"settings_key_backup_info_trust_signature_valid_device_unverified" = "バックアップには%@からの署名があります"; +"settings_key_backup_button_connect" = "このセッションを鍵のバックアップに接続"; +"settings_key_backup_button_delete" = "バックアップの削除"; +"settings_key_backup_button_restore" = "バックアップによる復元"; +"settings_key_backup_button_create" = "鍵のバックアップを使用開始"; +"settings_key_backup_info_trust_signature_invalid_device_unverified" = "バックアップには%@による無効な署名があります"; +"settings_key_backup_info_trust_signature_invalid_device_verified" = "バックアップには%@による無効な署名があります"; +"settings_key_backup_info_trust_signature_valid_device_unverified" = "バックアップには%@による署名があります"; "settings_key_backup_info_trust_signature_valid_device_verified" = "バックアップには%@による有効な署名があります"; "settings_key_backup_info_trust_signature_valid" = "バックアップにはこのセッションの有効な署名があります"; -"settings_key_backup_info_trust_signature_unknown" = "バックアップにはID: %@によるセッションの署名があります"; -"settings_key_backup_info_progress_done" = "キーのバックアップが完了しました"; -"settings_key_backup_info_progress" = "%@のキーをバックアップしています…"; -"settings_key_backup_info_not_valid" = "このセッションではキーをバックアップしていませんが、復元して今後追加できる既存のバックアップがあります。"; -"settings_key_backup_info_signout_warning" = "このデバイスにのみ存在するキーの消失を防ぐために、サインアウトする前にこのセッションをキーバックアップに接続してください。"; -"settings_key_backup_info" = "暗号化されたメッセージはエンドツーエンドで暗号化されています。送信者と受信者だけがこのメッセージを読むための鍵を持っています。"; -"settings_labs_message_reaction" = "絵文字でメッセージに反応する"; +"settings_key_backup_info_trust_signature_unknown" = "バックアップにはID:%@によるセッションの署名があります"; +"settings_key_backup_info_progress_done" = "全ての鍵がバックアップされています"; +"settings_key_backup_info_progress" = "%@の鍵をバックアップしています…"; +"settings_key_backup_info_not_valid" = "このセッションでは鍵をバックアップしていませんが、復元に使用したり、今後鍵を追加したりできるバックアップを持っています。"; +"settings_key_backup_info_signout_warning" = "鍵を失くさないよう、サインアウトする前にバックアップしてください。"; +"settings_key_backup_info" = "暗号化されたメッセージは、エンドツーエンドの暗号化によって保護されています。これらの暗号化されたメッセージを読むための鍵を持っているのは、あなたと受信者だけです。"; +"settings_labs_message_reaction" = "絵文字でメッセージに反応"; "settings_calls_stun_server_fallback_description" = "ホームサーバーがフォールバックコールアシストサーバーを提供していない場合は%@を許可します(IPアドレスは通話中に共有されます)。"; -"settings_security" = "セキュリティ"; +"settings_security" = "セキュリティー"; "settings_three_pids_management_information_part3" = ""; "settings_three_pids_management_information_part2" = "ディスカバリー"; -"store_full_description" = "Elementはまったく新しいメッセンジャーアプリです。\n\n1. あなた自身がプライバシーをコントロールすることを可能にします。\n2. Matrixネットワークにいる誰とでも通信できることはもちろん、Slackなどのアプリとの連携によって他のネットワークとも通信ができます。\n3. 広告、データ収集、バックドア、ユーザーの囲い込みから逃れることができます。\n4. エンドツーエンド暗号化とクロス署名によってあなたを保護します。\n\nElementは分散型(非中央集権型)でオープンソースであるため、他のメッセンジャーアプリと完全に異なっています。\n\nElementはあなた自身でサーバーをホストすることも、サーバーを選ぶこともできます。これによってあなたのデータと会話に関するプライバシーや所有権はあなた自身で管理できるようになります。さらに、あなたは他のElementユーザーと話せるだけでなくオープンネットワークへのアクセスも可能です。\n\nElementは、オープンな分散型通信の標準規格であるMatrixで動作するため、これらすべてを実現することができています。\n\nどのサーバーがホストするか決めることができます。さまざまな方法で選択できます。\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は開かれたネットワークにアクセスするので、Elementのユーザー以外とも話すことができます。しかもきわめて安全です。\n\nElementはMatrixーーオープンな分散型通信の標準規格ーーで動作するため、これら全てを実現することができています。\n\nElementでは、どのサーバーを使用するかを、ご自身でElementのアプリから決めることができます。\n\n1. 開発者がホストする matrix.org のパブリックサーバーで無料アカウントを取得する。\n2. あなた自身がサーバーを運営し、アカウントを管理する。\n3. Element Matrix Servicesのホスティングプラットフォームに加入し、カスタムサーバー上でアカウントを作る。\n\nなぜElementを選ぶべきなのか?\n\n自分のデータを、自分で所有: データやメッセージを保管する場所を自分で決めることができます。データを所有しコントロールするのは、あなた自身です。データを解析したり第三者にデータを渡したりする巨大IT企業ではありません。\n\nオープンなメッセージングとコラボレーション: Matrixネットワーク上の誰とでも、相手がElementや他のMatrixアプリを使っているか、さらにはSlack、IRC、XMPPのような他のメッセージングシステムを使っているかに関わらず、チャットをすることができます。\n\n非常に安全: 本物のエンド・ツー・エンドの暗号化(会話に参加している人だけがメッセージを復号化できる)と、会話参加者の真正性を確認するための相互署名を行います。\n\n包括的なコミュニケーション: メッセージング、音声およびビデオ通話、ファイル共有、画面共有、その他多くのインテグレーション、ボット、ウィジェットを提供します。ルームやコミュニティーを立ち上げて連絡を取り合い、物事をスムーズに成し遂げることができます。\n\nいつでも、どこにいても: 全ての端末とウェブ(https://app.element.io)でメッセージの履歴が同期されるため、どこにいても連絡を取ることができます。"; "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" = "信頼できない"; +"user_verification_session_details_untrusted_title" = "信頼されていません"; // Session details -"user_verification_session_details_trusted_title" = "信頼済み"; -"user_verification_sessions_list_session_untrusted" = "信頼できない"; -"user_verification_sessions_list_session_trusted" = "信頼済み"; +"user_verification_session_details_trusted_title" = "信頼済"; +"user_verification_sessions_list_session_untrusted" = "信頼されていません"; +"user_verification_sessions_list_session_trusted" = "信頼済"; "user_verification_sessions_list_table_title" = "セッション一覧"; -"user_verification_sessions_list_information" = "この部屋にいるこのユーザーとのメッセージはエンドツーエンドで暗号化されており第三者が読み取ることはできません。"; +"user_verification_sessions_list_information" = "このルームにいるこのユーザーとのメッセージはエンドツーエンドで暗号化されており第三者が読み取ることはできません。"; "user_verification_sessions_list_user_trust_level_unknown_title" = "未知"; "user_verification_sessions_list_user_trust_level_warning_title" = "警告"; // Sessions list -"user_verification_sessions_list_user_trust_level_trusted_title" = "信頼済み"; +"user_verification_sessions_list_user_trust_level_trusted_title" = "信頼済"; "user_verification_start_additional_information" = "安心してご利用いただくために、直接お会いするか、別の方法でご連絡ください。"; "user_verification_start_waiting_partner" = "%@を待っています…"; -"user_verification_start_information_part2" = " 両方のデバイスでワンタイムコードを確認します。"; -"user_verification_start_information_part1" = "セキュリティを高めるために "; +"user_verification_start_information_part2" = " 両方の端末でワンタイムコードを確認します。"; +"user_verification_start_information_part1" = "セキュリティーを高めるために "; // MARK: - User verification // Start -"user_verification_start_verify_action" = "検証を開始する"; -"key_verification_scan_confirmation_scanned_device_information" = "もう一方のデバイスにも同じシールドが表示されていますか?"; +"user_verification_start_verify_action" = "検証を開始"; +"key_verification_scan_confirmation_scanned_device_information" = "もう一方の端末にも同じシールドが表示されていますか?"; "key_verification_scan_confirmation_scanned_user_information" = "%@は同じシールドを表示していますか?"; // Scanned "key_verification_scan_confirmation_scanned_title" = "まもなくです!"; -"key_verification_scan_confirmation_scanning_device_waiting_other" = "他のデバイスを待っています…"; +"key_verification_scan_confirmation_scanning_device_waiting_other" = "他の端末を待っています…"; // MARK: Scan confirmation @@ -925,20 +925,20 @@ "key_verification_verify_qr_code_other_scan_my_code_title" = "相手がQRコードを読み取ってくれましたか?"; "key_verification_verify_qr_code_start_emoji_action" = "絵文字による検証"; "key_verification_verify_qr_code_cannot_scan_action" = "スキャンできませんか?"; -"key_verification_verify_qr_code_scan_code_action" = "コードを読み取る"; -"key_verification_verify_qr_code_emoji_information" = "ユニークな絵文字を比較して検証します。"; +"key_verification_verify_qr_code_scan_code_action" = "コードをスキャン"; +"key_verification_verify_qr_code_emoji_information" = "絵文字の並びを比較して検証。"; "key_verification_verify_qr_code_information_other_device" = "以下のコードをスキャンして確認してください:"; "key_verification_verify_qr_code_information" = "コードをスキャンして、お互いをしっかりと確認します。"; // MARK: QR code -"key_verification_verify_qr_code_title" = "スキャンして確認する"; +"key_verification_verify_qr_code_title" = "スキャンして検証"; // Incoming key verification request "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" = "あなたは承認しました"; @@ -947,11 +947,11 @@ "key_verification_tile_request_status_expired" = "期限切れ"; "key_verification_tile_request_status_waiting" = "お待ちください…"; "key_verification_tile_request_status_data_loading" = "日時を読み込み…"; -"key_verification_tile_request_outgoing_title" = "検証の送信"; +"key_verification_tile_request_outgoing_title" = "認証を送信済"; // Tiles -"key_verification_tile_request_incoming_title" = "検証リクエスト"; +"key_verification_tile_request_incoming_title" = "認証の要求"; "key_verification_bootstrap_not_setup_message" = "まずはクロス署名を行う必要があります。"; // MARK: - Key Verification @@ -1002,7 +1002,7 @@ "external_link_confirmation_title" = "このリンクを再確認してください"; "media_type_accessibility_sticker" = "スティッカー"; "media_type_accessibility_file" = "ファイル"; -"media_type_accessibility_location" = "場所"; +"media_type_accessibility_location" = "位置情報"; "media_type_accessibility_video" = "動画"; "media_type_accessibility_audio" = "音声"; "media_type_accessibility_image" = "画像"; @@ -1021,38 +1021,38 @@ "room_action_camera" = "写真やビデオの撮影"; "room_event_action_reaction_history" = "反応の履歴"; "room_event_action_reaction_show_less" = "表示しない"; -"room_event_action_reaction_show_all" = "すべてを見る"; +"room_event_action_reaction_show_all" = "全てを見る"; "room_event_action_edit" = "編集"; "room_event_action_reply" = "返信"; "device_verification_security_advice_emoji" = "絵文字の順番はもう一方のログインと一致しますか?"; -"key_verification_verify_sas_validate_action" = "一致します"; +"key_verification_verify_sas_validate_action" = "一致しています"; "key_verification_verify_sas_cancel_action" = "一致しません"; // MARK: Verify "key_verification_verify_sas_title_emoji" = "絵文字の比較"; "device_verification_self_verify_alert_validate_action" = "検証"; -"device_verification_self_verify_alert_message" = "ログインを検証してください: %@"; +"device_verification_self_verify_alert_message" = "ログインを検証してください:%@"; // MARK: Self verification start // New login "device_verification_self_verify_alert_title" = "ログインしましたか?"; -"room_recents_suggested_rooms_section" = "おすすめの部屋"; -"settings_show_url_previews_description" = "プレビューは暗号化されていない部屋でのみ表示されます。"; +"room_recents_suggested_rooms_section" = "おすすめのルーム"; +"settings_show_url_previews_description" = "プレビューは暗号化されていないルームでのみ表示されます。"; "settings_show_url_previews" = "ウェブサイトプレビューを表示"; -"biometrics_setup_enable_button_title_x" = "%@ を有効にする"; -"biometrics_setup_title_x" = "%@ を有効にする"; -"biometrics_settings_enable_x" = "%@ を有効にする"; +"biometrics_setup_enable_button_title_x" = "%@を有効にする"; +"biometrics_setup_title_x" = "%@を有効にする"; +"biometrics_settings_enable_x" = "%@を有効にする"; "biometrics_mode_face_id" = "Face ID"; // MARK: - Biometrics Protection "biometrics_mode_touch_id" = "Touch ID"; -"pin_protection_settings_enable_pin" = "PIN を有効にする"; -"pin_protection_settings_section_header_with_biometrics" = "PIN と %@"; +"pin_protection_settings_enable_pin" = "PINを有効にする"; +"pin_protection_settings_section_header_with_biometrics" = "PINと%@"; "pin_protection_settings_section_header" = "PIN"; -"settings_mentions_and_keywords_encryption_notice" = "モバイルでは、暗号化された部屋でのメンションとキーワードの通知は受信できません。"; +"settings_mentions_and_keywords_encryption_notice" = "携帯端末では、暗号化されたルームでのメンションとキーワードの通知は受信できません。"; "settings_new_keyword" = "キーワードを追加"; "settings_your_keywords" = "以下でキーワードを指定できます"; "settings_mentions_and_keywords" = "メンションとキーワード"; @@ -1064,7 +1064,7 @@ "settings_group_messages" = "グループメッセージ"; "settings_encrypted_direct_messages" = "暗号化されたダイレクトメッセージ"; "settings_direct_messages" = "ダイレクトメッセージ"; -"settings_notify_me_for" = "以下がメッセージ含まれる場合通知します"; +"settings_notify_me_for" = "以下がメッセージに含まれる場合に通知"; "settings_phone_contacts" = "端末の連絡先"; "settings_notifications" = "通知"; "settings_links" = "リンク"; @@ -1074,3 +1074,78 @@ "spaces_home_space_title" = "ホーム"; "spaces_left_panel_title" = "スペース"; "spaces_suggested_room" = "おすすめ"; + +// MARK: Self verification wait + +"device_verification_self_verify_wait_title" = "セキュリティーを確認"; +"location_sharing_open_google_maps" = "Googleマップで開く"; +"location_sharing_settings_toggle_title" = "位置情報の共有を有効にする"; +"threads_empty_show_all_threads" = "全てのスレッドを表示"; +"room_join_group_call" = "参加"; +"room_accessibility_threads" = "スレッド"; +"threads_action_my_threads" = "自分のスレッド"; +"threads_action_all_threads" = "全てのスレッド"; +"threads_title" = "スレッド"; + +// MARK: Threads +"room_thread_title" = "スレッド"; +"thread_copy_link_to_thread" = "スレッドへのリンクをコピー"; +"room_event_action_reply_in_thread" = "スレッド"; +"settings_room_upgrades" = "ルームのアップグレード"; +"settings_messages_by_a_bot" = "ボットによるメッセージ"; +"settings_call_invitations" = "通話への招待"; +"settings_room_invitations" = "ルームへの招待"; +"key_backup_setup_success_from_recovery_key_made_copy_action" = "コピーしました"; +"key_backup_setup_success_from_recovery_key_make_copy_action" = "コピーする"; +"key_backup_setup_success_from_recovery_key_recovery_key_title" = "セキュリティーキー"; + +// Success from recovery key +"key_backup_setup_success_from_recovery_key_info" = "あなたの鍵はバックアップされています。\n\nこのセキュリティーキーをコピーして、安全なところに保管してください。"; +"key_backup_setup_success_from_passphrase_done_action" = "完了"; +"room_notifs_settings_cancel_action" = "キャンセル"; +"room_notifs_settings_done_action" = "完了"; +"key_backup_recover_done_action" = "完了"; +"done" = "完了"; +"open" = "開く"; +"enable" = "有効にする"; +"key_backup_recover_from_passphrase_passphrase_placeholder" = "パスフレーズを入力"; +"key_backup_recover_from_passphrase_passphrase_title" = "入力"; +"analytics_prompt_terms_link_new_user" = "ここ"; +"secrets_setup_recovery_key_done_action" = "完了"; +"secrets_setup_recovery_passphrase_validate_action" = "完了"; +"sign_out_non_existing_key_backup_sign_out_confirmation_alert_backup_action" = "バックアップ"; +"room_event_action_forward" = "転送"; +"room_event_action_view_in_room" = "ルームに表示"; +"room_notifs_settings_encrypted_room_notice" = "暗号化されたルームでのメンションとキーワードによる通知は、携帯端末では利用できません。"; +"room_notifs_settings_mentions_and_keywords" = "メンションとキーワードのみ"; +"security_settings_secure_backup_info_valid" = "このセッションは鍵をバックアップしています。"; +"key_backup_setup_intro_setup_action_without_existing_backup" = "鍵のバックアップを使用開始"; +"space_participants_action_ban" = "このスペースからブロック"; +"space_participants_action_remove" = "このスペースから削除"; +"accessibility_button_label" = "ボタン"; +"ok" = "OK"; +"spaces_empty_space_detail" = "非公開で招待が必要なルームは表示されていません。"; +"spaces_empty_space_title" = "このスペースには(まだ)ルームがありません"; + +// MARK: - Favourites + +"favourites_empty_view_title" = "お気に入りのルームと連絡先"; +"call_transfer_dialpad" = "ダイヤルパッド"; + +// MARK: - Home + +"home_empty_view_title" = "%@へようこそ、\n%@"; +"threads_empty_tip" = "ヒント:メッセージをタップして「スレッド」を選択し、開始。"; +"threads_empty_info_all" = "スレッドを用いると、会話のテーマを保ったり、会話を追跡したりするのが容易になります。"; +"threads_empty_title" = "スレッドでディスカッションを整理して管理"; +"secure_key_backup_setup_intro_use_security_key_title" = "セキュリティーキーを使用"; + +// MARK: Secure backup setup + +// Intro + +"secure_key_backup_setup_intro_title" = "セキュアバックアップ"; +"spaces_explore_rooms" = "ルームを探索"; +"secure_key_backup_setup_intro_use_security_key_info" = "セキュリティーキーを生成します。パスワードマネージャーもしくは金庫のような安全な場所で保管してください。"; +"secure_key_backup_setup_intro_info" = "サーバー上の暗号鍵をバックアップして、暗号化されたメッセージとデータへのアクセスが失われるのを防ぎましょう。"; +"secure_backup_setup_banner_subtitle" = "暗号化されたメッセージとデータへのアクセスが失われるのを防ぎましょう"; diff --git a/Riot/Assets/nl.lproj/Vector.strings b/Riot/Assets/nl.lproj/Vector.strings index 0152ef38c..ffe224e84 100644 --- a/Riot/Assets/nl.lproj/Vector.strings +++ b/Riot/Assets/nl.lproj/Vector.strings @@ -62,7 +62,7 @@ "auth_optional_phone_placeholder" = "Telefoonnummer (optioneel)"; "auth_phone_placeholder" = "Telefoonnummer"; "auth_repeat_password_placeholder" = "Wachtwoord herhalen"; -"auth_repeat_new_password_placeholder" = "Bevestig uw nieuwe wachtwoord"; +"auth_repeat_new_password_placeholder" = "Bevestig uw nieuwe Matrix account wachtwoord"; "auth_invalid_login_param" = "Onjuiste gebruikersnaam en/of wachtwoord"; "auth_invalid_user_name" = "Inlognamen mogen alleen letters, cijfers, punten, koppeltekens en onderstrepingstekens bevatten"; "auth_invalid_password" = "Het wachtwoord is te kort (min 6)"; @@ -78,21 +78,21 @@ "auth_missing_email_or_phone" = "E-mailadres of telefoonnummer ontbreekt"; "auth_password_dont_match" = "De wachtwoorden komen niet overeen"; "auth_username_in_use" = "Inlognaam al in gebruik"; -"auth_forgot_password" = "Wachtwoord vergeten?"; +"auth_forgot_password" = "Matrix account wachtwoord vergeten?"; "auth_use_server_options" = "Aangepaste serverinstellingen gebruiken (geavanceerd)"; "auth_email_validation_message" = "Bekijk uw e-mail om verder te gaan met de registratie"; "auth_msisdn_validation_title" = "Verificatie in afwachting"; "auth_msisdn_validation_message" = "We hebben een sms met een activatiecode gestuurd. Voer deze code hieronder in."; "auth_msisdn_validation_error" = "Kan het telefoonnummer niet verifiëren."; "auth_recaptcha_message" = "Deze server wil er graag zeker van zijn dat u geen robot bent"; -"auth_reset_password_message" = "Voer het e-mailadres dat met uw account verbonden is in om uw wachtwoord opnieuw in te stellen:"; +"auth_reset_password_message" = "Voer het e-mailadres dat met uw account verbonden is in om uw Matrix account wachtwoord opnieuw in te stellen:"; "auth_reset_password_missing_email" = "Het e-mailadres dat met uw account verbonden is moet ingevoerd worden."; "auth_reset_password_missing_password" = "Er moet een nieuw wachtwoord ingevoerd worden."; "auth_reset_password_email_validation_message" = "Er is een e-mail naar %@ gestuurd. Klik hieronder zodra u de koppeling erin hebt gevolgd."; "auth_reset_password_next_step_button" = "Ik heb mijn e-mailadres geverifieerd"; "auth_reset_password_error_unauthorized" = "Verifiëren van e-mailadres is mislukt: wees er zeker van dat u op de koppeling in de e-mail hebt getikt"; "auth_reset_password_error_not_found" = "Het ziet er niet naar uit dat uw e-mailadres met een Matrix-ID is verbonden op deze server."; -"auth_reset_password_success_message" = "Uw wachtwoord is opnieuw ingesteld.\n\nU bent op alle apparaten afgemeld en u zult geen pushmeldingen meer ontvangen. Om meldingen weer in te schakelen, meldt u zich op elk apparaat opnieuw aan."; +"auth_reset_password_success_message" = "Uw Matrix account wachtwoord is opnieuw ingesteld.\n\nU bent op alle apparaten afgemeld en u zult geen pushmeldingen meer ontvangen. Om meldingen weer in te schakelen, meldt u zich op elk apparaat opnieuw aan."; "auth_add_email_and_phone_warning" = "Registratie met e-mailadres en telefoonnummer tegelijkertijd wordt, totdat de API bestaat, nog niet ondersteund. Alleen het telefoonnummer zal worden gebruikt. U kunt uw e-mailadres later aan uw profiel in de instellingen toevoegen."; // Chat creation "room_creation_title" = "Nieuwe chat"; @@ -215,7 +215,7 @@ "room_event_action_redact" = "Verwijderen"; "room_event_action_more" = "Meer"; "room_event_action_share" = "Delen"; -"room_event_action_permalink" = "Permalink"; +"room_event_action_permalink" = "Kopieer link naar bericht"; "room_event_action_view_source" = "Bron weergeven"; "room_event_action_report" = "Inhoud melden"; "room_event_action_report_prompt_reason" = "Reden voor het melden van deze inhoud"; @@ -310,12 +310,12 @@ "settings_third_party_notices" = "Derdepartijmeldingen"; "settings_send_crash_report" = "Anonieme crash- en gebruiksgegevens versturen"; "settings_clear_cache" = "Cache verwijderen"; -"settings_change_password" = "Wachtwoord veranderen"; +"settings_change_password" = "Matrix account wachtwoord veranderen"; "settings_old_password" = "oud wachtwoord"; "settings_new_password" = "nieuw wachtwoord"; "settings_confirm_password" = "wachtwoord bevestigen"; -"settings_fail_to_update_password" = "Bijwerken van wachtwoord is mislukt"; -"settings_password_updated" = "Uw wachtwoord is bijgewerkt"; +"settings_fail_to_update_password" = "Bijwerken van Matrix account wachtwoord is mislukt"; +"settings_password_updated" = "Uw Matrix account wachtwoord is bijgewerkt"; "settings_crypto_device_name" = "Apparaatnaam: "; "settings_crypto_device_id" = "\nApparaats-ID: "; "settings_crypto_device_key" = "\nApparaatssleutel:\n"; @@ -557,7 +557,7 @@ "deactivate_account_forget_messages_information_part3" = ": dit zal er voor zorgen dat toekomstige gebruikers een onvolledig beeld krijgen van gesprekken)"; "deactivate_account_validate_action" = "Account deactiveren"; "deactivate_account_password_alert_title" = "Account deactiveren"; -"deactivate_account_password_alert_message" = "Voer uw wachtwoord in om verder te gaan"; +"deactivate_account_password_alert_message" = "Voer uw Matrix account wachtwoord in om verder te gaan"; "room_event_action_view_decrypted_source" = "Ontsleutelde bron weergeven"; "room_message_reply_to_placeholder" = "Stuur een antwoord (onversleuteld)…"; "encrypted_room_message_reply_to_placeholder" = "Stuur een versleuteld antwoord…"; @@ -622,7 +622,7 @@ "key_backup_setup_intro_manual_export_info" = "(Geavanceerd)"; "key_backup_setup_intro_manual_export_action" = "Sleutels handmatig exporteren"; "key_backup_setup_passphrase_title" = "Beveilig uw back-up met een veiligheidswachtwoord"; -"key_backup_setup_passphrase_info" = "We bewaren een versleutelde kopie van uw sleutels op onze server. Bescherm uw back-up met een veiligheidswachtwoord om deze veilig te houden.\n\nVoor maximale beveiliging zou dit moeten verschillen van uw accountwachtwoord."; +"key_backup_setup_passphrase_info" = "We bewaren een versleutelde kopie van uw sleutels op onze server. Bescherm uw back-up met een veiligheidswachtwoord om deze veilig te houden.\n\nVoor maximale beveiliging zou dit moeten verschillen van uw Matrix account wachtwoord."; "key_backup_setup_passphrase_passphrase_title" = "Invoeren"; "key_backup_setup_passphrase_passphrase_placeholder" = "Wachtwoord invoeren"; "key_backup_setup_passphrase_passphrase_valid" = "Top!"; @@ -824,7 +824,7 @@ "emoji_picker_flags_category" = "Vlaggen"; // MARK: Reaction history "reaction_history_title" = "Reacties"; -"auth_forgot_password_error_no_configured_identity_server" = "Er is geen identiteitsserver geconfigureerd: voeg er een toe om uw wachtwoord opnieuw in te stellen."; +"auth_forgot_password_error_no_configured_identity_server" = "Er is geen identiteitsserver geconfigureerd: voeg er een toe om uw Matrix account wachtwoord opnieuw in te stellen."; "room_creation_error_invite_user_by_email_without_identity_server" = "Er is geen identiteitsserver geconfigureerd, dus u kunt geen deelnemers toevoegen via e-mail."; "room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Er is geen identiteitsserver geconfigureerd, dus u kunt geen gesprek beginnen met een contact via e-mail."; // Service terms @@ -856,9 +856,9 @@ "auth_add_email_message_2" = "Stel een e-mailadres in voor accountherstel en om later optioneel vindbaar te zijn voor mensen die u kennen."; "auth_add_phone_message_2" = "Stel een telefoon in om later optioneel vindbaar te zijn voor mensen die u kennen."; "auth_add_email_phone_message_2" = "Stel een e-mailadres in voor accountherstel. Gebruik later e-mail of telefoon om optioneel vindbaar te zijn voor mensen die u kennen."; -"auth_email_is_required" = "Er is geen identiteitsserver geconfigureerd, dus u kunt geen e-mailadres toevoegen om uw wachtwoord in de toekomst opnieuw in te stellen."; -"auth_phone_is_required" = "Er is geen identiteitsserver geconfigureerd, dus u kunt geen telefoonnummer toevoegen om uw wachtwoord in de toekomst opnieuw in te stellen."; -"auth_reset_password_error_is_required" = "Geen identiteitsserver ingesteld: voeg er één toe bij server opties om uw wachtwoord te wijzigen."; +"auth_email_is_required" = "Er is geen identiteitsserver geconfigureerd, dus u kunt geen e-mailadres toevoegen om uw Matrix account wachtwoord in de toekomst opnieuw in te stellen."; +"auth_phone_is_required" = "Er is geen identiteitsserver geconfigureerd, dus u kunt geen telefoonnummer toevoegen om uw Matrix account wachtwoord in de toekomst opnieuw in te stellen."; +"auth_reset_password_error_is_required" = "Geen identiteitsserver ingesteld: voeg er één toe bij server opties om uw Matrix account wachtwoord te wijzigen."; // MARK: - Secrets set up @@ -1009,7 +1009,7 @@ // Banner "cross_signing_setup_banner_title" = "Versleuteling instellen"; -"secrets_reset_authentication_message" = "Geef het wachtwoord van uw account om te bevestigen"; +"secrets_reset_authentication_message" = "Geef het Matrix account wachtwoord in om te bevestigen"; "secrets_reset_reset_action" = "Opnieuw instellen"; "secrets_reset_warning_message" = "U zult opnieuw starten zonder geschiedenis, berichten, vertrouwde apparaten en vertrouwde gebruikers."; "secrets_reset_warning_title" = "Als u alles terugzet"; @@ -1021,7 +1021,7 @@ "secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Wachtwoord bevestigen"; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Bevestigen"; "secrets_setup_recovery_passphrase_validate_action" = "Klaar"; -"secrets_setup_recovery_passphrase_additional_information" = "Gebruik niet het wachtwoord van uw account."; +"secrets_setup_recovery_passphrase_additional_information" = "Gebruik niet het Matrix account wachtwoord."; "secrets_setup_recovery_key_storage_alert_title" = "Bewaar hem op een veilige plaats"; "secrets_setup_recovery_key_done_action" = "Klaar"; "secrets_setup_recovery_key_export_action" = "Opslaan"; @@ -1326,7 +1326,7 @@ // Manage session "manage_session_title" = "Beheer sessie"; -"security_settings_user_password_description" = "Bevestig uw identiteit door uw accountwachtwoord in te voeren"; +"security_settings_user_password_description" = "Bevestig uw identiteit door uw Matrix account wachtwoord in te voeren"; "security_settings_coming_soon" = "Sorry. Deze actie is nog niet beschikbaar in %@ iOS. Gebruik een andere Matrix-app om het in te stellen. %@ iOS zal het dan wel gebruiken."; "security_settings_complete_security_alert_message" = "U moet de beveiliging van uw huidige sessie nog afronden."; "security_settings_complete_security_alert_title" = "Beveiliging afronden"; @@ -1349,7 +1349,7 @@ "security_settings_secure_backup_setup" = "Instellen"; "security_settings_secure_backup_description" = "Maak een back-up van uw versleutelingssleutel bij uw account data voor het geval u toegang verliest tot uw sessies. Uw sleutels zullen worden beveiligd met een unieke veiligheidssleutel."; "security_settings_secure_backup" = "VEILIGE BACK-UP"; -"security_settings_crypto_sessions_description_2" = "Als u deze inlog niet herkent, verander uw wachtwoord en reset uw Veilige Back-up."; +"security_settings_crypto_sessions_description_2" = "Als u deze inlog niet herkent, verander uw Matrix account wachtwoord en reset uw Veilige Back-up."; "security_settings_crypto_sessions_loading" = "Sessies laden…"; "security_settings_crypto_sessions" = "MIJN SESSIES"; @@ -1375,7 +1375,7 @@ "settings_discovery_no_identity_server" = "U gebruikt momenteel geen identiteitsserver. Om door de u bekende contacten vindbaar te zijn, voeg er een toe."; "settings_devices_description" = "De publieke naam van een sessie is zichtbaar voor de personen waarmee u communiceert"; "settings_add_3pid_invalid_password_message" = "Ongeldig wachtwoord"; -"settings_add_3pid_password_message" = "Geef uw wachtwoord om verder te gaan"; +"settings_add_3pid_password_message" = "Geef uw Matrix account wachtwoord om verder te gaan"; "settings_add_3pid_password_title_msidsn" = "Telefoonnummer toevoegen"; "settings_add_3pid_password_title_email" = "E-mailadres toevoegen"; "settings_integrations_allow_description" = "Gebruik een integratiebeheerder om bots, bruggen, widgets en stickerpakketten te beheren.\n\nIntegratiebeheerders ontvangen configuratiedata en kunnen widgets aanpassen, kameruitnodigingen versturen en bestuursniveaus instellen namens u."; @@ -1726,3 +1726,35 @@ "poll_edit_form_update_failure_subtitle" = "Probeer het opnieuw"; "poll_edit_form_update_failure_title" = "Kan poll niet bijwerken"; "poll_edit_form_poll_type" = "Poll type"; +"location_sharing_post_failure_subtitle" = "%@ kan uw locatie niet verzenden. Probeer het later opnieuw."; +"location_sharing_post_failure_title" = "We konden uw locatie niet verzenden"; +"home_context_menu_leave" = "Verlaten"; +"home_context_menu_normal_priority" = "Normale prioriteit"; +"home_context_menu_low_priority" = "Lage prioriteit"; +"home_context_menu_unfavourite" = "Verwijder uit favorieten"; +"home_context_menu_favourite" = "Favoriet"; +"home_context_menu_unmute" = "Dempen opheffen"; +"home_context_menu_mute" = "Dempen"; +"home_context_menu_notifications" = "Meldingen"; +"home_context_menu_make_room" = "Verplaatsen naar kamers"; +"home_context_menu_make_dm" = "Verplaatsen naar personen"; +"event_formatter_message_deleted" = "Bericht verwijderd"; +"settings_labs_enable_threads" = "Berichten met discussielijnen"; +"message_from_a_thread" = "Van een discussie"; +"threads_empty_show_all_threads" = "Toon alle discussies"; +"threads_empty_tip" = "Tip: Tik op een bericht en gebruik “Discussie” om er een te starten."; +"threads_empty_info_my" = "Reageer op een lopende discussie of tik op een bericht en gebruik “Discussie” om een nieuwe te starten."; +"threads_empty_info_all" = "Discussies helpen u gesprekken on-topic te houden en gemakkelijk bij te houden."; +"threads_empty_title" = "Houd discussies georganiseerd met discussielijnen"; +"threads_action_my_threads" = "Mijn discussies"; +"threads_action_all_threads" = "Alle discussies"; +"threads_title" = "Discussies"; +"thread_copy_link_to_thread" = "Kopieer link naar discussie"; + +// MARK: Threads +"room_thread_title" = "Discussies"; +"room_accessibility_thread_more" = "Meer"; +"room_accessibility_threads" = "Discussies"; +"room_event_copy_link_info" = "Link gekopieerd naar klembord."; +"room_event_action_reply_in_thread" = "Discussie"; +"room_event_action_view_in_room" = "Bekijk in kamer"; diff --git a/Riot/Assets/pt_BR.lproj/Vector.strings b/Riot/Assets/pt_BR.lproj/Vector.strings index bc625d918..ac178a35a 100644 --- a/Riot/Assets/pt_BR.lproj/Vector.strings +++ b/Riot/Assets/pt_BR.lproj/Vector.strings @@ -50,7 +50,7 @@ "auth_optional_phone_placeholder" = "Número de telefone (opcional)"; "auth_phone_placeholder" = "Número de telefone"; "auth_repeat_password_placeholder" = "Repetir senha"; -"auth_repeat_new_password_placeholder" = "Confirmar sua nova senha"; +"auth_repeat_new_password_placeholder" = "Confirme a nova senha de sua conta Matrix"; "auth_home_server_placeholder" = "URL (e.g. https://matrix.org)"; "auth_identity_server_placeholder" = "URL (e.g. https://vector.im)"; "auth_invalid_login_param" = "Nome de usuária(o) e/ou senha incorretos"; @@ -71,7 +71,7 @@ "auth_untrusted_id_server" = "O servidor de identidade não é confiado"; "auth_password_dont_match" = "Senhas não correspondem"; "auth_username_in_use" = "Nome de usuária(o) em uso"; -"auth_forgot_password" = "Esqueceu senha?"; +"auth_forgot_password" = "Esqueceu senha de conta Matrix?"; "auth_email_not_found" = "Falha para enviar email: Este endereço de email não foi encontrado"; "auth_use_server_options" = "Usar opções de servidor personalizadas (avançado)"; "auth_email_validation_message" = "Por favor cheque seu email para continuar registro"; @@ -79,14 +79,14 @@ "auth_msisdn_validation_message" = "Nós temos enviado um SMS com um código de ativação. Por favor entre este código abaixo."; "auth_msisdn_validation_error" = "Incapaz de verificar número de telefone."; "auth_recaptcha_message" = "Este servidorcasa gostaria de assegurar que você não é um robô"; -"auth_reset_password_message" = "Para resettar sua senha, entre o endereço de email linkado a sua conta:"; +"auth_reset_password_message" = "Para resettar a senha de sua conta Matrix, entre o endereço de email linkado a sua conta:"; "auth_reset_password_missing_email" = "O email linkado à sua conta deve ser entrado."; "auth_reset_password_missing_password" = "Uma nova senha deve ser entrada."; "auth_reset_password_email_validation_message" = "Um email tem sido enviado para %@. Uma vez que você tenha seguido o link que ele contém, clique abaixo."; "auth_reset_password_next_step_button" = "Eu tenho verificado meu endereço de email"; "auth_reset_password_error_unauthorized" = "Falha para verificar endereço de email: assegure que você clicou no link no email"; "auth_reset_password_error_not_found" = "Seu endereço de email não parece estar associado com uma ID Matrix neste servidorcasa."; -"auth_reset_password_success_message" = "Sua senha tem sido resettada.\n\nVocê tem sido feito logout de todas as sessões e não vai mais receber notificações push. Para re-habilitar notificações, refaça login em cada dispositivo."; +"auth_reset_password_success_message" = "A senha de sua conta Matrix tem sido resettada.\n\nVocê tem sido feito logout de todas as sessões e não vai mais receber notificações push. Para re-habilitar notificações, refaça login em cada dispositivo."; "auth_add_email_and_phone_warning" = "Registro com email e número de telefone ao mesmo tempo não é suportado ainda até que a api exista. Somente o número de telefone vai ser levado em conta. Você pode adicionar seu email a seu perfil em ajustes."; "room_creation_appearance" = "Aparência"; "room_creation_appearance_name" = "Nome"; @@ -105,7 +105,7 @@ "room_recents_people_section" = "PESSOAS"; "room_recents_conversations_section" = "SALAS"; "room_recents_no_conversation" = "Nenhuma sala"; -"room_recents_low_priority_section" = "BAIXA PRIORIDADE"; +"room_recents_low_priority_section" = "PRIORIDADE BAIXA"; "room_recents_invites_section" = "CONVITES"; "room_recents_start_chat_with" = "Começar chat"; "room_recents_create_empty_room" = "Criar sala"; @@ -224,7 +224,7 @@ "room_event_action_redact" = "Remover"; "room_event_action_more" = "Mais"; "room_event_action_share" = "Compartilhar"; -"room_event_action_permalink" = "Permalink"; +"room_event_action_permalink" = "Copiar link para mensagem"; "room_event_action_view_source" = "Visualizar Fonte"; "room_event_action_view_decrypted_source" = "Visualizar Fonte Decriptada"; "room_event_action_report" = "Reportar conteúdo"; @@ -347,12 +347,12 @@ "settings_send_crash_report" = "Enviar dados de cash & uso anon"; "settings_enable_rageshake" = "Agitar com raiva para reportar bug"; "settings_clear_cache" = "Limpar cache"; -"settings_change_password" = "Mudar senha"; +"settings_change_password" = "Mudar senha de conta Matrix"; "settings_old_password" = "senha antiga"; "settings_new_password" = "senha nova"; "settings_confirm_password" = "confirmar senha"; -"settings_fail_to_update_password" = "Falha para atualizar senha"; -"settings_password_updated" = "Sua senha tem sido atualizada"; +"settings_fail_to_update_password" = "Falha para atualizar senha de conta Matrix"; +"settings_password_updated" = "A senha de sua conta Matrix tem sido atualizada"; "settings_crypto_device_name" = "Nome de sessão: "; "settings_crypto_device_id" = "\nID de sessão: "; "settings_crypto_device_key" = "\nChave de sessão:\n"; @@ -366,7 +366,7 @@ "room_details_room_name" = "Nome de Sala"; "room_details_topic" = "Tópico"; "room_details_favourite_tag" = "Favoritar"; -"room_details_low_priority_tag" = "Baixa prioridade"; +"room_details_low_priority_tag" = "Prioridade baixa"; "room_details_mute_notifs" = "Mutar notificações"; "room_details_direct_chat" = "Chat Direto"; "room_details_access_section" = "Quem pode acessar esta sala?"; @@ -550,7 +550,7 @@ "deactivate_account_forget_messages_information_part3" = ": isto vai causar usuárias/os futuras/os terem uma visualização incompleta de conversas)"; "deactivate_account_validate_action" = "Desativar conta"; "deactivate_account_password_alert_title" = "Desativar Conta"; -"deactivate_account_password_alert_message" = "Para continuar, por favor entre sua senha"; +"deactivate_account_password_alert_message" = "Para continuar, por favor entre a senha de sua conta Matrix"; // Re-request confirmation dialog "rerequest_keys_alert_title" = "Requisição Enviada"; "rerequest_keys_alert_message" = "Por favor lance %@ num outro dispositivo que possa decriptar a mensagem para que ele possa enviar as chaves para esta sessão."; @@ -600,7 +600,7 @@ "key_backup_setup_intro_manual_export_info" = "(Avançada)"; "key_backup_setup_intro_manual_export_action" = "Exportar chaves manualmente"; "key_backup_setup_passphrase_title" = "Assegure seu backup com uma Frase de Segurança"; -"key_backup_setup_passphrase_info" = "Nós vamos armazenar uma cópia encriptada de suas chaves em nosso servidor. Proteja seu backup com uma frase para mantê-lo seguro.\n\nPara segurança máxima, esta deveria ser diferente da senha de sua conta."; +"key_backup_setup_passphrase_info" = "Nós vamos armazenar uma cópia encriptada de suas chaves em nosso servidor. Proteja seu backup com uma frase para mantê-lo seguro.\n\nPara segurança máxima, esta deveria ser diferente da senha de sua conta Matrix."; "key_backup_setup_passphrase_passphrase_title" = "Entrar"; "key_backup_setup_passphrase_passphrase_placeholder" = "Entrar frase"; "key_backup_setup_passphrase_passphrase_valid" = "Ótimo!"; @@ -667,7 +667,7 @@ "settings_calls_stun_server_fallback_description" = "Permitir servidor fallback de assistência de chamadas %@ quando seu servidorcasa não oferece um (seu endereço de IP seria compartilhado durante uma chamada)."; "security_settings_blacklist_unverified_devices" = "Nunca enviar mensagens para sessões não-confiadas"; "security_settings_blacklist_unverified_devices_description" = "Verificar todas as sessões de um/uma usuário(a) para marcá-las como confiadas e enviar mensagens para ele/ela."; -"security_settings_user_password_description" = "Confirme sua identidade ao entrar a senha de sua conta"; +"security_settings_user_password_description" = "Confirme sua identidade ao entrar a senha de sua conta Matrix"; // Manage session "manage_session_title" = "Gerenciar sessão"; "manage_session_name" = "Nome de sessão"; @@ -740,7 +740,7 @@ "key_verification_scan_confirmation_scanning_device_waiting_other" = "Esperando por outro dispositivo…"; "user_verification_start_waiting_partner" = "Esperando por %@…"; "settings_devices_description" = "O nome público de uma sessão é visível para pessoas com quem você se comunica"; -"security_settings_crypto_sessions_description_2" = "Se você não reconhece um login, mude sua senha e resette Backup Seguro."; +"security_settings_crypto_sessions_description_2" = "Se você não reconhece um login, mude a senha de sua conta Matrix e resette Backup Seguro."; "security_settings_export_keys_manually" = "Exportar chaves manualmente"; "identity_server_settings_change" = "Mudar"; "identity_server_settings_alert_change_title" = "Mudar servidor de identidade"; @@ -771,7 +771,7 @@ "user_verification_session_details_verify_action_current_user_manually" = "Verificar Manualmente por Texto"; "user_verification_session_details_verify_action_other_user" = "Verificar manualmente"; "auth_add_email_phone_message_2" = "Defina um email para recuperação de conta. Use depois email ou telefone para ser opcionalmente descobertável por pessoas que conhecem você."; -"auth_email_is_required" = "Nenhum servidor de identidade está configurado então você não pode adicionar um endereço de email a fim de resettar sua senha no futuro."; +"auth_email_is_required" = "Nenhum servidor de identidade está configurado então você não pode adicionar um endereço de email a fim de resettar a senha de sua conta Matrix no futuro."; "auth_softlogout_clear_data_message_1" = "Aviso: Seus dados pessoais (incluindo chaves de encriptação) ainda estão armazenados neste dispositivo."; "auth_softlogout_clear_data_sign_out" = "Fazer signout"; "room_creation_error_invite_user_by_email_without_identity_server" = "Nenhum servidor de identidade está configurado então você não pode adicionar um/uma participante com um email."; @@ -818,9 +818,9 @@ // Accessibility "accessibility_checkbox_label" = "checkbox"; "auth_add_phone_message_2" = "Defina um número de telefone, e depois para ser opcionalmente descobertável por pessoas que conhecem você."; -"auth_phone_is_required" = "Nenhum servidor de identidade está configurado então você não pode adicionar um número de telefone a fim de resettar sua senha no futuro."; -"auth_forgot_password_error_no_configured_identity_server" = "Nenhum servidor de identidade está configurado: adicione um para resettar sua senha."; -"auth_reset_password_error_is_required" = "Nenhum servidor de identidade está configurado: adicione um em opções de servidor para resettar sua senha."; +"auth_phone_is_required" = "Nenhum servidor de identidade está configurado então você não pode adicionar um número de telefone a fim de resettar a senha de sua conta Matrix no futuro."; +"auth_forgot_password_error_no_configured_identity_server" = "Nenhum servidor de identidade está configurado: adicione um para resettar a senha de sua conta Matrix."; +"auth_reset_password_error_is_required" = "Nenhum servidor de identidade está configurado: adicione um em opções de servidor para resettar a senha de sua conta Matrix."; "auth_softlogout_signed_out" = "Você está com signout feito"; "auth_softlogout_sign_in" = "Fazer Signin"; "auth_softlogout_recover_encryption_keys" = "Faça signin para recuperar chaves de encriptação armazenadas exclusivamente neste dispositivo. Você precisa delas para ler todas suas mensagens seguras em qualquer dispositivo."; @@ -853,7 +853,7 @@ "settings_three_pids_management_information_part2" = "Descoberta"; "settings_labs_message_reaction" = "Reagir a mensagens com emoji"; "settings_add_3pid_password_title_msidsn" = "Adicionar número de telefone"; -"settings_add_3pid_password_message" = "Para continuar, por favor entre sua senha"; +"settings_add_3pid_password_message" = "Para continuar, por favor entre a senha de sua conta Matrix"; "settings_add_3pid_invalid_password_message" = "Credenciais inválidas"; "settings_key_backup_button_connect" = "Conectar esta sessão a Backup de Chave"; "settings_discovery_no_identity_server" = "Você não está atualmente usando um servidor de identidade. Para ser descobertável por contatos existentes, adicione um."; @@ -1121,7 +1121,7 @@ "secrets_setup_recovery_key_storage_alert_message" = "✓ Imprima-a e armazene-a em algum lugar seguro\n✓ Salve-a em uma chave USB ou drive de backup \n✓ Copie-a para seu armazenamento nuvem pessoal"; "secrets_setup_recovery_passphrase_title" = "Definir uma Frase de Segurança"; "secrets_setup_recovery_passphrase_information" = "Entre uma frase de segurança que só você conheça, usada para assegurar segredos em seu servidor."; -"secrets_setup_recovery_passphrase_additional_information" = "Não use a senha de sua conta."; +"secrets_setup_recovery_passphrase_additional_information" = "Não use a senha de sua conta Matrix."; "secrets_setup_recovery_passphrase_confirm_information" = "Entre sua Frase de Segurança de novo para confirmá-la."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Confirmar"; "secrets_setup_recovery_passphrase_confirm_passphrase_placeholder" = "Confirmar frase"; @@ -1212,7 +1212,7 @@ "more" = "Mais"; "switch" = "Trocar"; "joined" = "Juntou-Se"; -"secrets_reset_authentication_message" = "Entre a senha de sua conta para confirmar"; +"secrets_reset_authentication_message" = "Entre a senha de sua conta Matrix para confirmar"; "secrets_reset_reset_action" = "Resettar"; "secrets_reset_warning_message" = "Você vai recomeçar com nada de histórico, mensagens, dispositivos confiados ou usuárias(os) confiadas(os)."; "secrets_reset_warning_title" = "Se você resettar tudo"; @@ -1594,3 +1594,35 @@ "poll_edit_form_update_failure_subtitle" = "Por favor tente de novo"; "poll_edit_form_update_failure_title" = "Falha para atualizar sondagem"; "poll_edit_form_poll_type" = "Tipo de sondagem"; +"location_sharing_post_failure_subtitle" = "%@ não conseguiu enviar sua localização. Por favor tente de novo mais tarde."; +"location_sharing_post_failure_title" = "Nós não conseguimos enviar sua localização"; +"home_context_menu_leave" = "Sair"; +"home_context_menu_normal_priority" = "Prioridade normal"; +"home_context_menu_low_priority" = "Prioridade baixa"; +"home_context_menu_unfavourite" = "Remover de Favoritos"; +"home_context_menu_favourite" = "Favoritar"; +"home_context_menu_unmute" = "Desmutar"; +"home_context_menu_mute" = "Mutar"; +"home_context_menu_notifications" = "Notificações"; +"home_context_menu_make_room" = "Mover para Salas"; +"home_context_menu_make_dm" = "Mover para Pessoas"; +"event_formatter_message_deleted" = "Mensagem deletada"; +"settings_labs_enable_threads" = "Mensageria com threads"; +"message_from_a_thread" = "De uma thread"; +"threads_empty_show_all_threads" = "Mostrar todas as threads"; +"threads_empty_tip" = "Dica: Toque numa mensagem e use “Thread” para começar uma."; +"threads_empty_info_my" = "Responda a uma thread acontecendo ou toque numa mensagem e use “Thread” para começar uma nova."; +"threads_empty_info_all" = "Threads ajudam manter suas conversas em-tópico e fáceis de rastrear."; +"threads_empty_title" = "Mantenha discussões organizadas com threads"; +"threads_action_my_threads" = "Minhas threads"; +"threads_action_all_threads" = "Todas as threads"; +"threads_title" = "Threads"; +"thread_copy_link_to_thread" = "Copiar link para thread"; + +// MARK: Threads +"room_thread_title" = "Thread"; +"room_accessibility_thread_more" = "Mais"; +"room_accessibility_threads" = "Threads"; +"room_event_copy_link_info" = "Link copiado para clipboard."; +"room_event_action_reply_in_thread" = "Thread"; +"room_event_action_view_in_room" = "Visualizar em sala"; diff --git a/Riot/Assets/sk.lproj/Vector.strings b/Riot/Assets/sk.lproj/Vector.strings index 99bee79d5..227ca56c1 100644 --- a/Riot/Assets/sk.lproj/Vector.strings +++ b/Riot/Assets/sk.lproj/Vector.strings @@ -112,15 +112,15 @@ "auth_reset_password_email_validation_message" = "Na adresu %s bola odoslaná správa. Po kliknutí na odkaz, ktorý obsahuje, kliknite nižšie."; "auth_reset_password_missing_password" = "Musíte zadať nové heslo."; "auth_reset_password_missing_email" = "Musíte zadať emailovú adresu prepojenú s vašim účtom."; -"auth_reset_password_message" = "Ak chcete obnoviť vaše heslo, zadajte emailovú adresu prepojenú s vašim účtom:"; +"auth_reset_password_message" = "Ak chcete obnoviť vaše heslo k účtu Matrix, zadajte emailovú adresu prepojenú s vašim účtom:"; "auth_recaptcha_message" = "Tento domovský server by sa rád uistil, že nie ste robot"; "auth_msisdn_validation_error" = "Nie je možné overiť telefónne číslo."; "auth_msisdn_validation_message" = "Odoslali sme vám SMS správu, ktorá obsahuje overovací kód. Prosím, zadajte ho nižšie."; "auth_msisdn_validation_title" = "Čaká sa na overenie"; "auth_use_server_options" = "Použiť vlastné možnosti servera (pre pokročilých)"; "auth_email_not_found" = "Nepodarilo sa odoslať e-mail: Táto e-mailová adresa nebola nájdená"; -"auth_forgot_password_error_no_configured_identity_server" = "Nie je nastavený žiadny server identity: pridajte ho na obnovenie hesla."; -"auth_forgot_password" = "Zabudli ste heslo?"; +"auth_forgot_password_error_no_configured_identity_server" = "Nie je nastavený žiadny server identity: pridajte ho na obnovenie hesla k účtu Matrix."; +"auth_forgot_password" = "Zabudli ste heslo k účtu Matrix?"; "auth_username_in_use" = "Používateľské meno sa už používa"; "auth_password_dont_match" = "Heslá sa nezhodujú"; "auth_phone_in_use" = "Toto telefónne číslo sa už používa"; @@ -138,7 +138,7 @@ "auth_invalid_login_param" = "Nesprávne používateľské meno a/alebo heslo"; "auth_identity_server_placeholder" = "URL (napr. https://vector.im)"; "auth_home_server_placeholder" = "URL (napr. https://matrix.org)"; -"auth_repeat_new_password_placeholder" = "Potvrďte svoje nové heslo"; +"auth_repeat_new_password_placeholder" = "Potvrďte svoje nové heslo k účtu Matrix"; "auth_repeat_password_placeholder" = "Zopakovať heslo"; "auth_phone_placeholder" = "Telefónne číslo"; "auth_optional_phone_placeholder" = "Telefónne číslo (nepovinné)"; @@ -189,7 +189,7 @@ "settings_notifications_disabled_alert_title" = "Oznámenia vypnuté"; "settings_device_notifications" = "Oznámenia zariadenia"; "settings_night_mode" = "Nočný režim"; -"settings_change_password" = "Zmeniť heslo"; +"settings_change_password" = "Zmeniť heslo k účtu Matrix"; "settings_first_name" = "Krstné meno"; "settings_display_name" = "Zobrazované meno"; "settings_profile_picture" = "Profilový obrázok"; @@ -506,7 +506,7 @@ "room_event_action_delete" = "Vymazať"; "room_event_action_resend" = "Znovu odoslať"; "room_event_action_save" = "Uložiť"; -"room_event_action_permalink" = "Trvalý odkaz"; +"room_event_action_permalink" = "Kopírovať odkaz do správy"; "room_event_action_forward" = "Preposlať"; "room_event_action_share" = "Zdieľať"; "room_event_action_more" = "Viac"; @@ -533,10 +533,10 @@ "room_member_power_level_custom_in" = "Vlastné (%@) v %@"; "room_member_power_level_moderator_in" = "Moderátor v %@"; "room_member_power_level_admin_in" = "Správca v %@"; -"room_participants_security_information_room_encrypted_for_dm" = "Správy sú tu šifrované end-to-end.\n\nVaše správy sú zabezpečené zámkami a jedinečné kľúče na ich odomknutie máte len vy a príjemca."; -"room_participants_security_information_room_encrypted" = "Správy v tejto miestnosti sú šifrované end-to-end.\n\nVaše správy sú zabezpečené zámkami a jedinečné kľúče na ich odomknutie máte len vy a príjemca."; -"room_participants_security_information_room_not_encrypted" = "Správy v tejto miestnosti nie sú šifrované end-to-end (od vás až k príjemcovi)."; -"room_participants_security_information_room_not_encrypted_for_dm" = "Správy tu nie sú šifrované end-to-end (od vás až k príjemcovi)."; +"room_participants_security_information_room_encrypted_for_dm" = "Správy sú tu end-to-end šifrované.\n\nVaše správy sú zabezpečené zámkami a jedinečné kľúče na ich odomknutie máte len vy a príjemca."; +"room_participants_security_information_room_encrypted" = "Správy v tejto miestnosti sú end-to-end šifrované.\n\nVaše správy sú zabezpečené zámkami a jedinečné kľúče na ich odomknutie máte len vy a príjemca."; +"room_participants_security_information_room_not_encrypted" = "Správy v tejto miestnosti nie sú end-to-end šifrované (od vás až k príjemcovi)."; +"room_participants_security_information_room_not_encrypted_for_dm" = "Správy tu nie sú end-to-end šifrované (od vás až k príjemcovi)."; "room_participants_security_loading" = "Načítavanie…"; "room_participants_action_security_status_loading" = "Načítavanie…"; "room_participants_action_security_status_warning" = "Upozornenie"; @@ -584,7 +584,7 @@ "directory_cell_title" = "Prezrieť priečinok"; "receipt_status_read" = "Prečítané: "; "room_details_files" = "Nahrané súbory"; -"settings_ui_theme_auto" = "Automaticky"; +"settings_ui_theme_auto" = "Automatický"; // Success from passphrase "key_backup_setup_success_from_passphrase_info" = "Vaše kľúče sa zálohujú.\n\nVáš bezpečnostný kľúč je bezpečnostná sieť - môžete ho použiť na obnovenie prístupu k zašifrovaným správam, ak zabudnete svoju prístupovú frázu.\n\nBezpečnostný kľúč uchovávajte na veľmi bezpečnom mieste, napríklad v správcovi hesiel (alebo v trezore)."; @@ -619,7 +619,7 @@ "event_formatter_call_has_ended" = "Hovor ukončený"; // Image picker -"image_picker_action_camera" = "Urobiť fotografiu"; +"image_picker_action_camera" = "Spraviť fotku"; "group_participants_invite_malformed_id_title" = "Chyba pozvania"; "group_participants_leave_prompt_title" = "Opustiť skupinu"; @@ -729,7 +729,7 @@ // Re-request confirmation dialog "rerequest_keys_alert_title" = "Žiadosť odoslaná"; -"deactivate_account_password_alert_message" = "Aby ste mohli pokračovať, prosím zadajte svoje heslo"; +"deactivate_account_password_alert_message" = "Aby ste mohli pokračovať, prosím zadajte svoje heslo k účtu Matrix"; "deactivate_account_password_alert_title" = "Deaktivovať účet"; "deactivate_account_validate_action" = "Deaktivovať účet"; "deactivate_account_informations_part2_emphasize" = "Táto akcia je nezvratná."; @@ -901,13 +901,13 @@ "room_creation_wait_for_creation" = "Miestnosť sa už vytvára. Počkajte, prosím."; "room_creation_make_public_prompt_msg" = "Ste si istí, že chcete túto konverzáciu zverejniť? Ktokoľvek si môže prečítať vaše správy a pripojiť sa ku konverzácii."; "social_login_button_title_sign_in" = "Prihlásiť sa s %@"; -"auth_reset_password_error_is_required" = "Nie je nastavený žiadny server identity: pridajte ho v možnostiach servera a obnovte heslo."; +"auth_reset_password_error_is_required" = "Nie je nastavený žiadny server identity: pridajte ho v možnostiach servera a obnovte heslo k účtu Matrix."; "security_settings_crosssigning_info_trusted" = "Krížové podpisovanie je povolené. Na základe krížového podpisovania môžete dôverovať iným používateľom a ostatným reláciám, ale nemôžete krížovo podpisovať z tejto relácie, pretože nemá súkromné kľúče na krížové podpisovanie. Dokončite zabezpečenie tejto relácie."; "manage_session_sign_out" = "Odhlásiť sa z tejto relácie"; "security_settings_crosssigning_info_ok" = "Krížové podpisovanie je pripravené na použitie."; "settings_discovery_error_message" = "Vyskytla sa chyba. Prosím, skúste to znova."; "settings_crypto_blacklist_unverified_devices" = "Šifrovať len overeným reláciám"; -"settings_password_updated" = "Vaše heslo bolo aktualizované"; +"settings_password_updated" = "Vaše heslo k účtu Matrix bolo aktualizované"; "settings_notifications_disabled_alert_message" = "Ak chcete povoliť upozornenia, prejdite do nastavení zariadenia."; "settings_enable_push_notif" = "Oznámenia na tomto zariadení"; "auth_autodiscover_invalid_response" = "Neplatná odpoveď pri zisťovaní domovského servera"; @@ -1156,7 +1156,7 @@ "identity_server_settings_alert_disconnect_still_sharing_3pid" = "Svoje osobné údaje stále zdieľate na serveri totožností %@.\n\nOdporúčame vám, aby ste pred odpojením odstránili svoje e-mailové adresy a telefónne čísla zo servera totožností."; "identity_server_settings_disconnect_info" = "Odpojenie od servera totožností bude znamenať, že vás nebudú môcť objaviť iní používatelia a že nebudete môcť pozývať ostatných prostredníctvom e-mailu alebo telefónu."; "identity_server_settings_description" = "V súčasnosti používate %@ na objavovanie existujúcich kontaktov, ktoré poznáte, a na to, aby vás mohli objaviť."; -"security_settings_crypto_sessions_description_2" = "Ak nespoznávate prihlásenie, zmeňte si heslo a vykonajte obnovenie funkcie Zabezpečené zálohovanie."; +"security_settings_crypto_sessions_description_2" = "Ak nespoznávate prihlásenie, zmeňte si heslo k účtu Matrix a obnovte Zabezpečenú zálohu."; "settings_identity_server_no_is_description" = "Momentálne nepoužívate žiadny server totožností. Ak chcete objaviť existujúce kontakty, ktoré poznáte, a byť nimi objaviteľní, pridajte jeden vyššie."; "settings_analytics_and_crash_data" = "Odoslať údaje o páde a analytické údaje"; "settings_labs_create_conference_with_jitsi" = "Vytvárajte konferenčné hovory pomocou aplikácie jitsi"; @@ -1251,7 +1251,7 @@ "settings_discovery_three_pids_management_information_part1" = "Spravujte, ktoré e-mailové adresy alebo telefónne čísla môžu ostatní používatelia použiť na vaše objavenie a pozvanie do miestností. E-mailové adresy alebo telefónne čísla môžete pridávať alebo odstraňovať z tohto zoznamu v "; "settings_discovery_terms_not_signed" = "Musíte súhlasiť s podmienkami služby servera totožnosti (%@), aby vás mohli nájsť podľa e-mailovej adresy alebo telefónneho čísla."; "settings_key_backup_button_connect" = "Pripojiť túto reláciu k zálohovaniu kľúčov"; -"settings_fail_to_update_password" = "Nepodarilo sa aktualizovať heslo"; +"settings_fail_to_update_password" = "Nepodarilo sa aktualizovať heslo k účtu Matrix"; "settings_labs_enable_ringing_for_group_calls" = "Zvonenie pre skupinové hovory"; "widget_integration_positive_power_level" = "Úroveň oprávnenia musí byť kladné celé číslo."; "settings_integrations_allow_description" = "Použite správcu integrácií (%@) na spravovanie botov, premostení, widgetov a balíčkov s nálepkami. \n\nSprávcovia integrácie dostávajú konfiguračné údaje a môžu vo vašom mene upravovať widgety, posielať pozvánky do miestnosti a nastavovať úrovne oprávnení."; @@ -1262,7 +1262,7 @@ "settings_room_invitations" = "Pozvánky do miestnosti"; "settings_global_settings_info" = "Všeobecné nastavenia oznámení sú k dispozícii vo webovom klientovi %@"; "settings_confirm_media_size_description" = "Keď je táto funkcia zapnutá, budete vyzvaní, aby ste potvrdili, v akej veľkosti sa budú obrázky a videá odosielať."; -"settings_three_pids_management_information_part1" = "Tu môžete spravovať e-mailové adresy alebo telefónne čísla, ktoré môžete použiť na prihlásenie alebo obnovenie účtu. Ovládajte, kto vás môže nájsť v "; +"settings_three_pids_management_information_part1" = "Tu môžete spravovať e-mailové adresy alebo telefónne čísla, ktoré môžete použiť na prihlásenie alebo obnovenie účtu. Ovládajte, kto vás môže nájsť v sekcii "; "settings_fail_to_update_profile" = "Nepodarilo sa aktualizovať profil"; "settings_email_address_placeholder" = "Zadajte svoju e-mailovú adresu"; "settings_remove_phone_prompt_msg" = "Určite chcete odstrániť telefónne číslo %@?"; @@ -1283,10 +1283,10 @@ "auth_softlogout_recover_encryption_keys" = "Prihláste sa, aby ste obnovili šifrovacie kľúče uložené výlučne v tomto zariadení. Potrebujete ich na čítanie všetkých svojich zabezpečených správ na akomkoľvek zariadení."; "auth_softlogout_reason" = "Váš správca domovského servera (%1$@) vás odhlásil z vášho účtu %2$@ (%3$@)."; "auth_add_email_and_phone_warning" = "Registrácia pomocou e-mailu a telefónneho čísla naraz zatiaľ nie je podporovaná, kým nebude existovať api. Do úvahy sa bude brať iba telefónne číslo. Svoj e-mail môžete pridať do svojho profilu v nastaveniach."; -"auth_reset_password_success_message" = "Vaše heslo bolo obnovené.\n\nBoli ste odhlásení zo všetkých relácií a už nebudete dostávať push oznámenia. Ak chcete opätovne povoliť oznámenia, znovu sa prihláste na každom zariadení."; +"auth_reset_password_success_message" = "Vaše heslo k účtu Matrix bolo obnovené.\n\nBoli ste odhlásení zo všetkých relácií a už nebudete dostávať push oznámenia. Ak chcete opätovne povoliť oznámenia, znovu sa prihláste na každom zariadení."; "auth_untrusted_id_server" = "Server totožností nie je dôveryhodný"; -"auth_phone_is_required" = "Nie je nastavený žiadny server totožností, takže nemôžete pridať e-telefónne číslo, aby ste mohli v budúcnosti obnoviť svoje heslo."; -"auth_email_is_required" = "Nie je nastavený žiadny server totožností, takže nemôžete pridať e-mailovú adresu, aby ste mohli v budúcnosti obnoviť svoje heslo."; +"auth_phone_is_required" = "Nie je nastavený žiadny server totožností, takže nemôžete pridať e-telefónne číslo, aby ste mohli v budúcnosti obnoviť svoje heslo k účtu Matrix."; +"auth_email_is_required" = "Nie je nastavený žiadny server totožností, takže nemôžete pridať e-mailovú adresu, aby ste mohli v budúcnosti obnoviť svoje heslo k účtu Matrix."; "auth_add_email_phone_message_2" = "Nastavte si e-mail na obnovenie účtu. Neskôr môžete voliteľne použiť e-mail alebo telefón, aby vás mohli nájsť ľudia, ktorí vás poznajú."; "cross_signing_setup_banner_subtitle" = "Jednoduchšie overenie ostatných zariadení"; "room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Šifrovať len overeným reláciám"; @@ -1296,9 +1296,9 @@ "room_intro_cell_information_multiple_dm_sentence2" = "V tejto konverzácii ste len vy, pokiaľ niekto z vás niekoho nepozve, aby sa pripojil."; "room_intro_cell_information_dm_sentence2" = "V tejto konverzácii ste len vy dvaja, nikto iný sa nemôže pripojiť."; "room_intro_cell_information_room_without_topic_sentence2_part2" = " aby ľudia vedeli, o čom je táto miestnosť."; -"room_intro_cell_information_room_without_topic_sentence2_part1" = "Pridať tému"; +"room_intro_cell_information_room_without_topic_sentence2_part1" = "Pridajte tému"; "room_avatar_view_accessibility_hint" = "Zmeniť obrázok miestnosti"; -"invite_friends_share_text" = "Hej, ozvi sa mi na %@: %@"; +"invite_friends_share_text" = "Ahoj, ozvi sa mi na %@: %@"; // MARK: - Invite friends @@ -1338,11 +1338,11 @@ // Banner "cross_signing_setup_banner_title" = "Nastaviť šifrovanie"; -"secrets_reset_authentication_message" = "Zadajte heslo svojho účtu pre potvrdenie"; +"secrets_reset_authentication_message" = "Zadajte heslo svojho účtu Matrix pre potvrdenie"; "secrets_setup_recovery_passphrase_summary_information" = "Zapamätajte si bezpečnostnú frázu. Môžete ju použiť na odomknutie zašifrovaných správ a údajov."; "secrets_setup_recovery_passphrase_summary_title" = "Uložte si bezpečnostnú frázu"; "secrets_setup_recovery_passphrase_confirm_information" = "Opätovne zadajte bezpečnostnú frázu a potvrďte ju."; -"secrets_setup_recovery_passphrase_additional_information" = "Nepoužívajte heslo k svojmu účtu."; +"secrets_setup_recovery_passphrase_additional_information" = "Nepoužívajte heslo k svojmu účtu Matrix."; "secrets_setup_recovery_passphrase_information" = "Zadajte bezpečnostnú frázu, ktorú poznáte len vy a ktorá sa používa na zabezpečenie tajomstiev na vašom serveri."; "secrets_recovery_with_key_recovery_key_title" = "Zadajte"; "secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Ak chcete pokračovať, zadajte bezpečnostný kľúč."; @@ -1449,7 +1449,7 @@ // Success from recovery key "key_backup_setup_success_from_recovery_key_info" = "Vaše kľúče sa zálohujú.\n\nVytvorte si kópiu tohto bezpečnostného kľúča a uschovajte ho na bezpečnom mieste."; "key_backup_setup_passphrase_passphrase_invalid" = "Skúste pridať slovo"; -"key_backup_setup_passphrase_info" = "Šifrovanú kópiu vašich kľúčov uložíme na našom serveri. Chráňte svoju zálohu frázou, aby bola bezpečná.\n\nV záujme maximálneho zabezpečenia by sa mala líšiť od hesla k vášmu účtu."; +"key_backup_setup_passphrase_info" = "Šifrovanú kópiu vašich kľúčov uložíme na našom serveri. Chráňte svoju zálohu frázou, aby bola bezpečná.\n\nV záujme maximálneho zabezpečenia by sa mala líšiť od hesla k vášmu účtu Matrix."; "key_backup_setup_intro_info" = "Správy v šifrovaných miestnostiach sú zabezpečené end-to-end šifrovaním. Kľúče na čítanie týchto správ máte len vy a príjemca (príjemcovia).\n\nKľúče si bezpečne zálohujte, aby ste ich nestratili."; "secure_key_backup_setup_existing_backup_error_delete_it" = "Vymazať"; "secure_key_backup_setup_existing_backup_error_unlock_it" = "Odomknúť"; @@ -1572,7 +1572,7 @@ "room_details_access_section_anyone_apart_from_guest_for_dm" = "Ktokoľvek, kto pozná odkaz, okrem hostí"; "room_details_access_section_anyone" = "Ktokoľvek, kto pozná odkaz na miestnosť, vrátane hostí"; "room_details_access_section_invited_only" = "Iba ľudia, ktorí boli pozvaní"; -"room_details_access_section_for_dm" = "Kto má k tomuto prístup?"; +"room_details_access_section_for_dm" = "Kto má sem prístup?"; "room_details_access_section" = "Kto má prístup do tejto miestnosti?"; "identity_server_settings_alert_error_invalid_identity_server" = "%@ nie je platný server totožností."; "identity_server_settings_alert_disconnect" = "Odpojiť sa od servera totožností %@?"; @@ -1580,13 +1580,13 @@ // AuthenticatedSessionViewControllerFactory "authenticated_session_flow_not_supported" = "Táto aplikácia nepodporuje mechanizmus overovania na vašom domovskom serveri."; -"security_settings_user_password_description" = "Potvrďte svoju totožnosť zadaním hesla k účtu"; +"security_settings_user_password_description" = "Potvrďte svoju totožnosť zadaním hesla k účtu Matrix"; "security_settings_coming_soon" = "Prepáčte. Táto akcia zatiaľ nie je dostupná v systéme %@ iOS. Na jej nastavenie použite iného klienta Matrix. Systém %@ iOS to bude používať."; "security_settings_complete_security_alert_title" = "Dokončiť zabezpečenie"; "security_settings_complete_security_alert_message" = "Najprv by ste mali dokončiť zabezpečenie aktuálnej relácie."; "security_settings_blacklist_unverified_devices_description" = "Overte všetky relácie používateľov, aby ste ich mohli označiť za dôveryhodné a odosielať im správy."; "security_settings_secure_backup_info_valid" = "Táto relácia zálohuje vaše kľúče."; -"settings_show_NSFW_public_rooms" = "Zobraziť verejné miestnosti nevhodné do práce"; +"settings_show_NSFW_public_rooms" = "Zobraziť aj verejné miestnosti nevhodné do práce"; "settings_identity_server_no_is" = "Nebol nastavený server totožností"; "settings_discovery_three_pid_details_enter_sms_code_action" = "Zadajte aktivačný kód SMS"; "settings_discovery_three_pid_details_information_email" = "Spravujte predvoľby pre túto e-mailovú adresu, ktorú môžu ostatní používatelia použiť na vaše objavenie a pozvanie do miestností. Pridávajte alebo odstraňujte e-mailové adresy v časti Účty."; @@ -1610,7 +1610,7 @@ "settings_key_backup_info_signout_warning" = "Zálohujte si šifrovacie kľúče pred odhlásením, aby ste o ne neprišli."; "settings_key_backup_info_none" = "Vaše kľúče sa z tejto relácie nezálohujú."; "settings_key_backup_info" = "Šifrované správy sú zabezpečené end-to-end šifrovaním. Kľúče na čítanie týchto správ máte len vy a príjemca (príjemcovia)."; -"settings_add_3pid_password_message" = "Aby ste mohli pokračovať, prosím zadajte svoje heslo"; +"settings_add_3pid_password_message" = "Aby ste mohli pokračovať, prosím zadajte svoje heslo k účtu Matrix"; "settings_labs_message_reaction" = "Reagujte na správy pomocou emoji"; "settings_labs_e2e_encryption_prompt_message" = "Ak chcete dokončiť nastavenie šifrovania, musíte sa znova prihlásiť."; "settings_contacts_enable_sync_description" = "Na prepojenie s vašimi kontaktmi sa použije váš server totožností a pomôže im vás nájsť."; @@ -1627,7 +1627,7 @@ "rage_shake_prompt" = "Zdá sa, že rozčúlene trasiete telefónom. Chceli by ste odoslať hlásenie o chybe?"; "room_details_addresses_disable_main_address_prompt_msg" = "Nebudete mať zadanú žiadnu hlavnú adresu. Predvolená hlavná adresa pre túto miestnosť sa vyberie náhodne"; "settings_enable_rageshake" = "Zúrivo potraste pre nahlásenie chyby"; -"settings_ui_theme_picker_message_match_system_theme" = "\"Auto\" zodpovedá systémovej téme vášho zariadenia"; +"settings_ui_theme_picker_message_match_system_theme" = "\"Automatický\" zodpovedá systémovej téme vášho zariadenia"; "settings_pin_rooms_with_unread" = "Pripnúť miestnosti s neprečítanými správami"; "settings_pin_rooms_with_missed_notif" = "Pripnúť miestnosti so zmeškanými oznámeniami"; "settings_confirm_media_size" = "Potvrdiť veľkosť pri odosielaní"; @@ -1688,7 +1688,7 @@ "poll_timeline_total_one_vote" = "1 odovzdaný hlas"; "poll_edit_form_poll_type_closed" = "Uzavretá anketa"; "poll_edit_form_post_failure_title" = "Nepodarilo sa odoslať anketu"; -"call_transfer_error_message" = "Prenos hovoru zlyhal"; +"call_transfer_error_message" = "Presmerovanie hovoru zlyhalo"; "user_verification_session_details_information_untrusted_other_user" = " sa prihlásil pomocou novej relácie:"; "key_verification_bootstrap_not_setup_message" = "Najprv musíte zaviesť krížové podpisovanie."; "device_verification_emoji_pin" = "Špendlík"; @@ -1706,6 +1706,54 @@ "room_details_addresses_disable_main_address_prompt_title" = "Upozornenie na hlavnú adresu"; "manage_session_trusted" = "Dôveryhodný pre vás"; "settings_contacts_phonebook_country" = "Krajina telefónneho zoznamu"; -"settings_ui_theme_picker_message_invert_colours" = "\"Auto\" používa nastavenia \"Invertovať farby\" vášho zariadenia"; +"settings_ui_theme_picker_message_invert_colours" = "\"Automatický\" používa nastavenia \"Invertovať farby\" vášho zariadenia"; "external_link_confirmation_title" = "Prekontrolujte tento odkaz"; "callbar_only_single_active_group" = "Ťuknutím sa pripojíte k skupinovému hovoru (%@)"; + +// MARK: - Call Transfer +"call_transfer_title" = "Presmerovať"; + +// Events formatter +"event_formatter_member_updates" = "%tu zmeny členstva"; +"location_sharing_post_failure_subtitle" = "%@ sa nepodarilo odoslať vašu polohu. Skúste to prosím neskôr."; +"location_sharing_post_failure_title" = "Nepodarilo sa nám odoslať vašu polohu"; +"space_tag" = "priestor"; +"home_context_menu_leave" = "Opustiť"; +"home_context_menu_normal_priority" = "Normálna priorita"; +"home_context_menu_low_priority" = "Nízka priorita"; +"home_context_menu_unfavourite" = "Odstrániť z obľúbených"; +"home_context_menu_favourite" = "Obľúbené"; +"home_context_menu_unmute" = "Zrušiť stlmenie"; +"home_context_menu_mute" = "Stlmiť"; +"home_context_menu_notifications" = "Oznámenia"; +"home_context_menu_make_dm" = "Presunúť do Ľudí"; +"bug_report_progress_uploading" = "Nahrávanie záznamu"; +"event_formatter_message_deleted" = "Správa vymazaná"; +"room_event_copy_link_info" = "Odkaz skopírovaný do schránky."; +"room_event_action_view_in_room" = "Zobraziť v miestnosti"; +"home_context_menu_make_room" = "Presunúť do miestností"; +"settings_labs_enable_threads" = "Správy vo vláknach"; +"message_from_a_thread" = "Z vlákna"; +"threads_empty_show_all_threads" = "Zobraziť všetky vlákna"; +"threads_empty_tip" = "Tip: Ťuknite na správu a použite \"Vlákno\" pre začatie nového."; +"threads_empty_info_my" = "Odpovedzte na prebiehajúce vlákno alebo ťuknite na správu a použite \"Vlákno\" pre začatie nového."; +"threads_empty_info_all" = "Vlákna pomáhajú udržiavať konverzácie v téme a ľahké sledovanie."; +"threads_empty_title" = "Udržujte diskusie organizované pomocou vlákien"; +"threads_action_my_threads" = "Moje vlákna"; +"threads_action_all_threads" = "Všetky vlákna"; +"threads_title" = "Vlákna"; +"thread_copy_link_to_thread" = "Kopírovať odkaz na vlákno"; + +// MARK: Threads +"room_thread_title" = "Vlákno"; +"room_accessibility_thread_more" = "Viac"; +"room_accessibility_threads" = "Vlákna"; +"room_event_action_reply_in_thread" = "Vlákno"; +"settings_calls_stun_server_fallback_button" = "Povoliť náhradnú službu hovorov asistenčného servera"; +"settings_calls_stun_server_fallback_description" = "Povoľte náhradné službu hovorov asistenčného servera %@, keď ho váš domovský server neponúka (vaša IP adresa by bola počas volania zdieľaná)."; +"deactivate_account_informations_part4_emphasize" = "štandardne nespôsobí, že zabudneme na správy, ktoré ste odoslali. "; +"room_details_fail_to_update_room_join_rule" = "Nepodarí sa aktualizovať pravidlo pripojenia"; +"settings_enable_callkit" = "Integrované volanie"; +"room_resource_usage_limit_reached_message_contact_3" = " aby ste tento limit zvýšili."; +"room_resource_limit_exceeded_message_contact_3" = " pokračovať v používaní tejto služby."; +"find_your_contacts_title" = "Začnite so zoznamom vašich kontaktov"; diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 0b0f12415..848a9fedb 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -46,7 +46,7 @@ "auth_optional_phone_placeholder" = "Numër telefoni (opsionale)"; "auth_phone_placeholder" = "Numër telefoni"; "auth_repeat_password_placeholder" = "Rijepeni fjalëkalimin"; -"auth_repeat_new_password_placeholder" = "Ripohoni fjalëkalimin tuaj të ri"; +"auth_repeat_new_password_placeholder" = "Që ta ripohoni, jepni fjalëkalimin e llogarisë tuaj Matrix"; "auth_home_server_placeholder" = "URL (p.sh., https://matrix.org)"; "auth_identity_server_placeholder" = "URL (p.sh., https://vector.im)"; "auth_invalid_login_param" = "Emër përdoruesi dhe/ose fjalëkalim i pasaktë"; @@ -62,12 +62,12 @@ "auth_untrusted_id_server" = "Shërbyesi i identiteteve s’është i besuar"; "auth_password_dont_match" = "Fjalëkalimet s’përputhen"; "auth_username_in_use" = "Emër përdoruesi i përdorur"; -"auth_forgot_password" = "Harruat fjalëkalimin?"; +"auth_forgot_password" = "Harruat fjalëkalimin e llogarisë tuaj Matrix?"; "auth_email_not_found" = "S’u arrit të dërgohej email: Kjo adresë email s’u gjet"; "auth_email_validation_message" = "Ju lutemi, që të vazhdojë regjistrimi, kontrolloni email-in tuaj"; "auth_msisdn_validation_title" = "Verifikim Në Pritje të Miratimit"; "auth_msisdn_validation_error" = "S’arrihet të verifikohet numër telefoni."; -"auth_reset_password_message" = "Që të ricaktoni fjalëkalimin, jepni adresën email të lidhur me llogarinë tuaj:"; +"auth_reset_password_message" = "Që të ricaktoni fjalëkalimin e llogarisë tuaj Matrix, jepni adresën email të lidhur me llogarinë tuaj:"; "auth_reset_password_missing_email" = "Duhet dhënë adresa email e lidhur me llogarinë tuaj."; "auth_reset_password_missing_password" = "Duhet dhënë një fjalëkalim i ri."; // Chat creation @@ -180,7 +180,7 @@ "room_event_action_copy" = "Kopjoje"; "room_event_action_quote" = "Citim"; "room_event_action_more" = "Më tepër"; -"room_event_action_permalink" = "Permalidhje"; +"room_event_action_permalink" = "Kopjoje lidhjen te mesazh"; "room_event_action_view_source" = "Shihini Burimin"; "room_event_action_report" = "Raportoni lëndë"; "room_event_action_report_prompt_reason" = "Arsye për raportimin e kësaj lënde"; @@ -257,11 +257,11 @@ "settings_privacy_policy" = "Rregulla Privatësie"; "settings_third_party_notices" = "Njoftime Palësh të Treta"; "settings_clear_cache" = "Pastroje fshehtinën"; -"settings_change_password" = "Ndryshoni fjalëkalimin"; +"settings_change_password" = "Ndryshoni fjalëkalim llogarie Matrix"; "settings_old_password" = "fjalëkalim i vjetër"; "settings_new_password" = "fjalëkalim i ri"; "settings_confirm_password" = "ripohoni fjalëkalimin"; -"settings_password_updated" = "Fjalëkalimi juaj u përditësua"; +"settings_password_updated" = "Fjalëkalimi i llogarisë tuaj Matrix u përditësua"; "settings_crypto_device_name" = "Emër sesioni: "; "settings_crypto_device_id" = "\nID sesioni: "; "settings_crypto_device_key" = "\nKyç sesioni:\n"; @@ -426,7 +426,7 @@ "settings_pin_rooms_with_missed_notif" = "Fikso dhomat me njoftime të humbura"; "settings_pin_rooms_with_unread" = "Fikso dhomat me mesazhe të palexuar"; "settings_labs_create_conference_with_jitsi" = "Krijoni thirrje konferencë me Jitsi-n"; -"settings_fail_to_update_password" = "S’arrihet të përditësohet fjalëkalimi"; +"settings_fail_to_update_password" = "S’u arrit të përditësohet fjalëkalimi i llogarisë Matrix"; "settings_deactivate_my_account" = "Çaktivizoje llogarinë time"; "room_details_mute_notifs" = "Heshtoji njoftimet"; "room_details_access_section_no_address_warning" = "Që të lidhni një dhomë, ajo duhet të ketë një adresë"; @@ -464,10 +464,10 @@ "deactivate_account_forget_messages_information_part2_emphasize" = "Kujdes"; "deactivate_account_validate_action" = "Çaktivizoje llogarinë"; "deactivate_account_password_alert_title" = "Çaktivizoni Llogarinë"; -"deactivate_account_password_alert_message" = "Që të vazhdohet, ju lutemi, jepni fjalëkalimin tuaj"; +"deactivate_account_password_alert_message" = "Që të vazhdohet, ju lutemi, jepni fjalëkalimin e llogarisë tuaj Matrix."; // Re-request confirmation dialog "rerequest_keys_alert_title" = "Kërkesa u Dërgua"; -"auth_reset_password_success_message" = "Fjalëkalimi juaj u ri caktua.\n\nËshtë bërë dalja juaj nga llogaria në krejt sesionet dhe s’do të merrni më njoftime push. Për riaktivizim të njoftimeve, ribëni hyrjen në çdo pajisje."; +"auth_reset_password_success_message" = "Fjalëkalimi i llogarisë tuaj Matrix u ricaktua.\n\nËshtë bërë dalja juaj nga llogaria në krejt sesionet dhe s’do të merrni më njoftime push. Për riaktivizim të njoftimeve, ribëni hyrjen në çdo pajisje."; "room_creation_make_public_prompt_msg" = "Jeni i sigurt se doni ta bëni publike këtë fjalosje? Në një të tillë, mesazhet tuaj mund t’i lexojë cilido dhe mund të hyjë në bisedë."; "room_creation_wait_for_creation" = "Po krijohet tashmë një dhomë. Ju lutemi, prisni."; "contacts_address_book_permission_required" = "Lypset leje për hyrje në kontaktet vendore"; @@ -580,7 +580,7 @@ "key_backup_setup_intro_title" = "Mos humbni kurrë mesazhe të fshehtëzuar"; "key_backup_setup_intro_info" = "Mesazhet në dhoma të fshehtëzuara sigurohen me fshehtëzim skaj-më-skaj. Vetëm ju dhe marrësi(t) keni kyçet për leximin e këtyre mesazheve.\n\nBëni një kopjeruajtje të sigurt të kyçeve tuaj, për të shmangur humbjen e tyre."; "key_backup_setup_intro_setup_action" = "Rregulloje"; -"key_backup_setup_passphrase_info" = "Do të depozitojmë një kopje të fshehtëzuar të kyçeve tuaj në shërbyesin tonë. Mbrojeni kopjeruajtjen tuaj me një frazë, për ta mbajtur të parrezikuar.\n\nPër maksimumin e sigurisë, ky duhet të jetë i ndryshëm nga fjalëkalimi juaj për llogarinë."; +"key_backup_setup_passphrase_info" = "Do të depozitojmë një kopje të fshehtëzuar të kyçeve tuaj në shërbyesin tonë. Mbrojeni kopjeruajtjen tuaj me një frazë, për ta mbajtur të parrezikuar.\n\nPër maksimumin e sigurisë, ky duhet të jetë i ndryshëm nga fjalëkalimi juaj për llogarinë Matrix."; "key_backup_setup_passphrase_passphrase_title" = "Jepeni"; "key_backup_setup_passphrase_passphrase_placeholder" = "Jepni frazë"; "key_backup_setup_passphrase_passphrase_valid" = "Bukur!"; @@ -812,7 +812,7 @@ "emoji_picker_flags_category" = "Flamuj"; // MARK: Reaction history "reaction_history_title" = "Reagime"; -"auth_forgot_password_error_no_configured_identity_server" = "S’ka shërbyes identitetesh të formësuar: shtoni një të tillë që të ricaktoni fjalëkalimin tuaj."; +"auth_forgot_password_error_no_configured_identity_server" = "S’ka shërbyes identitetesh të formësuar: shtoni një të tillë që të ricaktoni fjalëkalimin e llogarisë tuaj Matrix."; "room_creation_error_invite_user_by_email_without_identity_server" = "S’ka shërbyes identitetesh të formësua, ndaj s’mund të shtoni një pjesëmarrës me një email."; "room_participants_start_new_chat_error_using_user_email_without_identity_server" = "S’ka shërbyes identitetesh të formësuar, ndaj s’mund të nisni një fjalosje me një kontakt duke përdorur një email."; // Service terms @@ -839,9 +839,9 @@ "auth_add_email_message_2" = "Caktoni një email për rimarrje llogarie, dhe që më vonë të jeni (opsionale) i zbulueshëm nga persona që ju njohin."; "auth_add_phone_message_2" = "Caktoni një telefon, dhe jini më vonë i zbulueshëm nga persona që ju njohin."; "auth_add_email_phone_message_2" = "Caktoni një email për rimarrje llogarie. Përdorni më vonë email ose telefon që të jeni (opsionale) i zbulueshëm nga persona që ju njohin."; -"auth_email_is_required" = "S’ka të formësuar shërbyes identitetesh, ndaj s’mund të shtoni adresë email që të mund të ricaktoni fjalëkalimin tuaj në të ardhmen."; -"auth_phone_is_required" = "S’ka të formësuar shërbyes identitetesh, ndaj s’mund të shtoni numër telefoni që të mund të ricaktoni fjalëkalimin tuaj në të ardhmen."; -"auth_reset_password_error_is_required" = "S’ka të formësuar shërbyes identitetesh: shtoni një të tillë që nga mundësitë rreth shërbyesit, që të ricaktoni fjalëkalimin tuaj."; +"auth_email_is_required" = "S’ka të formësuar shërbyes identitetesh, ndaj s’mund të shtoni adresë email që të mund të ricaktoni fjalëkalimin e llogarisë tuaj Matrix në të ardhmen."; +"auth_phone_is_required" = "S’ka të formësuar shërbyes identitetesh, ndaj s’mund të shtoni numër telefoni që të mund të ricaktoni fjalëkalimin e llogarisë tuaj Matrix në të ardhmen."; +"auth_reset_password_error_is_required" = "S’ka të formësuar shërbyes identitetesh: shtoni një të tillë që nga mundësitë rreth shërbyesit, që të ricaktoni fjalëkalimin e llogarisë tuaj Matrix."; "contacts_address_book_no_identity_server" = "S’ka të formësuar shërbyes identitetesh"; "settings_discovery_settings" = "ZBULIM"; "settings_identity_server_settings" = "SHËRBYES IDENTITETESH"; @@ -850,7 +850,7 @@ "settings_three_pids_management_information_part3" = "."; "settings_add_3pid_password_title_email" = "Shtoni adresë email"; "settings_add_3pid_password_title_msidsn" = "Shtoni numër telefoni"; -"settings_add_3pid_password_message" = "Që të vazhdohet, ju lutemi, jepni fjalëkalimin tuaj"; +"settings_add_3pid_password_message" = "Që të vazhdohet, ju lutemi, jepni fjalëkalimin e llogarisë tuaj Matrix."; "settings_add_3pid_invalid_password_message" = "Kredenciale të pavlefshme"; "settings_devices_description" = "Emri publik i një sesioni është i dukshëm për persona me të cilët komunikoni"; "settings_discovery_no_identity_server" = "S’po përdorni ndonjë shërbyes identitetesh. Që të jeni i zbulueshëm nga kontakte ekzistuese që njihni, shtoni një të tillë."; @@ -1122,7 +1122,7 @@ "secrets_setup_recovery_key_storage_alert_message" = "✓ Shtypeni dhe vendoseni diku të parrezik\n✓ Ruajeni në një diskth USB ose në një pajisje kopjeruajtjesh\n✓ Kopjojeni te depoja juaj personale në re"; "secrets_setup_recovery_passphrase_title" = "Caktoni një Frazë Sigurie"; "secrets_setup_recovery_passphrase_information" = "Jepni një frazë sigurie që e dini vetëm ju, për ta përdorur për sigurim të fshehtash në shërbyesin tuaj."; -"secrets_setup_recovery_passphrase_additional_information" = "Mos përdorni fjalëkalimin e llogarisë tuaj."; +"secrets_setup_recovery_passphrase_additional_information" = "Mos përdorni fjalëkalimin e llogarisë tuaj Matrix."; "secrets_setup_recovery_passphrase_validate_action" = "U bë"; "secrets_setup_recovery_passphrase_confirm_information" = "Që ta ripohoni, rijepeni Frazën e Sigurisë."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Ripohojeni"; @@ -1132,13 +1132,13 @@ "security_settings_secure_backup_setup" = "Ujdiseni"; "security_settings_secure_backup_synchronise" = "Njëkohësoje"; "security_settings_secure_backup_delete" = "Fshije Kopjeruajtjen"; -"security_settings_user_password_description" = "Ripohoni identitetin tuaj duke dhënë fjalëkalimin e llogarisë tuaj"; +"security_settings_user_password_description" = "Ripohoni identitetin tuaj duke dhënë fjalëkalimin e llogarisë tuaj Matrix"; "secure_key_backup_setup_existing_backup_error_title" = "Një kopjeruajtje për mesazhe që ekzistojnë tashmë"; "secure_key_backup_setup_existing_backup_error_info" = "Shkyçeni, që ta ripërdorni te kopjeruajtja e sigurt ose për ta fshirë që të krijoni një kopjeruajtje të re mesazhesh te kopjeruajtja e sigurt."; "secure_key_backup_setup_existing_backup_error_unlock_it" = "Shkyçe"; "secure_key_backup_setup_existing_backup_error_delete_it" = "Fshije"; "sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Fillo të përdorësh Kojperuajtje të Sigurt"; -"security_settings_crypto_sessions_description_2" = "Nëse nuk njihni një palë kredenciale, ndryshoni fjalëkalimin tuaj dhe riujdisni Kopjeruajtjen e Sigurt."; +"security_settings_crypto_sessions_description_2" = "Nëse nuk njihni një palë kredenciale, ndryshoni fjalëkalimin tuaj Matrix dhe riujdisni Kopjeruajtjen e Sigurt."; "cross_signing_setup_banner_title" = "Ujdisni fshehtëzim"; "cross_signing_setup_banner_subtitle" = "Verifikoni më me lehtësi pajisje të tjera"; // Events formatter with you @@ -1229,7 +1229,7 @@ "pin_protection_kick_user_alert_message" = "Shumë gabime, u bë nxjerrja juaj jashtë"; "switch" = "Këmbe"; "joined" = "Erdhi"; -"secrets_reset_authentication_message" = "Që ta ripohoni, jepni fjalëkalimin e llogarisë tuaj"; +"secrets_reset_authentication_message" = "Që ta ripohoni, jepni fjalëkalimin e llogarisë tuaj Matrix"; "secrets_reset_reset_action" = "Riktheji"; "secrets_reset_warning_message" = "Do të filloni pa historik, pa mesazhe, pajisje të besuara ose përdorues të besuar."; "secrets_reset_warning_title" = "Nëse ktheni gjithçka te parazgjedhjet"; @@ -1615,3 +1615,35 @@ "poll_edit_form_update_failure_subtitle" = "Ju lutemi, riprovoni"; "poll_edit_form_update_failure_title" = "S’u arrit të përditësohet anketimi"; "poll_edit_form_poll_type" = "Lloj anketimi"; +"location_sharing_post_failure_subtitle" = "%@ s’dërgoi dot vendndodhjen tuaj. Ju lutemi, riprovoni më vonë."; +"location_sharing_post_failure_title" = "S’dërguam dot vendndodhjen tuaj"; +"home_context_menu_leave" = "Ikni"; +"home_context_menu_normal_priority" = "Përparësi normale"; +"home_context_menu_low_priority" = "Me përparësi të ulët"; +"home_context_menu_unfavourite" = "Hiqe prej të Parapëlqyerish"; +"home_context_menu_favourite" = "Bëje të parapëlqyer"; +"home_context_menu_unmute" = "Ktheji zërin"; +"home_context_menu_mute" = "Heshtoje"; +"home_context_menu_notifications" = "Njoftime"; +"home_context_menu_make_room" = "Shpjere te Dhoma"; +"home_context_menu_make_dm" = "Shpjere te Persona"; +"event_formatter_message_deleted" = "Mesazhi u fshi"; +"settings_labs_enable_threads" = "Mesazhe me rrjedha"; +"message_from_a_thread" = "Nga një rrjedhë"; +"threads_empty_show_all_threads" = "Shfaqi krejt rrjedhat"; +"threads_empty_tip" = "Ndihmëz: Prekni një mesazh dhe përdorni “Rrjedhë”, që të nisni një të re."; +"threads_empty_info_my" = "Përgjigjuni te një rrjedhë në zhvillim, ose prekni një mesazh dhe përdorni “Rrjedhë”, që të nisni një të re."; +"threads_empty_info_all" = "Rrjedhat ndihmojnë që të mbahet biseda juaj brenda temës dhe të ndiqet kollaj."; +"threads_empty_title" = "Mbajini diskutimet të sistemuara në rrjedha"; +"threads_action_my_threads" = "Rrjedhat e mia"; +"threads_action_all_threads" = "Krejt rrjedhat"; +"threads_title" = "Rrjedha"; +"thread_copy_link_to_thread" = "Kopjoje lidhjen te rrjedha"; + +// MARK: Threads +"room_thread_title" = "Rrjedhë"; +"room_accessibility_thread_more" = "Më tepër"; +"room_accessibility_threads" = "Rrjedha"; +"room_event_copy_link_info" = "Lidhja u kopjua në të papastër."; +"room_event_action_reply_in_thread" = "Rrjedhë"; +"room_event_action_view_in_room" = "Shiheni në dhomë"; diff --git a/Riot/Assets/sv.lproj/Vector.strings b/Riot/Assets/sv.lproj/Vector.strings index 88d35e629..5b2a7675f 100644 --- a/Riot/Assets/sv.lproj/Vector.strings +++ b/Riot/Assets/sv.lproj/Vector.strings @@ -47,7 +47,7 @@ "auth_optional_phone_placeholder" = "Telefonnummer (valfritt)"; "auth_phone_placeholder" = "Telefonnummer"; "auth_repeat_password_placeholder" = "Upprepa lösenord"; -"auth_repeat_new_password_placeholder" = "Bekräfta ditt lösenord"; +"auth_repeat_new_password_placeholder" = "Bekräfta ditt nya Matrixkontolösenord"; "auth_identity_server_placeholder" = "URL (t.ex. https://vector.im)"; "auth_invalid_login_param" = "Felaktigt användarnamn och/eller lösenord"; "auth_invalid_password" = "Lösenordet är för kort (minst 6 tecken)"; @@ -59,17 +59,17 @@ "auth_missing_email_or_phone" = "E-postadress eller telefonnummer saknas"; "auth_email_in_use" = "Den här e-postadressen är upptagen"; "auth_phone_in_use" = "Det här telefonnumret är upptaget"; -"auth_email_is_required" = "Ingen identitetsserver är konfigurerad, så du kan inte lägga till en e-postadress för att återställa ditt lösenord i framtiden."; -"auth_phone_is_required" = "Ingen identitetsserver är konfigurerad, så du kan inte lägga till ett telefonnummer för att återställa ditt lösenord i framtiden."; +"auth_email_is_required" = "Ingen identitetsserver är konfigurerad, så du kan inte lägga till en e-postadress för att återställa ditt Matrixkontolösenord i framtiden."; +"auth_phone_is_required" = "Ingen identitetsserver är konfigurerad, så du kan inte lägga till ett telefonnummer för att återställa ditt Matrixkontolösenord i framtiden."; "auth_password_dont_match" = "Lösenorden matchar inte"; "auth_username_in_use" = "Användarnamn upptaget"; -"auth_forgot_password" = "Glömt lösenordet?"; +"auth_forgot_password" = "Glömt Matrixkontolösenordet?"; "auth_email_not_found" = "Misslyckades att skicka e-post: Den här e-postadressen hittades inte"; "auth_use_server_options" = "Använd anpassade serveralternativ (avancerat)"; "auth_email_validation_message" = "Kolla din e-post för att fortsätta registreringen"; "auth_msisdn_validation_message" = "Vi har skickat ett SMS med en aktiveringskod. Ange den koden nedan."; "auth_msisdn_validation_error" = "Kunde inte verifiera telefonnummer."; -"auth_reset_password_message" = "För att återställa ditt lösenord, ange e-postadressen som är länkad till ditt konto:"; +"auth_reset_password_message" = "För att återställa ditt Matrixkontolösenord, ange e-postadressen som är länkad till ditt konto:"; "auth_reset_password_missing_email" = "Du måste ange e-postadressen som är länkad till ditt konto."; "auth_reset_password_missing_password" = "Ett nytt lösenord måste anges."; "auth_reset_password_email_validation_message" = "Ett e-brev har skickats till %@. När du har följt länken i det, tryck nedan."; @@ -204,7 +204,7 @@ "room_event_action_redact" = "Ta bort"; "room_event_action_more" = "Mer"; "room_event_action_share" = "Dela"; -"room_event_action_permalink" = "Permalänk"; +"room_event_action_permalink" = "Kopiera länk till meddelande"; "room_event_action_view_source" = "Visa källa"; "room_event_action_view_decrypted_source" = "Visa avkrypterad källa"; "room_event_action_report" = "Rapportera innehåll"; @@ -297,7 +297,7 @@ "settings_add_email_address" = "Lägg till e-postadress"; "settings_phone_number" = "Telefon"; "settings_add_phone_number" = "Lägg till telefonnummer"; -"settings_change_password" = "Ändra lösenord"; +"settings_change_password" = "Byt Matrixkontolösenord"; "settings_night_mode" = "Nattläge"; "settings_fail_to_update_profile" = "Misslyckades att uppdatera profil"; "settings_three_pids_management_information_part1" = "Hantera vilka e-postadresser eller telefonnummer som du kan använda för att logga in eller återfå ditt konto här. Kontrollera vilka som kan hitta dig i "; @@ -331,11 +331,11 @@ "settings_old_password" = "gammalt lösenord"; "settings_new_password" = "nytt lösenord"; "settings_confirm_password" = "bekräfta lösenord"; -"settings_fail_to_update_password" = "Misslyckades att uppdatera lösenord"; -"settings_password_updated" = "Ditt lösenord har uppdaterats"; +"settings_fail_to_update_password" = "Misslyckades att uppdatera Matrixkontolösenord"; +"settings_password_updated" = "Ditt Matrixkontolösenord har uppdaterats"; "settings_add_3pid_password_title_email" = "Lägg till e-postadress"; "settings_add_3pid_password_title_msidsn" = "Lägg till telefonnummer"; -"settings_add_3pid_password_message" = "För att fortsätta, ange ditt lösenord"; +"settings_add_3pid_password_message" = "För att fortsätta, ange ditt Matrixkontolösenord"; "settings_add_3pid_invalid_password_message" = "Ogiltiga uppgifter"; "settings_crypto_export" = "Exportera nycklar"; "settings_crypto_blacklist_unverified_devices" = "Kryptera endast till verifierade sessioner"; @@ -379,7 +379,7 @@ "security_settings_advanced" = "AVANCERAT"; "security_settings_blacklist_unverified_devices" = "Skicka aldrig meddelanden till obetrodda sessioner"; "security_settings_blacklist_unverified_devices_description" = "Verifiera en användares alla sessioner för att markera den som betrodd och skicka meddelanden till den."; -"security_settings_user_password_description" = "Bekräfta din identitet genom att ange ditt kontolösenord"; +"security_settings_user_password_description" = "Bekräfta din identitet genom att ange ditt Matrixkontolösenord"; // Manage session "manage_session_title" = "Hantera session"; "manage_session_info" = "SESSIONSINFO"; @@ -406,11 +406,11 @@ "auth_home_server_placeholder" = "URL (t.ex. https://matrix.org)"; "auth_invalid_user_name" = "Användarnamn får endast innehålla bokstäver, siffror, punkter, bindestreck och understreck"; "auth_add_email_message_2" = "Ställ in en e-postadress för kontoåterställning, och senare för att valfritt bli upptäckbar av personer som känner dig."; -"auth_forgot_password_error_no_configured_identity_server" = "Ingen identitetsserver är konfigurerad: lägg till en för att återställa ditt lösenord."; +"auth_forgot_password_error_no_configured_identity_server" = "Ingen identitetsserver är konfigurerad: lägg till en för att återställa ditt Matrixkontolösenord."; "auth_msisdn_validation_title" = "Avvaktar verifiering"; "auth_recaptcha_message" = "Den här hemservern vill kontrollera att du inte är en robot"; -"auth_reset_password_error_is_required" = "Ingen identitetsserver är konfigurerad: lägg till en i serveralternativen för att återställa ditt lösenord."; -"auth_reset_password_success_message" = "Ditt lösenord har återställts.\n\nDu har loggats ut från alla sessioner och kommer inte längre att ta emot pushnotiser. För att återaktivera pushnotiser, logga in igen på varje enhet."; +"auth_reset_password_error_is_required" = "Ingen identitetsserver är konfigurerad: lägg till en i serveralternativen för att återställa ditt Matrixkontolösenord."; +"auth_reset_password_success_message" = "Ditt Matrixkontolösenord har återställts.\n\nDu har loggats ut från alla sessioner och kommer inte längre att ta emot pushnotiser. För att återaktivera pushnotiser, logga in igen på varje enhet."; "auth_accept_policies" = "Granska och acceptera villkoren för denna hemserver:"; "auth_softlogout_reason" = "Admin hos din hemserver (%1$@) har loggat ut dig från ditt konto %2$@ (%3$@)."; "auth_softlogout_clear_data" = "Rensa personlig data"; @@ -653,7 +653,7 @@ "settings_discovery_three_pids_management_information_part3" = "."; "settings_identity_server_description" = "Med hjälp av identitetsservern som anges ovan kan du upptäcka och upptäckas av befintliga kontakter du känner."; "settings_identity_server_no_is_description" = "Du använder för närvarande inte en identitetsserver. För att upptäcka och bli upptäckt av befintliga kontakter du känner, lägg till en ovan."; -"security_settings_crypto_sessions_description_2" = "Om du inte känner igen en inloggning, ändra ditt lösenord och återställ säker säkerhetskopiering."; +"security_settings_crypto_sessions_description_2" = "Om du inte känner igen en inloggning, byt ditt Matrixkontolösenord och återställ säker säkerhetskopiering."; "security_settings_secure_backup" = "SÄKER SÄKERHETSKOPIERING"; "security_settings_secure_backup_description" = "Säkerhetskopiera dina nycklar med din kontodata ifall du förlorar åtkomst till dina sessioner. Dina nycklar kommer att säkras med en unik säkerhetsnyckel."; "security_settings_backup" = "MEDDELANDESÄKERHETSKOPIERING"; @@ -751,7 +751,7 @@ "deactivate_account_forget_messages_information_part3" = ": detta leder till att framtida användare kommer att se en ofullständig bild av konversationer)"; "deactivate_account_validate_action" = "Inaktivera konto"; "deactivate_account_password_alert_title" = "Inaktivera konto"; -"deactivate_account_password_alert_message" = "För att fortsätta, ange ditt lösenord"; +"deactivate_account_password_alert_message" = "För att fortsätta, ange ditt Matrixkontolösenord"; "rerequest_keys_alert_message" = "Starta %@ på en annan enhet som dekryptera meddelandet så att den kan skicka nycklarna till den här sessionen."; "secure_key_backup_setup_intro_use_security_key_title" = "Använd en säkerhetsnyckel"; "secure_key_backup_setup_intro_use_security_key_info" = "Generera en säkerhetsnyckel att lagra på en säker plats, exempelvis i en lösenordshanterare eller ett kassaskåp."; @@ -860,7 +860,7 @@ "key_backup_setup_intro_title" = "Bli aldrig av med krypterade meddelanden"; "key_backup_setup_intro_setup_action_without_existing_backup" = "Börja använda nyckelsäkerhetskopiering"; "key_backup_setup_intro_setup_connect_action_with_existing_backup" = "Anslut den här enheten till nyckelsäkerhetskopiering"; -"key_backup_setup_passphrase_info" = "Vi kommer lagra en krypterad kopia av dina nycklar på vår server. Skydda din säkerhetskopia med en fras för att hålla den säker.\n\nFör maximal säkerhet bör denna skilja sig från ditt kontolösenord."; +"key_backup_setup_passphrase_info" = "Vi kommer lagra en krypterad kopia av dina nycklar på vår server. Skydda din säkerhetskopia med en fras för att hålla den säker.\n\nFör maximal säkerhet bör denna skilja sig från ditt Matrixkontokontolösenord."; "key_backup_setup_passphrase_setup_recovery_key_info" = "Eller säkra din säkerhetskopia med en säkerhetsnyckel och spara den någonstans säkert."; "key_backup_recover_invalid_passphrase" = "Säkerhetskopian kunde inte avkrypteras med den här frasen: vänligen kontrollera att du angav rätt säkerhetsfras."; "key_backup_recover_invalid_recovery_key_title" = "Säkerhetsnyckeln matchade inte"; @@ -1093,7 +1093,7 @@ "secrets_setup_recovery_key_storage_alert_message" = "✓ Skriv ut den och förvara den säkert\n✓ Spara den på ett USB-minne eller säkerhetskopieringsenhet\n✓ Kopiera den till din personliga molnlagring"; "secrets_setup_recovery_passphrase_title" = "Sätt en säkerhetsfras"; "secrets_setup_recovery_passphrase_information" = "Ange en säkerhetsfras endast du känner till vilken används för att säkra hemligheter på din server."; -"secrets_setup_recovery_passphrase_additional_information" = "Använd inte ditt kontolösenord."; +"secrets_setup_recovery_passphrase_additional_information" = "Använd inte ditt Matrixkontolösenord."; "secrets_setup_recovery_passphrase_validate_action" = "Klart"; "secrets_setup_recovery_passphrase_confirm_information" = "Ange din säkerhetsfras igen för att bekräfta den."; "secrets_setup_recovery_passphrase_confirm_passphrase_title" = "Bekräfta"; @@ -1180,7 +1180,7 @@ "room_info_list_one_member" = "1 medlem"; "room_info_list_several_members" = "%@ medlemmar"; "room_info_list_section_other" = "Andra"; -"secrets_reset_authentication_message" = "Ange ditt kontolösenord för att bekräfta"; +"secrets_reset_authentication_message" = "Ange ditt Matrixkontolösenord för att bekräfta"; "secrets_reset_reset_action" = "Återställ"; "secrets_reset_warning_message" = "så kommer du att börja om utan historik, meddelanden, betrodda enheter eller betrodda användare."; "secrets_reset_information" = "Gör bara detta om du inte har någon annan enhet att verifiera den här enheten med."; @@ -1217,7 +1217,7 @@ "invite_friends_action" = "Bjud in vänner till %@"; "pin_protection_settings_change_pin" = "Byt PIN-kod"; -"pin_protection_confirm_pin_to_change" = "Bekräfta PIN-kod för att fortsätta"; +"pin_protection_confirm_pin_to_change" = "Bekräfta PIN-kod för att byta PIN-kod"; "bug_report_background_mode" = "Fortsätt i bakgrunden"; "social_login_button_title_sign_up" = "Skapa konto med %@"; "social_login_button_title_sign_in" = "Logga in med %@"; @@ -1468,3 +1468,126 @@ "leave_space_only_action" = "Lämna inga rum"; "leave_space_message_admin_warning" = "Du är admin för det här utrymmet, försäkra att du har överfört adminrättigheter till en annan medlem innan du lämnar."; "leave_space_message" = "Är du säker på att du vill lämna %@? Vill du även lämna alla rum och utrymmen i det här utrymmet?"; +"location_sharing_settings_toggle_title" = "Aktivera platsdelning"; +"location_sharing_settings_header" = "Platsdelning"; +"location_sharing_open_google_maps" = "Öppna i Google Maps"; +"location_sharing_open_apple_maps" = "Öppna i Apple Maps"; +"location_sharing_invalid_authorization_settings" = "Inställningar"; +"location_sharing_invalid_authorization_not_now" = "Inte nu"; +"location_sharing_invalid_authorization_error_title" = "%@ är inte behörig att komma åt din plats. Du kan aktivera åtkomst i Inställningar > Plats"; +"location_sharing_locating_user_error_title" = "%@ kunde inte komma åt din plats. Vänligen pröva igen senare."; +"location_sharing_loading_map_error_title" = "%@ kunde inte ladda kartan. Vänligen pröva igen senare."; +"location_sharing_post_failure_subtitle" = "%@ kunde inte skicka din plats. Vänligen pröva igen senare."; +"location_sharing_post_failure_title" = "Vi kunde inte skicka din plats"; +"location_sharing_share_action" = "Dela"; +"location_sharing_close_action" = "Stäng"; + +// MARK: - Location sharing + +"location_sharing_title" = "Plats"; +"poll_timeline_not_closed_subtitle" = "Vänligen pröva igen"; +"poll_timeline_not_closed_title" = "Misslyckades att avsluta omröstning"; +"poll_timeline_vote_not_registered_subtitle" = "Tyvärr registrerades inte din röst, vänligen pröva igen"; +"poll_timeline_vote_not_registered_title" = "Röst registrerades inte"; +"poll_timeline_total_final_results" = "Slutgiltigt resultat baserat på %lu röst"; +"poll_timeline_total_final_results_one_vote" = "Slutgiltigt resultat baserat på 1 röst"; +"poll_timeline_total_votes_not_voted" = "%lu röster avgivna. Rösta för att se resultatet"; +"poll_timeline_total_one_vote_not_voted" = "1 röst avgiven. Rösta för att se resultatet"; +"poll_timeline_total_votes" = "%lu röster avgivna"; +"poll_timeline_total_one_vote" = "1 röst avgiven"; +"poll_timeline_total_no_votes" = "Inga röster avgivna"; +"poll_timeline_votes_count" = "%lu röster"; +"poll_timeline_one_vote" = "1 röst"; +"poll_edit_form_poll_type_closed_description" = "Resultat avslöjas när du avslutar omröstningen"; +"poll_edit_form_poll_type_closed" = "Sluten omröstning"; +"poll_edit_form_poll_type_open_description" = "Röstare ser resultat så fort de har röstat"; +"poll_edit_form_poll_type_open" = "Öppna omröstning"; +"poll_edit_form_update_failure_subtitle" = "Vänligen pröva igen"; +"poll_edit_form_update_failure_title" = "Misslyckades att uppdatera omröstning"; +"poll_edit_form_post_failure_subtitle" = "Vänligen pröva igen"; +"poll_edit_form_post_failure_title" = "Misslyckades att lägga upp omröstning"; +"poll_edit_form_add_option" = "Lägg till alternativ"; +"poll_edit_form_option_number" = "Alternativ %lu"; +"poll_edit_form_create_options" = "Skapa alternativ"; +"poll_edit_form_input_placeholder" = "Skriv något"; +"poll_edit_form_question_or_topic" = "Fråga eller ämne"; +"poll_edit_form_poll_question_or_topic" = "Omröstningens fråga eller ämne"; +"poll_edit_form_poll_type" = "Omröstningstyp"; + +// Mark: - Polls + +"poll_edit_form_create_poll" = "Skapa omröstning"; +"home_context_menu_leave" = "Lämna"; +"home_context_menu_normal_priority" = "Normal prioritet"; +"home_context_menu_low_priority" = "Låg prioritet"; +"home_context_menu_unfavourite" = "Ta bort från favoriter"; +"home_context_menu_favourite" = "Favoritmarkera"; +"home_context_menu_unmute" = "Avtysta"; +"home_context_menu_mute" = "Tysta"; +"home_context_menu_notifications" = "Aviseringar"; +"home_context_menu_make_room" = "Flytta till rum"; +"home_context_menu_make_dm" = "Flytta till personer"; +"share_extension_send_now" = "Skicka nu"; +"share_extension_low_quality_video_message" = "Skicka i %@ för bättre kvalité, eller skicka i låg kvalité nedan."; +"share_extension_low_quality_video_title" = "Video kommer skickas i låg kvalité"; +"analytics_prompt_stop" = "Sluta dela"; +"analytics_prompt_yes" = "Ja, det är okej"; +"analytics_prompt_not_now" = "Inte ny"; +"analytics_prompt_point_3" = "Du kan stänga av det här när som helst i inställningarna"; +/* Note: The word "don't" is formatted in bold */ +"analytics_prompt_point_2" = "Vi delar inte någon information med tredje parter"; +/* Note: The word "don't" is formatted in bold */ +"analytics_prompt_point_1" = "Vi spelar inte in eller profilerar någon kontodata"; +"analytics_prompt_terms_link_upgrade" = "här"; +/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */ +"analytics_prompt_terms_upgrade" = "Läs alla våra villkor %@. Är det OK?"; +"analytics_prompt_terms_link_new_user" = "här"; +/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */ +"analytics_prompt_terms_new_user" = "Du kan läsa alla våra villkor %@."; +"analytics_prompt_message_upgrade" = "Du har tidigare gått med på att dela anonym användningsdata med oss. Nu, för att hjälpa oss att förstå hur folk använder multipla enheter, så kommer vi att generera en slumpmässig identifierare som delas mellan dina enheter."; +"analytics_prompt_message_new_user" = "Hjälp oss att identifiera problem och förbättra %@ genom att dela anonym användningsdata. För att förstå hur personer använder multipla enheter så kommer vi att generera en slumpmässig identifierare som delas mellan dina enheter."; + +// Analytics +"analytics_prompt_title" = "Hjälp till att förbättra %@"; +"event_formatter_message_deleted" = "Meddelande raderat"; +"settings_enable_room_message_bubbles" = "Meddelandebubblor"; +"settings_discovery_accept_terms" = "Acceptera identitetsserverns villkor"; +"settings_analytics_and_crash_data" = "Skicka krasch- och analysdata"; +"settings_labs_enable_threads" = "Trådade meddelanden"; +"settings_labs_enabled_polls" = "Omröstningar"; +"settings_about" = "OM"; +"message_from_a_thread" = "Från en tråd"; +"threads_empty_show_all_threads" = "Visa alla trådar"; +"threads_empty_tip" = "Tips: Tryck på ett meddelande och använd “Tråd” för att starta en."; +"threads_empty_info_my" = "Svara på en pågående tråd eller tryck på ett meddelande och använd “Tråd” för att starta en ny."; +"threads_empty_info_all" = "Trådar hjälper till att hålla dina konversationer till ämnet och lätta att följa."; +"threads_empty_title" = "Håll diskussioner organiserade med trådar"; +"threads_action_my_threads" = "Mina trådar"; +"threads_action_all_threads" = "Alla trådar"; +"threads_title" = "Trådar"; +"thread_copy_link_to_thread" = "Kopiera länk till tråd"; + +// MARK: Threads +"room_thread_title" = "Tråd"; +"room_accessibility_thread_more" = "Mer"; +"room_accessibility_threads" = "Trådar"; +"room_event_copy_link_info" = "Länk kopierad till klippbordet."; +"room_event_action_reply_in_thread" = "Tråd"; +"room_event_action_view_in_room" = "Visa i rum"; +"room_event_action_end_poll" = "Avsluta omröstning"; +"room_event_action_remove_poll" = "Ta bort omröstning"; +"onboarding_splash_page_4_message" = "Element är också bra för arbetsplatser. Den är betrodd av världens säkraste organisationer."; +"onboarding_splash_page_4_title_no_pun" = "Meddelanden för ditt team."; +"onboarding_splash_page_3_message" = "Totalsträckskrypterad och inget telefonnummer krävs. Ingen reklam eller datainsamling."; +"onboarding_splash_page_3_title" = "Säkra meddelanden."; +"onboarding_splash_page_2_message" = "Välj vart dina konversationer lagras, vilket ger dig kontroll och självständighet. Ansluter via Matrix."; +"onboarding_splash_page_2_title" = "Du har kontrollen."; +"onboarding_splash_page_1_message" = "Säker och oberoende kommunikation som ger dig samma sekretessnivå som en personlig konversation i dit eget hem."; +"onboarding_splash_page_1_title" = "Äg dina konversationer."; +"onboarding_splash_login_button_title" = "Jag har redan ett konto"; + +// Onboarding +"onboarding_splash_register_button_title" = "Skapa konto"; +"accessibility_button_label" = "knapp"; +"ok" = "OK"; +"enable" = "Aktivera"; diff --git a/Riot/Assets/uk.lproj/Vector.strings b/Riot/Assets/uk.lproj/Vector.strings index dd0e93cac..d3fa52880 100644 --- a/Riot/Assets/uk.lproj/Vector.strings +++ b/Riot/Assets/uk.lproj/Vector.strings @@ -50,7 +50,7 @@ "auth_optional_phone_placeholder" = "Номер телефону (необов'язково)"; "auth_phone_placeholder" = "Номер телефону"; "auth_repeat_password_placeholder" = "Повторіть пароль"; -"auth_repeat_new_password_placeholder" = "Підтвердьте новий пароль"; +"auth_repeat_new_password_placeholder" = "Підтвердьте новий пароль облікового запису Matrix"; "auth_home_server_placeholder" = "URL (наприклад, https://matrix.org)"; "auth_identity_server_placeholder" = "URL (наприклад, https://vector.im)"; "auth_invalid_login_param" = "Неправильне ім'я користувача або пароль"; @@ -71,7 +71,7 @@ "auth_untrusted_id_server" = "Сервер облікових даних не довірений"; "auth_password_dont_match" = "Паролі не збігаються"; "auth_username_in_use" = "Ім'я користувача зайняте"; -"auth_forgot_password" = "Забули пароль?"; +"auth_forgot_password" = "Забули пароль облікового запису Matrix?"; "auth_email_not_found" = "Не вдалося надіслати лист: Таку адресу е-пошти не знайдено"; "auth_use_server_options" = "Власні налаштування сервера"; "auth_email_validation_message" = "Перевірте свою пошту для продовження реєстрації"; @@ -79,7 +79,7 @@ "auth_msisdn_validation_message" = "Ми надіслали СМС із кодом активації. Введіть цей код унизу."; "auth_msisdn_validation_error" = "Не вдалося перевірити номер телефону."; "auth_recaptcha_message" = "Цей домашній сервер бажає переконатися, що ви не робот"; -"auth_reset_password_message" = "Щоб відновити пароль, введіть адресу е-пошти, пов'язану з вашим обліковим записом:"; +"auth_reset_password_message" = "Щоб відновити пароль облікового запису Matrix, введіть адресу е-пошти, пов'язану з вашим обліковим записом:"; "auth_reset_password_missing_email" = "Необхідно ввести адресу е-пошти, пов'язану з вашим обліковим записом."; // String for App Store "store_short_description" = "Захищений, децентралізований чат/VoIP"; @@ -89,16 +89,16 @@ "auth_add_email_message_2" = "Вкажіть е-пошту для відновлення облікового запису, а також для можливості знаходження вас іншими користувачами."; "auth_add_phone_message_2" = "Вкажіть номер телефону для можливості знаходження вас іншими користувачами."; "auth_add_email_phone_message_2" = "Вкажіть е-пошту для відновлення облікового запису. Використовуйте електронну пошту чи номер телефону для можливості знаходження вас іншими користувачами."; -"auth_email_is_required" = "Ідентифікаційний сервер не налаштовано, тому ви не можете додати адресу електронної пошти, щоб мати можливість відновити пароль в майбутньому."; -"auth_phone_is_required" = "Ідентифікаційний сервер не налаштовано, тому ви не можете додати номер телефону, щоб мати можливість відновити пароль в майбутньому."; -"auth_forgot_password_error_no_configured_identity_server" = "Ідентифікаційний сервер не налаштовано: додайте його, щоб мати можливість відновити пароль в майбутньому."; +"auth_email_is_required" = "Сервер ідентифікації не налаштовано, тому ви не можете додати адресу електронної пошти, щоб мати можливість відновити пароль облікового запису Matrix у майбутньому."; +"auth_phone_is_required" = "Сервер ідентифікації не налаштовано, тому ви не можете додати номер телефону, щоб мати можливість відновити пароль облікового запису Matrix у майбутньому."; +"auth_forgot_password_error_no_configured_identity_server" = "Сервер ідентифікації не налаштовано: додайте його, щоб мати можливість відновити пароль облікового запису Matrix у майбутньому."; "auth_reset_password_missing_password" = "Необхідно ввести новий пароль."; "auth_reset_password_email_validation_message" = "На адресу %@ надіслано лист. Після переходу за посиланням в листі, натисніть внизу."; "auth_reset_password_next_step_button" = "Я підтверджую свою адресу е-пошти"; "auth_reset_password_error_unauthorized" = "Не вдалося перевірити е-пошту: переконайтеся, що ви перейшли за посиланням у листі"; "auth_reset_password_error_not_found" = "Схоже, ваша адреса електронної пошти не пов'язана з жодним Matrix ID на цьому домашньому сервері."; -"auth_reset_password_error_is_required" = "Ідентифікаційний сервер не налаштовано: додайте його в параметрах сервера, щоб мати можливість відновити пароль в майбутньому."; -"auth_reset_password_success_message" = "Ваш пароль було скинуто.\n\nСеанс входу завершено на всіх сесіях і припинено отримання push-сповіщень. Щоб активувати сповіщення, виконайте вхід з новим паролем на кожному пристрої."; +"auth_reset_password_error_is_required" = "Сервер ідентифікації не налаштовано: додайте його у параметрах сервера, щоб мати можливість відновити пароль облікового запису Matrix у майбутньому."; +"auth_reset_password_success_message" = "Ваш пароль облікового запису Matrix було скинуто.\n\nСеанс входу завершено у всіх сеансах і припинено отримання push-сповіщень. Щоб активувати сповіщення, увійдіть з новим паролем на кожному пристрої."; "auth_add_email_and_phone_warning" = "Реєстрація за допомогою електронної пошти і номера телефону водночас не підтримується, доки немає API. Лише номер телефону буде додано до облікового запису. Ви можете додати електронну пошту до свого профілю в налаштуваннях."; "auth_accept_policies" = "Ознайомтесь та прийміть правила цього домашнього сервера:"; "auth_softlogout_signed_out" = "Ви вийшли"; @@ -231,7 +231,7 @@ "settings_enable_push_notif" = "Сповіщення на цьому пристрої"; "settings_fail_to_update_profile" = "Не вдалося оновити профіль"; "settings_night_mode" = "Нічний режим"; -"settings_change_password" = "Змінити пароль"; +"settings_change_password" = "Змінити пароль облікового запису Matrix"; "settings_add_phone_number" = "Додати номер телефону"; "settings_phone_number" = "Телефон"; "settings_add_email_address" = "Додати адресу е-пошти"; @@ -832,8 +832,8 @@ "settings_add_3pid_password_title_msidsn" = "Додати номер телефону"; "settings_device_notifications" = "Сповіщення пристрою"; "settings_add_3pid_password_title_email" = "Додати адресу е-пошти"; -"settings_password_updated" = "Пароль оновлено"; -"settings_fail_to_update_password" = "Не вдалося оновити пароль"; +"settings_password_updated" = "Пароль облікового запису Matrix оновлено"; +"settings_fail_to_update_password" = "Не вдалося оновити пароль облікового запису Matrix"; "settings_confirm_password" = "підтвердити пароль"; "settings_new_password" = "новий пароль"; "settings_old_password" = "старий пароль"; @@ -862,8 +862,8 @@ "settings_crypto_device_id" = "\nID сеансу: "; "settings_crypto_device_name" = "Назва сеансу: "; "settings_add_3pid_invalid_password_message" = "Хибні облікові дані"; -"settings_add_3pid_password_message" = "Щоб продовжити, введіть пароль"; -"deactivate_account_password_alert_message" = "Щоб продовжити, введіть пароль"; +"settings_add_3pid_password_message" = "Щоб продовжити, введіть пароль облікового запису Matrix"; +"deactivate_account_password_alert_message" = "Щоб продовжити, введіть пароль облікового запису Matrix"; // Deactivate account @@ -970,7 +970,7 @@ "room_event_action_report" = "Поскаржитися на вміст"; "room_event_action_view_decrypted_source" = "Переглянути розшифроване джерело"; "room_event_action_view_source" = "Переглянути джерело"; -"room_event_action_permalink" = "Постійне посилання"; +"room_event_action_permalink" = "Скопіювати посилання на повідомлення"; "room_event_action_forward" = "Переслати"; "room_resend_unsent_messages" = "Повторно надіслати не надіслані повідомлення"; "room_prompt_cancel" = "скасувати всі"; @@ -1034,7 +1034,7 @@ // AuthenticatedSessionViewControllerFactory "authenticated_session_flow_not_supported" = "Цей застосунок не підтримує способу входу, доступного на вашому домашньому сервері."; -"security_settings_user_password_description" = "Підтвердьте свою особу, ввівши пароль свого облікового запису"; +"security_settings_user_password_description" = "Підтвердьте свою особу, ввівши пароль свого облікового запису Matrix"; "security_settings_coming_soon" = "Вибачте, ця дія ще не доступна в %@ iOS. Якщо налаштуєте це іншим клієнтом Matrix, %@ iOS зможе також це використати."; "security_settings_complete_security_alert_message" = "Спершу слід доповнити захист вашого поточного сеансу."; "security_settings_blacklist_unverified_devices_description" = "Звірте всі сеанси користувача, щоб позначити його довіреним і надіслати йому повідомлення."; @@ -1043,7 +1043,7 @@ "security_settings_crosssigning_info_trusted" = "Перехресне підписування увімкнено. Ви можете робити інших користувачів і свої інші сеанси довіреними на підставі перехресного підпису, але ви не можете перехресно підписувати цим сеансом, бо в нього ще нема закритих ключів перехресного підписування. Доповніть захист цього сеансу."; "security_settings_crosssigning_info_exists" = "Ваш обліковий запис має ідентичність перехресного підписування, але вона ще не довірена цим сеансом. Доповніть захист цього сеансу."; "security_settings_secure_backup_description" = "Зробіть резервну копію своїх ключів шифрування й даних облікового запису на випадок втрати доступу до своїх сеансів. Ваші ключі будуть захищені унікальним ключем безпеки."; -"security_settings_crypto_sessions_description_2" = "Якщо не впізнаєте вхід, скиньте пароль і налаштування безпечного резервного копіювання."; +"security_settings_crypto_sessions_description_2" = "Якщо не впізнаєте сеанс, скиньте пароль облікового запису Matrix і налаштування безпечного резервного копіювання."; "settings_identity_server_no_is_description" = "Зараз ви не використовуєте сервер ідентифікації. Щоб знаходити наявні контакти й вони знаходили вас, додайте сервер угорі."; "settings_identity_server_description" = "Налаштований угорі сервер ідентифікації дає вам змогу знаходити людей за наявними контактами, а їм знаходити вас."; "settings_discovery_three_pid_details_information_phone_number" = "Керуйте параметрами для цього номера телефону, за яким інші користувачі можуть вас знаходити й запрошувати до кімнат. Додавайте й видаляйте номери в Облікових записах."; @@ -1109,7 +1109,7 @@ // Banner "cross_signing_setup_banner_title" = "Налаштування шифрування"; -"secrets_reset_authentication_message" = "Введіть пароль свого облікового запису, щоб продовжити"; +"secrets_reset_authentication_message" = "Введіть пароль свого облікового запису Matrix, щоб продовжити"; "security_settings_blacklist_unverified_devices" = "Ніколи не надсилати повідомлення не довіреним сеансам"; "security_settings_advanced" = "ДОДАТКОВО"; "security_settings_export_keys_manually" = "Експорт ключів вручну"; @@ -1357,7 +1357,7 @@ "secrets_setup_recovery_passphrase_title" = "Встановіть фразу безпеки"; "secrets_setup_recovery_passphrase_information" = "Введіть відому лише вам фразу безпеки для захисту таємниць на вашому сервері."; -"secrets_setup_recovery_passphrase_additional_information" = "Не застосовуйте пароль облікового запису повторно."; +"secrets_setup_recovery_passphrase_additional_information" = "Не застосовуйте пароль облікового запису Matrix повторно."; "secrets_setup_recovery_passphrase_confirm_information" = "Для підтвердження введіть таємну фразу ще раз."; "secure_key_backup_setup_existing_backup_error_title" = "Резервна копія повідомлень уже існує"; "secure_key_backup_setup_existing_backup_error_info" = "Розблокуйте її, щоб продовжити попереднє захищене резервне копіювання, або видаліть її, щоб почати захищене резервне копіювання повідомлень заново."; @@ -1590,7 +1590,7 @@ "key_backup_setup_intro_title" = "Ніколи не втрачайте зашифровані повідомлення"; "key_backup_setup_intro_info" = "Повідомлення в зашифрованих кімнатах захищені наскрізним шифруванням. Тільки ви та одержувачі маєте ключі для читання цих повідомлень.\n\nСтворіть захищену резервну копію ключів, щоб їх не втратити."; -"key_backup_setup_passphrase_info" = "Ми збережемо зашифровану копію ваших ключів на нашому сервері. Захистіть свою резервну копію парольною фразою.\n\nДля максимальної безпеки фраза повинна відрізнятися від пароля вашого облікового запису."; +"key_backup_setup_passphrase_info" = "Ми збережемо зашифровану копію ваших ключів на нашому сервері. Захистіть свою резервну копію парольною фразою.\n\nДля максимальної безпеки фраза повинна відрізнятися від пароля вашого облікового запису Matrix."; "key_backup_setup_passphrase_set_passphrase_action" = "Встановити фразу"; // MARK: Key backup recover @@ -1738,3 +1738,35 @@ "poll_edit_form_update_failure_subtitle" = "Повторіть спробу"; "poll_edit_form_update_failure_title" = "Не вдалося оновити опитування"; "poll_edit_form_poll_type" = "Тип опитування"; +"location_sharing_post_failure_subtitle" = "%@ не може отримати доступ до вашого місцеперебування. Повторіть спробу пізніше."; +"location_sharing_post_failure_title" = "Ми не можемо надіслати дані про ваше місцеперебування"; +"home_context_menu_leave" = "Вийти"; +"home_context_menu_normal_priority" = "Звичайна пріоритетність"; +"home_context_menu_low_priority" = "Неважливі"; +"home_context_menu_unfavourite" = "Вилучити з улюблених"; +"home_context_menu_favourite" = "Улюблені"; +"home_context_menu_unmute" = "Увімкнути звук"; +"home_context_menu_mute" = "Без звуку"; +"home_context_menu_notifications" = "Сповіщення"; +"home_context_menu_make_room" = "Перемістити на вкладку «Кімнати»"; +"home_context_menu_make_dm" = "Перемістити на вкладку «Люди»"; +"event_formatter_message_deleted" = "Повідомлення видалено"; +"settings_labs_enable_threads" = "Треди спілкування"; +"message_from_a_thread" = "З треду"; +"threads_empty_show_all_threads" = "Показати всі треди"; +"threads_empty_tip" = "Порада: Торкніться повідомлення та натисніть «Тред», щоб розпочати його."; +"threads_empty_info_my" = "Відповідайте у поточний тред або торкніться повідомлення та натисніть «Тред», щоб почати новий."; +"threads_empty_info_all" = "Треди допомагають підтримувати розмови за темою та за ними легко стежити."; +"threads_empty_title" = "Спілкуйтеся за темою в тредах"; +"threads_action_my_threads" = "Мої треди"; +"threads_action_all_threads" = "Усі треди"; +"threads_title" = "Треди"; +"thread_copy_link_to_thread" = "Копіювати посилання на тред"; + +// MARK: Threads +"room_thread_title" = "Тред"; +"room_accessibility_thread_more" = "Більше"; +"room_accessibility_threads" = "Треди"; +"room_event_copy_link_info" = "Посилання скопійовано до буфера обміну."; +"room_event_action_reply_in_thread" = "Тред"; +"room_event_action_view_in_room" = "Переглянути у кімнаті"; diff --git a/Riot/Assets/zh_Hans.lproj/Vector.strings b/Riot/Assets/zh_Hans.lproj/Vector.strings index 12863f8fa..181d299c6 100644 --- a/Riot/Assets/zh_Hans.lproj/Vector.strings +++ b/Riot/Assets/zh_Hans.lproj/Vector.strings @@ -251,7 +251,7 @@ "settings_labs" = "实验室"; "settings_devices" = "会话"; "settings_cryptography" = "加密"; -"settings_sign_out" = "离开"; +"settings_sign_out" = "退出登陆"; "settings_sign_out_confirmation" = "你确定?"; "settings_sign_out_e2e_warn" = "您将丢失所有端对端加密密钥。这意味着在此设备上您将再也无法阅读已加密聊天室里的旧消息。"; "settings_profile_picture" = "档案图片"; @@ -1605,3 +1605,8 @@ "settings_analytics_and_crash_data" = "发送崩溃和分析数据"; "accessibility_button_label" = "按钮"; "enable" = "启用"; +"onboarding_splash_page_1_message" = "独立安全的通信,为您提供与家中面谈相同的私密性。"; +"onboarding_splash_page_1_title" = "掌控你的对话。"; + +// Onboarding +"onboarding_splash_register_button_title" = "注册"; diff --git a/Riot/Categories/UIView+Toast.swift b/Riot/Categories/UIView+Toast.swift index b89d63ac1..1d3205704 100644 --- a/Riot/Categories/UIView+Toast.swift +++ b/Riot/Categories/UIView+Toast.swift @@ -60,7 +60,7 @@ extension UIView { duration: TimeInterval = Constants.defaultDuration, position: ToastPosition = Constants.defaultPosition, additionalMargin: CGFloat = 0.0) { - let view = BasicToastView(withMessage: message, image: image) + let view = RectangleToastView(withMessage: message, image: image) vc_toast(view: view, duration: duration, position: position, additionalMargin: additionalMargin) } diff --git a/Riot/Generated/Images.swift b/Riot/Generated/Images.swift index b2ca9b9e8..df3b02a27 100644 --- a/Riot/Generated/Images.swift +++ b/Riot/Generated/Images.swift @@ -124,6 +124,7 @@ internal class Asset: NSObject { internal static let onboardingSplashScreenPage3Dark = ImageAsset(name: "OnboardingSplashScreenPage3Dark") internal static let onboardingSplashScreenPage4 = ImageAsset(name: "OnboardingSplashScreenPage4") internal static let onboardingSplashScreenPage4Dark = ImageAsset(name: "OnboardingSplashScreenPage4Dark") + internal static let onboardingCongratulationsIcon = ImageAsset(name: "onboarding_congratulations_icon") internal static let onboardingUseCaseCommunity = ImageAsset(name: "onboarding_use_case_community") internal static let onboardingUseCaseCommunityDark = ImageAsset(name: "onboarding_use_case_community_dark") internal static let onboardingUseCaseIcon = ImageAsset(name: "onboarding_use_case_icon") diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 0285a13be..12d72df17 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -1687,6 +1687,10 @@ public class VectorL10n: NSObject { public static func homeEmptyViewTitle(_ p1: String, _ p2: String) -> String { return VectorL10n.tr("Vector", "home_empty_view_title", p1, p2) } + /// Syncing + public static var homeSyncing: String { + return VectorL10n.tr("Vector", "home_syncing") + } /// Could not connect to the homeserver. public static var homeserverConnectionLost: String { return VectorL10n.tr("Vector", "homeserver_connection_lost") @@ -3847,6 +3851,10 @@ public class VectorL10n: NSObject { public static var roomParticipantsInvitedSection: String { return VectorL10n.tr("Vector", "room_participants_invited_section") } + /// Leaving + public static var roomParticipantsLeaveProcessing: String { + return VectorL10n.tr("Vector", "room_participants_leave_processing") + } /// Are you sure you want to leave the room? public static var roomParticipantsLeavePromptMsg: String { return VectorL10n.tr("Vector", "room_participants_leave_prompt_msg") @@ -3863,6 +3871,10 @@ public class VectorL10n: NSObject { public static var roomParticipantsLeavePromptTitleForDm: String { return VectorL10n.tr("Vector", "room_participants_leave_prompt_title_for_dm") } + /// Left room + public static var roomParticipantsLeaveSuccess: String { + return VectorL10n.tr("Vector", "room_participants_leave_success") + } /// %d participants public static func roomParticipantsMultiParticipants(_ p1: Int) -> String { return VectorL10n.tr("Vector", "room_participants_multi_participants", p1) diff --git a/Riot/Generated/UntranslatedStrings.swift b/Riot/Generated/UntranslatedStrings.swift new file mode 100644 index 000000000..efc032506 --- /dev/null +++ b/Riot/Generated/UntranslatedStrings.swift @@ -0,0 +1,31 @@ +// swiftlint:disable all +// Generated using SwiftGen, by O.Halligon — https://github.com/SwiftGen/SwiftGen + +import Foundation + +// swiftlint:disable superfluous_disable_command +// swiftlint:disable file_length + +// MARK: - Strings + +// swiftlint:disable function_parameter_count identifier_name line_length type_body_length +public extension VectorL10n { + /// Take me home + static var onboardingCongratulationsHomeButton: String { + return VectorL10n.tr("Untranslated", "onboarding_congratulations_home_button") + } + /// Your account\n%@\nhas been created. + public static func onboardingCongratulationsMessage(_ p1: String) -> String { + return VectorL10n.tr("Untranslated", "onboarding_congratulations_message", p1) + } + /// Personalise profile + static var onboardingCongratulationsPersonaliseButton: String { + return VectorL10n.tr("Untranslated", "onboarding_congratulations_personalise_button") + } + /// Congratulations! + static var onboardingCongratulationsTitle: String { + return VectorL10n.tr("Untranslated", "onboarding_congratulations_title") + } +} +// swiftlint:enable function_parameter_count identifier_name line_length type_body_length + diff --git a/Riot/Modules/Analytics/Analytics.swift b/Riot/Modules/Analytics/Analytics.swift index 48716f78e..abdeb8527 100644 --- a/Riot/Modules/Analytics/Analytics.swift +++ b/Riot/Modules/Analytics/Analytics.swift @@ -50,8 +50,8 @@ import AnalyticsEvents /// Whether to show the user the analytics opt in prompt. var shouldShowAnalyticsPrompt: Bool { - // Only show the prompt once, and when analytics are configured in BuildSettings. - !RiotSettings.shared.hasSeenAnalyticsPrompt && PHGPostHogConfiguration.standard != nil + // Only show the prompt once, and when analytics are enabled in BuildSettings. + !RiotSettings.shared.hasSeenAnalyticsPrompt && BuildSettings.analyticsConfiguration.isEnabled } /// Indicates whether the user previously accepted Matomo analytics and should be shown the upgrade prompt. diff --git a/Riot/Modules/Analytics/PHGPostHogConfiguration.swift b/Riot/Modules/Analytics/PHGPostHogConfiguration.swift index c02b85c30..8bed04920 100644 --- a/Riot/Modules/Analytics/PHGPostHogConfiguration.swift +++ b/Riot/Modules/Analytics/PHGPostHogConfiguration.swift @@ -18,11 +18,12 @@ import PostHog extension PHGPostHogConfiguration { static var standard: PHGPostHogConfiguration? { - guard let apiKey = BuildSettings.analyticsKey, let host = BuildSettings.analyticsHost else { return nil } + let analyticsConfiguration = BuildSettings.analyticsConfiguration + guard analyticsConfiguration.isEnabled else { return nil } - let configuration = PHGPostHogConfiguration(apiKey: apiKey, host: host) - configuration.shouldSendDeviceID = false + let postHogConfiguration = PHGPostHogConfiguration(apiKey: analyticsConfiguration.apiKey, host: analyticsConfiguration.host) + postHogConfiguration.shouldSendDeviceID = false - return configuration + return postHogConfiguration } } diff --git a/Riot/Modules/Application/AppCoordinator.swift b/Riot/Modules/Application/AppCoordinator.swift index 8f1b61d58..93ae25fe5 100755 --- a/Riot/Modules/Application/AppCoordinator.swift +++ b/Riot/Modules/Application/AppCoordinator.swift @@ -322,15 +322,40 @@ fileprivate class AppNavigator: AppNavigatorProtocol { self.appCoordinator.navigate(to: destination) } - func addLoadingActivity() -> Activity { - let presenter = ActivityIndicatorToastPresenter( - text: VectorL10n.roomParticipantsSecurityLoading, - navigationController: appNavigationVC - ) - let request = ActivityRequest( - presenter: presenter, - dismissal: .manual - ) - return ActivityCenter.shared.add(request) + func addUserIndicator(_ type: AppUserIndicatorType) -> UserIndicator { + let request = userIndicatorRequest(for: type) + return UserIndicatorQueue.shared.add(request) + } + + // MARK: - Private + + private func userIndicatorRequest(for type: AppUserIndicatorType) -> UserIndicatorRequest { + switch type { + case let .loading(label): + let presenter = ToastUserIndicatorPresenter( + viewState: .init( + style: .loading, + label: label + ), + navigationController: appNavigationVC + ) + return UserIndicatorRequest( + presenter: presenter, + dismissal: .manual + ) + case let .success(label): + let presenter = ToastUserIndicatorPresenter( + viewState: .init( + style: .success, + label: label + ), + navigationController: appNavigationVC + ) + return UserIndicatorRequest( + presenter: presenter, + dismissal: .timeout(1.5) + ) + } } } + diff --git a/Riot/Modules/Application/AppNavigator.swift b/Riot/Modules/Application/AppNavigator.swift index c33b572f4..dd0eff1eb 100644 --- a/Riot/Modules/Application/AppNavigator.swift +++ b/Riot/Modules/Application/AppNavigator.swift @@ -17,6 +17,15 @@ import Foundation import CommonKit +/// Type of indicator to be shown in the app navigator +enum AppUserIndicatorType { + /// Loading toast with custom label + case loading(String) + + /// Success toast with custom label + case success(String) +} + /// AppNavigatorProtocol abstract a navigator at app level. /// It enables to perform the navigation within the global app scope (open the side menu, open a room and so on) /// Note: Presentation of the pattern here https://www.swiftbysundell.com/articles/navigation-in-swift/#where-to-navigator @@ -28,11 +37,11 @@ protocol AppNavigatorProtocol { /// Do not use protocol with associatedtype for the moment like presented here https://www.swiftbysundell.com/articles/navigation-in-swift/#where-to-navigator use a separate enum func navigate(to destination: AppNavigatorDestination) - /// Add loading activity to an app-wide queue of other activitie + /// Add new indicator, such as loading spinner or a success message, to an app-wide queue of other indicators /// - /// If the queue is empty, the activity will be displayed immediately, otherwise it will be pending - /// until the previously added activities have completed / been cancelled. + /// If the queue is empty, the indicator will be displayed immediately, otherwise it will be pending + /// until the previously added indicator have completed / been cancelled. /// - /// To remove an activity indicator, cancel or deallocate the returned `Activity` - func addLoadingActivity() -> Activity + /// To remove an indicator, cancel or deallocate the returned `UserIndicator` + func addUserIndicator(_ type: AppUserIndicatorType) -> UserIndicator } diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 1c74e5ede..628a76508 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -369,6 +369,24 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni // Create message sound NSURL *messageSoundURL = [[NSBundle mainBundle] URLForResource:@"message" withExtension:@"caf"]; AudioServicesCreateSystemSoundID((__bridge CFURLRef)messageSoundURL, &_messageSound); + + // Set up runtime language and fallback by considering the userDefaults object shared within the application group. + NSUserDefaults *sharedUserDefaults = [MXKAppSettings standardAppSettings].sharedUserDefaults; + NSString *language = [sharedUserDefaults objectForKey:@"appLanguage"]; + if (!language) + { + // Check whether a langage was only defined at the Riot application level. + language = [[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]; + if (language) + { + // Move this setting into the shared userDefaults object to apply it to the extensions. + [sharedUserDefaults setObject:language forKey:@"appLanguage"]; + + [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"appLanguage"]; + } + } + [NSBundle mxk_setLanguage:language]; + [NSBundle mxk_setFallbackLanguage:@"en"]; // Set app info now as Mac (Designed for iPad) accesses it before didFinishLaunching is called self.appInfo = AppInfo.current; @@ -411,24 +429,6 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni // Set up theme ThemeService.shared.themeId = RiotSettings.shared.userInterfaceTheme; - // Set up runtime language and fallback by considering the userDefaults object shared within the application group. - NSUserDefaults *sharedUserDefaults = [MXKAppSettings standardAppSettings].sharedUserDefaults; - NSString *language = [sharedUserDefaults objectForKey:@"appLanguage"]; - if (!language) - { - // Check whether a langage was only defined at the Riot application level. - language = [[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]; - if (language) - { - // Move this setting into the shared userDefaults object to apply it to the extensions. - [sharedUserDefaults setObject:language forKey:@"appLanguage"]; - - [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"appLanguage"]; - } - } - [NSBundle mxk_setLanguage:language]; - [NSBundle mxk_setFallbackLanguage:@"en"]; - mxSessionArray = [NSMutableArray array]; callEventsListeners = [NSMutableDictionary dictionary]; diff --git a/Riot/Modules/Authentication/AuthenticationCoordinator.swift b/Riot/Modules/Authentication/AuthenticationCoordinator.swift index 865161941..f9d8787aa 100644 --- a/Riot/Modules/Authentication/AuthenticationCoordinator.swift +++ b/Riot/Modules/Authentication/AuthenticationCoordinator.swift @@ -28,6 +28,8 @@ final class AuthenticationCoordinator: NSObject, AuthenticationCoordinatorProtoc private let navigationRouter: NavigationRouterType private let authenticationViewController: AuthenticationViewController + private var canPresentAdditionalScreens: Bool + private var isWaitingToPresentCompleteSecurity = false private let crossSigningService = CrossSigningService() /// The password entered, for use when setting up cross-signing. @@ -45,6 +47,7 @@ final class AuthenticationCoordinator: NSObject, AuthenticationCoordinatorProtoc init(parameters: AuthenticationCoordinatorParameters) { self.navigationRouter = parameters.navigationRouter + self.canPresentAdditionalScreens = parameters.canPresentAdditionalScreens let authenticationViewController = AuthenticationViewController() self.authenticationViewController = authenticationViewController @@ -91,6 +94,17 @@ final class AuthenticationCoordinator: NSObject, AuthenticationCoordinatorProtoc authenticationViewController.continueSSOLogin(withToken: loginToken, txnId: transactionID) } + func presentPendingScreensIfNecessary() { + canPresentAdditionalScreens = true + + showLoadingAnimation() + + if isWaitingToPresentCompleteSecurity { + isWaitingToPresentCompleteSecurity = false + presentCompleteSecurity() + } + } + // MARK: - Private private func showLoadingAnimation() { @@ -102,7 +116,13 @@ final class AuthenticationCoordinator: NSObject, AuthenticationCoordinatorProtoc navigationRouter.setRootModule(loadingViewController) } - private func presentCompleteSecurity(with session: MXSession) { + private func presentCompleteSecurity() { + guard let session = session else { + MXLog.error("[AuthenticationCoordinator] presentCompleteSecurity: Unable to present security due to missing session.") + authenticationDidComplete() + return + } + let isNewSignIn = true let keyVerificationCoordinator = KeyVerificationCoordinator(session: session, flow: .completeSecurity(isNewSignIn)) @@ -115,7 +135,7 @@ final class AuthenticationCoordinator: NSObject, AuthenticationCoordinatorProtoc } private func authenticationDidComplete() { - completion?(.didComplete(authenticationViewController.authType)) + completion?(.didComplete) } private func registerSessionStateChangeNotification(for session: MXSession) { @@ -183,8 +203,14 @@ final class AuthenticationCoordinator: NSObject, AuthenticationCoordinatorProtoc self.authenticationDidComplete() } case .crossSigningExists: + guard self.canPresentAdditionalScreens else { + MXLog.debug("[AuthenticationCoordinator] sessionStateDidChange: Delaying presentCompleteSecurity during onboarding.") + self.isWaitingToPresentCompleteSecurity = true + return + } + MXLog.debug("[AuthenticationCoordinator] sessionStateDidChange: Complete security") - self.presentCompleteSecurity(with: session) + self.presentCompleteSecurity() default: MXLog.debug("[AuthenticationCoordinator] sessionStateDidChange: Nothing to do") @@ -211,8 +237,10 @@ extension AuthenticationCoordinator: AuthenticationViewControllerDelegate { self.session = session self.password = password - self.showLoadingAnimation() - completion?(.didLogin(session)) + if canPresentAdditionalScreens { + showLoadingAnimation() + } + completion?(.didLogin(session: session, authenticationType: authenticationViewController.authType)) } } diff --git a/Riot/Modules/Authentication/AuthenticationCoordinatorProtocol.swift b/Riot/Modules/Authentication/AuthenticationCoordinatorProtocol.swift index c024cddbe..f04676861 100644 --- a/Riot/Modules/Authentication/AuthenticationCoordinatorProtocol.swift +++ b/Riot/Modules/Authentication/AuthenticationCoordinatorProtocol.swift @@ -20,14 +20,16 @@ import Foundation struct AuthenticationCoordinatorParameters { let navigationRouter: NavigationRouterType + /// Whether or not the coordinator should show the loading spinner, key verification etc. + let canPresentAdditionalScreens: Bool } enum AuthenticationCoordinatorResult { /// The user has authenticated but key verification is yet to happen. The session value is /// for a fresh session that still needs to load, sync etc before being ready. - case didLogin(MXSession) + case didLogin(session: MXSession, authenticationType: MXKAuthenticationType) /// All of the required authentication steps including key verification is complete. - case didComplete(MXKAuthenticationType) + case didComplete } /// `AuthenticationCoordinatorProtocol` is a protocol describing a Coordinator that handle's the authentication navigation flow. @@ -52,4 +54,8 @@ protocol AuthenticationCoordinatorProtocol: Coordinator, Presentable { /// When SSO login succeeded, when SFSafariViewController is used, continue login with success parameters. func continueSSOLogin(withToken loginToken: String, transactionID: String) -> Bool + + /// Indicates to the coordinator to display any pending screens if it was created with + /// the `canPresentAdditionalScreens` parameter set to `false` + func presentPendingScreensIfNecessary() } diff --git a/Riot/Modules/Common/ActivityIndicator/AppActivityIndicatorPresenter.swift b/Riot/Modules/Common/ActivityIndicator/AppActivityIndicatorPresenter.swift deleted file mode 100644 index 53a5d2453..000000000 --- a/Riot/Modules/Common/ActivityIndicator/AppActivityIndicatorPresenter.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// Copyright 2021 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Foundation -import UIKit -import MatrixSDK -import CommonKit - -/// Presenter which displays activity / loading indicators using app-wide `AppNavigator`, thus displaying them in a unified way, -/// and `ActivityCenter`/`Activity`, which ensures that only one activity is shown at a given time. -/// -/// Note: clients can skip using `AppActivityIndicatorPresenter` and instead coordiinate with `AppNavigatorProtocol` directly. -/// The presenter exists mostly as a transition for view controllers already using `ActivityIndicatorPresenterType` and / or view controllers -/// written in objective-c. -@objc final class AppActivityIndicatorPresenter: NSObject, ActivityIndicatorPresenterType { - private let appNavigator: AppNavigatorProtocol - private var activity: Activity? - - init(appNavigator: AppNavigatorProtocol) { - self.appNavigator = appNavigator - } - - @objc func presentActivityIndicator() { - activity = appNavigator.addLoadingActivity() - } - - @objc func removeCurrentActivityIndicator(animated: Bool, completion: (() -> Void)?) { - activity = nil - } - - func presentActivityIndicator(on view: UIView, animated: Bool, completion: (() -> Void)?) { - MXLog.error("[AppActivityIndicatorPresenter] Shared activity indicator does not support presenting from custom views") - } -} diff --git a/Riot/Modules/Common/ActivityIndicator/AppUserIndicatorPresenter.swift b/Riot/Modules/Common/ActivityIndicator/AppUserIndicatorPresenter.swift new file mode 100644 index 000000000..245b5e323 --- /dev/null +++ b/Riot/Modules/Common/ActivityIndicator/AppUserIndicatorPresenter.swift @@ -0,0 +1,62 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import UIKit +import MatrixSDK +import CommonKit + +/// Presenter which displays loading spinners using app-wide `AppNavigator`, thus displaying them in a unified way, +/// and `UserIndicatorCenter`/`UserIndicator`, which ensures that only one indicator is shown at a given time. +/// +/// Note: clients can skip using `AppUserIndicatorPresenter` and instead coordinate with `AppNavigatorProtocol` directly. +/// The presenter exists mostly as a transition for view controllers already using `ActivityIndicatorPresenterType` and / or view controllers +/// written in objective-c. +@objc final class AppUserIndicatorPresenter: NSObject, ActivityIndicatorPresenterType { + private let appNavigator: AppNavigatorProtocol + private var loadingIndicator: UserIndicator? + private var otherIndicators = [UserIndicator]() + + init(appNavigator: AppNavigatorProtocol) { + self.appNavigator = appNavigator + } + + @objc func presentActivityIndicator() { + presentActivityIndicator(label: VectorL10n.homeSyncing) + } + + @objc func presentActivityIndicator(label: String) { + guard loadingIndicator == nil || loadingIndicator?.state == .completed else { + // The app is very liberal with calling `presentActivityIndicator` (often not matched by corresponding `removeCurrentActivityIndicator`), + // so there is no reason to keep adding new indiciators if there is one already showing. + return + } + + loadingIndicator = appNavigator.addUserIndicator(.loading(label)) + } + + @objc func removeCurrentActivityIndicator(animated: Bool, completion: (() -> Void)?) { + loadingIndicator = nil + } + + func presentActivityIndicator(on view: UIView, animated: Bool, completion: (() -> Void)?) { + MXLog.error("[AppUserIndicatorPresenter] Shared indicator presenter does not support presenting from custom views") + } + + @objc func presentSuccess(label: String) { + appNavigator.addUserIndicator(.success(label)).store(in: &otherIndicators) + } +} diff --git a/Riot/Modules/Common/ActivityIndicator/FullscreenActivityIndicatorPresenter.swift b/Riot/Modules/Common/ActivityIndicator/FullscreenActivityIndicatorPresenter.swift new file mode 100644 index 000000000..610f56f13 --- /dev/null +++ b/Riot/Modules/Common/ActivityIndicator/FullscreenActivityIndicatorPresenter.swift @@ -0,0 +1,53 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import CommonKit +import UIKit + +/// Presenter which displays fullscreen loading spinners, and conforming to legacy `ActivityIndicatorPresenterType`, +/// but interally wrapping an `UserIndicatorPresenter` which is used in conjuction with `UserIndicator` and `UserIndicatorQueue`. +/// +/// Note: clients can skip using `FullscreenActivityIndicatorPresenter` and instead coordinate with `AppNavigatorProtocol` directly. +/// The presenter exists mostly as a transition for view controllers already using `ActivityIndicatorPresenterType` and / or view controllers +/// written in objective-c. +@objc final class FullscreenActivityIndicatorPresenter: NSObject, ActivityIndicatorPresenterType { + private let label: String + private weak var viewController: UIViewController? + private var indicator: UserIndicator? + + init(label: String, viewController: UIViewController) { + self.label = label + self.viewController = viewController + } + + func presentActivityIndicator(on view: UIView, animated: Bool, completion: (() -> Void)?) { + guard let viewController = viewController else { + return + } + + let request = UserIndicatorRequest( + presenter: FullscreenLoadingIndicatorPresenter(label: label, viewController: viewController), + dismissal: .manual + ) + + indicator = UserIndicatorQueue.shared.add(request) + } + + @objc func removeCurrentActivityIndicator(animated: Bool, completion: (() -> Void)?) { + indicator?.cancel() + } +} diff --git a/Riot/Modules/Common/ActivityIndicator/UIKit/LabelledActivityIndicatorView.swift b/Riot/Modules/Common/ActivityIndicator/UIKit/LabelledActivityIndicatorView.swift new file mode 100644 index 000000000..266237bd4 --- /dev/null +++ b/Riot/Modules/Common/ActivityIndicator/UIKit/LabelledActivityIndicatorView.swift @@ -0,0 +1,100 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import UIKit +import MatrixSDK + +final class LabelledActivityIndicatorView: UIView, Themable { + private enum Constants { + static let padding = UIEdgeInsets(top: 20, left: 40, bottom: 15, right: 40) + static let activityIndicatorScale = CGFloat(1.5) + static let cornerRadius: CGFloat = 12.0 + static let stackBackgroundOpacity: CGFloat = 0.9 + static let stackSpacing: CGFloat = 15 + static let backgroundOpacity: CGFloat = 0.5 + } + + private let stackBackgroundView: UIView = { + let view = UIView() + view.layer.cornerRadius = Constants.cornerRadius + view.alpha = Constants.stackBackgroundOpacity + return view + }() + + private let stackView: UIStackView = { + let stack = UIStackView() + stack.axis = .vertical + stack.distribution = .fill + stack.alignment = .center + stack.spacing = Constants.stackSpacing + return stack + }() + + private let activityIndicator: UIActivityIndicatorView = { + let view = UIActivityIndicatorView() + view.transform = .init(scaleX: Constants.activityIndicatorScale, y: Constants.activityIndicatorScale) + view.startAnimating() + return view + }() + + private let label: UILabel = { + return UILabel() + }() + + init(text: String) { + super.init(frame: .zero) + setup(text: text) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setup(text: String) { + setupStackView() + label.text = text + } + + private func setupStackView() { + addSubview(stackView) + stackView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + stackView.centerXAnchor.constraint(equalTo: centerXAnchor), + stackView.centerYAnchor.constraint(equalTo: centerYAnchor) + ]) + + stackView.addArrangedSubview(activityIndicator) + stackView.addArrangedSubview(label) + + insertSubview(stackBackgroundView, belowSubview: stackView) + stackBackgroundView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + stackBackgroundView.topAnchor.constraint(equalTo: stackView.topAnchor, constant: -Constants.padding.top), + stackBackgroundView.bottomAnchor.constraint(equalTo: stackView.bottomAnchor, constant: Constants.padding.bottom), + stackBackgroundView.leadingAnchor.constraint(equalTo: stackView.leadingAnchor, constant: -Constants.padding.left), + stackBackgroundView.trailingAnchor.constraint(equalTo: stackView.trailingAnchor, constant: Constants.padding.right) + ]) + } + + func update(theme: Theme) { + backgroundColor = theme.colors.primaryContent.withAlphaComponent(Constants.backgroundOpacity) + stackBackgroundView.backgroundColor = theme.colors.system + activityIndicator.color = theme.colors.secondaryContent + label.font = theme.fonts.calloutSB + label.textColor = theme.colors.secondaryContent + } +} diff --git a/Riot/Modules/Common/ActivityPresenters/FullscreenLoadingIndicatorPresenter.swift b/Riot/Modules/Common/ActivityPresenters/FullscreenLoadingIndicatorPresenter.swift new file mode 100644 index 000000000..e5488a19a --- /dev/null +++ b/Riot/Modules/Common/ActivityPresenters/FullscreenLoadingIndicatorPresenter.swift @@ -0,0 +1,79 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import CommonKit +import UIKit + +/// A `UserIndicatorPresentable` responsible for showing / hiding a full-screen loading view that obscures (and thus disables) all other controls. +/// It is managed by a `UserIndicator`, meaning the `present` and `dismiss` methods will be called when the parent `UserIndicator` starts or completes. +class FullscreenLoadingIndicatorPresenter: UserIndicatorPresentable { + private let label: String + private weak var viewController: UIViewController? + private weak var view: UIView? + + init(label: String, viewController: UIViewController) { + self.label = label + self.viewController = viewController + } + + func present() { + // Find the current top navigation controller + var presentingController: UIViewController? = viewController + while presentingController?.navigationController != nil { + presentingController = presentingController?.navigationController + } + guard let presentingController = presentingController else { + return + } + + let view = LabelledActivityIndicatorView(text: label) + view.update(theme: ThemeService.shared().theme) + self.view = view + + view.translatesAutoresizingMaskIntoConstraints = false + presentingController.view.addSubview(view) + NSLayoutConstraint.activate([ + view.topAnchor.constraint(equalTo: presentingController.view.topAnchor), + view.bottomAnchor.constraint(equalTo: presentingController.view.bottomAnchor), + view.leadingAnchor.constraint(equalTo: presentingController.view.leadingAnchor), + view.trailingAnchor.constraint(equalTo: presentingController.view.trailingAnchor) + ]) + + view.alpha = 0 + UIView.animate(withDuration: 0.2) { + view.alpha = 1 + } + } + + func dismiss() { + guard let view = view, view.superview != nil else { + return + } + + // If `present` and `dismiss` are called right after each other without delay, + // the view does not correctly pick up `currentState` of alpha. Dispatching onto + // the main queue skips a few run loops, giving the system time to render + // current state. + DispatchQueue.main.async { + UIView.animate(withDuration: 0.2, delay: 0, options: .beginFromCurrentState) { + view.alpha = 0 + } completion: { _ in + view.removeFromSuperview() + } + } + } +} diff --git a/Riot/Modules/Common/Toasts/ActivityIndicatorToastPresenter.swift b/Riot/Modules/Common/ActivityPresenters/ToastUserIndicatorPresenter.swift similarity index 77% rename from Riot/Modules/Common/Toasts/ActivityIndicatorToastPresenter.swift rename to Riot/Modules/Common/ActivityPresenters/ToastUserIndicatorPresenter.swift index 1c592a2a2..504b4600c 100644 --- a/Riot/Modules/Common/Toasts/ActivityIndicatorToastPresenter.swift +++ b/Riot/Modules/Common/ActivityPresenters/ToastUserIndicatorPresenter.swift @@ -17,16 +17,17 @@ import Foundation import UIKit import CommonKit +import MatrixSDK -/// An `ActivityPresenter` responsible for showing / hiding a toast view for activity indicators, and managed by an `Activity`, -/// meaning the `present` and `dismiss` methods will be called when the parent `Activity` starts or completes. -class ActivityIndicatorToastPresenter: ActivityPresentable { - private let text: String +/// A `UserIndicatorPresentable` responsible for showing / hiding a toast view for loading spinners or success messages. +/// It is managed by an `UserIndicator`, meaning the `present` and `dismiss` methods will be called when the parent `UserIndicator` starts or completes. +class ToastUserIndicatorPresenter: UserIndicatorPresentable { + private let viewState: ToastViewState private weak var navigationController: UINavigationController? private weak var view: UIView? - init(text: String, navigationController: UINavigationController) { - self.text = text + init(viewState: ToastViewState, navigationController: UINavigationController) { + self.viewState = viewState self.navigationController = navigationController } @@ -35,15 +36,15 @@ class ActivityIndicatorToastPresenter: ActivityPresentable { return } - let view = ActivityIndicatorToastView(text: text) + let view = RoundedToastView(viewState: viewState) view.update(theme: ThemeService.shared().theme) self.view = view view.translatesAutoresizingMaskIntoConstraints = false navigationController.view.addSubview(view) NSLayoutConstraint.activate([ - view.centerXAnchor.constraint(equalTo: navigationController.navigationBar.centerXAnchor), - view.topAnchor.constraint(equalTo: navigationController.navigationBar.bottomAnchor) + view.centerXAnchor.constraint(equalTo: navigationController.view.centerXAnchor), + view.topAnchor.constraint(equalTo: navigationController.navigationBar.safeAreaLayoutGuide.bottomAnchor) ]) view.alpha = 0 @@ -69,7 +70,6 @@ class ActivityIndicatorToastPresenter: ActivityPresentable { view.transform = .init(translationX: 0, y: -5) } completion: { _ in view.removeFromSuperview() - self.view = nil } } } diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.h b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.h index 8cc599eba..cf6329d0f 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.h +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.h @@ -133,10 +133,15 @@ extern NSString *const kRecentsDataSourceTapOnDirectoryServerChange; - (void)forceRefresh; /** - Tell whether the sections are shrinkable. NO by default. + Tell whether the sections are shrinkable. YES by default. */ @property (nonatomic) BOOL areSectionsShrinkable; +/** + Return true if the given section is currently shrinked. + */ +- (BOOL)isSectionShrinkedAt:(NSInteger)section; + /** Get the sticky header view for the specified section. diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m index 1e23043df..ec5a4916f 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m @@ -78,7 +78,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou [self resetSectionIndexes]; - _areSectionsShrinkable = NO; + _areSectionsShrinkable = YES; shrinkedSectionsBitMask = 0; roomTagsListenerByUserId = [[NSMutableDictionary alloc] init]; @@ -661,7 +661,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou title = [VectorL10n roomRecentsSuggestedRoomsSection]; } - if (count) + if (count && !(section == invitesSection)) { NSString *roomCount = [NSString stringWithFormat:@" %tu", count]; @@ -684,12 +684,16 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou return sectionTitle; } -- (UIView *)badgeViewForHeaderTitleInHomeSection:(NSInteger)section +- (UIView *)badgeViewForHeaderTitleInSection:(NSInteger)section { // Prepare a badge to display the total of missed notifications in this section. id counts = nil; UIView *missedNotifAndUnreadBadgeBgView = nil; - + + if (section == invitesSection) + { + counts = self.recentsListService.invitedRoomListData.counts; + } if (section == favoritesSection) { counts = self.recentsListService.favoritedRoomListData.counts; @@ -715,8 +719,9 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou counts = self.recentsListService.suggestedRoomListData.counts; } - NSUInteger numberOfNotifications = counts.total.numberOfNotifications; - NSUInteger numberOfHighlights = counts.total.numberOfHighlights; + // Invites are counted as highlights for the badge view display. + NSUInteger numberOfNotifications = counts.total.numberOfNotifications + counts.total.numberOfInvitedRooms; + NSUInteger numberOfHighlights = counts.total.numberOfHighlights + counts.total.numberOfInvitedRooms; if (numberOfNotifications) { @@ -833,14 +838,16 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou chevronView.contentMode = UIViewContentModeCenter; sectionHeader.accessoryView = chevronView; } - else if (_recentsDataSourceMode == RecentsDataSourceModeHome) + if (_recentsDataSourceMode == RecentsDataSourceModeHome + || _recentsDataSourceMode == RecentsDataSourceModePeople + || _recentsDataSourceMode == RecentsDataSourceModeRooms) { // Add a badge to display the total of missed notifications by section. - UIView *badgeView = [self badgeViewForHeaderTitleInHomeSection:section]; + UIView *badgeView = [self badgeViewForHeaderTitleInSection:section]; if (badgeView) { - sectionHeader.accessoryView = badgeView; + sectionHeader.rightAccessoryView = badgeView; } } @@ -1510,4 +1517,55 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou [self.delegate dataSource:self didCellChange:update]; } +#pragma mark - Shrinkable +- (BOOL)isSectionShrinkedAt:(NSInteger)section +{ + if (_areSectionsShrinkable == NO) + { + return NO; + } + + if (section == favoritesSection && (shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_FAVORITES)) + { + return YES; + } + + if (section == peopleSection && (shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_PEOPLE)) + { + return YES; + } + + if (section == conversationSection && (shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_CONVERSATIONS)) + { + return YES; + } + + if (section == directorySection && (shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_DIRECTORY)) + { + return YES; + } + + if (section == lowPrioritySection && (shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_LOWPRIORITY)) + { + return YES; + } + + if (section == serverNoticeSection && (shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_SERVERNOTICE)) + { + return YES; + } + + if (section == invitesSection && (shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_INVITES)) + { + return YES; + } + + if (section == suggestedRoomsSection && (shrinkedSectionsBitMask & RECENTSDATASOURCE_SECTION_SUGGESTED)) + { + return YES; + } + + return NO; +} + @end diff --git a/Riot/Modules/Common/Recents/Model/DiscussionsCount.swift b/Riot/Modules/Common/Recents/Model/DiscussionsCount.swift index ee80cc52f..dad358771 100644 --- a/Riot/Modules/Common/Recents/Model/DiscussionsCount.swift +++ b/Riot/Modules/Common/Recents/Model/DiscussionsCount.swift @@ -51,10 +51,10 @@ public class DiscussionsCount: NSObject { super.init() } - public init(withRoomListDataCounts counts: MXRoomListDataCounts) { - self.numberOfNotified = counts.numberOfNotifiedRooms - self.numberOfHighlighted = counts.numberOfHighlightedRooms + counts.numberOfInvitedRooms - self.numberOfUnsent = counts.numberOfUnsentRooms + public init(withRoomListDataCounts counts: [MXRoomListDataCounts]) { + self.numberOfNotified = counts.reduce(0, { $0 + $1.numberOfNotifiedRooms }) + self.numberOfHighlighted = counts.reduce(0, { $0 + $1.numberOfHighlightedRooms + $1.numberOfInvitedRooms }) + self.numberOfUnsent = counts.reduce(0, { $0 + $1.numberOfUnsentRooms }) super.init() } } diff --git a/Riot/Modules/Common/Recents/RecentsViewController.h b/Riot/Modules/Common/Recents/RecentsViewController.h index 9b952b26a..137db955e 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.h +++ b/Riot/Modules/Common/Recents/RecentsViewController.h @@ -19,7 +19,7 @@ @class RootTabEmptyView; @class AnalyticsScreenTimer; -@class AppActivityIndicatorPresenter; +@class AppUserIndicatorPresenter; /** Notification to be posted when recents data is ready. Notification object will be the RecentsViewController instance. @@ -98,9 +98,9 @@ FOUNDATION_EXPORT NSString *const RecentsViewControllerDataReadyNotification; @property (nonatomic) AnalyticsScreenTimer *screenTimer; /** - Presenter for displaying app-wide activity / loading indicators. If not set, the view controller will use legacy activity indicators + Presenter for displaying app-wide user indicators. If not set, the view controller will use legacy activity indicators */ -@property (nonatomic, strong) AppActivityIndicatorPresenter *activityPresenter; +@property (nonatomic, strong) AppUserIndicatorPresenter *userIndicatorPresenter; /** Return the sticky header for the specified section of the table view diff --git a/Riot/Modules/Common/Recents/RecentsViewController.m b/Riot/Modules/Common/Recents/RecentsViewController.m index 02c1038c7..a082a13c8 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.m +++ b/Riot/Modules/Common/Recents/RecentsViewController.m @@ -314,6 +314,8 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro [[NSNotificationCenter defaultCenter] removeObserver:kMXNotificationCenterDidUpdateRulesObserver]; kMXNotificationCenterDidUpdateRulesObserver = nil; } + + [self stopActivityIndicator]; } - (void)viewDidAppear:(BOOL)animated @@ -1040,6 +1042,7 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro SectionHeaderView *updatedSectionHeaderView = (SectionHeaderView *)updatedHeaderView; sectionHeaderView.headerLabel = updatedSectionHeaderView.headerLabel; sectionHeaderView.accessoryView = updatedSectionHeaderView.accessoryView; + sectionHeaderView.rightAccessoryView = updatedSectionHeaderView.rightAccessoryView; } } } @@ -1280,8 +1283,7 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro MXRoom *room = [self.mainSession roomWithRoomId:currentRoomId]; if (room) { - [self startActivityIndicator]; - + [self startActivityIndicatorWithLabel:[VectorL10n roomParticipantsLeaveProcessing]]; // cancel pending uploads/downloads // they are useless by now [MXMediaManager cancelDownloadsInCacheFolder:room.roomId]; @@ -1296,6 +1298,7 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro { typeof(self) self = weakSelf; [self stopActivityIndicator]; + [self.userIndicatorPresenter presentSuccessWithLabel:[VectorL10n roomParticipantsLeaveSuccess]]; // Force table refresh [self cancelEditionMode:YES]; } @@ -2421,20 +2424,28 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro #pragma mark - Activity Indicator - (BOOL)providesCustomActivityIndicator { - return self.activityPresenter != nil; + return self.userIndicatorPresenter != nil; +} + +- (void)startActivityIndicatorWithLabel:(NSString *)label { + if (self.userIndicatorPresenter) { + [self.userIndicatorPresenter presentActivityIndicatorWithLabel:label]; + } else { + [super startActivityIndicator]; + } } - (void)startActivityIndicator { - if (self.activityPresenter) { - [self.activityPresenter presentActivityIndicator]; + if (self.userIndicatorPresenter) { + [self.userIndicatorPresenter presentActivityIndicator]; } else { [super startActivityIndicator]; } } - (void)stopActivityIndicator { - if (self.activityPresenter) { - [self.activityPresenter removeCurrentActivityIndicatorWithAnimated:YES completion:nil]; + if (self.userIndicatorPresenter) { + [self.userIndicatorPresenter removeCurrentActivityIndicatorWithAnimated:YES completion:nil]; } else { [super stopActivityIndicator]; } diff --git a/Riot/Modules/Common/Recents/Service/MatrixSDK/RecentsListService.swift b/Riot/Modules/Common/Recents/Service/MatrixSDK/RecentsListService.swift index c9eb94209..f37ad11ae 100644 --- a/Riot/Modules/Common/Recents/Service/MatrixSDK/RecentsListService.swift +++ b/Riot/Modules/Common/Recents/Service/MatrixSDK/RecentsListService.swift @@ -32,7 +32,18 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { // MARK: - Fetchers - private var invitedRoomListDataFetcher: MXRoomListDataFetcher? + private var invitedRoomListDataFetcher: MXRoomListDataFetcher? { + switch mode { + case .home: + return invitedRoomListDataFetcherForHome + case .people: + return invitedRoomListDataFetcherForPeople + case .rooms: + return invitedRoomListDataFetcherForRooms + default: + return nil + } + } private var favoritedRoomListDataFetcher: MXRoomListDataFetcher? private var directRoomListDataFetcher: MXRoomListDataFetcher? { switch mode { @@ -62,19 +73,24 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { private var conversationRoomListDataFetcherForRooms: MXRoomListDataFetcher? private var directRoomListDataFetcherForHome: MXRoomListDataFetcher? private var directRoomListDataFetcherForPeople: MXRoomListDataFetcher? - + private var invitedRoomListDataFetcherForHome: MXRoomListDataFetcher? + private var invitedRoomListDataFetcherForPeople: MXRoomListDataFetcher? + private var invitedRoomListDataFetcherForRooms: MXRoomListDataFetcher? + // MARK: - Private private var fetcherTypesForMode: [RecentsDataSourceMode: FetcherTypes] = [ .home: [.invited, .favorited, .directHome, .conversationHome, .lowPriority, .serverNotice, .suggested], .favourites: [.favorited], - .people: [.directPeople], - .rooms: [.conversationRooms, .suggested] + .people: [.invited, .directPeople], + .rooms: [.invited, .conversationRooms, .suggested] ] private var allFetchers: [MXRoomListDataFetcher] { return [ - invitedRoomListDataFetcher, + invitedRoomListDataFetcherForHome, + invitedRoomListDataFetcherForPeople, + invitedRoomListDataFetcherForRooms, favoritedRoomListDataFetcher, directRoomListDataFetcherForHome, directRoomListDataFetcherForPeople, @@ -120,7 +136,7 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { } return result } - + private var hideInvitedSection: Bool { return MXSDKOptions.sharedInstance().autoAcceptRoomInvites } @@ -204,20 +220,20 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { guard let totalCounts = favoritedRoomListDataFetcher?.data?.counts.total else { return .zero } - return DiscussionsCount(withRoomListDataCounts: totalCounts) + return DiscussionsCount(withRoomListDataCounts: [totalCounts]) } public var peopleMissedDiscussionsCount: DiscussionsCount { - guard let totalCounts = directRoomListDataFetcherForPeople?.data?.counts.total else { - return .zero - } + let invitesCount = invitedRoomListDataFetcherForPeople?.data?.counts.total + let directCount = directRoomListDataFetcherForPeople?.data?.counts.total + let totalCounts = [invitesCount, directCount].compactMap { $0 } return DiscussionsCount(withRoomListDataCounts: totalCounts) } public var conversationMissedDiscussionsCount: DiscussionsCount { - guard let totalCounts = conversationRoomListDataFetcherForRooms?.data?.counts.total else { - return .zero - } + let invitesCount = invitedRoomListDataFetcherForRooms?.data?.counts.total + let conversationCount = conversationRoomListDataFetcherForRooms?.data?.counts.total + let totalCounts = [invitesCount, conversationCount].compactMap { $0 } return DiscussionsCount(withRoomListDataCounts: totalCounts) } @@ -269,7 +285,9 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { removeAllDelegates() allFetchers.forEach({ $0.stop() }) - invitedRoomListDataFetcher = nil + invitedRoomListDataFetcherForHome = nil + invitedRoomListDataFetcherForPeople = nil + invitedRoomListDataFetcherForRooms = nil favoritedRoomListDataFetcher = nil directRoomListDataFetcherForHome = nil directRoomListDataFetcherForPeople = nil @@ -435,7 +453,8 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { private func createCommonRoomListDataFetcher(withDataTypes dataTypes: MXRoomSummaryDataTypes = [], onlySuggested: Bool = false, - paginate: Bool = true) -> MXRoomListDataFetcher { + paginate: Bool = true, + strictMatches: Bool = false) -> MXRoomListDataFetcher { guard let session = session else { fatalError("Session deallocated") } @@ -443,7 +462,8 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { onlySuggested: onlySuggested, query: query, space: space, - showAllRoomsInHomeSpace: showAllRoomsInHomeSpace) + showAllRoomsInHomeSpace: showAllRoomsInHomeSpace, + strictMatches: strictMatches) let fetchOptions = MXRoomListDataFetchOptions(filterOptions: filterOptions, sortOptions: sortOptions, @@ -455,6 +475,22 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { } return fetcher } + + private func createInvitedRoomListDataFetcherForPeople() -> MXRoomListDataFetcher { + let fetcher = createCommonRoomListDataFetcher(withDataTypes: [.invited, .direct], paginate: false, strictMatches: true) + updateInvitedFetcher(fetcher, for: .people) + fetcher.addDelegate(self) + fetcher.paginate() + return fetcher + } + + private func createInvitedRoomListDataFetcherForRooms() -> MXRoomListDataFetcher { + let fetcher = createCommonRoomListDataFetcher(withDataTypes: [.invited], paginate: false) + updateInvitedFetcher(fetcher, for: .rooms) + fetcher.addDelegate(self) + fetcher.paginate() + return fetcher + } private func createDirectRoomListDataFetcherForHome() -> MXRoomListDataFetcher { let fetcher = createCommonRoomListDataFetcher(withDataTypes: [.direct], paginate: false) @@ -500,7 +536,9 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { return } if !hideInvitedSection { - invitedRoomListDataFetcher = createCommonRoomListDataFetcher(withDataTypes: [.invited]) + invitedRoomListDataFetcherForHome = createCommonRoomListDataFetcher(withDataTypes: [.invited]) + invitedRoomListDataFetcherForPeople = createInvitedRoomListDataFetcherForPeople() + invitedRoomListDataFetcherForRooms = createInvitedRoomListDataFetcherForRooms() } favoritedRoomListDataFetcher = createCommonRoomListDataFetcher(withDataTypes: [.favorited]) directRoomListDataFetcherForHome = createDirectRoomListDataFetcherForHome() @@ -516,18 +554,30 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { } private func updateDirectFetcher(_ fetcher: MXRoomListDataFetcher, for mode: RecentsDataSourceMode) { - var notDataTypes: MXRoomSummaryDataTypes = [.hidden, .conferenceUser, .space] + var notDataTypes: MXRoomSummaryDataTypes = [.hidden, .conferenceUser, .space, .invited, .lowPriority] switch mode { case .home: - notDataTypes.insert([.invited, .favorited, .lowPriority]) + notDataTypes.insert(.favorited) fetcher.fetchOptions.filterOptions.notDataTypes = notDataTypes case .people: - notDataTypes.insert([.lowPriority]) fetcher.fetchOptions.filterOptions.notDataTypes = notDataTypes default: break } } + + private func updateInvitedFetcher(_ fetcher: MXRoomListDataFetcher, for mode: RecentsDataSourceMode) { + var notDataTypes: MXRoomSummaryDataTypes = [.hidden, .conferenceUser, .lowPriority, .serverNotice, .space] + switch mode { + case .people: + fetcher.fetchOptions.filterOptions.notDataTypes = notDataTypes + case .rooms: + notDataTypes.insert([.direct]) + fetcher.fetchOptions.filterOptions.notDataTypes = notDataTypes + default: + break + } + } private func updateFavoritedFetcher(_ fetcher: MXRoomListDataFetcher, for mode: RecentsDataSourceMode) { switch mode { @@ -543,15 +593,12 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { } private func updateConversationFetcher(_ fetcher: MXRoomListDataFetcher, for mode: RecentsDataSourceMode) { - var notDataTypes: MXRoomSummaryDataTypes = [.hidden, .conferenceUser, .direct, .lowPriority, .serverNotice, .space] + var notDataTypes: MXRoomSummaryDataTypes = [.hidden, .conferenceUser, .direct, .invited, .lowPriority, .serverNotice, .space] switch mode { case .home: - notDataTypes.insert([.invited, .favorited]) + notDataTypes.insert(.favorited) fetcher.fetchOptions.filterOptions.notDataTypes = notDataTypes case .rooms: - if hideInvitedSection { - notDataTypes.insert(.invited) - } fetcher.fetchOptions.filterOptions.notDataTypes = notDataTypes default: break @@ -603,7 +650,7 @@ private struct FetcherTypes: OptionSet { static let lowPriority = FetcherTypes(rawValue: 1 << 6) static let serverNotice = FetcherTypes(rawValue: 1 << 7) static let suggested = FetcherTypes(rawValue: 1 << 8) - + static let none: FetcherTypes = [] static let all: FetcherTypes = [ .invited, .favorited, .directHome, .directPeople, .conversationHome, .conversationRooms, .lowPriority, .serverNotice, .suggested] diff --git a/Riot/Modules/Common/SectionHeaders/SectionHeaderView.h b/Riot/Modules/Common/SectionHeaders/SectionHeaderView.h index 515ee86a4..b602f6c6c 100644 --- a/Riot/Modules/Common/SectionHeaders/SectionHeaderView.h +++ b/Riot/Modules/Common/SectionHeaders/SectionHeaderView.h @@ -52,6 +52,11 @@ */ @property (nonatomic, strong) UIView *accessoryView; +/** + Right accessory view for header. Both width and height will be used. + */ +@property (nonatomic, strong) UIView *rightAccessoryView; + /** A view which spans the bottom view. No frame value will be used. Height will be remaining of the view at below topViewHeight. */ diff --git a/Riot/Modules/Common/SectionHeaders/SectionHeaderView.m b/Riot/Modules/Common/SectionHeaders/SectionHeaderView.m index 54150ac8e..9c039516a 100644 --- a/Riot/Modules/Common/SectionHeaders/SectionHeaderView.m +++ b/Riot/Modules/Common/SectionHeaders/SectionHeaderView.m @@ -85,6 +85,19 @@ static const CGFloat kInterItemsSpaceHorizontal = 8.0; [self setNeedsLayout]; } +- (void)setRightAccessoryView:(UIView *)rightAccessoryView +{ + // remove old one + [_rightAccessoryView removeFromSuperview]; + _rightAccessoryView = rightAccessoryView; + if (_rightAccessoryView) + { + // add new one + [self.contentView addSubview:_rightAccessoryView]; + } + [self setNeedsLayout]; +} + - (void)setBottomView:(UIView *)bottomView { // remove old one @@ -169,6 +182,10 @@ static const CGFloat kInterItemsSpaceHorizontal = 8.0; { rightMargin += _accessoryView.frame.size.width + kInterItemsSpaceHorizontal; } + if (_rightAccessoryView) + { + rightMargin += _rightAccessoryView.frame.size.width + kInterItemsSpaceHorizontal; + } if (_bottomView) { // set header label top @@ -179,7 +196,8 @@ static const CGFloat kInterItemsSpaceHorizontal = 8.0; // center header label vertically frame.origin.y = MAX(0, (self.contentView.bounds.size.height - frame.size.height)/2); } - frame.size.width = self.contentView.bounds.size.width - leftMargin - rightMargin; + frame.size.width = MIN(self.contentView.bounds.size.width - leftMargin - rightMargin, + [_headerLabel sizeThatFits:self.frame.size].width); _headerLabel.frame = frame; } @@ -190,11 +208,30 @@ static const CGFloat kInterItemsSpaceHorizontal = 8.0; rightMargin = MAX(_rightInset, 20); CGRect frame = _accessoryView.frame; - frame.origin.x = self.contentView.bounds.size.width - frame.size.width - rightMargin; + if(_headerLabel) + { + frame.origin.x = leftMargin + _headerLabel.frame.size.width + kInterItemsSpaceHorizontal; + } + else + { + frame.origin.x = leftMargin; + } frame.origin.y = MAX(0, (_topViewHeight - frame.size.height)/2); _accessoryView.frame = frame; } + if (_rightAccessoryView) + { + // reset margins + leftMargin = MAX(_leftInset, 20); + rightMargin = MAX(_rightInset, 20); + + CGRect frame = _rightAccessoryView.frame; + frame.origin.x = self.contentView.bounds.size.width - frame.size.width - rightMargin; + frame.origin.y = MAX(0, (_topViewHeight - frame.size.height)/2); + _rightAccessoryView.frame = frame; + } + if (_bottomView) { // reset margins diff --git a/Riot/Modules/Common/Toasts/ActivityIndicatorToastView.swift b/Riot/Modules/Common/Toasts/ActivityIndicatorToastView.swift deleted file mode 100644 index 6964ec445..000000000 --- a/Riot/Modules/Common/Toasts/ActivityIndicatorToastView.swift +++ /dev/null @@ -1,91 +0,0 @@ -// -// Copyright 2021 New Vector Ltd -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Foundation -import UIKit -import DesignKit - -class ActivityIndicatorToastView: UIView, Themable { - private struct Constants { - static let padding = UIEdgeInsets(top: 10, left: 12, bottom: 10, right: 12) - static let shadowOffset = CGSize(width: 0, height: 4) - static let shadowRadius = CGFloat(12) - static let shadowOpacity = Float(0.1) - } - - private let stackView: UIStackView = { - let stack = UIStackView() - stack.axis = .horizontal - stack.spacing = 5 - return stack - }() - - private let activityIndicator: UIActivityIndicatorView = { - let view = UIActivityIndicatorView() - view.transform = .init(scaleX: 0.75, y: 0.75) - view.startAnimating() - return view - }() - - private let label: UILabel = { - return UILabel() - }() - - init(text: String) { - super.init(frame: .zero) - setup(text: text) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - private func setup(text: String) { - setupLayer() - setupStackView() - stackView.addArrangedSubview(activityIndicator) - stackView.addArrangedSubview(label) - label.text = text - } - - private func setupStackView() { - addSubview(stackView) - stackView.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - stackView.topAnchor.constraint(equalTo: topAnchor, constant: Constants.padding.top), - stackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -Constants.padding.bottom), - stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: Constants.padding.left), - stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -Constants.padding.right) - ]) - } - - private func setupLayer() { - layer.shadowColor = UIColor.black.cgColor - layer.shadowOffset = Constants.shadowOffset - layer.shadowRadius = Constants.shadowRadius - layer.shadowOpacity = Constants.shadowOpacity - } - - override func layoutSubviews() { - super.layoutSubviews() - layer.cornerRadius = layer.frame.height / 2 - } - - func update(theme: Theme) { - backgroundColor = UIColor.white - label.font = theme.fonts.subheadline - } -} diff --git a/Riot/Modules/Common/Toasts/BasicToastView.swift b/Riot/Modules/Common/Toasts/RectangleToastView.swift similarity index 98% rename from Riot/Modules/Common/Toasts/BasicToastView.swift rename to Riot/Modules/Common/Toasts/RectangleToastView.swift index a4b9a39b6..41aa3c65f 100644 --- a/Riot/Modules/Common/Toasts/BasicToastView.swift +++ b/Riot/Modules/Common/Toasts/RectangleToastView.swift @@ -17,7 +17,7 @@ import Foundation import UIKit -class BasicToastView: UIView, Themable { +class RectangleToastView: UIView, Themable { private enum Constants { static let padding: UIEdgeInsets = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16) diff --git a/Riot/Modules/Common/Toasts/RoundedToastView.swift b/Riot/Modules/Common/Toasts/RoundedToastView.swift new file mode 100644 index 000000000..4774eadd0 --- /dev/null +++ b/Riot/Modules/Common/Toasts/RoundedToastView.swift @@ -0,0 +1,120 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import UIKit +import DesignKit + +class RoundedToastView: UIView, Themable { + private struct ShadowStyle { + let offset: CGSize + let radius: CGFloat + let opacity: Float + } + + private struct Constants { + static let padding = UIEdgeInsets(top: 10, left: 12, bottom: 10, right: 12) + static let activityIndicatorScale = CGFloat(0.75) + static let imageViewSize = CGFloat(15) + static let lightShadow = ShadowStyle(offset: .init(width: 0, height: 4), radius: 12, opacity: 0.1) + static let darkShadow = ShadowStyle(offset: .init(width: 0, height: 4), radius: 4, opacity: 0.2) + } + + private lazy var activityIndicator: UIActivityIndicatorView = { + let indicator = UIActivityIndicatorView() + indicator.transform = .init(scaleX: Constants.activityIndicatorScale, y: Constants.activityIndicatorScale) + indicator.startAnimating() + return indicator + }() + + private lazy var imageView: UIImageView = { + let imageView = UIImageView() + imageView.contentMode = .scaleAspectFit + imageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + imageView.widthAnchor.constraint(equalToConstant: Constants.imageViewSize), + imageView.heightAnchor.constraint(equalToConstant: Constants.imageViewSize) + ]) + return imageView + }() + + private let stackView: UIStackView = { + let stack = UIStackView() + stack.axis = .horizontal + stack.alignment = .center + stack.spacing = 5 + return stack + }() + + private let label: UILabel = { + return UILabel() + }() + + init(viewState: ToastViewState) { + super.init(frame: .zero) + setup(viewState: viewState) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setup(viewState: ToastViewState) { + setupStackView() + stackView.addArrangedSubview(toastView(for: viewState.style)) + stackView.addArrangedSubview(label) + label.text = viewState.label + } + + private func setupStackView() { + addSubview(stackView) + stackView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + stackView.topAnchor.constraint(equalTo: topAnchor, constant: Constants.padding.top), + stackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -Constants.padding.bottom), + stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: Constants.padding.left), + stackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -Constants.padding.right) + ]) + } + + override func layoutSubviews() { + super.layoutSubviews() + layer.cornerRadius = layer.frame.height / 2 + } + + func update(theme: Theme) { + backgroundColor = theme.colors.background + stackView.arrangedSubviews.first?.tintColor = theme.colors.primaryContent + label.font = theme.fonts.subheadline + label.textColor = theme.colors.primaryContent + + let shadowStyle = theme.identifier == ThemeIdentifier.dark.rawValue ? Constants.darkShadow : Constants.lightShadow + layer.shadowColor = UIColor.black.cgColor + layer.shadowOffset = shadowStyle.offset + layer.shadowRadius = shadowStyle.radius + layer.shadowOpacity = shadowStyle.opacity + } + + private func toastView(for style: ToastViewState.Style) -> UIView { + switch style { + case .loading: + return activityIndicator + case .success: + imageView.image = Asset.Images.checkmark.image + return imageView + } + } +} diff --git a/Riot/Modules/Common/Toasts/ToastViewState.swift b/Riot/Modules/Common/Toasts/ToastViewState.swift new file mode 100644 index 000000000..e241d4645 --- /dev/null +++ b/Riot/Modules/Common/Toasts/ToastViewState.swift @@ -0,0 +1,27 @@ +// +// Copyright 2021 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +struct ToastViewState { + enum Style { + case loading + case success + } + + let style: Style + let label: String +} diff --git a/Riot/Modules/Communities/GroupsViewController.m b/Riot/Modules/Communities/GroupsViewController.m index 306a4e55c..fb1ac9552 100644 --- a/Riot/Modules/Communities/GroupsViewController.m +++ b/Riot/Modules/Communities/GroupsViewController.m @@ -21,7 +21,7 @@ #import "GeneratedInterface-Swift.h" -@interface GroupsViewController () +@interface GroupsViewController () { // Tell whether a groups refresh is pending (suspended during editing mode). BOOL isRefreshPending; @@ -224,8 +224,6 @@ [self scrollToTop:YES]; }]; - - [AppDelegate theDelegate].masterTabBarController.navigationItem.title = [VectorL10n titleGroups]; [AppDelegate theDelegate].masterTabBarController.tabBar.tintColor = ThemeService.shared.theme.tintColor; } @@ -644,4 +642,11 @@ [self.groupsSearchBar setShowsCancelButton:NO animated:NO]; } +#pragma mark - MasterTabBarItemDisplayProtocol + +- (NSString *)masterTabBarItemTitle +{ + return [VectorL10n titleGroups]; +} + @end diff --git a/Riot/Modules/Favorites/FavouritesViewController.m b/Riot/Modules/Favorites/FavouritesViewController.m index 62ef8cd8f..2ff0b52f8 100644 --- a/Riot/Modules/Favorites/FavouritesViewController.m +++ b/Riot/Modules/Favorites/FavouritesViewController.m @@ -19,7 +19,7 @@ #import "RecentsDataSource.h" #import "GeneratedInterface-Swift.h" -@interface FavouritesViewController () +@interface FavouritesViewController () { RecentsDataSource *recentsDataSource; } @@ -62,14 +62,11 @@ - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - - [AppDelegate theDelegate].masterTabBarController.navigationItem.title = [VectorL10n titleFavourites]; [AppDelegate theDelegate].masterTabBarController.tabBar.tintColor = ThemeService.shared.theme.tintColor; if (recentsDataSource) { // Take the lead on the shared data source. - recentsDataSource.areSectionsShrinkable = NO; [recentsDataSource setDelegate:self andRecentsDataSourceMode:RecentsDataSourceModeFavourites]; } } @@ -163,4 +160,11 @@ } } +#pragma mark - MasterTabBarItemDisplayProtocol + +- (NSString *)masterTabBarItemTitle +{ + return [VectorL10n titleFavourites]; +} + @end diff --git a/Riot/Modules/GlobalSearch/DataSources/UnifiedSearchRecentsDataSource.m b/Riot/Modules/GlobalSearch/DataSources/UnifiedSearchRecentsDataSource.m index 94daf7c44..6bb0a8319 100644 --- a/Riot/Modules/GlobalSearch/DataSources/UnifiedSearchRecentsDataSource.m +++ b/Riot/Modules/GlobalSearch/DataSources/UnifiedSearchRecentsDataSource.m @@ -35,6 +35,18 @@ @implementation UnifiedSearchRecentsDataSource +- (instancetype)initWithMatrixSession:(MXSession *)mxSession recentsListService:(id)recentsListService +{ + self = [super initWithMatrixSession:mxSession recentsListService:recentsListService]; + if (self) + { + searchedRoomIdOrAliasSection = -1; + + _hideRecents = NO; + } + return self; +} + #pragma mark - - (void)setPublicRoomsDirectoryDataSource:(PublicRoomsDirectoryDataSource *)publicRoomsDirectoryDataSource diff --git a/Riot/Modules/Home/HomeViewController.m b/Riot/Modules/Home/HomeViewController.m index 35abd9598..a2f125b7a 100644 --- a/Riot/Modules/Home/HomeViewController.m +++ b/Riot/Modules/Home/HomeViewController.m @@ -103,8 +103,6 @@ - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - - [AppDelegate theDelegate].masterTabBarController.navigationItem.title = [VectorL10n titleHome]; [ThemeService.shared.theme applyStyleOnNavigationBar:[AppDelegate theDelegate].masterTabBarController.navigationController.navigationBar]; @@ -113,7 +111,6 @@ if (recentsDataSource) { // Take the lead on the shared data source. - recentsDataSource.areSectionsShrinkable = NO; [recentsDataSource setDelegate:self andRecentsDataSourceMode:RecentsDataSourceModeHome]; } @@ -337,9 +334,16 @@ { // Edit the potential selected room (see `onCollectionViewCellLongPress`). editedRoomId = selectedRoomId; - - // Each rooms section is represented by only one collection view. - return 1; + + if ([recentsDataSource isSectionShrinkedAt:section]) + { + return 0; + } + else + { + // Each rooms section is represented by only one collection view. + return 1; + } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath diff --git a/Riot/Modules/Home/VersionCheck/HomeViewControllerWithBannerWrapperViewController.swift b/Riot/Modules/Home/VersionCheck/HomeViewControllerWithBannerWrapperViewController.swift index 1c6c24173..0a9fbcee8 100644 --- a/Riot/Modules/Home/VersionCheck/HomeViewControllerWithBannerWrapperViewController.swift +++ b/Riot/Modules/Home/VersionCheck/HomeViewControllerWithBannerWrapperViewController.swift @@ -16,7 +16,7 @@ import Foundation -class HomeViewControllerWithBannerWrapperViewController: UIViewController, MXKViewControllerActivityHandling, BannerPresentationProtocol { +class HomeViewControllerWithBannerWrapperViewController: UIViewController, MXKViewControllerActivityHandling, BannerPresentationProtocol, MasterTabBarItemDisplayProtocol { @objc let homeViewController: HomeViewController private var bannerContainerView: UIView! @@ -107,4 +107,10 @@ class HomeViewControllerWithBannerWrapperViewController: UIViewController, MXKVi func stopActivityIndicator() { homeViewController.stopActivityIndicator() } + + // MARK: - MasterTabBarItemDisplayProtocol + + var masterTabBarItemTitle: String { + return VectorL10n.titleHome + } } diff --git a/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/fr.lproj/MatrixKit.strings b/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/fr.lproj/MatrixKit.strings index 03688dc76..380b96677 100644 --- a/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/fr.lproj/MatrixKit.strings +++ b/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/fr.lproj/MatrixKit.strings @@ -478,3 +478,4 @@ "attachment_unsupported_preview_message" = "Ce type de fichier n’est pas pris en charge."; "attachment_unsupported_preview_title" = "Prévisualisation impossible"; "room_displayname_all_other_members_left" = "%@ (Quitté)"; +"message_reply_to_sender_sent_their_location" = "a partagé sa localisation."; diff --git a/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/ja.lproj/MatrixKit.strings b/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/ja.lproj/MatrixKit.strings index c4918a35e..b6611ded7 100644 --- a/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/ja.lproj/MatrixKit.strings +++ b/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/ja.lproj/MatrixKit.strings @@ -2,9 +2,9 @@ // Login Screen "login_create_account" = "アカウント作成:"; "login_server_url_placeholder" = "URL (例 https://matrix.org)"; -"login_home_server_title" = "接続先サーバURL:"; -"login_home_server_info" = "あなたの接続先サーバは、あなたの全ての会話とアカウント情報を保存します"; -"login_identity_server_title" = "認証サーバURL:"; +"login_home_server_title" = "接続先サーバーURL:"; +"login_home_server_info" = "あなたの接続先サーバーは、あなたの全ての会話とアカウント情報を保存します"; +"login_identity_server_title" = "認証サーバーURL:"; "login_password_placeholder" = "パスワード"; "login_email_placeholder" = "メールアドレス"; // Action @@ -12,11 +12,11 @@ "yes" = "はい"; "back" = "戻る"; "close" = "閉じる"; -"continue" = "続く"; +"continue" = "続ける"; "sign_up" = "登録"; -"resend_message" = "メッセージを再送信する"; +"resend_message" = "メッセージを再送信"; "select_all" = "全て選択"; -"show_details" = "詳細を表示する"; +"show_details" = "詳細を表示"; "login_identity_server_info" = "Matrixは、どの電子メールなどがどのMatrix IDに属しているかを追跡するアイデンティティサーバーを提供します。 現在 https://matrix.org のみが存在します。"; "login_user_id_placeholder" = "Matrix ID(例 @bob:matrix.org または bob)"; "login_optional_field" = "オプション"; @@ -25,16 +25,16 @@ "login_prompt_email_token" = "メールの検証トークンを入力してください:"; "login_error_title" = "ログインに失敗しました"; "login_error_no_login_flow" = "このホームサーバーから認証情報を取得できませんでした"; -"login_error_do_not_support_login_flows" = "現在、このホームサーバーによって定義されたログインフローの一部またはすべてをサポートしていません"; +"login_error_do_not_support_login_flows" = "現在、このホームサーバーによって定義されたログインフローの一部または全てをサポートしていません"; "login_error_registration_is_not_supported" = "登録は現在サポートされていません"; "login_error_forbidden" = "無効なユーザー名/パスワード"; "login_error_unknown_token" = "指定されたアクセストークンが認識されませんでした"; "login_error_bad_json" = "不正な形式のJSON"; "login_error_not_json" = "有効なJSONを含んでいませんでした"; "login_error_limit_exceeded" = "あまりにも多くのリクエストが送られました"; -"login_error_user_in_use" = "このユーザー名はすでに使用されています"; +"login_error_user_in_use" = "このユーザー名は既に使用されています"; "login_error_login_email_not_yet" = "まだクリックされていないメールリンク"; -"login_use_fallback" = "フォールバックページを使用する"; +"login_use_fallback" = "フォールバックページを使用"; "login_leave_fallback" = "キャンセル"; "login_invalid_param" = "無効なパラメーター"; "register_error_title" = "登録に失敗しました"; @@ -46,46 +46,46 @@ "login_error_resource_limit_exceeded_message_default" = "このホームサーバーは、リソース制限の1つを超えています。"; "login_error_resource_limit_exceeded_message_monthly_active_user" = "このホームサーバーは、月間アクティブユーザー制限を超えています。"; "login_error_resource_limit_exceeded_message_contact" = "\n\nこのサービスを続行するには、サービス管理者に連絡してください。"; -"login_error_resource_limit_exceeded_contact_button" = "管理者に連絡する"; -"abort" = "中断する"; +"login_error_resource_limit_exceeded_contact_button" = "管理者に連絡"; +"abort" = "中断"; "discard" = "破棄"; -"dismiss" = "却下する"; +"dismiss" = "却下"; "retry" = "再試行"; "submit" = "提出"; "submit_code" = "コードを送信"; "set_default_power_level" = "権限レベルをリセット"; "set_moderator" = "モデレーターを設定"; "set_admin" = "管理者を設定"; -"start_chat" = "チャットを始める"; +"start_chat" = "チャットを開始"; "start_voice_call" = "音声通話を開始"; "start_video_call" = "ビデオ通話を開始"; -"mention" = "記載"; +"mention" = "メンション"; "select_account" = "アカウントを選択"; "attach_media" = "ライブラリからメディアを添付"; "capture_media" = "写真/ビデオを撮る"; -"invite_user" = "matrixユーザーを招待"; +"invite_user" = "Matrixユーザーを招待"; "reset_to_default" = "デフォルトにリセット"; "cancel_upload" = "アップロードをキャンセル"; "cancel_download" = "ダウンロードをキャンセル"; -"answer_call" = "通話に応答する"; -"reject_call" = "通話を拒否する"; +"answer_call" = "通話に応答"; +"reject_call" = "通話を拒否"; "end_call" = "通話終了"; "ignore" = "無視"; // Events formatter -"notice_avatar_changed_too" = "(アバターも変わった)"; -"notice_room_name_removed" = "%@は部屋名を削除しました"; -"notice_room_topic_removed" = "%@はトピックを削除しました"; +"notice_avatar_changed_too" = "(アバターも変更されました)"; +"notice_room_name_removed" = "%@がルーム名を削除しました"; +"notice_room_topic_removed" = "%@がトピックを削除しました"; "notice_event_redacted" = "<編集された%@>"; "notice_event_redacted_by" = " %@により"; "notice_event_redacted_reason" = " [理由: %@]"; -"notice_profile_change_redacted" = "%@は彼らのプロフィール %@を更新しました"; -"notice_room_created" = "%@は部屋を作成しました"; +"notice_profile_change_redacted" = "%@が彼らのプロフィール %@を更新しました"; +"notice_room_created" = "%@がルームを作成しました"; "notice_room_join_rule" = "結合ルールは次のとおり: %@"; "notice_room_power_level_intro" = "ルームメンバーの権限レベル:"; "notice_room_power_level_acting_requirement" = "アクション前にユーザーの必要な最小権限レベル:"; "notice_room_power_level_event_requirement" = "イベントに関連する最小権限レベル:"; "notice_room_aliases" = "ルームエイリアス: %@"; -"notice_room_related_groups" = "この部屋に関連付けられたグループ: %@"; +"notice_room_related_groups" = "このルームに関連付けられたグループ: %@"; "notice_encrypted_message" = "暗号化されたメッセージ"; "notice_encryption_enabled" = "%@はエンドツーエンド暗号化を有効にする (アルゴリズム %@)"; "notice_image_attachment" = "画像添付"; @@ -100,16 +100,16 @@ "notice_error_unsupported_event" = "サポートされていないイベント"; "notice_error_unexpected_event" = "予期しないイベント"; "notice_error_unknown_event_type" = "不明なイベントタイプ"; -"notice_room_history_visible_to_anyone" = "%@ 誰でも将来の部屋履歴を表示されます。"; -"notice_room_history_visible_to_members" = "%@ ルームメンバー全員に将来の部屋履歴を表示されます。"; -"notice_room_history_visible_to_members_from_invited_point" = "%@ ルームメンバー全員に招待した時点からの部屋履歴を表示されます。"; -"notice_room_history_visible_to_members_from_joined_point" = "%@ ルームメンバー全員に参加した時点からの部屋履歴を表示されます。"; +"notice_room_history_visible_to_anyone" = "%@が今後のルーム履歴を「誰でも」閲覧可能に設定しました。"; +"notice_room_history_visible_to_members" = "%@が今後のルーム履歴を「メンバーのみ」閲覧可能に設定しました。"; +"notice_room_history_visible_to_members_from_invited_point" = "%@が今後のルーム履歴を「メンバーのみ (招待された時点以降)」閲覧可能に設定しました。"; +"notice_room_history_visible_to_members_from_joined_point" = "%@が今後のルーム履歴を「メンバーのみ (参加した時点以降)」閲覧可能に設定しました。"; "notice_crypto_unable_to_decrypt" = "** 復号化できません: %@ **"; -"notice_crypto_error_unknown_inbound_session_id" = "送信者のセッションからこのメッセージのキーが送信されていません。"; +"notice_crypto_error_unknown_inbound_session_id" = "送信者のセッションからこのメッセージ用の鍵が送信されていません。"; "notice_sticker" = "ステッカー"; -"notice_in_reply_to" = "に返信"; +"notice_in_reply_to" = "返信先"; // room display name -"room_displayname_empty_room" = "空の部屋"; +"room_displayname_empty_room" = "空のルーム"; "room_displayname_two_members" = "%@ と %@"; "room_displayname_more_than_two_members" = "%@ と %@ 他"; // Settings @@ -117,26 +117,26 @@ "settings_enable_inapp_notifications" = "アプリ内通知を有効にする"; "settings_enable_push_notifications" = "プッシュ通知を有効にする"; "settings_enter_validation_token_for" = "%@の検証トークンを入力:"; -"notification_settings_room_rule_title" = "部屋: '%@'"; +"notification_settings_room_rule_title" = "ルーム: '%@'"; // Devices "device_details_title" = "セッション情報\n"; "device_details_name" = "名前\n"; "device_details_identifier" = "ID\n"; -"device_details_last_seen" = "ラストシーン\n"; +"device_details_last_seen" = "最終接続日\n"; "device_details_last_seen_format" = "%@ @ %@\n"; -"device_details_rename_prompt_message" = "端末名:"; +"device_details_rename_prompt_message" = "セッションの公開名は、あなたとやり取りする人々に対して表示されます"; "device_details_delete_prompt_title" = "認証"; "device_details_delete_prompt_message" = "この操作には、追加の認証が必要です。\n続行するには、パスワードを入力してください。"; // Encryption information "room_event_encryption_info_title" = "エンドツーエンド暗号化情報\n\n"; "room_event_encryption_info_event" = "イベント情報\n"; "room_event_encryption_info_event_user_id" = "ユーザーID\n"; -"room_event_encryption_info_event_identity_key" = "Curve25519 identity key\n"; -"room_event_encryption_info_event_fingerprint_key" = "クレームされたEd25519指紋キー\n"; +"room_event_encryption_info_event_identity_key" = "Curve25519 固有鍵\n"; +"room_event_encryption_info_event_fingerprint_key" = "要求されたフィンガープリントキー Ed25519\n"; "room_event_encryption_info_event_algorithm" = "アルゴリズム\n"; "room_event_encryption_info_event_session_id" = "セッションID\n"; "room_event_encryption_info_event_decryption_error" = "復号化エラー\n"; -"room_event_encryption_info_event_unencrypted" = "暗号化されていない"; +"room_event_encryption_info_event_unencrypted" = "暗号化されていません"; "room_event_encryption_info_event_none" = "なし"; "room_event_encryption_info_device" = "\n送信者セッション情報\n"; "room_event_encryption_info_device_unknown" = "未知のセッション\n"; @@ -144,52 +144,52 @@ "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" = "検証中..."; +"room_event_encryption_info_verify" = "検証しています…"; "room_event_encryption_info_unverify" = "未検証"; "room_event_encryption_info_block" = "ブラックリスト"; "room_event_encryption_info_unblock" = "ブラックでないリスト"; "room_event_encryption_verify_title" = "セッション検証\n\n"; -"room_event_encryption_verify_message" = "このセッションが信頼できることを確認するには、他の方法(個人や電話など)で所有者に連絡し、セッションのユーザー設定で表示される鍵が以下のキーと一致するかどうかを尋ねます。\n\nセッション名: %@\nセッションID: %@\nセッションkey: %@\n\n一致する場合は、下の確認ボタンを押します。 それ以外の人がこのセッションを傍受している場合は、代わりにブラックリストボタンを押してください。\n\n将来この検証プロセスはより洗練されたものになるでしょう。"; +"room_event_encryption_verify_message" = "このセッションが信頼できることを確認するには、他の方法(対面や電話など)で所有者に連絡し、セッションのユーザー設定で表示される鍵が以下の鍵と一致するかどうかを訪ねてください。\n\nセッション名: %@\nセッションID: %@\nセッションキー: %@\n\n一致する場合は、下の確認ボタンを押します。 それ以外の人がこのセッションを傍受している場合は、代わりにブラックリストボタンを押してください。\n\n将来この検証プロセスはより洗練されたものになります。"; "room_event_encryption_verify_ok" = "検証"; // Account "account_save_changes" = "変更を保存"; "account_link_email" = "リンクメール"; "account_linked_emails" = "リンクされたメール"; -"account_email_validation_title" = "検証保留中"; -"account_email_validation_message" = "メールをチェックし、それに含まれているリンクをクリックしてください。 これが完了したら、[続行]をクリックします。"; -"account_email_validation_error" = "メールアドレスを確認できません。 あなたのメールをチェックし、それに含まれているリンクをクリックしてください。 これが完了したら、[続行]をクリックします"; -"account_msisdn_validation_title" = "検証保留中"; -"account_msisdn_validation_message" = "アクティベーションコード付きのSMSを送信しました。 以下にこのコードを入力してください。"; +"account_email_validation_title" = "認証の保留中"; +"account_email_validation_message" = "電子メールを確認して、本文中のURLをクリックしてください。完了したら「続行する」をクリックしてください。"; +"account_email_validation_error" = "メールアドレスを認証できません。メールを確認して、記載されているリンクをクリックしてください。その後、「続行する」をクリックしてください"; +"account_msisdn_validation_title" = "認証の保留中"; +"account_msisdn_validation_message" = "SMSで認証番号を送りました。以下にその番号を入力してください。"; "account_msisdn_validation_error" = "電話番号を確認できません。"; "account_error_display_name_change_failed" = "表示名の変更に失敗しました"; "account_error_picture_change_failed" = "画像の変更に失敗しました"; "account_error_matrix_session_is_not_opened" = "Matrixセッションが開かれていません"; "account_error_email_wrong_title" = "無効な電子メールアドレス"; -"account_error_email_wrong_description" = "これは有効なメールアドレスではないようです"; +"account_error_email_wrong_description" = "メールアドレスの形式が正しくありません"; "account_error_msisdn_wrong_title" = "無効な電話番号"; -"account_error_msisdn_wrong_description" = "これは有効な電話番号ではないようです"; +"account_error_msisdn_wrong_description" = "電話番号の形式が正しくありません"; // Room creation -"room_creation_name_title" = "部屋名:"; +"room_creation_name_title" = "ルーム名:"; "room_creation_name_placeholder" = "(例 ランチグループ)"; -"room_creation_alias_title" = "部屋の別名:"; +"room_creation_alias_title" = "ルームの別名:"; "room_creation_alias_placeholder" = "(例 #foo:example.org)"; "room_creation_alias_placeholder_with_homeserver" = "(例 #foo%@)"; "room_creation_participants_title" = "参加者:"; -"room_creation_participants_placeholder" = "(例 @bob:homeserver1; @john:homeserver2...)"; +"room_creation_participants_placeholder" = "(例 @bob:homeserver1; @john:homeserver2…)"; // Room -"room_please_select" = "部屋を選択してください"; -"room_error_join_failed_title" = "部屋に参加できませんでした"; -"room_error_join_failed_empty_room" = "現在空の部屋に再参加することはできません。"; -"room_error_name_edition_not_authorized" = "この部屋の名前を編集する権限がありません"; -"room_error_topic_edition_not_authorized" = "この部屋のトピックを編集する権限がありません"; +"room_please_select" = "ルームを選択してください"; +"room_error_join_failed_title" = "ルームに参加できませんでした"; +"room_error_join_failed_empty_room" = "現在空のルームに再参加することはできません。"; +"room_error_name_edition_not_authorized" = "このルームの名前を編集する権限がありません"; +"room_error_topic_edition_not_authorized" = "このルームのトピックを編集する権限がありません"; "room_error_cannot_load_timeline" = "タイムラインの読み込みに失敗しました"; "room_error_timeline_event_not_found_title" = "タイムラインの位置を読み込めませんでした"; "room_error_timeline_event_not_found" = "アプリケーションがこのルームのタイムラインに特定のポイントをロードしようとしましたが、それを見つけることができませんでした"; -"room_left" = "あなたは部屋を出ました"; -"room_no_power_to_create_conference_call" = "この部屋で会議を開始するために招待する権限が必要です"; +"room_left" = "あなたはルームを出ました"; +"room_no_power_to_create_conference_call" = "このルームで会議を開始するために招待する権限が必要です"; "room_no_conference_call_in_encrypted_rooms" = "暗号化された会議室では会議通話はサポートされません"; // Reply to message "message_reply_to_sender_sent_an_image" = "画像を送信しました。"; @@ -198,7 +198,7 @@ "message_reply_to_sender_sent_a_file" = "ファイルを送信しました。"; "message_reply_to_message_to_reply_to_prefix" = "に返信"; // Room members -"room_member_ignore_prompt" = "このユーザーからのすべてのメッセージを非表示にしますか?"; +"room_member_ignore_prompt" = "このユーザーからの全てのメッセージを非表示にしますか?"; "room_member_power_level_prompt" = "この変更を元に戻すことはできません。ユーザーが自分と同じレベルの権限を持つように促しますが、よろしいですか?"; // Attachment "attachment_size_prompt" = "次のように送信しますか:"; @@ -210,8 +210,8 @@ "attachment_cancel_upload" = "アップロードをキャンセルしますか?"; "attachment_multiselection_size_prompt" = "画像を次のように送信しますか:"; "attachment_multiselection_original" = "実際のサイズ"; -"attachment_e2e_keys_file_prompt" = "このファイルには、Matrixクライアントからエクスポートされた暗号化キーが含まれています。\nファイルの内容を表示するか、ファイルの内容をインポートしますか?"; -"attachment_e2e_keys_import" = "インポート..."; +"attachment_e2e_keys_file_prompt" = "このファイルには、Matrixクライアントからエクスポートされた暗号鍵が含まれています。\nファイルの内容を表示するか、ファイル内の鍵をインポートしますか?"; +"attachment_e2e_keys_import" = "インポート…"; // Contacts "contact_mx_users" = "Matrixユーザー"; "contact_local_contacts" = "ローカルの連絡先"; @@ -220,20 +220,20 @@ "group_section" = "グループ"; // Search "search_no_results" = "結果がありません"; -"search_searching" = "検索中..."; +"search_searching" = "検索しています…"; // Time "format_time_s" = "秒"; "format_time_m" = "分"; "format_time_h" = "時"; "format_time_d" = "日"; // E2E import -"e2e_import_room_keys" = "ルームキーをインポート"; -"e2e_import_prompt" = "このプロセスでは、以前に別のMatrixクライアントからエクスポートした暗号化キーをインポートできます。 これにより、他のクライアントが解読できるすべてのメッセージを解読することができます。\nエクスポートファイルはパスフレーズで保護されています。 ファイルを解読するには、パスフレーズをここに入力する必要があります。"; +"e2e_import_room_keys" = "ルームの暗号鍵をインポート"; +"e2e_import_prompt" = "このプロセスでは、以前に別のMatrixクライアントからエクスポートした暗号鍵をインポートできます。 これにより、他のクライアントが解読できる全てのメッセージを解読することができます。\nエクスポートした暗号鍵のファイルは、パスフレーズで保護されています。 ファイルを復号化するには、パスフレーズをここに入力する必要があります。"; "e2e_import" = "インポート"; "e2e_passphrase_enter" = "パスフレーズを入力"; // E2E export -"e2e_export_room_keys" = "ルームキーのエクスポート"; -"e2e_export_prompt" = "このプロセスでは、暗号化されたルームで受信したメッセージのキーをローカルファイルにエクスポートできます。 その後、クライアントがこれらのメッセージを復号化できるように、ファイルを別のMatrixクライアントにインポートすることができます。\nエクスポートされたファイルは、誰でも閲覧できる暗号化されたメッセージを復号化することができるので、安全に保つように注意する必要があります。"; +"e2e_export_room_keys" = "ルームの暗号鍵をエクスポート"; +"e2e_export_prompt" = "このプロセスでは、暗号化されたルームで受信したメッセージの鍵をローカルファイルにエクスポートできます。 そのファイルを別のMatrixクライアントにインポートすると、クライアントはこれらのメッセージを復号化することができます。\nエクスポートしたファイルを使えば、誰でも暗号化されたメッセージを復号化できるので、ファイルを安全に保つように注意する必要があります。"; "e2e_export" = "エクスポート"; "e2e_passphrase_confirm" = "パスフレーズを確認"; "e2e_passphrase_empty" = "パスフレーズは空であってはいけません"; @@ -247,8 +247,8 @@ "error_common_message" = "エラーが発生しました。 後でもう一度お試しください。"; "not_supported_yet" = "まだサポートされていません"; "default" = "既定"; -"private" = "Private"; -"public" = "Public"; +"private" = "非公開"; +"public" = "公開"; "power_level" = "権限レベル"; "network_error_not_reachable" = "ネットワーク接続を確認してください"; "user_id_placeholder" = "例: @bob:homeserver"; @@ -260,39 +260,39 @@ "local_contacts_access_discovery_warning_title" = "ユーザーの探索"; "local_contacts_access_discovery_warning" = "%@は、ユーザーを検索するためにあなたの連絡先から電子メールと電話番号をアップロードしたい"; // Country picker -"country_picker_title" = "国を選択する"; +"country_picker_title" = "国を選択"; // Language picker -"language_picker_title" = "言語を選択する"; +"language_picker_title" = "言語を選択"; "language_picker_default_language" = "既定値 (%@)"; -"notice_room_invite" = "%@は%@を招待しました"; -"notice_room_third_party_invite" = "%@は、部屋に参加するよう%@へ招待状を送った"; -"notice_room_third_party_registered_invite" = "%@は%@の招待を受け入れました"; -"notice_room_join" = "%@ は参加しました"; -"notice_room_leave" = "%@ は退出しました"; -"notice_room_reject" = "%@は招待を拒否しました"; -"notice_room_kick" = "%@は%@を追い出しました"; -"notice_room_unban" = "%@は%@を追放解除した"; -"notice_room_ban" = "%@は%@を追放した"; -"notice_room_withdraw" = "%@は%@の招待を辞退しました"; +"notice_room_invite" = "%@が%@を招待しました"; +"notice_room_third_party_invite" = "%@が%@にルームへの招待状を送りました"; +"notice_room_third_party_registered_invite" = "%@が%@の招待を受け入れました"; +"notice_room_join" = "%@が参加しました"; +"notice_room_leave" = "%@が退出しました"; +"notice_room_reject" = "%@が招待を拒否しました"; +"notice_room_kick" = "%@が%@を追い出しました"; +"notice_room_unban" = "%@が%@を追放解除しました"; +"notice_room_ban" = "%@が%@を追放しました"; +"notice_room_withdraw" = "%@が%@の招待を辞退しました"; "notice_room_reason" = ". 理由: %@"; -"notice_avatar_url_changed" = "%@はアバターを変更しました"; -"notice_display_name_set" = "%@は表示名を%@に設定しました"; -"notice_display_name_changed_from" = "%@は表示名を%@から%@に変更しました"; -"notice_display_name_removed" = "%@は表示名を削除しました"; -"notice_topic_changed" = "%@はトピックを次のように変更しました: %@"; -"notice_room_name_changed" = "%@は部屋名を次のように変更しました: %@"; -"notice_placed_voice_call" = "%@は電話をかけました"; -"notice_placed_video_call" = "%@はビデオ電話をかけました"; -"notice_answered_video_call" = "%@は通話に応答しました"; -"notice_ended_video_call" = "%@は通話を終了しました"; -"notice_conference_call_request" = "%@はVoIP会議をリクエストしました"; -"notice_conference_call_started" = "VoIP会議が開始されました"; +"notice_avatar_url_changed" = "%@がアバターを変更しました"; +"notice_display_name_set" = "%@が表示名を%@に設定しました"; +"notice_display_name_changed_from" = "%@が表示名を%@から%@に変更しました"; +"notice_display_name_removed" = "%@が表示名を削除しました"; +"notice_topic_changed" = "%@がトピックを次のように変更しました:%@"; +"notice_room_name_changed" = "%@がルーム名を次のように変更しました:%@"; +"notice_placed_voice_call" = "%@が電話をかけました"; +"notice_placed_video_call" = "%@がビデオ電話をかけました"; +"notice_answered_video_call" = "%@が電話に出ました"; +"notice_ended_video_call" = "%@が通話を終了しました"; +"notice_conference_call_request" = "%@がVoIP会議をリクエストしました"; +"notice_conference_call_started" = "VoIP会議が開始しました"; "notice_conference_call_finished" = "VoIP会議が終了しました"; // button names "ok" = "OK"; "cancel" = "キャンセル"; "save" = "保存"; -"leave" = "保存しない"; +"leave" = "退出"; "send" = "送信"; "copy_button_name" = "コピー"; "resend" = "再送信"; @@ -303,34 +303,34 @@ "view" = "表示"; // actions "action_logout" = "ログアウト"; -"create_room" = "部屋を作る"; +"create_room" = "ルームを作る"; "login" = "ログイン"; -"create_account" = "アカウントを作成する"; -"membership_invite" = "招待した"; -"membership_leave" = "退出"; -"membership_ban" = "追放"; +"create_account" = "アカウントを作成"; +"membership_invite" = "招待しました"; +"membership_leave" = "退出しました"; +"membership_ban" = "ブロックしました"; "num_members_one" = "%@ ユーザー"; "num_members_other" = "%@ ユーザー"; "invite" = "招待"; -"kick" = "追い出す"; -"ban" = "追放"; -"unban" = "追放解除"; -"message_unsaved_changes" = "保存されていない変更があります。 放置すると捨てられます。"; +"kick" = "キック"; +"ban" = "ブロック"; +"unban" = "ブロック解除"; +"message_unsaved_changes" = "保存されていない変更があります。 退出すると変更は取り消されます。"; // Login Screen -"login_error_already_logged_in" = "ログイン済み"; +"login_error_already_logged_in" = "ログイン済"; "login_error_must_start_http" = "URLは http[s]:// で始まる必要があります"; // room details dialog screen -"room_details_title" = "部屋の詳細"; +"room_details_title" = "ルームの詳細"; // contacts list screen "invitation_message" = "私はmatrixであなたとチャットしたい。 詳細はウェブサイトhttp://matrix.orgをお尋ねください。"; // Settings screen "settings_title_config" = "構成"; "settings_title_notifications" = "通知"; // Notification settings screen -"notification_settings_disable_all" = "すべての通知を無効にする"; +"notification_settings_disable_all" = "全ての通知を無効にする"; "notification_settings_enable_notifications" = "通知を有効にする"; -"notification_settings_enable_notifications_warning" = "現在、すべての端末ですべての通知が無効になっています。"; -"notification_settings_global_info" = "通知設定はユーザーアカウントに保存され、デスクトップ通知を含むすべてのクライアント間で共有されます。\n\nルールは順番に適用されます。 一致する最初のルールは、メッセージの結果を定義します。\nだから:単語ごとの通知は、送信者ごとの通知よりも重要な部屋ごとの通知よりも重要です。\n同じ種類の複数のルールの場合、一致するリストの最初のルールが優先されます。"; +"notification_settings_enable_notifications_warning" = "現在、全ての端末で全ての通知が無効になっています。"; +"notification_settings_global_info" = "通知設定はユーザーアカウントに保存され、デスクトップ通知を含む全てのクライアント間で共有されます。\n\nルールは順番に適用されます。 一致する最初のルールは、メッセージの結果を定義します。\nだから:単語ごとの通知は、送信者ごとの通知よりも重要なルームごとの通知よりも重要です。\n同じ種類の複数のルールの場合、一致するリストの最初のルールが優先されます。"; "notification_settings_per_word_notifications" = "単語単位の通知"; "notification_settings_per_word_info" = "単語は大文字と小文字を区別せずに一致させ、*ワイルドカードを含めることができます。 従って:\nfooは、区切り文字で囲まれた文字列foo(例 句読点や空白、行の開始/終了)と一致します。\nfoo*は、fooで始まる単語に一致します。\n*foo*は、3文字のfooを含む単語に一致します。"; "notification_settings_always_notify" = "常に通知"; @@ -338,27 +338,27 @@ "notification_settings_word_to_match" = "一致する単語"; "notification_settings_highlight" = "Highlight"; "notification_settings_custom_sound" = "カスタムサウンド"; -"notification_settings_per_room_notifications" = "1部屋あたりの通知"; +"notification_settings_per_room_notifications" = "1ルームあたりの通知"; "notification_settings_per_sender_notifications" = "送信者ごとの通知"; "notification_settings_sender_hint" = "@user:domain.com"; -"notification_settings_select_room" = "部屋を選択"; +"notification_settings_select_room" = "ルームを選択"; "notification_settings_other_alerts" = "その他のアラート"; "notification_settings_contain_my_user_name" = "私のユーザー名を含むメッセージについて音で私に通知してください"; -"notification_settings_contain_my_display_name" = "私の表示名が含まれているメッセージについて音で私に通知する"; +"notification_settings_contain_my_display_name" = "私の表示名が含まれているメッセージが届いた際に音で通知"; "notification_settings_just_sent_to_me" = "私に送られたメッセージについての音で私に知らせる"; -"notification_settings_invite_to_a_new_room" = "私が新しい部屋に招待されたときに知らせる"; -"notification_settings_people_join_leave_rooms" = "人が部屋に入退室したときに私に通知する"; -"notification_settings_receive_a_call" = "通話を受信したときに通知する"; -"notification_settings_suppress_from_bots" = "ボットからの通知を抑制する"; -"notification_settings_by_default" = "既定値では..."; -"notification_settings_notify_all_other" = "他のすべてのメッセージ/部屋について通知する"; +"notification_settings_invite_to_a_new_room" = "私が新しいルームに招待されたときに知らせる"; +"notification_settings_people_join_leave_rooms" = "誰かがルームに参加もしくは退出したときに通知"; +"notification_settings_receive_a_call" = "通話を受信したときに通知"; +"notification_settings_suppress_from_bots" = "ボットからの通知を抑制"; +"notification_settings_by_default" = "既定値では…"; +"notification_settings_notify_all_other" = "他の全てのメッセージ/ルームについて通知"; // gcm section "settings_config_home_server" = "ホームサーバー: %@"; "settings_config_identity_server" = "IDサーバー: %@"; "settings_config_user_id" = "ユーザーID: %@"; // call string "call_waiting" = "待機中..."; -"call_connecting" = "通話接続中..."; +"call_connecting" = "通話接続中…"; "call_ended" = "通話終了"; "call_ring" = "呼び出し中..."; "incoming_video_call" = "着信ビデオ通話"; @@ -374,36 +374,41 @@ "ssl_cert_new_account_expl" = "サーバー管理者がこれが予期されると述べた場合は、以下の指紋が提供された指紋と一致することを確認してください。"; "ssl_unexpected_existing_expl" = "証明書は、お使いの携帯電話にて信頼されたものから変更されました。 これは非常に珍しいことです。 この新しい証明書に同意しないことをお勧めします。"; "ssl_expected_existing_expl" = "証明書が以前に信頼されたものから信頼されていないものに変更されました。 サーバーが証明書を更新した可能性があります。 予想される指紋については、サーバー管理者にお問い合わせください。"; -"ssl_only_accept" = "サーバー管理者が上記のものと一致する指紋を発行した場合にのみ、証明書を受け入れます。"; +"ssl_only_accept" = "サーバー管理者が上記のものと一致する指紋を発行した場合にのみ、証明書を受け入れてください。"; "unignore" = "無視しない"; -"notice_encryption_enabled_ok" = "%@ がエンドツーエンド暗号化をオンにしました。"; -"notice_encryption_enabled_unknown_algorithm" = "%1$@ がエンドツーエンド暗号化をオンにしました (不明なアルゴリズム %2$@)。"; +"notice_encryption_enabled_ok" = "%@がエンドツーエンド暗号化をオンにしました。"; +"notice_encryption_enabled_unknown_algorithm" = "%1$@がエンドツーエンド暗号化をオンにしました(不明なアルゴリズム %2$@)。"; "device_details_rename_prompt_title" = "セッション名"; "account_error_push_not_allowed" = "通知は許可されていません"; -"notice_room_third_party_revoked_invite" = "%@ は %@ の部屋への招待を取り消しました"; +"notice_room_third_party_revoked_invite" = "%@が%@のルームへの招待を取り消しました"; // Notice Events with "You" "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" = "%@をBANしました"; -"notice_room_ban_by_you" = "%@をBANしました"; +"notice_room_unban_by_you" = "%@のブロックを解除しました"; +"notice_room_ban_by_you" = "%@をブロックしました"; "notice_avatar_url_changed_by_you" = "アバターを変更しました"; "notice_display_name_set_by_you" = "表示名を%@に変更しました"; "notice_display_name_changed_from_by_you" = "表示名を%@から%@に変更しました"; "notice_display_name_removed_by_you" = "表示名を削除しました"; "notice_topic_changed_by_you" = "トピックを変更しました: %@"; -"notice_room_name_changed_by_you" = "部屋の名前を変更しました: %@"; +"notice_room_name_changed_by_you" = "ルームの名前を変更しました: %@"; "notice_placed_voice_call_by_you" = "音声通話を開始しました"; "notice_placed_video_call_by_you" = "ビデオ通話を開始しました"; "notice_answered_video_call_by_you" = "電話に出ました"; "notice_ended_video_call_by_you" = "通話を終了しました"; "notice_conference_call_request_by_you" = "VoIP会議をリクエストしました"; -"notice_room_name_removed_by_you" = "部屋名を削除しました"; +"notice_room_name_removed_by_you" = "ルーム名を削除しました"; "notice_room_topic_removed_by_you" = "トピックを削除しました"; "notice_profile_change_redacted_by_you" = "プロフィール %@を更新しました"; -"notice_room_created_by_you" = "部屋を作成しました"; +"notice_room_created_by_you" = "ルームを作成しました"; "notice_encryption_enabled_ok_by_you" = "あなたはエンドツーエンド暗号化をオンにしました。"; "notice_encryption_enabled_unknown_algorithm_by_you" = "あなたはエンドツーエンド暗号化をオンにしました (不明なアルゴリズム %2$@)。"; "notice_redaction_by_you" = "イベントを編集しました (id: %@)"; +"auth_username_in_use" = "ユーザー名は既に使用されています"; +"resume_call" = "再開"; +"notice_room_history_visible_to_members_from_joined_point_for_dm" = "%@が今後のメッセージを「全員 (参加した時点以降)」閲覧可能に設定しました。"; +"notice_room_history_visible_to_members_from_invited_point_for_dm" = "%@が今後のメッセージを「メンバーのみ (招待された時点以降)」閲覧可能に設定しました。"; +"notice_room_history_visible_to_members_for_dm" = "%@が今後のメッセージを「メンバーのみ」閲覧可能に設定しました。"; diff --git a/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/sk.lproj/MatrixKit.strings b/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/sk.lproj/MatrixKit.strings index 7bd5de0d0..0d7cc424a 100644 --- a/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/sk.lproj/MatrixKit.strings +++ b/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/sk.lproj/MatrixKit.strings @@ -14,7 +14,7 @@ "account_save_changes" = "Uložiť zmeny"; "room_event_encryption_verify_title" = "Overiť reláciu\n\n"; "room_event_encryption_info_device_not_verified" = "Neoverené"; -"room_event_encryption_info_device_fingerprint" = "Ed25519 odtlačok prsta\n"; +"room_event_encryption_info_device_fingerprint" = "Odtlačok Ed25519\n"; "room_event_encryption_info_device_name" = "Verejný názov\n"; "room_event_encryption_info_device_unknown" = "neznáma relácia\n"; "room_event_encryption_info_event_decryption_error" = "Chyba dešifrovania\n"; @@ -439,16 +439,16 @@ "notice_room_power_level_event_requirement" = "Minimálne úrovne oprávnenia súvisiace s udalosťami sú:"; "notice_room_join_rule_public_for_dm" = "%@ ju zverejnil/a."; "notice_room_join_rule_public" = "%@ zverejnil/a túto miestnosť."; -"notice_room_join_rule_invite_by_you_for_dm" = "Ste ju vytvorili len na pozvanie."; -"notice_room_join_rule_invite_for_dm" = "%@ ju vytvoril len na pozvanie."; +"notice_room_join_rule_invite_by_you_for_dm" = "Ste ju nastavili len na pozvanie."; +"notice_room_join_rule_invite_for_dm" = "%@ ju nastavil/a len na pozvanie."; "notice_event_redacted" = ""; "capture_media" = "Spraviť fotografiu/video"; "auth_reset_password_error_unauthorized" = "Neoprávnené"; "auth_invalid_user_name" = "Neplatné používateľské meno"; -"ssl_only_accept" = "Certifikát akceptujte IBA vtedy, ak správca servera zverejnil odtlačok prsta, ktorý sa zhoduje s vyššie uvedeným."; +"ssl_only_accept" = "Certifikát akceptujte IBA vtedy, ak správca servera zverejnil odtlačok, ktorý sa zhoduje s vyššie uvedeným."; "ssl_expected_existing_expl" = "Certifikát sa zmenil z predtým dôveryhodného na nedôveryhodný. Server mohol obnoviť svoj certifikát. Obráťte sa na správcu servera, aby vám poskytol očakávaný odtlačok."; "ssl_unexpected_existing_expl" = "Certifikát sa zmenil na iný, ktorému dôveroval váš telefón. To je VEĽMI NEOBVYKLÉ. Odporúča sa, aby ste tento nový certifikát NEPRIJALI."; -"ssl_cert_new_account_expl" = "Ak správca servera uviedol, že sa to očakáva, skontrolujte, či sa odtlačok prsta uvedený nižšie zhoduje s odtlačkom prsta, ktorý poskytol."; +"ssl_cert_new_account_expl" = "Ak správca servera uviedol, že sa to očakáva, skontrolujte, či sa odtlačok uvedený nižšie zhoduje s odtlačkom, ktorý poskytol."; "ssl_cert_not_trust" = "Môže to znamenať, že niekto úmyselne zachytáva vašu komunikáciu alebo že váš telefón nedôveruje certifikátu, ktorý poskytol vzdialený server."; "ssl_could_not_verify" = "Nepodarilo sa overiť identitu vzdialeného servera."; @@ -488,9 +488,9 @@ "settings_enter_validation_token_for" = "Zadajte overovací token pre %@:"; "notice_error_unexpected_event" = "Neočakávaná udalosť"; "notice_error_unsupported_event" = "Nepodporovaná udalosť"; -"notice_room_join_rule_invite_by_you" = "Urobili ste miestnosť len pre pozvaných."; +"notice_room_join_rule_invite_by_you" = "Nastavili ste miestnosť len pre pozvaných."; // New -"notice_room_join_rule_invite" = "%@ vytvoril miestnosť len na pozvanie."; +"notice_room_join_rule_invite" = "%@ nastavil/a miestnosť len na pozvanie."; // Old "notice_room_join_rule" = "Pravidlo pripojenia je: %@"; "notice_room_created" = "%@ vytvoril a nastavil miestnosť."; @@ -546,5 +546,12 @@ "message_reply_to_sender_sent_their_location" = "zdieľal/a svoju polohu."; "account_link_email" = "Prepojený email"; "account_linked_emails" = "Prepojené e-maily"; -"room_event_encryption_info_event_fingerprint_key" = "Deklarovaný kľúč odtlačkov prstov Ed25519\n"; +"room_event_encryption_info_event_fingerprint_key" = "Deklarovaný kľúč odtlačku Ed25519\n"; "notification_settings_notify_all_other" = "Oznámiť pre všetky ostatné správy/miestnosti"; +"call_transfer_to_user" = "Presmerovať na používateľa %@"; +"call_more_actions_transfer" = "Presmerovať"; +"login_use_fallback" = "Použiť náhradnú stránku"; +"call_consulting_with_user" = "Konzultácia s %@"; +"notification_settings_per_sender_notifications" = "Oznámenia na odosielateľa"; +"notification_settings_per_room_notifications" = "Oznámenia na miestnosti"; +"notification_settings_per_word_notifications" = "Oznámenia na slovo"; diff --git a/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/sv.lproj/MatrixKit.strings b/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/sv.lproj/MatrixKit.strings index ecadb738e..79192a6e2 100644 --- a/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/sv.lproj/MatrixKit.strings +++ b/Riot/Modules/MatrixKit/Assets/MatrixKitAssets.bundle/sv.lproj/MatrixKit.strings @@ -74,7 +74,7 @@ "ignore" = "Ignorera"; "unignore" = "Avignorera"; // Events formatter -"notice_avatar_changed_too" = "(avataren ändrades också)"; +"notice_avatar_changed_too" = "(avataren byttes också)"; "notice_room_name_removed" = "%@ tog bort rumsnamnet"; "notice_room_topic_removed" = "%@ tog bort ämnet"; "notice_event_redacted" = ""; @@ -307,7 +307,7 @@ "notice_room_unban_by_you" = "Du avbannade %@"; "notice_room_ban_by_you" = "Du bannade %@"; "notice_room_withdraw_by_you" = "Du drog tillbaka inbjudan för %@"; -"notice_avatar_url_changed_by_you" = "Du ändrade din avatar"; +"notice_avatar_url_changed_by_you" = "Du bytte din avatar"; "notice_display_name_set_by_you" = "Du bytte ditt visningsnamn till %@"; "notice_display_name_changed_from_by_you" = "Du bytte ditt visningsnamn från %@ till %@"; "notice_display_name_removed_by_you" = "Du tog bort ditt visningsnamn"; diff --git a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.h b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.h index 70bfe77d2..bc0f4e6bb 100644 --- a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.h +++ b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.h @@ -452,16 +452,16 @@ extern NSString *const kMXKRoomDataSourceTimelineErrorErrorKey; While sending, a fake event will be echoed in the messages list. Once complete, this local echo will be replaced by the event saved by the homeserver. - @param eventIdToReply the id of event to reply. + @param eventToReply the event to reply. @param text the text to send. @param success A block object called when the operation succeeds. It returns the event id of the event generated on the homeserver @param failure A block object called when the operation fails. */ -- (void)sendReplyToEventWithId:(NSString*)eventIdToReply - withTextMessage:(NSString *)text - success:(void (^)(NSString *))success - failure:(void (^)(NSError *))failure; +- (void)sendReplyToEvent:(MXEvent*)eventToReply + withTextMessage:(NSString *)text + success:(void (^)(NSString *))success + failure:(void (^)(NSError *))failure; /** Indicates if replying to the provided event is supported. @@ -795,16 +795,16 @@ extern NSString *const kMXKRoomDataSourceTimelineErrorErrorKey; /** Replace a text in an event. - @param eventId The eventId of event to replace. + @param event The event to replace. @param text The new message text. @param success A block object called when the operation succeeds. It returns the event id of the event generated on the homeserver. @param failure A block object called when the operation fails. */ -- (void)replaceTextMessageForEventWithId:(NSString *)eventId - withTextMessage:(NSString *)text - success:(void (^)(NSString *eventId))success - failure:(void (^)(NSError *error))failure; +- (void)replaceTextMessageForEvent:(MXEvent *)event + withTextMessage:(NSString *)text + success:(void (^)(NSString *eventId))success + failure:(void (^)(NSError *error))failure; /** diff --git a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m index 099d358d2..3e4d7e5d6 100644 --- a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m +++ b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m @@ -34,7 +34,7 @@ #import "MXKSendReplyEventStringLocalizer.h" #import "MXKSlashCommands.h" -const BOOL USE_THREAD_TIMELINE = NO; +const BOOL USE_THREAD_TIMELINE = YES; #pragma mark - Constant definitions @@ -1870,13 +1870,11 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) { } } -- (void)sendReplyToEventWithId:(NSString*)eventIdToReply - withTextMessage:(NSString *)text - success:(void (^)(NSString *))success - failure:(void (^)(NSError *))failure +- (void)sendReplyToEvent:(MXEvent*)eventToReply + withTextMessage:(NSString *)text + success:(void (^)(NSString *))success + failure:(void (^)(NSError *))failure { - MXEvent *eventToReply = [self eventWithEventId:eventIdToReply]; - __block MXEvent *localEchoEvent = nil; NSString *sanitizedText = [self sanitizedMessageText:text]; @@ -4284,13 +4282,11 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) { return hasChanged; } -- (void)replaceTextMessageForEventWithId:(NSString*)eventId - withTextMessage:(NSString *)text - success:(void (^)(NSString *))success - failure:(void (^)(NSError *))failure +- (void)replaceTextMessageForEvent:(MXEvent*)event + withTextMessage:(NSString *)text + success:(void (^)(NSString *))success + failure:(void (^)(NSError *))failure { - MXEvent *event = [self eventWithEventId:eventId]; - NSString *sanitizedText = [self sanitizedMessageText:text]; NSString *formattedText = [self htmlMessageFromSanitizedText:sanitizedText]; diff --git a/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m b/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m index adb2b45af..ba4c6a2ea 100644 --- a/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m +++ b/Riot/Modules/MatrixKit/Utils/EventFormatter/MXKEventFormatter.m @@ -1361,7 +1361,7 @@ static NSString *const kHTMLATagRegexPattern = @"([^<]*)"; // For replies, look for the end of the parent message // This helps us insert the emote prefix in the right place - if (event.relatesTo.inReplyTo || (event.isInThread && !RiotSettings.shared.enableThreads)) + if (event.relatesTo.inReplyTo || (!RiotSettings.shared.enableThreads && event.isInThread)) { [attributedDisplayText enumerateAttribute:kMXKToolsBlockquoteMarkAttribute inRange:NSMakeRange(0, attributedDisplayText.length) @@ -1704,7 +1704,7 @@ static NSString *const kHTMLATagRegexPattern = @"([^<]*)"; NSString *html = htmlString; // Special treatment for "In reply to" message - if (event.isReplyEvent || (event.isInThread && !RiotSettings.shared.enableThreads)) + if (event.isReplyEvent || (!RiotSettings.shared.enableThreads && event.isInThread)) { html = [self renderReplyTo:html withRoomState:roomState]; } @@ -2030,7 +2030,7 @@ static NSString *const kHTMLATagRegexPattern = @"([^<]*)"; textColor = _errorTextColor; } // Check whether the message is highlighted. - else if (event.mxkIsHighlighted || (event.isInThread && !RiotSettings.shared.enableThreads && ![event.sender isEqualToString:mxSession.myUserId])) + else if (event.mxkIsHighlighted || (!RiotSettings.shared.enableThreads && event.isInThread && [event shouldBeHighlightedInSession:mxSession])) { textColor = _bingTextColor; } @@ -2094,7 +2094,7 @@ static NSString *const kHTMLATagRegexPattern = @"([^<]*)"; { font = _callNoticesTextFont; } - else if (event.mxkIsHighlighted || (event.isInThread && !RiotSettings.shared.enableThreads && ![event.sender isEqualToString:mxSession.myUserId])) + else if (event.mxkIsHighlighted || (!RiotSettings.shared.enableThreads && event.isInThread && [event shouldBeHighlightedInSession:mxSession])) { font = _bingTextFont; } diff --git a/Riot/Modules/MatrixKit/Views/Authentication/MXKAuthInputsView.h b/Riot/Modules/MatrixKit/Views/Authentication/MXKAuthInputsView.h index c71b022ae..5582aa95a 100644 --- a/Riot/Modules/MatrixKit/Views/Authentication/MXKAuthInputsView.h +++ b/Riot/Modules/MatrixKit/Views/Authentication/MXKAuthInputsView.h @@ -25,7 +25,7 @@ extern NSString *const MXKAuthErrorDomain; /** Authentication types */ -typedef enum { +typedef NS_ENUM(NSUInteger, MXKAuthenticationType) { /** Type used to sign up. */ @@ -39,7 +39,7 @@ typedef enum { */ MXKAuthenticationTypeForgotPassword -} MXKAuthenticationType; +}; @class MXKAuthInputsView; diff --git a/Riot/Modules/Onboarding/OnboardingCoordinator.swift b/Riot/Modules/Onboarding/OnboardingCoordinator.swift index dd7f088e7..94182fa56 100644 --- a/Riot/Modules/Onboarding/OnboardingCoordinator.swift +++ b/Riot/Modules/Onboarding/OnboardingCoordinator.swift @@ -56,11 +56,19 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { } // Keep a strong ref as we need to init authVC early to preload its view private let authenticationCoordinator: AuthenticationCoordinatorProtocol + /// A boolean to prevent authentication being shown when already in progress. private var isShowingAuthentication = false // MARK: Screen results private var splashScreenResult: OnboardingSplashScreenViewModelResult? private var useCaseResult: OnboardingUseCaseViewModelResult? + private var authenticationType: MXKAuthenticationType? + private var session: MXSession? + + /// Whether all of the onboarding steps have been completed or not. `false` if there are more screens to be shown. + private var onboardingFinished = false + /// Whether authentication is complete. `true` once authenticated, verified and the app is ready to be shown. + private var authenticationFinished = false // MARK: Public @@ -74,7 +82,7 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { self.parameters = parameters // Preload the authVC (it is *really* slow to load in realtime) - let authenticationParameters = AuthenticationCoordinatorParameters(navigationRouter: parameters.router) + let authenticationParameters = AuthenticationCoordinatorParameters(navigationRouter: parameters.router, canPresentAdditionalScreens: false) authenticationCoordinator = AuthenticationCoordinator(parameters: authenticationParameters) super.init() @@ -115,11 +123,13 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { return authenticationCoordinator.continueSSOLogin(withToken: loginToken, transactionID: transactionID) } - // MARK: - Private + // MARK: - Pre-Authentication @available(iOS 14.0, *) /// Show the onboarding splash screen as the root module in the flow. private func showSplashScreen() { + MXLog.debug("[OnboardingCoordinator] showSplashScreen") + let coordinator = OnboardingSplashScreenCoordinator() coordinator.completion = { [weak self, weak coordinator] result in guard let self = self, let coordinator = coordinator else { return } @@ -129,7 +139,7 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { coordinator.start() add(childCoordinator: coordinator) - self.navigationRouter.setRootModule(coordinator, popCompletion: nil) + navigationRouter.setRootModule(coordinator, popCompletion: nil) } @available(iOS 14.0, *) @@ -138,8 +148,7 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { splashScreenResult = result // Set the auth type early to allow network requests to finish during display of the use case screen. - let mxkAuthenticationType = splashScreenResult == .register ? MXKAuthenticationTypeRegister : MXKAuthenticationTypeLogin - authenticationCoordinator.update(authenticationType: mxkAuthenticationType) + authenticationCoordinator.update(authenticationType: result.mxkAuthenticationType) switch result { case .register: @@ -152,6 +161,8 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { @available(iOS 14.0, *) /// Show the use case screen for new users. private func showUseCaseSelectionScreen() { + MXLog.debug("[OnboardingCoordinator] showUseCaseSelectionScreen") + let coordinator = OnboardingUseCaseSelectionCoordinator() coordinator.completion = { [weak self, weak coordinator] result in guard let self = self, let coordinator = coordinator else { return } @@ -161,10 +172,10 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { coordinator.start() add(childCoordinator: coordinator) - if self.navigationRouter.modules.isEmpty { - self.navigationRouter.setRootModule(coordinator, popCompletion: nil) + if navigationRouter.modules.isEmpty { + navigationRouter.setRootModule(coordinator, popCompletion: nil) } else { - self.navigationRouter.push(coordinator, animated: true) { [weak self] in + navigationRouter.push(coordinator, animated: true) { [weak self] in self?.remove(childCoordinator: coordinator) } } @@ -176,6 +187,8 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { showAuthenticationScreen() } + // MARK: - Authentication + /// Show the authentication screen. Any parameters that have been set in previous screens are be applied. private func showAuthenticationScreen() { guard !isShowingAuthentication else { return } @@ -187,10 +200,10 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { guard let self = self, let coordinator = coordinator else { return } switch result { - case .didLogin(let session): - self.authenticationCoordinator(coordinator, didLoginWith: session) - case .didComplete(let authenticationType): - self.authenticationCoordinator(coordinator, didCompleteWith: authenticationType) + case .didLogin(let session, let authenticationType): + self.authenticationCoordinator(coordinator, didLoginWith: session, and: authenticationType) + case .didComplete: + self.authenticationCoordinatorDidComplete(coordinator) } } @@ -217,10 +230,10 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { coordinator.updateHomeserver(customHomeserver, andIdentityServer: customIdentityServer) } - if self.navigationRouter.modules.isEmpty { - self.navigationRouter.setRootModule(coordinator, popCompletion: nil) + if navigationRouter.modules.isEmpty { + navigationRouter.setRootModule(coordinator, popCompletion: nil) } else { - self.navigationRouter.push(coordinator, animated: true) { [weak self] in + navigationRouter.push(coordinator, animated: true) { [weak self] in self?.remove(childCoordinator: coordinator) self?.isShowingAuthentication = false } @@ -228,18 +241,38 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { isShowingAuthentication = true } - private func authenticationCoordinator(_ coordinator: AuthenticationCoordinatorProtocol, didLoginWith session: MXSession) { - // TODO: Show next screens whilst waiting for the everything to load. + /// Displays the next view in the flow after the authentication screen, + /// whilst crypto and the rest of the app is launching in the background. + private func authenticationCoordinator(_ coordinator: AuthenticationCoordinatorProtocol, + didLoginWith session: MXSession, + and authenticationType: MXKAuthenticationType) { + self.session = session + self.authenticationType = authenticationType + // May need to move the spinner and key verification up to here in order to coordinate properly. + + // Check whether another screen should be shown. + if #available(iOS 14.0, *) { + if authenticationType == .register, let userId = session.credentials.userId, BuildSettings.onboardingShowAccountPersonalisation { + showCongratulationsScreen(userId: userId) + return + } else if Analytics.shared.shouldShowAnalyticsPrompt { + showAnalyticsPrompt(for: session) + return + } + } + + // Otherwise onboarding is finished. + onboardingFinished = true + completeIfReady() } /// Displays the next view in the flow after the authentication screen. - private func authenticationCoordinator(_ coordinator: AuthenticationCoordinatorProtocol, didCompleteWith authenticationType: MXKAuthenticationType) { - completion?() + private func authenticationCoordinatorDidComplete(_ coordinator: AuthenticationCoordinatorProtocol) { isShowingAuthentication = false // Handle the chosen use case where applicable - if authenticationType == MXKAuthenticationTypeRegister, + if authenticationType == .register, let useCase = useCaseResult?.userSessionPropertyValue, let userSession = UserSessionsService.shared.mainUserSession { // Store the value in the user's session @@ -248,6 +281,112 @@ final class OnboardingCoordinator: NSObject, OnboardingCoordinatorProtocol { // Update the analytics user properties with the use case Analytics.shared.updateUserProperties(ftueUseCase: useCase) } + + // This method is only called when the app is ready so we can complete if finished + authenticationFinished = true + completeIfReady() + } + + // MARK: - Post-Authentication + + @available(iOS 14.0, *) + private func showCongratulationsScreen(userId: String) { + MXLog.debug("[OnboardingCoordinator] showCongratulationsScreen") + + let parameters = OnboardingCongratulationsCoordinatorParameters(userId: userId) + let coordinator = OnboardingCongratulationsCoordinator(parameters: parameters) + + coordinator.completion = { [weak self, weak coordinator] result in + guard let self = self, let coordinator = coordinator else { return } + self.congratulationsCoordinator(coordinator, didCompleteWith: result) + } + + add(childCoordinator: coordinator) + coordinator.start() + + // Navigating back doesn't make any sense now, so replace the whole stack. + navigationRouter.setRootModule(coordinator, hideNavigationBar: true, animated: true) { [weak self] in + self?.remove(childCoordinator: coordinator) + } + } + + @available(iOS 14.0, *) + private func congratulationsCoordinator(_ coordinator: OnboardingCongratulationsCoordinator, didCompleteWith result: OnboardingCongratulationsViewModelResult) { + if let session = session { + switch result { + case .personaliseProfile: + // TODO: Profile screens here instead. + if Analytics.shared.shouldShowAnalyticsPrompt { + showAnalyticsPrompt(for: session) + return + } + case .takeMeHome: + if Analytics.shared.shouldShowAnalyticsPrompt { + showAnalyticsPrompt(for: session) + return + } + } + } + + onboardingFinished = true + completeIfReady() + } + + @available(iOS 14.0, *) + private func showAnalyticsPrompt(for session: MXSession) { + MXLog.debug("[OnboardingCoordinator]: Invite the user to send analytics") + + let parameters = AnalyticsPromptCoordinatorParameters(session: session) + let coordinator = AnalyticsPromptCoordinator(parameters: parameters) + + coordinator.completion = { [weak self, weak coordinator] in + guard let self = self, let coordinator = coordinator else { return } + self.analyticsPromptCoordinatorDidComplete(coordinator) + } + + add(childCoordinator: coordinator) + coordinator.start() + + // TODO: Re-asses replacing the stack based on the previous screen once the whole flow is implemented + navigationRouter.setRootModule(coordinator, hideNavigationBar: true, animated: true) { [weak self] in + self?.remove(childCoordinator: coordinator) + } + } + + private func analyticsPromptCoordinatorDidComplete(_ coordinator: AnalyticsPromptCoordinator) { + onboardingFinished = true + completeIfReady() + } + + // MARK: - Finished + + private func completeIfReady() { + guard onboardingFinished else { + MXLog.debug("[OnboardingCoordinator] Delaying onboarding completion until all screens have been shown.") + return + } + + guard authenticationFinished else { + MXLog.debug("[OnboardingCoordinator] Allowing AuthenticationCoordinator to display any remaining screens.") + authenticationCoordinator.presentPendingScreensIfNecessary() + return + } + + completion?() + } +} + +// MARK: - Helpers + +extension OnboardingSplashScreenViewModelResult { + /// The result converted into the MatrixKit authentication type to use. + var mxkAuthenticationType: MXKAuthenticationType { + switch self { + case .login: + return .login + case .register: + return .register + } } } diff --git a/Riot/Modules/People/PeopleViewController.m b/Riot/Modules/People/PeopleViewController.m index 05dbd6ab7..4221b61cc 100644 --- a/Riot/Modules/People/PeopleViewController.m +++ b/Riot/Modules/People/PeopleViewController.m @@ -26,7 +26,7 @@ #import "GeneratedInterface-Swift.h" -@interface PeopleViewController () +@interface PeopleViewController () { NSInteger directRoomsSectionNumber; RecentsDataSource *recentsDataSource; @@ -84,31 +84,18 @@ - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - - [AppDelegate theDelegate].masterTabBarController.navigationItem.title = [VectorL10n titlePeople]; [AppDelegate theDelegate].masterTabBarController.tabBar.tintColor = ThemeService.shared.theme.tintColor; if ([self.dataSource isKindOfClass:RecentsDataSource.class]) { // Take the lead on the shared data source. recentsDataSource = (RecentsDataSource*)self.dataSource; - recentsDataSource.areSectionsShrinkable = NO; [recentsDataSource setDelegate:self andRecentsDataSourceMode:RecentsDataSourceModePeople]; } } #pragma mark - UITableView delegate -- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section -{ - return 0.0; -} - -- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section -{ - return nil; -} - - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ([super respondsToSelector:@selector(tableView:willDisplayCell:forRowAtIndexPath:)]) @@ -195,4 +182,11 @@ }]; } +#pragma mark - MasterTabBarItemDisplayProtocol + +- (NSString *)masterTabBarItemTitle +{ + return [VectorL10n titlePeople]; +} + @end diff --git a/Riot/Modules/People/Views/InviteRecentTableViewCell.h b/Riot/Modules/People/Views/InviteRecentTableViewCell.h index f3fe96891..bd45d4364 100644 --- a/Riot/Modules/People/Views/InviteRecentTableViewCell.h +++ b/Riot/Modules/People/Views/InviteRecentTableViewCell.h @@ -53,7 +53,4 @@ extern NSString *const kInviteRecentTableViewCellRoomKey; @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *leftButtonActivityIndicator; @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *rightButtonActivityIndicator; -@property (weak, nonatomic) IBOutlet UIView *noticeBadgeView; - - @end diff --git a/Riot/Modules/People/Views/InviteRecentTableViewCell.m b/Riot/Modules/People/Views/InviteRecentTableViewCell.m index d0ab6a9e3..ea71c2513 100644 --- a/Riot/Modules/People/Views/InviteRecentTableViewCell.m +++ b/Riot/Modules/People/Views/InviteRecentTableViewCell.m @@ -49,9 +49,7 @@ NSString *const kInviteRecentTableViewCellRoomKey = @"kInviteRecentTableViewCell self.rightButton.clipsToBounds = YES; [self.rightButton setTitle:[VectorL10n accept] forState:UIControlStateNormal]; [self.rightButton addTarget:self action:@selector(onRightButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; - - [self.noticeBadgeView.layer setCornerRadius:10]; - + self.selectionStyle = UITableViewCellSelectionStyleNone; } @@ -61,8 +59,6 @@ NSString *const kInviteRecentTableViewCellRoomKey = @"kInviteRecentTableViewCell self.leftButton.backgroundColor = ThemeService.shared.theme.tintColor; self.rightButton.backgroundColor = ThemeService.shared.theme.tintColor; - - self.noticeBadgeView.backgroundColor = ThemeService.shared.theme.noticeColor; } - (void)prepareForReuse diff --git a/Riot/Modules/People/Views/InviteRecentTableViewCell.xib b/Riot/Modules/People/Views/InviteRecentTableViewCell.xib index 45a40d9e0..5911b2ba0 100644 --- a/Riot/Modules/People/Views/InviteRecentTableViewCell.xib +++ b/Riot/Modules/People/Views/InviteRecentTableViewCell.xib @@ -1,9 +1,9 @@ - + - + @@ -89,25 +89,6 @@ - - - - - - - - - - - - - -