Merge branch 'ismail/5068_start_thread' into ismail/5068_design_tweaks
1
.github/workflows/ci-build.yml
vendored
@@ -11,6 +11,7 @@ on:
|
||||
env:
|
||||
# Make the git branch for a PR available to our Fastfile
|
||||
MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }}
|
||||
MapTilerAPIKey: ${{ secrets.MAPTILER_API_KEY }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
1
.github/workflows/ci-tests.yml
vendored
@@ -12,6 +12,7 @@ on:
|
||||
env:
|
||||
# Make the git branch for a PR available to our Fastfile
|
||||
MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }}
|
||||
MapTilerAPIKey: ${{ secrets.MAPTILER_API_KEY }}
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
|
||||
1
.github/workflows/release-alpha.yml
vendored
@@ -11,6 +11,7 @@ on:
|
||||
env:
|
||||
# Make the git branch for a PR available to our Fastfile
|
||||
MX_GIT_BRANCH: ${{ github.event.pull_request.head.ref }}
|
||||
MapTilerAPIKey: ${{ secrets.MAPTILER_API_KEY }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
62
.github/workflows/triage-move-labelled.yml
vendored
@@ -5,6 +5,31 @@ on:
|
||||
types: [labeled]
|
||||
|
||||
jobs:
|
||||
apply_Z-Labs_label:
|
||||
name: Add Z-Labs label for features behind labs flags
|
||||
runs-on: ubuntu-latest
|
||||
if: >
|
||||
contains(github.event.issue.labels.*.name, 'A-Maths') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Message-Pinning') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Threads') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Polls') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Location-Sharing') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Message-Bubbles') ||
|
||||
contains(github.event.issue.labels.*.name, 'Z-IA') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Themes-Custom') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Tags')
|
||||
steps:
|
||||
- uses: actions/github-script@v5
|
||||
with:
|
||||
script: |
|
||||
github.rest.issues.addLabels({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
labels: ['Z-Labs']
|
||||
})
|
||||
|
||||
move_needs_info_issues:
|
||||
name: X-Needs-Info issues to Need info column on triage board
|
||||
runs-on: ubuntu-latest
|
||||
@@ -34,7 +59,7 @@ jobs:
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
mutation add_to_project($projectid:String!,$contentid:String!) {
|
||||
mutation add_to_project($projectid:ID!,$contentid:ID!) {
|
||||
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||
projectNextItem {
|
||||
id
|
||||
@@ -47,19 +72,44 @@ jobs:
|
||||
PROJECT_ID: "PN_kwDOAM0swc0sUA"
|
||||
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
|
||||
add_product_issues_to_project:
|
||||
name: X-Needs-Product to Design project board
|
||||
runs-on: ubuntu-latest
|
||||
if: >
|
||||
contains(github.event.issue.labels.*.name, 'X-Needs-Product')
|
||||
steps:
|
||||
- uses: octokit/graphql-action@v2.x
|
||||
id: add_to_project
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
mutation add_to_project($projectid:ID!,$contentid:ID!) {
|
||||
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||
projectNextItem {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
projectid: ${{ env.PROJECT_ID }}
|
||||
contentid: ${{ github.event.issue.node_id }}
|
||||
env:
|
||||
PROJECT_ID: "PN_kwDOAM0swc4AAg6N"
|
||||
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
|
||||
Delight_issues_to_board:
|
||||
name: Spaces issues to Delight project board
|
||||
runs-on: ubuntu-latest
|
||||
if: >
|
||||
contains(github.event.issue.labels.*.name, 'A-Spaces') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Space-Settings') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Subspaces')
|
||||
contains(github.event.issue.labels.*.name, 'A-Subspaces') ||
|
||||
contains(github.event.issue.labels.*.name, 'Z-IA')
|
||||
steps:
|
||||
- uses: octokit/graphql-action@v2.x
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
mutation add_to_project($projectid:String!,$contentid:String!) {
|
||||
mutation add_to_project($projectid:ID!,$contentid:ID!) {
|
||||
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||
projectNextItem {
|
||||
id
|
||||
@@ -82,7 +132,7 @@ jobs:
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
mutation add_to_project($projectid:String!,$contentid:String!) {
|
||||
mutation add_to_project($projectid:ID!,$contentid:ID!) {
|
||||
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||
projectNextItem {
|
||||
id
|
||||
@@ -105,7 +155,7 @@ jobs:
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
mutation add_to_project($projectid:String!,$contentid:String!) {
|
||||
mutation add_to_project($projectid:ID!,$contentid:ID!) {
|
||||
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||
projectNextItem {
|
||||
id
|
||||
@@ -128,7 +178,7 @@ jobs:
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
mutation add_to_project($projectid:String!,$contentid:String!) {
|
||||
mutation add_to_project($projectid:ID!,$contentid:ID!) {
|
||||
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||
projectNextItem {
|
||||
id
|
||||
|
||||
26
.github/workflows/triage-move-unlabelled.yml
vendored
@@ -33,3 +33,29 @@ jobs:
|
||||
project: Issue triage
|
||||
column: Triaged
|
||||
repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
|
||||
remove_Z-Labs_label:
|
||||
name: Remove Z-Labs label when features behind labs flags are removed
|
||||
runs-on: ubuntu-latest
|
||||
if: >
|
||||
!(contains(github.event.issue.labels.*.name, 'A-Maths') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Message-Pinning') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Threads') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Polls') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Location-Sharing') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Message-Bubbles') ||
|
||||
contains(github.event.issue.labels.*.name, 'Z-IA') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Themes-Custom') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-Tags')) &&
|
||||
contains(github.event.issue.labels.*.name, 'Z-Labs')
|
||||
steps:
|
||||
- uses: actions/github-script@v5
|
||||
with:
|
||||
script: |
|
||||
github.rest.issues.removeLabel({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
name: ['Z-Labs']
|
||||
})
|
||||
|
||||
1
.github/workflows/triage-priority-bugs.yml
vendored
@@ -34,6 +34,7 @@ jobs:
|
||||
P1_issues_to_crypto_team_workboard:
|
||||
runs-on: ubuntu-latest
|
||||
if: >
|
||||
contains(github.event.issue.labels.*.name, 'Z-UISI') ||
|
||||
(contains(github.event.issue.labels.*.name, 'A-E2EE') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-E2EE-Cross-Signing') ||
|
||||
contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
|
||||
|
||||
139
.github/workflows/triage-review-requests.yml
vendored
Normal file
@@ -0,0 +1,139 @@
|
||||
name: Move pull requests asking for review to the relevant project
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [review_requested]
|
||||
|
||||
jobs:
|
||||
add_design_pr_to_project:
|
||||
name: Move PRs asking for design review to the design board
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: octokit/graphql-action@v2.x
|
||||
id: find_team_members
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
query find_team_members($team: String!) {
|
||||
organization(login: "vector-im") {
|
||||
team(slug: $team) {
|
||||
members {
|
||||
nodes {
|
||||
login
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
team: ${{ env.TEAM }}
|
||||
env:
|
||||
TEAM: "design"
|
||||
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
- id: any_matching_reviewers
|
||||
run: |
|
||||
# Fetch requested reviewers, and people who are on the team
|
||||
echo '${{ tojson(fromjson(steps.find_team_members.outputs.data).organization.team.members.nodes[*].login) }}' | tee /tmp/team_members.json
|
||||
echo '${{ tojson(github.event.pull_request.requested_reviewers[*].login) }}' | tee /tmp/reviewers.json
|
||||
jq --raw-output .[] < /tmp/team_members.json | sort | tee /tmp/team_members.txt
|
||||
jq --raw-output .[] < /tmp/reviewers.json | sort | tee /tmp/reviewers.txt
|
||||
|
||||
# Fetch requested team reviewers, and the name of the team
|
||||
echo '${{ tojson(github.event.pull_request.requested_teams[*].slug) }}' | tee /tmp/team_reviewers.json
|
||||
jq --raw-output .[] < /tmp/team_reviewers.json | sort | tee /tmp/team_reviewers.txt
|
||||
echo '${{ env.TEAM }}' | tee /tmp/team.txt
|
||||
|
||||
# If either a reviewer matches a team member, or a team matches our team, say "true"
|
||||
if [ $(join /tmp/team_members.txt /tmp/reviewers.txt | wc -l) != 0 ]; then
|
||||
echo "::set-output name=match::true"
|
||||
elif [ $(join /tmp/team.txt /tmp/team_reviewers.txt | wc -l) != 0 ]; then
|
||||
echo "::set-output name=match::true"
|
||||
else
|
||||
echo "::set-output name=match::false"
|
||||
fi
|
||||
env:
|
||||
TEAM: "design"
|
||||
- uses: octokit/graphql-action@v2.x
|
||||
id: add_to_project
|
||||
if: steps.any_matching_reviewers.outputs.match == 'true'
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
mutation add_to_project($projectid:ID!, $contentid:ID!) {
|
||||
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||
projectNextItem {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
projectid: ${{ env.PROJECT_ID }}
|
||||
contentid: ${{ github.event.pull_request.node_id }}
|
||||
env:
|
||||
PROJECT_ID: "PN_kwDOAM0swc0sUA"
|
||||
TEAM: "design"
|
||||
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
|
||||
add_product_pr_to_project:
|
||||
name: Move PRs asking for design review to the design board
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: octokit/graphql-action@v2.x
|
||||
id: find_team_members
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
query find_team_members($team: String!) {
|
||||
organization(login: "vector-im") {
|
||||
team(slug: $team) {
|
||||
members {
|
||||
nodes {
|
||||
login
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
team: ${{ env.TEAM }}
|
||||
env:
|
||||
TEAM: "product"
|
||||
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
- id: any_matching_reviewers
|
||||
run: |
|
||||
# Fetch requested reviewers, and people who are on the team
|
||||
echo '${{ tojson(fromjson(steps.find_team_members.outputs.data).organization.team.members.nodes[*].login) }}' | tee /tmp/team_members.json
|
||||
echo '${{ tojson(github.event.pull_request.requested_reviewers[*].login) }}' | tee /tmp/reviewers.json
|
||||
jq --raw-output .[] < /tmp/team_members.json | sort | tee /tmp/team_members.txt
|
||||
jq --raw-output .[] < /tmp/reviewers.json | sort | tee /tmp/reviewers.txt
|
||||
|
||||
# Fetch requested team reviewers, and the name of the team
|
||||
echo '${{ tojson(github.event.pull_request.requested_teams[*].slug) }}' | tee /tmp/team_reviewers.json
|
||||
jq --raw-output .[] < /tmp/team_reviewers.json | sort | tee /tmp/team_reviewers.txt
|
||||
echo '${{ env.TEAM }}' | tee /tmp/team.txt
|
||||
|
||||
# If either a reviewer matches a team member, or a team matches our team, say "true"
|
||||
if [ $(join /tmp/team_members.txt /tmp/reviewers.txt | wc -l) != 0 ]; then
|
||||
echo "::set-output name=match::true"
|
||||
elif [ $(join /tmp/team.txt /tmp/team_reviewers.txt | wc -l) != 0 ]; then
|
||||
echo "::set-output name=match::true"
|
||||
else
|
||||
echo "::set-output name=match::false"
|
||||
fi
|
||||
env:
|
||||
TEAM: "product"
|
||||
- uses: octokit/graphql-action@v2.x
|
||||
id: add_to_project
|
||||
if: steps.any_matching_reviewers.outputs.match == 'true'
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
mutation add_to_project($projectid:ID!, $contentid:ID!) {
|
||||
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||
projectNextItem {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
projectid: ${{ env.PROJECT_ID }}
|
||||
contentid: ${{ github.event.pull_request.node_id }}
|
||||
env:
|
||||
PROJECT_ID: "PN_kwDOAM0swc4AAg6N"
|
||||
TEAM: "product"
|
||||
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
12
CHANGES.md
@@ -1,3 +1,15 @@
|
||||
## Changes in 1.6.12 (2022-01-11)
|
||||
|
||||
🙌 Improvements
|
||||
|
||||
- Upgrade MatrixSDK version ([v0.20.16](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.20.16)).
|
||||
- Analytics: Replace Matomo with PostHog. ([#5035](https://github.com/vector-im/element-ios/issues/5035))
|
||||
|
||||
🐛 Bugfixes
|
||||
|
||||
- RoomVC: Fix left room reason label memory management. ([#5311](https://github.com/vector-im/element-ios/issues/5311))
|
||||
|
||||
|
||||
## Changes in 1.6.11 (2021-12-14)
|
||||
|
||||
✨ Features
|
||||
|
||||
@@ -15,5 +15,5 @@
|
||||
//
|
||||
|
||||
// Version
|
||||
MARKETING_VERSION = 1.6.12
|
||||
CURRENT_PROJECT_VERSION = 1.6.12
|
||||
MARKETING_VERSION = 1.6.13
|
||||
CURRENT_PROJECT_VERSION = 1.6.13
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Keys
|
||||
|
||||
/// BuildSettings provides settings computed at build time.
|
||||
/// In future, it may be automatically generated from xcconfig files
|
||||
@@ -22,13 +23,6 @@ import Foundation
|
||||
final class BuildSettings: NSObject {
|
||||
|
||||
// MARK: - Bundle Settings
|
||||
static var bundleDisplayName: String {
|
||||
guard let bundleDisplayName = Bundle.app.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String else {
|
||||
fatalError("CFBundleDisplayName should be defined")
|
||||
}
|
||||
return bundleDisplayName
|
||||
}
|
||||
|
||||
static var applicationGroupIdentifier: String {
|
||||
guard let applicationGroupIdentifier = Bundle.app.object(forInfoDictionaryKey: "applicationGroupIdentifier") as? String else {
|
||||
fatalError("applicationGroupIdentifier should be defined")
|
||||
@@ -297,6 +291,13 @@ final class BuildSettings: NSObject {
|
||||
static let roomScreenAllowMediaLibraryAction: Bool = true
|
||||
static let roomScreenAllowStickerAction: Bool = true
|
||||
static let roomScreenAllowFilesAction: Bool = true
|
||||
|
||||
// Timeline style
|
||||
static let roomScreenAllowTimelineStyleConfiguration: Bool = false
|
||||
static let roomScreenTimelineDefaultStyleIdentifier: RoomTimelineStyleIdentifier = .plain
|
||||
static var roomScreenEnableMessageBubblesByDefault: Bool {
|
||||
return self.roomScreenTimelineDefaultStyleIdentifier == .bubble
|
||||
}
|
||||
|
||||
/// Allow split view detail view stacking
|
||||
static let allowSplitViewDetailsScreenStacking: Bool = true
|
||||
@@ -364,4 +365,16 @@ final class BuildSettings: NSObject {
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// MARK: - Location Sharing
|
||||
|
||||
static let tileServerMapURL = URL(string: "https://api.maptiler.com/maps/streets/style.json?key=" + RiotKeys().mapTilerAPIKey)!
|
||||
|
||||
static var locationSharingEnabled: Bool {
|
||||
guard #available(iOS 14, *) else {
|
||||
return false
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
1
Gemfile
@@ -3,6 +3,7 @@ source "https://rubygems.org"
|
||||
gem "xcode-install"
|
||||
gem "fastlane"
|
||||
gem "cocoapods", '~>1.11.2'
|
||||
gem "cocoapods-keys"
|
||||
|
||||
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
|
||||
eval_gemfile(plugins_path) if File.exist?(plugins_path)
|
||||
|
||||
69
Gemfile.lock
@@ -1,9 +1,12 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.4)
|
||||
CFPropertyList (3.0.5)
|
||||
rexml
|
||||
activesupport (6.1.4.1)
|
||||
RubyInline (3.12.5)
|
||||
ZenTest (~> 4.3)
|
||||
ZenTest (4.12.0)
|
||||
activesupport (6.1.4.4)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
@@ -17,17 +20,17 @@ GEM
|
||||
artifactory (3.0.15)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.510.0)
|
||||
aws-sdk-core (3.121.1)
|
||||
aws-partitions (1.541.0)
|
||||
aws-sdk-core (3.124.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.239.0)
|
||||
aws-partitions (~> 1, >= 1.525.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.48.0)
|
||||
aws-sdk-core (~> 3, >= 3.120.0)
|
||||
aws-sdk-kms (1.52.0)
|
||||
aws-sdk-core (~> 3, >= 3.122.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.103.0)
|
||||
aws-sdk-core (~> 3, >= 3.120.0)
|
||||
aws-sdk-s3 (1.109.0)
|
||||
aws-sdk-core (~> 3, >= 3.122.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.4)
|
||||
aws-sigv4 (1.4.0)
|
||||
@@ -64,6 +67,9 @@ GEM
|
||||
typhoeus (~> 1.0)
|
||||
cocoapods-deintegrate (1.0.5)
|
||||
cocoapods-downloader (1.5.1)
|
||||
cocoapods-keys (2.2.1)
|
||||
dotenv
|
||||
osx_keychain
|
||||
cocoapods-plugins (1.0.0)
|
||||
nap
|
||||
cocoapods-search (1.0.1)
|
||||
@@ -84,9 +90,9 @@ GEM
|
||||
dotenv (2.7.6)
|
||||
emoji_regex (3.2.3)
|
||||
escape (0.0.4)
|
||||
ethon (0.14.0)
|
||||
ethon (0.15.0)
|
||||
ffi (>= 1.15.0)
|
||||
excon (0.86.0)
|
||||
excon (0.89.0)
|
||||
faraday (1.8.0)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
@@ -109,10 +115,10 @@ GEM
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday-rack (1.0.0)
|
||||
faraday_middleware (1.1.0)
|
||||
faraday_middleware (1.2.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.5)
|
||||
fastlane (2.195.0)
|
||||
fastimage (2.2.6)
|
||||
fastlane (2.199.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
@@ -161,7 +167,7 @@ GEM
|
||||
fourflusher (2.3.1)
|
||||
fuzzy_match (2.0.4)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.11.0)
|
||||
google-apis-androidpublisher_v3 (0.14.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-core (0.4.1)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
@@ -172,11 +178,11 @@ GEM
|
||||
retriable (>= 2.0, < 4.a)
|
||||
rexml
|
||||
webrick
|
||||
google-apis-iamcredentials_v1 (0.7.0)
|
||||
google-apis-iamcredentials_v1 (0.9.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.5.0)
|
||||
google-apis-playcustomapp_v1 (0.6.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-storage_v1 (0.8.0)
|
||||
google-apis-storage_v1 (0.10.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-cloud-core (1.6.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
@@ -184,15 +190,15 @@ GEM
|
||||
google-cloud-env (1.5.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
google-cloud-errors (1.2.0)
|
||||
google-cloud-storage (1.34.1)
|
||||
addressable (~> 2.5)
|
||||
google-cloud-storage (1.35.0)
|
||||
addressable (~> 2.8)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
google-apis-storage_v1 (~> 0.1)
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (1.0.0)
|
||||
googleauth (1.1.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
memoist (~> 0.16)
|
||||
@@ -204,18 +210,18 @@ GEM
|
||||
http-cookie (1.0.4)
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
i18n (1.8.10)
|
||||
i18n (1.8.11)
|
||||
concurrent-ruby (~> 1.0)
|
||||
jmespath (1.4.0)
|
||||
json (2.5.1)
|
||||
json (2.6.1)
|
||||
jwt (2.3.0)
|
||||
memoist (0.16.2)
|
||||
mime-types (3.3.1)
|
||||
mime-types (3.4.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2021.0901)
|
||||
mime-types-data (3.2021.1115)
|
||||
mini_magick (4.11.0)
|
||||
mini_mime (1.1.1)
|
||||
minitest (5.14.4)
|
||||
mini_mime (1.1.2)
|
||||
minitest (5.15.0)
|
||||
molinillo (0.8.0)
|
||||
multi_json (1.15.0)
|
||||
multipart-post (2.0.0)
|
||||
@@ -224,7 +230,9 @@ GEM
|
||||
naturally (2.2.1)
|
||||
netrc (0.11.0)
|
||||
optparse (0.1.1)
|
||||
os (1.1.1)
|
||||
os (1.1.4)
|
||||
osx_keychain (1.0.2)
|
||||
RubyInline (~> 3)
|
||||
plist (3.6.0)
|
||||
public_suffix (4.0.6)
|
||||
rake (13.0.6)
|
||||
@@ -255,7 +263,7 @@ GEM
|
||||
terminal-notifier (2.0.0)
|
||||
terminal-table (1.8.0)
|
||||
unicode-display_width (~> 1.1, >= 1.1.1)
|
||||
trailblazer-option (0.1.1)
|
||||
trailblazer-option (0.1.2)
|
||||
tty-cursor (0.7.1)
|
||||
tty-screen (0.8.1)
|
||||
tty-spinner (0.9.3)
|
||||
@@ -285,13 +293,14 @@ GEM
|
||||
rouge (~> 2.0.7)
|
||||
xcpretty-travis-formatter (1.0.1)
|
||||
xcpretty (~> 0.2, >= 0.0.7)
|
||||
zeitwerk (2.4.2)
|
||||
zeitwerk (2.5.1)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
cocoapods (~> 1.11.2)
|
||||
cocoapods-keys
|
||||
fastlane
|
||||
fastlane-plugin-diawi
|
||||
fastlane-plugin-versioning
|
||||
|
||||
8
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.20.15'
|
||||
$matrixSDKVersion = '= 0.20.16'
|
||||
# $matrixSDKVersion = :local
|
||||
# $matrixSDKVersion = { :branch => 'develop'}
|
||||
# $matrixSDKVersion = { :specHash => { git: 'https://git.io/fork123', branch: 'fix' } }
|
||||
@@ -95,7 +95,7 @@ abstract_target 'RiotPods' do
|
||||
pod 'SwiftJWT', '~> 3.6.200'
|
||||
pod 'SideMenu', '~> 6.5'
|
||||
pod 'DSWaveformImage', '~> 6.1.1'
|
||||
pod 'ffmpeg-kit-ios-audio', '~> 4.5'
|
||||
pod 'ffmpeg-kit-ios-audio', '4.5.1'
|
||||
|
||||
pod 'FLEX', '~> 4.5.0', :configurations => ['Debug']
|
||||
|
||||
@@ -129,6 +129,10 @@ abstract_target 'RiotPods' do
|
||||
|
||||
end
|
||||
|
||||
plugin 'cocoapods-keys', {
|
||||
:project => "Riot",
|
||||
:keys => ["MapTilerAPIKey"]
|
||||
}
|
||||
|
||||
post_install do |installer|
|
||||
installer.pods_project.targets.each do |target|
|
||||
|
||||
27
Podfile.lock
@@ -38,7 +38,7 @@ PODS:
|
||||
- DTFoundation/Core
|
||||
- DTFoundation/UIKit (1.7.18):
|
||||
- DTFoundation/Core
|
||||
- ffmpeg-kit-ios-audio (4.5)
|
||||
- ffmpeg-kit-ios-audio (4.5.1)
|
||||
- FLEX (4.5.0)
|
||||
- FlowCommoniOS (1.12.2)
|
||||
- GBDeviceInfo (6.6.0):
|
||||
@@ -49,6 +49,7 @@ PODS:
|
||||
- Introspect (0.1.3)
|
||||
- JitsiMeetSDK (3.10.2)
|
||||
- KeychainAccess (4.2.2)
|
||||
- Keys (1.0.1)
|
||||
- KituraContracts (1.2.1):
|
||||
- LoggerAPI (~> 1.7)
|
||||
- KTCenterFlowLayout (1.3.1)
|
||||
@@ -57,16 +58,16 @@ PODS:
|
||||
- LoggerAPI (1.9.200):
|
||||
- Logging (~> 1.1)
|
||||
- Logging (1.4.0)
|
||||
- MatrixSDK (0.20.15):
|
||||
- MatrixSDK/Core (= 0.20.15)
|
||||
- MatrixSDK/Core (0.20.15):
|
||||
- MatrixSDK (0.20.16):
|
||||
- MatrixSDK/Core (= 0.20.16)
|
||||
- MatrixSDK/Core (0.20.16):
|
||||
- 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.20.15):
|
||||
- MatrixSDK/JingleCallStack (0.20.16):
|
||||
- JitsiMeetSDK (= 3.10.2)
|
||||
- MatrixSDK/Core
|
||||
- OLMKit (3.2.5):
|
||||
@@ -107,17 +108,18 @@ DEPENDENCIES:
|
||||
- Down (~> 0.11.0)
|
||||
- DSWaveformImage (~> 6.1.1)
|
||||
- DTCoreText (~> 1.6.25)
|
||||
- ffmpeg-kit-ios-audio (~> 4.5)
|
||||
- ffmpeg-kit-ios-audio (= 4.5.1)
|
||||
- FLEX (~> 4.5.0)
|
||||
- FlowCommoniOS (~> 1.12.0)
|
||||
- GBDeviceInfo (~> 6.6.0)
|
||||
- HPGrowingTextView (~> 1.1)
|
||||
- Introspect (~> 0.1)
|
||||
- KeychainAccess (~> 4.2.2)
|
||||
- Keys (from `Pods/CocoaPodsKeys`)
|
||||
- KTCenterFlowLayout (~> 1.3.1)
|
||||
- libPhoneNumber-iOS (~> 0.9.13)
|
||||
- MatrixSDK (= 0.20.15)
|
||||
- MatrixSDK/JingleCallStack (= 0.20.15)
|
||||
- MatrixSDK (= 0.20.16)
|
||||
- MatrixSDK/JingleCallStack (= 0.20.16)
|
||||
- OLMKit
|
||||
- PostHog (~> 1.4.4)
|
||||
- ReadMoreTextView (~> 3.0.1)
|
||||
@@ -177,6 +179,8 @@ EXTERNAL SOURCES:
|
||||
AnalyticsEvents:
|
||||
:branch: release/swift
|
||||
:git: https://github.com/matrix-org/matrix-analytics-events.git
|
||||
Keys:
|
||||
:path: Pods/CocoaPodsKeys
|
||||
|
||||
CHECKOUT OPTIONS:
|
||||
AnalyticsEvents:
|
||||
@@ -194,7 +198,7 @@ SPEC CHECKSUMS:
|
||||
DSWaveformImage: 3c718a0cf99291887ee70d1d0c18d80101d3d9ce
|
||||
DTCoreText: ec749e013f2e1f76de5e7c7634642e600a7467ce
|
||||
DTFoundation: a53f8cda2489208cbc71c648be177f902ee17536
|
||||
ffmpeg-kit-ios-audio: 8c44d93054e1a9743a7014ec3dd26cd1ad8f2a59
|
||||
ffmpeg-kit-ios-audio: 662ce2064e56733ca7d8216705efbc38d9e1c3fe
|
||||
FLEX: e51461dd6f0bfb00643c262acdfea5d5d12c596b
|
||||
FlowCommoniOS: ca92071ab526dc89905495a37844fd7e78d1a7f2
|
||||
GBDeviceInfo: ed0db16230d2fa280e1cbb39a5a7f60f6946aaec
|
||||
@@ -203,13 +207,14 @@ SPEC CHECKSUMS:
|
||||
Introspect: 2be020f30f084ada52bb4387fff83fa52c5c400e
|
||||
JitsiMeetSDK: 2f118fa770f23e518f3560fc224fae3ac7062223
|
||||
KeychainAccess: c0c4f7f38f6fc7bbe58f5702e25f7bd2f65abf51
|
||||
Keys: a576f4c9c1c641ca913a959a9c62ed3f215a8de9
|
||||
KituraContracts: e845e60dc8627ad0a76fa55ef20a45451d8f830b
|
||||
KTCenterFlowLayout: 6e02b50ab2bd865025ae82fe266ed13b6d9eaf97
|
||||
libbase58: 7c040313537b8c44b6e2d15586af8e21f7354efd
|
||||
libPhoneNumber-iOS: 0a32a9525cf8744fe02c5206eb30d571e38f7d75
|
||||
LoggerAPI: ad9c4a6f1e32f518fdb43a1347ac14d765ab5e3d
|
||||
Logging: beeb016c9c80cf77042d62e83495816847ef108b
|
||||
MatrixSDK: 2f4d3aacb1c53e2785f0be71d24b8e62e5c5c056
|
||||
MatrixSDK: af6a70532bb43af59f43a1f4dae512a26afeab0b
|
||||
OLMKit: 9fb4799c4a044dd2c06bda31ec31a12191ad30b5
|
||||
PostHog: 4b6321b521569092d4ef3a02238d9435dbaeb99f
|
||||
ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d
|
||||
@@ -225,6 +230,6 @@ SPEC CHECKSUMS:
|
||||
zxcvbn-ios: fef98b7c80f1512ff0eec47ac1fa399fc00f7e3c
|
||||
ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb
|
||||
|
||||
PODFILE CHECKSUM: e60814fe2084a7dca3f82c3a1c4a1b763ae822c0
|
||||
PODFILE CHECKSUM: 2493587902f8f28bb2638303dd583c47e9f24d8b
|
||||
|
||||
COCOAPODS: 1.11.2
|
||||
|
||||
23
Riot/Assets/Images.xcassets/Room/Actions/action_location.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "action_location.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "action_location@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "action_location@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
Riot/Assets/Images.xcassets/Room/Actions/action_location.imageset/action_location.png
vendored
Normal file
|
After Width: | Height: | Size: 529 B |
BIN
Riot/Assets/Images.xcassets/Room/Actions/action_location.imageset/action_location@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 907 B |
BIN
Riot/Assets/Images.xcassets/Room/Actions/action_location.imageset/action_location@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
6
Riot/Assets/Images.xcassets/Room/Location/Contents.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
23
Riot/Assets/Images.xcassets/Room/Location/location_marker_icon.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "location_marker_icon.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "location_marker_icon@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "location_marker_icon@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
Riot/Assets/Images.xcassets/Room/Location/location_marker_icon.imageset/location_marker_icon.png
vendored
Normal file
|
After Width: | Height: | Size: 529 B |
BIN
Riot/Assets/Images.xcassets/Room/Location/location_marker_icon.imageset/location_marker_icon@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 907 B |
BIN
Riot/Assets/Images.xcassets/Room/Location/location_marker_icon.imageset/location_marker_icon@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
23
Riot/Assets/Images.xcassets/Room/Location/location_share_icon.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "location_share_icon.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "location_share_icon@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "location_share_icon@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
Riot/Assets/Images.xcassets/Room/Location/location_share_icon.imageset/location_share_icon.png
vendored
Normal file
|
After Width: | Height: | Size: 384 B |
BIN
Riot/Assets/Images.xcassets/Room/Location/location_share_icon.imageset/location_share_icon@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 596 B |
BIN
Riot/Assets/Images.xcassets/Room/Location/location_share_icon.imageset/location_share_icon@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 819 B |
23
Riot/Assets/Images.xcassets/Room/Location/location_user_marker.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "location_user_marker.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"filename" : "location_user_marker@2x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "location_user_marker@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
Riot/Assets/Images.xcassets/Room/Location/location_user_marker.imageset/location_user_marker.png
vendored
Normal file
|
After Width: | Height: | Size: 1005 B |
BIN
Riot/Assets/Images.xcassets/Room/Location/location_user_marker.imageset/location_user_marker@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
Riot/Assets/Images.xcassets/Room/Location/location_user_marker.imageset/location_user_marker@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
@@ -55,7 +55,7 @@
|
||||
"auth_missing_phone" = "Fehlende Telefon-Nummer";
|
||||
"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" = "Nutzername bereits verwendet";
|
||||
"auth_username_in_use" = "Benutzername bereits verwendet";
|
||||
"auth_forgot_password" = "Passwort vergessen?";
|
||||
"auth_msisdn_validation_title" = "Verifizierung ausstehend";
|
||||
"auth_msisdn_validation_message" = "Bitte gib unten den Aktivierungs-Code ein, den wir per SMS verschickt haben.";
|
||||
@@ -114,10 +114,10 @@
|
||||
"contacts_address_book_no_contact" = "Keine lokalen Kontakte";
|
||||
"contacts_address_book_permission_required" = "Berechtigungen benötigt um auf lokale Kontakte zuzugreifen";
|
||||
// Chat participants
|
||||
"room_participants_title" = "Teilnehmer";
|
||||
"room_participants_title" = "Teilnehmende";
|
||||
"room_participants_add_participant" = "Teilnehmer hinzufügen";
|
||||
"room_participants_one_participant" = "1 Teilnehmer";
|
||||
"room_participants_multi_participants" = "%d Teilnehmer";
|
||||
"room_participants_multi_participants" = "%d Teilnehmende";
|
||||
"room_participants_leave_prompt_title" = "Raum verlassen";
|
||||
"room_participants_leave_prompt_msg" = "Bist du sicher, dass du den Raum verlassen willst?";
|
||||
"room_participants_remove_prompt_title" = "Bestätigung";
|
||||
@@ -140,7 +140,7 @@
|
||||
"room_participants_action_ban" = "Aus diesem Raum bannen";
|
||||
"room_participants_action_ignore" = "Alle Nachrichten von diesem Nutzer verbergen";
|
||||
"room_participants_action_unignore" = "Zeige alle Nachrichten von diesem Nutzer";
|
||||
"room_participants_action_set_moderator" = "Mache zu Moderator";
|
||||
"room_participants_action_set_moderator" = "Gib Moderationsrechte";
|
||||
"room_participants_action_set_admin" = "Mache zum Administrator";
|
||||
"room_participants_action_start_new_chat" = "Starte neuen Chat";
|
||||
"room_participants_action_start_video_call" = "Starte Video-Anruf";
|
||||
@@ -206,9 +206,9 @@
|
||||
"settings_user_settings" = "NUTZER-EINSTELLUNGEN";
|
||||
"settings_notifications_settings" = "BENACHRICHTIGUNGS-EINSTELLUNGEN";
|
||||
"settings_ignored_users" = "IGNORIERTE NUTZER";
|
||||
"settings_contacts" = "LOKALE KONTAKTE";
|
||||
"settings_contacts" = "GERÄTEKONTAKTE";
|
||||
"settings_advanced" = "ERWEITERT";
|
||||
"settings_other" = "WEITERES";
|
||||
"settings_other" = "Weiteres";
|
||||
"settings_devices" = "SITZUNGEN";
|
||||
"settings_cryptography" = "VERSCHLÜSSELUNG";
|
||||
"settings_sign_out" = "Abmelden";
|
||||
@@ -397,7 +397,7 @@
|
||||
"bug_report_send_screenshot" = "Sende Bildschirmfoto";
|
||||
"bug_report_progress_zipping" = "Sammele Protokolle";
|
||||
"bug_report_progress_uploading" = "Bericht hochladen";
|
||||
"bug_report_send" = "Gesendet";
|
||||
"bug_report_send" = "Senden";
|
||||
"collapse" = "zusammenklappen";
|
||||
"auth_email_in_use" = "Diese E-Mail-Adresse wird bereits verwendet";
|
||||
"auth_phone_in_use" = "Diese Telefonnummer wird bereits verwendet";
|
||||
@@ -547,8 +547,8 @@
|
||||
"room_resource_limit_exceeded_message_contact_2_link" = "kontaktiere deinen Dienst-Administrator";
|
||||
"room_resource_limit_exceeded_message_contact_3" = " um diesen Dienst weiter zu nutzen.";
|
||||
"homeserver_connection_lost" = "Konnte keine Verbindung zum Heimserver herstellen.";
|
||||
"room_resource_usage_limit_reached_message_1_default" = "Dieser Heimserver hat einer seiner Ressourcengrenzen überschritten, sodass ";
|
||||
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Dieser Heimserver hat seine Begrenzung an monatlich aktiven Benutzer überschritten, sodass ";
|
||||
"room_resource_usage_limit_reached_message_1_default" = "Dieser Heimserver hat eine seiner Ressourcengrenzen überschritten, sodass ";
|
||||
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Dieser Heimserver hat seine Begrenzung an monatlich aktiven Benutzern überschritten, sodass ";
|
||||
"room_resource_usage_limit_reached_message_2" = "einige Benutzer nicht in der Lage sein werden, sich anzumelden.";
|
||||
"room_resource_usage_limit_reached_message_contact_3" = " um diese Obergrenze erhöhen zu lassen.";
|
||||
"auth_accept_policies" = "Bitte Regeln dieses Heimservers ansehen und akzeptieren:";
|
||||
@@ -1001,10 +1001,10 @@
|
||||
"skip" = "Überspringen";
|
||||
"security_settings_crosssigning_info_not_bootstrapped" = "Quersignierung ist bisher nicht konfiguriert.";
|
||||
"room_member_power_level_admin_in" = "Admin in %@";
|
||||
"room_member_power_level_moderator_in" = "Moderator in %@";
|
||||
"room_member_power_level_moderator_in" = "Mod in %@";
|
||||
"room_member_power_level_custom_in" = "Benutzerdefiniert (%@) in %@";
|
||||
"room_member_power_level_short_admin" = "Admin";
|
||||
"room_member_power_level_short_moderator" = "Moderator";
|
||||
"room_member_power_level_short_moderator" = "Mod";
|
||||
"room_member_power_level_short_custom" = "Benutzerdefiniert";
|
||||
"security_settings_secure_backup" = "SICHERE SICHERHEITSKOPIE";
|
||||
"security_settings_secure_backup_synchronise" = "Synchronisiere";
|
||||
@@ -1019,7 +1019,7 @@
|
||||
"store_promotional_text" = "Privatsphäre-wahrende Kollaborations-App in einem offenen Netzwerk. Dezentral, um dir die Kontrolle zu geben. Keine Datenerfassung, keine Hintertüren und kein Zugriff durch Dritte.";
|
||||
"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 %@ braucht zu lange auf der anderen Seite: %@\n\nSicher, dass du fortfahren möchtest?";
|
||||
"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_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.";
|
||||
@@ -1349,7 +1349,7 @@
|
||||
"event_formatter_call_ringing" = "Läuten…";
|
||||
"event_formatter_call_connecting" = "Verbinden…";
|
||||
"settings_labs_enable_ringing_for_group_calls" = "Bei Gruppenanrufen klingeln";
|
||||
"room_no_privileges_to_create_group_call" = "Du musst Admin oder Moderator sein, um einen Anruf zu starten.";
|
||||
"room_no_privileges_to_create_group_call" = "Du musst Admin oder Mod sein, um einen Anruf zu starten.";
|
||||
"room_join_group_call" = "Beitreten";
|
||||
|
||||
// Chat
|
||||
@@ -1404,7 +1404,7 @@
|
||||
"event_formatter_call_incoming_video" = "Eingehender Videoanruf";
|
||||
"event_formatter_call_has_ended_with_time" = "Anruf beendet • %@";
|
||||
"voice_message_stop_locked_mode_recording" = "Klicke, um die Aufnahme zu starten oder stoppen";
|
||||
"settings_device_notifications" = "Gerätbenachrichtigungen";
|
||||
"settings_device_notifications" = "Gerätebenachrichtigungen";
|
||||
"voice_message_lock_screen_placeholder" = "Sprachnachricht";
|
||||
"voice_message_remaining_recording_time" = "%@s übrig";
|
||||
|
||||
@@ -1439,7 +1439,7 @@
|
||||
"settings_notify_me_for" = "Benachrichtige mich bei";
|
||||
"settings_mentions_and_keywords" = "Erwähnungen und Schlüsselwörter";
|
||||
"settings_confirm_media_size_description" = "Wenn dies aktiviert ist, wirst du beim Senden von Bildern und Videos gefragt, in welcher Größe sie gesendet werden sollen.";
|
||||
"settings_confirm_media_size" = "Größe beim Senden bestätigen";
|
||||
"settings_confirm_media_size" = "Größe beim Senden auswählen";
|
||||
"settings_notifications" = "BENACHRICHTIGUNGEN";
|
||||
"settings_mentions_and_keywords_encryption_notice" = "Auf deinem Mobilgerät wirst du keine Benachrichtigungen für Erwähnungen und Schlüsselwörter in verschlüsselten Räumen erhalten.";
|
||||
"version_check_modal_subtitle_supported" = "Wir haben daran gearbeitet %@ zu verbessern um ein schnelleres und bereinigteres Erlebnis zu schaffen. Leider ist deine aktuelle iOS-Version mit einigen dieser Verbesserungen nicht kompatibel und wird daher nicht mehr unterstützt werden.\nWir empfehlen dir die Aktualisierung deines Betriebssystems um %@ weiterhin vollumfänglich zu nutzen.";
|
||||
@@ -1487,7 +1487,7 @@
|
||||
"settings_contacts_enable_sync" = "Finde deine Kontakte";
|
||||
"space_home_show_all_rooms" = "Alle Räume anzeigen";
|
||||
"service_terms_modal_information_description_integration_manager" = "Ein Integrationsmanager erlaubt dir, externe Funktionen hinzuzufügen.";
|
||||
"service_terms_modal_information_description_identity_server" = "Der Identitätsserver sucht anhand der Telefonnummern und E-Mails in deinen Kontakten, ob diese einen Matrix-Account haben.";
|
||||
"service_terms_modal_information_description_identity_server" = "Der Identitätsserver sucht anhand der Telefonnummern und E-Mails deiner Kontakte nach ihren Matrix-Accounts.";
|
||||
"service_terms_modal_information_title_integration_manager" = "Integrationsmanager";
|
||||
|
||||
// Alert explaining what an identity server / integration manager is.
|
||||
@@ -1502,8 +1502,68 @@
|
||||
"service_terms_modal_title_message" = "Zum Fortfahren musst du die Nutzungsbedingungen akzeptieren";
|
||||
"settings_contacts_enable_sync_description" = "Dies verwendet deinen Identitätsserver um dich mit deinen Kontakten zu verbinden.";
|
||||
"settings_phone_contacts" = "KONTAKTE AM HANDY";
|
||||
"room_event_action_forward" = "Weiter";
|
||||
"room_event_action_forward" = "Weiterleiten";
|
||||
"find_your_contacts_identity_service_error" = "Konnte keine Verbindung zum Identitätsserver aufbauen.";
|
||||
"find_your_contacts_button_title" = "Finde deine Kontakte";
|
||||
"contacts_address_book_permission_denied_alert_message" = "Um Kontakte zu aktivieren, öffne die Einstellungen deines Gerätes.";
|
||||
"contacts_address_book_permission_denied_alert_title" = "Kontakte deaktiviert";
|
||||
"poll_edit_form_create_options" = "Erstelle Optionen";
|
||||
"settings_discovery_accept_terms" = "Bedingungen des Identitätsservers akzeptieren";
|
||||
"find_your_contacts_message" = "Lass dir von %@ deine Kontakte anzeigen um schnell mit denen zu chatten, die du am besten kennst.";
|
||||
"poll_timeline_votes_count" = "%lu Stimmen";
|
||||
"poll_timeline_one_vote" = "1 Stimme";
|
||||
"poll_edit_form_add_option" = "Option hinzufügen";
|
||||
"poll_edit_form_option_number" = "Option %lu";
|
||||
"poll_edit_form_question_or_topic" = "Frage oder Thematik";
|
||||
"room_event_action_end_poll" = "Umfrage beenden";
|
||||
"room_event_action_remove_poll" = "Umfrage entfernen";
|
||||
|
||||
// Mark: - Polls
|
||||
|
||||
"poll_edit_form_create_poll" = "Umfrage erstellen";
|
||||
"settings_labs_enabled_polls" = "Umfragen";
|
||||
"share_extension_send_now" = "Jetzt senden";
|
||||
"accessibility_button_label" = "Knopf";
|
||||
"settings_analytics_and_crash_data" = "Sende Absturz- und Analysedaten";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "Wir senden <b>keine</b> Informationen an Dritte";
|
||||
"analytics_prompt_terms_link_new_user" = "hier";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Hilf dabei %@ zu verbessern";
|
||||
"settings_about" = "ÜBER";
|
||||
"enable" = "Aktivieren";
|
||||
"analytics_prompt_message_upgrade" = "Du hast in der Vergangenheit bereits zugestimmt anonyme Nutzungsdaten mit uns zu teilen. Jetzt werden wir als Hilfe, um zu verstehen, wie Personen mehrere Geräte benutzen, eine zufällige Kennung generieren, die zwischen deinen Geräten geteilt wird.";
|
||||
"analytics_prompt_message_new_user" = "Hilf uns dabei Probleme zu identifizieren und Element zu verbessern, indem du anonyme Nutzungsdaten teilst. Um zu verstehen, wie Personen mehrere Geräte benutzen, werden wir eine zufällige Kennung generieren, die zwischen deinen Geräten geteilt wird.";
|
||||
"find_your_contacts_title" = "Starte mit der Auflistung deiner Kontakte";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "Du kannst unsere gesamten Bedingungen %@ nachlesen.";
|
||||
"poll_timeline_total_votes" = "%lu Stimmen abgegeben";
|
||||
"poll_timeline_total_one_vote" = "1 Stimme abgegeben";
|
||||
"poll_timeline_total_no_votes" = "Keine Stimmen abgegeben";
|
||||
"poll_timeline_not_closed_action" = "OK";
|
||||
"poll_timeline_vote_not_registered_action" = "OK";
|
||||
"poll_edit_form_post_failure_action" = "OK";
|
||||
"poll_edit_form_poll_question_or_topic" = "Frage oder Thema der Umfrage";
|
||||
"poll_edit_form_input_placeholder" = "Schreib etwas";
|
||||
"analytics_prompt_terms_link_upgrade" = "hier";
|
||||
"poll_timeline_not_closed_title" = "Fehler beim Beenden der Abstimmung";
|
||||
"poll_timeline_vote_not_registered_subtitle" = "Wir konnten deine Stimme leider nicht erfassen. Versuche es bitte erneut";
|
||||
"poll_timeline_total_final_results" = "Es wurden %lu Stimmen abgegeben";
|
||||
"poll_timeline_total_final_results_one_vote" = "Es wurde 1 Stimme abgegeben";
|
||||
"poll_timeline_total_votes_not_voted" = "%lu Stimmen abgegeben. Stimme ab, um die Ergebnisse zu sehen";
|
||||
"poll_timeline_total_one_vote_not_voted" = "1 Stimme abgegeben. Stimme ab, um die Ergebnisse zu sehen";
|
||||
"poll_timeline_not_closed_subtitle" = "Versuche es bitte erneut";
|
||||
"poll_timeline_vote_not_registered_title" = "Stimme nicht erfasst";
|
||||
"poll_edit_form_post_failure_subtitle" = "Versuche es bitte erneut";
|
||||
"poll_edit_form_post_failure_title" = "Fehler beim Senden der Abstimmung";
|
||||
"share_extension_low_quality_video_message" = "Für eine bessere Qualität sende es in %@ oder sende es in niedriger Qualität.";
|
||||
"share_extension_low_quality_video_title" = "Das Video wird in niedriger Qualität gesendet werden";
|
||||
"analytics_prompt_stop" = "Teilen beenden";
|
||||
"analytics_prompt_not_now" = "Nicht jetzt";
|
||||
"analytics_prompt_yes" = "Das ist Okay";
|
||||
"analytics_prompt_point_3" = "Du kannst dies jederzeit in den Einstellungen deaktivieren";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "Wir erfassen und analysieren <b>keine</b> Accountdaten";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "Alle unsere Bedingungen lesen %@. Bist du damit einverstanden?";
|
||||
|
||||
@@ -21,3 +21,4 @@
|
||||
"NSContactsUsageDescription" = "Element will show your contacts so you can invite them to chat.";
|
||||
"NSCalendarsUsageDescription" = "See your scheduled meetings in the app.";
|
||||
"NSFaceIDUsageDescription" = "Face ID is used to access your app.";
|
||||
"NSLocationWhenInUseUsageDescription" = "When you share your location to people, Element needs access to show them a map.";
|
||||
|
||||
@@ -71,6 +71,9 @@
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"FILE_FROM_USER" = "%@ sent a file %@";
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"LOCATION_FROM_USER" = "%@ shared their location";
|
||||
|
||||
/* A single unread message in a room */
|
||||
"SINGLE_UNREAD_IN_ROOM" = "You received a message in %@";
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
"less" = "Less";
|
||||
"open" = "Open";
|
||||
"done" = "Done";
|
||||
"ok" = "OK";
|
||||
|
||||
// Call Bar
|
||||
"callbar_only_single_active" = "Tap to return to the call (%@)";
|
||||
@@ -80,6 +81,18 @@
|
||||
"accessibility_checkbox_label" = "checkbox";
|
||||
"accessibility_button_label" = "button";
|
||||
|
||||
// Onboarding
|
||||
"onboarding_splash_register_button_title" = "Create account";
|
||||
"onboarding_splash_login_button_title" = "I already have an account";
|
||||
"onboarding_splash_page_1_title" = "Own your conversations.";
|
||||
"onboarding_splash_page_1_message" = "Secure and independent communication that gives you the same level of privacy as a face-to-face conversation in your own home.";
|
||||
"onboarding_splash_page_2_title" = "You’re in control.";
|
||||
"onboarding_splash_page_2_message" = "Choose where your conversations are kept, giving you control and independence. Connected via Matrix.";
|
||||
"onboarding_splash_page_3_title" = "Secure messaging.";
|
||||
"onboarding_splash_page_3_message" = "End-to-end encrypted and no phone number required. No ads or datamining.";
|
||||
"onboarding_splash_page_4_title_no_pun" = "Messaging for your team.";
|
||||
"onboarding_splash_page_4_message" = "Element is also great for the workplace. It’s trusted by the world’s most secure organisations.";
|
||||
|
||||
// Authentication
|
||||
"auth_login" = "Log in";
|
||||
"auth_register" = "Register";
|
||||
@@ -673,6 +686,8 @@ Tap the + to start adding people.";
|
||||
|
||||
"settings_show_NSFW_public_rooms" = "Show NSFW public rooms";
|
||||
|
||||
"settings_enable_room_message_bubbles" = "Message bubbles";
|
||||
|
||||
// Security settings
|
||||
"security_settings_title" = "Security";
|
||||
"security_settings_crypto_sessions" = "MY SESSIONS";
|
||||
@@ -969,7 +984,7 @@ Tap the + to start adding people.";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Help improve %@";
|
||||
"analytics_prompt_message_new_user" = "Help us identify issues and improve Element by sharing anonymous usage data. To understand how people use multiple devices, we’ll generate a random identifier, shared by your devices.";
|
||||
"analytics_prompt_message_new_user" = "Help us identify issues and improve %@ by sharing anonymous usage data. To understand how people use multiple devices, we’ll generate a random identifier, shared by your devices.";
|
||||
"analytics_prompt_message_upgrade" = "You previously consented to share anonymous usage data with us. Now, to help understand how people use multiple devices, we’ll generate a random identifier, shared by your devices.";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "You can read all our terms %@.";
|
||||
@@ -1771,7 +1786,7 @@ Tap the + to start adding people.";
|
||||
"spaces_coming_soon_title" = "Coming soon";
|
||||
"spaces_add_rooms_coming_soon_title" = "Adding rooms coming soon";
|
||||
"spaces_invites_coming_soon_title" = "Invites coming soon";
|
||||
"spaces_coming_soon_detail" = "This feature hasn’t been implemented here, but it’s on the way. For now, you can do that with Element on your computer.";
|
||||
"spaces_coming_soon_detail" = "This feature hasn’t been implemented here, but it’s on the way. For now, you can do that with %@ on your computer.";
|
||||
"space_participants_action_remove" = "Remove from this space";
|
||||
"space_participants_action_ban" = "Ban from this space";
|
||||
"space_home_show_all_rooms" = "Show all rooms";
|
||||
@@ -1841,8 +1856,6 @@ Tap the + to start adding people.";
|
||||
|
||||
"poll_edit_form_post_failure_subtitle" = "Please try again";
|
||||
|
||||
"poll_edit_form_post_failure_action" = "OK";
|
||||
|
||||
"poll_timeline_one_vote" = "1 vote";
|
||||
|
||||
"poll_timeline_votes_count" = "%lu votes";
|
||||
@@ -1865,10 +1878,32 @@ Tap the + to start adding people.";
|
||||
|
||||
"poll_timeline_vote_not_registered_subtitle" = "Sorry, your vote was not registered, please try again";
|
||||
|
||||
"poll_timeline_vote_not_registered_action" = "OK";
|
||||
|
||||
"poll_timeline_not_closed_title" = "Failed to end poll";
|
||||
|
||||
"poll_timeline_not_closed_subtitle" = "Please try again";
|
||||
|
||||
"poll_timeline_not_closed_action" = "OK";
|
||||
// MARK: - Location sharing
|
||||
|
||||
"location_sharing_title" = "Location";
|
||||
|
||||
"location_sharing_close_action" = "Close";
|
||||
|
||||
"location_sharing_share_action" = "Share";
|
||||
|
||||
"location_sharing_loading_map_error_title" = "%@ could not load the map. Please try again later.";
|
||||
|
||||
"location_sharing_locating_user_error_title" = "%@ could not access your location. Please try again later.";
|
||||
|
||||
"location_sharing_invalid_authorization_error_title" = "%@ does not have permission to access your location. You can enable access in Settings > Location";
|
||||
|
||||
"location_sharing_invalid_authorization_not_now" = "Not now";
|
||||
|
||||
"location_sharing_invalid_authorization_settings" = "Settings";
|
||||
|
||||
"location_sharing_open_apple_maps" = "Open in Apple Maps";
|
||||
|
||||
"location_sharing_open_google_maps" = "Open in Google Maps";
|
||||
|
||||
"location_sharing_settings_header" = "Location sharing";
|
||||
|
||||
"location_sharing_settings_toggle_title" = "Enable location sharing";
|
||||
|
||||
@@ -1474,7 +1474,7 @@
|
||||
"share_extension_low_quality_video_title" = "Saadame video madalama kvalitediga";
|
||||
"settings_about" = "TEAVE MEIST";
|
||||
"poll_edit_form_add_option" = "Lisa valik";
|
||||
"poll_edit_form_option_number" = "Valik %d";
|
||||
"poll_edit_form_option_number" = "Valik %lu";
|
||||
"poll_edit_form_create_options" = "Koosta valikud";
|
||||
"poll_edit_form_input_placeholder" = "Kirjuta midagi";
|
||||
"poll_edit_form_question_or_topic" = "Küsimus või teema";
|
||||
@@ -1484,3 +1484,46 @@
|
||||
|
||||
"poll_edit_form_create_poll" = "Koosta üks küsitlus";
|
||||
"settings_discovery_accept_terms" = "Nõustu isikutuvastusserveri tingimustega";
|
||||
"poll_timeline_not_closed_action" = "Sobib";
|
||||
"poll_timeline_not_closed_subtitle" = "Palun proovi uuesti";
|
||||
"poll_timeline_not_closed_title" = "Küsitluse lõpetamine ei õnnestunud";
|
||||
"poll_timeline_vote_not_registered_action" = "Sobib";
|
||||
"poll_timeline_vote_not_registered_subtitle" = "Vabandust, aga sinu valik jäi salvestamata. Palun proovi uuesti";
|
||||
"poll_timeline_vote_not_registered_title" = "Hääl ei salvestunud";
|
||||
"poll_timeline_total_final_results" = "%lu'l häälel põhinev lõpptulemus";
|
||||
"poll_timeline_total_final_results_one_vote" = "Ühel häälel põhinev lõpptulemus";
|
||||
"poll_timeline_total_votes_not_voted" = "%lu hääletanut. Tulemuste nägemiseks osale ise ka küsitluses";
|
||||
"poll_timeline_total_one_vote_not_voted" = "1 hääletanu. Tulemuste nägemiseks osale ise ka küsitluses";
|
||||
"poll_timeline_total_votes" = "%lu hääletanut";
|
||||
"poll_timeline_total_one_vote" = "1 hääletanu";
|
||||
"poll_timeline_total_no_votes" = "Hääletanuid ei ole";
|
||||
"poll_timeline_votes_count" = "%lu häält";
|
||||
"poll_timeline_one_vote" = "1 hääl";
|
||||
"poll_edit_form_post_failure_action" = "Sobib";
|
||||
"poll_edit_form_post_failure_subtitle" = "Palun proovi uuesti";
|
||||
"poll_edit_form_post_failure_title" = "Küsitluse üleslaadimine ei õnnestunud";
|
||||
"settings_labs_enabled_polls" = "Küsitlused";
|
||||
"room_event_action_end_poll" = "Lõpeta küsitlus";
|
||||
"room_event_action_remove_poll" = "Kustuta küsitlus";
|
||||
"analytics_prompt_stop" = "Lõpeta andmete jagamine";
|
||||
"analytics_prompt_yes" = "Jah, see on sobilik";
|
||||
"analytics_prompt_not_now" = "Mitte praegu";
|
||||
"analytics_prompt_point_3" = "Seadistustest saad alati määrata, et see funktsionaalsus pole kasutusel";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "Meie <b>ei</b> jaga teavet kolmandate osapooltega";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "Meie <b>ei</b> salvesta ega profileeri sinu kasutajakonto andmeid";
|
||||
"analytics_prompt_terms_link_upgrade" = "siit";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "Kõik meie tingimused leiad %@. Kas sa oled nõus?";
|
||||
"analytics_prompt_terms_link_new_user" = "siit";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "Meie kasutustingimused leiad %@.";
|
||||
"analytics_prompt_message_upgrade" = "Sa oled varem nõustunud meiega anonüümsete andmete jagamisega. Selleks, et mõistaksime, kuidas kasutajad erinevaid seadmeid pruugivad, me loome sinu seadmetele ühise juhusliku tunnuse.";
|
||||
"analytics_prompt_message_new_user" = "Võimalike vigade leidmiseks ja Element'i arendamiseks jaga meiega anonüümseid andmeid. Selleks, et mõistaksime, kuidas kasutajad erinevaid seadmeid pruugivad me loome sinu seadmetele ühise juhusliku tunnuse.";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Aita arendada %@ rakendust";
|
||||
"settings_analytics_and_crash_data" = "Saada rakenduse vigade ja analüütika andmeid";
|
||||
"accessibility_button_label" = "nupp";
|
||||
"enable" = "Võta kasutusele";
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
"NSCameraUsageDescription" = "L’appareil photo est utilisé pour prendre des photos, des vidéos et pour passer des appels vidéo.";
|
||||
"NSPhotoLibraryUsageDescription" = "La photothèque est utilisée pour envoyer des photos et des vidéos.";
|
||||
"NSMicrophoneUsageDescription" = "Element doit avoir accès au microphone pour passer des appels, capturer des vidéos et enregistrer des messages vocaux.";
|
||||
"NSContactsUsageDescription" = "Pour découvrir vos contacts qui utilisent déjà Matrix, Element peut envoyer les adresses e-mail et les numéros de téléphone de votre carnet d’adresse à votre serveur d’identité Matrix. Si votre serveur d’identité le prend en charge, les données personnelles sont hachées avant l’envoi − vérifiez sa politique de confidentialité pour plus de détails.";
|
||||
"NSContactsUsageDescription" = "Element affichera vos contacts pour que vous puissiez les inviter à parler.";
|
||||
"NSCalendarsUsageDescription" = "Voir vos rendez-vous dans l’application.";
|
||||
"NSFaceIDUsageDescription" = "Face ID est utilisé pour accéder à votre application.";
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
"auth_missing_phone" = "Numéro de téléphone manquant";
|
||||
"auth_missing_email_or_phone" = "Adresse e-mail ou numéro de téléphone manquant";
|
||||
"auth_password_dont_match" = "Les mots de passe ne correspondent pas";
|
||||
"auth_username_in_use" = "";
|
||||
"auth_username_in_use" = "Nom d’utilisateur déjà pris";
|
||||
"auth_forgot_password" = "Mot de passe oublié ?";
|
||||
"auth_use_server_options" = "Utiliser un serveur personnalisé (avancé)";
|
||||
"auth_email_validation_message" = "Merci de vérifier vos e-mails pour continuer l’inscription";
|
||||
@@ -94,7 +94,7 @@
|
||||
"room_creation_keep_private" = "Garder privée";
|
||||
"room_creation_make_private" = "Rendre privée";
|
||||
"room_creation_wait_for_creation" = "Un salon est déjà en cours de création. Veuillez patienter.";
|
||||
"room_creation_invite_another_user" = "Rechercher/inviter par identifiant, nom ou e-mail";
|
||||
"room_creation_invite_another_user" = "Identifiant, nom ou e-mail";
|
||||
// Room recents
|
||||
"room_recents_directory_section" = "RÉPERTOIRE DES SALONS";
|
||||
"room_recents_favourites_section" = "FAVORIS";
|
||||
@@ -251,9 +251,9 @@
|
||||
"settings_user_settings" = "PRÉFÉRENCES UTILISATEUR";
|
||||
"settings_notifications_settings" = "PRÉFÉRENCES DE NOTIFICATIONS";
|
||||
"settings_ignored_users" = "UTILISATEURS IGNORÉS";
|
||||
"settings_contacts" = "CONTACTS LOCAUX";
|
||||
"settings_contacts" = "CONTACTS DE L’APPAREIL";
|
||||
"settings_advanced" = "AVANCÉ";
|
||||
"settings_other" = "AUTRES";
|
||||
"settings_other" = "Autres";
|
||||
"settings_labs" = "EXPÉRIMENTAL";
|
||||
"settings_devices" = "SESSIONS";
|
||||
"settings_cryptography" = "CHIFFREMENT";
|
||||
@@ -1520,3 +1520,87 @@
|
||||
"room_recents_suggested_rooms_section" = "SALONS RECOMMANDÉS";
|
||||
"done" = "Terminé";
|
||||
"open" = "Ouvrir";
|
||||
"poll_timeline_not_closed_action" = "Ok";
|
||||
"poll_timeline_not_closed_subtitle" = "Merci de réessayer";
|
||||
"poll_timeline_not_closed_title" = "Échec de la fermeture du sondage";
|
||||
"poll_timeline_vote_not_registered_action" = "Ok";
|
||||
"poll_timeline_vote_not_registered_subtitle" = "Désolé votre vote n’a pas été enregistré, veuillez réessayer";
|
||||
"poll_timeline_vote_not_registered_title" = "Vote non enregistré";
|
||||
"poll_timeline_total_final_results" = "Résultats finaux basés sur %lu votes";
|
||||
"poll_timeline_total_final_results_one_vote" = "Résultats finaux basés sur 1 vote";
|
||||
"poll_timeline_total_votes_not_voted" = "%lu votes recueillis. Votez pour consulter les résultats";
|
||||
"poll_timeline_total_one_vote_not_voted" = "1 vote recueilli. Votez pour connaître les résultats";
|
||||
"poll_timeline_total_votes" = "%lu votes recueillis";
|
||||
"poll_timeline_total_one_vote" = "1 vote recueilli";
|
||||
"poll_timeline_total_no_votes" = "Aucun vote recueilli";
|
||||
"poll_timeline_votes_count" = "%lu votes";
|
||||
"poll_timeline_one_vote" = "1 vote";
|
||||
"poll_edit_form_post_failure_action" = "Ok";
|
||||
"poll_edit_form_post_failure_subtitle" = "Merci de réessayer";
|
||||
"poll_edit_form_post_failure_title" = "Échec de la publication du sondage";
|
||||
"poll_edit_form_add_option" = "Ajouter une option";
|
||||
"poll_edit_form_option_number" = "Option %lu";
|
||||
"poll_edit_form_create_options" = "Ajouter des options";
|
||||
"poll_edit_form_input_placeholder" = "Écrivez quelque chose";
|
||||
"poll_edit_form_question_or_topic" = "Question ou sujet";
|
||||
"poll_edit_form_poll_question_or_topic" = "Question ou sujet du sondage";
|
||||
|
||||
// Mark: - Polls
|
||||
|
||||
"poll_edit_form_create_poll" = "Créer un sondage";
|
||||
"space_home_show_all_rooms" = "Afficher tous les salons";
|
||||
"service_terms_modal_information_description_integration_manager" = "Un gestionnaire d’intégrations vous permet d’ajouter des fonctionnalités de tierces-parties.";
|
||||
"service_terms_modal_information_description_identity_server" = "Un serveur d’identité vous aide à trouver vos contacts, en recherchant leur numéro de téléphone ou adresse e-mail pour vérifier s’ils ont déjà un compte.";
|
||||
"service_terms_modal_information_title_integration_manager" = "Gestionnaire d’intégrations";
|
||||
|
||||
// Alert explaining what an identity server / integration manager is.
|
||||
"service_terms_modal_information_title_identity_server" = "Serveur d’identité";
|
||||
"service_terms_modal_description_integration_manager" = "Ceci vous permettra d’utiliser les robots, passerelles, widgets et jeux d’autocollants.";
|
||||
"service_terms_modal_description_identity_server" = "Ceci permettra aux personnes qui ont votre numéro de téléphone ou adresse e-mail de sauvegardées dans leurs contacts de vous trouver.";
|
||||
"service_terms_modal_table_header_integration_manager" = "CONDITIONS D’UTILISATION DU GESTIONNAIRE D’INTÉGRATIONS";
|
||||
"service_terms_modal_table_header_identity_server" = "CONDITIONS D’UTILISATION DU SERVEUR D’IDENTITÉ";
|
||||
"service_terms_modal_footer" = "Ceci peut être désactivé a n’importe quel moment dans les paramètres.";
|
||||
|
||||
// Service terms
|
||||
"service_terms_modal_title_message" = "Pour poursuivre, acceptez nos conditions d’utilisation";
|
||||
"share_extension_send_now" = "Envoyer maintenant";
|
||||
"share_extension_low_quality_video_message" = "Envoyez depuis %@ pour une meilleure qualité. Ou envoyez en mauvaise qualité ci-dessous.";
|
||||
"share_extension_low_quality_video_title" = "La vidéo sera envoyée en mauvaise qualité";
|
||||
"analytics_prompt_stop" = "Arrêter de partager";
|
||||
"analytics_prompt_yes" = "Oui, ça me va";
|
||||
"analytics_prompt_not_now" = "Pas maintenant";
|
||||
"analytics_prompt_point_3" = "Vous pouvez désactiver ceci à tout moment dans les paramètres";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "Nous ne partageons <b>pas</b> les données avec des entités tierces";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "Nous n’enregistrons et ne profilons <b>pas</b> de données liées à votre compte";
|
||||
"analytics_prompt_terms_link_upgrade" = "ici";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "Lisez nos conditions d’utilisation %@. Êtes vous d’accord ?";
|
||||
"analytics_prompt_terms_link_new_user" = "ici";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "Vous pouvez lire nos conditions d’utilisation %@.";
|
||||
"analytics_prompt_message_upgrade" = "Vous aviez consenti précédemment à partager des rapports d’utilisation avec nous. Désormais, pour nous aider à comprendre comment les gens utilisent cette application sur plusieurs appareils, nous allons générer un identifiant aléatoire commun à tous vos appareils.";
|
||||
"analytics_prompt_message_new_user" = "Aidez nous à identifier les problèmes et améliorer Element en envoyant des rapports d’usage anonymes. Pour comprendre de quelle manière les gens utilisent Element sur plusieurs appareils, nous créeront un identifiant aléatoire commun à tous vos appareils.";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Aidez à améliorer %@";
|
||||
"settings_discovery_accept_terms" = "Accepter les conditions du serveur d’identité";
|
||||
"settings_analytics_and_crash_data" = "Envoyer les rapports de plantages et d’utilisation";
|
||||
"settings_labs_enabled_polls" = "Sondages";
|
||||
"settings_about" = "À PROPOS";
|
||||
"settings_phone_contacts" = "CONTACTS DU TÉLÉPHONE";
|
||||
"room_event_action_forward" = "Transférer";
|
||||
"room_event_action_end_poll" = "Mettre fin au sondage";
|
||||
"room_event_action_remove_poll" = "Supprimer le sondage";
|
||||
"find_your_contacts_identity_service_error" = "Impossible de se connecter au serveur d’identité.";
|
||||
"find_your_contacts_button_title" = "Trouvez vos contacts";
|
||||
"find_your_contacts_message" = "Permettez à %@ d’accéder à vos contacts pour commencer à discuter rapidement avec ceux que vous connaissez le mieux.";
|
||||
"contacts_address_book_permission_denied_alert_message" = "Pour activer les contacts, rendez vous dans les paramètres de votre appareil.";
|
||||
"contacts_address_book_permission_denied_alert_title" = "Contacts désactivés";
|
||||
"accessibility_button_label" = "bouton";
|
||||
"enable" = "Activer";
|
||||
"find_your_contacts_footer" = "Cette fonctionnalité peut être désactivé à tout moment à partir des paramètres.";
|
||||
"find_your_contacts_title" = "Commencez par lister vos contacts";
|
||||
"settings_contacts_enable_sync_description" = "Cette fonctionnalité utilisera votre serveur d'identité pour vous connecter avec vos contacts, ainsi que pour les aider à vous trouver.";
|
||||
"settings_contacts_enable_sync" = "Trouvez vos contacts";
|
||||
|
||||
@@ -1533,7 +1533,7 @@
|
||||
"space_home_show_all_rooms" = "Minden szoba megjelenítése";
|
||||
"room_event_action_forward" = "Továbbítás";
|
||||
"poll_edit_form_add_option" = "Lehetőség hozzáadása";
|
||||
"poll_edit_form_option_number" = "%d lehetőség";
|
||||
"poll_edit_form_option_number" = "%lu lehetőség";
|
||||
"poll_edit_form_create_options" = "Lehetőségek hozzáadása";
|
||||
"poll_edit_form_input_placeholder" = "Írjon valamit";
|
||||
"poll_edit_form_question_or_topic" = "Kérdés vagy téma";
|
||||
@@ -1547,3 +1547,46 @@
|
||||
"share_extension_low_quality_video_title" = "Alacsony minőségű videó lesz elküldve";
|
||||
"settings_discovery_accept_terms" = "Azonosítási Szolgáltatás felhasználási feltételeinek elfogadása";
|
||||
"settings_about" = "NÉVJEGY";
|
||||
"poll_timeline_not_closed_action" = "OK";
|
||||
"poll_timeline_not_closed_subtitle" = "Kérlek próbáld újra";
|
||||
"poll_timeline_not_closed_title" = "Nem sikerült a szavazás lezárása";
|
||||
"poll_timeline_vote_not_registered_action" = "OK";
|
||||
"poll_timeline_vote_not_registered_subtitle" = "Sajnos a szavazatod nem lett rögzítve. Kérlek ismételd meg újra";
|
||||
"poll_timeline_vote_not_registered_title" = "Szavazás nem sikerült";
|
||||
"poll_timeline_total_final_results" = "Végeredmény %lu szavazat alapján";
|
||||
"poll_timeline_total_final_results_one_vote" = "Eredmény 1 szavazat alapján";
|
||||
"poll_timeline_total_votes_not_voted" = "%lu szavazatot adtak le. Szavazz az eredmény megtekintéséhez";
|
||||
"poll_timeline_total_one_vote_not_voted" = "1 szavazatot adtak le. Szavazz az eredmény megtekintéséhez";
|
||||
"poll_timeline_total_votes" = "%lu szavazatot adtak le";
|
||||
"poll_timeline_total_one_vote" = "1 szavazatot adtak le";
|
||||
"poll_timeline_total_no_votes" = "Nem adtak le szavazatot";
|
||||
"poll_timeline_votes_count" = "%lu szavazat";
|
||||
"poll_timeline_one_vote" = "1 szavazat";
|
||||
"poll_edit_form_post_failure_action" = "OK";
|
||||
"poll_edit_form_post_failure_subtitle" = "Kérlek próbáld újra";
|
||||
"poll_edit_form_post_failure_title" = "A szavazást nem sikerült beküldeni";
|
||||
"analytics_prompt_stop" = "Megosztás megállítása";
|
||||
"analytics_prompt_yes" = "Igen, rendben van";
|
||||
"analytics_prompt_not_now" = "Nem most";
|
||||
"analytics_prompt_point_3" = "Ezt bármikor kikapcsolhatod a beállításokban";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "<b>Nem</b> osztjuk meg az információt harmadik féllel";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "<b>Nem</b> küldünk és nem profilozunk semmilyen fiók adatot";
|
||||
"analytics_prompt_terms_link_upgrade" = "itt";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "Olvasd el minden feltételünket: %@. Rendben?";
|
||||
"analytics_prompt_terms_link_new_user" = "itt";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "Az összes feltételünket elolvashatod itt: %@.";
|
||||
"analytics_prompt_message_new_user" = "Segíts észrevennünk a hibákat, és jobbá tenni az Element-et a névtelen használati adatok küldése által. Ahhoz, hogy megértsük, hogyan használnak a felhasználók egyszerre több eszközt, egy véletlenszerű azonosítót generálunk, ami az eszközeid között meg lesz osztva.";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Segíts jobbá tenni %@";
|
||||
"settings_analytics_and_crash_data" = "Összeomlás és analitikai adatok küldése";
|
||||
"settings_labs_enabled_polls" = "Szavazások";
|
||||
"room_event_action_end_poll" = "Szavazás lezárása";
|
||||
"room_event_action_remove_poll" = "Szavazás törlése";
|
||||
"accessibility_button_label" = "gomb";
|
||||
"enable" = "Engedélyezés";
|
||||
"analytics_prompt_message_upgrade" = "Korábban beleegyeztél, hogy velünk anonimizált adatokat osztasz meg. Most, hogy jobban megértsük, hogyan használnak több eszközt az emberek, véletlenszerű azonosítót állítunk elő amit az eszközeid használni fognak.";
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
"joined" = "Bergabung";
|
||||
"collapse" = "tutup";
|
||||
"store_promotional_text" = "Aplikasi perpesanan dan kolaborasi yang menjaga privasi, pada jaringan terbuka. Terdesentralisasi untuk Anda kendali. Tidak ada penambangan data, tidak ada pintu belakang dan tidak ada akses pihak ketiga.";
|
||||
"store_full_description" = "Element adalah aplikasi messenger dan kolaborasi tipe baru yang:\n\n1. Menempatkan Anda dalam kendali untuk mempertahankan privasi Anda\n2. Memungkinkan Anda berkomunikasi dengan siapa pun di jaringan Matrix, dan bahkan di luar dengan mengintegrasikan dengan aplikasi seperti Slack\n3. Melindungi Anda dari iklan, menambangan data, pintu belakang, dan taman berdinding\n4. Mengamankan Anda melalui enkripsi ujung-ke-ujung, dengan penandatanganan silang untuk memverifikasi orang lain\n\nElement benar-benar berbeda dari aplikasi perpesanan dan kolaborasi lain karena Element terdesentralisasi dan sumber terbuka.\n\nElement memungkinkan Anda host sendiri - atau memilih host - sehingga Anda memiliki privasi, kepemilikan, dan kontrol data dan obrolan Anda. Ini memberi Anda akses ke jaringan terbuka, jadi Anda tidak hanya terjebak berbicara dengan pengguna Element. Itu sangat aman.\n\nElement dapat melakukan semua ini karena beroperasi pada Matrix - standar untuk komunikasi terdesentralisasi terbuka.\n\nElement menempatkan Anda dalam kendali dengan membiarkan Anda memilih siapa yang menghost percakapan Anda. Dari aplikasi Element, Anda dapat memilih untuk menghost dengan cara yang berbeda:\n\n1. Dapatkan akun gratis pada server publik matrix.org\n2. Host sendiri akun Anda dengan menjalankan server pada perangkat keras Anda sendiri\n3. Mendaftar untuk akun di server khusus dengan hanya berlangganan platform hosting Element Matrix Services\n\nMengapa memilih Element?\n\nMILIKI DATA ANDA: Anda memutuskan di mana untuk menyimpan data dan pesan Anda. Anda memilikinya dan mengendalikannya, bukan perusahaan besar yang menambang data Anda atau memberikan akses ke pihak ketiga.\n\nPESAN DAN KOLABORASI TERBUKA: Anda dapat mengobrol dengan orang lain di jaringan Matrix, jika mereka menggunakan Element atau aplikasi Matrix lain, dan bahkan jika mereka menggunakan sistem perpesanan seperti Slack, IRC atau XMPP.\n\nSANGAT AMAN: Enkripsi ujung-ke-ujung yang nyata (hanya mereka yang dalam percakapan dapat mendekripsi pesan), dan penandatanganan silang untuk memverifikasi perangkat anggota obrolan.\n\nKOMUNIKASI LENGKAP: Perpesanan, panggilan suara dan video, pembagian file, pembagian layar dan banyak integrasi, bot dan widget. Buat ruangan, komunitas, tetap terhubung dan selesaikan hal-hal.\n\nDI MANA PUN ANDA BERADA: Tetap berkomunikasi di mana pun Anda berada dengan riwayat pesan yang sepenuhnya disinkronkan di semua perangkat Anda dan di web di https://app.element.io/.";
|
||||
"store_full_description" = "Element adalah aplikasi messenger dan kolaborasi tipe baru yang:\n\n1. Menempatkan Anda dalam kendali untuk mempertahankan privasi Anda\n2. Memungkinkan Anda berkomunikasi dengan siapa pun di jaringan Matrix, dan bahkan di luar dengan mengintegrasikan dengan aplikasi seperti Slack\n3. Melindungi Anda dari iklan, menambangan data, pintu belakang, dan taman berdinding\n4. Mengamankan Anda melalui enkripsi ujung-ke-ujung, dengan penandatanganan silang untuk memverifikasi orang lain\n\nElement benar-benar berbeda dari aplikasi perpesanan dan kolaborasi lain karena Element terdesentralisasi dan sumber terbuka.\n\nElement memungkinkan Anda host sendiri — atau memilih host — sehingga Anda memiliki privasi, kepemilikan, dan kontrol data dan obrolan Anda. Ini memberi Anda akses ke jaringan terbuka, jadi Anda tidak hanya terjebak berbicara dengan pengguna Element. Itu sangat aman.\n\nElement dapat melakukan semua ini karena beroperasi pada Matrix — standar untuk komunikasi terdesentralisasi terbuka.\n\nElement menempatkan Anda dalam kendali dengan membiarkan Anda memilih siapa yang menghost percakapan Anda. Dari aplikasi Element, Anda dapat memilih untuk menghost dengan cara yang berbeda:\n\n1. Dapatkan akun gratis pada server publik matrix.org\n2. Host sendiri akun Anda dengan menjalankan server pada perangkat keras Anda sendiri\n3. Mendaftar untuk akun di server khusus dengan hanya berlangganan platform hosting Element Matrix Services\n\nMengapa memilih Element?\n\nMILIKI DATA ANDA: Anda memutuskan di mana untuk menyimpan data dan pesan Anda. Anda memilikinya dan mengendalikannya, bukan perusahaan besar yang menambang data Anda atau memberikan akses ke pihak ketiga.\n\nPESAN DAN KOLABORASI TERBUKA: Anda dapat mengobrol dengan orang lain di jaringan Matrix, jika mereka menggunakan Element atau aplikasi Matrix lain, dan bahkan jika mereka menggunakan sistem perpesanan seperti Slack, IRC atau XMPP.\n\nSANGAT AMAN: Enkripsi ujung-ke-ujung yang nyata (hanya mereka yang dalam percakapan dapat mendekripsi pesan), dan penandatanganan silang untuk memverifikasi perangkat anggota obrolan.\n\nKOMUNIKASI LENGKAP: Perpesanan, panggilan suara dan video, pembagian file, pembagian layar dan banyak integrasi, bot dan widget. Buat ruangan, komunitas, tetap terhubung dan selesaikan hal-hal.\n\nDI MANA PUN ANDA BERADA: Tetap berkomunikasi di mana pun Anda berada dengan riwayat pesan yang sepenuhnya disinkronkan di semua perangkat Anda dan di web di https://app.element.io/.";
|
||||
// String for App Store
|
||||
"store_short_description" = "Obrolan/VoIP terdesentralisasi aman";
|
||||
|
||||
@@ -617,7 +617,7 @@
|
||||
"spaces_empty_space_detail" = "Beberapa ruangan mungkin disembunyikan karena ruangannya pribadi dan Anda memerlukan sebuah undangan.";
|
||||
"leave_space_message" = "Apakah anda Anda yakin ingin keluar dari %@? Apakah Anda juga ingin meninggalkan semua ruangan dan space lainnya di space ini?";
|
||||
"space_beta_announce_information" = "Space adalah cara baru untuk mengelompokkan ruangan dan orang. Mereka belum ada di iOS, tetapi Anda dapat menggunakannya sekarang di Web dan Desktop.";
|
||||
"favourites_empty_view_information" = "Anda dapat memfavoritkan dengan beberapa cara - yang tercepat adalah dengan menekan dan menahan. Ketuk ikon bintang dan mereka akan secara otomatis muncul di sini.";
|
||||
"favourites_empty_view_information" = "Anda dapat memfavoritkan dengan beberapa cara — yang tercepat adalah dengan menekan dan menahan. Ketuk ikon bintang dan mereka akan secara otomatis muncul di sini.";
|
||||
"home_empty_view_information" = "Aplikasi obrolan aman semua-dalam-satu untuk tim, teman, dan organisasi. Ketuk tombol + di bawah untuk menambahkan orang dan ruangan.";
|
||||
"pin_protection_explanatory" = "Menyiapkan PIN memungkinkan Anda melindungi data seperti pesan dan kontak, jadi hanya Anda yang dapat mengaksesnya dengan memasukkan PIN di awal aplikasi.";
|
||||
"major_update_information" = "Kami senang mengumumkan bahwa kami telah mengubah nama kami! Aplikasi Anda telah diperbarui dan Anda masuk ke akun Anda.";
|
||||
@@ -1538,7 +1538,7 @@
|
||||
"space_feature_unavailable_information" = "Space adalah cara baru untuk mengelompokkan ruangan dan pengguna.\n\nMereka akan segera datang. Untuk saat ini, jika Anda bergabung sebuah space di platform lain, Anda akan dapat mengakses ruang mana saja yang Anda ikuti di sini.";
|
||||
|
||||
// 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_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_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.";
|
||||
@@ -1649,7 +1649,7 @@
|
||||
"group_details_title" = "Detail Komunitas";
|
||||
"room_event_action_forward" = "Teruskan";
|
||||
"poll_edit_form_add_option" = "Tambahkan opsi";
|
||||
"poll_edit_form_option_number" = "Opsi %d";
|
||||
"poll_edit_form_option_number" = "Opsi %lu";
|
||||
"poll_edit_form_create_options" = "Buat opsi";
|
||||
"poll_edit_form_input_placeholder" = "Tulis sesuatu";
|
||||
"poll_edit_form_question_or_topic" = "Pertanyaan atau topik";
|
||||
@@ -1663,3 +1663,46 @@
|
||||
"share_extension_low_quality_video_title" = "Video akan dikirim dalam kualitas rendah";
|
||||
"settings_discovery_accept_terms" = "Terima Persyaratan Server Identitas";
|
||||
"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_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";
|
||||
"poll_timeline_total_final_results" = "Hasil akhir berdasarkan %lu suara";
|
||||
"poll_timeline_total_final_results_one_vote" = "Hasil akhir berdasarkan 1 suara";
|
||||
"poll_timeline_total_votes_not_voted" = "%lu suara diberikan. Berikan suara untuk melihat hasilnya";
|
||||
"poll_timeline_total_one_vote_not_voted" = "1 suara diberikan. Berikan suara untuk melihat hasilnya";
|
||||
"poll_timeline_total_no_votes" = "Tidak ada suara yang diberikan";
|
||||
"poll_timeline_total_votes" = "%lu suara diberikan";
|
||||
"poll_timeline_total_one_vote" = "1 suara diberikan";
|
||||
"poll_timeline_votes_count" = "%lu suara";
|
||||
"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";
|
||||
"settings_labs_enabled_polls" = "Poll";
|
||||
"room_event_action_end_poll" = "Akhiri poll";
|
||||
"room_event_action_remove_poll" = "Hapus poll";
|
||||
"analytics_prompt_stop" = "Berhenti membagikan";
|
||||
"analytics_prompt_yes" = "Iya, saya tidak keberatan";
|
||||
"analytics_prompt_not_now" = "Jangan sekarang";
|
||||
"analytics_prompt_point_3" = "Anda dapat mematikannya kapan saja di pengaturan";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "Kami <b>tidak</b> membagikan informasi ini dengan pihak ketiga";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "Kami <b>tidak</b> merekam atau memprofil data akun apapun";
|
||||
"analytics_prompt_terms_link_upgrade" = "di sini";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "Baca semua kebijakan kami %@. Apakah Anda tidak keberatan?";
|
||||
"analytics_prompt_terms_link_new_user" = "di sini";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "Anda dapat membaca semua kebijakan kami %@.";
|
||||
"analytics_prompt_message_upgrade" = "Anda sebelumnya setuju untuk mengirimkan data penggunaan anonim dengan kami. Sekarang, supaya kami dapat memahami bagaimana orang-orang menggunakan beberapa perangkat-perangkat, kami akan membuat pengenal acak, yang dibagikan oleh perangkat Anda.";
|
||||
"analytics_prompt_message_new_user" = "Bantu kami mengidentifikasi masalah-masalah dan membuat Element lebih baik dengan membagikan data penggunaan anonim. Untuk memahami bagaimana orang-orang menggunakan beberapa perangkat-perangkat, kami akan membuat pengenal acak, yang dibagikan oleh perangkat Anda.";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Bantu membuat %@ lebih baik";
|
||||
"settings_analytics_and_crash_data" = "Kirim data crash dan analitik";
|
||||
"accessibility_button_label" = "tombol";
|
||||
"enable" = "Aktifkan";
|
||||
|
||||
@@ -1504,7 +1504,7 @@
|
||||
"space_home_show_all_rooms" = "Mostra tutte le stanze";
|
||||
"room_event_action_forward" = "Inoltra";
|
||||
"poll_edit_form_add_option" = "Aggiungi opzione";
|
||||
"poll_edit_form_option_number" = "Opzione %d";
|
||||
"poll_edit_form_option_number" = "Opzione %lu";
|
||||
"poll_edit_form_create_options" = "Crea opzioni";
|
||||
"poll_edit_form_input_placeholder" = "Scrivi qualcosa";
|
||||
"poll_edit_form_question_or_topic" = "Domanda o argomento";
|
||||
@@ -1518,3 +1518,46 @@
|
||||
"share_extension_low_quality_video_title" = "Il video verrà inviato in bassa qualità";
|
||||
"settings_discovery_accept_terms" = "Accetta termini del server d'identità";
|
||||
"settings_about" = "INFORMAZIONI";
|
||||
"poll_timeline_not_closed_action" = "OK";
|
||||
"poll_timeline_not_closed_subtitle" = "Riprova";
|
||||
"poll_timeline_not_closed_title" = "Chiusura del sondaggio fallita";
|
||||
"poll_timeline_vote_not_registered_action" = "OK";
|
||||
"poll_timeline_vote_not_registered_subtitle" = "Spiacenti, il tuo voto non è stato registrato, riprova";
|
||||
"poll_timeline_vote_not_registered_title" = "Voto non registrato";
|
||||
"poll_timeline_total_final_results" = "Risultato finale basato su %lu voti";
|
||||
"poll_timeline_total_final_results_one_vote" = "Risultato finale basato su 1 voto";
|
||||
"poll_timeline_total_votes_not_voted" = "%lu voti inviati. Vota per vedere i risultati";
|
||||
"poll_timeline_total_one_vote_not_voted" = "1 voto inviato. Vota per vedere i risultati";
|
||||
"poll_timeline_total_votes" = "%lu voti";
|
||||
"poll_timeline_total_one_vote" = "1 voto";
|
||||
"poll_timeline_total_no_votes" = "Nessun voto";
|
||||
"poll_timeline_votes_count" = "%lu voti";
|
||||
"poll_timeline_one_vote" = "1 voto";
|
||||
"poll_edit_form_post_failure_action" = "OK";
|
||||
"poll_edit_form_post_failure_subtitle" = "Riprova";
|
||||
"poll_edit_form_post_failure_title" = "Invio del sondaggio fallito";
|
||||
"settings_labs_enabled_polls" = "Sondaggi";
|
||||
"room_event_action_end_poll" = "Termina sondaggio";
|
||||
"room_event_action_remove_poll" = "Rimuovi sondaggio";
|
||||
"analytics_prompt_stop" = "Non condividere più";
|
||||
"analytics_prompt_yes" = "Sì, va bene";
|
||||
"analytics_prompt_not_now" = "Non ora";
|
||||
"analytics_prompt_point_3" = "Puoi disattivarlo in qualsiasi momento nelle impostazioni";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "<b>Non</b> condividiamo informazioni con terze parti";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "<b>Non</b> registriamo o profiliamo alcun dato dell'account";
|
||||
"analytics_prompt_terms_link_upgrade" = "qui";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "Leggi i nostri termini di servizio %@. Accetti?";
|
||||
"analytics_prompt_terms_link_new_user" = "qui";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "Puoi leggere i nostri termini di servizio %@.";
|
||||
"analytics_prompt_message_upgrade" = "Hai acconsentito precedentemente a condividere con noi dati di utilizzo anonimi. Ora, per capire come le persone usano diversi dispositivi, genereremo un identificativo casuale, condiviso dai tuoi dispositivi.";
|
||||
"analytics_prompt_message_new_user" = "Aiutaci a identificare problemi e a migliorare Element condividendo dati di utilizzo anonimi. Per capire come le persone usano diversi dispositivi, genereremo un identificativo casuale, condiviso dai tuoi dispositivi.";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Aiuta a migliorare %@";
|
||||
"settings_analytics_and_crash_data" = "Invia crash e dati analitici";
|
||||
"accessibility_button_label" = "pulsante";
|
||||
"enable" = "Attiva";
|
||||
|
||||
@@ -1068,3 +1068,64 @@
|
||||
"contacts_address_book_permission_denied_alert_message" = "연락처를 사용하려면, 설정으로 이동하십시오.";
|
||||
"contacts_address_book_permission_denied_alert_title" = "연락처 사용 안 함";
|
||||
"rooms_empty_view_title" = "방";
|
||||
|
||||
// AuthenticatedSessionViewControllerFactory
|
||||
"authenticated_session_flow_not_supported" = "이 앱은 해당 홈서버의 인증 구조를 지원하지 않습니다.";
|
||||
"security_settings_user_password_description" = "신원을 확인하기 위해 계정 비밀번호를 입력해주세요.";
|
||||
"event_formatter_widget_removed_by_you" = "위젯을 제거함 : %@";
|
||||
|
||||
// Events formatter with you
|
||||
"event_formatter_widget_added_by_you" = "위젯을 추가함 : %@";
|
||||
"event_formatter_group_call_leave" = "떠나기";
|
||||
"event_formatter_group_call_join" = "들어가기";
|
||||
"event_formatter_group_call" = "그룹 전화";
|
||||
"event_formatter_call_end_call" = "통화 종료";
|
||||
"event_formatter_call_retry" = "재시도";
|
||||
"event_formatter_call_decline" = "거부";
|
||||
"event_formatter_call_back" = "통화 재시도";
|
||||
"event_formatter_call_connection_failed" = "연결 실패";
|
||||
"event_formatter_call_missed_voice" = "음성 통화 부재중";
|
||||
"event_formatter_call_missed_video" = "영상 통화 부재중";
|
||||
"event_formatter_call_you_declined" = "통화 거부";
|
||||
"event_formatter_call_active_voice" = "음성 통화 활성";
|
||||
"event_formatter_call_active_video" = "영상 통화 활성";
|
||||
"event_formatter_call_incoming_video" = "영상 통화 수신";
|
||||
"event_formatter_call_incoming_voice" = "음성 통화 수신";
|
||||
"event_formatter_call_has_ended_with_time" = "통화 끊김 %@";
|
||||
"event_formatter_call_has_ended" = "통화 끊기";
|
||||
"event_formatter_call_ringing" = "통화중…";
|
||||
"event_formatter_call_connecting" = "연결중…";
|
||||
"room_notifs_settings_encrypted_room_notice" = "암호화된 방에서는 멘션 및 키워드 알림이 작동하지 않습니다.";
|
||||
"room_notifs_settings_account_settings" = "계정 설정";
|
||||
"room_notifs_settings_cancel_action" = "취소";
|
||||
"room_notifs_settings_done_action" = "적용";
|
||||
"room_notifs_settings_none" = "알림받지 않기";
|
||||
"room_notifs_settings_mentions_and_keywords" = "멘션과 키워드만";
|
||||
"room_notifs_settings_all_messages" = "모든 메시지";
|
||||
"room_details_advanced_e2e_encryption_disabled_for_dm" = "이 방의 암호화가 활성화되지 않음.";
|
||||
"room_details_advanced_e2e_encryption_enabled_for_dm" = "이 방의 암호화 활성화됨";
|
||||
"room_details_advanced_room_id_for_dm" = "아이디 :";
|
||||
"room_details_no_local_addresses_for_dm" = "이 방은 로컬 주소를 가지고 있지 않음";
|
||||
"room_details_access_section_anyone_for_dm" = "게스트를 포함한 초대 링크를 알고 있는 누구나";
|
||||
"room_details_access_section_anyone_apart_from_guest_for_dm" = "게스트를 제외하고 초대 링크를 알고 있는 누구나";
|
||||
"room_details_access_section_for_dm" = "누가 접근할 수 있나요?";
|
||||
"room_details_notifs" = "알림";
|
||||
"room_details_room_name_for_dm" = "이름";
|
||||
"room_details_photo_for_dm" = "사진";
|
||||
"room_details_integrations" = "통합";
|
||||
"room_details_search" = "방 검색";
|
||||
"room_details_title_for_dm" = "정보";
|
||||
"manage_session_sign_out" = "세션 연결 끊기";
|
||||
"manage_session_not_trusted" = "신뢰하지 않음";
|
||||
"manage_session_trusted" = "신뢰하도록 설정됨";
|
||||
"manage_session_name" = "세션 이름";
|
||||
"manage_session_info" = "세션 정보";
|
||||
|
||||
// Manage session
|
||||
"manage_session_title" = "세션 관리";
|
||||
"settings_analytics_and_crash_data" = "오류 및 분석 데이터 전송";
|
||||
"settings_labs_enabled_polls" = "투표";
|
||||
"room_event_action_end_poll" = "투표 종료";
|
||||
"room_event_action_remove_poll" = "투표 제거";
|
||||
"accessibility_button_label" = "버튼";
|
||||
"enable" = "활성화";
|
||||
|
||||
@@ -1633,7 +1633,7 @@
|
||||
"contacts_address_book_permission_denied_alert_message" = "Om contacten in te schakelen, ga naar uw apparaatinstellingen.";
|
||||
"contacts_address_book_permission_denied_alert_title" = "Contacten uitgeschakeld";
|
||||
"poll_edit_form_add_option" = "Optie toevoegen";
|
||||
"poll_edit_form_option_number" = "Optie %d";
|
||||
"poll_edit_form_option_number" = "Optie %lu";
|
||||
"poll_edit_form_create_options" = "Opties maken";
|
||||
"poll_edit_form_input_placeholder" = "Schrijf iets";
|
||||
"poll_edit_form_question_or_topic" = "Vraag of onderwerp";
|
||||
@@ -1647,3 +1647,46 @@
|
||||
"share_extension_low_quality_video_title" = "Video zal in lage kwaliteit worden verstuurd";
|
||||
"settings_discovery_accept_terms" = "Identiteitsserver-voorwaarden aanvaarden";
|
||||
"settings_about" = "OVER";
|
||||
"poll_timeline_not_closed_action" = "OK";
|
||||
"poll_timeline_not_closed_subtitle" = "Probeer het opnieuw";
|
||||
"poll_timeline_not_closed_title" = "Sluiten van de poll mislukt";
|
||||
"poll_timeline_vote_not_registered_action" = "OK";
|
||||
"poll_timeline_vote_not_registered_subtitle" = "Sorry, uw stem is niet geregistreerd. Probeer het opnieuw";
|
||||
"poll_timeline_vote_not_registered_title" = "Stem niet geregistreerd";
|
||||
"poll_timeline_total_final_results" = "Uitslag gebaseerd op %lu stemmen";
|
||||
"poll_timeline_total_final_results_one_vote" = "Uitslag gebaseerd op 1 stem";
|
||||
"poll_timeline_total_votes_not_voted" = "%lu stemmen uitgebracht. Stem om de resultaten te zien";
|
||||
"poll_timeline_total_one_vote_not_voted" = "1 stem uitgebracht. Stem om de resultaten te zien";
|
||||
"poll_timeline_total_votes" = "%lu stemmen uitgebracht";
|
||||
"poll_timeline_total_one_vote" = "1 stem uitgebracht";
|
||||
"poll_timeline_total_no_votes" = "Geen stemmen uitgebracht";
|
||||
"poll_timeline_votes_count" = "%lu stemmen";
|
||||
"poll_timeline_one_vote" = "1 stem";
|
||||
"poll_edit_form_post_failure_action" = "OK";
|
||||
"poll_edit_form_post_failure_subtitle" = "Probeer het opnieuw";
|
||||
"poll_edit_form_post_failure_title" = "Poll plaatsen mislukt";
|
||||
"analytics_prompt_stop" = "Delen stoppen";
|
||||
"analytics_prompt_yes" = "Ja, dat is prima";
|
||||
"analytics_prompt_not_now" = "Niet nu";
|
||||
"analytics_prompt_point_3" = "U kunt dit op elk moment uitzetten in de instellingen";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "Wij delen <b>geen</b> informatie met derden";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "We registreren of profileren <b>geen</b> accountgegevens";
|
||||
"analytics_prompt_terms_link_upgrade" = "hier";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "Lees al onze voorwaarden %@. Is dit akkoord?";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "U kunt al onze voorwaarden %@ lezen.";
|
||||
"analytics_prompt_terms_link_new_user" = "hier";
|
||||
"analytics_prompt_message_upgrade" = "U heeft eerder toestemming gegeven om anonieme gebruiksgegevens met ons te delen. Om beter te begrijpen hoe mensen meerdere apparaten gebruiken, genereren we nu een willekeurige identificatiecode die door uw apparaten wordt gedeeld.";
|
||||
"analytics_prompt_message_new_user" = "Help ons bij het identificeren van problemen en het verbeteren van Element door anonieme gebruiksgegevens te delen. Om te begrijpen hoe mensen meerdere apparaten gebruiken genereren we een willekeurige identificatie die we verspreiden over uw apparaten.";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Help %@ verbeteren";
|
||||
"settings_analytics_and_crash_data" = "Crash en analytische data versturen";
|
||||
"settings_labs_enabled_polls" = "Polls";
|
||||
"room_event_action_end_poll" = "Poll sluiten";
|
||||
"room_event_action_remove_poll" = "Poll verwijderen";
|
||||
"accessibility_button_label" = "knop";
|
||||
"enable" = "Inschakelen";
|
||||
|
||||
11
Riot/Assets/nn.lproj/Vector.strings
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
|
||||
"title_rooms" = "Rom";
|
||||
"title_people" = "Folk";
|
||||
"title_favourites" = "Favorittar";
|
||||
|
||||
// Titles
|
||||
"title_home" = "Heim";
|
||||
"warning" = "Åtvaring";
|
||||
// String for App Store
|
||||
"store_short_description" = "Sikker desentralisert chat/IP-telefoni";
|
||||
7
Riot/Assets/pt.lproj/InfoPlist.strings
Normal file
@@ -0,0 +1,7 @@
|
||||
|
||||
|
||||
"NSContactsUsageDescription" = "O Element vai mostrar os seus contactos para que os possa convidar para conversar.";
|
||||
"NSMicrophoneUsageDescription" = "O Element necessita de aceder ao seu microfone para fazer e receber chamadas e para gravar mensagens de voz.";
|
||||
"NSPhotoLibraryUsageDescription" = "A biblioteca de fotos é usada para enviar fotos e vídeos.";
|
||||
// Permissions usage explanations
|
||||
"NSCameraUsageDescription" = "A câmara é usada para tirar fotos e vídeos e fazer videochamadas.";
|
||||
1
Riot/Assets/pt.lproj/Localizable.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
1
Riot/Assets/pt.lproj/Vector.strings
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
@@ -1501,7 +1501,7 @@
|
||||
"space_home_show_all_rooms" = "Mostrar todas as salas";
|
||||
"room_event_action_forward" = "Encaminhar";
|
||||
"poll_edit_form_add_option" = "Adicionar opção";
|
||||
"poll_edit_form_option_number" = "Opção %d";
|
||||
"poll_edit_form_option_number" = "Opção %lu";
|
||||
"poll_edit_form_create_options" = "Criar opções";
|
||||
"poll_edit_form_input_placeholder" = "Escreva algo";
|
||||
"poll_edit_form_question_or_topic" = "Pergunta ou tópico";
|
||||
@@ -1515,3 +1515,46 @@
|
||||
"share_extension_low_quality_video_title" = "Vídeo vai ser enviado em baixa qualidade";
|
||||
"settings_discovery_accept_terms" = "Aceitar Termos de Servidor de Identidade";
|
||||
"settings_about" = "SOBRE";
|
||||
"poll_timeline_not_closed_action" = "OK";
|
||||
"poll_timeline_not_closed_subtitle" = "Por favor tente de novo";
|
||||
"poll_timeline_not_closed_title" = "Falha para terminar sondagem";
|
||||
"poll_timeline_vote_not_registered_action" = "OK";
|
||||
"poll_timeline_vote_not_registered_subtitle" = "Desculpe, seu voto não foi registrado, por favor tente de novo";
|
||||
"poll_timeline_vote_not_registered_title" = "Voto não registrado";
|
||||
"poll_timeline_total_final_results" = "Resultados finais baseados em %lu votos";
|
||||
"poll_timeline_total_final_results_one_vote" = "Resultados finais baseados em 1 voto";
|
||||
"poll_timeline_total_votes_not_voted" = "%lu votos lançados. Vote para ver os resultados";
|
||||
"poll_timeline_total_one_vote_not_voted" = "1 voto lançado. Vote para ver os resultados";
|
||||
"poll_timeline_total_votes" = "%lu votos lançados";
|
||||
"poll_timeline_total_one_vote" = "1 voto lançado";
|
||||
"poll_timeline_total_no_votes" = "Nenhum voto lançado";
|
||||
"poll_timeline_votes_count" = "%lu votos";
|
||||
"poll_timeline_one_vote" = "1 voto";
|
||||
"poll_edit_form_post_failure_action" = "OK";
|
||||
"poll_edit_form_post_failure_subtitle" = "Por favor tente de novo";
|
||||
"poll_edit_form_post_failure_title" = "Falha para postar sondagem";
|
||||
"settings_labs_enabled_polls" = "Sondagens";
|
||||
"room_event_action_end_poll" = "Terminar sondagem";
|
||||
"room_event_action_remove_poll" = "Remover sondagem";
|
||||
"analytics_prompt_stop" = "Parar de compartilhar";
|
||||
"analytics_prompt_yes" = "Sim, pode ser";
|
||||
"analytics_prompt_not_now" = "Não agora";
|
||||
"analytics_prompt_point_3" = "Você pode desativar isto a qualquer hora em configurações";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "Nós <b>não</b> compartilhamos informação com terceiros";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "Nós <b>não</b> gravamos ou perfilamos quaisquer dados de conta";
|
||||
"analytics_prompt_terms_link_upgrade" = "aqui";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "Leia todos os nossos termos %@. Isso está OK?";
|
||||
"analytics_prompt_terms_link_new_user" = "aqui";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "Você pode ler todos os nossos termos %@.";
|
||||
"analytics_prompt_message_upgrade" = "Você previamente consentiu a compartilhar dados de uso anônimos conosco. Agora, para ajudar a entender como pessoas usam múltiplos dispositivos, nós vamos gerar um identificador aleatório, compartilhado por seus dispositivos.";
|
||||
"analytics_prompt_message_new_user" = "Ajude-nos a identificar problemas e melhorar Element ao compartilhar dados de uso anônimos. Para entender como pessoas usam múltiplos dispositivos, nós geramos um identificador aleatório, compartilhado por seus dispositivos.";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Ajudar a melhorar %@";
|
||||
"settings_analytics_and_crash_data" = "Enviar dados de crash e analítica";
|
||||
"accessibility_button_label" = "botão";
|
||||
"enable" = "Habilitar";
|
||||
|
||||
@@ -75,3 +75,93 @@
|
||||
/** General **/
|
||||
|
||||
"NOTIFICATION" = "Oznámenia";
|
||||
|
||||
/* New message from a specific person in a named room */
|
||||
"MSG_FROM_USER_IN_ROOM" = "%@ napísal v %@";
|
||||
|
||||
/** Key verification **/
|
||||
|
||||
"KEY_VERIFICATION_REQUEST_FROM_USER" = "%@ žiada o overenie";
|
||||
|
||||
/* Group call from user, CallKit caller name */
|
||||
"GROUP_CALL_FROM_USER" = "%@ (Skupinový hovor)";
|
||||
|
||||
/* A user added a Jitsi call to a room */
|
||||
"GROUP_CALL_STARTED" = "Začal sa skupinový hovor";
|
||||
|
||||
/* Incoming named video conference invite from a specific person */
|
||||
"VIDEO_CONF_NAMED_FROM_USER" = "Skupinový videohovor od používateľa %@: '%@'";
|
||||
|
||||
/* Incoming named voice conference invite from a specific person */
|
||||
"VOICE_CONF_NAMED_FROM_USER" = "Skupinový hovor od používateľa %@: '%@'";
|
||||
|
||||
/* Incoming unnamed video conference invite from a specific person */
|
||||
"VIDEO_CONF_FROM_USER" = "Skupinový videohovor od používateľa %@";
|
||||
|
||||
/* Incoming unnamed voice conference invite from a specific person */
|
||||
"VOICE_CONF_FROM_USER" = "Skupinový hovor od používateľa %@";
|
||||
|
||||
/** Calls **/
|
||||
|
||||
/* Incoming one-to-one voice call */
|
||||
"VOICE_CALL_FROM_USER" = "Hovor od používateľa %@";
|
||||
|
||||
/* Incoming one-to-one video call */
|
||||
"VIDEO_CALL_FROM_USER" = "Videohovor od používateľa %@";
|
||||
|
||||
/* A user's membership has updated in an unknown way */
|
||||
"USER_MEMBERSHIP_UPDATED" = "%@ aktualizoval/a svoj profil";
|
||||
|
||||
/* A user has change their avatar */
|
||||
"USER_UPDATED_AVATAR" = "%@ zmenil/a svoj obrázok";
|
||||
|
||||
/* A user has change their name to a new name which we don't know */
|
||||
"GENERIC_USER_UPDATED_DISPLAYNAME" = "%@ zmenil/a svoje meno";
|
||||
|
||||
/** Membership Updates **/
|
||||
|
||||
/* A user has change their name to a new name */
|
||||
"USER_UPDATED_DISPLAYNAME" = "%@ zmenil/a svoje meno na %@";
|
||||
|
||||
/* A user has invited you to a named room */
|
||||
"USER_INVITE_TO_NAMED_ROOM" = "%@ vás pozval/a do %@";
|
||||
|
||||
/* A user has invited you to an (unamed) group chat */
|
||||
"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ vás pozval/a na skupinovú konverzáciu";
|
||||
|
||||
/** Invites **/
|
||||
|
||||
/* A user has invited you to a chat */
|
||||
"USER_INVITE_TO_CHAT" = "%@ vás pozval/a na konverzáciu";
|
||||
|
||||
/* A user has reacted to a message, but the reaction content is unknown */
|
||||
"GENERIC_REACTION_FROM_USER" = "%@ poslal/a reakciu";
|
||||
|
||||
/** Reactions **/
|
||||
|
||||
/* A user has reacted to a message, including the reaction e.g. "Alice reacted 👍". */
|
||||
"REACTION_FROM_USER" = "%@ reagoval/a %@";
|
||||
|
||||
/* Look, stuff's happened, alright? Just open the app. */
|
||||
"MSGS_IN_TWO_PLUS_ROOMS" = "%@ nových správ v %@, %@ a ďalších";
|
||||
|
||||
/* Multiple messages in two rooms */
|
||||
"MSGS_IN_TWO_ROOMS" = "%@ nových správ v %@ a %@";
|
||||
|
||||
/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */
|
||||
"MSGS_FROM_TWO_PLUS_USERS" = "%@ nových správ od %@, %@ a ďalších";
|
||||
|
||||
/* Sticker from a specific person, not referencing a room. */
|
||||
"STICKER_FROM_USER" = "%@ poslal/a nálepku";
|
||||
|
||||
/* New file message from a specific person, not referencing a room. */
|
||||
"FILE_FROM_USER" = "%@ poslal/a súbor %@";
|
||||
|
||||
/* New voice message from a specific person, not referencing a room. */
|
||||
"VOICE_MESSAGE_FROM_USER" = "%@ poslal/a zvukovú správu";
|
||||
|
||||
/* New audio message from a specific person, not referencing a room. */
|
||||
"AUDIO_FROM_USER" = "%@ poslal/a zvukový súbor %@";
|
||||
|
||||
/* New message reply from a specific person in a named room. */
|
||||
"REPLY_FROM_USER_IN_ROOM_TITLE" = "%@ odpovedal/a v %@";
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
"settings_ignored_users" = "PËRDORUES TË SHPËRFILLUR";
|
||||
"settings_contacts" = "KONTAKTE PAJISJEJE";
|
||||
"settings_advanced" = "TË MËTEJSHME";
|
||||
"settings_other" = "TË TJERA";
|
||||
"settings_other" = "Tjetër";
|
||||
"settings_devices" = "SESIONE";
|
||||
"settings_cryptography" = "KRIPTOGRAFI";
|
||||
"settings_sign_out" = "Dilni";
|
||||
@@ -1519,3 +1519,63 @@
|
||||
"contacts_address_book_permission_denied_alert_message" = "Që të aktivizoni kontakte, kaloni te rregullimet e pajisjes tua.";
|
||||
"contacts_address_book_permission_denied_alert_title" = "Kontaktet u çaktivizuan";
|
||||
"space_home_show_all_rooms" = "Shfaqi krejt dhomat";
|
||||
"poll_timeline_not_closed_action" = "OK";
|
||||
"poll_timeline_not_closed_subtitle" = "Ju lutemi, riprovoni";
|
||||
"poll_timeline_not_closed_title" = "S’u arrit të përfundohej pyetësori";
|
||||
"poll_timeline_vote_not_registered_action" = "OK";
|
||||
"poll_timeline_vote_not_registered_subtitle" = "Na ndjeni, vota juaj s’u regjistrua, ju lutemi, riprovoni";
|
||||
"poll_timeline_vote_not_registered_title" = "Votë e paregjistruar";
|
||||
"poll_timeline_total_final_results" = "Rezultati përfundimtar, bazua në %lu votë";
|
||||
"poll_timeline_total_final_results_one_vote" = "Rezultati përfundimtar, bazua në 1 votë";
|
||||
"poll_timeline_total_votes_not_voted" = "%lu vota të hedhura. Që të shihni përfundimet, votoni";
|
||||
"poll_timeline_total_one_vote_not_voted" = "1 votë e hedhur. Që të shihni përfundimet, votoni";
|
||||
"poll_timeline_total_votes" = "%lu vota të hedhura";
|
||||
"poll_timeline_total_one_vote" = "1 votë e hedhur";
|
||||
"poll_timeline_total_no_votes" = "S’u votua gjë";
|
||||
"poll_timeline_votes_count" = "%lu vota";
|
||||
"poll_timeline_one_vote" = "1 votë";
|
||||
"poll_edit_form_post_failure_action" = "OK";
|
||||
"poll_edit_form_post_failure_subtitle" = "Ju lutemi, riprovoni";
|
||||
"poll_edit_form_post_failure_title" = "S’u arrit të postohej anketimi";
|
||||
"poll_edit_form_add_option" = "Shtoni mundësi";
|
||||
"poll_edit_form_option_number" = "Mundësia %lu";
|
||||
"poll_edit_form_create_options" = "Krijo mundësi";
|
||||
"poll_edit_form_input_placeholder" = "Shkruani diçka!";
|
||||
"poll_edit_form_question_or_topic" = "Pyetje ose temë";
|
||||
"poll_edit_form_poll_question_or_topic" = "Pyetje ose temë pyetësori";
|
||||
|
||||
// Mark: - Polls
|
||||
|
||||
"poll_edit_form_create_poll" = "Krijoni anketim";
|
||||
"share_extension_send_now" = "Dërgoje tani";
|
||||
"share_extension_low_quality_video_message" = "Dërgojeni në %@. për cilësi më të mirë, ose dërgojeni në cilësi të ulët si më poshtë.";
|
||||
"share_extension_low_quality_video_title" = "Videoja do të dërgohet në cilësi të ulët";
|
||||
"analytics_prompt_stop" = "Resht së ndari";
|
||||
"analytics_prompt_yes" = "Po, s’ka problem";
|
||||
"analytics_prompt_not_now" = "Jo tani";
|
||||
"analytics_prompt_point_3" = "Këtë mund të çaktivizoni në çfarëdo kohe, që nga rregullimet";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "<b>Nuk</b> u japin hollësi palëve të treta";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "<b>Nuk</b> regjistrojmë ose profilizojmë ndonjë të dhënë llogarie";
|
||||
"analytics_prompt_terms_link_upgrade" = "këtu";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "Lexoni krejt kushtet tona %@. Në rregull?";
|
||||
"analytics_prompt_terms_link_new_user" = "këtu";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "Mund të lexoni krejt kushtet tona %@.";
|
||||
"analytics_prompt_message_upgrade" = "Keni pranuar më herët të ndani me ne të dhëna anonime përdorimi. Tani, që të na ndihmoni të kuptojmë se si njerëzit përdorin pajisje të shumta, do të prodhojmë një identifikues kuturu, të përbashkët për pajisjet tuaja.";
|
||||
"analytics_prompt_message_new_user" = "Ndihmonani të identifikojmë probleme dhe të përmirësojmë Element-in, duke ndarë me ne të dhëna anonime përdorimi. Për të kuptuar se si i përdorin njerëzit disa pajisje njëherësh, do të prodhojmë një identifikues kuturu, të përbashkët për pajisjet tuaja.";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Ndihmoni të përmirësohet %@";
|
||||
"settings_discovery_accept_terms" = "Pranoni Kushte Shërbyesi Identitetesh";
|
||||
"settings_analytics_and_crash_data" = "Dërgoni të dhëna vithisjesh dhe analitike";
|
||||
"settings_labs_enabled_polls" = "Pyetësorë";
|
||||
"settings_about" = "MBI";
|
||||
"room_event_action_forward" = "Përpara";
|
||||
"room_event_action_end_poll" = "Përfundoje pyetësorin";
|
||||
"room_event_action_remove_poll" = "Hiqe pyetësorin";
|
||||
"accessibility_button_label" = "kopsë";
|
||||
"open" = "Hapur";
|
||||
"enable" = "Aktivizoje";
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
"room_participants_leave_prompt_msg_for_dm" = "Ви впевнені, що хочете вийти?";
|
||||
"room_participants_leave_prompt_title_for_dm" = "Вийти";
|
||||
"client_android_name" = "Element Android";
|
||||
"store_promotional_text" = "Застосунок для бесід та співпраці, що зберігає приватність у відкритій мережі. Децентралізований, щоб надати вам контроль над даними. Без обробки даних, без бекдорів, без доступу для третіх сторін.";
|
||||
"store_promotional_text" = "Застосунок для спілкування та співпраці, що зберігає приватність у відкритій мережі. Децентралізований, щоб надати вам контроль над даними. Без обробки даних, без бекдорів, без доступу для третіх сторін.";
|
||||
"settings_three_pids_management_information_part3" = ".";
|
||||
"settings_three_pids_management_information_part1" = "Керуйте звідси адресами е-пошти чи номерами телефонів, які можна застосовувати для входу або відновлення облікового запису. Контролюйте хто і як може вас знайти ";
|
||||
"contacts_address_book_no_identity_server" = "Сервер ідентифікації не налаштований";
|
||||
@@ -388,7 +388,7 @@
|
||||
"settings_identity_server_settings" = "СЕРВЕР ІДЕНТИФІКАЦІЇ";
|
||||
"settings_calls_settings" = "ВИКЛИКИ";
|
||||
"settings_notifications" = "СПОВІЩЕННЯ";
|
||||
"settings_user_settings" = "НАЛАШТУВАННЯ КОРИСТУВАЧА";
|
||||
"settings_user_settings" = "КОРИСТУВАЦЬКІ НАЛАШТУВАННЯ";
|
||||
"event_formatter_call_connecting" = "З'єднання…";
|
||||
"settings_config_identity_server" = "Сервер ідентифікації %@";
|
||||
"settings_config_home_server" = "Домашній сервер %@";
|
||||
@@ -408,7 +408,7 @@
|
||||
|
||||
// Bug report
|
||||
"bug_report_title" = "Звіт про ваду";
|
||||
"e2e_key_backup_wrong_version_button_wasme" = "Це був я";
|
||||
"e2e_key_backup_wrong_version_button_wasme" = "Це я";
|
||||
"e2e_key_backup_wrong_version_button_settings" = "Налаштування";
|
||||
"settings_privacy_policy" = "Політика приватності";
|
||||
"settings_term_conditions" = "Умови та положення";
|
||||
@@ -433,7 +433,7 @@
|
||||
"room_widget_permission_theme_permission" = "Ваша тема";
|
||||
"room_widget_permission_user_id_permission" = "Ваш ID користувача";
|
||||
"room_widget_permission_avatar_url_permission" = "URL-адреса вашого аватара";
|
||||
"room_widget_permission_display_name_permission" = "Ваше показуване ім'я";
|
||||
"room_widget_permission_display_name_permission" = "Ваше показуване імʼя";
|
||||
"room_widget_permission_creator_info_title" = "Цей віджет додано:";
|
||||
|
||||
// Room widget permissions
|
||||
@@ -591,7 +591,7 @@
|
||||
|
||||
"user_avatar_view_accessibility_label" = "аватар";
|
||||
"room_intro_cell_information_dm_sentence1_part3" = ". ";
|
||||
"room_intro_cell_information_room_without_topic_sentence2_part1" = "Додати тему";
|
||||
"room_intro_cell_information_room_without_topic_sentence2_part1" = "Додайте тему,";
|
||||
"room_intro_cell_information_room_with_topic_sentence2" = "Тема: %@";
|
||||
"room_intro_cell_information_room_sentence1_part3" = ". ";
|
||||
"room_intro_cell_information_room_sentence1_part1" = "Це початок ";
|
||||
@@ -1002,7 +1002,7 @@
|
||||
// Room key request dialog
|
||||
"e2e_room_key_request_title" = "Запит ключів шифрування";
|
||||
"share_extension_send_now" = "Надіслати зараз";
|
||||
"service_terms_modal_accept_button" = "Прийняти";
|
||||
"service_terms_modal_accept_button" = "Погодитися";
|
||||
"room_details_flair_invalid_id_prompt_msg" = "%@ — неправильний ідентифікатор спільноти";
|
||||
"room_details_flair_invalid_id_prompt_title" = "Неправильний формат";
|
||||
"room_details_new_flair_placeholder" = "Додати новий ID спільноти (напр., +foo%@)";
|
||||
@@ -1022,3 +1022,683 @@
|
||||
"room_details_history_section_members_only" = "Лише учасники (від часу вибору цієї опції)";
|
||||
"room_details_history_section_anyone" = "Будь-хто";
|
||||
"room_details_history_section" = "Хто може переглядати історію?";
|
||||
"identity_server_settings_alert_disconnect" = "Від'єднатися від сервера ідентифікації %@?";
|
||||
"identity_server_settings_alert_disconnect_title" = "Від'єднатися від сервера ідентифікації";
|
||||
"identity_server_settings_alert_change" = "Від'єднатися від сервера ідентифікації %1$@ й натомість під'єднатися до %2$@?";
|
||||
"identity_server_settings_alert_change_title" = "Змінити сервер ідентифікації";
|
||||
"identity_server_settings_alert_no_terms" = "Обраний вами сервер ідентифікації не має жодних умов використання. Продовжуйте лише якщо довіряєте власнику сервісу.";
|
||||
"identity_server_settings_alert_no_terms_title" = "Сервер ідентифікації не має умов використання";
|
||||
"identity_server_settings_disconnect_info" = "Після від'єднання від сервера ідентифікації вас більше не зможуть знаходити інші користувачі, а ви не зможете запрошувати інших за е-поштою чи телефоном.";
|
||||
"identity_server_settings_no_is_description" = "Зараз ви не використовуєте сервер ідентифікації. Щоб знаходити наявні контакти й вони знаходили вас, додайте сервер угорі.";
|
||||
"identity_server_settings_description" = "Ви користуєтесь %@, щоб знаходити людей за наявними контактами й вони знаходили вас.";
|
||||
|
||||
// AuthenticatedSessionViewControllerFactory
|
||||
"authenticated_session_flow_not_supported" = "Цей застосунок не підтримує способу входу, доступного на вашому домашньому сервері.";
|
||||
"security_settings_user_password_description" = "Підтвердьте свою особу, ввівши пароль свого облікового запису";
|
||||
"security_settings_coming_soon" = "Вибачте, ця дія ще не доступна в %@ iOS. Якщо налаштуєте це іншим клієнтом Matrix, %@ iOS зможе також це використати.";
|
||||
"security_settings_complete_security_alert_message" = "Спершу слід доповнити захист вашого поточного сеансу.";
|
||||
"security_settings_blacklist_unverified_devices_description" = "Звірте всі сеанси користувача, щоб позначити його довіреним і надіслати йому повідомлення.";
|
||||
"security_settings_crosssigning_bootstrap" = "Налаштувати";
|
||||
"security_settings_crosssigning_info_ok" = "Перехресне підписування готове до використання.";
|
||||
"security_settings_crosssigning_info_trusted" = "Перехресне підписування увімкнено. Ви можете робити інших користувачів і свої інші сеанси довіреними на підставі перехресного підпису, але ви не можете перехресно підписувати цим сеансом, бо в нього ще нема закритих ключів перехресного підписування. Доповніть захист цього сеансу.";
|
||||
"security_settings_crosssigning_info_exists" = "Ваш обліковий запис має ідентичність перехресного підписування, але вона ще не довірена цим сеансом. Доповніть захист цього сеансу.";
|
||||
"security_settings_secure_backup_description" = "Зробіть резервну копію своїх ключів шифрування й даних облікового запису на випадок втрати доступу до своїх сеансів. Ваші ключі будуть захищені унікальним ключем безпеки.";
|
||||
"security_settings_crypto_sessions_description_2" = "Якщо не впізнаєте вхід, скиньте пароль і налаштування безпечного резервного копіювання.";
|
||||
"settings_identity_server_no_is_description" = "Зараз ви не використовуєте сервер ідентифікації. Щоб знаходити наявні контакти й вони знаходили вас, додайте сервер угорі.";
|
||||
"settings_identity_server_description" = "Налаштований угорі сервер ідентифікації дає вам змогу знаходити людей за наявними контактами, а їм знаходити вас.";
|
||||
"settings_discovery_three_pid_details_information_phone_number" = "Керуйте параметрами для цього номера телефону, за яким інші користувачі можуть вас знаходити й запрошувати до кімнат. Додавайте й видаляйте номери в Облікових записах.";
|
||||
"settings_discovery_three_pid_details_information_email" = "Керуйте параметрами для цієї адреси е-пошти, за якою інші користувачі можуть вас знаходити й запрошувати до кімнат. Додавайте й видаляйте адреси в Облікових записах.";
|
||||
"settings_discovery_three_pids_management_information_part1" = "Керуйте, за якими адресами е-пошти й номерами телефону інші користувачі зможуть вас знаходити й запрошувати до кімнат. Щоб додати адреси й номери в цей список чи вилучити наявні, перейдіть у ";
|
||||
"settings_discovery_no_identity_server" = "Зараз ви не використовуєте сервер ідентифікації. Щоб наявні контакти могли вас знаходити, додайте такий сервер.";
|
||||
"settings_key_backup_info_not_valid" = "Цей сеанс не створює резервної копії ваших ключів, але у вас уже є резервна копія, яку ви можете відновити й додати у майбутньому.";
|
||||
"settings_key_backup_info_version" = "Версія резервного копіювання ключів: %@";
|
||||
"settings_labs_message_reaction" = "Реагувати на повідомлення за допомогою емодзі";
|
||||
"settings_contacts_enable_sync_description" = "Це використовуватиме ваш сервер ідентифікації, щоб ви знаходили свої контакти, а вони вас.";
|
||||
"settings_integrations_allow_description" = "Використовуйте менеджер інтеграцій (%@), щоб керувати ботами, мостами, віджетами й пакунками наліпок.\n\nМенеджери інтеграцій отримують ваші параметри й можуть змінювати віджети, надсилати запрошення до кімнат і надавати повноваження від вашого імені.";
|
||||
"settings_calls_stun_server_fallback_description" = "Дозволити допоміжний сервер викликів %@, коли ваш домашній сервер не надає свого (ваша IP-адреса ставатиме відомою при виклику).";
|
||||
"settings_callkit_info" = "Отримувати вхідні виклики, не розблоковуючи екран. Перегляньте свої виклики (%@) в історії викликів системи. Якщо iCloud увімкнено, ця історія викликів надсилатиметься Apple.";
|
||||
"settings_confirm_media_size_description" = "Коли це ввімкнено, при надсиланні зображень чи відео вам пропонуватиметься підтвердити їхній розмір.";
|
||||
"settings_three_pids_management_information_part2" = "Знаходження";
|
||||
"settings_config_user_id" = "Ви ввійшли як %@";
|
||||
"unknown_devices_alert" = "Кімната містить сеанси, які досі не пройшли звірку.\nТобто нема гарантії, що ці сеанси належать користувачам, від імені яких вони створені.\nРадимо звірити кожен сеанс, перш ніж продовжити; але за потреби можете повторити надсилання повідомлення без звірки.";
|
||||
"room_action_camera" = "Зробити світлину або відео";
|
||||
"room_ongoing_conference_call_with_close" = "Відбувається конференц-виклик. Приєднатись як %1$s чи %2$s. %@ його.";
|
||||
"room_member_power_level_short_custom" = "Інше";
|
||||
"room_member_power_level_custom_in" = "Інше (%@) у %@";
|
||||
"room_participants_start_new_chat_error_using_user_email_without_identity_server" = "Поки жоден сервер ідентифікації не налаштований, ви не можете почати бесіду з кимось за адресою е-пошти.";
|
||||
"find_your_contacts_message" = "Дозвольте %@ показувати ваші контакти, щоб ви могли швидко почати бесіду з тими, кого знаєте найкраще.";
|
||||
"find_your_contacts_title" = "Почніть із переліку своїх контактів";
|
||||
"store_full_description" = "Element — застосунок для листування й співпраці нового покоління:\n\n1. Надає вам контроль над збереженням вашої приватності\n2. Дає змогу спілкуватися з будь-ким у мережі Matrix і навіть за її межами, інтегруючись із такими застосунками, як Slack\n3. Оберігає вас від реклами, збору даних, бекдорів і прив'язаності до провайдера\n4. Захищає вас наскрізним шифруванням і звіркою інших перехресним підписуванням\n\nElement суттєво відрізняється від інших застосунків для листування й співпраці тим, що децентралізований і має відкритий код.\n\nElement дає змогу самостійно встановити сервер або обрати з-поміж загальнодоступних, щоб ви зберігали приватність своїх даних і розмов, власність і контроль над ними. Він надає вам доступ до відкритої мережі; тож ви можете спілкуватися з користувачами інших застосунків, не лише Element. А ще він добре захищений.\n\nElement здатен на це все завдяки своїй основі Matrix — стандарту відкритого, децентралізованого спілкування.\n\nElement надає вам контроль, даючи змогу обрати, в кого зберігаються ваші розмови. У застосунку Element ви можете обрати між такими шляхами:\n\n1. Зареєструвати безплатний обліковий запис на загальнодоступному сервері matrix.org\n2. Самостійно розмістити свій обліковий запис, встановивши сервер на власному обладнанні\n3. Отримати обліковий запис на виділеному сервері, просто передплативши хостинг-платформу Element Matrix Services\n\nЧому Element?\n\nВОЛОДІЙТЕ СВОЇМИ ДАНИМИ: Ви обираєте, де зберігати свої дані й повідомлення. Ви володієте й керуєте ними, не якась МЕГАКОРПОРАЦІЯ, що аналізує ваші дані й передає їх стороннім особам.\n\nВІДКРИТЕ ЛИСТУВАННЯ Й СПІВПРАЦЯ: Можете розмовляти з будь-ким іншим у мережі Matrix незалежно від того, використовують вони Element, інший застосунок Matrix чи навіть сторонню систему листування на зразок Slack, IRC чи XMPP.\n\nНАДБЕЗПЕКА: Справжнє наскрізне шифрування (лише учасники розмови можуть розшифрувати повідомлення) й звірка пристроїв учасників розмови перехресним підписуванням.\n\nДОСКОНАЛЕ СПІЛКУВАННЯ: Листуйтеся, робіть голосові й відеовиклики, діліться файлами, транслюйте екран, підʼєднуйте різноманітні інтеграції, ботів і віджети. Розбудовуйте кімнати, спільноти, будьте на звʼязку й досягайте цілей.\n\nСКРІЗЬ, ДЕ ВИ: Будьте на зв'язку, де б ви не були, завдяки повній синхронізації історії повідомлень між усіма вашим пристроями та онлайн-клієнтом https://app.element.io.";
|
||||
"security_settings_crosssigning_info_not_bootstrapped" = "Перехресне підписування ще не налаштовано.";
|
||||
"security_settings_crosssigning" = "ПЕРЕХРЕСНЕ ПІДПИСУВАННЯ";
|
||||
"security_settings_backup" = "РЕЗЕРВНЕ КОПІЮВАННЯ ПОВІДОМЛЕНЬ";
|
||||
"security_settings_secure_backup_restore" = "Відновити з резервної копії";
|
||||
"key_verification_manually_verify_device_key_title" = "Ключ сеансу";
|
||||
"key_verification_manually_verify_device_id_title" = "ID сеансу";
|
||||
"identity_server_settings_alert_error_invalid_identity_server" = "%@ не дійсний сервер ідентифікації.";
|
||||
"identity_server_settings_alert_error_terms_not_accepted" = "Ви повинні погодитися з умовами %@, щоб налаштувати сервер ідентифікації.";
|
||||
"identity_server_settings_alert_disconnect_still_sharing_3pid_button" = "Усе одно відʼєднати";
|
||||
"identity_server_settings_alert_disconnect_button" = "Відʼєднати";
|
||||
"identity_server_settings_disconnect" = "Відʼєднати";
|
||||
"identity_server_settings_change" = "Змінити";
|
||||
"identity_server_settings_add" = "Додати";
|
||||
"identity_server_settings_place_holder" = "Введіть сервер ідентифікації";
|
||||
|
||||
// Identity server settings
|
||||
"identity_server_settings_title" = "Сервер ідентифікації";
|
||||
"manage_session_sign_out" = "Вийти з цього сеансу";
|
||||
"manage_session_not_trusted" = "Не довірені";
|
||||
"manage_session_trusted" = "Довірені вами";
|
||||
"key_verification_manually_verify_device_name_title" = "Назва сеансу";
|
||||
"manage_session_name" = "Назва сеансу";
|
||||
"manage_session_info" = "ВІДОМОСТІ ПРО СЕАНС";
|
||||
|
||||
// Manage session
|
||||
"manage_session_title" = "Керувати сеансом";
|
||||
"security_settings_complete_security_alert_title" = "Завершити налаштування безпеки";
|
||||
"user_verification_session_details_verify_action_current_user" = "Інтерактивна перевірка";
|
||||
"secrets_recovery_reset_action_part_2" = "Скинути все";
|
||||
|
||||
// MARK: - Secrets reset
|
||||
|
||||
"secrets_reset_title" = "Скинути все";
|
||||
"cross_signing_setup_banner_subtitle" = "Спростіть перевірку інших своїх пристроїв";
|
||||
|
||||
// MARK: - Cross-signing
|
||||
|
||||
// Banner
|
||||
|
||||
"cross_signing_setup_banner_title" = "Налаштування шифрування";
|
||||
"secrets_reset_authentication_message" = "Введіть пароль свого облікового запису, щоб продовжити";
|
||||
"security_settings_blacklist_unverified_devices" = "Ніколи не надсилати повідомлення не довіреним сеансам";
|
||||
"security_settings_advanced" = "ДОДАТКОВО";
|
||||
"security_settings_export_keys_manually" = "Експорт ключів вручну";
|
||||
"security_settings_cryptography" = "КРИПТОГРАФІЯ";
|
||||
"security_settings_crosssigning_complete_security" = "Завершити налаштування безпеки";
|
||||
"security_settings_crosssigning_reset" = "Скинути";
|
||||
"secrets_reset_reset_action" = "Скинути";
|
||||
"security_settings_secure_backup_reset" = "Скинути";
|
||||
"settings_show_NSFW_public_rooms" = "Показувати загальнодоступні кімнати з делікатним вмістом";
|
||||
"settings_identity_server_no_is" = "Сервер ідентифікації не налаштований";
|
||||
"settings_discovery_three_pid_details_enter_sms_code_action" = "Введіть код активації з СМС";
|
||||
"settings_discovery_three_pid_details_cancel_email_validation_action" = "Скасувати перевірку е-пошти";
|
||||
"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_send_crash_report" = "Надсилати анонімні дані про збої та користування";
|
||||
"settings_show_url_previews_description" = "Попередній перегляд виконується лише у кімнатах без шифрування.";
|
||||
"settings_show_url_previews" = "Попередній перегляд вебсайтів";
|
||||
"settings_ui_theme_picker_message_match_system_theme" = "«Авто» застосовує тему вашого пристрою";
|
||||
"settings_ui_theme_picker_message_invert_colours" = "«Авто» застосовує налаштування вашого пристрою «Інвертувати кольори»";
|
||||
"settings_messages_containing_display_name" = "Моє показуване імʼя";
|
||||
"settings_discovery_three_pid_details_title_phone_number" = "Керувати номером телефону";
|
||||
"settings_discovery_three_pid_details_title_email" = "Керувати е-поштою";
|
||||
"settings_discovery_error_message" = "Сталася помилка. Повторіть спробу.";
|
||||
"settings_discovery_three_pids_management_information_part2" = "Користувацькі налаштування";
|
||||
"settings_discovery_accept_terms" = "Погодитися з умовами використання сервера ідентифікації";
|
||||
"settings_discovery_terms_not_signed" = "Погодьтеся з умовами використання сервера ідентифікації (%@), щоб дозволити вашу виявність за електронною адресою та номером телефону.";
|
||||
"settings_key_backup_delete_confirmation_prompt_msg" = "Ви впевнені? Ви втратите ваші зашифровані повідомлення якщо копія ключів не була створена коректно.";
|
||||
"settings_key_backup_delete_confirmation_prompt_title" = "Видалити резервну копію";
|
||||
"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_valid" = "Резервна копія має чинний підпис цього сеансу";
|
||||
"settings_key_backup_info_trust_signature_unknown" = "Резервна копія містить підпис невідомого сеансу з ID: %@";
|
||||
"settings_key_backup_info_progress_done" = "Резервні копії всіх ключів створено";
|
||||
"settings_key_backup_info_progress" = "Резервне копіювання %@ ключів…";
|
||||
"security_settings_secure_backup_info_valid" = "Цей сеанс створює резервну копію ваших ключів.";
|
||||
"settings_key_backup_info_valid" = "Цей сеанс створює резервну копію ваших ключів.";
|
||||
"settings_key_backup_info_signout_warning" = "Створіть резервну копію ключів перед виходом, щоб не втратити їх.";
|
||||
"settings_key_backup_info_none" = "Для цього сеансу не створюється резервна копія ваших ключів.";
|
||||
"security_settings_secure_backup_info_checking" = "Перевірка…";
|
||||
"settings_key_backup_info_checking" = "Перевірка…";
|
||||
"settings_key_backup_info" = "Зашифровані повідомлення захищені наскрізним шифруванням. Лише ви та отримувачі повідомлень мають ключі для їх читання.";
|
||||
"settings_deactivate_my_account" = "Деактивувати обліковий запис";
|
||||
"settings_enable_rageshake" = "Струснути пристрій, щоб повідомити про ваду";
|
||||
"settings_third_party_notices" = "Примітки третіх сторін";
|
||||
"settings_labs_enable_ringing_for_group_calls" = "Дзвінок групових викликів";
|
||||
"settings_labs_enabled_polls" = "Опитування";
|
||||
"settings_labs_create_conference_with_jitsi" = "Створити конференц-виклик за допомогою jitsi";
|
||||
"settings_labs_e2e_encryption_prompt_message" = "Щоб завершити налаштування шифрування вам потрібно повторно увійти.";
|
||||
"settings_labs_e2e_encryption" = "Наскрізне шифрування";
|
||||
"settings_unignore_user" = "Показати всі повідомлення від %@?";
|
||||
"settings_ui_theme_picker_title" = "Вибрати тему";
|
||||
"settings_ui_theme_black" = "Чорна";
|
||||
"settings_ui_theme_dark" = "Темна";
|
||||
"settings_ui_theme_light" = "Світла";
|
||||
"settings_ui_theme_auto" = "Авто";
|
||||
"settings_ui_theme" = "Тема";
|
||||
"settings_ui_language" = "Мова";
|
||||
"settings_integrations_allow_button" = "Керування інтеграціями";
|
||||
"settings_calls_stun_server_fallback_button" = "Дозволити допоміжний сервер викликів";
|
||||
"settings_enable_callkit" = "Інтегрований виклик";
|
||||
"settings_new_keyword" = "Додати нове ключове слово";
|
||||
"settings_your_keywords" = "Ваші ключові слова";
|
||||
"settings_room_upgrades" = "Поліпшення кімнати";
|
||||
"settings_messages_by_a_bot" = "Повідомлення бота";
|
||||
"settings_call_invitations" = "Запрошення до виклику";
|
||||
"settings_room_invitations" = "Запрошення до кімнати";
|
||||
"settings_messages_containing_keywords" = "Ключові слова";
|
||||
"settings_messages_containing_user_name" = "Моє користувацьке імʼя";
|
||||
"settings_messages_containing_at_room" = "@room";
|
||||
"settings_encrypted_group_messages" = "Зашифровані групові повідомлення";
|
||||
"settings_group_messages" = "Групові повідомлення";
|
||||
"settings_other" = "Інше";
|
||||
"settings_mentions_and_keywords" = "Згадки та ключові слова";
|
||||
"settings_pin_rooms_with_unread" = "Закріплювати кімнати з новими повідомленнями";
|
||||
"settings_confirm_media_size" = "Підтверджувати розмір під час надсилання";
|
||||
"settings_discovery_settings" = "ВИЯВНІСТЬ";
|
||||
"room_preview_unlinked_email_warning" = "Запрошення надіслано на адресу %@, не повʼязану з цим обліковим записом. Ви можете увійти за допомогою іншого облікового запису або додати е-пошту до цього.";
|
||||
"unknown_devices_verify" = "Перевірка…";
|
||||
"room_message_edits_history_title" = "Редагування повідомлення";
|
||||
"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Цей домашній сервер досяг свого місячного обмеження активних користувачів, тож ";
|
||||
"room_resource_usage_limit_reached_message_1_default" = "Цей домашній сервер досягнув одного зі своїх лімітів ресурсів, тож ";
|
||||
"room_conference_call_no_power" = "Для керування конференц-викликами у цій кімнаті потрібен дозвіл";
|
||||
"room_ongoing_conference_call" = "Відбувається конференц-виклик. Приєднатись як %1$s чи %2$s.";
|
||||
"room_participants_security_information_room_encrypted_for_dm" = "Повідомлення тут захищені наскрізним шифруванням.\n\nВаші повідомлення захищені замками, тож лише ви та отримувач маєте унікальні ключі для їхнього відмикання.";
|
||||
"room_participants_security_information_room_encrypted" = "Повідомлення тут захищені наскрізним шифруванням.\n\nВаші повідомлення захищені замками, тож лише ви та отримувачі мають унікальні ключі для їхнього відмикання.";
|
||||
"room_participants_action_security_status_complete_security" = "Завершити налаштування безпеки";
|
||||
"room_participants_idle" = "Неактивний";
|
||||
"settings_labs" = "ЛАБОРАТОРІЯ";
|
||||
"settings_about" = "ПРО";
|
||||
"settings_advanced" = "ДОДАТКОВО";
|
||||
"settings_phone_contacts" = "КОНТАКТИ ТЕЛЕФОНА";
|
||||
"settings_links" = "ПОСИЛАННЯ";
|
||||
"settings_sending_media" = "НАДСИЛАННЯ ЗОБРАЖЕНЬ І ВІДЕО";
|
||||
"room_preview_try_join_an_unknown_room" = "Ви намагаєтесь отримати доступ до %@. Бажаєте приєднатися, щоб взяти участь в обговоренні?";
|
||||
"room_preview_subtitle" = "Це попередній перегляд кімнати. Ви в режимі лише читання.";
|
||||
|
||||
// Room Preview
|
||||
"room_preview_invitation_format" = "%s запрошує вас приєднатися до цієї кімнати";
|
||||
|
||||
// Unknown devices
|
||||
"unknown_devices_alert_title" = "Кімната містить невідомі сеанси";
|
||||
"external_link_confirmation_message" = "Посилання %@ спрямовує вас на інший сайт: %@.\n\nВи впевнені, що бажаєте продовжити?";
|
||||
"external_link_confirmation_title" = "Перевірте це посилання";
|
||||
"room_accessibility_hangup" = "Покласти слухавку";
|
||||
"room_resource_usage_limit_reached_message_contact_3" = " , щоб збільшити ліміт.";
|
||||
"room_resource_usage_limit_reached_message_2" = "деякі користувачі не зможуть увійти.";
|
||||
"room_resource_limit_exceeded_message_contact_3" = " , щоб продовжити користуватися цією службою.";
|
||||
"room_resource_limit_exceeded_message_contact_2_link" = "зв’яжіться з адміністратором вашого сервера";
|
||||
"room_predecessor_link" = "Торкніться тут, щоб переглянути давніші повідомлення.";
|
||||
"room_predecessor_information" = "Ця кімната — продовження спілкування в іншій кімнаті.";
|
||||
"room_replacement_link" = "Спілкування продовжується тут.";
|
||||
"room_replacement_information" = "Цю кімнату замінено й вона більше не активна.";
|
||||
"room_event_action_end_poll" = "Завершити опитування";
|
||||
"room_event_action_remove_poll" = "Вилучити опитування";
|
||||
"user_verification_session_details_information_trusted_current_user" = "Цей сеанс довірений для захищеного листування, бо ви звірили його:";
|
||||
"user_verification_session_details_information_trusted_other_user_part1" = "Цей сеанс довірений для захищеного листування, бо ";
|
||||
"user_verification_session_details_information_trusted_other_user_part2" = " звіряє його:";
|
||||
"user_verification_session_details_information_untrusted_other_user" = " входить у новому сеансі:";
|
||||
"user_verification_session_details_additional_information_untrusted_other_user" = "Надіслані цьому сеансу й цим сеансом повідомлення позначатимуться застереженнями, поки цей користувач йому не довірить. Або ви можете власноруч звірити сеанс.";
|
||||
"user_verification_session_details_additional_information_untrusted_current_user" = "Якщо ви не входили в цей сеанс, ваш обліковий запис може бути під загрозою.";
|
||||
"user_verification_session_details_verify_action_other_user" = "Звірити власноруч";
|
||||
"key_verification_bootstrap_not_setup_message" = "Спершу налаштуйте перехресне підписування.";
|
||||
"key_verification_verify_qr_code_information" = "Відскануйте код, щоб безпечно звірити одне одного.";
|
||||
"key_verification_verify_qr_code_scan_code_action" = "Сканувати їхній код";
|
||||
"key_verification_verify_qr_code_cannot_scan_action" = "Не вдалося сканувати?";
|
||||
"key_verification_verify_qr_code_other_scan_my_code_title" = "Чи зміг інший користувач відсканувати QR-код?";
|
||||
"key_verification_verify_qr_code_scan_other_code_success_title" = "Код підтверджено!";
|
||||
"key_verification_verify_qr_code_scan_other_code_success_message" = "QR-код успішно підтверджено.";
|
||||
|
||||
// MARK: Self verification start
|
||||
|
||||
// New login
|
||||
"device_verification_self_verify_alert_title" = "Новий вхід. Це були ви?";
|
||||
"device_verification_self_verify_alert_message" = "Звірте новий вхід до вашого облікового запису: %@";
|
||||
"device_verification_self_verify_start_information" = "Звірте цим сеансом свій новий. Це надасть йому доступ до зашифрованих повідомлень.";
|
||||
"device_verification_self_verify_start_waiting" = "Очікування…";
|
||||
|
||||
// MARK: Self verification wait
|
||||
|
||||
"device_verification_self_verify_wait_title" = "Доповніть безпеку";
|
||||
"device_verification_self_verify_wait_information" = "Звірте цей сеанс одним зі своїх інших, щоб надати йому доступ до зашифрованих повідомлень.\n\nВикористайте найостанніший %@ на своїх інших пристроях:";
|
||||
|
||||
// Recover from private key
|
||||
"key_backup_recover_from_private_key_info" = "Відновлення резервної копії…";
|
||||
|
||||
// MARK: Scan confirmation
|
||||
|
||||
// Scanning
|
||||
"key_verification_scan_confirmation_scanning_title" = "Майже все! Чекаємо на підтвердження…";
|
||||
"key_verification_scan_confirmation_scanning_user_waiting_other" = "Очікування на %@…";
|
||||
"key_verification_scan_confirmation_scanning_device_waiting_other" = "Очікування іншого пристрою…";
|
||||
|
||||
// Scanned
|
||||
"key_verification_scan_confirmation_scanned_title" = "Майже все!";
|
||||
"key_verification_scan_confirmation_scanned_user_information" = "Чи показує %@ такий же щит?";
|
||||
"key_verification_scan_confirmation_scanned_device_information" = "Чи показує інший пристрій такий же щит?";
|
||||
"device_verification_self_verify_wait_new_sign_in_title" = "Звірте цей вхід";
|
||||
"device_verification_self_verify_wait_additional_information" = "Це працює з %@ та іншими клієнтами Matrix, здатними на перехресне підписування.";
|
||||
|
||||
// MARK: - Device Verification
|
||||
"key_verification_other_session_title" = "Звірте сеанс";
|
||||
"key_verification_new_session_title" = "Звірте свій новий сеанс";
|
||||
"key_verification_this_session_title" = "Звірити цей сеанс";
|
||||
"device_verification_security_advice_emoji" = "Порівняйте унікальні емоджі, переконавшись, що їх показано в однаковому порядку.";
|
||||
"device_verification_security_advice_number" = "Порівняйте числа, переконавшись, що їх показано в однаковому порядку.";
|
||||
|
||||
// MARK: Verify
|
||||
|
||||
"key_verification_verify_sas_title_emoji" = "Порівняйте емодзі";
|
||||
"key_verification_verify_sas_title_number" = "Порівняйте числа";
|
||||
"key_verification_verify_sas_cancel_action" = "Вони не збігаються";
|
||||
"key_verification_verify_sas_validate_action" = "Вони збігаються";
|
||||
"key_verification_verify_sas_additional_information" = "Для більшої безпеки зв'яжіться іншим довіреним засобом чи особисто.";
|
||||
"key_verification_verify_qr_code_emoji_information" = "Звірити порівнянням унікальних емодзі.";
|
||||
"key_verification_verify_qr_code_start_emoji_action" = "Звірити за допомогою емодзі";
|
||||
"key_verification_verified_other_session_information" = "Тепер ви можете читати захищені повідомлення в своєму іншому сеансі, а інші користувачі знатимуть, що можуть йому довіряти.";
|
||||
"key_verification_verified_new_session_information" = "Тепер ви можете читати захищені повідомлення на своєму новому пристрої, а інші користувачі знатимуть, що можуть йому довіряти.";
|
||||
"key_verification_verified_this_session_information" = "Тепер ви можете читати захищені повідомлення на цьому пристрої, а інші користувачі знатимуть, що можуть йому довіряти.";
|
||||
|
||||
// User
|
||||
|
||||
"key_verification_verified_user_information" = "Листування з цим користувачем наскрізно зашифроване й непрочитне для сторонніх.";
|
||||
|
||||
// Current session
|
||||
|
||||
"key_verification_self_verify_current_session_alert_title" = "Звірити цей сеанс";
|
||||
"key_verification_self_verify_current_session_alert_message" = "Інші користувачі можуть йому не довіряти.";
|
||||
"key_verification_verify_qr_code_information_other_device" = "Відскануйте код знизу для звірки:";
|
||||
|
||||
// MARK: Manually Verify Device
|
||||
|
||||
"key_verification_manually_verify_device_title" = "Звірити власноруч за допомогою тексту";
|
||||
"key_verification_manually_verify_device_instruction" = "Підтвердьте шляхом порівняння наступного рядка з рядком у користувацьких налаштуваннях вашого іншого сеансу:";
|
||||
"key_verification_manually_verify_device_additional_information" = "Якщо вони відрізняються, безпека вашого зв'язку може бути під загрозою.";
|
||||
"user_verification_session_details_verify_action_current_user_manually" = "Звірити власноруч за допомогою тексту";
|
||||
"device_verification_self_verify_wait_recover_secrets_without_passphrase" = "Використати ключ безпеки";
|
||||
"device_verification_self_verify_wait_recover_secrets_with_passphrase" = "Використати фразу чи ключ безпеки";
|
||||
"device_verification_self_verify_wait_recover_secrets_additional_information" = "Якщо не маєте доступу до наявного сеансу";
|
||||
|
||||
// Recover with passphrase
|
||||
|
||||
"secrets_recovery_with_passphrase_title" = "Фраза безпеки";
|
||||
"secrets_recovery_with_passphrase_information_default" = "Отримайте доступ до своєї захищеної історії повідомлень та ідентичності перехресного підписування для звірки інших сеансів, увівши свою фразу безпеки.";
|
||||
"secrets_recovery_with_passphrase_information_verify_device" = "Підтвердьте цей пристрій своєю фразою безпеки.";
|
||||
"secrets_recovery_with_passphrase_passphrase_placeholder" = "Введіть фразу безпеки";
|
||||
"secrets_recovery_with_passphrase_recover_action" = "Використати фразу";
|
||||
"secrets_recovery_with_passphrase_lost_passphrase_action_part1" = "Забули свою фразу безпеки? Можете ";
|
||||
"secrets_recovery_with_passphrase_lost_passphrase_action_part2" = "використати ключ безпеки";
|
||||
"secrets_recovery_with_passphrase_invalid_passphrase_title" = "Не вдалося зайти до таємного сховища";
|
||||
"secrets_recovery_with_passphrase_invalid_passphrase_message" = "Переконайтеся, що вводите правильну фразу безпеки.";
|
||||
|
||||
// Recover with key
|
||||
|
||||
"secrets_recovery_with_key_title" = "Ключ безпеки";
|
||||
"secrets_recovery_with_key_information_default" = "Отримайте доступ до своєї захищеної історії повідомлень та ідентичності перехресного підписування для звірки інших сеансів, увівши свій ключ безпеки.";
|
||||
"secrets_recovery_with_key_information_verify_device" = "Підтвердьте цей пристрій своїм ключем безпеки.";
|
||||
"secrets_recovery_with_key_recovery_key_placeholder" = "Введіть ключ безпеки";
|
||||
"secrets_recovery_with_key_recover_action" = "Використати ключ";
|
||||
"secrets_recovery_with_key_invalid_recovery_key_title" = "Не вдалося зайти до таємного сховища";
|
||||
"secrets_recovery_with_key_invalid_recovery_key_message" = "Переконайтеся, що вводите правильний ключ безпеки.";
|
||||
"secure_key_backup_setup_intro_use_security_key_title" = "Використати ключ безпеки";
|
||||
"secure_key_backup_setup_intro_use_security_key_info" = "Згенерувати ключ безпеки для зберігання в надійному місці, наприклад у менеджері паролів чи сейфі.";
|
||||
"secure_key_backup_setup_intro_use_security_passphrase_title" = "Встановити фразу безпеки";
|
||||
"secure_key_backup_setup_intro_use_security_passphrase_info" = "Ввести таємну фразу, відому лише вам, і згенерувати ключ резервного копіювання.";
|
||||
|
||||
|
||||
// Cancel
|
||||
|
||||
"secure_key_backup_setup_cancel_alert_title" = "Ви впевнені?";
|
||||
"secure_key_backup_setup_cancel_alert_message" = "Якщо скасуєте це й загубите пристрій, то втратите зашифровані повідомлення й дані.\n\nВвімкнути захищене резервне копіювання й керувати своїми ключами можна в налаштуваннях.";
|
||||
|
||||
// MARK: - Secrets set up
|
||||
|
||||
// Recovery Key
|
||||
|
||||
"secrets_setup_recovery_key_title" = "Збережіть ключ безпеки";
|
||||
"secrets_setup_recovery_key_information" = "Зберігайте ключ безпеки в надійному місці. Ним можна буде розблокувати ваші зашифровані повідомлення й дані.";
|
||||
"secrets_setup_recovery_key_storage_alert_title" = "Зберігайте його у надійному місці";
|
||||
|
||||
// Recovery passphrase
|
||||
|
||||
"secrets_setup_recovery_passphrase_title" = "Встановіть фразу безпеки";
|
||||
"secrets_setup_recovery_passphrase_information" = "Введіть відому лише вам фразу безпеки для захисту таємниць на вашому сервері.";
|
||||
"secrets_setup_recovery_passphrase_additional_information" = "Не застосовуйте пароль облікового запису повторно.";
|
||||
"secrets_setup_recovery_passphrase_confirm_information" = "Для підтвердження введіть таємну фразу ще раз.";
|
||||
"secure_key_backup_setup_existing_backup_error_title" = "Резервна копія повідомлень уже існує";
|
||||
"secure_key_backup_setup_existing_backup_error_info" = "Розблокуйте її, щоб продовжити попереднє захищене резервне копіювання, або видаліть її, щоб почати захищене резервне копіювання повідомлень заново.";
|
||||
"secure_key_backup_setup_existing_backup_error_unlock_it" = "Розблокувати";
|
||||
"secure_key_backup_setup_existing_backup_error_delete_it" = "Видалити";
|
||||
"sign_out_non_existing_key_backup_alert_setup_secure_backup_action" = "Налаштувати резервне копіювання ключів";
|
||||
"major_update_information" = "Ми раді повідомити, що змінили назву! Ваш застосунок оновлено й ви ввійшли у свій обліковий запис.";
|
||||
"pin_protection_reset_alert_message" = "Щоб скинути PIN-код, увійдіть заново та створіть новий";
|
||||
"pin_protection_explanatory" = "Встановлення PIN-коду захищає ваші дані, як-от повідомлення чи контакти, обов'язковим запитом вашого PIN-коду при відкритті застосунку.";
|
||||
"pin_protection_not_allowed_pin" = "Цей PIN-код недостатньо безпечний. Спробуйте інший";
|
||||
"pin_protection_settings_section_footer" = "Щоб скинути PIN-код, потрібно ввійти заново та створити новий.";
|
||||
"pin_protection_mismatch_too_many_times_error_message" = "Не пригадуєте свій PIN-код? Торкніться кнопки \"Забули PIN-код\".";
|
||||
"biometrics_usage_reason" = "Застосунок потребує підтвердження особи";
|
||||
"biometrics_cant_unlocked_alert_message_x" = "Розблокуйте за допомогою %@ або ввійдіть заново й увімкніть %@ ще раз";
|
||||
"biometrics_cant_unlocked_alert_message_login" = "Увійти заново";
|
||||
"device_verification_self_verify_wait_recover_secrets_checking_availability" = "Перевірка інших можливостей звірки ...";
|
||||
"create_room_section_footer_type" = "Вхід до закритої кімнати — лише за запрошенням.";
|
||||
"pin_protection_kick_user_alert_message" = "Забагато помилок, ваш сеанс припинено";
|
||||
|
||||
// MARK: - Secrets recovery
|
||||
|
||||
"secrets_recovery_reset_action_part_1" = "Забули чи втратили всі способи відновлення? ";
|
||||
"secrets_reset_information" = "Робіть це лише якщо у вас немає іншого пристрою для звірки.";
|
||||
"secrets_reset_warning_title" = "Якщо ви скинете все";
|
||||
"secrets_reset_warning_message" = "Ви розпочнете знову, але без історії повідомлень, без довірених пристроїв та користувачів.";
|
||||
"secrets_setup_recovery_passphrase_summary_title" = "Збережіть ключ безпеки";
|
||||
"secrets_setup_recovery_passphrase_summary_information" = "Запам'ятайте свою фразу безпеки. Нею можна буде розблокувати ваші зашифровані повідомлення й дані.";
|
||||
"home_empty_view_information" = "Досконалий застосунок для захищеного спілкування команд, друзів і організацій. Торкніться кнопки + унизу, щоб додати людей і кімнати.";
|
||||
"bug_report_background_mode" = "Продовжити у фоновому режимі";
|
||||
"room_intro_cell_information_room_without_topic_sentence2_part2" = " щоб люди знали, про що ця кімната.";
|
||||
"room_intro_cell_information_dm_sentence2" = "У цій розмові лише ви двоє, більше ніхто не може приєднатися.";
|
||||
"room_intro_cell_information_multiple_dm_sentence2" = "У цій розмові лише ви, поки хтось із вас не запросить іще когось приєднатися.";
|
||||
"space_feature_unavailable_subtitle" = "Простори ще не готові на iOS, але доступні у вебпереглядачі та на комп'ютері";
|
||||
"space_feature_unavailable_information" = "Простори — новий спосіб групувати кімнати й людей.\n\nСкоро ми їх допрацюємо. Якщо приєднаєтеся до простору на іншій платформі, всі його кімнати стануть доступні й тут.";
|
||||
|
||||
// Success from secure backup
|
||||
"key_backup_setup_success_from_secure_backup_info" = "Створюється резервна копія ключів.";
|
||||
"secrets_recovery_with_key_information_unlock_secure_backup_with_phrase" = "Введіть фразу безпеки для продовження.";
|
||||
"secrets_recovery_with_key_information_unlock_secure_backup_with_key" = "Скористайтеся ключем безпеки для продовження.";
|
||||
"key_verification_verify_qr_code_scan_code_other_device_action" = "Сканувати цим пристроєм";
|
||||
"voice_message_stop_locked_mode_recording" = "Торкніться запису, щоб зупинити або прослухати";
|
||||
"version_check_banner_subtitle_supported" = "Ми скоро припинимо підтримку %@ на iOS %@. Щоб усі можливості %@ залишалися вам доступні, радимо оновити вашу версію iOS.";
|
||||
"version_check_banner_subtitle_deprecated" = "Ми більше не підтримуємо %@ на iOS %@. Щоб усі можливості %@ залишалися вам доступні, радимо оновити вашу версію iOS.";
|
||||
"version_check_modal_subtitle_supported" = "Ми вдосконалюємо швидкодію та дизайн %@. На жаль, ваша версія iOS сумісна не з усіма нашими виправленнями й скоро втратить підтримку.\nРадимо оновити операційну систему, щоб усі можливості %@ були вам доступні.";
|
||||
"version_check_modal_subtitle_deprecated" = "Ми вдосконалюємо швидкодію та дизайн %@. На жаль, ваша версія iOS сумісна не з усіма нашими виправленнями й більше не підтримується.\nРадимо оновити операційну систему, щоб усі можливості %@ були вам доступні.";
|
||||
"leave_space_message" = "Точно вийти з %@? Вийти також із усіх кімнат і просторів цього простору?";
|
||||
"leave_space_message_admin_warning" = "Ви адмініструєте цей простір. Перед виходом переконайтесь, що передали права адміністрування іншому учаснику.";
|
||||
"leave_space_only_action" = "Не виходити з жодної кімнати";
|
||||
"leave_space_and_all_rooms_action" = "Вийти з усіх кімнат і просторів";
|
||||
"spaces_explore_rooms" = "Дослідити кімнати";
|
||||
"spaces_empty_space_detail" = "Деяких кімнат може бути не видно, бо вони закриті й потребують запрошення.";
|
||||
"spaces_suggested_room" = "Пропоновано";
|
||||
"room_details_access_section_anyone_for_dm" = "Будь-хто з посиланням, зокрема гості";
|
||||
"spaces_no_room_found_detail" = "Деяких результатів може бути не видно, бо вони закриті й потребують запрошення.";
|
||||
"spaces_no_member_found_detail" = "Шукаєте когось, хто ще не в %@? Запросіть їх вебпереглядачем або комп'ютером.";
|
||||
"spaces_invites_coming_soon_title" = "Запрошення ще в розробці";
|
||||
"spaces_coming_soon_detail" = "Ця можливість тут іще не втілена, але скоро буде. Поки що можете зробити це в Element на комп'ютері.";
|
||||
"space_participants_action_remove" = "Вилучити з цього простору";
|
||||
"space_participants_action_ban" = "Заблокувати в цьому просторі";
|
||||
|
||||
// Service terms
|
||||
"service_terms_modal_title_message" = "Щоб продовжити, погодьтеся з запропонованими умови й положеннями";
|
||||
"service_terms_modal_description_identity_server" = "Інші зможуть знаходити вас, якщо в контактах їхнього телефону записаний ваш номер чи е-пошта.";
|
||||
"service_terms_modal_description_integration_manager" = "Це дасть змогу використовувати ботів, мости, віджети й пакунки наліпок.";
|
||||
"service_terms_modal_information_description_identity_server" = "Сервер ідентифікації допомагає знаходити облікові записи за номером телефону чи адресою е-пошти.";
|
||||
"service_terms_modal_information_description_integration_manager" = "Менеджер інтеграцій дає змогу додавати сторонній функціонал.";
|
||||
"share_extension_low_quality_video_message" = "Надішліть в %@ у кращій якості, або нижче в низькій.";
|
||||
|
||||
// Mark: - Polls
|
||||
|
||||
"poll_edit_form_create_poll" = "Створити опитування";
|
||||
"poll_edit_form_poll_question_or_topic" = "Питання опитування або тема";
|
||||
"poll_edit_form_question_or_topic" = "Питання чи тема";
|
||||
"poll_edit_form_input_placeholder" = "Напишіть щось";
|
||||
"poll_edit_form_create_options" = "Створіть варіанти";
|
||||
"poll_edit_form_option_number" = "Варіант %lu";
|
||||
"poll_edit_form_add_option" = "Додати варіант";
|
||||
"poll_edit_form_post_failure_title" = "Не вдалося надіслати опитування";
|
||||
"poll_edit_form_post_failure_subtitle" = "Повторіть спробу";
|
||||
"poll_edit_form_post_failure_action" = "Гаразд";
|
||||
"poll_timeline_one_vote" = "1 голос";
|
||||
"poll_timeline_votes_count" = "%lu голосів";
|
||||
"poll_timeline_total_no_votes" = "Жодного голосу";
|
||||
"poll_timeline_total_one_vote" = "1 голос надіслано";
|
||||
"poll_timeline_total_votes" = "%lu голосів надіслано";
|
||||
"poll_timeline_total_one_vote_not_voted" = "1 голос надіслано. Проголосуйте, щоб побачити результати";
|
||||
"poll_timeline_total_votes_not_voted" = "%lu голосів надіслано. Проголосуйте, щоб побачити результати";
|
||||
"poll_timeline_total_final_results_one_vote" = "Остаточні результати на підставі 1 голосу";
|
||||
"poll_timeline_total_final_results" = "Остаточні результати на підставі %lu голосів";
|
||||
"poll_timeline_vote_not_registered_title" = "Голос не зареєстровано";
|
||||
"poll_timeline_vote_not_registered_subtitle" = "Не вдалося зареєструвати ваш голос, просимо повторити спробу";
|
||||
"poll_timeline_vote_not_registered_action" = "Гаразд";
|
||||
"poll_timeline_not_closed_title" = "Не вдалося завершити опитування";
|
||||
"poll_timeline_not_closed_subtitle" = "Повторіть спробу";
|
||||
"poll_timeline_not_closed_action" = "Гаразд";
|
||||
"e2e_need_log_in_again" = "Вам потрібно ввійти заново, щоб згенерувати ключі наскрізного шифрування для цього сеансу й надіслати відкритий ключ домашньому серверу.\nЦе одноразова дія; перепрошуємо за незручності.";
|
||||
|
||||
// Crypto
|
||||
"e2e_enabling_on_app_update" = "%@ тепер підтримує наскрізне шифрування. Перезайдіть, щоб його ввімкнути.\n\nМожете зробити це зараз або пізніше в налаштуваннях застосунку.";
|
||||
|
||||
// Key backup wrong version
|
||||
"e2e_key_backup_wrong_version_title" = "Нова резервна копія ключів";
|
||||
"e2e_key_backup_wrong_version" = "Знайдено нову резервну копію ключів до захищених повідомлень.\n\nЯкщо це були не ви, встановіть нову фразу безпеки в налаштуваннях.";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "Ми <b>не</b> записуємо й <b>не</b> аналізуємо жодних даних облікового запису";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "Ми <b>не</b> передаємо даних стороннім особам";
|
||||
"analytics_prompt_point_3" = "Можете вимкнути це коли завгодно в налаштуваннях";
|
||||
"analytics_prompt_not_now" = "Відкласти";
|
||||
"analytics_prompt_yes" = "Так, усе гаразд";
|
||||
"analytics_prompt_stop" = "Більше не надсилати";
|
||||
"analytics_prompt_terms_link_upgrade" = "тут";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "Прочитайте всі наші умови %@. Згодні з ними?";
|
||||
"analytics_prompt_terms_link_new_user" = "тут";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "Можете прочитати всі наші умови %@.";
|
||||
"analytics_prompt_message_upgrade" = "Раніше ви погодилися надсилати нам анонімні дані про використання. Тепер, щоб розуміти, як люди використовують кілька пристроїв, ми створимо спільний для ваших пристроїв випадковий ідентифікатор.";
|
||||
"analytics_prompt_message_new_user" = "Допомагайте нам визначати проблеми й удосконалювати Element, надсилаючи анонімні дані про використання. Щоб розуміти, як люди використовують кілька пристроїв, ми створимо спільний для ваших пристроїв випадковий ідентифікатор.";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "Допоможіть удосконалити %@";
|
||||
"widget_integration_room_not_visible" = "Кімната %@ недоступна.";
|
||||
"widget_integration_missing_user_id" = "В запиті бракує user_id.";
|
||||
"widget_integration_missing_room_id" = "В запиті бракує room_id.";
|
||||
"widget_integration_no_permission_in_room" = "У вас нема такого дозволу в цій кімнаті.";
|
||||
"widget_integration_must_be_in_room" = "Вас нема в цій кімнаті.";
|
||||
"widget_integration_positive_power_level" = "Рівень повноважень має бути цілим додатним числом.";
|
||||
"widget_integration_room_not_recognised" = "Кімнату не знайдено.";
|
||||
"widget_integration_failed_to_send_request" = "Не вдалося надіслати запит.";
|
||||
"widget_integration_unable_to_create" = "Не вдалося створити віджет.";
|
||||
|
||||
// Widget Integration Manager
|
||||
"widget_integration_need_to_be_able_to_invite" = "Для цього вам потрібен дозвіл запрошувати користувачів.";
|
||||
"widget_creation_failure" = "Помилка створення віджету";
|
||||
"widget_no_power_to_manage" = "Для керування віджетами у цій кімнаті потрібен дозвіл";
|
||||
"bug_report_progress_uploading" = "Надсилання звіту";
|
||||
"bug_report_progress_zipping" = "Збір журналів";
|
||||
"bug_report_send_screenshot" = "Надіслати знімок екрана";
|
||||
"room_details_access_section_for_dm" = "Хто може мати доступ?";
|
||||
"room_details_access_section" = "Хто має доступ до кімнати?";
|
||||
"room_details_low_priority_tag" = "Неважливе";
|
||||
"room_details_favourite_tag" = "Улюблене";
|
||||
"identity_server_settings_alert_disconnect_still_sharing_3pid" = "Сервер ідентифікації %@ досі поширює ваші особисті дані.\n\nРадимо вилучити адреси е-пошти й номери телефонів із сервера ідентифікації, перш ніж від'єднатися.";
|
||||
"settings_analytics_and_crash_data" = "Надсилати дані про збої та аналітику";
|
||||
"accessibility_button_label" = "кнопка";
|
||||
"enable" = "Увімкнути";
|
||||
"call_no_stun_server_error_use_fallback_button" = "Спробувати %@";
|
||||
"call_no_stun_server_error_message_2" = "Також ви можете спробувати публічний сервер %@, але це буде менш надійно й сервер бачитиме вашу IP-адресу. Ви можете керувати цим у налаштуваннях";
|
||||
"call_no_stun_server_error_message_1" = "Запропонуйте адміністратору вашого домашнього сервера %@ налаштувати сервер TURN для надійної роботи викликів.";
|
||||
"call_no_stun_server_error_title" = "Не вдалося зателефонувати через неправильно налаштований сервер";
|
||||
"call_jitsi_error" = "Не вдалося приєднатися до конференції.";
|
||||
"call_already_displayed" = "Виклик уже триває.";
|
||||
"photo_library_access_not_granted" = "%@ не має доступу до медіатеки, просимо змінити налаштування приватності";
|
||||
"camera_unavailable" = "Камера недоступна на вашому пристрої";
|
||||
"camera_access_not_granted" = "%@ не має дозволу використовувати камеру, просимо змінити налаштування приватності";
|
||||
"rage_shake_prompt" = "Схоже, ви розчаровано струсили телефон. Бажаєте надіслати звіт про ваду?";
|
||||
"bug_report_prompt" = "При останньому запуску застосунок закрився з помилкою. Бажаєте надіслати звіт про помилку?";
|
||||
"homeserver_connection_lost" = "Не вдалося з'єднатися з домашнім сервером.";
|
||||
"event_formatter_jitsi_widget_removed_by_you" = "Ви вилучаєте голосову конференцію";
|
||||
"event_formatter_jitsi_widget_added_by_you" = "Ви додаєте голосову конференцію";
|
||||
"event_formatter_rerequest_keys_part2" = " ваших інших сеансів.";
|
||||
"event_formatter_rerequest_keys_part1_link" = "Повторити запит ключів шифрування";
|
||||
"event_formatter_jitsi_widget_removed" = "%@ вилучає голосову конференцію";
|
||||
"event_formatter_jitsi_widget_added" = "%@ додає голосову конференцію";
|
||||
"event_formatter_widget_removed" = "%@ віджет видалено %@";
|
||||
"event_formatter_widget_added" = "%@ віджет додано %@";
|
||||
|
||||
// Events formatter
|
||||
"event_formatter_member_updates" = "%tu змін членства";
|
||||
"directory_server_type_homeserver" = "Загальнодоступні кімнати якого домашнього сервера перелічити?";
|
||||
"receipt_status_read" = "Прочитано: ";
|
||||
|
||||
// Read Receipts
|
||||
"read_receipts_list" = "Список міток прочитання";
|
||||
"room_details_addresses_disable_main_address_prompt_msg" = "Ви вилучаєте головну адресу. Усталена головна адреса для цієї кімнати буде обрана випадково";
|
||||
"room_details_access_section_no_address_warning" = "Щоб на кімнату посилалися, вона повинна мати адресу";
|
||||
"room_details_access_section_anyone" = "Будь-хто з посиланням, зокрема гості";
|
||||
"room_details_access_section_anyone_apart_from_guest_for_dm" = "Будь-хто з посиланням, окрім гостей";
|
||||
"room_details_access_section_anyone_apart_from_guest" = "Будь-хто з посиланням, окрім гостей";
|
||||
"deactivate_account_informations_part5" = "Якщо ви хочете, щоб ми вилучили ваші повідомлення, встановіть прапорець унизу\n\nВидимість повідомлень у Matrix схожа на електронну пошту. Тобто ваші повідомлення не зможуть переглянути нові або незареєстровані користувачі, але зареєстровані користувачі, які вже мають доступ до цих повідомлень і надалі матимуть доступ до їхньої копії на своїх пристроях.";
|
||||
"deactivate_account_informations_part4_emphasize" = "типово не вилучає надіслані вами повідомлення. ";
|
||||
"deactivate_account_informations_part2_emphasize" = "Ця дія незворотна.";
|
||||
"deactivate_account_informations_part1" = "Вашим обліковим записом більше ніколи не можна буде користуватися. Ви не зможете увійти, і ніхто не зможе повторно зареєструвати той самий ID користувача. Ваш обліковий запис буде видалено з усіх кімнат, а всі його дані вилучено з вашого сервера ідентифікації. ";
|
||||
"e2e_room_key_request_message" = "Ваш не звірений сеанс «%@» запитує ключі шифрування.";
|
||||
"e2e_room_key_request_message_new_device" = "Ви додали новий сеанс «%@», котрий запитує ключі шифрування.";
|
||||
"room_widget_permission_information_title" = "Віджет може надсилати дані до %@:\n";
|
||||
"room_widget_permission_webview_information_title" = "Віджет може встановлювати куки та надсилати дані до %@:\n";
|
||||
"share_extension_failed_to_encrypt" = "Не вдалося надіслати. Перевірте налаштування шифрування для цієї кімнати в головному застосунку";
|
||||
|
||||
// Share extension
|
||||
"share_extension_auth_prompt" = "Увійдіть до основного застосунку, щоб поділитися вмістом";
|
||||
"service_terms_modal_policy_checkbox_accessibility_hint" = "Позначте, щоб погодитися на %@";
|
||||
"gdpr_consent_not_given_alert_review_now_action" = "Переглянути зараз";
|
||||
|
||||
// GDPR
|
||||
"gdpr_consent_not_given_alert_message" = "Перегляньте та погодьтеся з умовами користування, щоб продовжувати використовувати сервер %@.";
|
||||
"e2e_room_key_request_ignore_request" = "Знехтувати запит";
|
||||
"e2e_room_key_request_share_without_verifying" = "Надіслати без перевірки";
|
||||
"e2e_room_key_request_start_verification" = "Починається перевірка…";
|
||||
"deactivate_account_forget_messages_information_part3" = ": внаслідок цього майбутні користувачі не можуть не розуміти змісту розмов)";
|
||||
"deactivate_account_forget_messages_information_part1" = "Видаліть усі надіслані мною повідомлення після деактивації мого облікового запису (";
|
||||
"rerequest_keys_alert_message" = "Запустіть %@ на іншому пристрої, який зможе розшифрувати повідомлення та надіслати ключі цьому сеансу.";
|
||||
"widget_integration_manager_disabled" = "Необхідно увімкнути менеджер інтеграцій у налаштуваннях";
|
||||
"widget_menu_remove" = "Вилучити для всіх";
|
||||
"widget_menu_revoke_permission" = "Відкликати мій доступ";
|
||||
"widget_menu_open_outside" = "Відкрити у переглядачі";
|
||||
"widget_menu_refresh" = "Оновити";
|
||||
"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Додати зараз?";
|
||||
"widget_sticker_picker_no_stickerpacks_alert" = "На разі жоден пакунок наліпок не увімкнено.";
|
||||
"widget_integrations_server_failed_to_connect" = "Не вдалося зʼєднатися з сервером інтеграцій";
|
||||
|
||||
// Widget
|
||||
"widget_no_integrations_server_configured" = "Сервер інтеграцій не налаштовано";
|
||||
"bug_report_description" = "Опишіть ваду. Що ви робили? Виконання якої дії очікували? Що сталося натомість?";
|
||||
"bug_crash_report_title" = "Звіт про збій";
|
||||
"bug_crash_report_description" = "Будь ласка, опишіть свої дії перед збоєм:";
|
||||
"bug_report_logs_description" = "Задля діагностики, журнали клієнта будуть надіслані разом зі звітом про ваду. Якщо бажаєте надіслати лише текст угорі, зніміть галочку:";
|
||||
"bug_report_send_logs" = "Надіслати журнали";
|
||||
"group_participants_invite_another_user" = "Знайти чи запросити за ID користувача чи іменем";
|
||||
"group_participants_invite_malformed_id" = "Хибний ID. Треба Matrix ID вигляду «@localpart:domain»";
|
||||
|
||||
|
||||
// MARK: Key backup setup
|
||||
|
||||
"key_backup_setup_title" = "Резервне копіювання ключів";
|
||||
"key_backup_setup_skip_alert_message" = "Ви втратите захищені повідомлення, якщо вийдете чи загубите пристрій.";
|
||||
|
||||
// Intro
|
||||
|
||||
"key_backup_setup_intro_title" = "Ніколи не втрачайте зашифровані повідомлення";
|
||||
"key_backup_setup_intro_info" = "Повідомлення в зашифрованих кімнатах захищені наскрізним шифруванням. Тільки ви та одержувачі маєте ключі для читання цих повідомлень.\n\nСтворіть захищену резервну копію ключів, щоб їх не втратити.";
|
||||
"key_backup_setup_passphrase_info" = "Ми збережемо зашифровану копію ваших ключів на нашому сервері. Захистіть свою резервну копію парольною фразою.\n\nДля максимальної безпеки фраза повинна відрізнятися від пароля вашого облікового запису.";
|
||||
"key_backup_setup_passphrase_set_passphrase_action" = "Встановити фразу";
|
||||
|
||||
// MARK: Key backup recover
|
||||
|
||||
"key_backup_recover_title" = "Захищені повідомлення";
|
||||
|
||||
// Recover from passphrase
|
||||
|
||||
"key_backup_recover_from_passphrase_info" = "Використайте фразу безпеки, щоб розблокувати історію зашифрованих повідомлень";
|
||||
|
||||
// Recover from recovery key
|
||||
|
||||
"key_backup_recover_from_recovery_key_info" = "Використайте ключ безпеки, щоб розблокувати історію зашифрованих повідомлень";
|
||||
"key_backup_recover_from_passphrase_lost_passphrase_action_part1" = "Забули свою фразу безпеки? Можете ";
|
||||
"key_backup_recover_from_passphrase_lost_passphrase_action_part2" = "використати ключ безпеки";
|
||||
"key_backup_recover_from_recovery_key_recovery_key_placeholder" = "Введіть ключ безпеки";
|
||||
"key_backup_recover_from_recovery_key_recover_action" = "Розблокувати історію";
|
||||
"key_backup_recover_from_recovery_key_lost_recovery_key_action" = "Втратили ключ безпеки? Встановіть новий у налаштуваннях.";
|
||||
|
||||
// Success
|
||||
|
||||
"key_backup_recover_success_info" = "Резервну копію відновлено!";
|
||||
"key_backup_recover_done_action" = "Готово";
|
||||
"key_backup_setup_intro_setup_action_without_existing_backup" = "Налаштувати резервне копіювання ключів";
|
||||
|
||||
// Passphrase
|
||||
|
||||
"key_backup_setup_passphrase_title" = "Захистіть резервну копію фразою безпеки";
|
||||
"key_backup_setup_passphrase_setup_recovery_key_info" = "Або захистіть резервну копію ключем безпеки, який зберігатимете в надійному місці.";
|
||||
"key_backup_setup_passphrase_setup_recovery_key_action" = "(Додатково) Налаштувати ключ безпеки";
|
||||
|
||||
// Success
|
||||
|
||||
"key_backup_setup_success_title" = "Успіх!";
|
||||
|
||||
// Success from passphrase
|
||||
"key_backup_setup_success_from_passphrase_info" = "Триває резервне копіювання ваших ключів.\n\nКлюч безпеки підстраховує вас: можете використати його для відновлення доступу до ваших зашифрованих повідомлень, якщо забудете парольну фразу.\n\nТримайте відновлювальний ключ у якомусь дуже надійному місці, наприклад у менеджері паролів (або сейфі).";
|
||||
"key_backup_setup_success_from_passphrase_save_recovery_key_action" = "Зберегти ключ безпеки";
|
||||
|
||||
// Success from recovery key
|
||||
"key_backup_setup_success_from_recovery_key_info" = "Триває резервне копіювання ваших ключів.\n\nСкопіюйте цей ключ безпеки й надійно його зберігайте.";
|
||||
"key_backup_setup_success_from_recovery_key_recovery_key_title" = "Ключ безпеки";
|
||||
"key_backup_setup_success_from_recovery_key_make_copy_action" = "Зробити копію";
|
||||
"key_backup_setup_success_from_recovery_key_made_copy_action" = "Вже маю копію";
|
||||
"key_backup_recover_invalid_passphrase_title" = "Хибна фраза безпеки";
|
||||
"key_backup_recover_invalid_passphrase" = "Не вдається розшифрувати резервну копію цією фразою: переконайтеся, що вводите правильну фразу безпеки.";
|
||||
"key_backup_recover_invalid_recovery_key_title" = "Хибний ключ безпеки";
|
||||
"key_backup_recover_invalid_recovery_key" = "Не вдалося розшифрувати резервну копію цим ключем: переконайтеся, що вводите правильний ключ безпеки.";
|
||||
|
||||
// MARK: Sign out warning
|
||||
|
||||
"sign_out_existing_key_backup_alert_title" = "Точно вийти?";
|
||||
"sign_out_existing_key_backup_alert_sign_out_action" = "Вийти";
|
||||
"sign_out_non_existing_key_backup_alert_title" = "Якщо вийти зараз, ви втратите свої зашифровані повідомлення";
|
||||
"sign_out_non_existing_key_backup_alert_discard_key_backup_action" = "Мені не потрібні мої зашифровані повідомлення";
|
||||
"sign_out_non_existing_key_backup_sign_out_confirmation_alert_title" = "Ви втратите доступ до ваших зашифрованих повідомлень";
|
||||
"sign_out_non_existing_key_backup_sign_out_confirmation_alert_message" = "Ви втратите доступ до своїх зашифрованих повідомлень, якщо не зробите резервну копію ключів перед виходом з системи.";
|
||||
"sign_out_non_existing_key_backup_sign_out_confirmation_alert_sign_out_action" = "Вийти";
|
||||
"sign_out_non_existing_key_backup_sign_out_confirmation_alert_backup_action" = "Резервна копія";
|
||||
"sign_out_key_backup_in_progress_alert_title" = "Триває резервне копіювання ключів. Якщо вийти зараз, ви втратите доступ до своїх зашифрованих повідомлень.";
|
||||
"sign_out_key_backup_in_progress_alert_discard_key_backup_action" = "Мені не потрібні мої зашифровані повідомлення";
|
||||
"sign_out_key_backup_in_progress_alert_cancel_action" = "Почекаю";
|
||||
"key_backup_setup_intro_manual_export_info" = "(Розширені)";
|
||||
"key_backup_setup_intro_manual_export_action" = "Експорт ключів вручну";
|
||||
"key_backup_setup_intro_setup_connect_action_with_existing_backup" = "Налаштувати цьому пристрою резервне копіювання ключів";
|
||||
"device_verification_cancelled" = "Інша сторона скасувала звірку.";
|
||||
"device_verification_cancelled_by_me" = "Звірку скасовано. Причина: %@";
|
||||
"device_verification_error_cannot_load_device" = "Не вдалося отримати дані сеансу.";
|
||||
|
||||
// Mark: Incoming
|
||||
"device_verification_incoming_title" = "Надійшов запит на звірку";
|
||||
"device_verification_incoming_description_1" = "Звірте цей сеанс, щоб позначити його довіреним. Довірені сеанси партнерів дають змогу впевненіше користуватися наскрізним шифруванням повідомлень.";
|
||||
"device_verification_incoming_description_2" = "Звірка цього сеансу позначить його довіреним для вас, а ваш довіреним для партнера.";
|
||||
|
||||
// MARK: Start
|
||||
"device_verification_start_title" = "Звірити, порівнявши короткий текстовий рядок";
|
||||
"device_verification_start_wait_partner" = "Очікування підтвердження партнером…";
|
||||
"device_verification_start_use_legacy" = "Нічого не з'являється? Ще не всі клієнти підтримують інтерактивну звірку. Звірте по-старому.";
|
||||
"device_verification_start_verify_button" = "Почати звірку";
|
||||
"device_verification_start_use_legacy_action" = "Звірити по-старому";
|
||||
"key_verification_tile_request_status_expired" = "Термін сплив";
|
||||
"key_verification_user_title" = "Звірте їх";
|
||||
"user_verification_start_information_part2" = " порівнявши одноразовий код на обох ваших пристроях.";
|
||||
"user_verification_start_information_part1" = "Звірте безпечніше, ";
|
||||
|
||||
// MARK: - User verification
|
||||
|
||||
// Start
|
||||
|
||||
"user_verification_start_verify_action" = "Почати звірку";
|
||||
"user_verification_start_waiting_partner" = "Очікування на %@…";
|
||||
"user_verification_start_additional_information" = "Для безпеки зробіть це особисто або скористайтеся іншим способом зв'язку.";
|
||||
|
||||
// Sessions list
|
||||
|
||||
"user_verification_sessions_list_user_trust_level_trusted_title" = "Довірений";
|
||||
"user_verification_sessions_list_information" = "Листування з цим користувачем у цій кімнаті наскрізно зашифроване й непрочитне для сторонніх.";
|
||||
"user_verification_session_details_information_untrusted_current_user" = "Звірте цей сеанс, щоб позначити його довіреним і надати йому доступ до зашифрованих повідомлень:";
|
||||
"secrets_setup_recovery_key_storage_alert_message" = "✓ Надрукуйте його й зберігайте в надійному місці\n✓ Збережіть його на USB-ключ або носій резервного копіювання\n✓ Скопіюйте його до вашого особистого хмарного сховища";
|
||||
"call_transfer_error_message" = "Не вдалося переадресувати виклик";
|
||||
"favourites_empty_view_information" = "Ви можете додати до улюблених кількома способами, найшвидший — це просто натиснути й утримувати. Торкніться зірки, і вони автоматично зʼявляться тут для безпечного зберігання.";
|
||||
|
||||
// MARK: - Favourites
|
||||
|
||||
"favourites_empty_view_title" = "Улюблені кімнати й люди";
|
||||
"group_participants_filter_members" = "Фільтр учасників спільноти";
|
||||
"group_participants_invite_prompt_msg" = "Ви впевнені, що хочете запросити %@ до цієї групи?";
|
||||
"room_details_fail_to_update_room_direct" = "Не вдалося оновити прямий прапор цієї кімнати";
|
||||
"room_details_flair_section" = "Показувати значки для спільнот";
|
||||
"settings_flair" = "Показувати значок, де це дозволено";
|
||||
"room_warning_about_encryption" = "Наскрізне шифрування ще на етапі бета-тестування й може бути ненадійним.\n\nПоки що не варто довіряти йому захист даних.\n\nПристрої ще не зможуть розшифрувати історію до того, як з них приєдналися до кімнати.\n\nЗашифровані повідомлення не буде показано у клієнтах, які ще не використовують шифрування.";
|
||||
|
||||
@@ -1548,7 +1548,7 @@
|
||||
"space_home_show_all_rooms" = "显示所有聊天室";
|
||||
"room_event_action_forward" = "转发";
|
||||
"poll_edit_form_add_option" = "添加选项";
|
||||
"poll_edit_form_option_number" = "选项 %d";
|
||||
"poll_edit_form_option_number" = "选项 %lu";
|
||||
"poll_edit_form_create_options" = "创建选项";
|
||||
"poll_edit_form_input_placeholder" = "写些东西";
|
||||
"poll_edit_form_question_or_topic" = "问题或话题";
|
||||
@@ -1562,3 +1562,46 @@
|
||||
"share_extension_low_quality_video_title" = "将以低画质发送视频";
|
||||
"settings_discovery_accept_terms" = "接受身份服务器条款";
|
||||
"settings_about" = "关于";
|
||||
"poll_timeline_not_closed_action" = "好";
|
||||
"poll_timeline_not_closed_subtitle" = "请再试一次";
|
||||
"poll_timeline_not_closed_title" = "结束投票失败";
|
||||
"poll_timeline_vote_not_registered_action" = "好";
|
||||
"poll_timeline_vote_not_registered_subtitle" = "抱歉,您的投票未登记,请重试";
|
||||
"poll_timeline_vote_not_registered_title" = "投票未登记";
|
||||
"poll_timeline_total_final_results" = "基于 %lu 票的最终结果";
|
||||
"poll_timeline_total_final_results_one_vote" = "基于 1 票的最终结果";
|
||||
"poll_timeline_total_votes_not_voted" = "已有 %lu 票。投票查看结果";
|
||||
"poll_timeline_total_one_vote_not_voted" = "已有 1 票。 投票查看结果";
|
||||
"poll_timeline_total_votes" = "%lu 票";
|
||||
"poll_timeline_total_one_vote" = "1 票";
|
||||
"poll_timeline_total_no_votes" = "尚无投票";
|
||||
"poll_timeline_votes_count" = "%lu 票";
|
||||
"poll_timeline_one_vote" = "1 票";
|
||||
"poll_edit_form_post_failure_action" = "好";
|
||||
"poll_edit_form_post_failure_subtitle" = "请再试一次";
|
||||
"poll_edit_form_post_failure_title" = "发布投票失败";
|
||||
"settings_labs_enabled_polls" = "投票";
|
||||
"room_event_action_end_poll" = "结束投票";
|
||||
"room_event_action_remove_poll" = "删除投票";
|
||||
"analytics_prompt_stop" = "停止共享";
|
||||
"analytics_prompt_yes" = "是的,没关系";
|
||||
"analytics_prompt_not_now" = "不是现在";
|
||||
"analytics_prompt_point_3" = "您可以随时在设置中关闭此功能";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_2" = "我们<b>不</b>与第三方共享信息";
|
||||
/* Note: The word "don't" is formatted in bold */
|
||||
"analytics_prompt_point_1" = "我们 <b>不</b>记录任何账户数据或绘制任何账户数据的画像";
|
||||
"analytics_prompt_terms_link_upgrade" = "此处";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_upgrade */
|
||||
"analytics_prompt_terms_upgrade" = "阅读我们所有的条款 %@。 那样行吗?";
|
||||
"analytics_prompt_terms_link_new_user" = "此处";
|
||||
/* Note: The placeholder is for the contents of analytics_prompt_terms_link_new_user */
|
||||
"analytics_prompt_terms_new_user" = "你可以阅读我们所有的条款 %@。";
|
||||
"analytics_prompt_message_upgrade" = "您之前同意与我们共享匿名使用数据。 现在,为了帮助了解人们如何使用多个设备,我们将生成一个随机标识符,由您的设备共享。";
|
||||
"analytics_prompt_message_new_user" = "通过共享匿名使用数据帮助我们发现问题并改进 Element。 为了了解人们如何使用多个设备,我们将生成一个随机标识符,由您的设备共享。";
|
||||
|
||||
// Analytics
|
||||
"analytics_prompt_title" = "帮助改进 %@";
|
||||
"settings_analytics_and_crash_data" = "发送崩溃和分析数据";
|
||||
"accessibility_button_label" = "按钮";
|
||||
"enable" = "启用";
|
||||
|
||||
@@ -26,15 +26,15 @@
|
||||
NSUInteger missedDiscussionsCount = 0;
|
||||
|
||||
// Sum all the rooms with missed notifications.
|
||||
for (MXRoomSummary *roomSummary in self.roomsSummaries)
|
||||
for (MXRoom *room in self.rooms)
|
||||
{
|
||||
NSUInteger notificationCount = roomSummary.notificationCount;
|
||||
NSUInteger notificationCount = room.summary.notificationCount;
|
||||
|
||||
// Ignore the regular notification count if the room is in 'mentions only" mode at the Riot level.
|
||||
if (roomSummary.room.isMentionsOnly)
|
||||
if (room.isMentionsOnly)
|
||||
{
|
||||
// Only the highlighted missed messages must be considered here.
|
||||
notificationCount = roomSummary.highlightCount;
|
||||
notificationCount = room.summary.highlightCount;
|
||||
}
|
||||
|
||||
if (notificationCount)
|
||||
|
||||
@@ -115,6 +115,7 @@ internal enum Asset {
|
||||
internal static let peopleFloatingAction = ImageAsset(name: "people_floating_action")
|
||||
internal static let actionCamera = ImageAsset(name: "action_camera")
|
||||
internal static let actionFile = ImageAsset(name: "action_file")
|
||||
internal static let actionLocation = ImageAsset(name: "action_location")
|
||||
internal static let actionMediaLibrary = ImageAsset(name: "action_media_library")
|
||||
internal static let actionPoll = ImageAsset(name: "action_poll")
|
||||
internal static let actionSticker = ImageAsset(name: "action_sticker")
|
||||
@@ -146,6 +147,9 @@ internal enum Asset {
|
||||
internal static let videoCall = ImageAsset(name: "video_call")
|
||||
internal static let voiceCallHangonIcon = ImageAsset(name: "voice_call_hangon_icon")
|
||||
internal static let voiceCallHangupIcon = ImageAsset(name: "voice_call_hangup_icon")
|
||||
internal static let locationMarkerIcon = ImageAsset(name: "location_marker_icon")
|
||||
internal static let locationShareIcon = ImageAsset(name: "location_share_icon")
|
||||
internal static let locationUserMarker = ImageAsset(name: "location_user_marker")
|
||||
internal static let pollCheckboxDefault = ImageAsset(name: "poll_checkbox_default")
|
||||
internal static let pollCheckboxSelected = ImageAsset(name: "poll_checkbox_selected")
|
||||
internal static let pollDeleteIcon = ImageAsset(name: "poll_delete_icon")
|
||||
|
||||
@@ -695,6 +695,10 @@ public class MatrixKitL10n: NSObject {
|
||||
public static var messageReplyToSenderSentAnImage: String {
|
||||
return MatrixKitL10n.tr("message_reply_to_sender_sent_an_image")
|
||||
}
|
||||
/// has shared their location.
|
||||
public static var messageReplyToSenderSentTheirLocation: String {
|
||||
return MatrixKitL10n.tr("message_reply_to_sender_sent_their_location")
|
||||
}
|
||||
/// There are unsaved changes. Leaving will discard them.
|
||||
public static var messageUnsavedChanges: String {
|
||||
return MatrixKitL10n.tr("message_unsaved_changes")
|
||||
|
||||
@@ -35,9 +35,9 @@ public class VectorL10n: NSObject {
|
||||
public static func activeCallDetails(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "active_call_details", p1)
|
||||
}
|
||||
/// Help us identify issues and improve Element by sharing anonymous usage data. To understand how people use multiple devices, we’ll generate a random identifier, shared by your devices.
|
||||
public static var analyticsPromptMessageNewUser: String {
|
||||
return VectorL10n.tr("Vector", "analytics_prompt_message_new_user")
|
||||
/// Help us identify issues and improve %@ by sharing anonymous usage data. To understand how people use multiple devices, we’ll generate a random identifier, shared by your devices.
|
||||
public static func analyticsPromptMessageNewUser(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "analytics_prompt_message_new_user", p1)
|
||||
}
|
||||
/// You previously consented to share anonymous usage data with us. Now, to help understand how people use multiple devices, we’ll generate a random identifier, shared by your devices.
|
||||
public static var analyticsPromptMessageUpgrade: String {
|
||||
@@ -2195,6 +2195,54 @@ public class VectorL10n: NSObject {
|
||||
public static var less: String {
|
||||
return VectorL10n.tr("Vector", "less")
|
||||
}
|
||||
/// Close
|
||||
public static var locationSharingCloseAction: String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_close_action")
|
||||
}
|
||||
/// %@ does not have permission to access your location. You can enable access in Settings > Location
|
||||
public static func locationSharingInvalidAuthorizationErrorTitle(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_invalid_authorization_error_title", p1)
|
||||
}
|
||||
/// Not now
|
||||
public static var locationSharingInvalidAuthorizationNotNow: String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_invalid_authorization_not_now")
|
||||
}
|
||||
/// Settings
|
||||
public static var locationSharingInvalidAuthorizationSettings: String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_invalid_authorization_settings")
|
||||
}
|
||||
/// %@ could not load the map. Please try again later.
|
||||
public static func locationSharingLoadingMapErrorTitle(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_loading_map_error_title", p1)
|
||||
}
|
||||
/// %@ could not access your location. Please try again later.
|
||||
public static func locationSharingLocatingUserErrorTitle(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_locating_user_error_title", p1)
|
||||
}
|
||||
/// Open in Apple Maps
|
||||
public static var locationSharingOpenAppleMaps: String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_open_apple_maps")
|
||||
}
|
||||
/// Open in Google Maps
|
||||
public static var locationSharingOpenGoogleMaps: String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_open_google_maps")
|
||||
}
|
||||
/// Location sharing
|
||||
public static var locationSharingSettingsHeader: String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_settings_header")
|
||||
}
|
||||
/// Enable location sharing
|
||||
public static var locationSharingSettingsToggleTitle: String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_settings_toggle_title")
|
||||
}
|
||||
/// Share
|
||||
public static var locationSharingShareAction: String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_share_action")
|
||||
}
|
||||
/// Location
|
||||
public static var locationSharingTitle: String {
|
||||
return VectorL10n.tr("Vector", "location_sharing_title")
|
||||
}
|
||||
/// Got it
|
||||
public static var majorUpdateDoneAction: String {
|
||||
return VectorL10n.tr("Vector", "major_update_done_action")
|
||||
@@ -2295,10 +2343,54 @@ public class VectorL10n: NSObject {
|
||||
public static var off: String {
|
||||
return VectorL10n.tr("Vector", "off")
|
||||
}
|
||||
/// OK
|
||||
public static var ok: String {
|
||||
return VectorL10n.tr("Vector", "ok")
|
||||
}
|
||||
/// On
|
||||
public static var on: String {
|
||||
return VectorL10n.tr("Vector", "on")
|
||||
}
|
||||
/// I already have an account
|
||||
public static var onboardingSplashLoginButtonTitle: String {
|
||||
return VectorL10n.tr("Vector", "onboarding_splash_login_button_title")
|
||||
}
|
||||
/// Secure and independent communication that gives you the same level of privacy as a face-to-face conversation in your own home.
|
||||
public static var onboardingSplashPage1Message: String {
|
||||
return VectorL10n.tr("Vector", "onboarding_splash_page_1_message")
|
||||
}
|
||||
/// Own your conversations.
|
||||
public static var onboardingSplashPage1Title: String {
|
||||
return VectorL10n.tr("Vector", "onboarding_splash_page_1_title")
|
||||
}
|
||||
/// Choose where your conversations are kept, giving you control and independence. Connected via Matrix.
|
||||
public static var onboardingSplashPage2Message: String {
|
||||
return VectorL10n.tr("Vector", "onboarding_splash_page_2_message")
|
||||
}
|
||||
/// You’re in control.
|
||||
public static var onboardingSplashPage2Title: String {
|
||||
return VectorL10n.tr("Vector", "onboarding_splash_page_2_title")
|
||||
}
|
||||
/// End-to-end encrypted and no phone number required. No ads or datamining.
|
||||
public static var onboardingSplashPage3Message: String {
|
||||
return VectorL10n.tr("Vector", "onboarding_splash_page_3_message")
|
||||
}
|
||||
/// Secure messaging.
|
||||
public static var onboardingSplashPage3Title: String {
|
||||
return VectorL10n.tr("Vector", "onboarding_splash_page_3_title")
|
||||
}
|
||||
/// Element is also great for the workplace. It’s trusted by the world’s most secure organisations.
|
||||
public static var onboardingSplashPage4Message: String {
|
||||
return VectorL10n.tr("Vector", "onboarding_splash_page_4_message")
|
||||
}
|
||||
/// Messaging for your team.
|
||||
public static var onboardingSplashPage4TitleNoPun: String {
|
||||
return VectorL10n.tr("Vector", "onboarding_splash_page_4_title_no_pun")
|
||||
}
|
||||
/// Create account
|
||||
public static var onboardingSplashRegisterButtonTitle: String {
|
||||
return VectorL10n.tr("Vector", "onboarding_splash_register_button_title")
|
||||
}
|
||||
/// Open
|
||||
public static var `open`: String {
|
||||
return VectorL10n.tr("Vector", "open")
|
||||
@@ -2447,10 +2539,6 @@ public class VectorL10n: NSObject {
|
||||
public static var pollEditFormPollQuestionOrTopic: String {
|
||||
return VectorL10n.tr("Vector", "poll_edit_form_poll_question_or_topic")
|
||||
}
|
||||
/// OK
|
||||
public static var pollEditFormPostFailureAction: String {
|
||||
return VectorL10n.tr("Vector", "poll_edit_form_post_failure_action")
|
||||
}
|
||||
/// Please try again
|
||||
public static var pollEditFormPostFailureSubtitle: String {
|
||||
return VectorL10n.tr("Vector", "poll_edit_form_post_failure_subtitle")
|
||||
@@ -2463,10 +2551,6 @@ public class VectorL10n: NSObject {
|
||||
public static var pollEditFormQuestionOrTopic: String {
|
||||
return VectorL10n.tr("Vector", "poll_edit_form_question_or_topic")
|
||||
}
|
||||
/// OK
|
||||
public static var pollTimelineNotClosedAction: String {
|
||||
return VectorL10n.tr("Vector", "poll_timeline_not_closed_action")
|
||||
}
|
||||
/// Please try again
|
||||
public static var pollTimelineNotClosedSubtitle: String {
|
||||
return VectorL10n.tr("Vector", "poll_timeline_not_closed_subtitle")
|
||||
@@ -2507,10 +2591,6 @@ public class VectorL10n: NSObject {
|
||||
public static func pollTimelineTotalVotesNotVoted(_ p1: Int) -> String {
|
||||
return VectorL10n.tr("Vector", "poll_timeline_total_votes_not_voted", p1)
|
||||
}
|
||||
/// OK
|
||||
public static var pollTimelineVoteNotRegisteredAction: String {
|
||||
return VectorL10n.tr("Vector", "poll_timeline_vote_not_registered_action")
|
||||
}
|
||||
/// Sorry, your vote was not registered, please try again
|
||||
public static var pollTimelineVoteNotRegisteredSubtitle: String {
|
||||
return VectorL10n.tr("Vector", "poll_timeline_vote_not_registered_subtitle")
|
||||
@@ -4527,6 +4607,10 @@ public class VectorL10n: NSObject {
|
||||
public static var settingsEnableRageshake: String {
|
||||
return VectorL10n.tr("Vector", "settings_enable_rageshake")
|
||||
}
|
||||
/// Message bubbles
|
||||
public static var settingsEnableRoomMessageBubbles: String {
|
||||
return VectorL10n.tr("Vector", "settings_enable_room_message_bubbles")
|
||||
}
|
||||
/// Encrypted direct messages
|
||||
public static var settingsEncryptedDirectMessages: String {
|
||||
return VectorL10n.tr("Vector", "settings_encrypted_direct_messages")
|
||||
@@ -5147,9 +5231,9 @@ public class VectorL10n: NSObject {
|
||||
public static var spacesAddRoomsComingSoonTitle: String {
|
||||
return VectorL10n.tr("Vector", "spaces_add_rooms_coming_soon_title")
|
||||
}
|
||||
/// This feature hasn’t been implemented here, but it’s on the way. For now, you can do that with Element on your computer.
|
||||
public static var spacesComingSoonDetail: String {
|
||||
return VectorL10n.tr("Vector", "spaces_coming_soon_detail")
|
||||
/// This feature hasn’t been implemented here, but it’s on the way. For now, you can do that with %@ on your computer.
|
||||
public static func spacesComingSoonDetail(_ p1: String) -> String {
|
||||
return VectorL10n.tr("Vector", "spaces_coming_soon_detail", p1)
|
||||
}
|
||||
/// Coming soon
|
||||
public static var spacesComingSoonTitle: String {
|
||||
|
||||
@@ -19,17 +19,14 @@ import Foundation
|
||||
/// Used to handle the application information
|
||||
@objcMembers
|
||||
final class AppInfo: NSObject {
|
||||
|
||||
|
||||
// MARK: - Constants
|
||||
|
||||
/// Current application information
|
||||
static var current: AppInfo {
|
||||
let appDisplayName = BuildSettings.bundleDisplayName
|
||||
let buildInfo: BuildInfo = BuildInfo()
|
||||
|
||||
return AppInfo(displayName: appDisplayName,
|
||||
return AppInfo(displayName: self.bundleDisplayName,
|
||||
appVersion: AppVersion.current,
|
||||
buildInfo: buildInfo)
|
||||
buildInfo: BuildInfo())
|
||||
}
|
||||
|
||||
// MARK: - Properties
|
||||
@@ -52,4 +49,11 @@ final class AppInfo: NSObject {
|
||||
self.appVersion = appVersion
|
||||
self.buildInfo = buildInfo
|
||||
}
|
||||
|
||||
private static var bundleDisplayName: String {
|
||||
guard let bundleDisplayName = Bundle.app.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String else {
|
||||
fatalError("CFBundleDisplayName should be defined")
|
||||
}
|
||||
return bundleDisplayName
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,19 +81,18 @@ final public class OnBoardingManager: NSObject {
|
||||
// MARK: - Private
|
||||
|
||||
private func isUserJoinedARoom() -> Bool {
|
||||
guard let roomSummaries = self.session.roomsSummaries() else {
|
||||
return false
|
||||
}
|
||||
var isUserJoinedARoom = false
|
||||
|
||||
var isUSerJoinedARoom = false
|
||||
|
||||
for roomSummary in roomSummaries {
|
||||
for room in session.rooms {
|
||||
guard let roomSummary = room.summary else {
|
||||
continue
|
||||
}
|
||||
if case .join = roomSummary.membership {
|
||||
isUSerJoinedARoom = true
|
||||
isUserJoinedARoom = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return isUSerJoinedARoom
|
||||
return isUserJoinedARoom
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,10 +191,16 @@ final class RiotSettings: NSObject {
|
||||
|
||||
@UserDefault(key: "roomScreenAllowPollsAction", defaultValue: false, storage: defaults)
|
||||
var roomScreenAllowPollsAction
|
||||
|
||||
@UserDefault(key: "roomScreenAllowLocationAction", defaultValue: false, storage: defaults)
|
||||
var roomScreenAllowLocationAction
|
||||
|
||||
@UserDefault(key: "roomScreenShowsURLPreviews", defaultValue: true, storage: defaults)
|
||||
var roomScreenShowsURLPreviews
|
||||
|
||||
@UserDefault(key: "roomScreenEnableMessageBubbles", defaultValue: BuildSettings.roomScreenEnableMessageBubblesByDefault, storage: defaults)
|
||||
var roomScreenEnableMessageBubbles
|
||||
|
||||
// MARK: - Room Contextual Menu
|
||||
|
||||
@UserDefault(key: "roomContextualMenuShowMoreOptionForMessages", defaultValue: BuildSettings.roomContextualMenuShowMoreOptionForMessages, storage: defaults)
|
||||
|
||||
@@ -19,6 +19,16 @@ import AnalyticsEvents
|
||||
|
||||
/// A class responsible for managing an analytics client
|
||||
/// and sending events through this client.
|
||||
///
|
||||
/// ## Creating Analytics Events
|
||||
///
|
||||
/// Events are managed in a shared repo for all Element clients https://github.com/matrix-org/matrix-analytics-events
|
||||
/// To add a new event create a PR to that repo with the new/updated schema.
|
||||
/// Once merged into `main`, follow the steps below to integrate the changes into the project:
|
||||
/// 1. Merge `main` into the `release/swift` branch.
|
||||
/// 2. Run `bundle exec pod update AnalyticsEvents` to update the pod.
|
||||
/// 3. Make sure to commit `Podfile.lock` with the new commit hash.
|
||||
///
|
||||
@objcMembers class Analytics: NSObject {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
|
||||
|
||||
// Call `checkFailures` every `CHECK_INTERVAL`
|
||||
#define CHECK_INTERVAL 5
|
||||
#define CHECK_INTERVAL 2
|
||||
|
||||
// Give events a chance to be decrypted by waiting `GRACE_PERIOD` before counting
|
||||
// and reporting them as failures
|
||||
#define GRACE_PERIOD 60
|
||||
#define GRACE_PERIOD 4
|
||||
|
||||
// E2E failures analytics category.
|
||||
NSString *const kDecryptionFailureTrackerAnalyticsCategory = @"e2e.failure";
|
||||
|
||||
@@ -664,9 +664,7 @@ CallAudioRouteMenuViewDelegate>
|
||||
{
|
||||
return;
|
||||
}
|
||||
BOOL result = [self.mxCall sendDTMF:digit
|
||||
duration:0
|
||||
interToneGap:0];
|
||||
BOOL result = [self.mxCall sendDTMF:digit];
|
||||
|
||||
MXLogDebug(@"[CallViewController] Sending DTMF tones %@", result ? @"succeeded": @"failed");
|
||||
}
|
||||
|
||||
@@ -182,6 +182,13 @@ extern NSString *const kRecentsDataSourceTapOnDirectoryServerChange;
|
||||
*/
|
||||
@property (nonatomic) UIImageView* droppingCellBackGroundView;
|
||||
|
||||
/**
|
||||
Paginate in the given section. Results will be notified from delegate methods.
|
||||
|
||||
@param section section index to be paginated
|
||||
*/
|
||||
- (void)paginateInSection:(NSInteger)section;
|
||||
|
||||
/**
|
||||
Move a cell from a path to another one.
|
||||
It is based on room Tag.
|
||||
|
||||
@@ -606,17 +606,17 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
|
||||
|
||||
if (section == favoritesSection)
|
||||
{
|
||||
count = self.favoriteCellDataArray.count;
|
||||
count = self.recentsListService.favoritedRoomListData.counts.total.numberOfRooms;
|
||||
title = [VectorL10n roomRecentsFavouritesSection];
|
||||
}
|
||||
else if (section == peopleSection)
|
||||
{
|
||||
count = self.peopleCellDataArray.count;
|
||||
count = self.recentsListService.peopleRoomListData.counts.total.numberOfRooms;
|
||||
title = [VectorL10n roomRecentsPeopleSection];
|
||||
}
|
||||
else if (section == conversationSection)
|
||||
{
|
||||
count = self.conversationCellDataArray.count;
|
||||
count = self.recentsListService.conversationRoomListData.counts.total.numberOfRooms;
|
||||
|
||||
if (_recentsDataSourceMode == RecentsDataSourceModePeople)
|
||||
{
|
||||
@@ -633,17 +633,17 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
|
||||
}
|
||||
else if (section == lowPrioritySection)
|
||||
{
|
||||
count = self.lowPriorityCellDataArray.count;
|
||||
count = self.recentsListService.lowPriorityRoomListData.counts.total.numberOfRooms;
|
||||
title = [VectorL10n roomRecentsLowPrioritySection];
|
||||
}
|
||||
else if (section == serverNoticeSection)
|
||||
{
|
||||
count = self.serverNoticeCellDataArray.count;
|
||||
count = self.recentsListService.serverNoticeRoomListData.counts.total.numberOfRooms;
|
||||
title = [VectorL10n roomRecentsServerNoticeSection];
|
||||
}
|
||||
else if (section == invitesSection)
|
||||
{
|
||||
count = self.invitesCellDataArray.count;
|
||||
count = self.recentsListService.invitedRoomListData.counts.total.numberOfRooms;
|
||||
|
||||
if (_recentsDataSourceMode == RecentsDataSourceModePeople)
|
||||
{
|
||||
@@ -656,7 +656,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
|
||||
}
|
||||
else if (section == suggestedRoomsSection)
|
||||
{
|
||||
count = self.suggestedRoomCellDataArray.count;
|
||||
count = self.recentsListService.suggestedRoomListData.counts.total.numberOfRooms;
|
||||
title = [VectorL10n roomRecentsSuggestedRoomsSection];
|
||||
}
|
||||
|
||||
@@ -714,26 +714,29 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
|
||||
counts = self.recentsListService.suggestedRoomListData.counts;
|
||||
}
|
||||
|
||||
if (counts.numberOfNotifications)
|
||||
NSUInteger numberOfNotifications = counts.total.numberOfNotifications;
|
||||
NSUInteger numberOfHighlights = counts.total.numberOfHighlights;
|
||||
|
||||
if (numberOfNotifications)
|
||||
{
|
||||
UILabel *missedNotifAndUnreadBadgeLabel = [[UILabel alloc] init];
|
||||
missedNotifAndUnreadBadgeLabel.textColor = ThemeService.shared.theme.baseTextPrimaryColor;
|
||||
missedNotifAndUnreadBadgeLabel.font = [UIFont boldSystemFontOfSize:14];
|
||||
if (counts.numberOfNotifications > 1000)
|
||||
if (numberOfNotifications > 1000)
|
||||
{
|
||||
CGFloat value = counts.numberOfNotifications / 1000.0;
|
||||
CGFloat value = numberOfNotifications / 1000.0;
|
||||
missedNotifAndUnreadBadgeLabel.text = [VectorL10n largeBadgeValueKFormat:value];
|
||||
}
|
||||
else
|
||||
{
|
||||
missedNotifAndUnreadBadgeLabel.text = [NSString stringWithFormat:@"%tu", counts.numberOfNotifications];
|
||||
missedNotifAndUnreadBadgeLabel.text = [NSString stringWithFormat:@"%tu", numberOfNotifications];
|
||||
}
|
||||
|
||||
[missedNotifAndUnreadBadgeLabel sizeToFit];
|
||||
|
||||
CGFloat bgViewWidth = missedNotifAndUnreadBadgeLabel.frame.size.width + 18;
|
||||
|
||||
BOOL highlight = counts.numberOfHighlights > 0;
|
||||
BOOL highlight = numberOfHighlights > 0;
|
||||
missedNotifAndUnreadBadgeBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bgViewWidth, 20)];
|
||||
[missedNotifAndUnreadBadgeBgView.layer setCornerRadius:10];
|
||||
missedNotifAndUnreadBadgeBgView.backgroundColor = highlight ? ThemeService.shared.theme.noticeColor : ThemeService.shared.theme.noticeSecondaryColor;
|
||||
@@ -1336,6 +1339,38 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)paginateInSection:(NSInteger)section
|
||||
{
|
||||
if (section == invitesSection)
|
||||
{
|
||||
[self.recentsListService paginateInSection:RecentsListServiceSectionInvited];
|
||||
}
|
||||
else if (section == favoritesSection)
|
||||
{
|
||||
[self.recentsListService paginateInSection:RecentsListServiceSectionFavorited];
|
||||
}
|
||||
else if (section == peopleSection)
|
||||
{
|
||||
[self.recentsListService paginateInSection:RecentsListServiceSectionPeople];
|
||||
}
|
||||
else if (section == conversationSection)
|
||||
{
|
||||
[self.recentsListService paginateInSection:RecentsListServiceSectionConversation];
|
||||
}
|
||||
else if (section == lowPrioritySection)
|
||||
{
|
||||
[self.recentsListService paginateInSection:RecentsListServiceSectionLowPriority];
|
||||
}
|
||||
else if (section == serverNoticeSection)
|
||||
{
|
||||
[self.recentsListService paginateInSection:RecentsListServiceSectionServerNotice];
|
||||
}
|
||||
else if (section == suggestedRoomsSection)
|
||||
{
|
||||
[self.recentsListService paginateInSection:RecentsListServiceSectionSuggested];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)moveRoomCell:(MXRoom*)room from:(NSIndexPath*)oldPath to:(NSIndexPath*)newPath success:(void (^)(void))moveSuccess failure:(void (^)(NSError *error))moveFailure;
|
||||
{
|
||||
MXLogDebug(@"[RecentsDataSource] moveCellFrom (%tu, %tu) to (%tu, %tu)", oldPath.section, oldPath.row, newPath.section, newPath.row);
|
||||
@@ -1431,10 +1466,41 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou
|
||||
|
||||
#pragma mark - RecentsListServiceDelegate
|
||||
|
||||
- (void)serviceDidChangeData:(id<RecentsListServiceProtocol>)service
|
||||
- (void)recentsListServiceDidChangeData:(id<RecentsListServiceProtocol>)service
|
||||
{
|
||||
// TODO: Update only updated sections
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
// no-op
|
||||
}
|
||||
|
||||
- (void)recentsListServiceDidChangeData:(id<RecentsListServiceProtocol>)service
|
||||
forSection:(RecentsListServiceSection)section
|
||||
{
|
||||
NSInteger sectionIndex = -1;
|
||||
switch (section)
|
||||
{
|
||||
case RecentsListServiceSectionInvited:
|
||||
sectionIndex = invitesSection;
|
||||
break;
|
||||
case RecentsListServiceSectionFavorited:
|
||||
sectionIndex = favoritesSection;
|
||||
break;
|
||||
case RecentsListServiceSectionPeople:
|
||||
sectionIndex = peopleSection;
|
||||
break;
|
||||
case RecentsListServiceSectionConversation:
|
||||
sectionIndex = conversationSection;
|
||||
break;
|
||||
case RecentsListServiceSectionLowPriority:
|
||||
sectionIndex = lowPrioritySection;
|
||||
break;
|
||||
case RecentsListServiceSectionServerNotice:
|
||||
sectionIndex = serverNoticeSection;
|
||||
break;
|
||||
case RecentsListServiceSectionSuggested:
|
||||
sectionIndex = suggestedRoomsSection;
|
||||
break;
|
||||
}
|
||||
|
||||
[self.delegate dataSource:self didCellChange:@(sectionIndex)];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#import "InviteRecentTableViewCell.h"
|
||||
#import "DirectoryRecentTableViewCell.h"
|
||||
#import "RoomIdOrAliasTableViewCell.h"
|
||||
#import "TableViewCellWithCollectionView.h"
|
||||
|
||||
#import "GeneratedInterface-Swift.h"
|
||||
|
||||
@@ -192,11 +193,8 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro
|
||||
[ThemeService.shared.theme applyStyleOnSearchBar:tableSearchBar];
|
||||
[ThemeService.shared.theme applyStyleOnSearchBar:self.recentsSearchBar];
|
||||
|
||||
if (self.recentsTableView.dataSource)
|
||||
{
|
||||
// Force table refresh
|
||||
[self cancelEditionMode:YES];
|
||||
}
|
||||
// Force table refresh
|
||||
[self.recentsTableView reloadData];
|
||||
|
||||
[self.emptyView updateWithTheme:ThemeService.shared.theme];
|
||||
|
||||
@@ -1007,9 +1005,32 @@ NSString *const RecentsViewControllerDataReadyNotification = @"RecentsViewContro
|
||||
|
||||
- (void)dataSource:(MXKDataSource *)dataSource didCellChange:(id)changes
|
||||
{
|
||||
[super dataSource:dataSource didCellChange:changes];
|
||||
BOOL cellReloaded = NO;
|
||||
if ([changes isKindOfClass:NSNumber.class])
|
||||
{
|
||||
NSInteger section = ((NSNumber *)changes).integerValue;
|
||||
if (section >= 0)
|
||||
{
|
||||
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:section];
|
||||
UITableViewCell *cell = [self.recentsTableView cellForRowAtIndexPath:indexPath];
|
||||
if ([cell isKindOfClass:TableViewCellWithCollectionView.class])
|
||||
{
|
||||
TableViewCellWithCollectionView *collectionViewCell = (TableViewCellWithCollectionView *)cell;
|
||||
[collectionViewCell.collectionView reloadData];
|
||||
cellReloaded = YES;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[self showEmptyViewIfNeeded];
|
||||
if (!cellReloaded)
|
||||
{
|
||||
[super dataSource:dataSource didCellChange:changes];
|
||||
}
|
||||
|
||||
if (changes == nil)
|
||||
{
|
||||
[self showEmptyViewIfNeeded];
|
||||
}
|
||||
|
||||
if (dataSource.state == MXKDataSourceStateReady)
|
||||
{
|
||||
|
||||
@@ -28,6 +28,7 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
|
||||
public private(set) var query: String?
|
||||
public private(set) var space: MXSpace?
|
||||
private var fetchersCreated: Bool = false
|
||||
|
||||
// MARK: - Fetchers
|
||||
|
||||
@@ -72,35 +73,17 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
]
|
||||
|
||||
private var allFetchers: [MXRoomListDataFetcher] {
|
||||
var result: [MXRoomListDataFetcher] = []
|
||||
if let fetcher = invitedRoomListDataFetcher {
|
||||
result.append(fetcher)
|
||||
}
|
||||
if let fetcher = favoritedRoomListDataFetcher {
|
||||
result.append(fetcher)
|
||||
}
|
||||
if let fetcher = directRoomListDataFetcherForHome {
|
||||
result.append(fetcher)
|
||||
}
|
||||
if let fetcher = directRoomListDataFetcherForPeople {
|
||||
result.append(fetcher)
|
||||
}
|
||||
if let fetcher = conversationRoomListDataFetcherForHome {
|
||||
result.append(fetcher)
|
||||
}
|
||||
if let fetcher = conversationRoomListDataFetcherForRooms {
|
||||
result.append(fetcher)
|
||||
}
|
||||
if let fetcher = lowPriorityRoomListDataFetcher {
|
||||
result.append(fetcher)
|
||||
}
|
||||
if let fetcher = serverNoticeRoomListDataFetcher {
|
||||
result.append(fetcher)
|
||||
}
|
||||
if let fetcher = suggestedRoomListDataFetcher {
|
||||
result.append(fetcher)
|
||||
}
|
||||
return result
|
||||
return [
|
||||
invitedRoomListDataFetcher,
|
||||
favoritedRoomListDataFetcher,
|
||||
directRoomListDataFetcherForHome,
|
||||
directRoomListDataFetcherForPeople,
|
||||
conversationRoomListDataFetcherForHome,
|
||||
conversationRoomListDataFetcherForRooms,
|
||||
lowPriorityRoomListDataFetcher,
|
||||
serverNoticeRoomListDataFetcher,
|
||||
suggestedRoomListDataFetcher
|
||||
].compactMap({ $0 })
|
||||
}
|
||||
|
||||
private var visibleFetchers: [MXRoomListDataFetcher] {
|
||||
@@ -132,8 +115,7 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
if let fetcher = serverNoticeRoomListDataFetcher, fetcherTypes.contains(.serverNotice) {
|
||||
result.append(fetcher)
|
||||
}
|
||||
if let fetcher = suggestedRoomListDataFetcher,
|
||||
fetcherTypes.contains(.suggested) {
|
||||
if let fetcher = suggestedRoomListDataFetcher, fetcherTypes.contains(.suggested) {
|
||||
result.append(fetcher)
|
||||
}
|
||||
return result
|
||||
@@ -184,6 +166,7 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
super.init()
|
||||
createFetchers()
|
||||
addRiotSettingsObserver()
|
||||
addSessionStateObserver()
|
||||
}
|
||||
|
||||
// MARK: - View Data
|
||||
@@ -218,30 +201,45 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
}
|
||||
|
||||
public var favoritedMissedDiscussionsCount: DiscussionsCount {
|
||||
guard let data = favoritedRoomListDataFetcher?.data else {
|
||||
guard let totalCounts = favoritedRoomListDataFetcher?.data?.counts.total else {
|
||||
return .zero
|
||||
}
|
||||
return DiscussionsCount(withRoomListDataCounts: data.counts)
|
||||
return DiscussionsCount(withRoomListDataCounts: totalCounts)
|
||||
}
|
||||
|
||||
public var peopleMissedDiscussionsCount: DiscussionsCount {
|
||||
guard let data = directRoomListDataFetcherForPeople?.data else {
|
||||
guard let totalCounts = directRoomListDataFetcherForPeople?.data?.counts.total else {
|
||||
return .zero
|
||||
}
|
||||
return DiscussionsCount(withRoomListDataCounts: data.counts)
|
||||
return DiscussionsCount(withRoomListDataCounts: totalCounts)
|
||||
}
|
||||
|
||||
public var conversationMissedDiscussionsCount: DiscussionsCount {
|
||||
guard let data = conversationRoomListDataFetcherForRooms?.data else {
|
||||
guard let totalCounts = conversationRoomListDataFetcherForRooms?.data?.counts.total else {
|
||||
return .zero
|
||||
}
|
||||
return DiscussionsCount(withRoomListDataCounts: data.counts)
|
||||
return DiscussionsCount(withRoomListDataCounts: totalCounts)
|
||||
}
|
||||
|
||||
public var totalVisibleItemCount: Int {
|
||||
return visibleFetchers.reduce(0, { $0 + ($1.data?.counts.numberOfRooms ?? 0) })
|
||||
}
|
||||
|
||||
public func paginate(inSection section: RecentsListServiceSection) {
|
||||
guard let fetcher = fetcher(forSection: section) else {
|
||||
return
|
||||
}
|
||||
guard let data = fetcher.data else {
|
||||
// first page is not fetched yet
|
||||
return
|
||||
}
|
||||
guard data.paginationOptions != .none else {
|
||||
// pagination is not enabled
|
||||
return
|
||||
}
|
||||
fetcher.paginate()
|
||||
}
|
||||
|
||||
public func updateMode(_ mode: RecentsDataSourceMode) {
|
||||
self.mode = mode
|
||||
if let fetcher = favoritedRoomListDataFetcher {
|
||||
@@ -266,9 +264,20 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
}
|
||||
|
||||
public func stop() {
|
||||
removeSessionStateObserver()
|
||||
removeRiotSettingsObserver()
|
||||
removeAllDelegates()
|
||||
allFetchers.forEach({ $0.stop() })
|
||||
|
||||
invitedRoomListDataFetcher = nil
|
||||
favoritedRoomListDataFetcher = nil
|
||||
directRoomListDataFetcherForHome = nil
|
||||
directRoomListDataFetcherForPeople = nil
|
||||
conversationRoomListDataFetcherForHome = nil
|
||||
conversationRoomListDataFetcherForRooms = nil
|
||||
lowPriorityRoomListDataFetcher = nil
|
||||
serverNoticeRoomListDataFetcher = nil
|
||||
suggestedRoomListDataFetcher = nil
|
||||
}
|
||||
|
||||
// MARK: - Delegate
|
||||
@@ -316,6 +325,32 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Session State Observers
|
||||
|
||||
private func addSessionStateObserver() {
|
||||
NotificationCenter.default.addObserver(self,
|
||||
selector: #selector(sessionStateUpdated(_:)),
|
||||
name: .mxSessionStateDidChange,
|
||||
object: nil)
|
||||
}
|
||||
|
||||
private func removeSessionStateObserver() {
|
||||
NotificationCenter.default.removeObserver(self,
|
||||
name: .mxSessionStateDidChange,
|
||||
object: nil)
|
||||
}
|
||||
|
||||
@objc
|
||||
private func sessionStateUpdated(_ notification: Notification) {
|
||||
guard let session = notification.object as? MXSession else {
|
||||
return
|
||||
}
|
||||
guard session == self.session else {
|
||||
return
|
||||
}
|
||||
createFetchers()
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private var shouldShowInvited: Bool {
|
||||
@@ -360,6 +395,44 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
return fetcherTypesForMode[mode]?.contains(.suggested) ?? false
|
||||
}
|
||||
|
||||
private func fetcher(forSection section: RecentsListServiceSection) -> MXRoomListDataFetcher? {
|
||||
switch section {
|
||||
case .invited:
|
||||
return invitedRoomListDataFetcher
|
||||
case .favorited:
|
||||
return favoritedRoomListDataFetcher
|
||||
case .people:
|
||||
return directRoomListDataFetcher
|
||||
case .conversation:
|
||||
return conversationRoomListDataFetcher
|
||||
case .lowPriority:
|
||||
return lowPriorityRoomListDataFetcher
|
||||
case .serverNotice:
|
||||
return serverNoticeRoomListDataFetcher
|
||||
case .suggested:
|
||||
return suggestedRoomListDataFetcher
|
||||
}
|
||||
}
|
||||
|
||||
private func section(forFetcher fetcher: MXRoomListDataFetcher) -> RecentsListServiceSection? {
|
||||
if fetcher === invitedRoomListDataFetcher {
|
||||
return .invited
|
||||
} else if fetcher === favoritedRoomListDataFetcher {
|
||||
return .favorited
|
||||
} else if fetcher === directRoomListDataFetcher {
|
||||
return .people
|
||||
} else if fetcher === conversationRoomListDataFetcher {
|
||||
return .conversation
|
||||
} else if fetcher === lowPriorityRoomListDataFetcher {
|
||||
return .lowPriority
|
||||
} else if fetcher === serverNoticeRoomListDataFetcher {
|
||||
return .serverNotice
|
||||
} else if fetcher === suggestedRoomListDataFetcher {
|
||||
return .suggested
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
private func createCommonRoomListDataFetcher(withDataTypes dataTypes: MXRoomSummaryDataTypes = [],
|
||||
onlySuggested: Bool = false,
|
||||
paginate: Bool = true) -> MXRoomListDataFetcher {
|
||||
@@ -374,7 +447,7 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
|
||||
let fetchOptions = MXRoomListDataFetchOptions(filterOptions: filterOptions,
|
||||
sortOptions: sortOptions,
|
||||
async: false)
|
||||
async: true)
|
||||
let fetcher = session.roomListDataManager.fetcher(withOptions: fetchOptions)
|
||||
if paginate {
|
||||
fetcher.addDelegate(self)
|
||||
@@ -416,6 +489,16 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
}
|
||||
|
||||
private func createFetchers() {
|
||||
guard fetchersCreated == false else {
|
||||
removeSessionStateObserver()
|
||||
return
|
||||
}
|
||||
guard let session = session else {
|
||||
return
|
||||
}
|
||||
guard session.isEventStreamInitialised else {
|
||||
return
|
||||
}
|
||||
if !hideInvitedSection {
|
||||
invitedRoomListDataFetcher = createCommonRoomListDataFetcher(withDataTypes: [.invited])
|
||||
}
|
||||
@@ -427,6 +510,9 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
lowPriorityRoomListDataFetcher = createCommonRoomListDataFetcher(withDataTypes: [.lowPriority])
|
||||
serverNoticeRoomListDataFetcher = createCommonRoomListDataFetcher(withDataTypes: [.serverNotice])
|
||||
suggestedRoomListDataFetcher = createCommonRoomListDataFetcher(onlySuggested: true)
|
||||
|
||||
fetchersCreated = true
|
||||
removeSessionStateObserver()
|
||||
}
|
||||
|
||||
private func updateDirectFetcher(_ fetcher: MXRoomListDataFetcher, for mode: RecentsDataSourceMode) {
|
||||
@@ -473,7 +559,10 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
}
|
||||
|
||||
private func notifyDataChange(on fetcher: MXRoomListDataFetcher) {
|
||||
multicastDelegate.invoke({ $0.serviceDidChangeData(self) })
|
||||
if let section = section(forFetcher: fetcher) {
|
||||
multicastDelegate.invoke { $0.recentsListServiceDidChangeData?(self, forSection: section) }
|
||||
}
|
||||
multicastDelegate.invoke { $0.recentsListServiceDidChangeData?(self) }
|
||||
}
|
||||
|
||||
deinit {
|
||||
|
||||
@@ -170,6 +170,10 @@ public class MockRecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
public func paginate(inSection section: RecentsListServiceSection) {
|
||||
// no-op
|
||||
}
|
||||
|
||||
public func updateMode(_ mode: RecentsDataSourceMode) {
|
||||
self.mode = mode
|
||||
notifyDataChange()
|
||||
@@ -210,7 +214,7 @@ public class MockRecentsListService: NSObject, RecentsListServiceProtocol {
|
||||
}
|
||||
|
||||
private func notifyDataChange() {
|
||||
multicastDelegate.invoke({ $0.serviceDidChangeData(self) })
|
||||
multicastDelegate.invoke({ $0.recentsListServiceDidChangeData?(self) })
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ public class MockRoomListData: MXRoomListData {
|
||||
public init(withRooms rooms: [MXRoomSummaryProtocol]) {
|
||||
super.init(rooms: rooms,
|
||||
counts: MXStoreRoomListDataCounts(withRooms: rooms,
|
||||
totalRoomsCount: rooms.count),
|
||||
total: nil),
|
||||
paginationOptions: .none)
|
||||
}
|
||||
|
||||
|
||||
@@ -21,5 +21,11 @@ public protocol RecentsListServiceDelegate: AnyObject {
|
||||
|
||||
/// Delegate method to be called when service data updated
|
||||
/// - Parameter service: service object
|
||||
func serviceDidChangeData(_ service: RecentsListServiceProtocol)
|
||||
@objc optional func recentsListServiceDidChangeData(_ service: RecentsListServiceProtocol)
|
||||
|
||||
/// Delegate method to be called when a specific section data updated. Called for each updated section before `recentsListServiceDidChangeData` if implemented.
|
||||
/// - Parameter service: service object
|
||||
/// - Parameter section: updated section
|
||||
@objc optional func recentsListServiceDidChangeData(_ service: RecentsListServiceProtocol,
|
||||
forSection section: RecentsListServiceSection)
|
||||
}
|
||||
|
||||
@@ -87,6 +87,11 @@ public protocol RecentsListServiceProtocol {
|
||||
/// Stop service. Do not use after stopping.
|
||||
func stop()
|
||||
|
||||
// MARK: Pagination
|
||||
|
||||
/// Paginate in the given section.
|
||||
func paginate(inSection section: RecentsListServiceSection)
|
||||
|
||||
// MARK: - Delegate
|
||||
|
||||
/// Add delegate instance for the service
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// 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
|
||||
|
||||
@objc
|
||||
public enum RecentsListServiceSection: Int {
|
||||
case invited
|
||||
case favorited
|
||||
case people
|
||||
case conversation
|
||||
case lowPriority
|
||||
case serverNotice
|
||||
case suggested
|
||||
}
|
||||
@@ -55,7 +55,7 @@ class FindYourContactsFooterView: UIView, NibLoadable, Themable {
|
||||
button.layer.cornerRadius = 8
|
||||
|
||||
titleLabel.text = VectorL10n.findYourContactsTitle
|
||||
messageLabel.text = VectorL10n.findYourContactsMessage(BuildSettings.bundleDisplayName)
|
||||
messageLabel.text = VectorL10n.findYourContactsMessage(AppInfo.current.displayName)
|
||||
button.setTitle(VectorL10n.findYourContactsButtonTitle, for: .normal)
|
||||
footerLabel.text = VectorL10n.findYourContactsFooter
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
RecentsDataSource *recentsDataSource;
|
||||
}
|
||||
|
||||
@property (nonatomic, strong) MXThrottler *tableViewPaginationThrottler;
|
||||
|
||||
@end
|
||||
|
||||
@implementation FavouritesViewController
|
||||
@@ -42,6 +44,7 @@
|
||||
self.enableDragging = YES;
|
||||
|
||||
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenFavourites];
|
||||
self.tableViewPaginationThrottler = [[MXThrottler alloc] initWithMinimumDelay:0.1];
|
||||
}
|
||||
|
||||
- (void)viewDidLoad
|
||||
@@ -121,6 +124,24 @@
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
if ([super respondsToSelector:@selector(tableView:willDisplayCell:forRowAtIndexPath:)])
|
||||
{
|
||||
[super tableView:tableView willDisplayCell:cell forRowAtIndexPath:indexPath];
|
||||
}
|
||||
|
||||
[self.tableViewPaginationThrottler throttle:^{
|
||||
NSInteger section = indexPath.section;
|
||||
NSInteger numberOfRowsInSection = [tableView numberOfRowsInSection:section];
|
||||
if (tableView.numberOfSections > section
|
||||
&& indexPath.row == numberOfRowsInSection - 1)
|
||||
{
|
||||
[self->recentsDataSource paginateInSection:section];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - Empty view management
|
||||
|
||||
- (void)updateEmptyView
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
roomId = event.roomId;
|
||||
|
||||
// Title is here the file name stored in event body
|
||||
title = [event.content[@"body"] isKindOfClass:[NSString class]] ? event.content[@"body"] : nil;
|
||||
title = [event.content[kMXMessageBodyKey] isKindOfClass:[NSString class]] ? event.content[kMXMessageBodyKey] : nil;
|
||||
|
||||
// Check attachment if any
|
||||
if ([searchDataSource.eventFormatter isSupportedAttachment:event])
|
||||
@@ -128,7 +128,7 @@
|
||||
{
|
||||
MXEvent *event = searchResult.result;
|
||||
NSString *msgtype;
|
||||
MXJSONModelSetString(msgtype, event.content[@"msgtype"]);
|
||||
MXJSONModelSetString(msgtype, event.content[kMXMessageTypeKey]);
|
||||
|
||||
if ([msgtype isEqualToString:kMXMessageTypeImage])
|
||||
{
|
||||
@@ -142,10 +142,6 @@
|
||||
{
|
||||
return [UIImage imageNamed:@"file_video_icon"];
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeLocation])
|
||||
{
|
||||
// Not supported yet
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeFile])
|
||||
{
|
||||
return [UIImage imageNamed:@"file_doc_icon"];
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
@property (nonatomic, strong) CrossSigningSetupCoordinatorBridgePresenter *crossSigningSetupCoordinatorBridgePresenter;
|
||||
|
||||
@property (nonatomic, assign, readwrite) BOOL roomListDataReady;
|
||||
@property (nonatomic, strong) MXThrottler *collectionViewPaginationThrottler;
|
||||
|
||||
@property(nonatomic) SpaceMembersCoordinatorBridgePresenter *spaceMembersCoordinatorBridgePresenter;
|
||||
|
||||
@@ -70,6 +71,7 @@
|
||||
selectedCollectionViewContentOffset = -1;
|
||||
|
||||
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenHome];
|
||||
self.collectionViewPaginationThrottler = [[MXThrottler alloc] initWithMinimumDelay:0.1];
|
||||
}
|
||||
|
||||
- (void)viewDidLoad
|
||||
@@ -619,6 +621,20 @@
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
[self.collectionViewPaginationThrottler throttle:^{
|
||||
NSInteger collectionViewSection = indexPath.section;
|
||||
NSInteger numberOfItemsInSection = [collectionView numberOfItemsInSection:collectionViewSection];
|
||||
if (collectionView.numberOfSections > collectionViewSection
|
||||
&& indexPath.item == numberOfItemsInSection - 1)
|
||||
{
|
||||
NSInteger tableViewSection = collectionView.tag;
|
||||
[self->recentsDataSource paginateInSection:tableViewSection];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - UICollectionViewDelegate
|
||||
|
||||
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
|
||||
|
||||
@@ -492,8 +492,15 @@
|
||||
"call_consulting_with_user" = "Bei %@ anfragen";
|
||||
"microphone_access_not_granted_for_voice_message" = "%@ fehlt die Berechtigung, für Sprachnachrichten auf das Mikrofon zuzugreifen";
|
||||
"message_reply_to_sender_sent_a_voice_message" = "hat eine Sprachnachricht gesendet.";
|
||||
"attachment_size_prompt_title" = "Größe zum Senden";
|
||||
"attachment_size_prompt_title" = "Zum Senden die Größe auswählen";
|
||||
"attachment_large_with_resolution" = "Groß %@ (~%@)";
|
||||
"attachment_medium_with_resolution" = "Mittel %@ (~%@)";
|
||||
"attachment_small_with_resolution" = "Klein %@ (~%@)";
|
||||
"attachment_size_prompt_message" = "Du kannst dies in den Einstellungen ausschalten.";
|
||||
"attachment_size_prompt_message" = "Dies kannst du in den Einstellungen abschalten.";
|
||||
"auth_reset_password_error_not_found" = "Nicht gefunden";
|
||||
"auth_username_in_use" = "Benutzername bereits verwendet";
|
||||
"auth_invalid_user_name" = "Ungültiger Benutzername";
|
||||
"rename" = "Umbenennen";
|
||||
"attachment_unsupported_preview_message" = "Dieser Dateityp wird nicht unterstützt.";
|
||||
"attachment_unsupported_preview_title" = "Vorschau kann nicht angezeigt werden";
|
||||
"auth_reset_password_error_unauthorized" = "Nicht Authorisiert";
|
||||
|
||||
@@ -258,6 +258,7 @@
|
||||
"message_reply_to_sender_sent_an_audio_file" = "sent an audio file.";
|
||||
"message_reply_to_sender_sent_a_voice_message" = "sent a voice message.";
|
||||
"message_reply_to_sender_sent_a_file" = "sent a file.";
|
||||
"message_reply_to_sender_sent_their_location" = "has shared their location.";
|
||||
"message_reply_to_message_to_reply_to_prefix" = "In reply to";
|
||||
|
||||
// Room members
|
||||
|
||||
@@ -470,6 +470,11 @@
|
||||
"attachment_small_with_resolution" = "Petit %@ (~%@)";
|
||||
"attachment_size_prompt_message" = "Vous pouvez désactiver ceci dans les paramètres.";
|
||||
"attachment_size_prompt_title" = "Préciser la taille pour l’envoi";
|
||||
"auth_username_in_use" = "";
|
||||
"auth_username_in_use" = "Nom d’utilisateur déjà pris";
|
||||
"auth_invalid_user_name" = "Nom d’utilisateur invalide";
|
||||
"rename" = "Renommer";
|
||||
"auth_reset_password_error_not_found" = "Non trouvé";
|
||||
"auth_reset_password_error_unauthorized" = "Non autorisé";
|
||||
"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é)";
|
||||
|
||||
@@ -345,7 +345,7 @@
|
||||
// Country picker
|
||||
"country_picker_title" = "Pilih sebuah negara";
|
||||
"microphone_access_not_granted_for_voice_message" = "Pesan suara membutuhkan akses ke Mikrofon tetapi %@ tidak memiliki izin untuk menggunakannya";
|
||||
"local_contacts_access_discovery_warning" = "Untuk menemukan kontak Anda yang sudah menggunakan Matrix, %@ dapat mengirim alamat email dan nomor telepon di kontak Anda ke server identitas Matrix yang Anda pilih. Di mana saja yang didukung, data personal akan di-hash sebelum dikirim - mohon cek kebijakan privasi identitas server Anda untuk detail lainnya.";
|
||||
"local_contacts_access_discovery_warning" = "Untuk menemukan kontak Anda yang sudah menggunakan Matrix, %@ dapat mengirim alamat email dan nomor telepon di kontak Anda ke server identitas Matrix yang Anda pilih. Di mana saja yang didukung, data personal akan di-hash sebelum dikirim — mohon cek kebijakan privasi identitas server Anda untuk detail lainnya.";
|
||||
"local_contacts_access_discovery_warning_title" = "Penemuan pengguna";
|
||||
"local_contacts_access_not_granted" = "Penemuan pengguna dari kontak lokal membutuhkan akses ke kontak Anda tetapi %@ tidak memiliki izin untuk menggunakannya";
|
||||
"microphone_access_not_granted_for_call" = "Panggilan membutuhkan akses ke Mikrofon tetapi %@ tidak memiliki izin untuk menggunakannya";
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -1 +1,545 @@
|
||||
|
||||
|
||||
"login_error_login_email_not_yet" = "Zatiaľ ste neklikli na odkaz zaslaný emailom";
|
||||
"login_error_user_in_use" = "Toto používateľské meno sa už používa";
|
||||
"login_error_limit_exceeded" = "Bol prekročený maximálny počet požiadaviek";
|
||||
"room_left_for_dm" = "Odišli ste";
|
||||
|
||||
// Room creation
|
||||
"room_creation_name_title" = "Názov miestnosti:";
|
||||
"account_msisdn_validation_title" = "Čaká sa na overenie";
|
||||
"account_email_validation_title" = "Čaká sa na overenie";
|
||||
|
||||
// Account
|
||||
"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_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";
|
||||
"room_event_encryption_info_event_session_id" = "ID relácie\n";
|
||||
"room_event_encryption_info_event_user_id" = "ID používateľa:\n";
|
||||
"room_event_encryption_info_event" = "Informácie o udalosti\n";
|
||||
"device_details_rename_prompt_title" = "Názov relácie";
|
||||
"device_details_last_seen" = "Naposledy videné\n";
|
||||
"device_details_name" = "Verejný názov\n";
|
||||
|
||||
// Devices
|
||||
"device_details_title" = "Informácie o relácii\n";
|
||||
"room_displayname_all_other_members_left" = "%@ (Odišiel)";
|
||||
|
||||
// room display name
|
||||
"room_displayname_empty_room" = "Prázdna miestnosť";
|
||||
"notice_invalid_attachment" = "neplatná príloha";
|
||||
"notice_file_attachment" = "súborová attachment";
|
||||
"notice_video_attachment" = "video príloha";
|
||||
"notice_audio_attachment" = "zvuková príloha";
|
||||
"notice_image_attachment" = "obrázková príloha";
|
||||
"notice_encrypted_message" = "Šifrovaná správa";
|
||||
"notice_room_created_for_dm" = "%@ sa pripojil/a.";
|
||||
"end_call" = "Ukončiť hovor";
|
||||
"reject_call" = "Odmietnuť hovor";
|
||||
"show_details" = "Zobraziť podrobnosti";
|
||||
"cancel_download" = "Zrušiť sťahovanie";
|
||||
"cancel_upload" = "Zrušiť nahrávanie";
|
||||
"select_all" = "Vybrať všetko";
|
||||
"start_chat" = "Začať konverzáciu";
|
||||
"sign_up" = "Zaregistrovať sa";
|
||||
"login_error_resource_limit_exceeded_contact_button" = "Kontaktovať správcu";
|
||||
"register_error_title" = "Registrácia zlyhala";
|
||||
"login_invalid_param" = "Neplatný parameter";
|
||||
"login_error_bad_json" = "Chybné údaje vo formáte JSON";
|
||||
"login_error_forbidden" = "Neplatné používateľské meno/heslo";
|
||||
|
||||
// Room Screen
|
||||
|
||||
// general errors
|
||||
|
||||
// Home Screen
|
||||
|
||||
// Last seen time
|
||||
|
||||
// call events
|
||||
|
||||
/* -*-
|
||||
Automatic localization for en
|
||||
|
||||
The following key/value pairs were extracted from the android i18n file:
|
||||
/console/src/main/res/values/strings.xml.
|
||||
*/
|
||||
|
||||
|
||||
// titles
|
||||
|
||||
// button names
|
||||
"ok" = "OK";
|
||||
"login_error_title" = "Prihlásenie zlyhalo";
|
||||
"login_prompt_email_token" = "Zadajte svoj e-mailový overovací token:";
|
||||
"login_email_info" = "Zadanie e-mailovej adresy umožní ostatným používateľom ľahšie vás nájsť v službe Matrix a umožní vám v budúcnosti obnoviť heslo.";
|
||||
"login_display_name_placeholder" = "Zobrazované meno (napr. Fero Novák)";
|
||||
"login_user_id_placeholder" = "Matrix ID (napr. @fero:matrix.org alebo fero)";
|
||||
"login_identity_server_info" = "Matrix poskytuje servery totožnosti na sledovanie, ktoré e-maily atď. patria k jednotlivým Matrix ID. V súčasnosti existuje iba stránka https://matrix.org.";
|
||||
"login_home_server_info" = "Váš domovský server ukladá všetky vaše konverzácie a údaje o účte";
|
||||
"ssl_fingerprint_hash" = "Odtlačok (%s):";
|
||||
"call_more_actions_dialpad" = "Číselník";
|
||||
"call_ended" = "Hovor ukončený";
|
||||
|
||||
// gcm section
|
||||
"settings_config_home_server" = "Domovský server: %@";
|
||||
"notification_settings_custom_sound" = "Vlastný zvuk";
|
||||
"notification_settings_always_notify" = "Vždy oznamovať";
|
||||
"notification_settings_never_notify" = "Nikdy neoznamovať";
|
||||
|
||||
// members list Screen
|
||||
|
||||
// accounts list Screen
|
||||
|
||||
// image size selection
|
||||
|
||||
// invitation members list Screen
|
||||
|
||||
// room creation dialog Screen
|
||||
|
||||
// room info dialog Screen
|
||||
|
||||
// room details dialog screen
|
||||
"room_details_title" = "Podrobnosti o miestnosti";
|
||||
"num_members_other" = "%@ používatelia";
|
||||
"num_members_one" = "%@ používateľ";
|
||||
"create_account" = "Vytvoriť účet";
|
||||
"create_room" = "Vytvoriť miestnosť";
|
||||
"notice_room_leave_by_you" = "Odišli ste";
|
||||
"notice_room_join_by_you" = "Vstúpili ste";
|
||||
"notice_room_leave" = "%@ odišiel/a";
|
||||
"notice_room_join" = "%@ sa pripojil/a";
|
||||
"language_picker_default_language" = "Predvolené (%@)";
|
||||
"user_id_placeholder" = "napr.: @fero:domovskyserver";
|
||||
"power_level" = "Úroveň právomoci";
|
||||
|
||||
// Others
|
||||
"user_id_title" = "ID používateľa:";
|
||||
"e2e_passphrase_create" = "Vytvoriť heslo";
|
||||
"e2e_passphrase_confirm" = "Potvrďte heslo";
|
||||
"e2e_passphrase_enter" = "Zadajte heslo";
|
||||
|
||||
// Search
|
||||
"search_no_results" = "Žiadne výsledky";
|
||||
"contact_local_contacts" = "Lokálne kontakty";
|
||||
|
||||
// Contacts
|
||||
"contact_mx_users" = "Používatelia Matrix";
|
||||
"attachment_multiselection_original" = "Aktuálna veľkosť";
|
||||
"login_optional_field" = "voliteľné";
|
||||
"ssl_remain_offline" = "Ignorovať";
|
||||
"ssl_logout_account" = "Odhlásiť sa";
|
||||
"call_ringing" = "Vyzváňanie…";
|
||||
|
||||
// Settings keys
|
||||
|
||||
// call string
|
||||
"call_connecting" = "Pripájanie…";
|
||||
"notification_settings_sender_hint" = "@pouzivatel:domena.sk";
|
||||
|
||||
// Settings screen
|
||||
"settings_title_config" = "Nastavenie";
|
||||
"unban" = "Zrušiť zákaz";
|
||||
"ban" = "Zakázať";
|
||||
"kick" = "Vylúčiť";
|
||||
"invite" = "Pozvať";
|
||||
"membership_ban" = "Vylúčený";
|
||||
"membership_invite" = "Pozvaní";
|
||||
"login" = "Prihlásiť sa";
|
||||
|
||||
// actions
|
||||
"action_logout" = "Odhlásiť sa";
|
||||
"rename" = "Premenovať";
|
||||
"view" = "Zobraziť";
|
||||
"delete" = "Vymazať";
|
||||
"share" = "Zdieľať";
|
||||
"redact" = "Odstrániť";
|
||||
"resend" = "Odoslať znovu";
|
||||
"copy_button_name" = "Kopírovať";
|
||||
"send" = "Odoslať";
|
||||
"leave" = "Opustiť";
|
||||
"save" = "Uložiť";
|
||||
"cancel" = "Zrušiť";
|
||||
"private" = "Súkromné";
|
||||
"public" = "Verejné";
|
||||
"default" = "predvolené";
|
||||
"error" = "Chyba";
|
||||
"unsent" = "Neodoslané";
|
||||
"offline" = "nedostupný";
|
||||
"e2e_export" = "Exportovať";
|
||||
"e2e_import" = "Importovať";
|
||||
"format_time_d" = "d";
|
||||
"format_time_h" = "h";
|
||||
"format_time_m" = "m";
|
||||
|
||||
// Time
|
||||
"format_time_s" = "s";
|
||||
"group_section" = "Skupiny";
|
||||
|
||||
// Groups
|
||||
"group_invite_section" = "Pozvánky";
|
||||
"attachment_e2e_keys_import" = "Importovať...";
|
||||
"room_creation_participants_title" = "Účastníci:";
|
||||
"room_event_encryption_verify_ok" = "Overiť";
|
||||
"room_event_encryption_info_unverify" = "Zrušiť overenie";
|
||||
"room_event_encryption_info_verify" = "Overiť...";
|
||||
"room_event_encryption_info_device_blocked" = "Na čiernej listine";
|
||||
"room_event_encryption_info_device_verified" = "Overené";
|
||||
"room_event_encryption_info_device_verification" = "Overenie\n";
|
||||
"room_event_encryption_info_device_id" = "ID\n";
|
||||
"room_event_encryption_info_event_none" = "žiadne";
|
||||
"room_event_encryption_info_event_unencrypted" = "nezašifrované";
|
||||
"room_event_encryption_info_event_algorithm" = "Algoritmus\n";
|
||||
"device_details_delete_prompt_title" = "Overenie";
|
||||
"device_details_identifier" = "ID\n";
|
||||
|
||||
// Settings
|
||||
"settings" = "Nastavenia";
|
||||
"notice_sticker" = "nálepka";
|
||||
"unignore" = "Prestať ignorovať";
|
||||
"ignore" = "Ignorovať";
|
||||
"mention" = "Zmieniť sa";
|
||||
"submit" = "Odoslať";
|
||||
"retry" = "Skúsiť znovu";
|
||||
"continue" = "Pokračovať";
|
||||
"close" = "Zavrieť";
|
||||
"back" = "Späť";
|
||||
"abort" = "Prerušiť";
|
||||
"yes" = "Áno";
|
||||
|
||||
// Action
|
||||
"no" = "Nie";
|
||||
"login_desktop_device" = "Desktop";
|
||||
"login_tablet_device" = "Tablet";
|
||||
"login_mobile_device" = "Mobil";
|
||||
"login_leave_fallback" = "Zrušiť";
|
||||
"login_home_server_title" = "URL domovského servera:";
|
||||
"login_email_placeholder" = "Emailová adresa";
|
||||
"login_password_placeholder" = "Heslo";
|
||||
"login_identity_server_title" = "URL adresa servera totožností:";
|
||||
"login_server_url_placeholder" = "URL (napr. https://matrix.org)";
|
||||
|
||||
// Login Screen
|
||||
"login_create_account" = "Vytvoriť účet:";
|
||||
/* *********************** */
|
||||
/* iOS specific */
|
||||
/* *********************** */
|
||||
|
||||
"matrix" = "Matrix";
|
||||
"notification_settings_select_room" = "Vybrať miestnosť";
|
||||
"notification_settings_enable_notifications_warning" = "Všetky oznámenia sú v súčasnosti vypnuté pre všetky zariadenia.";
|
||||
"notification_settings_enable_notifications" = "Povoliť oznámenia";
|
||||
|
||||
// Notification settings screen
|
||||
"notification_settings_disable_all" = "Zakázať všetky oznámenia";
|
||||
"settings_title_notifications" = "Oznámenia";
|
||||
"notification_settings_room_rule_title" = "Miestnosť: '%@'";
|
||||
"auth_username_in_use" = "Používateľské meno sa už používa";
|
||||
"login_error_must_start_http" = "URL adresa musí začínať http[s]://";
|
||||
"auth_reset_password_error_not_found" = "Nenájdené";
|
||||
"notice_unsupported_attachment" = "Nepodporovaná príloha: %@";
|
||||
"notice_encryption_enabled_unknown_algorithm" = "%1$@ zapol end-to-end šifrovanie (nerozpoznaný algoritmus %2$@).";
|
||||
"notice_encryption_enabled_ok" = "%@ zapol end-to-end šifrovanie.";
|
||||
"notice_room_related_groups" = "Skupiny pridružené k tejto miestnosti sú: %@";
|
||||
"notice_room_aliases_for_dm" = "Aliasy sú: %@";
|
||||
"notice_room_aliases" = "Aliasy miestnosti sú: %@";
|
||||
"notice_room_power_level_acting_requirement" = "Minimálne úrovne oprávnenia, ktoré musí mať používateľ pred konaním, sú:";
|
||||
"notice_room_power_level_intro" = "Úrovne oprávnenia členov miestnosti sú:";
|
||||
"notice_room_power_level_intro_for_dm" = "Úrovne oprávnenia členov sú:";
|
||||
"notice_room_join_rule_public_by_you_for_dm" = "Zverejnili ste ju.";
|
||||
"notice_room_join_rule_public_by_you" = "Túto miestnosť ste zverejnili.";
|
||||
"notification_settings_global_info" = "Nastavenia oznámení sa ukladajú do vášho používateľského účtu a sú zdieľané medzi všetkými klientmi, ktorí ich podporujú (vrátane oznámení na ploche).\n\nPravidlá sa uplatňujú v poradí; prvé pravidlo, ktoré sa zhoduje, určuje výsledok správy.\nTakže: Oznámenia o správe sú dôležitejšie ako oznámenia na miestnosť, ktoré sú dôležitejšie ako oznámenia na odosielateľa.\nPri viacerých pravidlách rovnakého druhu má prednosť to, ktoré sa zhoduje ako prvé v zozname.";
|
||||
|
||||
// contacts list screen
|
||||
"invitation_message" = "Rád by som sa s vami porozprával pomocou Matrixu. Viac informácií nájdete na webovej stránke http://matrix.org.";
|
||||
"notice_room_history_visible_to_members_from_joined_point_by_you" = "Zviditeľnili ste budúcu históriu miestnosti pre všetkých členov miestnosti, od okamihu ich vstupu.";
|
||||
"notice_room_history_visible_to_members_from_invited_point_by_you_for_dm" = "Zviditeľnili ste budúce správy pre všetkých, od okamihu pozvania.";
|
||||
"notice_room_history_visible_to_members_from_invited_point_by_you" = "Zviditeľnili ste budúcu históriu miestnosti pre všetkých členov miestnosti, od okamihu pozvania.";
|
||||
"notice_room_history_visible_to_members_by_you_for_dm" = "Zviditeľnili ste budúce správy pre všetkých členov miestnosti.";
|
||||
"notice_room_history_visible_to_members_by_you" = "Zviditeľnili ste budúcu históriu miestnosti pre všetkých jej členov.";
|
||||
"notice_room_history_visible_to_anyone_by_you" = "Sprístupnili ste budúcu históriu miestnosti každému.";
|
||||
"notice_encryption_enabled_unknown_algorithm_by_you" = "Zapli ste end-to-end šifrovanie (nerozpoznaný algoritmus %@).";
|
||||
"notice_encryption_enabled_ok_by_you" = "Zapli ste end-to-end šifrovanie.";
|
||||
"notice_room_created_by_you_for_dm" = "Vstúpili ste.";
|
||||
"notice_room_created_by_you" = "Vytvorili ste a nastavili ste miestnosť.";
|
||||
"notice_profile_change_redacted_by_you" = "Aktualizovali ste svoj profil %@";
|
||||
"notice_room_topic_removed_by_you" = "Odstránili ste tému";
|
||||
"notice_room_name_removed_by_you_for_dm" = "Odstránili ste názov";
|
||||
"notice_room_name_removed_by_you" = "Odstránili ste názov miestnosti";
|
||||
"notice_conference_call_request_by_you" = "Požiadali ste o VoIP konferenciu";
|
||||
"notice_declined_video_call_by_you" = "Odmietli ste hovor";
|
||||
"notice_ended_video_call_by_you" = "Ukončili ste hovor";
|
||||
"notice_room_name_changed_by_you_for_dm" = "Zmenili ste svoje meno na %@.";
|
||||
"notice_room_name_changed_by_you" = "Zmenili ste názov miestnosti na %@.";
|
||||
"notice_topic_changed_by_you" = "Zmenili ste tému na \"%@\".";
|
||||
"notice_display_name_removed_by_you" = "Odstránili ste svoje zobrazované meno";
|
||||
"notice_display_name_changed_from_by_you" = "Zmenili ste si zobrazované meno z %@ na %@";
|
||||
"notice_display_name_set_by_you" = "Nastavili ste si zobrazované meno na %@";
|
||||
"notice_avatar_url_changed_by_you" = "Zmenili ste si obrázok v profile";
|
||||
"notice_room_withdraw_by_you" = "Odvolali ste pozvánku pre %@";
|
||||
"notice_room_ban_by_you" = "Zakázali ste používateľa %@";
|
||||
"notice_room_unban_by_you" = "Zrušili ste zákaz pre %@";
|
||||
"notice_room_kick_by_you" = "Vylúčili ste používateľa %@";
|
||||
"notice_room_reject_by_you" = "Odmietli ste pozvanie";
|
||||
"notice_room_third_party_revoked_invite_by_you_for_dm" = "Odvolali ste pozvánku pre %@";
|
||||
"notice_room_third_party_revoked_invite_by_you" = "Odvolali ste pozvánku pre %@ do miestnosti";
|
||||
"notice_room_third_party_registered_invite_by_you" = "Prijali ste pozvanie do %@";
|
||||
"notice_room_third_party_invite_by_you_for_dm" = "Pozvali ste používateľa %@";
|
||||
"notice_room_third_party_invite_by_you" = "Odoslali ste pozvánku používateľovi %@ do miestnosti";
|
||||
"notice_room_invite_you" = "%@ vás pozval";
|
||||
|
||||
// Notice Events with "You"
|
||||
"notice_room_invite_by_you" = "Pozvali ste %@";
|
||||
"notice_conference_call_finished" = "Skončila sa VoIP konferencia";
|
||||
"notice_conference_call_started" = "Začala sa VoIP konferencia";
|
||||
"notice_conference_call_request" = "%@ požiadal/a o VoIP konferenciu";
|
||||
"notice_declined_video_call" = "%@ odmietol hovor";
|
||||
"notice_ended_video_call" = "%s ukončil/a hovor";
|
||||
"notice_room_name_changed_for_dm" = "%@ zmenil/a svoje meno na %@.";
|
||||
"notice_room_name_changed" = "%@ zmenil názov miestnosti na %@.";
|
||||
"notice_topic_changed" = "%@ zmenil tému na \"%@\".";
|
||||
"notice_display_name_removed" = "%@ odstránil svoje zobrazované meno";
|
||||
"notice_display_name_changed_from" = "%@ zmenil/a svoje zobrazované meno z %@ na %@";
|
||||
"notice_display_name_set" = "%@ nastavil/a svoje zobrazované meno na %@";
|
||||
"notice_avatar_url_changed" = "%@ zmenil/a svoj obrázok";
|
||||
"notice_room_reason" = ". Dôvod: %@";
|
||||
"notice_room_withdraw" = "%@ odvolal pozvanie od %@";
|
||||
"notice_room_ban" = "%@ zakázal používateľa %@";
|
||||
"notice_room_unban" = "%@ zrušil zákaz pre %@";
|
||||
"notice_room_reject" = "%@ odmietol pozvanie";
|
||||
"notice_room_third_party_revoked_invite_for_dm" = "%@ odvolal pozvánku pre %@";
|
||||
"notice_room_third_party_revoked_invite" = "%@ odvolal pozvánku pre %@, aby sa pripojil k miestnosti";
|
||||
"notice_room_third_party_registered_invite" = "%@ prijal pozvanie do %@";
|
||||
"notice_room_third_party_invite_for_dm" = "%@ pozval %@";
|
||||
"notice_room_third_party_invite" = "%@ poslal pozvánku %@ do miestnosti";
|
||||
|
||||
/* -*-
|
||||
Automatic localization for en
|
||||
|
||||
The following key/value pairs were extracted from the android i18n file:
|
||||
/matrix-sdk/src/main/res/values/strings.xml.
|
||||
*/
|
||||
|
||||
"notice_room_invite" = "%@ pozval %@";
|
||||
|
||||
// Language picker
|
||||
"language_picker_title" = "Vyberte jazyk";
|
||||
|
||||
// Country picker
|
||||
"country_picker_title" = "Vyberte krajnu";
|
||||
"microphone_access_not_granted_for_voice_message" = "Hlasové správy vyžadujú prístup k mikrofónu, ale %@ nemá povolenie na jeho používanie";
|
||||
"local_contacts_access_discovery_warning" = "Ak chcete vyhľadať kontakty, ktoré už používajú Matrix, %@ môže odoslať e-mailové adresy a telefónne čísla z vášho adresára na zvolený server identity Matrix. Ak je to podporované, osobné údaje sa pred odoslaním zahašujú - ďalšie podrobnosti nájdete v zásadách ochrany osobných údajov vášho servera totožností.";
|
||||
"local_contacts_access_discovery_warning_title" = "Vyhľadávanie používateľov";
|
||||
"local_contacts_access_not_granted" = "Zisťovanie používateľov z lokálnych kontaktov vyžaduje prístup k vašim kontaktom, ale %@ nemá oprávnenie na ich používanie";
|
||||
"microphone_access_not_granted_for_call" = "Hovory vyžadujú prístup k mikrofónu, ale %@ nemá povolenie na jeho používanie";
|
||||
|
||||
// Permissions
|
||||
"camera_access_not_granted_for_call" = "Videohovory vyžadujú prístup ku kamere, ale %@ nemá povolenie na jej používanie";
|
||||
"ssl_homeserver_url" = "URL adresa domovského servera: %@";
|
||||
"network_error_not_reachable" = "Skontrolujte prosím pripojenie k sieti";
|
||||
"not_supported_yet" = "Zatiaľ nie je podporované";
|
||||
"error_common_message" = "Vyskytla sa chyba. Skúste to prosím neskôr.";
|
||||
"e2e_passphrase_not_match" = "Prístupové frázy sa musia zhodovať";
|
||||
"e2e_passphrase_empty" = "Prístupová fráza nesmie byť prázdna";
|
||||
"e2e_passphrase_too_short" = "Príliš krátka prístupová fráza (Musí mať minimálne %d znakov)";
|
||||
"e2e_export_prompt" = "Tento proces umožňuje exportovať kľúče od správ, ktoré ste prijali v zašifrovaných miestnostiach, do lokálneho súboru. Tento súbor potom budete môcť v budúcnosti importovať do iného klienta Matrix, takže tento klient bude môcť tieto správy tiež dešifrovať.\nExportovaný súbor umožní komukoľvek, kto si ho môže prečítať, dešifrovať všetky zašifrované správy, ktoré vidíte, preto by ste mali dbať na jeho bezpečnosť.";
|
||||
|
||||
// E2E export
|
||||
"e2e_export_room_keys" = "Exportovať kľúče miestností";
|
||||
"e2e_import_prompt" = "Tento proces umožňuje importovať šifrovacie kľúče, ktoré ste predtým exportovali z iného klienta Matrix. Potom budete môcť dešifrovať všetky správy, ktoré mohol dešifrovať iný klient.\nExportovaný súbor je chránený prístupovou frázou. Tu by ste mali zadať prístupovú frázu, aby ste súbor dešifrovali.";
|
||||
|
||||
// E2E import
|
||||
"e2e_import_room_keys" = "Importovať kľúče miestností";
|
||||
"search_searching" = "Prebieha vyhľadávanie...";
|
||||
"attachment_unsupported_preview_message" = "Tento typ súboru nie je podporovaný.";
|
||||
"attachment_unsupported_preview_title" = "Nie je možné zobraziť náhľad";
|
||||
"attachment_e2e_keys_file_prompt" = "Tento súbor obsahuje šifrovacie kľúče exportované z klienta Matrix.\nChcete zobraziť obsah súboru alebo importovať kľúče, ktoré obsahuje?";
|
||||
"attachment_multiselection_size_prompt" = "Chcete odoslať obrázok ako:";
|
||||
"attachment_cancel_upload" = "Zrušiť nahrávanie?";
|
||||
"attachment_cancel_download" = "Zrušiť sťahovanie?";
|
||||
"attachment_large_with_resolution" = "Veľká %@ (~%@)";
|
||||
"attachment_medium_with_resolution" = "Stredná %@ (~%@)";
|
||||
"attachment_small_with_resolution" = "Malá %@ (~%@)";
|
||||
"attachment_large" = "Veľká (~%@)";
|
||||
"attachment_original" = "Skutočná veľkosť (%@)";
|
||||
"attachment_size_prompt_message" = "Túto funkciu môžete kedykoľvek vypnúť v nastaveniach.";
|
||||
|
||||
// Attachment
|
||||
"attachment_size_prompt" = "Chcete odoslať ako:";
|
||||
"room_member_power_level_prompt" = "Túto zmenu nebudete môcť vrátiť späť, pretože tomuto používateľovi udeľujete rovnakú úroveň moci, akú máte vy.\nSte si istí?";
|
||||
|
||||
// Room members
|
||||
"room_member_ignore_prompt" = "Ste si istí, že chcete skryť všetky správy od tohto používateľa?";
|
||||
"message_reply_to_sender_sent_a_file" = "poslal súbor.";
|
||||
"message_reply_to_sender_sent_a_voice_message" = "poslal/a zvukovú správu.";
|
||||
"message_reply_to_sender_sent_an_audio_file" = "poslal/a zvukový súbor.";
|
||||
"message_reply_to_sender_sent_a_video" = "poslal video.";
|
||||
|
||||
// Reply to message
|
||||
"message_reply_to_sender_sent_an_image" = "poslal obrázok.";
|
||||
"room_left" = "Opustili ste miestnosť";
|
||||
"room_error_timeline_event_not_found" = "Aplikácia sa pokúšala načítať konkrétny bod na časovej osi tejto miestnosti, ale nedokázala ho nájsť";
|
||||
"room_error_timeline_event_not_found_title" = "Nepodarilo sa načítať pozíciu na časovej osi";
|
||||
"room_error_cannot_load_timeline" = "Nepodarilo sa načítať časovú os";
|
||||
"room_error_topic_edition_not_authorized" = "Nie ste oprávnený upraviť tému tejto miestnosti";
|
||||
"room_error_name_edition_not_authorized" = "Nemáte oprávnenie upraviť názov tejto miestnosti";
|
||||
"room_error_join_failed_empty_room" = "V súčasnosti nie je možné znovu vstúpiť do prázdnej miestnosti.";
|
||||
"room_error_join_failed_title" = "Nepodarilo sa vstúpiť do miestnosti";
|
||||
|
||||
// Room
|
||||
"room_please_select" = "Prosím, vyberte si miestnosť";
|
||||
"room_creation_participants_placeholder" = "(napr. @fero:domovskyserver1; @jano:domovskyserver2...)";
|
||||
"room_creation_alias_placeholder_with_homeserver" = "(napr. #foo%@)";
|
||||
"room_creation_alias_placeholder" = "(napr. #foo:napriklad.sk)";
|
||||
"room_creation_alias_title" = "Alias miestnosti:";
|
||||
"account_error_push_not_allowed" = "Oznámenia nie sú povolené";
|
||||
"account_error_msisdn_wrong_description" = "Zdá sa, že toto nie je platné telefónne číslo";
|
||||
"account_error_msisdn_wrong_title" = "Neplatné telefónne číslo";
|
||||
"account_error_email_wrong_description" = "Toto nevyzerá ako platná e-mailová adresa";
|
||||
"account_error_email_wrong_title" = "Neplatná e-mailová adresa";
|
||||
"account_error_matrix_session_is_not_opened" = "Relácia Matrix nie je otvorená";
|
||||
"account_error_picture_change_failed" = "Zmena obrázka sa nepodarila";
|
||||
"account_error_display_name_change_failed" = "Zmena zobrazovaného mena sa nepodarila";
|
||||
"account_msisdn_validation_error" = "Nie je možné overiť telefónne číslo.";
|
||||
"account_msisdn_validation_message" = "Odoslali sme SMS s aktivačným kódom. Zadajte prosím tento kód nižšie.";
|
||||
"account_email_validation_error" = "Nie je možné overiť e-mailovú adresu. Skontrolujte svoj e-mail a kliknite na odkaz, ktorý obsahuje. Po vykonaní tohto kroku kliknite na tlačidlo Pokračovať";
|
||||
"account_email_validation_message" = "Prosím, skontrolujte svoj e-mail a kliknite na odkaz, ktorý obsahuje. Po dokončení tohto kroku kliknite na tlačidlo Pokračovať.";
|
||||
"room_event_encryption_verify_message" = "Ak chcete overiť, či je táto relácia dôveryhodná, kontaktujte jej vlastníka iným spôsobom (napr. osobne alebo telefonicky) a opýtajte sa ho, či kľúč, ktorý vidí v nastaveniach používateľa pre túto reláciu, sa zhoduje s nižšie uvedeným kľúčom:\n\n\tNázov relácie: %@\n\tID relácie: %@\n\tKľúč relácie: %@\n\nAk sa zhoduje, stlačte tlačidlo overiť nižšie. Ak nie, potom túto reláciu zachytáva niekto iný a pravdepodobne budete chcieť namiesto toho stlačiť tlačidlo čiernej listiny.\n\nV budúcnosti bude tento proces overovania sofistikovanejší.";
|
||||
"room_event_encryption_info_block" = "Pridať na čiernu listinu";
|
||||
"room_event_encryption_info_unblock" = "Odstrániť z čiernej listiny";
|
||||
"room_event_encryption_info_device" = "\nInformácie o relácii odosielateľa\n";
|
||||
"room_event_encryption_info_event_identity_key" = "Identifikačný kľúč Curve25519\n";
|
||||
|
||||
// Encryption information
|
||||
"room_event_encryption_info_title" = "Informácie o end-to-end šifrovaní\n\n";
|
||||
"device_details_last_seen_format" = "%@ @ %@\n";
|
||||
"settings_enable_push_notifications" = "Zapnúť push oznámenia";
|
||||
"settings_enable_inapp_notifications" = "Zapnúť oznámenia v aplikácii";
|
||||
"room_displayname_more_than_two_members" = "%@ a %@ ďalší";
|
||||
"room_displayname_two_members" = "%@ a %@";
|
||||
"notice_crypto_error_unknown_inbound_session_id" = "Relácia odosielateľa nám neposlala kľúče pre túto správu.";
|
||||
"notice_crypto_unable_to_decrypt" = "** Nepodarilo sa dešifrovať: %@ **";
|
||||
"notice_room_history_visible_to_members_from_invited_point" = "%@ zviditeľnil/a budúcu históriu miestnosti pre všetkých jej členov od okamihu, keď sú pozvaní.";
|
||||
"notice_room_history_visible_to_members_for_dm" = "%@ zmenil/a nastavenie, aby budúce správy boli viditeľné pre všetkých členov miestnosti.";
|
||||
"notice_room_history_visible_to_members" = "%@ zviditeľnil/a budúcu históriu miestnosti pre všetkých členov miestnosti.";
|
||||
"notice_room_history_visible_to_anyone" = "%@ zviditeľnil/a budúcu históriu miestnosti pre každého.";
|
||||
"notification_settings_by_default" = "Predvolene...";
|
||||
"notification_settings_other_alerts" = "Iné upozornenia";
|
||||
"room_creation_name_placeholder" = "(napr. pracovnaSkupina)";
|
||||
"message_reply_to_message_to_reply_to_prefix" = "V odpovedi na";
|
||||
"notice_in_reply_to" = "V odpovedi na";
|
||||
"notice_room_history_visible_to_members_from_joined_point_for_dm" = "%@ zviditeľnil budúce správy pre všetkých, od okamihu pripojenia.";
|
||||
"notice_room_history_visible_to_members_from_joined_point" = "%@ zviditeľnil budúcu históriu miestnosti pre všetkých členov miestnosti, od okamihu ich vstupu.";
|
||||
"notice_room_history_visible_to_members_from_invited_point_for_dm" = "%@ zviditeľnil budúce správy pre všetkých, od okamihu pozvania.";
|
||||
"notice_error_unknown_event_type" = "Neznámy typ udalosti";
|
||||
"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_event_redacted" = "<redigované%@>";
|
||||
"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_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_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.";
|
||||
|
||||
// unrecognized SSL certificate
|
||||
"ssl_trust" = "Dôverovať";
|
||||
"call_video_with_user" = "Videohovor s %@";
|
||||
"call_voice_with_user" = "Hlasový hovor s %@";
|
||||
"call_more_actions_change_audio_device" = "Zmeniť zvukové zariadenie";
|
||||
"call_more_actions_hold" = "Podržať";
|
||||
"call_holded" = "Podržali ste hovor";
|
||||
"call_remote_holded" = "%@ podržal hovor";
|
||||
"incoming_voice_call" = "Prichádzajúci hlasový hovor";
|
||||
"incoming_video_call" = "Prichádzajúci videohovor";
|
||||
"settings_config_user_id" = "ID používateľa: %@";
|
||||
"settings_config_identity_server" = "Server totožností: %@";
|
||||
"notification_settings_suppress_from_bots" = "Stlmiť oznámenia od botov";
|
||||
"notification_settings_receive_a_call" = "Upozorniť ma, keď mi niekto zavolá";
|
||||
"notification_settings_people_join_leave_rooms" = "Upozorniť ma, keď sa ľudia pridajú alebo opustia miestnosti";
|
||||
"notification_settings_invite_to_a_new_room" = "Upozorniť ma, keď budem pozvaný do novej miestnosti";
|
||||
"notification_settings_just_sent_to_me" = "Upozorniť ma zvukom na správy odoslané len mne";
|
||||
"notification_settings_contain_my_display_name" = "Upozorniť ma zvukom na správy, ktoré obsahujú moje zobrazované meno";
|
||||
"notification_settings_contain_my_user_name" = "Upozorniť ma zvukom na správy, ktoré obsahujú moje používateľské meno";
|
||||
"notification_settings_highlight" = "Zvýrazniť";
|
||||
|
||||
// Login Screen
|
||||
"login_error_already_logged_in" = "Už ste prihlásení";
|
||||
"message_unsaved_changes" = "Máte neuložené zmeny. Opustením sa zrušia.";
|
||||
"membership_leave" = "Odišiel";
|
||||
"notice_room_history_visible_to_members_from_joined_point_by_you_for_dm" = "Zviditeľnili ste budúce správy pre všetkých, od okamihu pripojenia.";
|
||||
"notice_room_kick" = "%@ vylúčil %@";
|
||||
"attachment_medium" = "Stredná (~%@)";
|
||||
"attachment_small" = "Malá (~%@)";
|
||||
"room_no_conference_call_in_encrypted_rooms" = "Konferenčné hovory nie sú podporované v šifrovaných miestnostiach";
|
||||
"room_no_power_to_create_conference_call" = "Aby ste mohli začať konferenciu, musíte mať právo pozývať používateľov do miestnosti";
|
||||
"device_details_delete_prompt_message" = "Táto operácia si vyžaduje dodatočné overenie.\nAk chcete pokračovať, zadajte svoje heslo.";
|
||||
"device_details_rename_prompt_message" = "Verejný názov relácie je viditeľný pre ľudí, s ktorými komunikujete";
|
||||
"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.";
|
||||
// New
|
||||
"notice_room_join_rule_invite" = "%@ vytvoril miestnosť len na pozvanie.";
|
||||
// Old
|
||||
"notice_room_join_rule" = "Pravidlo pripojenia je: %@";
|
||||
"notice_room_created" = "%@ vytvoril a nastavil miestnosť.";
|
||||
"notice_profile_change_redacted" = "%@ aktualizoval svoj profil %@";
|
||||
"notice_event_redacted_reason" = " [dôvod: %@]";
|
||||
"notice_event_redacted_by" = " používateľom %@";
|
||||
"notice_room_topic_removed" = "%@ odstránil tému";
|
||||
"notice_room_name_removed_for_dm" = "%@ odstránil názov";
|
||||
"notice_room_name_removed" = "%@ odstránil/a názov miestnosti";
|
||||
|
||||
// Events formatter
|
||||
"notice_avatar_changed_too" = "(obrázok bol tiež zmenený)";
|
||||
"resend_message" = "Znovu odoslať správu";
|
||||
"reset_to_default" = "Obnoviť na predvolené";
|
||||
"invite_user" = "Pozvať používateľa matrix";
|
||||
"attach_media" = "Pripojiť médium z knižnice";
|
||||
"select_account" = "Vyberte účet";
|
||||
"start_video_call" = "Spustiť videohovor";
|
||||
"start_voice_call" = "Spustiť hlasový hovor";
|
||||
"set_admin" = "Nastaviť správcu";
|
||||
"set_moderator" = "Nastaviť moderátora";
|
||||
"set_default_power_level" = "Vynulovať úroveň oprávnenia";
|
||||
"set_power_level" = "Nastaviť úroveň oprávnenia";
|
||||
"submit_code" = "Odoslať kód";
|
||||
"dismiss" = "Odmietnuť";
|
||||
"discard" = "Zahodiť";
|
||||
"login_error_resource_limit_exceeded_message_contact" = "\n\nAk chcete pokračovať v používaní tejto služby, obráťte sa na správcu služby.";
|
||||
"login_error_resource_limit_exceeded_message_monthly_active_user" = "Tento domovský server dosiahol svoj mesačný limit aktívnych používateľov.";
|
||||
"login_error_resource_limit_exceeded_message_default" = "Tento domovský server prekročil jeden z limitov zdroja.";
|
||||
"login_error_resource_limit_exceeded_title" = "Prekročený limit zdrojov";
|
||||
"login_error_forgot_password_is_not_supported" = "Zabudnuté heslo nie je v súčasnosti podporované";
|
||||
"login_error_not_json" = "Neobsahoval platný JSON";
|
||||
"login_error_unknown_token" = "Zadaný prístupový token nebol rozpoznaný";
|
||||
"login_error_registration_is_not_supported" = "Registrácia nie je v súčasnosti podporovaná";
|
||||
"login_error_do_not_support_login_flows" = "V súčasnosti nepodporujeme žiadny alebo všetky prihlasovacie toky definované týmto domovským serverom";
|
||||
"login_error_no_login_flow" = "Nepodarilo sa nám získať autentifikačné informácie z tohto domovského servera";
|
||||
"call_more_actions_audio_use_device" = "Reproduktor zariadenia";
|
||||
"call_more_actions_unhold" = "Pokračovať";
|
||||
"call_invite_expired" = "Platnosť pozvánky na hovor vypršala";
|
||||
"notification_settings_per_word_info" = "Slová sa porovnávajú bez ohľadu na veľkosť písmen a môžu obsahovať zástupný znak *. Takže:\nfoo zodpovedá reťazcu foo ohraničenému oddeľovačmi slov (napr. interpunkčnými znamienkami a medzerami alebo začiatkom/koncom riadku).\nfoo* zodpovedá každému takému slovu, ktoré začína foo.\n*foo* zodpovedá každému takému slovu, ktoré obsahuje 3 písmená foo.";
|
||||
"notice_redaction_by_you" = "Upravili ste udalosť (id: %@)";
|
||||
"notice_answered_video_call_by_you" = "Prijali ste hovor";
|
||||
"notice_placed_video_call_by_you" = "Uskutočnili ste videohovor";
|
||||
"notice_placed_voice_call_by_you" = "Uskutočnili ste hlasový hovor";
|
||||
"notice_answered_video_call" = "%@ prijal hovor";
|
||||
"notice_placed_video_call" = "%@ uskutočnil videohovor";
|
||||
"notice_placed_voice_call" = "%@ uskutočnil hlasový hovor";
|
||||
"attachment_size_prompt_title" = "Potvrdiť veľkosť na odoslanie";
|
||||
"notice_redaction" = "%@ upravil udalosť (id: %@)";
|
||||
"notice_feedback" = "Udalosť spätnej väzby (id: %@): %@";
|
||||
"resume_call" = "Pokračovať";
|
||||
"answer_call" = "Prijať hovor";
|
||||
|
||||
@@ -475,3 +475,6 @@
|
||||
"auth_username_in_use" = "Emër përdoruesi i përdorur";
|
||||
"auth_invalid_user_name" = "Emër i pavlefshëm përdoruesi";
|
||||
"rename" = "Riemërtojeni";
|
||||
"attachment_unsupported_preview_message" = "Ky lloj kartele nuk mbulohet.";
|
||||
"attachment_unsupported_preview_title" = "S’arrihet të bëhet paraparje";
|
||||
"room_displayname_all_other_members_left" = "%@ (Iku)";
|
||||
|
||||
@@ -470,3 +470,11 @@
|
||||
"attachment_size_prompt_message" = "Du kan stänga av detta i inställningarna.";
|
||||
"attachment_size_prompt_title" = "Bekräfta storlek att skicka";
|
||||
"room_displayname_all_other_participants_left" = "%@ (Kvar)";
|
||||
"auth_reset_password_error_not_found" = "Hittades inte";
|
||||
"auth_reset_password_error_unauthorized" = "Obehörig";
|
||||
"auth_username_in_use" = "Användarnamn upptaget";
|
||||
"auth_invalid_user_name" = "Ogiltigt användarnamn";
|
||||
"rename" = "Döp om";
|
||||
"attachment_unsupported_preview_message" = "Den här filtypen stöds inte.";
|
||||
"attachment_unsupported_preview_title" = "Kunde inte förhandsgranska";
|
||||
"room_displayname_all_other_members_left" = "%@ (Kvar)";
|
||||
|
||||
@@ -532,3 +532,29 @@
|
||||
"attachment_size_prompt_title" = "Підтвердити розмір, щоб надіслати";
|
||||
"room_no_power_to_create_conference_call" = "Вам потрібен дозвіл, щоб надсилати запрошення, щоб розпочати конференцію в цій кімнаті";
|
||||
"room_event_encryption_verify_message" = "Щоб переконатися, що цьому сеансу можна довіряти, зв’яжіться з його власником іншим способом (наприклад, особисто чи телефоном) і запитайте його, чи збігається ключ, який вони бачать у налаштуваннях користувача для цього сеансу, з ключем нижче:\n\nНазва сеансу: %@\nID сеансу: %@\nКлюч сеансу: %@\n\nЯкщо він збігається, натисніть кнопку підтвердження внизу. Якщо ні, значить хтось інший перехоплює цей сеанс, і ви, ймовірно, хочете натиснути кнопку чорного списку.\n\nУ майбутньому цей процес перевірки буде ускладнено.";
|
||||
"call_more_actions_hold" = "Утримувати";
|
||||
"call_holded" = "Ви утримуєте виклик";
|
||||
"call_remote_holded" = "%@ утримує виклик";
|
||||
|
||||
// Login Screen
|
||||
"login_error_already_logged_in" = "Вже ввійшли";
|
||||
"message_unsaved_changes" = "Ви маєте незбережені зміни. Якщо вийдете, їх буде скасовано.";
|
||||
"attachment_unsupported_preview_message" = "Цей тип файлу не підтримується.";
|
||||
"attachment_unsupported_preview_title" = "Не вдалося показати попередній перегляд";
|
||||
"attachment_e2e_keys_file_prompt" = "Цей файл містить ключі шифрування, експортовані з клієнта Matrix.\nБажаєте переглянути вміст файлу або імпортувати з нього ключі?";
|
||||
"room_member_power_level_prompt" = "Ви не зможете скасувати цю зміну, оскільки користувач отримає ті ж повноваження, що й ви.\nВи впевнені?";
|
||||
"room_error_timeline_event_not_found" = "Застосунок намагався завантажити певну точку стрічки у цій кімнаті, але не зміг її знайти";
|
||||
"room_error_timeline_event_not_found_title" = "Не вдалося завантажити позицію стрічки";
|
||||
"room_error_cannot_load_timeline" = "Не вдалося завантажити стрічку";
|
||||
"ssl_only_accept" = "Приймайте сертифікат ЛИШЕ якщо адміністратор сервера оприлюднив відбиток, збіжний із наведеним угорі.";
|
||||
"ssl_expected_existing_expl" = "Сертифікат, якому ви довіряли раніше, змінився на недовірений. Можливо, сервер оновив сертифікат. Запитайте в адміністратора, який відбиток очікуваний.";
|
||||
"ssl_unexpected_existing_expl" = "Сертифікат відрізняється від довіреного вашим телефоном. Це ВКРАЙ НЕЗВИЧНО. Радимо НЕ ПРИЙМАТИ цей новий сертифікат.";
|
||||
"ssl_cert_new_account_expl" = "Якщо адміністратор сервера каже, що так має бути, переконайтесь, що відбиток знизу збігається з відбитком адміністратора.";
|
||||
"ssl_cert_not_trust" = "Це може означати, що хтось зловмисно перехоплює ваш трафік або ваш телефон не довіряє сертифікату, наданому віддаленим сервером.";
|
||||
|
||||
// contacts list screen
|
||||
"invitation_message" = "Поговорімо в matrix? Сайт https://matrix.org описує, як це зробити.";
|
||||
"local_contacts_access_discovery_warning" = "Щоб виявляти, які ваші контакти вже в Matrix, %@ може надсилати адреси е-пошти й номери телефонів із вашої адресної книги на обраний сервер ідентифікації Matrix. Особисті дані хешуються перед надсиланням, якщо це підтримується: перегляньте політику приватності свого сервера ідентифікації, щоб дізнатися більше.";
|
||||
"local_contacts_access_not_granted" = "Для пошуку користувачів серед локальних контактів потрібен доступ до ваших контактів, але %@ не має такого дозволу";
|
||||
"e2e_export_prompt" = "Це дає змогу експортувати в локальний файл ключі до повідомлень, отриманих вами в зашифрованих кімнатах. Тоді ви зможете імпортувати файл до іншого клієнта Matrix у майбутньому, і той клієнт також зможе розшифрувати ці повідомлення.\nЕкспортований файл дасть змогу всім, хто його прочитає, розшифрувати всі видимі вам зашифровані повідомлення.";
|
||||
"e2e_import_prompt" = "Це дає змогу імпортувати ключі шифрування, які ви раніше експортували з іншого клієнта Matrix. Тоді ви зможете розшифрувати всі повідомлення, які міг розшифрувати той клієнт.\nФайл експорту захищений парольною фразою. Введіть парольну фразу сюди, щоб розшифрувати файл.";
|
||||
|
||||
@@ -2179,12 +2179,12 @@
|
||||
|
||||
if (event && event.eventType == MXEventTypeRoomMessage)
|
||||
{
|
||||
NSString *msgtype = event.content[@"msgtype"];
|
||||
NSString *msgtype = event.content[kMXMessageTypeKey];
|
||||
|
||||
NSString* textMessage;
|
||||
if ([msgtype isEqualToString:kMXMessageTypeText])
|
||||
{
|
||||
textMessage = event.content[@"body"];
|
||||
textMessage = event.content[kMXMessageBodyKey];
|
||||
}
|
||||
|
||||
// Show a confirmation popup to the end user
|
||||
@@ -3668,9 +3668,6 @@
|
||||
MXLogDebug(@"[MXKRoomVC] showAttachmentInCell on an unsent media");
|
||||
}
|
||||
}
|
||||
else if (selectedAttachment.type == MXKAttachmentTypeLocation)
|
||||
{
|
||||
}
|
||||
else if (selectedAttachment.type == MXKAttachmentTypeFile || selectedAttachment.type == MXKAttachmentTypeAudio)
|
||||
{
|
||||
// Start activity indicator as feedback on file selection.
|
||||
|
||||
@@ -1826,27 +1826,31 @@ static NSArray<NSNumber*> *initialSyncSilentErrorsHTTPStatusCodes;
|
||||
|
||||
dispatch_group_t dispatchGroup = dispatch_group_create();
|
||||
|
||||
for (MXRoomSummary *summary in mxSession.roomsSummaries)
|
||||
for (MXRoom *room in mxSession.rooms)
|
||||
{
|
||||
dispatch_group_enter(dispatchGroup);
|
||||
[summary.mxSession eventWithEventId:summary.lastMessage.eventId
|
||||
inRoom:summary.roomId
|
||||
success:^(MXEvent *event) {
|
||||
|
||||
if (event)
|
||||
{
|
||||
if (summary.lastMessage.others == nil)
|
||||
MXRoomSummary *summary = room.summary;
|
||||
if (summary)
|
||||
{
|
||||
dispatch_group_enter(dispatchGroup);
|
||||
[summary.mxSession eventWithEventId:summary.lastMessage.eventId
|
||||
inRoom:summary.roomId
|
||||
success:^(MXEvent *event) {
|
||||
|
||||
if (event)
|
||||
{
|
||||
summary.lastMessage.others = [NSMutableDictionary dictionary];
|
||||
if (summary.lastMessage.others == nil)
|
||||
{
|
||||
summary.lastMessage.others = [NSMutableDictionary dictionary];
|
||||
}
|
||||
summary.lastMessage.others[@"lastEventDate"] = [eventFormatter dateStringFromEvent:event withTime:YES];
|
||||
[self->mxSession.store.roomSummaryStore storeSummary:summary];
|
||||
}
|
||||
summary.lastMessage.others[@"lastEventDate"] = [eventFormatter dateStringFromEvent:event withTime:YES];
|
||||
[self->mxSession.store storeSummaryForRoom:summary.roomId summary:summary];
|
||||
}
|
||||
|
||||
dispatch_group_leave(dispatchGroup);
|
||||
} failure:^(NSError *error) {
|
||||
dispatch_group_leave(dispatchGroup);
|
||||
}];
|
||||
|
||||
dispatch_group_leave(dispatchGroup);
|
||||
} failure:^(NSError *error) {
|
||||
dispatch_group_leave(dispatchGroup);
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^{
|
||||
|
||||
@@ -33,7 +33,6 @@ typedef enum : NSUInteger {
|
||||
MXKAttachmentTypeAudio,
|
||||
MXKAttachmentTypeVoiceMessage,
|
||||
MXKAttachmentTypeVideo,
|
||||
MXKAttachmentTypeLocation,
|
||||
MXKAttachmentTypeFile,
|
||||
MXKAttachmentTypeSticker
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ NSString *const kMXKAttachmentFileNameBase = @"attatchment";
|
||||
else
|
||||
{
|
||||
// Note: mxEvent.eventType is supposed to be MXEventTypeRoomMessage here.
|
||||
NSString *msgtype = eventContent[@"msgtype"];
|
||||
NSString *msgtype = eventContent[kMXMessageTypeKey];
|
||||
if ([msgtype isEqualToString:kMXMessageTypeImage])
|
||||
{
|
||||
_type = MXKAttachmentTypeImage;
|
||||
@@ -109,12 +109,6 @@ NSString *const kMXKAttachmentFileNameBase = @"attatchment";
|
||||
_type = MXKAttachmentTypeVideo;
|
||||
MXJSONModelSetDictionary(_thumbnailInfo, eventContent[@"info"][@"thumbnail_info"]);
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeLocation])
|
||||
{
|
||||
// Not supported yet
|
||||
// _type = MXKAttachmentTypeLocation;
|
||||
return nil;
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeFile])
|
||||
{
|
||||
_type = MXKAttachmentTypeFile;
|
||||
@@ -125,7 +119,7 @@ NSString *const kMXKAttachmentFileNameBase = @"attatchment";
|
||||
}
|
||||
}
|
||||
|
||||
MXJSONModelSetString(_originalFileName, eventContent[@"body"]);
|
||||
MXJSONModelSetString(_originalFileName, eventContent[kMXMessageBodyKey]);
|
||||
MXJSONModelSetDictionary(_contentInfo, eventContent[@"info"]);
|
||||
MXJSONModelSetMXJSONModel(contentFile, MXEncryptedContentFile, eventContent[@"file"]);
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ static NSAttributedString *messageSeparator = nil;
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Add all components of the provided message
|
||||
for (MXKRoomBubbleComponent* component in cellData.bubbleComponents)
|
||||
{
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
NSString *messageType = self.event.content[@"msgtype"];
|
||||
NSString *messageType = self.event.content[kMXMessageTypeKey];
|
||||
|
||||
if (!messageType || !([messageType isEqualToString:kMXMessageTypeText] || [messageType isEqualToString:kMXMessageTypeNotice] || [messageType isEqualToString:kMXMessageTypeEmote]))
|
||||
{
|
||||
|
||||
@@ -605,6 +605,25 @@ extern NSString *const kMXKRoomDataSourceTimelineErrorErrorKey;
|
||||
success:(void (^)(NSString *eventId))success
|
||||
failure:(void (^)(NSError *error))failure;
|
||||
|
||||
/**
|
||||
Send a location message to a room.
|
||||
|
||||
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 latitude the location's latitude
|
||||
@param longitude the location's longitude
|
||||
@param description an optional description
|
||||
@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)sendLocationWithLatitude:(double)latitude
|
||||
longitude:(double)longitude
|
||||
description:(NSString *)description
|
||||
success:(void (^)(NSString *))success
|
||||
failure:(void (^)(NSError *))failure;
|
||||
|
||||
/**
|
||||
Send a generic non state event to a room.
|
||||
|
||||
|
||||
@@ -1952,6 +1952,29 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
}
|
||||
}
|
||||
|
||||
- (void)sendLocationWithLatitude:(double)latitude
|
||||
longitude:(double)longitude
|
||||
description:(NSString *)description
|
||||
success:(void (^)(NSString *))success
|
||||
failure:(void (^)(NSError *))failure
|
||||
{
|
||||
__block MXEvent *localEchoEvent = nil;
|
||||
|
||||
// Make the request to the homeserver
|
||||
[_room sendLocationWithLatitude:latitude
|
||||
longitude:longitude
|
||||
description:description
|
||||
localEcho:&localEchoEvent
|
||||
success:success failure:failure];
|
||||
|
||||
if (localEchoEvent)
|
||||
{
|
||||
// Make the data source digest this fake local echo message
|
||||
[self queueEventForProcessing:localEchoEvent withRoomState:self.roomState direction:MXTimelineDirectionForwards];
|
||||
[self processQueuedEvents:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)sendEventOfType:(MXEventTypeString)eventTypeString content:(NSDictionary<NSString*, id>*)msgContent success:(void (^)(NSString *eventId))success failure:(void (^)(NSError *error))failure
|
||||
{
|
||||
__block MXEvent *localEchoEvent = nil;
|
||||
@@ -1989,7 +2012,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
else if ([event.type isEqualToString:kMXEventTypeStringRoomMessage])
|
||||
{
|
||||
// And retry the send the message according to its type
|
||||
NSString *msgType = event.content[@"msgtype"];
|
||||
NSString *msgType = event.content[kMXMessageTypeKey];
|
||||
if ([msgType isEqualToString:kMXMessageTypeText] || [msgType isEqualToString:kMXMessageTypeEmote])
|
||||
{
|
||||
// Resend the Matrix event by reusing the existing echo
|
||||
@@ -2750,7 +2773,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
NSString *messageType = event.content[@"msgtype"];
|
||||
NSString *messageType = event.content[kMXMessageTypeKey];
|
||||
if (messageType == nil || [messageType isEqualToString:@"m.bad.encrypted"]) {
|
||||
return NO;
|
||||
}
|
||||
@@ -3948,7 +3971,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
|
||||
if ([self canPerformActionOnEvent:event])
|
||||
{
|
||||
NSString *messageType = event.content[@"msgtype"];
|
||||
NSString *messageType = event.content[kMXMessageTypeKey];
|
||||
|
||||
if ([messageType isEqualToString:kMXMessageTypeKeyVerificationRequest])
|
||||
{
|
||||
@@ -3991,7 +4014,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
{
|
||||
MXEvent *event = [self eventWithEventId:eventId];
|
||||
BOOL isRoomMessage = event.eventType == MXEventTypeRoomMessage;
|
||||
NSString *messageType = event.content[@"msgtype"];
|
||||
NSString *messageType = event.content[kMXMessageTypeKey];
|
||||
|
||||
return isRoomMessage
|
||||
&& ([messageType isEqualToString:kMXMessageTypeText] || [messageType isEqualToString:kMXMessageTypeEmote])
|
||||
@@ -4012,7 +4035,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
}
|
||||
else
|
||||
{
|
||||
editableTextMessage = event.content[@"body"];
|
||||
editableTextMessage = event.content[kMXMessageBodyKey];
|
||||
}
|
||||
|
||||
return editableTextMessage;
|
||||
@@ -4129,7 +4152,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) {
|
||||
NSString *sanitizedText = [self sanitizedMessageText:text];
|
||||
NSString *formattedText = [self htmlMessageFromSanitizedText:sanitizedText];
|
||||
|
||||
NSString *eventBody = event.content[@"body"];
|
||||
NSString *eventBody = event.content[kMXMessageBodyKey];
|
||||
NSString *eventFormattedBody = event.content[@"formatted_body"];
|
||||
|
||||
if (![sanitizedText isEqualToString:eventBody] && (!eventFormattedBody || ![formattedText isEqualToString:eventFormattedBody]))
|
||||
|
||||
@@ -45,6 +45,11 @@
|
||||
return [MatrixKitL10n messageReplyToSenderSentAFile];
|
||||
}
|
||||
|
||||
- (NSString *)senderSentTheirLocation
|
||||
{
|
||||
return [MatrixKitL10n messageReplyToSenderSentTheirLocation];
|
||||
}
|
||||
|
||||
- (NSString *)messageToReplyToPrefix
|
||||
{
|
||||
return [MatrixKitL10n messageReplyToMessageToReplyToPrefix];
|
||||
|
||||
@@ -46,7 +46,14 @@
|
||||
|
||||
- (MXSession *)mxSession
|
||||
{
|
||||
return dataSource.mxSession;
|
||||
MXSession *session = dataSource.mxSession;
|
||||
|
||||
if (session == nil)
|
||||
{
|
||||
session = roomSummary.mxSession;
|
||||
}
|
||||
|
||||
return session;
|
||||
}
|
||||
|
||||
- (NSString*)lastEventDate
|
||||
|
||||
@@ -25,52 +25,6 @@
|
||||
|
||||
#pragma mark - Constant definitions
|
||||
NSString *const kMXKRecentCellIdentifier = @"kMXKRecentCellIdentifier";
|
||||
static NSTimeInterval const roomSummaryChangeThrottlerDelay = .5;
|
||||
|
||||
|
||||
@interface MXKSessionRecentsDataSource ()
|
||||
{
|
||||
MXKRoomDataSourceManager *roomDataSourceManager;
|
||||
|
||||
/**
|
||||
Internal array used to regulate change notifications.
|
||||
Cell data changes are stored instantly in this array.
|
||||
These changes are reported to the delegate only if no server sync is in progress.
|
||||
*/
|
||||
NSMutableArray *internalCellDataArray;
|
||||
|
||||
/**
|
||||
Store the current search patterns list.
|
||||
*/
|
||||
NSArray* searchPatternsList;
|
||||
|
||||
/**
|
||||
Do not react on every summary change
|
||||
*/
|
||||
MXThrottler *roomSummaryChangeThrottler;
|
||||
|
||||
/**
|
||||
Last received suggested rooms per space ID
|
||||
*/
|
||||
NSMutableDictionary<NSString*, NSArray<MXSpaceChildInfo *> *> *lastSuggestedRooms;
|
||||
|
||||
/**
|
||||
Event listener of the current space used to update the UI if an event occurs.
|
||||
*/
|
||||
id spaceEventsListener;
|
||||
|
||||
/**
|
||||
Observer used to reload data when the space service is initialised
|
||||
*/
|
||||
id spaceServiceDidInitialiseObserver;
|
||||
}
|
||||
|
||||
/**
|
||||
Additional suggestedRooms related to the current selected Space
|
||||
*/
|
||||
@property (nonatomic, strong) NSArray<MXSpaceChildInfo *> *suggestedRooms;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MXKSessionRecentsDataSource
|
||||
|
||||
@@ -79,474 +33,52 @@ static NSTimeInterval const roomSummaryChangeThrottlerDelay = .5;
|
||||
self = [super initWithMatrixSession:matrixSession];
|
||||
if (self)
|
||||
{
|
||||
roomDataSourceManager = [MXKRoomDataSourceManager sharedManagerForMatrixSession:self.mxSession];
|
||||
// Update here data source state
|
||||
if (state != MXKDataSourceStateReady)
|
||||
{
|
||||
state = MXKDataSourceStateReady;
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(dataSource:didStateChange:)])
|
||||
{
|
||||
[self.delegate dataSource:self didStateChange:state];
|
||||
}
|
||||
}
|
||||
|
||||
internalCellDataArray = [NSMutableArray array];
|
||||
filteredCellDataArray = nil;
|
||||
|
||||
lastSuggestedRooms = [NSMutableDictionary new];
|
||||
|
||||
// Set default data and view classes
|
||||
[self registerCellDataClass:MXKRecentCellData.class forCellIdentifier:kMXKRecentCellIdentifier];
|
||||
|
||||
roomSummaryChangeThrottler = [[MXThrottler alloc] initWithMinimumDelay:roomSummaryChangeThrottlerDelay];
|
||||
|
||||
[[MXKAppSettings standardAppSettings] addObserver:self forKeyPath:@"showAllRoomsInHomeSpace" options:0 context:nil];
|
||||
// And inform the delegate about the update
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)destroy
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXRoomSummaryDidChangeNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXKRoomDataSourceSyncStatusChanged object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionNewRoomNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionDidLeaveRoomNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionDirectRoomsDidChangeNotification object:nil];
|
||||
|
||||
if (spaceServiceDidInitialiseObserver) {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:spaceServiceDidInitialiseObserver];
|
||||
}
|
||||
|
||||
[roomSummaryChangeThrottler cancelAll];
|
||||
roomSummaryChangeThrottler = nil;
|
||||
|
||||
cellDataArray = nil;
|
||||
internalCellDataArray = nil;
|
||||
filteredCellDataArray = nil;
|
||||
lastSuggestedRooms = nil;
|
||||
|
||||
searchPatternsList = nil;
|
||||
|
||||
[[MXKAppSettings standardAppSettings] removeObserver:self forKeyPath:@"showAllRoomsInHomeSpace" context:nil];
|
||||
|
||||
[super destroy];
|
||||
}
|
||||
|
||||
- (void)didMXSessionStateChange
|
||||
{
|
||||
if (MXSessionStateStoreDataReady <= self.mxSession.state)
|
||||
{
|
||||
// Check whether some data have been already load
|
||||
if (0 == internalCellDataArray.count)
|
||||
{
|
||||
[self loadData];
|
||||
}
|
||||
else if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
// Sort cell data and notify the delegate
|
||||
[self sortCellDataAndNotifyChanges];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setCurrentSpace:(MXSpace *)currentSpace
|
||||
{
|
||||
if (_currentSpace == currentSpace)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (_currentSpace && spaceEventsListener)
|
||||
{
|
||||
[_currentSpace.room removeListener:spaceEventsListener];
|
||||
}
|
||||
|
||||
_currentSpace = currentSpace;
|
||||
|
||||
self.suggestedRooms = _currentSpace ? lastSuggestedRooms[_currentSpace.spaceId] : nil;
|
||||
[self updateSuggestedRooms];
|
||||
|
||||
MXWeakify(self);
|
||||
spaceEventsListener = [self.currentSpace.room listenToEvents:^(MXEvent *event, MXTimelineDirection direction, MXRoomState *roomState) {
|
||||
MXStrongifyAndReturnIfNil(self);
|
||||
[self updateSuggestedRooms];
|
||||
}];
|
||||
}
|
||||
|
||||
-(void)setSuggestedRooms:(NSArray<MXSpaceChildInfo *> *)suggestedRooms
|
||||
{
|
||||
_suggestedRooms = suggestedRooms;
|
||||
[self loadData];
|
||||
}
|
||||
|
||||
-(void)updateSuggestedRooms
|
||||
{
|
||||
if (self.currentSpace)
|
||||
{
|
||||
NSString *currentSpaceId = self.currentSpace.spaceId;
|
||||
MXWeakify(self);
|
||||
[self.mxSession.spaceService getSpaceChildrenForSpaceWithId:currentSpaceId suggestedOnly:YES limit:5 maxDepth:1 paginationToken:nil success:^(MXSpaceChildrenSummary * _Nonnull childrenSummary) {
|
||||
MXLogDebug(@"[MXKSessionRecentsDataSource] getSpaceChildrenForSpaceWithId %@: %ld found", self.currentSpace.spaceId, childrenSummary.childInfos.count);
|
||||
MXStrongifyAndReturnIfNil(self);
|
||||
self->lastSuggestedRooms[currentSpaceId] = childrenSummary.childInfos;
|
||||
if ([self.currentSpace.spaceId isEqual:currentSpaceId]) {
|
||||
self.suggestedRooms = childrenSummary.childInfos;
|
||||
}
|
||||
} failure:^(NSError * _Nonnull error) {
|
||||
MXLogError(@"[MXKSessionRecentsDataSource] getSpaceChildrenForSpaceWithId failed with error: %@", error);
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
- (NSInteger)numberOfCells
|
||||
{
|
||||
if (filteredCellDataArray)
|
||||
{
|
||||
return filteredCellDataArray.count;
|
||||
}
|
||||
return cellDataArray.count;
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (BOOL)hasUnread
|
||||
{
|
||||
// Check all current cells
|
||||
// Use numberOfRowsInSection methods so that we take benefit of the filtering
|
||||
for (NSUInteger i = 0; i < self.numberOfCells; i++)
|
||||
{
|
||||
id<MXKRecentCellDataStoring> cellData = [self cellDataAtIndex:i];
|
||||
if (cellData.hasUnread)
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)searchWithPatterns:(NSArray*)patternsList
|
||||
{
|
||||
if (patternsList.count)
|
||||
{
|
||||
searchPatternsList = patternsList;
|
||||
|
||||
if (filteredCellDataArray)
|
||||
{
|
||||
[filteredCellDataArray removeAllObjects];
|
||||
}
|
||||
else
|
||||
{
|
||||
filteredCellDataArray = [NSMutableArray arrayWithCapacity:cellDataArray.count];
|
||||
}
|
||||
|
||||
for (id<MXKRecentCellDataStoring> cellData in cellDataArray)
|
||||
{
|
||||
for (NSString* pattern in patternsList)
|
||||
{
|
||||
if (cellData.roomDisplayname && [cellData.roomDisplayname rangeOfString:pattern options:NSCaseInsensitiveSearch].location != NSNotFound)
|
||||
{
|
||||
[filteredCellDataArray addObject:cellData];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
filteredCellDataArray = nil;
|
||||
searchPatternsList = nil;
|
||||
}
|
||||
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
}
|
||||
|
||||
- (id<MXKRecentCellDataStoring>)cellDataAtIndex:(NSInteger)index
|
||||
{
|
||||
if (filteredCellDataArray)
|
||||
{
|
||||
if (index < filteredCellDataArray.count)
|
||||
{
|
||||
return filteredCellDataArray[index];
|
||||
}
|
||||
}
|
||||
else if (index < cellDataArray.count)
|
||||
{
|
||||
return cellDataArray[index];
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (CGFloat)cellHeightAtIndex:(NSInteger)index
|
||||
{
|
||||
if (self.delegate)
|
||||
{
|
||||
id<MXKRecentCellDataStoring> cellData = [self cellDataAtIndex:index];
|
||||
|
||||
Class<MXKCellRendering> class = [self.delegate cellViewClassForCellData:cellData];
|
||||
return [class heightForCellData:cellData withMaximumWidth:0];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#pragma mark - Events processing
|
||||
|
||||
/**
|
||||
Filtering in this method won't have any effect anymore. This class is not maintained.
|
||||
*/
|
||||
- (void)loadData
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXRoomSummaryDidChangeNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXKRoomDataSourceSyncStatusChanged object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionNewRoomNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionDidLeaveRoomNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:kMXSessionDirectRoomsDidChangeNotification object:nil];
|
||||
|
||||
if (!self.mxSession.spaceService.isInitialised && !spaceServiceDidInitialiseObserver) {
|
||||
MXWeakify(self);
|
||||
spaceServiceDidInitialiseObserver = [[NSNotificationCenter defaultCenter] addObserverForName:MXSpaceService.didInitialise object:self.mxSession.spaceService queue:nil usingBlock:^(NSNotification * _Nonnull note) {
|
||||
MXStrongifyAndReturnIfNil(self);
|
||||
[self loadData];
|
||||
}];
|
||||
}
|
||||
|
||||
// Reset the table
|
||||
[internalCellDataArray removeAllObjects];
|
||||
|
||||
// Retrieve the MXKCellData class to manage the data
|
||||
Class class = [self cellDataClassForCellIdentifier:kMXKRecentCellIdentifier];
|
||||
NSAssert([class conformsToProtocol:@protocol(MXKRecentCellDataStoring)], @"MXKSessionRecentsDataSource only manages MXKCellData that conforms to MXKRecentCellDataStoring protocol");
|
||||
|
||||
NSDate *startDate = [NSDate date];
|
||||
|
||||
for (MXRoomSummary *roomSummary in self.mxSession.roomsSummaries)
|
||||
{
|
||||
// Filter out private rooms with conference users
|
||||
if (!roomSummary.isConferenceUserRoom // @TODO Abstract this condition with roomSummary.hiddenFromUser
|
||||
&& !roomSummary.hiddenFromUser)
|
||||
{
|
||||
id<MXKRecentCellDataStoring> cellData = [[class alloc] initWithRoomSummary:roomSummary dataSource:self];
|
||||
if (cellData)
|
||||
{
|
||||
[internalCellDataArray addObject:cellData];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (MXSpaceChildInfo *childInfo in _suggestedRooms)
|
||||
{
|
||||
id<MXRoomSummaryProtocol> summary = [[MXRoomSummary alloc] initWithSpaceChildInfo:childInfo];
|
||||
id<MXKRecentCellDataStoring> cellData = [[class alloc] initWithRoomSummary:summary
|
||||
dataSource:self];
|
||||
if (cellData)
|
||||
{
|
||||
[internalCellDataArray addObject:cellData];
|
||||
}
|
||||
}
|
||||
|
||||
MXLogDebug(@"[MXKSessionRecentsDataSource] Loaded %tu recents in %.3fms", self.mxSession.rooms.count, [[NSDate date] timeIntervalSinceDate:startDate] * 1000);
|
||||
|
||||
// Make sure all rooms have a last message
|
||||
[self.mxSession fixRoomsSummariesLastMessage];
|
||||
|
||||
// Report loaded array except if sync is in progress
|
||||
if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
[self sortCellDataAndNotifyChanges];
|
||||
}
|
||||
|
||||
// Listen to MXSession rooms count changes
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didMXSessionHaveNewRoom:) name:kMXSessionNewRoomNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didMXSessionDidLeaveRoom:) name:kMXSessionDidLeaveRoomNotification object:nil];
|
||||
|
||||
// Listen to the direct rooms list
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didDirectRoomsChange:) name:kMXSessionDirectRoomsDidChangeNotification object:nil];
|
||||
|
||||
// Listen to MXRoomSummary
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRoomSummaryChanged:) name:kMXRoomSummaryDidChangeNotification object:nil];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didMXSessionStateChange) name:kMXKRoomDataSourceSyncStatusChanged object:nil];
|
||||
}
|
||||
|
||||
- (void)didDirectRoomsChange:(NSNotification *)notif
|
||||
{
|
||||
// Inform the delegate about the update
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
}
|
||||
|
||||
- (void)didRoomSummaryChanged:(NSNotification *)notif
|
||||
{
|
||||
[roomSummaryChangeThrottler throttle:^{
|
||||
[self didRoomSummaryChanged2:notif];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)didRoomSummaryChanged2:(NSNotification *)notif
|
||||
{
|
||||
MXRoomSummary *roomSummary = notif.object;
|
||||
if (roomSummary.mxSession == self.mxSession && internalCellDataArray.count)
|
||||
{
|
||||
// Find the index of the related cell data
|
||||
NSInteger index = NSNotFound;
|
||||
for (index = 0; index < internalCellDataArray.count; index++)
|
||||
{
|
||||
id<MXKRecentCellDataStoring> theRoomData = [internalCellDataArray objectAtIndex:index];
|
||||
if (theRoomData.roomSummary == roomSummary)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (index < internalCellDataArray.count)
|
||||
{
|
||||
if (roomSummary.hiddenFromUser)
|
||||
{
|
||||
[internalCellDataArray removeObjectAtIndex:index];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Create a new instance to not modify the content of 'cellDataArray' (the copy is not a deep copy).
|
||||
Class class = [self cellDataClassForCellIdentifier:kMXKRecentCellIdentifier];
|
||||
id<MXKRecentCellDataStoring> cellData = [[class alloc] initWithRoomSummary:roomSummary dataSource:self];
|
||||
if (cellData)
|
||||
{
|
||||
[internalCellDataArray replaceObjectAtIndex:index withObject:cellData];
|
||||
}
|
||||
}
|
||||
|
||||
// Report change except if sync is in progress
|
||||
if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
[self sortCellDataAndNotifyChanges];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MXLogDebug(@"[MXKSessionRecentsDataSource] didRoomLastMessageChanged: Cannot find the changed room summary for %@ (%@). It is probably not managed by this recents data source", roomSummary.roomId, roomSummary);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Inform the delegate that all the room summaries have been updated.
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)didMXSessionHaveNewRoom:(NSNotification *)notif
|
||||
{
|
||||
MXSession *mxSession = notif.object;
|
||||
if (mxSession == self.mxSession)
|
||||
{
|
||||
NSString *roomId = notif.userInfo[kMXSessionNotificationRoomIdKey];
|
||||
|
||||
// Add the room if there is not yet a cell for it
|
||||
id<MXKRecentCellDataStoring> roomData = [self cellDataWithRoomId:roomId];
|
||||
if (nil == roomData)
|
||||
{
|
||||
MXLogDebug(@"MXKSessionRecentsDataSource] Add newly joined room: %@", roomId);
|
||||
|
||||
// Retrieve the MXKCellData class to manage the data
|
||||
Class class = [self cellDataClassForCellIdentifier:kMXKRecentCellIdentifier];
|
||||
|
||||
MXRoomSummary *roomSummary = [mxSession roomSummaryWithRoomId:roomId];
|
||||
id<MXKRecentCellDataStoring> cellData = [[class alloc] initWithRoomSummary:roomSummary dataSource:self];
|
||||
if (cellData)
|
||||
{
|
||||
[internalCellDataArray addObject:cellData];
|
||||
|
||||
// Report change except if sync is in progress
|
||||
if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
[self sortCellDataAndNotifyChanges];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)didMXSessionDidLeaveRoom:(NSNotification *)notif
|
||||
{
|
||||
MXSession *mxSession = notif.object;
|
||||
if (mxSession == self.mxSession)
|
||||
{
|
||||
NSString *roomId = notif.userInfo[kMXSessionNotificationRoomIdKey];
|
||||
id<MXKRecentCellDataStoring> roomData = [self cellDataWithRoomId:roomId];
|
||||
|
||||
if (roomData)
|
||||
{
|
||||
MXLogDebug(@"MXKSessionRecentsDataSource] Remove left room: %@", roomId);
|
||||
|
||||
[internalCellDataArray removeObject:roomData];
|
||||
|
||||
// Report change except if sync is in progress
|
||||
if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
[self sortCellDataAndNotifyChanges];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Order cells
|
||||
- (void)sortCellDataAndNotifyChanges
|
||||
{
|
||||
// Order them by origin_server_ts
|
||||
[internalCellDataArray sortUsingComparator:^NSComparisonResult(id<MXKRecentCellDataStoring> cellData1, id<MXKRecentCellDataStoring> cellData2)
|
||||
{
|
||||
return [cellData1.roomSummary.lastMessage compareOriginServerTs:cellData2.roomSummary.lastMessage];
|
||||
}];
|
||||
|
||||
// Snapshot the cell data array
|
||||
cellDataArray = [internalCellDataArray copy];
|
||||
|
||||
// Update search result if any
|
||||
if (searchPatternsList)
|
||||
{
|
||||
[self searchWithPatterns:searchPatternsList];
|
||||
}
|
||||
|
||||
// Update here data source state
|
||||
if (state != MXKDataSourceStateReady)
|
||||
{
|
||||
state = MXKDataSourceStateReady;
|
||||
if (self.delegate && [self.delegate respondsToSelector:@selector(dataSource:didStateChange:)])
|
||||
{
|
||||
[self.delegate dataSource:self didStateChange:state];
|
||||
}
|
||||
}
|
||||
|
||||
// And inform the delegate about the update
|
||||
[self.delegate dataSource:self didCellChange:nil];
|
||||
}
|
||||
|
||||
// Find the cell data that stores information about the given room id
|
||||
- (id<MXKRecentCellDataStoring>)cellDataWithRoomId:(NSString*)roomId
|
||||
{
|
||||
id<MXKRecentCellDataStoring> theRoomData;
|
||||
|
||||
NSMutableArray *dataArray = internalCellDataArray;
|
||||
if (!roomDataSourceManager.isServerSyncInProgress)
|
||||
{
|
||||
dataArray = cellDataArray;
|
||||
}
|
||||
|
||||
for (id<MXKRecentCellDataStoring> roomData in dataArray)
|
||||
{
|
||||
if ([roomData.roomSummary.roomId isEqualToString:roomId])
|
||||
{
|
||||
theRoomData = roomData;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return theRoomData;
|
||||
}
|
||||
|
||||
#pragma mark - KVO
|
||||
|
||||
- (void)observeValueForKeyPath:(NSString *)keyPath
|
||||
ofObject:(id)object
|
||||
change:(NSDictionary *)change
|
||||
context:(void *)context
|
||||
{
|
||||
if (object == [MXKAppSettings standardAppSettings] && [keyPath isEqualToString:@"showAllRoomsInHomeSpace"])
|
||||
{
|
||||
if (self.currentSpace == nil)
|
||||
{
|
||||
[self loadData];
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
date = [searchDataSource.eventFormatter dateStringFromEvent:searchResult.result withTime:YES];
|
||||
|
||||
// Code from [MXEventFormatter stringFromEvent] for the particular case of a text message
|
||||
message = [searchResult.result.content[@"body"] isKindOfClass:[NSString class]] ? searchResult.result.content[@"body"] : nil;
|
||||
message = [searchResult.result.content[kMXMessageBodyKey] isKindOfClass:[NSString class]] ? searchResult.result.content[kMXMessageBodyKey] : nil;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -175,10 +175,6 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
{
|
||||
isSupportedAttachment = hasUrl || hasFile;
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeLocation])
|
||||
{
|
||||
// Not supported yet
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeFile])
|
||||
{
|
||||
isSupportedAttachment = hasUrl || hasFile;
|
||||
@@ -1252,7 +1248,7 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
else
|
||||
{
|
||||
NSString *msgtype;
|
||||
MXJSONModelSetString(msgtype, event.content[@"msgtype"]);
|
||||
MXJSONModelSetString(msgtype, event.content[kMXMessageTypeKey]);
|
||||
|
||||
NSString *body;
|
||||
BOOL isHTML = NO;
|
||||
@@ -1267,12 +1263,12 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
else if (eventThreadId && !RiotSettings.shared.enableThreads)
|
||||
{
|
||||
isHTML = YES;
|
||||
MXJSONModelSetString(body, event.content[@"body"]);
|
||||
MXJSONModelSetString(body, event.content[kMXMessageBodyKey]);
|
||||
MXEvent *threadRootEvent = [mxSession.store eventWithEventId:eventThreadId
|
||||
inRoom:event.roomId];
|
||||
|
||||
NSString *threadRootEventContent;
|
||||
MXJSONModelSetString(threadRootEventContent, threadRootEvent.content[@"body"]);
|
||||
MXJSONModelSetString(threadRootEventContent, threadRootEvent.content[kMXMessageBodyKey]);
|
||||
body = [NSString stringWithFormat:@"<mx-reply><blockquote><a href=\"%@\">In reply to</a> <a href=\"%@\">%@</a><br>%@</blockquote></mx-reply>%@",
|
||||
[MXTools permalinkToEvent:eventThreadId inRoom:event.roomId],
|
||||
[MXTools permalinkToUserWithUserId:threadRootEvent.sender],
|
||||
@@ -1283,7 +1279,7 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
}
|
||||
else
|
||||
{
|
||||
MXJSONModelSetString(body, event.content[@"body"]);
|
||||
MXJSONModelSetString(body, event.content[kMXMessageBodyKey]);
|
||||
}
|
||||
|
||||
if (body)
|
||||
@@ -1333,23 +1329,6 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
*error = MXKEventFormatterErrorUnsupported;
|
||||
}
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeLocation])
|
||||
{
|
||||
body = body? body : [MatrixKitL10n noticeLocationAttachment];
|
||||
if (![self isSupportedAttachment:event])
|
||||
{
|
||||
MXLogDebug(@"[MXKEventFormatter] Warning: Unsupported attachment %@", event.description);
|
||||
if (_isForSubtitle || !_settings.showUnsupportedEventsInRoomHistory)
|
||||
{
|
||||
body = [MatrixKitL10n noticeInvalidAttachment];
|
||||
}
|
||||
else
|
||||
{
|
||||
body = [MatrixKitL10n noticeUnsupportedAttachment:event.description];
|
||||
}
|
||||
*error = MXKEventFormatterErrorUnsupported;
|
||||
}
|
||||
}
|
||||
else if ([msgtype isEqualToString:kMXMessageTypeFile])
|
||||
{
|
||||
body = body? body : [MatrixKitL10n noticeFileAttachment];
|
||||
@@ -1582,7 +1561,7 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
else
|
||||
{
|
||||
NSString *body;
|
||||
MXJSONModelSetString(body, event.content[@"body"]);
|
||||
MXJSONModelSetString(body, event.content[kMXMessageBodyKey]);
|
||||
|
||||
// Check sticker validity
|
||||
if (![self isSupportedAttachment:event])
|
||||
@@ -2000,7 +1979,7 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
|
||||
if (event.eventType == MXEventTypeRoomMessage)
|
||||
{
|
||||
NSString *msgtype = event.content[@"msgtype"];
|
||||
NSString *msgtype = event.content[kMXMessageTypeKey];
|
||||
if ([msgtype isEqualToString:kMXMessageTypeEmote] == NO)
|
||||
{
|
||||
NSString *senderDisplayName = [self senderDisplayNameForEvent:event withRoomState:roomState];
|
||||
@@ -2121,7 +2100,7 @@ static NSString *const kHTMLATagRegexPattern = @"<a href=\"(.*?)\">([^<]*)</a>";
|
||||
else if (!_isForSubtitle && event.eventType == MXEventTypeRoomMessage && (_emojiOnlyTextFont || _singleEmojiTextFont))
|
||||
{
|
||||
NSString *message;
|
||||
MXJSONModelSetString(message, event.content[@"body"]);
|
||||
MXJSONModelSetString(message, event.content[kMXMessageBodyKey]);
|
||||
|
||||
if (_emojiOnlyTextFont && [MXKTools isEmojiOnlyString:message])
|
||||
{
|
||||
|
||||
@@ -61,7 +61,7 @@ final class InviteFriendsPresenter: NSObject {
|
||||
|
||||
private func buildShareText(with userId: String) -> String {
|
||||
let userMatrixToLink: String = MXTools.permalinkToUser(withUserId: userId)
|
||||
return VectorL10n.inviteFriendsShareText(BuildSettings.bundleDisplayName, userMatrixToLink)
|
||||
return VectorL10n.inviteFriendsShareText(AppInfo.current.displayName, userMatrixToLink)
|
||||
}
|
||||
|
||||
private func present(_ viewController: UIViewController, animated: Bool) {
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
}
|
||||
|
||||
@property(nonatomic) SpaceMembersCoordinatorBridgePresenter *spaceMembersCoordinatorBridgePresenter;
|
||||
@property (nonatomic, strong) MXThrottler *tableViewPaginationThrottler;
|
||||
|
||||
@end
|
||||
|
||||
@@ -52,6 +53,7 @@
|
||||
directRoomsSectionNumber = 0;
|
||||
|
||||
self.screenTimer = [[AnalyticsScreenTimer alloc] initWithScreen:AnalyticsScreenPeople];
|
||||
self.tableViewPaginationThrottler = [[MXThrottler alloc] initWithMinimumDelay:0.1];
|
||||
}
|
||||
|
||||
- (void)viewDidLoad
|
||||
@@ -106,6 +108,24 @@
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
if ([super respondsToSelector:@selector(tableView:willDisplayCell:forRowAtIndexPath:)])
|
||||
{
|
||||
[super tableView:tableView willDisplayCell:cell forRowAtIndexPath:indexPath];
|
||||
}
|
||||
|
||||
[self.tableViewPaginationThrottler throttle:^{
|
||||
NSInteger section = indexPath.section;
|
||||
NSInteger numberOfRowsInSection = [tableView numberOfRowsInSection:section];
|
||||
if (tableView.numberOfSections > section
|
||||
&& indexPath.row == numberOfRowsInSection - 1)
|
||||
{
|
||||
[self->recentsDataSource paginateInSection:section];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - Override RecentsViewController
|
||||
|
||||
- (void)refreshCurrentSelectedCell:(BOOL)forceVisible
|
||||
|
||||