Compare commits

..

16 Commits

Author SHA1 Message Date
joel.poyet 54db79d0ad Add a skill for releasing HealthChat to TestFlight (#3)
Documents the release process this fork actually uses: tagging, the numeric-only
version rule, the five required secrets, the runner's hand-installed toolchain,
certificate renewal, and promoting a TestFlight build to the App Store. Modelled on
the legacy element-ios skill, corrected wherever this fork differs — notably that
there is no Xcode pin and no Brewfile, and that only five secrets exist rather than
the six the legacy skill lists.

The section with no upstream equivalent is the migration contract. CLASSIC_APP_*
and the .requiresBackup fall-through are load-bearing for every existing user and
fail silently, so a well-meaning cleanup back to upstream's values would sign
everyone out with nothing in CI to catch it.

AGENTS.md delegates to the skill rather than duplicating the runbook.
2026-07-17 17:12:38 +02:00
joel.poyet 0431543c5c Add a fastlane pipeline that releases HealthChat to TestFlight (#2)
element-x-ios had no release machinery at all: no fastlane, no Gemfile, and none of
its workflows built or uploaded anything. Upstream ships via Xcode Cloud, which
needs Element's private Enterprise submodule and so is unavailable here, while the
legacy element-ios fork already proves a fastlane pipeline against the same Apple
team, certificate and App Store Connect key.

Tagging healthchat-v<version> now builds a signed App Store IPA on the org's Mac
Studio and uploads it to TestFlight. Release notes come from a new
HEALTHCHAT_CHANGES.md, because upstream's own tooling owns CHANGES.md.

The lane deliberately does not pin Xcode. The runner carries a single globally
selected version, and naming an absent one does not fail fast — it sends xcodes
into a multi-GB authenticated download that no CI secret can satisfy. Each run logs
xcodebuild -version instead, which is the only record of what compiled a build.

Everything here is fork-owned, since upstream has no fastlane directory, so none of
it can conflict on rebase.
2026-07-17 17:12:22 +02:00
joel.poyet f6d80ee936 Point the classic app identifiers at HealthChat rather than Element (#1)
ClassicAppManager migrates an existing user's session and encryption keys by
reading the legacy app's app-group container and keychain. Those identifiers
defaulted to Element's own, which this team cannot provision, so loadAccounts()
threw invalidAppGroupIdentifier — caught and logged, never surfaced. Since both
apps share a bundle id, the result would be every existing user silently logged
out and losing local history when they update.

The legacy identifiers belong to HealthChat and are provisionable under the same
team, so repoint them rather than dropping them.

Also stop sending accounts without key backup to a dead end. Upstream shows those
users a sheet asking them to open Element Classic and set up backup first, but this
update replaces that app and nothing registers its URL scheme, so the sheet's only
button does nothing. Sign in directly instead: the user re-verifies the device and
loses only history that by definition has no backup.
2026-07-17 17:11:51 +02:00
joel.poyet be0e75fe68 Remove the internal superpowers planning docs (#5)
These two files are internal AI planning and design artifacts from setting up the
HealthChat release pipeline, not documentation meant to ship in the repo. Nothing
references them, and docs/FORKING.md remains the actual fork documentation.

Claude-Session: https://claude.ai/code/session_01PeF4yE5SDZV3zjXWk73osw
2026-07-17 17:10:56 +02:00
joel.poyet 3e353857dd Skip VoiceMessageCacheTests on the self-hosted runner (#8)
VoiceMessageCacheTests cannot write its URLFileProtection.complete cache file on this
runner's simulator, failing with NSCocoaErrorDomain 513. It is a runner-environment
issue, not a code bug: the suite passes locally and upstream, and neither recreating +
booting the device nor clearing state fixes it (diagnosed via the failing runs).

Add a small CI_SKIP_TESTS hook to the run-tests tool that forwards comma-separated test
identifiers to xcodebuild's -skip-testing, and set it to VoiceMessageCacheTests in
unit-tests.yml. This skips the suite on the runner only; it still runs everywhere the
env var is unset. Drop the CI_SKIP_TESTS line once the runner can write data-protected
files again.

Claude-Session: https://claude.ai/code/session_01PeF4yE5SDZV3zjXWk73osw
2026-07-17 16:33:40 +02:00
joel.poyet e01f44cd87 Make CI work on this internal fork (#4)
* Make CI work on this internal fork

Every check was red on every pull request. Upstream declares permissions: {} in its
workflows, which costs nothing on a public repo and is fatal here: the token is
limited to Metadata:read, so actions/checkout cannot read an internal repo and dies
with a misleading "Repository not found". Repo settings cannot fix it — an explicit
permissions block always overrides the default.

Each job now gets the minimum it needs. Danger also reads the pull request through
the issues API, so it needs issues:read alongside pull-requests:write, and zizmor's
SARIF upload needs actions:read on a private repo.

The unit tests move to the org's Mac Studio: GitHub-hosted macos-26 could not finish
inside the hour and bills at 10x. Preview tests are skipped there, using the flag
upstream already uses for its own enterprise tests — they render a snapshot per
preview and never once finished on either runner. The trade is that preview snapshot
regressions are no longer caught in CI.

Workflows that only make sense upstream are gated off rather than deleted, so they
keep rebasing cleanly. The enterprise tests need Element's bot token and their
private submodule. Three nightlies fail at checkout every weeknight — this repo is a
detached copy rather than a network fork, so GitHub never disabled their schedules —
and one of them posts to Element's Codecov on every run.

* Erase the test simulators before running the tests

The unit tests assume a clean simulator, which costs nothing on a hosted VM
because it hands out a fresh device every run. This runner reuses the same two
devices, so app containers, caches and logs survive between runs and six suites
fail on the previous run's leftovers rather than on anything in the code.
LoggingTests is the clearest: it expects no log files and finds nine, in the same
device container each time.

Only the two devices the tooling pins are erased, resolved by UDID. A blanket
erase would take out simulator state belonging to other work on a machine the
release pipeline shares.

* Remove the simulator reset again

It was added on the theory that the runner's reused simulators were leaking state
between runs. That theory was wrong: erasing both devices changed nothing — the
same seven suites failed identically before and after.

The leftover files LoggingTests trips on are its own, from a previous attempt of
the same test within one run (the suite runs with -test-iterations 4), so nothing
crosses runs for an erase to clean. Keeping a step that mutates shared state on the
release machine for no measured benefit is worse than not having it.
2026-07-16 14:34:48 +02:00
joel.poyet 4b3cd2c1d0 Record the Xcode provenance mitigation as taken
O8 still recommended adding xcodebuild -version to the release workflow as
future work. The Record toolchain step now does exactly that, so the risk row
described a gap that no longer exists and advised work already done.

The residual risk is narrower than O8 claimed: each run logs its own compiler,
but the log only reveals a runner upgrade after the fact rather than preventing
one.
2026-07-16 00:20:32 +02:00
joel.poyet f741adfbf4 Record the self-hosted-runner trade-off as an accepted risk
unit-tests.yml moving to [self-hosted, macOS] on a pull_request trigger lets
any PR run arbitrary code on novaloop-mac-studio-001 — the same persistent
machine, keychain and signing identities the release pipeline uses. The risk
was accepted on the strength of the repo being INTERNAL, but that reasoning
lived nowhere: nothing in the repo said why it was tolerable, and nothing in
CI would ever say it existed.

Worth recording because the trade-off is invisible to the required checks.
zizmor reports self-hosted-runner only at --persona=auditor; the default
persona CI runs suppresses it, so a green build is not evidence of absence.
Verified both halves against the fix-fork-ci workflow: auditor reports it at
medium severity, the default reports "No findings to report … (3 suppressed)".

Records the exits too, so a future reader inheriting this need not rederive
them: restrict the trigger to non-fork branches, or return to GitHub-hosted
macos-26 with a raised timeout-minutes.
2026-07-16 00:17:18 +02:00
joel.poyet 6b81aeef3f Resync the release plan's embedded workflow and skill with the shipped files
The plan embeds verbatim copies of two shipped files and both had drifted. The
shipped files are correct, so the copies are now byte-identical to them
(verified by cmp against `git show`).

Task 8's workflow still spliced `${{ github.event.inputs.version }}` straight
into the shell, so anyone re-deriving the workflow from the plan reintroduced a
script injection that the regex below it cannot prevent — the input is
interpolated before the check ever runs. It now reads the input via the
`INPUT_VERSION` env var, and gains the `Record toolchain` step that is a
release's only record of which compiler built it now that nothing pins Xcode.

Task 11's skill claimed deleting the app clears `hasSignedInBefore`. It does
not: the flag lives in the shared `group.ch.healthchat` UserDefaults suite,
which survives deletion, so that advice yields a void migration test that looks
like a pass — the precise false negative the section exists to prevent.

Task 3 Step 5 carried the same fault in a subtler form: it matched the bare
substring "skipping loadAccounts", but two lines in
`AuthenticationService.swift` (:52 and :57) end that way and mean opposite
things. Reading them as one told you to dismiss "Classic App not configured" —
migration broken for every user — as a void run. Step 1 already prescribed the
correct remedy and is unchanged.
2026-07-16 00:14:02 +02:00
joel.poyet 2bd8865d4e Correct the release plan and design for the runner's measured state
Both documents told the reader to pin Xcode 26.4 and to install it via a
Brewfile. A probe of novaloop-mac-studio-001 refutes the premise: it carries
exactly one Xcode, 26.6, globally selected, with no versioned siblings and no
26.4 anywhere. The design justified the pin with "the runner has it and the
legacy pipeline proves it works" — both halves are false, and a pin naming an
absent version does not fail fast: xcodes starts a multi-GB authenticated
download that no CI secret can satisfy, so before_all hangs.

Record the no-pin decision and its cost — whatever Xcode the runner has is what
ships, unrecorded — rather than only deleting the wrong instruction, so nobody
reintroduces the pin from the same reasoning. Drop the Brewfile with it: its only
purpose was installing xcodes for that pin, and brew has no business running on a
shared release machine where it could upgrade xcodegen mid-release.

Add the runner's real constraints (no passwordless sudo, single Xcode, five
missing tools installed by hand) to the design, since they are why upstream's
setup_github_actions_environment cannot run here.

Two new risks. The legacy element-ios pipeline pins the same absent 26.4, so it
is very likely broken right now — not this fork's problem to fix, but the human
needs to know before the next legacy release. And with no pin, an Xcode upgrade
on the runner silently changes the compiler for every subsequent release.

The plan's embedded Fastfile and skill now match the branches that implement
them byte-for-byte, so the plan cannot drift from the artefacts it describes.
2026-07-16 00:00:26 +02:00
joel.poyet e4d4541c75 Sync the plan's skill block with the corrected guard wording 2026-07-15 15:08:42 +02:00
joel.poyet 0588cdc542 Correct when the version guard fires relative to xcodes
Task 6 Step 3 asserted the guard must fail before xcodes runs. It cannot:
fastlane's before_all always executes before the lane body, and the plan puts
xcodes in before_all and the guard in the lane. The acceptance criterion was
unmeetable on any machine.

The guard still does what it exists for — aborting before the ~30 minutes of
signing — so the wording was wrong, not the pipeline. Also record that the step
needs the xcodes CLI, since without it the lane dies earlier with an error that
reads like a config problem.
2026-07-15 15:08:12 +02:00
joel.poyet 68ef01cc87 Write the release skill out in full in the plan
Task 11 described the skill's sections rather than showing them, the one place
the plan told an implementer what to write instead of what to type. Replace it
with the complete SKILL.md.

Writing it surfaced a broken convention worth not copying: the legacy skill
documents healthchat-v1.5.0-rc1 style tag suffixes, but the workflow derives the
marketing version by stripping only the healthchat-v prefix, so the suffix reaches
CFBundleShortVersionString, which Apple caps at three integers. Tags are numeric
only here, and test builds go through workflow_dispatch with the marker in the
release notes.
2026-07-15 11:52:43 +02:00
joel.poyet a7f8f667ff Implementation plan for HealthChat App Store release
Task-by-task plan for the three PRs in the release design: the classic migration
fix, the fastlane pipeline, and the releasing-healthchat skill.

The migration fix gets a real test cycle — an existing upstream test,
classicAppAccountRequiresBackup, encodes the behaviour we're changing, so it is
rewritten first and drives the view model change.
2026-07-15 11:09:09 +02:00
joel.poyet 16c6727d29 Design for HealthChat App Store release capability
Spec for bringing App Store release capability to element-x-ios, targeting the
existing HealthChat record that the legacy element-ios fork ships to today.

Both apps share bundle id ch.healthchat.element and team 6G37K72W82, so element-x
arrives as an in-place update rather than a new listing. That drives the design:
the identity already aligns and 26.07.3 clears the legacy's 1.4.1, but the repo
has no release machinery at all, and upstream's Xcode Cloud path is unavailable
because it needs the private Enterprise submodule.

Records three parts: repointing CLASSIC_APP_* at HealthChat's own identifiers so
existing users keep their sessions and encrypted history, a fork-owned fastlane
pipeline ported from the legacy fork, and a releasing-healthchat skill.

Revised after an adversarial review of every factual claim; 26 issues found, none
rejected. Most consequential: the migration fix is not monotonic, because making
loadAccounts() succeed exposes a backup-instructions sheet whose only button opens
element://open — a scheme this app does not register and whose legacy owner has
been replaced in place.
2026-07-15 09:53:18 +02:00
joel.poyet 01dc703b48 Rebrand as HealthChat and pin the account provider to healthchat.ch
Applies the HealthChat product identity through the fork seams upstream already
provides, so no upstream logic files are touched and merges stay clean.

- Variants/HealthChat/healthchat.yml holds the identity scalars (display name,
  bundle id ch.healthchat.element, app group, development team) and is included
  permanently from project.yml. APP_NAME stays ElementX so the module name and
  @testable import ElementX keep working.
- ElementX/Sources/AppHooks/HealthChat/ registers an AppSettings hook pinning
  accountProviders to healthchat.ch with other providers disabled, push through
  sygnal.healthchat.ch and a custom-scheme OIDC redirect; plus a Compound hook
  recolouring the accent token family to the HealthChat blue.
- Entitlements are edited directly in ElementX/SupportingFiles/target.yml rather
  than in the variant, because XcodeGen concatenates arrays on include-merge and
  a variant can override scalars but cannot remove array entries. Drops the
  Element Classic app group and keychain group, and narrows associated domains
  to app.healthchat.ch, keeping matrix.to for permalinks.
- Info.plist CFBundleName now follows APP_DISPLAY_NAME — it, not
  CFBundleDisplayName, is what the web authentication sign-in alert shows.
- App logo and app icon assets swapped in place; the onboarding welcome title
  moves to a new screen_onboarding_welcome_title_ios untranslated string.
2026-07-15 08:46:31 +02:00
3503 changed files with 19119 additions and 53871 deletions
-34
View File
@@ -1,34 +0,0 @@
---
name: constrained-tests
description: Slow-CI simulation — run unit tests on saturated CPU to reproduce CI-style flakiness locally. Suggest when new/reworked suite lean heavy on awaits (deferFulfillment, waitForConfirmation, TestClock, timeouts) or test fail only on CI. Not for every change.
---
# Constrained test runs
CI runners shared + slow. Background tasks starve, awaits stretch, scheduler races flake there, pass locally. `--constrained` saturate CPU with hog tasks — same conditions, local.
## When
- PR add/rework suite heavy on timing-sensitive async: `deferFulfillment`, `waitForConfirmation`, `TestClock`, `transitionValues`, timeouts.
- Test fail on CI, pass locally.
- Not routine changes, not sync suites — slow, no gain.
## How
Full unit test workflow (what CI run):
```bash
swift run tools ci unit-tests --constrained
```
One suite, iterate on new tests (prefer while developing):
```bash
swift run tools ci run-tests --scheme UnitTests --test-name MyNewTests --constrained
```
Hog count automatic (2× cores). Suite survive ~10 constrained iterations → good shape.
## Failures mean
Failure under constraint = real bug in test (sometimes code under test): assertion race async work, transient state observation missed, timeout too tight. Fix synchronisation, no blind timeout bump. Helpers in `UnitTests/Sources/TestUtilities/` (`deferFulfillment`, `deferFailure`, `waitForConfirmation`). Wait on durable state, not transient.
-99
View File
@@ -1,99 +0,0 @@
---
name: periphery-cleanup
description: Dead-code sweep with Periphery — scan the Pro-configured project, delete unused code, guard false positives (keep-alive handles, future-use code), run unit tests, purge scan cache. Use when user want "clean up dead code", "run periphery", "remove unused code".
---
# Periphery cleanup
Periphery = static analysis, find unused code. Scan build ALL schemes — slow (cold ~30-60 min). Maintenance thing, run rare.
## Scan — always on the Pro variant
Scan run on the Pro-configured project so every source get analysed (plain config leave hook implementations + their call sites out, flood report with false "unused"):
```bash
git submodule update --init --recursive # once, if submodules missing
swift run pipeline configure-element-pro
periphery scan --relative-results --quiet > periphery-report.txt
```
Config live in `.periphery.yml` — schemes already cover every target, don't narrow. Two deliberate settings there:
- `retain_unused_protocol_func_params: true` — protocol signatures are contracts (hooks, delegates); params unused in every conformance stay. NEVER annotate protocol function parameters, config already handle them.
- `index_exclude: compound-ios/**` — Compound excluded: its Inspector app + package tests live outside this project's schemes, so their usage invisible → findings there unreliable (e.g. making things internal break the Inspector). Never act on Compound code from this scan.
Report line format: `path:line:col: warning: <kind> '<name>'`. Build fail → fix build first, scan need compiling project.
## Comment hygiene — strip, scan, restore
Every run: existing `periphery:ignore` comments hide drift — code change, comment stay, nobody notice it useless. So:
1. **Strip + remember.** Before the scan, remove every `periphery:ignore` comment (both spellings: `periphery:ignore` and `periphery: ignore`) and stash them: `git diff > /tmp/periphery-comments.patch` right after stripping, or just rely on `git diff` against HEAD to recall what was where.
2. **Scan.** The report now show ground truth: every declaration that genuinely need protection re-flag.
3. **Restore only what re-flag.** For each finding that match the false-positive table, put the comment back (same reason strings). Findings that DON'T re-flag = comments that were stale → stay deleted. Anything newly flagged that isn't a false positive = real dead code → delete it.
Result: comment set always minimal, always true. The clutter never accumulate.
## Triage — kind → action
| Warning | Action |
|---|---|
| Unused function / property / enum / struct / init | Check false-positive table FIRST. True dead → delete whole declaration + helpers/extensions only it used |
| Assign-only property | DANGER ZONE. Prime keep-alive suspect — read table below before touch |
| Unused parameter | Protocol params never appear (config retain them). ObjC selector / system callback → `ignore:parameters <name> - <reason>`. Free signature → remove param + fix call sites |
| Redundant protocol conformance | `TestablePreview` → SKIP, always (see below). Others: verify nothing need conformance (generics, tests, mocks), then remove conformance only, keep type |
| Redundant public accessibility | Drop `public`, make internal — EXCEPT member that satisfy a public protocol in a public type (e.g. `previews`), Swift refuse internal there; skip or internalise whole type |
| Superfluous ignore comment | Declaration referenced now — comment dead, code alive. Remove comment ONLY, never declaration |
Never touch `Generated/` directories, never edit `Localizable.strings`. Delete bottom-up per file — line numbers stay valid.
## False positives — mark, no delete
Stored-never-read variable often alive ON PURPOSE: keep task / SDK object / coordinator alive past declaration scope. Delete = app break silent (observation stop, flow deallocate, rust handle drop). Mark instead: `// periphery:ignore - <reason>` line above declaration (NEVER `periphery:ignore:all` — whole files that shouldn't be reported, like hand-written mocks, belong in `report_exclude` in `.periphery.yml` instead). Comment go ABOVE any doc comment, never between doc and declaration. Reuse existing reasons from codebase:
| Pattern | How recognise | Reason string |
|---|---|---|
| Rust SDK handle | `TaskHandle`, observation token from SDK, stored after `observe`/`subscribe` call | `required for instance retention in the rust codebase` |
| Keep-alive reference | child flow coordinator, service stored so updates keep flowing | `retaining purpose` or `used to avoid deallocation` or `keep alive to keep receiving updates.` |
| Cancellable task handle | `@CancellableTask` property, `Task` stored so reassign/nil cancel previous | `auto cancels when reassigned` |
| SDK enum exhaustiveness | unused `init` switching over SDK enum | `Unused, but added to detect new cases when updating the SDK.` |
| MVVM-C architecture | empty `ViewModelAction` enum from screen template, unused VM protocol — NEVER delete VM protocols, convention keep them | `required for the architecture` (keep the mark even if a superfluous-comment warning appear — it document intent) |
| Property wrapper internals | `@propertyWrapper`, `@dynamicMemberLookup` subscript | `property wrappers generate false positives` / `subscript are seen as false positives` |
| ObjC selector parameter | parameter only touched by runtime (`displayLink`, `sender` etc.) | `ignore:parameters <name> - required for objc selector` |
| Underscored SwiftUI protocol | `_body` from `TextFieldStyle` etc. — called by SwiftUI, members inside resolve transitively | `called by SwiftUI via the TextFieldStyle protocol` |
| SDK delegate requirement | method required by rust SDK delegate protocol (e.g. `didRefreshTokens`) | `required by the SDK's delegate protocol` |
| Synthesized conformance | field only read via synthesized Hashable/Equatable/Codable (cache keys, diffing models) | `used via the synthesized Hashable conformance` |
| Encoded/decoded schema field | Codable field parsed or serialized but not consumed yet | `documents the schema, parsed but not consumed yet` / `part of the encoded payload` |
| Release-only code | compiled out in Debug scan (`#if !DEBUG` paths, nightly checks) | `only used in release builds` |
| `TestablePreview` conformance | flagged "Redundant protocol conformance" on every preview | NO marker, NO removal — Sourcery read conformance, generate snapshot + a11y tests from it. Remove = tests silently vanish. Skip finding, bulk noise |
**Unsure if keep-alive?** Property type Task / AnyCancellable / TaskHandle / coordinator / SDK proxy, assigned inside async or stream setup → smell like keep-alive. ASK USER before delete. Show declaration, where assigned, your read on it.
## Future-use code
Unused but look intentional — API pair completeness, feature half-landed, "team will need soon". No silent delete, no silent keep. Present to user: what, where, opinion keep-or-delete. User say keep → mark `// periphery:ignore - might be useful to have`.
## Mock cascade after protocol deletions
Delete protocol member → Sourcery regenerate mock WITHOUT its `fooReturnValue` / `fooClosure` helpers → hand-written mock `Configuration` inits and test set-up lines still assigning those helpers break the build. Those lines are inert setup for API nothing call — more dead code, not evidence of use. After protocol deletions: grep non-Generated `Mocks/` + `UnitTests/` for `<name>ReturnValue`, `<name>Closure`, direct assignments to deleted members — delete them too. Compiler walk you to the stragglers; that expected, not a false positive.
Careful with same-name members: one mock file often configure SEVERAL protocols (proxy-level `inviter` vs info-level `inviter`). Strip only lines whose target member actually deleted — the wrong one compile fine (member still exist) but silently un-configure previews; snapshot tests catch it, so run them before calling done.
## Verify — on the PLAIN project
Restore the plain configuration BEFORE running tests — snapshots are recorded against plain Element X; Pro branding fail ~8 preview tests falsely:
```bash
git restore project.yml ElementX.xcodeproj/project.pbxproj "ElementX/Resources/AppIcon.icon/Assets/AppIcon.png"
xcodegen
swift run tools ci unit-tests
```
Sourcery regenerate mocks on build — deleted protocol members clean themselves. All tests pass before call done. Note: the CI helper pipe through `xcbeautify` — if not installed the exit code lie even when tests pass; check the `.xcresult` summary.
## Purge cache — always
Periphery DerivedData cache eat tens of GBs. Scan run rare → cache worthless between runs. Last step, no skip:
```bash
rm -rf ~/Library/Caches/com.github.peripheryapp
```
+4 -29
View File
@@ -35,12 +35,6 @@ Verify each item before tagging. If any fail, fix and commit first.
**Numeric only. One to three dot-separated integers.** `26.7.4`. Never `26.7.4-rc1`.
**Store version ≠ bundle version, by decision (2026-10-16).** App Store Connect shows
the 2.x line (2.0.0 shipped the 26.10.1 build; next is 2.1.0), entered by hand when the
store version is created. The tag/bundle version keeps the calendar scheme and must
exceed the previous one. Apple tolerates the mismatch today but documents that they
"should match" — if that ever gets enforced, align the store label to the bundle version.
The marketing version lands verbatim in `CFBundleShortVersionString`, and Apple
rejects anything that is not at most three period-separated integers. A marker
version passes the tag regex and every local gate, then dies at the **upload
@@ -154,13 +148,10 @@ invisible to the other account.
## Self-hosted runner requirements
Runs on `novaloop-mac-studio-001` — an **org-level** runner (`[self-hosted,
macOS, ARM64]`) shared with the legacy fork, not registered per-repo. One machine,
three names: `novaloop-mac-studio-001` in GitHub, hostname `novaloop-mac-studio-2`
(macOS appended `-2` in October 2026), `novaloops-mac-studio` on Tailscale.
macOS, ARM64]`) shared with the legacy fork, not registered per-repo.
- **One Xcode, globally selected.** A single install at `/Applications/Xcode.app`
(**27.1**, build `27A9275`, since 2026-10-16; upgraded in place via the App Store)
— no versioned `Xcode_*.app` siblings. Upstream 26.10.3+ needs the iOS 27 SDK.
(**26.6**, build `17F113`, today) — no versioned `Xcode_*.app` siblings.
**Nothing pins it.** The Fastfile builds with whatever `xcode-select` points at, so
**whatever the runner has is what ships**. Upgrading the runner's Xcode silently
changes the compiler every subsequent release is built with — no tag, no diff, no
@@ -301,23 +292,7 @@ What does need watching:
`post-release.yml` are gated on `github.repository == 'element-hq/element-x-ios'`
and silently no-op here, so rebases drag upstream's version along. Harmless: the
tag is the source of truth.
- **Upstream files this fork edits** (expect conflicts here on every sync):
`AuthenticationStartScreenViewModel` (migration fall-through, see "The migration
contract"), `AppHooks/UserHooks.swift` (two HealthChat hook fields),
`AppSettings.swift` (VoIP push properties for the NSE), `ElementCallService.swift`
(PushKit token storage, expiration parsing), `NSE/Sources/NotificationHandler.swift`
(VoIP push request to Sygnal), `UserSessionFlowCoordinator` (Members tab),
the `SettingsScreen` files, `RoomMemberDetailsScreen` and `UserProfileScreen`
(extended profile section).
- **Sync strategy: patch stack, like healthchat-web.** `release/healthchat` is
upstream's release tag plus the HealthChat commits on top, nothing else. To sync:
rebase the stack onto the new upstream tag (or rebuild it from the resolved final
tree, one commit per topic), verify tree and tests, then force-push
`release/healthchat`. Older release tags keep their commits alive but leave the
branch line, as on the web fork after its rebase onto v1.12.21. `AGENTS.md`'s
no-rewrite rule is about PR branches; this sync is the one sanctioned rewrite.
- **Unit tests need an iOS 27 simulator.** Upstream's video-size expectations are
encoder-dependent; on iOS 26.5 two `MediaUploadingPreprocessorTests` fail for no
real reason.
- **`AuthenticationStartScreenViewModel.login(classicAppAccount:)`** — the only
upstream logic file this fork edits. See "The migration contract".
- **`app.yml`'s `CLASSIC_APP_*`** — upstream owns these and they stay pointed at
Element's ids. The variant overrides them. Do not "fix" `app.yml`.
@@ -1,135 +0,0 @@
---
name: syncing-upstream-healthchat
description: Bring the HealthChat fork (release/healthchat) onto a newer element-hq/element-x-ios release tag. Use when the user asks to rebase, sync, merge or update to upstream, take a new Element X version, or asks why the fork is behind upstream. Covers the patch-stack model, LFS, conflicts, verification, the force-push and the rewind.
---
# Syncing the HealthChat fork with upstream
`release/healthchat` = upstream release tag + HealthChat commits on top. Patch stack, same as
healthchat-web. A sync replaces the stack's base and force-pushes the branch. That is the one
sanctioned history rewrite in this repo; everything else in `AGENTS.md` still holds.
First done 26.09.1 → 26.10.3 (2026-10-16 to 10-19). Numbers below come from that run.
## Before touching anything
- [ ] **Toolchain.** Upstream pins Xcode + iOS in its CI (`runs-on:` in `.github/workflows/`,
`#available(iOS N)` in sources). Dev Mac AND the runner need it. 26.10.3 needed Xcode 27 /
iOS 27 SDK; the runner still had 26.6 and nobody knew — check `xcodebuild -version` on the
Studio (`novaloops-mac-studio` on Tailscale, runner `novaloop-mac-studio-001`). Upgrade via
App Store in place, open once for the licence, `xcodebuild -downloadPlatform iOS`.
- [ ] **Upstream remote.** `git remote add upstream https://github.com/element-hq/element-x-ios.git`
then `git fetch upstream tag release/<old> tag release/<new> --no-tags`. Release tags are
`release/<version>`. After adding the remote, `gh` resolves to upstream — always pass
`-R Novaloop-AG/element-x-ios`.
- [ ] **A 1.4.1 for the migration test.** Legacy users still exist. No 1.4.1 exists anywhere
(TestFlight builds expire, legacy pipeline last built it 2026-04). Build it from Xcode:
worktree of `Novaloop-AG/element-ios` at tag `healthchat-v1.4.1`, submodule
`matrix-ios-sdk`, `xcodegen`, `pod install`, open `Riot.xcworkspace`, scheme `Riot`,
run on the device with automatic signing. Builds on Xcode 27 (warnings only).
- [ ] **Decisions, product owner:** store version label (stays 2.x, bundle version stays
calendar — see releasing skill), new upstream features on/off (26.10.3: search tab on,
search breadcrumbs kept).
## The stack
```bash
git log --oneline release/<old>..release/healthchat --no-merges # the fork's commits
git merge-base --is-ancestor release/<old> release/healthchat # must be true
```
Upstream files the fork edits — conflicts live here every time:
`AuthenticationStartScreenViewModel` (migration fall-through, see releasing skill "The
migration contract"), `AppHooks/UserHooks.swift` (two HealthChat hook fields),
`AppSettings.swift` (VoIP push properties for the NSE), `ElementCallService.swift` (PushKit
token, expiration parsing), `NSE/Sources/NotificationHandler.swift` (VoIP push to Sygnal),
`UserSessionFlowCoordinator` (Members tab), `SettingsScreen*` (account status section, Labs
gate), the five help URLs are `URL?` (`AppSettings`, `SessionVerificationScreen*`,
`IdentityConfirmationScreen*`, `SecureBackupScreen*`, `RoomScreenModels` + `RoomScreenFooterView`,
`SecurityAndPrivacyScreenModels`, `TimelineViewModel` alert — nil hides the "Learn more" link), `UnitTests/Sources/AnalyticsTests.swift` (suite skipped without PostHog secrets),
`Components/Secrets/Secrets.swift` (analytics/sentry/rageshake nil, hand-edited; upstream's setup
marks it `assume-unchanged`, so run `git update-index --no-assume-unchanged` on it before an
edit shows up in `git status` or a commit),
`RoomMemberDetailsScreen*` + `UserProfileScreen*` (extended profile section), the five fork-gated
CI workflows, `.gitignore`, `project.pbxproj` (never resolve by hand — `xcodegen`).
## Two ways to rebuild the stack
**A. Plain rebase** — `git rebase --onto release/<new> release/<old> release/healthchat` on a
scratch branch, resolve per commit. Faithful, but every conflicting commit must be resolved in
its own context; upstream API removals (26.10.3: `AppHooks.configure(with:)`, `HomeTabsHook`,
`CommonSettingsProtocol`, `appSettings` out of flow parameters) cannot be "resolved", they
need new code. Expect rebased intermediates that do not compile; only the tip has to.
**B. Resolve once, assemble the stack** (used for 26.10.3):
1. Scratch branch off `release/healthchat`, `git merge --no-commit release/<new>`, resolve all
conflicts once, add the rework commits until it builds and tests pass. This is the
*final tree*. Verify it fully (next section) — the stack only reproduces it.
2. Scratch branch off `release/<new>`, rebase the original commits with conflicts resolved to
the fork side blindly (`git checkout --theirs`), then append fix commits whose content is
`git checkout <final tree> -- <files>` per topic:
`chore(healthchat): resolve the rebase onto upstream <new>` (leftovers: workflows, package
pins, Enterprise pointer, start screen), one commit per rework topic, `test(healthchat):
refresh snapshots after rebase onto <new>`, docs. Order of fix commits: resolution first.
3. `git diff --stat <final tree> HEAD` must be empty.
Reproducing historic commits: commit with `--no-verify`, else the SwiftFormat hook rewrites
them. `git cherry-pick` has no `-q`. In zsh, `for c in $VAR` does not split on newlines and a
variable named `path` *is* `PATH` — use `while read`, never name a variable `path`.
## Git LFS — the part that bites
- Checkouts/merges done with `GIT_LFS_SKIP_SMUDGE=1` leave pointer files. Run
`git lfs checkout` before any test run: media fixtures (`UnitTests/Resources`) as pointers
fail `MediaUploadingPreprocessorTests`, `MediaProviderTests`, `VoiceMessageRecorderTests`.
- origin is a standalone repo; upstream's LFS objects are not there. GitHub rejects a push
whose *history* references LFS objects it lacks (`GH008 … unknown Git LFS objects`).
`git lfs fetch upstream release/<new>` gets the tip only. Fetch the tree of every upstream
commit that touched LFS paths, one by one:
```bash
git log --format=%H release/<old>..release/<new> -- '*.png' '*.jpg' '*.gif' '*.mp4' '*.m4a' \
| sort -u | while read c; do git lfs fetch upstream "$c"; done
git lfs push origin <branch> # must report no "(missing)"; then git push
```
A single missing object = one failed fetch; refetch that commit. 26.10.3: 35 commits, ~5 GB.
- Snapshot recording (`swift run tools ci preview-tests --record`, iPhone SE 3rd gen,
iOS version from `Tools/Sources/Commands/CI/CI.swift`) re-records upstream references too
(284 of ~2400 differed on our Mac). Keep only `healthChat*` snapshots; revert upstream's.
## Verification of the final tree
- Build ElementX, NSE, ShareExtension (`xcodebuild build -scheme ElementX` covers all three).
- Unit tests on an **iOS 27+ simulator** matching upstream's CI OS; two video-size tests are
encoder-dependent and fail on older simulators for no reason.
- Migration guard: `healthChatProviderAllowsLegacyAccount` in
`AuthenticationStartScreenViewModelTests` (real hook values → `.welcomeBack`) and
`classicAppAccountRequiresBackupFallsThroughToLogin` must pass.
- Runner: push the branch, `gh workflow run unit-tests.yml --ref <branch>` if the
`pull_request` trigger stays silent. A job whose predecessor was cancelled mid-run can crash
the test host at launch ("Early unexpected exit … signal kill") — plain re-run.
- Device matrix (owner): 1.4.1 → new on a never-used device (log "Already signed in to
Element X before" = void run, "Classic App not configured" = broken), previous release → new,
VoIP ringing on a Debug build (Sygnal `.dev` entries need `platform: sandbox`), push +
badges, Members tab next to any new upstream tab.
## Force-push, rewind
```bash
git push origin <old tip>:refs/heads/backup/release-healthchat-before-<new>
git push --force-with-lease=release/healthchat:<old tip> origin <stack>:release/healthchat
git checkout release/healthchat && git reset --hard origin/release/healthchat # every clone
```
Branch is unprotected: the push lands immediately. Old release tags keep their commits alive
and off the branch line. Rewind = `git push --force origin healthchat-v<last>^{commit}:release/healthchat`.
A rewind does not remove a tag or TestFlight build made on the new history — tag only after
the device tests. Then update `HEALTHCHAT_CHANGES.md`, the releasing skill (Xcode, divergence
list) and this skill with what changed.
## What not to do
- Squash the fork into a side branch and *merge* upstream there: merging back into the
unsquashed branch conflicts on every file (81 on 26.10.3) and duplicates every commit.
- Resolve `project.pbxproj` by hand. Commit the post-lane project file. Pull on a rewritten
branch (merges the old history back in).
+1 -1
View File
@@ -1,5 +1,5 @@
UITests/Sources/__Snapshots__/** filter=lfs diff=lfs merge=lfs -text
Components/DevelopmentAssets/Media/** filter=lfs diff=lfs merge=lfs -text
DevelopmentAssets/Media/** filter=lfs diff=lfs merge=lfs -text
UnitTests/__Snapshots__/** filter=lfs diff=lfs merge=lfs -text
PreviewTests/Sources/__Snapshots__/** filter=lfs diff=lfs merge=lfs -text
compound-ios/Tests/CompoundTests/__Snapshots__/** filter=lfs diff=lfs merge=lfs -text
+1 -1
View File
@@ -6,7 +6,7 @@ git lfs post-checkout "$@"
export PATH="$PATH:/opt/homebrew/bin"
# ignores updates of 'Secrets.swift' to avoid pushing sensitive data by mistake
git update-index --assume-unchanged Components/Secrets/Secrets.swift
git update-index --assume-unchanged Secrets/Secrets.swift
LOCAL_SCRIPT_PATH="$HOME/.local/elementx_local_dev/post-checkout"
if [ -x "$LOCAL_SCRIPT_PATH" ]; then
-1
View File
@@ -4,7 +4,6 @@
- [ ] I am aware of the [etiquette](https://github.com/element-hq/element-x-ios/blob/develop/CONTRIBUTING.md#etiquette).
- [ ] Pull request contains a [changelog label](https://github.com/element-hq/element-x-ios/blob/develop/CONTRIBUTING.md#changelog).
- [ ] This PR has been made with the help of an LLM.
- Model and harness used: <!-- e.g. Claude Opus 5.5 with Claude Code -->
**UI changes have been tested with:**
- [ ] iPhone and iPad simulators in portrait and landscape orientations.
-4
View File
@@ -28,10 +28,6 @@ changelog:
labels:
- pr-wip
- title: 💼 Element Pro
labels:
- pr-element-pro
- title: Others
labels:
- pr-misc
+2 -2
View File
@@ -16,7 +16,7 @@ jobs:
# than deleted so the file keeps rebasing cleanly. Run locally with
# `swift run tools ci accessibility-tests`.
if: github.repository == 'element-hq/element-x-ios'
runs-on: xcode-27
runs-on: macos-26
timeout-minutes: 150
concurrency:
@@ -36,7 +36,7 @@ jobs:
run: swift run -q tools ci accessibility-tests
- name: Archive artifacts
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: failure()
with:
name: Results
@@ -13,14 +13,14 @@ permissions: {}
# Patch bumps are handled by the release script.
jobs:
automatic-calendar-version:
runs-on: xcode-27
runs-on: macos-26
timeout-minutes: 15
# Skip in forks
if: github.repository == 'element-hq/element-x-ios'
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
+8 -8
View File
@@ -25,8 +25,8 @@ jobs:
# permissions: {} leaves a metadata-only token that cannot read an INTERNAL repo. Gated rather
# than deleted so the file keeps rebasing cleanly.
if: github.repository == 'element-hq/element-x-ios'
runs-on: xcode-27
timeout-minutes: 25
runs-on: macos-26
timeout-minutes: 15
concurrency:
# When running on develop, use the sha to allow all runs of this workflow to run concurrently.
@@ -39,8 +39,8 @@ jobs:
with:
persist-credentials: false
- name: Configure Xcode 27
run: sudo xcode-select -s /Applications/Xcode_27.app
- name: Configure Xcode 26
run: sudo xcode-select -s /Applications/Xcode_26.5.app
- name: Install sourcery
run: brew install sourcery
@@ -50,11 +50,11 @@ jobs:
run: sourcery --config Tools/Sourcery/PreviewTestsConfig.yml
- name: Create simulator
run: xcrun simctl create "Snapshots" "iPhone SE (3rd generation)" "com.apple.CoreSimulator.SimRuntime.iOS-27-0"
run: xcrun simctl create "Snapshots" "iPhone SE (3rd generation)" "com.apple.CoreSimulator.SimRuntime.iOS-26-5"
- name: Run tests
working-directory: compound-ios
run: set -o pipefail && xcodebuild test -scheme 'Compound' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=Snapshots,OS=27.0' -skipPackagePluginValidation -resultBundlePath Logs/CompoundTests.xcresult | xcbeautify --renderer github-actions
run: set -o pipefail && xcodebuild test -scheme 'Compound' -sdk iphonesimulator -destination 'platform=iOS Simulator,name=Snapshots,OS=26.5' -skipPackagePluginValidation -resultBundlePath Logs/CompoundTests.xcresult | xcbeautify --renderer github-actions
- name: Zip artifacts
if: failure() # We only care about artefacts if the tests fail
@@ -62,7 +62,7 @@ jobs:
run: zip -r Logs/CompoundTests.xcresult.zip Logs/CompoundTests.xcresult/
- name: Archive artifacts
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
if: failure() # We only care about artefacts if the tests fail
with:
name: test-results
@@ -71,7 +71,7 @@ jobs:
if-no-files-found: ignore
- name: Upload coverage to Codecov
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
fail_ci_if_error: false
token: ${{ secrets.CODECOV_TOKEN }}
+33
View File
@@ -0,0 +1,33 @@
name: Danger CI
on:
pull_request:
types: [labeled, synchronize, opened, reopened]
permissions: {}
jobs:
build:
name: Danger
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read # HealthChat: this fork is INTERNAL, so a metadata-only token 404s on checkout. Upstream is public, hence permissions: {} there.
issues: read # HealthChat: Danger reads the PR via the issues API (a PR is an issue there); pull-requests alone 403s on GET /issues/{n}.
pull-requests: write # HealthChat: Danger posts its report comment and inline SwiftLint review comments (Dangerfile.swift:5 sets inline: true) with GITHUB_TOKEN.
concurrency:
# Only allow a single run of this workflow on each branch, automatically cancelling older runs.
group: ${{ format('danger-ci-{0}', github.ref) }}
cancel-in-progress: true
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- name: Danger
uses: danger/swift@434d7c25f3b02d490a340b23f5e78dd15a5670bc # 3.22.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+6 -8
View File
@@ -18,7 +18,7 @@ jobs:
# HealthChatAppSettingsHook sets allowOtherAccountProviders: false, hiding the change-server UI
# these tests drive. Gated rather than deleted so the file keeps rebasing cleanly.
if: github.repository == 'element-hq/element-x-ios'
runs-on: xcode-27
runs-on: macos-26
timeout-minutes: 45
concurrency:
@@ -27,7 +27,7 @@ jobs:
cancel-in-progress: false
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
@@ -42,21 +42,19 @@ jobs:
INTEGRATION_TESTS_PASSWORD: ${{ secrets.INTEGRATION_TESTS_PASSWORD }}
- name: Archive artifacts
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
# We only care about artefacts if the tests fail
if: failure()
with:
name: Results
path: |
test_output/IntegrationTests.xcresult.zip
test_output/console*
path: test_output/IntegrationTests.xcresult.zip
retention-days: 7
if-no-files-found: ignore
- name: Upload coverage to Codecov
# Skip if not successful and in forks
if: ${{ success() && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }}
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
report_type: coverage
files: test_output/integration-cobertura.xml
@@ -68,7 +66,7 @@ jobs:
- name: Upload test results to Codecov
# Skip if cancelled and in forks
if: ${{ !cancelled() && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }}
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
continue-on-error: true
with:
report_type: test_results
-109
View File
@@ -1,109 +0,0 @@
name: PR Checks
on:
# Privilege escalation necessary to comment on pull requests from forks.
# 🚨 We must not check out or execute any code here, and be careful around use of user-controlled inputs.
pull_request_target: # zizmor: ignore[dangerous-triggers]
types: [opened, reopened, edited, synchronize, labeled, unlabeled]
permissions: {}
jobs:
pr-checks:
name: PR Checks
runs-on: ubuntu-latest
timeout-minutes: 5
concurrency:
# Only allow a single run of this workflow on each branch, automatically cancelling older runs.
group: ${{ format('pr-checks-{0}', github.ref) }}
cancel-in-progress: true
permissions:
pull-requests: write
steps:
- name: Check the pull request
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
const pr = context.payload.pull_request;
const body = pr.body ?? "";
const files = await github.paginate(github.rest.pulls.listFiles, {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.number
});
const paths = files.map(file => file.filename.toLowerCase());
const warnings = [];
const failures = [];
if (pr.additions > 1000) {
warnings.push("This pull request seems relatively large. Please consider splitting it into multiple smaller ones.");
}
if (!body) {
warnings.push("Please provide a description for this PR.");
}
if (paths.some(path => path.includes("/view")) && !body.includes("user-attachments")) {
warnings.push("You seem to have made changes to views. Please consider adding screenshots.");
}
if (paths.some(path => path.includes(".xcassets") && path.endsWith(".png"))) {
warnings.push("You seem to have made changes to some resource images. Please consider using an SVG or PDF.");
}
if (pr.title.endsWith("…") || /^(Fixes|Fix) #\d+/.test(pr.title) || /^\w+\(\w+\):/.test(pr.title)) {
failures.push("Please provide a complete title that can be used as a changelog entry.");
}
if (pr.labels.filter(label => label.name.startsWith("pr-")).length !== 1) {
failures.push("Please add a `pr-` label to categorise the changelog entry.");
}
warnings.forEach(warning => core.warning(warning));
failures.forEach(failure => core.error(failure));
// Keep a single comment up to date rather than adding a new one on every run.
const marker = "<!-- pr-checks -->";
const comments = await github.paginate(github.rest.issues.listComments, {
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number
});
const existing = comments.find(comment => comment.body.includes(marker));
if (warnings.length || failures.length) {
const lines = [...failures.map(failure => `- ❌ ${failure}`),
...warnings.map(warning => `- ⚠️ ${warning}`)];
const commentBody = `${marker}\n### PR Checks\n\n${lines.join("\n")}`;
if (existing) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existing.id,
body: commentBody
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pr.number,
body: commentBody
});
}
} else if (existing) {
await github.rest.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existing.id
});
}
if (failures.length) {
core.setFailed(`${failures.length} check(s) failed, see the comment on the pull request.`);
}
+2 -2
View File
@@ -10,8 +10,8 @@ permissions: {}
jobs:
record-snapshots:
name: Record Preview Snapshots
runs-on: xcode-27
timeout-minutes: 60
runs-on: macos-26
timeout-minutes: 45
if: >
github.event.label.name == 'record-snapshots' &&
+3 -3
View File
@@ -11,7 +11,7 @@ permissions: {}
jobs:
update-project:
name: Update Xcode project
runs-on: xcode-27
runs-on: macos-26
timeout-minutes: 20
permissions:
contents: write
@@ -25,7 +25,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ github.head_ref }}
token: ${{ secrets.ELEMENT_BOT_TOKEN }}
@@ -48,7 +48,7 @@ jobs:
run: xcodebuild -scheme ElementX -project ElementX.xcodeproj -destination 'generic/platform=iOS Simulator' build
- name: Update Acknowledgements
run: swift-package-list ElementX.xcodeproj --requires-license --ignore-package compound-ios --ignore-package compound-design-tokens --ignore-package matrix-rich-text-editor-swift --ignore-package element-call-swift --ignore-package element-call-ios --ignore-package matrix-rust-rtc --output-type settings-bundle --output-path ElementX/SupportingFiles
run: swift-package-list ElementX.xcodeproj --requires-license --ignore-package compound-ios --ignore-package compound-design-tokens --ignore-package matrix-rich-text-editor-swift --ignore-package element-call-swift --output-type settings-bundle --output-path ElementX/SupportingFiles
- name: Commit and push changes
run: |
+7 -11
View File
@@ -13,21 +13,17 @@ jobs:
issues: write
pull-requests: write
steps:
- uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11
- uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0
with:
labels-to-remove-when-unstale: "X-Needs-Info"
# Issues
only-issue-labels: "X-Needs-Info"
only-labels: "X-Needs-Info"
days-before-issue-stale: 30
days-before-issue-close: 7
stale-issue-label: "Stale"
stale-issue-message: "This issue has been awaiting further information for the past 30 days so will now be marked as stale. Please provide the requested information within the next 7 days to keep it open."
close-issue-message: "This issue is being closed due to inactivity after further information was requested."
# Pull requests
days-before-pr-stale: 30
days-before-pr-close: 7
stale-pr-label: "Stale"
stale-pr-label: "stale"
stale-pr-message: "This pull request has seen no activity for the past 30 days and will now be marked as stale. Please update it or leave a comment within the next 7 days to keep it open."
close-pr-message: "This pull request is being closed due to inactivity."
stale-issue-label: "stale"
labels-to-remove-when-unstale: "X-Needs-Info"
stale-issue-message: "This issue has been awaiting further information for the past 30 days so will now be marked as stale. Please provide the requested information within the next 7 days to keep it open."
close-issue-message: "This issue is being closed due to inactivity after further information was requested."
+2 -2
View File
@@ -9,14 +9,14 @@ permissions: {}
jobs:
open-translations-pr:
runs-on: xcode-27
runs-on: macos-26
timeout-minutes: 15
# Skip in forks
if: github.repository == 'element-hq/element-x-ios'
steps:
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
+4 -4
View File
@@ -21,7 +21,7 @@ jobs:
# UITests snapshot, so it would fail on content instead. Gated rather than deleted so the file
# keeps rebasing cleanly. Run locally with `swift run tools ci ui-tests`.
if: github.repository == 'element-hq/element-x-ios'
runs-on: xcode-27
runs-on: macos-26
timeout-minutes: 90
strategy:
fail-fast: false
@@ -52,7 +52,7 @@ jobs:
GITHUB_EVENT_INPUTS_TEST_NAME: ${{ github.event.inputs.test_name }}
- name: Archive artifacts
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
# We only care about artefacts if the tests fail
if: failure()
with:
@@ -64,7 +64,7 @@ jobs:
- name: Upload coverage to Codecov
# Skip if not successful and in forks
if: ${{ success() && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }}
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
report_type: coverage
files: test_output/ui-cobertura.xml
@@ -76,7 +76,7 @@ jobs:
- name: Upload test results to Codecov
# Skip if cancelled and in forks
if: ${{ !cancelled() && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }}
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
continue-on-error: true
with:
report_type: test_results
+3 -18
View File
@@ -13,8 +13,8 @@ permissions: {}
jobs:
tests:
name: Tests (Enterprise)
runs-on: xcode-27
timeout-minutes: 60
runs-on: macos-26
timeout-minutes: 45
# Skip in forks
# HealthChat: this job can never pass in this fork — it needs
@@ -41,29 +41,14 @@ jobs:
- name: Setup environment
run: source ci_scripts/ci_common.sh && setup_github_actions_environment
- name: Restore compilation cache
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/Library/Developer/Xcode/CompilationCache.noindex
key: compilation-cache-unit-tests-enterprise-${{ github.sha }}
restore-keys: compilation-cache-unit-tests-enterprise-
- name: Configure Enterprise
run: swift run -q pipeline configure-element-pro
- name: Run tests
run: swift run -q tools ci unit-tests --skip-previews
- name: Save compilation cache
# Only develop populates the cache, all of the other runs simply read from it.
if: ${{ !cancelled() && github.event_name == 'push' && github.ref == 'refs/heads/develop' }}
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/Library/Developer/Xcode/CompilationCache.noindex
key: compilation-cache-unit-tests-enterprise-${{ github.sha }}
- name: Archive artifacts
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
# We only care about artefacts if the tests fail
if: failure()
with:
+3 -18
View File
@@ -71,13 +71,6 @@ jobs:
# of which Xcode built a given run.
xcodebuild -version
- name: Restore compilation cache
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/Library/Developer/Xcode/CompilationCache.noindex
key: compilation-cache-unit-tests-${{ github.sha }}
restore-keys: compilation-cache-unit-tests-
- name: Run tests
# HealthChat: previews are skipped. PreviewTests renders a snapshot for every preview in the
# app and was the entire reason this job could not fit in an hour — it never once finished,
@@ -93,16 +86,8 @@ jobs:
CI_SKIP_TESTS: VoiceMessageCacheTests
run: swift run -q tools ci unit-tests --skip-previews
- name: Save compilation cache
# Only develop populates the cache, all of the other runs simply read from it.
if: ${{ !cancelled() && github.event_name == 'push' && github.ref == 'refs/heads/develop' }}
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/Library/Developer/Xcode/CompilationCache.noindex
key: compilation-cache-unit-tests-${{ github.sha }}
- name: Archive artifacts
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
# We only care about artefacts if the tests fail
if: failure()
with:
@@ -118,7 +103,7 @@ jobs:
# runs without a CODECOV_TOKEN — which fails the job via
# fail_ci_if_error. Gate on the upstream repo as post-release.yml does.
if: ${{ success() && github.repository == 'element-hq/element-x-ios' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }}
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
report_type: coverage
files: test_output/unit-cobertura.xml,test_output/preview-cobertura.xml
@@ -132,7 +117,7 @@ jobs:
# HealthChat: gated on the upstream repo for the same reason as the
# coverage step above — no CODECOV_TOKEN exists in this fork.
if: ${{ !cancelled() && github.repository == 'element-hq/element-x-ios' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }}
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
continue-on-error: true
with:
report_type: test_results
+2 -2
View File
@@ -18,9 +18,9 @@ jobs:
actions: read # HealthChat: upload-sarif additionally needs this on private/internal repos; public upstream does not.
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- name: Run zizmor 🌈
uses: zizmorcore/zizmor-action@cc914d7f3750a2d13d75c7f184a1060aa0e9d482 # v0.6.4
uses: zizmorcore/zizmor-action@192e21d79ab29983730a13d1382995c2307fbcaa # v0.5.7
+16 -10
View File
@@ -18,9 +18,22 @@ DerivedData/
.swiftpm
.netrc
# fastlane
#
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
towncrier.toml.tmp
version_changes.md
build
/vendor/
*/xcshareddata/xcodecloud
## macOS Files
.DS_Store
@@ -34,8 +47,8 @@ build
test_output
# Only commit Pkl packages (there may be other caches in here).
Components/Secrets/vendor/*
!Components/Secrets/vendor/package-2
Secrets/vendor/*
!Secrets/vendor/package-2
# fastlane release outputs
out/
@@ -43,10 +56,3 @@ provisioning_profiles/
# Regenerated by every fastlane invocation, including on the runner. Ignored rather than
# committed, matching element-ios.
fastlane/README.md
# Review working data (per-machine)
.claude/review-context/
.claude/review-log.jsonl
# Local SDK development override
matrix-rust-components-swift
+10 -22
View File
@@ -1,31 +1,19 @@
project: ElementX.xcodeproj
# Periphery scans all targets built by these schemes. The ElementX scheme also
# builds NSE, ShareExtension and MatrixRustSDKMocks as dependencies. Always run
# the scan with the project configured for the Pro variant so that all of the
# sources are analysed (see the periphery-cleanup skill).
schemes:
- ElementX
- UnitTests
- PreviewTests
- UITests
- IntegrationTests
- AccessibilityTests
# Compound is excluded: its Inspector app and package tests aren't part of any
# scheme in this project, so usage from them is invisible to the analysis.
index_exclude:
- "**/*?.build/**/*"
- "**/SourcePackages/checkouts/**"
- "compound-ios/**"
targets:
- ElementX
- NSE
- ShareExtension
- UnitTests
- PreviewTests
- UITests
- IntegrationTests
report_exclude:
- "**/Generated/**"
# Hand-written mocks: configuration surface is deliberately broader than any test uses.
- "**/Mocks/**"
- "ElementX/Sources/Services/AppLock/LAContextMock.swift"
# Pure payload schema, fields exist to be encoded.
- "ElementX/Sources/Services/Notification/Manager/APNSPayload.swift"
# Backports: everything gated on #available, cleaned up with each OS drop.
- "ElementX/Sources/Other/SwiftUI/Backports.swift"
- ElementX/Sources/Mocks/Generated/GeneratedMocks.swift
- ElementX/Sources/Mocks/Generated/SDKGeneratedMocks.swift
retain_swift_ui_previews: true
# Protocol signatures are contracts (hooks, delegates) — parameters unused in
# every current conformance are still part of the interface's design.
retain_unused_protocol_func_params: true
+1 -1
View File
@@ -1,6 +1,6 @@
--swiftversion 5.6
--exclude **/Sources/**/Generated,vendor,**/Package.swift,Components/Secrets/**,build
--exclude **/Sources/**/Generated,vendor,**/Package.swift,Secrets/**
--disable wrapMultiLineStatementBraces
--disable hoistPatternLet
+1 -2
View File
@@ -3,7 +3,6 @@ disabled_rules:
- unused_setter_value
- redundant_discardable_let
- identifier_name
- void_function_in_ternary
opt_in_rules:
- force_unwrapping
@@ -18,7 +17,7 @@ included:
excluded:
- "*/Sources/Generated/*"
- Tools/Sources # Our command-line tools use a lot of print commands.
- Components/Secrets
- Secrets
- compound-ios/Inspector
line_length:
+4 -31
View File
@@ -14,9 +14,6 @@ PRs must follow rules. Prefer Xcode MCP tools over terminal commands.
- **SwiftLint** (.swiftlint.yml) + **SwiftFormat** (.swiftformat) enforce style on build. Warnings show in Xcode. Build before **XcodeRefreshCodeIssuesInFile**.
- Follow [Swift API Design Guidelines](https://www.swift.org/documentation/api-design-guidelines/) everywhere, Rust SDK wrappers too (`ID` not `Id`, `URL` not `Url`, `configuration` not `config` or `cfg`).
- File headers live in `IDETemplateMacros.plist`.
- **Import `SwiftUI`, not `UIKit`** — need `UIPasteboard` etc, `SwiftUI` bring it. `SwiftUI` re-export `Foundation` too, so no `import Foundation` beside it.
- **Clean Code** (Robert C. Martin) Newspaper order: headline first, detail down. Stepdown rule: caller above callee, calls point down. Tests: test cases first, helpers below. Swift idiom always win on clash.
- **Member order in type**: properties (stored + computed, public + private) → `init` → functions. `View` types: properties → `init` → views (`body` first) → functions.
### Comments
@@ -55,12 +52,10 @@ PRs must follow rules. Prefer Xcode MCP tools over terminal commands.
## Pull Request Guidelines
- New branch from `develop` must not track `develop`.
- Sentence-style titles (no conventional commits).
- Exactly one `pr-` label (see `.github/release.yml`).
- Title = changelog entry — descriptive, no "Fixes #…".
- Leave description template for developer. Point them to [contributing etiquette](CONTRIBUTING.md#etiquette).
- Only fill template LLM line: tick box, name model + harness that made PR (e.g. Claude Opus 5.5, Claude Code).
- Screenshots/videos for visual changes.
- 500 additions max — split big changes.
- Commits need title + description. No tiny commits, no massive commits.
@@ -71,10 +66,7 @@ PRs must follow rules. Prefer Xcode MCP tools over terminal commands.
## Releasing
HealthChat ship via tag `healthchat-v*` → TestFlight. Full runbook in
`.agents/skills/releasing-healthchat/SKILL.md`. `release/healthchat` = upstream tag +
HealthChat commits on top (patch stack). Upstream sync rebase stack, force-push branch —
only rewrite allowed; procedure in
`.agents/skills/syncing-upstream-healthchat/SKILL.md`. Read skill before release, cert
`.agents/skills/releasing-healthchat/SKILL.md`. Read skill before release, cert
renewal, or touching `fastlane/`. No duplicate runbook here.
---
@@ -285,16 +277,13 @@ Services = where product-level opinions live (Rust SDK stays spec-faithful).
- Inject via `init` parameters.
- Screen coordinators get `Parameters` struct with specific dependencies.
- `CommonFlowParameters` flow-coordinator-only.
- `UserSession` = per-account dependency container (`clientProxy`, `userSettings`, `mediaProvider`…).
- Need 2+ from it? Pass `userSession` down. Need 1? Pass that one direct.
- Receiver may store only pieces it need (e.g. `clientProxy`, `userSettings`).
- Never pass `userSession` plus value it already owns (e.g. `userSession` + `userSettings`).
- `ServiceLocator` **deprecated** — never use services directly. Always inject from above.
---
## Concurrency & Actors
- All targets **Swift 6** language mode (`SWIFT_VERSION: 6`), approachable concurrency. Compiler version come from Xcode toolchain.
- All targets **Swift 6.2**, approachable concurrency.
- **ElementX** app, **UnitTests** + **PreviewTests**: `SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor` — no redundant `@MainActor`. Other targets (incl. app extensions) nonisolated.
- Services + data-layer types: `nonisolated` + `Sendable` when background work need.
- Never `@unchecked Sendable` / `nonisolated(unsafe)`. Dev add these.
@@ -389,22 +378,6 @@ Same pattern for publishers.
---
## Xcode Agent Skills
Apple ship agent skills with Xcode 27. Installed per machine, not in repo. Skill missing? Suggest user export them (Xcode running): `xcrun agent skills export --output-dir <agent skills dir>` (Claude Code: `~/.claude/skills`). User decline? Skip skill, carry on.
Skill clash this file? This file win. Build settings, entitlements, Info.plist keys, targets → `project.yml`/`target.yml` + `xcodegen`, never `.xcodeproj` or Xcode project-write tools (`UpdateTargetBuildSetting`, `AddEntitlement`…). API newer than target's deployment target → `#available`.
| Skill | Best moment |
|-------|-------------|
| `swiftui-specialist` | Writing/reviewing views: data flow, `ForEach`/`List` identity, environment, perf. `L10n` + Compound tokens beat its samples. |
| `device-interaction` | Runtime check of UI/flow change (subagent skill). Xcode must open this checkout. No login: env `UI_TESTS_SCREEN=<UITestsScreenIdentifier case>` launch that case's mock fixture, no real session. `roomLayout*`, `appLockFlow*`, `*Pagination` need UITests runner. |
| `swiftui-whats-new-27` | SDK 27 `@State`/`@ContentBuilder` compile errors, or adopting iOS 27 SwiftUI APIs. Keep `AlertInfo` alerts. |
| `modernize-tests` | Modernizing UnitTests suites (`@Test(arguments:)`, `withKnownIssue`, `#require`). XCUI targets stay XCTest. Keep `deferFulfillment`/`waitForConfirmation` — bare `confirmation()` no wait async. No `.serialized`/`@MainActor` adds. |
| `app-intents-specialist`, `app-intents-whats-new-27` | Adding App Intents/Shortcuts/Siri/controls (full support planned; iOS 26+ APIs → `-whats-new-27`). Not SiriKit `IN*` code. Intent strings need `LocalizedStringResource` — `L10n` return `String`. |
---
## Key Files
| File | Purpose |
@@ -413,7 +386,7 @@ Skill clash this file? This file win. Build settings, entitlements, Info.plist k
| `app.yml` | App-level XcodeGen config |
| `.swiftlint.yml` | SwiftLint rules |
| `.swiftformat` | SwiftFormat rules |
| `.github/workflows/pr-checks.yml` | PR metadata checks (title, labels, size, screenshots) |
| `Dangerfile.swift` | Danger PR checks |
| `Package.swift` | SPM manifest (Tools CLI) |
| `localazy.json` | Localazy translation config |
| `codecov.yml` | Codecov config |
@@ -53,10 +53,6 @@ final class AccessibilityTests: XCTestCase {
private func performAccessibilityAuditForPreview(named name: String) {
// Alows us to log the name of the preview that is being tested
XCTContext.runActivity(named: name) { _ in
// Previews that focus a text field bring up the system keyboard, which we can't fix.
// Snapshot the keyboard in one query so one that's dismissing can't fail the test between checking and reading it.
let keyboardFrame = (try? app.keyboards.firstMatch.snapshot().frame) ?? .null
do {
// We have removed `textClipped` and `contrast` for now
try app.performAccessibilityAudit(for: [.dynamicType, .elementDetection, .hitRegion, .sufficientElementDescription, .trait]) { issue in
@@ -70,11 +66,6 @@ final class AccessibilityTests: XCTestCase {
return true
}
// The system keyboard's own elements aren't ours to fix
if keyboardFrame.contains(element.frame) {
return true
}
// We are fine with elements that only partially support dynamic types
guard issue.compactDescription != Self.partiallyUnsupportedDynamicTypeMessage else {
return true
@@ -107,6 +98,7 @@ final class AccessibilityTests: XCTestCase {
private static let partiallyUnsupportedDynamicTypeMessage = "Dynamic Type font sizes are partially unsupported"
private static let notHumanReadableMessage = "Label not human-readable"
private static let elementHasNoDescription = "Element has no description"
/// Use this array to filter add specific filters to ignore specific issues for certain elements
private static let ignoredA11yIdentifiers: [String: [FilterType]] = [
@@ -116,7 +108,11 @@ final class AccessibilityTests: XCTestCase {
/// Use this array to filter add specific filters to ignore specific tests
private static let ignoredA11yTest: [String: [FilterType]] = [
// It's an image rendering test doesn't need to have descriptions
"RoomAvatarImage_Previews-0": [.auditType(.sufficientElementDescription)]
"RoomAvatarImage_Previews-0": [.auditType(.sufficientElementDescription)],
// Empty container slots of the principal search toolbar, system chrome with nothing to describe
"SearchScreen_Previews-Empty": [.emptyContainerDescription],
"SearchScreen_Previews-No results": [.emptyContainerDescription],
"SearchScreen_Previews-Loaded": [.emptyContainerDescription]
]
}
@@ -125,6 +121,8 @@ private enum FilterType {
case compactDescription(String)
/// Filter by the type of the issue
case auditType(XCUIAccessibilityAuditType)
/// Filter "no description" issues on empty container elements (label + identifier empty), e.g. system toolbar slots
case emptyContainerDescription
}
private extension Array where Element == FilterType {
@@ -136,6 +134,14 @@ private extension Array where Element == FilterType {
return true
case .compactDescription(issue.compactDescription):
return true
case .emptyContainerDescription:
if issue.auditType == .sufficientElementDescription,
let element = issue.element,
element.elementType == .other,
element.label.isEmpty,
element.identifier.isEmpty {
return true
}
default:
break
}
@@ -7,8 +7,8 @@
extension AccessibilityTests {
func testActiveCallTimelineItemView() async throws {
try await performAccessibilityAudit(named: "ActiveCallTimelineItemView_Previews")
func testAdvancedSettingsScreen() async throws {
try await performAccessibilityAudit(named: "AdvancedSettingsScreen_Previews")
}
func testAnalyticsPromptScreen() async throws {
@@ -55,10 +55,6 @@ extension AccessibilityTests {
try await performAccessibilityAudit(named: "AvatarHeaderView_Previews")
}
func testAvatarSettingsButton() async throws {
try await performAccessibilityAudit(named: "AvatarSettingsButton_Previews")
}
func testBadgeLabel() async throws {
try await performAccessibilityAudit(named: "BadgeLabel_Previews")
}
@@ -187,30 +183,6 @@ extension AccessibilityTests {
try await performAccessibilityAudit(named: "FullscreenDialog_Previews")
}
func testGalleryRoomTimelineView() async throws {
try await performAccessibilityAudit(named: "GalleryRoomTimelineView_Previews")
}
func testHealthChatAccountStatusSection() async throws {
try await performAccessibilityAudit(named: "HealthChatAccountStatusSection_Previews")
}
func testHealthChatExtendedProfileSection() async throws {
try await performAccessibilityAudit(named: "HealthChatExtendedProfileSection_Previews")
}
func testHealthChatInviteMemberScreen() async throws {
try await performAccessibilityAudit(named: "HealthChatInviteMemberScreen_Previews")
}
func testHealthChatMemberDirectoryScreen() async throws {
try await performAccessibilityAudit(named: "HealthChatMemberDirectoryScreen_Previews")
}
func testHealthChatProfileEditScreen() async throws {
try await performAccessibilityAudit(named: "HealthChatProfileEditScreen_Previews")
}
func testHighlightedTimelineItemModifier() async throws {
try await performAccessibilityAudit(named: "HighlightedTimelineItemModifier_Previews")
}
@@ -355,10 +327,6 @@ extension AccessibilityTests {
try await performAccessibilityAudit(named: "LocationSharingScreen_Previews")
}
func testLocationSharingSettingsScreen() async throws {
try await performAccessibilityAudit(named: "LocationSharingSettingsScreen_Previews")
}
func testLoginScreen() async throws {
try await performAccessibilityAudit(named: "LoginScreen_Previews")
}
@@ -391,10 +359,6 @@ extension AccessibilityTests {
try await performAccessibilityAudit(named: "MediaUploadPreviewScreen_Previews")
}
func testMediaUploadQualitySettingsScreen() async throws {
try await performAccessibilityAudit(named: "MediaUploadQualitySettingsScreen_Previews")
}
func testMentionSuggestionItemView() async throws {
try await performAccessibilityAudit(named: "MentionSuggestionItemView_Previews")
}
@@ -415,22 +379,10 @@ extension AccessibilityTests {
try await performAccessibilityAudit(named: "MessageText_Previews")
}
func testModerationAndSafetySettingsScreen() async throws {
try await performAccessibilityAudit(named: "ModerationAndSafetySettingsScreen_Previews")
}
func testMultiAccountAnnouncementView() async throws {
try await performAccessibilityAudit(named: "MultiAccountAnnouncementView_Previews")
}
func testNoticeRoomTimelineView() async throws {
try await performAccessibilityAudit(named: "NoticeRoomTimelineView_Previews")
}
func testNotificationCountBadge() async throws {
try await performAccessibilityAudit(named: "NotificationCountBadge_Previews")
}
func testNotificationPermissionsScreen() async throws {
try await performAccessibilityAudit(named: "NotificationPermissionsScreen_Previews")
}
@@ -527,10 +479,6 @@ extension AccessibilityTests {
try await performAccessibilityAudit(named: "ReadReceiptsSummaryView_Previews")
}
func testRedactConfirmationView() async throws {
try await performAccessibilityAudit(named: "RedactConfirmationView_Previews")
}
func testRedactedRoomTimelineView() async throws {
try await performAccessibilityAudit(named: "RedactedRoomTimelineView_Previews")
}
@@ -699,6 +647,10 @@ extension AccessibilityTests {
try await performAccessibilityAudit(named: "SeparatorRoomTimelineView_Previews")
}
func testServerConfirmationScreen() async throws {
try await performAccessibilityAudit(named: "ServerConfirmationScreen_Previews")
}
func testServerSelection() async throws {
try await performAccessibilityAudit(named: "ServerSelection_Previews")
}
@@ -711,14 +663,6 @@ extension AccessibilityTests {
try await performAccessibilityAudit(named: "SessionVerification_Previews")
}
func testSettingsScreenUserStatusPickerView() async throws {
try await performAccessibilityAudit(named: "SettingsScreenUserStatusPickerView_Previews")
}
func testSettingsScreenUserStatusRow() async throws {
try await performAccessibilityAudit(named: "SettingsScreenUserStatusRow_Previews")
}
func testSettingsScreen() async throws {
try await performAccessibilityAudit(named: "SettingsScreen_Previews")
}
@@ -795,6 +739,10 @@ extension AccessibilityTests {
try await performAccessibilityAudit(named: "SwipeRightAction_Previews")
}
func testSwipeToReplyView() async throws {
try await performAccessibilityAudit(named: "SwipeToReplyView_Previews")
}
func testTextRoomTimelineView() async throws {
try await performAccessibilityAudit(named: "TextRoomTimelineView_Previews")
}
@@ -839,10 +787,6 @@ extension AccessibilityTests {
try await performAccessibilityAudit(named: "TimelineMediaPreviewRedactConfirmationView_Previews")
}
func testTimelineMessageSelectionActionBar() async throws {
try await performAccessibilityAudit(named: "TimelineMessageSelectionActionBar_Previews")
}
func testTimelineReactionView() async throws {
try await performAccessibilityAudit(named: "TimelineReactionView_Previews")
}
@@ -9,6 +9,9 @@
}
],
"defaultOptions" : {
"addressSanitizer" : {
"enabled" : true
},
"codeCoverage" : {
"targets" : [
{
@@ -18,7 +21,7 @@
}
]
},
"defaultTestExecutionTimeAllowance" : 240,
"defaultTestExecutionTimeAllowance" : 120,
"environmentVariableEntries" : [
],
@@ -33,7 +36,8 @@
"identifier" : "C0C687DE1D270F9895FEE186",
"name" : "AccessibilityTests"
},
"testTimeoutsEnabled" : true
"testTimeoutsEnabled" : true,
"undefinedBehaviorSanitizerEnabled" : true
},
"testTargets" : [
{
@@ -36,7 +36,7 @@ targets:
base:
PRODUCT_NAME: AccessibilityTests
PRODUCT_BUNDLE_IDENTIFIER: ${BASE_BUNDLE_IDENTIFIER}.accessibility.tests
SWIFT_VERSION: 6
SWIFT_VERSION: 6.2
SWIFT_APPROACHABLE_CONCURRENCY: YES
configs:
# This is required to remove the $(inherited) flags
@@ -6,8 +6,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/swiftlang/swift-syntax",
"state" : {
"revision" : "050f1a346fbbac0ca2cfb15a95274f7bd1cf0ccf",
"version" : "604.0.0"
"revision" : "79e4b74a295b6eb74a8b585e3a39d29e70c1dbd1",
"version" : "603.0.2"
}
}
],
@@ -5,15 +5,12 @@ import PackageDescription
let package = Package(
name: "BuildExtensions",
platforms: [
.macOS(.v15),
.iOS(.v18) // Only necessary for Previews
],
platforms: [.macOS(.v15)],
products: [
.library(name: "Macros", targets: ["Macros"])
],
dependencies: [
.package(url: "https://github.com/swiftlang/swift-syntax", from: "604.0.0")
.package(url: "https://github.com/swiftlang/swift-syntax", from: "603.0.2")
],
targets: [
// The public macro declarations imported by the app.
@@ -16,7 +16,7 @@
/// persisted under a legacy key).
///
/// A `reset<Name>()` method is also generated, which clears the stored value so it reverts to the
/// default. Non-volatile preferences also get a `<name>Key` property exposing the storage key.
/// default.
@attached(accessor)
@attached(peer, names: arbitrary)
public macro UserPreference<Value>(key: String? = nil, defaultValue: Value, volatile: Bool = false) =
@@ -27,13 +27,3 @@ public macro UserPreference<Value>(key: String? = nil, defaultValue: Value, vola
@attached(peer, names: arbitrary)
public macro UserPreference(key: String? = nil, volatile: Bool = false) =
#externalMacro(module: "MacrosImplementation", type: "UserPreferenceMacro")
/// The storage key of a `@UserPreference`, distinct from `String` so that only a generated
/// `<name>Key` property can be passed where a preference key is expected.
public struct UserPreferenceKey: Sendable {
public let rawValue: String
public init(_ rawValue: String) {
self.rawValue = rawValue
}
}
@@ -10,5 +10,5 @@ import SwiftSyntaxMacros
@main
struct BuildExtensionsPlugin: CompilerPlugin {
let providingMacros: [Macro.Type] = [UserPreferenceMacro.self, AppHookMacro.self]
let providingMacros: [Macro.Type] = [UserPreferenceMacro.self]
}
@@ -14,7 +14,7 @@ import SwiftSyntaxMacros
///
/// A `volatile` preference instead reads and writes through a generated in-memory store, so its
/// value is never persisted and resets on each launch.
enum UserPreferenceMacro {
public enum UserPreferenceMacro {
enum DiagnosticError: Error, CustomStringConvertible {
case notAStoredProperty
case missingTypeAnnotation
@@ -45,10 +45,6 @@ enum UserPreferenceMacro {
"_\(raw: name)VolatileValue"
}
var keyPropertyName: TokenSyntax {
"\(raw: name)Key"
}
var resetMethodName: TokenSyntax {
"reset\(raw: name.prefix(1).uppercased() + name.dropFirst())"
}
@@ -89,9 +85,9 @@ enum UserPreferenceMacro {
}
extension UserPreferenceMacro: AccessorMacro {
static func expansion(of node: AttributeSyntax,
providingAccessorsOf declaration: some DeclSyntaxProtocol,
in context: some MacroExpansionContext) throws -> [AccessorDeclSyntax] {
public static func expansion(of node: AttributeSyntax,
providingAccessorsOf declaration: some DeclSyntaxProtocol,
in context: some MacroExpansionContext) throws -> [AccessorDeclSyntax] {
let preference = try preference(for: declaration, node: node)
if preference.isVolatile {
@@ -141,9 +137,9 @@ extension UserPreferenceMacro: AccessorMacro {
}
extension UserPreferenceMacro: PeerMacro {
static func expansion(of node: AttributeSyntax,
providingPeersOf declaration: some DeclSyntaxProtocol,
in context: some MacroExpansionContext) throws -> [DeclSyntax] {
public static func expansion(of node: AttributeSyntax,
providingPeersOf declaration: some DeclSyntaxProtocol,
in context: some MacroExpansionContext) throws -> [DeclSyntax] {
let preference = try preference(for: declaration, node: node)
let type = preference.type
let name = preference.name
@@ -161,14 +157,6 @@ extension UserPreferenceMacro: PeerMacro {
}
""")
if !preference.isVolatile {
peers.append("""
var \(preference.keyPropertyName): UserPreferenceKey {
.init(\(preference.key))
}
""")
}
peers.append(resetMethod(for: preference))
return peers
@@ -5,7 +5,7 @@
// Please see LICENSE files in the repository root for full details.
//
@testable import MacrosImplementation
import MacrosImplementation
import SwiftSyntaxMacrosTestSupport
import XCTest
@@ -35,10 +35,6 @@ final class UserPreferenceMacroTests: XCTestCase {
_hasSeenNewSoundBannerSubject.prepend(hasSeenNewSoundBanner).eraseToAnyPublisher()
}
var hasSeenNewSoundBannerKey: UserPreferenceKey {
.init("hasSeenNewSoundBanner")
}
func resetHasSeenNewSoundBanner() {
store.removeObject(forKey: "hasSeenNewSoundBanner")
}
@@ -69,10 +65,6 @@ final class UserPreferenceMacroTests: XCTestCase {
_liveLocationSharingSessionsByRoomIDSubject.prepend(liveLocationSharingSessionsByRoomID).eraseToAnyPublisher()
}
var liveLocationSharingSessionsByRoomIDKey: UserPreferenceKey {
.init("liveLocationSharingTimeoutDatesByRoomID")
}
func resetLiveLocationSharingSessionsByRoomID() {
store.removeObject(forKey: "liveLocationSharingTimeoutDatesByRoomID")
}
@@ -103,10 +95,6 @@ final class UserPreferenceMacroTests: XCTestCase {
_pusherProfileTagSubject.prepend(pusherProfileTag).eraseToAnyPublisher()
}
var pusherProfileTagKey: UserPreferenceKey {
.init("pusherProfileTag")
}
func resetPusherProfileTag() {
store.removeObject(forKey: "pusherProfileTag")
}
@@ -137,10 +125,6 @@ final class UserPreferenceMacroTests: XCTestCase {
_viewSourceEnabledSubject.prepend(viewSourceEnabled).eraseToAnyPublisher()
}
var viewSourceEnabledKey: UserPreferenceKey {
.init("viewSourceEnabled")
}
func resetViewSourceEnabled() {
store.removeObject(forKey: "viewSourceEnabled")
}
-436
View File
@@ -1,439 +1,3 @@
## Changes in 26.09.2 (2026-09-23)
### What's Changed
🙌 Improvements
* Add an `AccountProvider` type and use it within the authentication flow. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6103
* Update the Start Chat button's icon. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6179
🐛 Bugfixes
* Update the read marker colour to match the Figma. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6146
* Fix some isolation errors when compiling with Swift 6.4. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6148
* Cancel message edit if content remains unchanged by @thepearl in https://github.com/element-hq/element-x-ios/pull/6153
* Fix HDR UI bugs on iOS 27.0. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6177
* Fix the split view layout on iOS 27. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6180
* Only make toolbar buttons prominent when tinted. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6188
🗣 Translations
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/6151
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/6164
🚧 In development 🚧
* Introduce a local mechanism for managing the app's badge count by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6135
* Various search tab tweaks by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6157
* Add experimental native calls behind a developer flag by @BillCarsonFr in https://github.com/element-hq/element-x-ios/pull/6159
* Bump element-call-ios to 0.1.0-rc.7 by @BillCarsonFr in https://github.com/element-hq/element-x-ios/pull/6168
* Add specific prefix for native call logs by @BillCarsonFr in https://github.com/element-hq/element-x-ios/pull/6169
* Bump element-call native to 0.1.0-rc.8 by @BillCarsonFr in https://github.com/element-hq/element-x-ios/pull/6181
Others
* Update Project Dependencies by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/6136
* Fix some SwiftLint warnings. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6149
* Update zizmorcore/zizmor-action action to v0.6.4 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/6155
* Bump the RustSDK to v26.09.17 by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6160
* Update codecov/codecov-action action to v7.1.0 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/6176
* Update dependency siteline/SwiftUI-Introspect to v27 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/6175
* Drop Intel device support from the build scripts and project by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6171
* Update the SDK. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6182
**Full Changelog**: https://github.com/element-hq/element-x-ios/compare/release/26.09.1...release/26.09.2
## Changes in 26.09.1 (2026-09-10)
### What's Changed
✨ Features
* Add a developer option and selection mode for timeline messages by @Velin92 in https://github.com/element-hq/element-x-ios/pull/6102
🐛 Bugfixes
* Limit the custom status input to 30 characters. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6139
* Scope dark mode change only to the presenting sheet by @Velin92 in https://github.com/element-hq/element-x-ios/pull/6144
🚧 In development 🚧
* Show message counts on room list notification badges by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6132
Others
* Fix start chat UI test snapshots following copy changes by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6137
* Add a couple of points about code style/ordering to the AGENTS.md by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6133
* Update the SDK. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6147
**Full Changelog**: https://github.com/element-hq/element-x-ios/compare/release/26.09.0...release/26.09.1
## Changes in 26.09.0 (2026-09-08)
### What's Changed
✨ Features
* Autoplay the next voice message if it is the next timeline item. by @Velin92 in https://github.com/element-hq/element-x-ios/pull/6089
* Add a Mentions room list filter by @ara4n in https://github.com/element-hq/element-x-ios/pull/5885
* Add support for `<details>` and `<summary>` tags by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6077
* Redaction reason by @Velin92 in https://github.com/element-hq/element-x-ios/pull/6098
🙌 Improvements
* Advance the join room screen if we're autojoined by the server by @ara4n in https://github.com/element-hq/element-x-ios/pull/5875
* Updates to Notification Settings by @americanrefugee in https://github.com/element-hq/element-x-ios/pull/6075
* Use server name from user id function by @Velin92 in https://github.com/element-hq/element-x-ios/pull/6082
🐛 Bugfixes
* Fix crash when activating incompatible room filters by @sergeyospanov in https://github.com/element-hq/element-x-ios/pull/6087
* hide the forward action on live location shares by @thepearl in https://github.com/element-hq/element-x-ios/pull/6091
* Fix photo picker selection tint on iOS 26 by @thepearl in https://github.com/element-hq/element-x-ios/pull/6095
* Fix the tab rail flickering on narrow iPad windows by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6107
* Minor quicklook fixes. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6112
* Use disambiguated display name for avatar change events by @Velin92 in https://github.com/element-hq/element-x-ios/pull/6131
🗣 Translations
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/6088
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/6111
🧱 Build
* Pin project dependencies to exact versions given we have Renovate. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6078
* Try using Danger with the Node/Docker fix? by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6079
* Replace danger-swift with a actions/github-script version by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6080
* Bump the calendar version ready for the next release by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/6092
Others
* Use the `ClientFactory` pattern everywhere replacing raw `ClientBuilders`. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6054
* Add tests for the UserSessionStore. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6065
* Update Project Dependencies by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/6068
* Allow copying blocked user id by @Velin92 in https://github.com/element-hq/element-x-ios/pull/6071
* Don't focus the user status text field during tests. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6076
* Limit link previews width in the timeline to 300 points. by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6069
* Fix UI test snapshots following copy changes and filter reordering by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6100
* Feature flag tweaks by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6096
* Update dependency siteline/SwiftUI-Introspect to v26.0.2 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/6104
* Update zizmorcore/zizmor-action action to v0.6.3 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/6109
* Bump the RustSDK to v26.09.07 by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6110
* Update the Enterprise submodule. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6114
* Update the SDK. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6134
### New Contributors
* @sergeyospanov made their first contribution in https://github.com/element-hq/element-x-ios/pull/6087
* @thepearl made their first contribution in https://github.com/element-hq/element-x-ios/pull/6091
**Full Changelog**: https://github.com/element-hq/element-x-ios/compare/release/26.08.4...release/26.09.0
## Changes in 26.08.4 (2026-08-25)
### What's Changed
✨ Features
* Enable the User Status feature on supported homeservers. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6059
🐛 Bugfixes
* Attributed string builder tweaks by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6055
🗣 Translations
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/6058
🚧 In development 🚧
* More tweaks for User Status. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6051
Others
* Various tweaks and fixes by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6045
* Update dependency element-hq/compound-design-tokens to v10.2.4 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/6048
* Update the Enterprise submodule by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6053
* Fix missing back pagination attempt by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6056
* Stop the integration tests from backgrounding the web authentication session by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6060
* Preserve the blank lines typed after a list by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6061
* Update the Enterprise submodule. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6063
* Fixed one accessibility test and an UI test snapshot by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6064
* Update sdk to 26.08.25 by @Velin92 in https://github.com/element-hq/element-x-ios/pull/6067
**Full Changelog**: https://github.com/element-hq/element-x-ios/compare/release/26.08.3...release/26.08.4
## Changes in 26.08.3 (2026-08-20)
### What's Changed
✨ Features
* Load MapLibre lazily instead of at every app launch by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6012
🙌 Improvements
* Offer Retry and Remove actions with a reason when tapping a failed message by @ara4n in https://github.com/element-hq/element-x-ios/pull/5988
* Update the toolbars in the Chats/Spaces screens. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6043
🐛 Bugfixes
* Avoid race conditions between the home screen's crash alert and Sentry's `onLastRunStatusDetermined` by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6017
* Prevent invalid composer mode crashes by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6018
* Delay secondary room summary provider setup by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6038
🗣 Translations
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/6036
🧱 Build
* Re-run XcodeGen. by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/6040
🚧 In development 🚧
* Update the SDK fixing some user status bugs. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6037
* Fix the emoji picker's title when setting a custom status. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6039
Others
* Update Project Dependencies by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/6011
* Move various top level folder to the `Components` one by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6014
* Update dependency PostHog to v3.69.1 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/6013
* Avoid re-applying identical room list filters by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6016
* Detach the Client's `cacheAccountURL` call by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6019
* Update the Enterprise submodule. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6023
* Fix the flaky ElementCallServiceTests by replacing TestClock by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6022
* Implement TimelineItemProvider diff `truncate` mechanism by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6029
* Update the SDK. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6030
* Attempt another kind of fix for the encryption settings UI test by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6035
* Fail fast on the integration tests when encountering the first failed assert by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6041
* Various unit test improvements by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6042
* Update the Enterprise submodule. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6049
**Full Changelog**: https://github.com/element-hq/element-x-ios/compare/release/26.08.2...release/26.08.3
## Changes in 26.08.2 (2026-08-11)
### What's Changed
✨ Features
* Allow tapping the avatar in the room member bottom sheet to view it fullscreen by @danderson-cont in https://github.com/element-hq/element-x-ios/pull/5989
🙌 Improvements
* Remove map tiler url from matrix wellknown by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5983
* Combine the Server Selection screen into the Server Confirmation screen and add autocompletion when entering an account provider. by @mredig in https://github.com/element-hq/element-x-ios/pull/5949
🐛 Bugfixes
* Fix broken avatar aspect ratio in the share sheet and notifications by @ara4n in https://github.com/element-hq/element-x-ios/pull/5972
* Fix Pro Max In Call Rotation Bug by @mredig in https://github.com/element-hq/element-x-ios/pull/5990
* Update the SDK with a fix for read receipts. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5991
* Fix tracing span panic when accessed from multiple threads by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5996
* Make sure the Tab Rail's background matches the split view's detail background. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6003
* Fix a simulcast bug in Element Call. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6009
🗣 Translations
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/5999
🧱 Build
* Add an HTTP_PROXY environment variable too (also disabled). by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5984
* Annotate failures for Github Actions so they're easier to spot. by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6004
* Run XcodeGen by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/6006
* Drop the `addressSanitizer` and `undefinedBehaviorSanitizer` from the Accessibility and UI tests by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6008
* Reinforce text typing within XCUITests by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6007
🚧 In development 🚧
* Add timeouts after verifying the device owner when linking a new device. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5970
* Show loading/failure states when setting/clearing user status. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5993
* Enable automatic call status under the User Status feature flag. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5994
Others
* Update dependency pointfreeco/swift-snapshot-testing to v1.19.4 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5981
* Add hooks for the RoomDetails, RoomMemberDetails and UserProfile screens. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5980
* Improve the room member part of the UI test user session flows by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5985
* Update the SDK and handle some API breaks. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5986
* Update Contributing.md with snapshot testing instructions by @mredig in https://github.com/element-hq/element-x-ios/pull/5974
* Update zizmorcore/zizmor-action action to v0.6.2 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5998
* Set the finalised OAuth Client URI path to match the new EXI page. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5992
* Improve integration test diagnostics in an attempt to catch run crashes by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6000
* Prevent invalid snapshots on timeline replies by waiting for the keyboard to appear for longer by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/6001
* Update the SDK. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/6010
**Full Changelog**: https://github.com/element-hq/element-x-ios/compare/release/26.08.1...release/26.08.2
## Changes in 26.08.1 (2026-08-04)
### What's Changed
✨ Features
* Render replies to gallery items by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5942
* Render gallery items in the media browser/gallery by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5955
🙌 Improvements
* Allow previews in the timeline to include filtered galleries by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5943
* Set gallery sending limit to 60 when the gallery ff is on by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5960
* Add a custom TabRail on iPad instead of the top tab bar. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5964
* Small gallery tweaks by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5957
* Add call icon next to members in call by @nankeen by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5968
🐛 Bugfixes
* Fix rageshake upload progress bar by @danderson-cont in https://github.com/element-hq/element-x-ios/pull/5950
* Fix for pagination getting stuck loading when swiping media previews in the timeline by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5963
* Manually publish room list range updates when the content isn't scrollable by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5956
🗣 Translations
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/5965
🦻 Accessibility
* A11y for Galleries by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5969
🚧 In development 🚧
* Fix a couple of missing `UserStatus` values. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5944
* Allow clearing your own call status. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5959
Others
* Fix for some flaky tests part 2 by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5939
* Update the Enterprise submodule. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5953
* Update zizmorcore/zizmor-action action to v0.6.1 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5961
* Update Project Dependencies by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5940
* Update actions/stale action to v11 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5971
* Accessibility tests fixes by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5976
* Disable the store pausing feature as we encountered cases in which it doesn't work properly by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5977
* Fix various UI test snapshots by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5975
* Tweak the stalebot configuration by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5978
**Full Changelog**: https://github.com/element-hq/element-x-ios/compare/release/26.08.0...release/26.08.1
## Changes in 26.08.0 (2026-07-28)
### What's Changed
✨ Features
* Add support for active call item rendering in timeline by @BillCarsonFr in https://github.com/element-hq/element-x-ios/pull/5775
* Add content scanner to the NSE Client by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5926
* Render image and video in galleries as a grid by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5929
* Render galleries with non-visual attachments as a list by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5932
* Open a full-screen preview when tapping a gallery item by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5936
🙌 Improvements
* Report user presence on app lifecycle transitions by @lhjt in https://github.com/element-hq/element-x-ios/pull/5838
* Content scanner also checks for thumbnails by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5911
* Remove the requiresExtraAccountSetup badge. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5921
* Implements push notifications for LLS via MSC4505 by @ara4n in https://github.com/element-hq/element-x-ios/pull/5872
🐛 Bugfixes
* Enable client pausing and resuming for all builds by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5904
🗣 Translations
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/5901
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/5931
🧱 Build
* Re-run xcodegen. by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/5907
* Bump the calendar version ready for the next release by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/5937
📄 Documentation
* Group Element Pro changes into a dedicated release notes section by @manuroe in https://github.com/element-hq/element-x-ios/pull/5899
🚧 In development 🚧
* Add the UI for your own user status in the Settings screen. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5888
* Support sending gallery messages behind a feature flag by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5909
* Update the SDK and hook up the status from Room Heroes. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5905
* Hook up the emoji picker to the custom status row. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5902
* Search tab tweaks by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5910
* Add support for showing the user's own status over their avatar on the app's Settings button. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5912
* Add a warning to the Link New Device instructions. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5916
* Add the gallery timeline item rendered as a placeholder by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5928
* Gate user status behind server support as well as the feature flag. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5920
Others
* Update dependency pointfreeco/swift-snapshot-testing to v1.19.3 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5892
* Update enterprise by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5894
* Update dependency Sentry to v9.21.0 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5891
* Update actions/stale action to v10.4.0 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5898
* Several small, independent accessibility fixes (VoiceOver labels/traits, contrast) by @unclejay80 in https://github.com/element-hq/element-x-ios/pull/5890
* Periphery cleanup by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5893
* Various project warning fixes by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5908
* Add signed in flag to the developer options screen hook by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5914
* Update zizmorcore/zizmor-action action to v0.6.0 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5917
* Update SDK to 26.07.22 by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5919
* Small tweaks to the Presence feature. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5918
* Fix call timeline item snapshots. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5923
* Bump the RustSDK to v26.07.23 by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5925
* Update actions/checkout action to v7.0.1 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5935
* Add an `oAuthClientURIPath` option to AppSettings. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5934
* update sdk to 26-7-28 by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5938
### New Contributors
* @unclejay80 made their first contribution in https://github.com/element-hq/element-x-ios/pull/5890
* @lhjt made their first contribution in https://github.com/element-hq/element-x-ios/pull/5838
**Full Changelog**: https://github.com/element-hq/element-x-ios/compare/release/26.07.4...release/26.08.0
## Changes in 26.07.4 (2026-07-15)
### What's Changed
✨ Features
* Force Disable E2EE for Element Pro by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5866
🙌 Improvements
* Use dark theme for Element Call by @toger5 in https://github.com/element-hq/element-x-ios/pull/5860
🐛 Bugfixes
* Fix for NSE and ShareExtension individual builds by @mredig in https://github.com/element-hq/element-x-ios/pull/5856
* Fix CurrentValuePublisher.map dropping updates when the mapped publisher is chained inline by @ara4n in https://github.com/element-hq/element-x-ios/pull/5870
* Fix a bug where rooms couldn't be opened when returning to the foreground whilst offline. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5867
🗣 Translations
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/5865
🧱 Build
* Fix UI tests by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5862
* Add CurrentValuePublisherTests to the UnitTests target by @ara4n in https://github.com/element-hq/element-x-ios/pull/5884
🚧 In development 🚧
* Display other users' User Status. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5859
Others
* Update the SDK and Compound tokens. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5857
* Use deferFulfillment in flow coordinator tests by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5861
* Update the SDK and handle API breaks. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5871
* Fix for flaky tests by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5869
* Constrained tests tool implementation + skill by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5873
* Update dependency Mantis to v3 by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5887
* Update Project Dependencies by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5886
* Update the SDK. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5889
**Full Changelog**: https://github.com/element-hq/element-x-ios/compare/release/26.07.3...release/26.07.4
## Changes in 26.07.3 (2026-07-09)
### What's Changed
✨ Features
* Content Scanning View by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5831
* Content scanning view for reply preview by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5842
* Scanning states for the media events timeline screen by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5847
* Media Preview content scanning by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5851
🙌 Improvements
* Don't keep re-prompting the user to migrate if they get spontaneously logged out. by @ara4n in https://github.com/element-hq/element-x-ios/pull/5844
* New location request permission strings by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5854
🐛 Bugfixes
* Fix voice message recording crashes caused by an isolation assertion failure by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5820
* Stop reserving space for the non-existant icon background in ListRowLabel on iOS 26. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5822
* Fix for the media browser showing also images and videos in file mode by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5853
🗣 Translations
* Translations update by @RiotRobot in https://github.com/element-hq/element-x-ios/pull/5845
🦻 Accessibility
* Fix AccessibilityTests hang on previews expecting expired transient state by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5821
* Remove the "unflip" of the timeline when in voice over mode by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5835
🧱 Build
* Remove Hyperion from the Compound Inspector app. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5828
* Switch back to using the stable version of SwiftFormat. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5850
* Introduce a build setting to detect Nightly builds. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5852
🚧 In development 🚧
* Make LinkNewDeviceScreen fall back to the App Lock PIN code when there's no passcode. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5794
* Add the content scanner URL to the app settings by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5823
* User Status preparation. by @pixlwave in https://github.com/element-hq/element-x-ios/pull/5825
* Content Scanner Service by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5826
* Add message support to the new search tab by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5829
Others
* Bump the RustSDK to a new "apple-release" profile build distribution by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5834
* Update the readme to fix the unit tests shield and remove the SonarCloud ones by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5832
* Fix various project warnings by @stefanceriu in https://github.com/element-hq/element-x-ios/pull/5833
* Swift format enforce isEmpty rule by @Velin92 in https://github.com/element-hq/element-x-ios/pull/5843
* Update Project Dependencies by @renovate[bot] in https://github.com/element-hq/element-x-ios/pull/5818
**Full Changelog**: https://github.com/element-hq/element-x-ios/compare/release/26.07.0...release/26.07.3
## Changes in 26.07.1 (2026-07-03)
### What's Changed
+2 -10
View File
@@ -30,7 +30,7 @@ Only once all of the above is met should you open a PR with your proposed change
* Don't submit large PRs, especially if not previously talked about. Anything above 200 lines is large (excluding generated code e.g. tests, translations, mocks)
* Please don't open unfinished PRs and expect us to fill in the details
* If you would like our opinion/direction on unfinished code please link your branch or idea in the ticket
* Please limit the number of commits in a single PR. We are perfectly happy with splitting work across multiple sessions as long as they're logically independent and show promise of progress (ideally expressed through a ticket)
* Please limit the number of commits in a single PR. We are perfectly happy with splitting work across multiple sessions as long as they're logically independant and show promise of progress (ideally expressed through a ticket)
* Each and every commit should stand on its own, clearly explaining what it does and why
* Once a PR goes into review please don't rewrite the history unless agreed so with the reviewer.
* Tweaks and fixes following review can be directly committed (to be interactively rebased later) or as fixups
@@ -95,14 +95,6 @@ git lfs install
If you make changes to the UI you may cause existing UI and Preview test snapshots to fail. The UITests run user flows and record snapshots while doing so using the settings defined under [checkEnvironments](https://github.com/element-hq/element-x-ios/blob/c29175d1f924e58b9646a200dbab0301fce3c258/UITests/Sources/Application.swift#L35-L37) while the PreviewTests use the settings defined in [PreviewTests.swift](https://github.com/element-hq/element-x-ios/blob/c29175d1f924e58b9646a200dbab0301fce3c258/PreviewTests/Sources/PreviewTests.swift#L18-L20). The snapshots are stored under `Sources/__Snapshots__` in their respective target's folder.
To run the preview tests:
1. Use an iPhone SE (3rd generation) simulator running iOS 27.0.
2. On that simulator, go to Settings -> General -> Language & Region and select United States as the region, with English (US) as the only preferred language. This is a one time setup, as long as you keep using the same simulator.
3. Select the `PreviewTests` scheme and run the tests.
Newly created screens will automatically have their screenshots added based off their `TestablePreview` Swift previews. If you are modifying an existing screen, you will first need to delete the old snapshots for that screen before running the tests. Alternatively, if you enable `RECORD_FAILURES` in the preview test plans's environment variables (`PreviewTests/SupportingFiles/Previewtests.xctestplan`), it will overwrite snapshot failures with the updated screenshot.
### Githooks
The project uses its own shared githooks stored in the .githooks folder, you will need to configure git to use such folder, this is already done if you have run the setup tool with `swift run tools setup-project` otherwise you would need to run:
@@ -150,7 +142,7 @@ Our [changelog](CHANGES.md) is automatically generated by GitHub, based on the P
For Swift coding style we use [SwiftLint](https://github.com/realm/SwiftLint) to check some conventions at compile time (rules are located in the `.swiftlint.yml` file).
Otherwise please have a look to [Apple Swift conventions](https://swift.org/documentation/api-design-guidelines.html#conventions). We are also using some of the conventions of [raywenderlich.com Swift style guide](https://github.com/raywenderlich/swift-style-guide).
We enforce the coding style by running checks on the CI for every PR through [PR Checks](.github/workflows/pr-checks.yml), [SwiftLint](.swiftlint.yml), [SwiftFormat](.swiftformat) and [SonarCloud](https://sonarcloud.io/project/overview?id=element-x-ios)
We enforce the coding style by running checks on the CI for every PR through [Danger](Dangerfile.swift), [SwiftLint](.swiftlint.yml), [SwiftFormat](.swiftformat) and [SonarCloud](https://sonarcloud.io/project/overview?id=element-x-ios)
We also gather coverage reports on every PR through [Codecov](https://app.codecov.io/gh/element-hq/element-x-ios) and will eventually start enforcing minimums.
@@ -1,16 +0,0 @@
//
// Copyright 2026 Element Creations Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
/// Exposes a `Mutex`-backed hook as a read-only computed property, alongside a `register<Name>`
/// peer that swaps in a replacement hook.
///
/// The `default` argument provides the hook used until (and unless) a replacement is registered.
/// The enclosing type must have `Synchronization` in scope for the generated `Mutex` storage.
@attached(accessor)
@attached(peer, names: arbitrary)
public macro AppHook<Value>(default: Value) =
#externalMacro(module: "MacrosImplementation", type: "AppHookMacro")
@@ -1,98 +0,0 @@
//
// Copyright 2026 Element Creations Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import SwiftSyntax
import SwiftSyntaxMacros
/// Implements `@AppHook`. The generated property reads through a `Mutex`-backed store, and a
/// generated `register<Name>` method swaps in a replacement hook.
enum AppHookMacro {
enum DiagnosticError: Error, CustomStringConvertible {
case notAStoredProperty
case missingTypeAnnotation
case missingDefault
var description: String {
switch self {
case .notAStoredProperty:
"@AppHook can only be applied to a stored property."
case .missingTypeAnnotation:
"@AppHook requires an explicit type annotation."
case .missingDefault:
"@AppHook requires a default value."
}
}
}
private struct AppHook {
let name: String
let type: TypeSyntax
let defaultValue: ExprSyntax
var storageName: TokenSyntax {
"_\(raw: name)"
}
var registerMethodName: TokenSyntax {
"register\(raw: name.prefix(1).uppercased() + name.dropFirst())"
}
}
private static func appHook(for declaration: some DeclSyntaxProtocol, node: AttributeSyntax) throws -> AppHook {
guard let variable = declaration.as(VariableDeclSyntax.self),
let binding = variable.bindings.first,
let identifier = binding.pattern.as(IdentifierPatternSyntax.self)?.identifier else {
throw DiagnosticError.notAStoredProperty
}
guard let type = binding.typeAnnotation?.type.trimmed else {
throw DiagnosticError.missingTypeAnnotation
}
var defaultValue: ExprSyntax?
if let list = node.arguments?.as(LabeledExprListSyntax.self) {
for argument in list where argument.label?.text == "default" {
defaultValue = argument.expression
}
}
guard let defaultValue else {
throw DiagnosticError.missingDefault
}
return AppHook(name: identifier.text, type: type, defaultValue: defaultValue)
}
}
extension AppHookMacro: AccessorMacro {
static func expansion(of node: AttributeSyntax,
providingAccessorsOf declaration: some DeclSyntaxProtocol,
in context: some MacroExpansionContext) throws -> [AccessorDeclSyntax] {
let appHook = try appHook(for: declaration, node: node)
return [
"""
get {
\(appHook.storageName).withLock { $0 }
}
"""
]
}
}
extension AppHookMacro: PeerMacro {
static func expansion(of node: AttributeSyntax,
providingPeersOf declaration: some DeclSyntaxProtocol,
in context: some MacroExpansionContext) throws -> [DeclSyntax] {
let appHook = try appHook(for: declaration, node: node)
return [
"private let \(appHook.storageName) = Mutex<\(appHook.type)>(\(appHook.defaultValue))",
"""
func \(appHook.registerMethodName)(_ hook: \(appHook.type)) {
\(appHook.storageName).withLock { $0 = hook }
}
"""
]
}
}
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0b1465b1e379f4356e0cbde2ecc1a9cd2a58c7a69be7ca9f7b3b2df2e911e60c
size 2004302
@@ -1,19 +0,0 @@
//
// Copyright 2026 Element Creations Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import SwiftUI
/// Implemented by MapLibreShim's entry point, which the app instantiates after
/// `dlopen`-ing the framework.
public protocol MapLibreShimProtocol {
/// Routes MapLibre's logs into the app's logger. Call once after loading the shim.
func configureLogging(_ handler: @escaping @Sendable (MapLogSeverity, String) -> Void)
/// Builds the interactive map view. The app-side `MapLibreMapView` forwards every
/// body evaluation here so SwiftUI updates flow through to the underlying map.
func makeMapView(configuration: MapViewConfiguration) -> AnyView
}
@@ -1,56 +0,0 @@
//
// Copyright 2026 Element Creations Ltd.
// Copyright 2023-2025 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import CoreLocation
import Foundation
/**
Behavior mode of the current user's location, can be hidden, only shown and shown following the user
*/
public enum ShowUserLocationMode: Equatable {
/// this mode will show the user pin in map
case show
/// this mode will show the user pin in map and track him, panning the map automatically
case showAndFollow
/// this mode will not show the user pin in map
case hide
/// this mode will not show the user pin in map and will follow the marker with the given id,
/// panning the map automatically.
case hideAndFollowMarker(id: String)
/// The id of the marker the map should follow when in the `hideAndFollowMarker` mode, nil otherwise.
public var followedMarkerID: String? {
guard case .hideAndFollowMarker(let id) = self else { return nil }
return id
}
}
public enum MapLibreError: Error, Hashable {
case failedLoadingMap
case failedLocatingUser
}
/// The severity of a map log message forwarded to the app.
public enum MapLogSeverity {
case error
case warning
case info
case debug
case verbose
}
/// A marker shown on the map, identified so that it can be moved in place when its coordinate changes.
public struct MapAnnotation {
public let id: String
public let coordinate: CLLocationCoordinate2D
public init(id: String, coordinate: CLLocationCoordinate2D) {
self.id = id
self.coordinate = coordinate
}
}
@@ -1,76 +0,0 @@
//
// Copyright 2026 Element Creations Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import CoreLocation
import SwiftUI
/// Everything the map implementation needs in order to render, expressed without app
/// types so that the implementation framework can be loaded on demand.
public struct MapViewConfiguration {
/// the final zoom level used when the first user location emit
public let zoomLevel: Double
/// The initial zoom level used when the map it firstly loaded and the user location is not yet available, in case of annotations this property is not being used
public let initialZoomLevel: Double
/// The initial map center
public let mapCenter: CLLocationCoordinate2D
/// Map annotations
public let annotations: [MapAnnotation]
/// The style to load the map with, for either the dark or the light appearance.
public let styleURL: (_ isDark: Bool) -> URL?
public let tintColor: UIColor
/// The content of the marker representing the annotation with the given id.
public let markerView: (_ annotationID: String) -> AnyView?
/// Behavior mode of the current user's location, can be hidden, only shown and shown following the user
public let showsUserLocationMode: Binding<ShowUserLocationMode>
/// Bind view errors if any
public let error: Binding<MapLibreError?>
/// Coordinate of the center of the map
public let mapCenterCoordinate: Binding<CLLocationCoordinate2D?>
public let hasLoadedUserLocation: Binding<Bool>
public let isLocationAuthorized: Binding<Bool?>
/// The radius of uncertainty for the location, measured in meters.
public let geolocationUncertainty: Binding<CLLocationAccuracy?>
/// Called when the user pan on the map
public let userDidPan: (() -> Void)?
public init(zoomLevel: Double,
initialZoomLevel: Double,
mapCenter: CLLocationCoordinate2D,
annotations: [MapAnnotation] = [],
styleURL: @escaping (_ isDark: Bool) -> URL?,
tintColor: UIColor,
markerView: @escaping (_ annotationID: String) -> AnyView?,
showsUserLocationMode: Binding<ShowUserLocationMode>,
error: Binding<MapLibreError?>,
mapCenterCoordinate: Binding<CLLocationCoordinate2D?>,
hasLoadedUserLocation: Binding<Bool>,
isLocationAuthorized: Binding<Bool?>,
geolocationUncertainty: Binding<CLLocationAccuracy?>,
userDidPan: (() -> Void)? = nil) {
self.zoomLevel = zoomLevel
self.initialZoomLevel = initialZoomLevel
self.mapCenter = mapCenter
self.annotations = annotations
self.styleURL = styleURL
self.tintColor = tintColor
self.markerView = markerView
self.showsUserLocationMode = showsUserLocationMode
self.error = error
self.mapCenterCoordinate = mapCenterCoordinate
self.hasLoadedUserLocation = hasLoadedUserLocation
self.isLocationAuthorized = isLocationAuthorized
self.geolocationUncertainty = geolocationUncertainty
self.userDidPan = userDidPan
}
}
@@ -1,19 +0,0 @@
# The types shared between the app and the MapLibreShim framework. The app links this
# (tiny, initialiser-free) framework instead of MapLibre, see MapLibreShim's target.yml.
name: MapLibreInterface
targets:
MapLibreInterface:
type: framework
platform: iOS
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: $(BASE_BUNDLE_IDENTIFIER).maplibre-interface
GENERATE_INFOPLIST_FILE: YES
SWIFT_VERSION: 6
SWIFT_APPROACHABLE_CONCURRENCY: YES
SWIFT_DEFAULT_ACTOR_ISOLATION: MainActor
sources:
- path: ../Sources
@@ -1,60 +0,0 @@
//
// Copyright 2026 Element Creations Ltd.
// Copyright 2023-2025 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import CoreLocation
import MapLibre
import MapLibreInterface
import SwiftUI
final class MapLibreAnnotation: NSObject, MLNAnnotation, Identifiable {
let id: String
// @objc dynamic is required to make animations work
@objc dynamic var coordinate: CLLocationCoordinate2D
// MARK: - Setup
init(_ annotation: MapAnnotation) {
id = annotation.id
coordinate = annotation.coordinate
super.init()
}
}
final class MapLibreAnnotationView: MLNUserLocationAnnotationView {
private var hostingController: UIHostingController<AnyView>?
// MARK: - Setup
override init(annotation: MLNAnnotation?, reuseIdentifier: String?) {
super.init(annotation: annotation, reuseIdentifier:
reuseIdentifier)
}
convenience init(annotation: MapLibreAnnotation, content: AnyView?) {
self.init(annotation: annotation, reuseIdentifier: "\(Self.self)")
let hostingController = UIHostingController(rootView: content ?? AnyView(EmptyView()))
self.hostingController = hostingController
let view: UIView = hostingController.view
view.backgroundColor = .clear
view.anchorPoint = .init(x: 0.5, y: 1.0)
addSubview(view)
view.bounds.size = view.intrinsicContentSize
}
func updateContent(_ content: AnyView?) {
hostingController?.rootView = content ?? AnyView(EmptyView())
if let hostedView = hostingController?.view {
hostedView.bounds.size = hostedView.intrinsicContentSize
}
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError()
}
}
@@ -1,297 +0,0 @@
//
// Copyright 2026 Element Creations Ltd.
// Copyright 2023-2025 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import MapLibre
import MapLibreInterface
import SwiftUI
struct MapLibreMapView: UIViewRepresentable {
// MARK: - Properties
@Environment(\.colorScheme) private var colorScheme
let configuration: MapViewConfiguration
// MARK: - UIViewRepresentable
func makeUIView(context: Context) -> MLNMapView {
let mapView = makeMapView()
mapView.delegate = context.coordinator
setupMap(mapView: mapView)
return mapView
}
func updateUIView(_ mapView: MLNMapView, context: Context) {
// Don't set the same value twice. Otherwise, if there is an error loading the map, a loop
// is caused as the `error` binding being set, which triggers this update, which sets a
// new URL, which causes another error, and so it goes on round and round in a circle.
let dynamicMapURL = configuration.styleURL(colorScheme == .dark)
if mapView.styleURL != dynamicMapURL {
mapView.styleURL = dynamicMapURL
}
// If the center coordinate was updated externally (not by the map itself), move the map.
// Not applied while following a marker, where the camera is driven by the marker's position.
if configuration.showsUserLocationMode.wrappedValue.followedMarkerID == nil,
let newCenter = configuration.mapCenterCoordinate.wrappedValue,
newCenter.latitude != context.coordinator.lastReportedCenter?.latitude
|| newCenter.longitude != context.coordinator.lastReportedCenter?.longitude {
context.coordinator.lastReportedCenter = newCenter
mapView.setCenter(newCenter, animated: true)
}
// Update existing annotation views with fresh SwiftUI content.
// This handles the case where the annotation's view data changes after
// the annotation was initially placed (e.g. user avatar loads asynchronously).
updateAnnotations(in: mapView)
showUserLocation(in: mapView)
context.coordinator.updateMarkerFollowing(in: mapView, markerID: configuration.showsUserLocationMode.wrappedValue.followedMarkerID)
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
// MARK: - Private
private func setupMap(mapView: MLNMapView) {
mapView.addAnnotations(configuration.annotations.map(MapLibreAnnotation.init))
mapView.zoomLevel = configuration.annotations.isEmpty ? configuration.initialZoomLevel : configuration.zoomLevel
mapView.centerCoordinate = configuration.mapCenter
}
private func updateAnnotations(in mapView: MLNMapView) {
let existingByID = Dictionary(uniqueKeysWithValues:
(mapView.annotations ?? []).compactMap { $0 as? MapLibreAnnotation }.map { ($0.id, $0) })
let updatedByID = Dictionary(uniqueKeysWithValues: configuration.annotations.map { ($0.id, $0) })
let existingIDs = Set(existingByID.keys)
let updatedIDs = Set(updatedByID.keys)
// Remove annotations that are no longer present
let removedIDs = existingIDs.subtracting(updatedIDs)
if !removedIDs.isEmpty {
let toRemove = removedIDs.compactMap { existingByID[$0] }
mapView.removeAnnotations(toRemove)
}
// Add new annotations
let addedIDs = updatedIDs.subtracting(existingIDs)
if !addedIDs.isEmpty {
let toAdd = addedIDs.compactMap { updatedByID[$0] }.map(MapLibreAnnotation.init)
mapView.addAnnotations(toAdd)
}
// Update existing annotations that are still present
let keptIDs = existingIDs.intersection(updatedIDs)
for id in keptIDs {
guard let existingAnnotation = existingByID[id],
let updatedAnnotation = updatedByID[id] else {
continue
}
CoordinateAnimator.animate(annotation: existingAnnotation,
to: updatedAnnotation.coordinate,
duration: 1.0)
if let annotationView = mapView.view(for: existingAnnotation) as? MapLibreAnnotationView {
annotationView.updateContent(configuration.markerView(id))
}
}
}
private func makeMapView() -> MLNMapView {
let mapView = MLNMapView(frame: .zero, styleURL: configuration.styleURL(colorScheme == .dark))
mapView.logoViewPosition = .topLeft
mapView.attributionButtonPosition = .topLeft
mapView.attributionButtonMargins = .init(x: mapView.logoView.frame.maxX + 8, y: mapView.logoView.center.y / 2)
mapView.tintColor = configuration.tintColor
mapView.allowsRotating = false
mapView.allowsTilting = false
return mapView
}
private func showUserLocation(in mapView: MLNMapView) {
switch (configuration.showsUserLocationMode.wrappedValue, configuration.annotations) {
case (.showAndFollow, _):
mapView.userTrackingMode = .follow
case (.show, let annotations) where !annotations.isEmpty:
// In the show mode, if there are annotations, we check the authorizationStatus,
// if it's not determined, we wont prompt the user with a request for permissions,
// because they should be able to see the annotations without sharing their location information.
guard mapView.locationManager.authorizationStatus != .notDetermined else { return }
fallthrough
case (.show, _):
mapView.showsUserLocation = true
mapView.setUserTrackingMode(.none, animated: false, completionHandler: nil)
case (.hide, _), (.hideAndFollowMarker, _):
// In hideAndFollowMarker mode the camera following is handled by the coordinator.
mapView.showsUserLocation = false
mapView.setUserTrackingMode(.none, animated: false, completionHandler: nil)
}
}
}
// MARK: - Coordinator
extension MapLibreMapView {
class Coordinator: NSObject, MLNMapViewDelegate {
// MARK: - Properties
var mapLibreView: MapLibreMapView
private var previousUserLocation: MLNUserLocation?
/// Tracks the last center coordinate reported by the map (or set programmatically),
/// so that `updateUIView` can tell apart external binding changes from internal ones.
var lastReportedCenter: CLLocationCoordinate2D?
/// The annotation the camera is currently locked on while in the `hideAndFollowMarker` mode.
private weak var followedAnnotation: MapLibreAnnotation?
/// Observes the followed annotation's coordinate, updated every frame by the `CoordinateAnimator`.
private var followedAnnotationObservation: NSKeyValueObservation?
// MARK: - Setup
init(_ mapLibreView: MapLibreMapView) {
self.mapLibreView = mapLibreView
}
// MARK: - Marker following
/// Keeps the camera locked on the marker with the given id, or stops following when nil.
func updateMarkerFollowing(in mapView: MLNMapView, markerID: String?) {
guard let markerID else {
stopFollowingMarker()
return
}
guard let annotation = (mapView.annotations ?? [])
.compactMap({ $0 as? MapLibreAnnotation })
.first(where: { $0.id == markerID }) else {
// The marker isn't on the map (yet), resolve it again on the next update.
stopFollowingMarker()
return
}
guard annotation !== followedAnnotation else { return }
startFollowingMarker(annotation, in: mapView)
}
private func startFollowingMarker(_ annotation: MapLibreAnnotation, in mapView: MLNMapView) {
followedAnnotation = annotation
followedAnnotationObservation = nil
// Animate to the marker first, attaching the per-frame tracking only on completion
// so that it doesn't cancel the transition.
mapView.setCenter(annotation.coordinate,
zoomLevel: mapView.zoomLevel,
direction: -1, // negative value keeps the current direction
animated: true) { [weak self, weak annotation, weak mapView] in
guard let self, let annotation, let mapView, annotation === followedAnnotation else { return }
// Mirror every animated coordinate update to keep the camera as smooth as the marker.
followedAnnotationObservation = annotation.observe(\.coordinate) { [weak mapView] annotation, _ in
// The coordinate is only ever updated by SwiftUI so KVO fires on the main actor.
MainActor.assumeIsolated {
mapView?.setCenter(annotation.coordinate, animated: false)
}
}
}
}
private func stopFollowingMarker() {
followedAnnotation = nil
followedAnnotationObservation = nil
}
// MARK: - MLNMapViewDelegate
func mapView(_ mapView: MLNMapView, viewFor annotation: MLNAnnotation) -> MLNAnnotationView? {
guard let annotation = annotation as? MapLibreAnnotation else {
return nil
}
return MapLibreAnnotationView(annotation: annotation, content: mapLibreView.configuration.markerView(annotation.id))
}
func mapViewDidFailLoadingMap(_ mapView: MLNMapView, withError error: Error) {
if mapLibreView.configuration.error.wrappedValue != .failedLoadingMap {
mapLibreView.configuration.error.wrappedValue = .failedLoadingMap
}
}
func mapView(_ mapView: MLNMapView, didUpdate userLocation: MLNUserLocation?) {
guard let userLocation else { return }
mapLibreView.configuration.hasLoadedUserLocation.wrappedValue = true
if previousUserLocation == nil, mapLibreView.configuration.annotations.isEmpty {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
mapView.setCenter(userLocation.coordinate, zoomLevel: self.mapLibreView.configuration.zoomLevel, animated: true)
}
}
previousUserLocation = userLocation
updateGeolocationUncertainty(location: userLocation)
}
func mapView(_ mapView: MLNMapView, didChangeLocationManagerAuthorization manager: MLNLocationManager) {
switch manager.authorizationStatus {
case .denied, .restricted:
mapLibreView.configuration.isLocationAuthorized.wrappedValue = false
case .authorizedAlways, .authorizedWhenInUse:
mapLibreView.configuration.isLocationAuthorized.wrappedValue = true
case .notDetermined:
mapLibreView.configuration.isLocationAuthorized.wrappedValue = nil
@unknown default:
break
}
}
func mapView(_ mapView: MLNMapView, regionDidChangeAnimated animated: Bool) {
// While following a marker, don't flood the center binding with per-frame camera updates.
// Leaving `lastReportedCenter` untouched avoids an external re-centering when following stops.
guard mapLibreView.configuration.showsUserLocationMode.wrappedValue.followedMarkerID == nil else { return }
// Avoid `Publishing changes from within view update` warnings
DispatchQueue.main.async { [mapLibreView, weak self] in
let center = mapView.centerCoordinate
self?.lastReportedCenter = center
mapLibreView.configuration.mapCenterCoordinate.wrappedValue = center
}
}
func mapView(_ mapView: MLNMapView, shouldChangeFrom oldCamera: MLNMapCamera, to newCamera: MLNMapCamera, reason: MLNCameraChangeReason) -> Bool {
// Send userDidPan only for gestures that actually change the map center. The reason
// is an option set and gestures can come combined with other reasons, so check for
// containment instead of an exact match.
let centerChangingGestures: MLNCameraChangeReason = [.gesturePan, .gesturePinch, .gestureRotate]
if !reason.isDisjoint(with: centerChangingGestures) {
// Stop following immediately, the camera would fight the gesture otherwise.
stopFollowingMarker()
mapLibreView.configuration.userDidPan?()
}
return true
}
// MARK: Callout
func mapView(_ mapView: MLNMapView, annotationCanShowCallout annotation: MLNAnnotation) -> Bool {
false
}
// MARK: Private
private func updateGeolocationUncertainty(location: MLNUserLocation) {
guard let clLocation = location.location, clLocation.horizontalAccuracy >= 0 else {
mapLibreView.configuration.geolocationUncertainty.wrappedValue = nil
return
}
mapLibreView.configuration.geolocationUncertainty.wrappedValue = clLocation.horizontalAccuracy
}
}
}
@@ -1,39 +0,0 @@
//
// Copyright 2026 Element Creations Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import MapLibre
import MapLibreInterface
import SwiftUI
/// The shim's entry point: the app looks this class up by name through the ObjC runtime
/// after `dlopen`-ing the framework, keeping MapLibre off the app's launch path.
@objc(MapLibreShim)
public final class MapLibreShim: NSObject, MapLibreShimProtocol {
public func configureLogging(_ handler: @escaping @Sendable (MapLogSeverity, String) -> Void) {
MLNLoggingConfiguration.shared.loggingLevel = .debug
MLNLoggingConfiguration.shared.handler = { loggingLevel, _, _, message in
switch loggingLevel {
case .error:
handler(.error, message)
case .warning:
handler(.warning, message)
case .info:
handler(.info, message)
case .debug:
handler(.debug, message)
case .verbose:
handler(.verbose, message)
default:
break
}
}
}
public func makeMapView(configuration: MapViewConfiguration) -> AnyView {
AnyView(MapLibreMapView(configuration: configuration))
}
}
@@ -1,26 +0,0 @@
# The interactive map, split out of the app so MapLibre's static initialisers stay off the
# launch path: the app links only the tiny MapLibreInterface framework, while MapLibreShim (the
# only image linking MapLibre) is embedded unlinked and dlopen'd on first map use.
name: MapLibreShim
targets:
MapLibreShim:
type: framework
platform: iOS
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: $(BASE_BUNDLE_IDENTIFIER).maplibre-shim
GENERATE_INFOPLIST_FILE: YES
SWIFT_VERSION: 6
SWIFT_APPROACHABLE_CONCURRENCY: YES
SWIFT_DEFAULT_ACTOR_ISOLATION: MainActor
dependencies:
- target: MapLibreInterface
embed: false
- package: MapLibre
embed: false
sources:
- path: ../Sources
-9
View File
@@ -1,9 +0,0 @@
nonisolated enum Secrets {
static let sentryDSN: String? = nil
static let sentryRustDSN: String? = nil
static let postHogHost: String? = nil
static let postHogAPIKey: String? = nil
static let rageshakeURL: String? = nil
static let mapLibreAPIKey: String? = "your_key"
}
+52
View File
@@ -0,0 +1,52 @@
import Danger
import Foundation
SwiftLint.lint(.modifiedAndCreatedFiles(directory: nil),
inline: true,
configFile: nil,
strict: false,
quiet: true,
swiftlintPath: nil,
markdownAction: { _ in })
let danger = Danger()
/// All of the new and modified files together.
let editedFiles = danger.git.modifiedFiles + danger.git.createdFiles
// Warn when there is a big PR
if (danger.github.pullRequest.additions ?? 0) > 1000 {
warn("This pull request seems relatively large. Please consider splitting it into multiple smaller ones.")
}
// Check that the PR has a description
if danger.github.pullRequest.body?.isEmpty ?? true {
warn("Please provide a description for this PR.")
}
/// Check for screenshots on view changes
let hasChangedViews = editedFiles.contains { $0.lowercased().contains("/view") }
if hasChangedViews {
if (danger.github.pullRequest.body?.contains("user-attachments") ?? false) == false {
warn("You seem to have made changes to views. Please consider adding screenshots.")
}
}
/// Check for pngs on resources
let hasPngs = editedFiles.contains { $0.lowercased().contains(".xcassets") && $0.lowercased().hasSuffix(".png") }
if hasPngs {
warn("You seem to have made changes to some resource images. Please consider using an SVG or PDF.")
}
// Check for nice PR titles
let prTitle = danger.github.pullRequest.title
let fixesRegex = try! Regex("(Fixes|Fix) #\\d+")
let semanticRegex = try! Regex("\\w+\\(\\w+\\):")
if prTitle.hasSuffix("…") || prTitle.starts(with: fixesRegex) || prTitle.starts(with: semanticRegex) {
fail("Please provide a complete title that can be used as a changelog entry.")
}
// Check for changelog tags
if danger.github.issue.labels.filter({ $0.name.hasPrefix("pr-") }).count != 1 {
fail("Please add a `pr-` label to categorise the changelog entry.")
}
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cc39671ee91a08779e4149589a4635fa6b91519b07bfb2dee621ccab031a75c5
size 5825201
File diff suppressed because it is too large Load Diff
@@ -1,13 +1,13 @@
{
"originHash" : "fbdb76ae8c78e5a86db4812456fcb4da5795eed4bc8f6715726fec41e87a1e0f",
"originHash" : "1c7d307d80ee561100a0432a5ae13f345392a1175c7f6c17c2eb0da269382c57",
"pins" : [
{
"identity" : "compound-design-tokens",
"kind" : "remoteSourceControl",
"location" : "https://github.com/element-hq/compound-design-tokens",
"state" : {
"revision" : "28b921601ac0ff49a572b6f18526d97bd14e5d91",
"version" : "11.3.1"
"revision" : "6e33c5bf3cbb4c29dbe5fc063d24b375849c0fac",
"version" : "10.2.2"
}
},
{
@@ -15,8 +15,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/devicekit/DeviceKit",
"state" : {
"revision" : "19528aa07e1426626ea9fb2c4a161edf43c4f9e8",
"version" : "5.9.0"
"revision" : "56b997e8a61707218f9af09f32b2a1d1806fd792",
"version" : "5.8.0"
}
},
{
@@ -55,22 +55,13 @@
"version" : "1.2.0"
}
},
{
"identity" : "element-call-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/element-hq/element-call-ios",
"state" : {
"revision" : "d77b4ee326582083cabe53ffbd872a751c3cb989",
"version" : "0.1.0-rc.11"
}
},
{
"identity" : "element-call-swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/element-hq/element-call-swift",
"state" : {
"revision" : "befb5d37a7859ad38cf83719cbfd4abaffa04d82",
"version" : "0.26.1"
"revision" : "d2ecef5a54e5718ed6344dde6f72a4da42f1fcd9",
"version" : "0.20.2"
}
},
{
@@ -104,8 +95,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/onevcat/Kingfisher",
"state" : {
"revision" : "8648fe649c5d62be38721110f835821906e9242a",
"version" : "8.13.0"
"revision" : "ac632bd26a1c00f139ff62fd01806f21cf67325e",
"version" : "8.10.0"
}
},
{
@@ -131,8 +122,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/nicklockwood/LRUCache",
"state" : {
"revision" : "f0570e943ea4445d258113ba73f50cb2b7e564ac",
"version" : "1.3.0"
"revision" : "cb5b2bd0da83ad29c0bec762d39f41c8ad0eaf3e",
"version" : "1.2.1"
}
},
{
@@ -140,8 +131,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/guoyingtao/Mantis",
"state" : {
"revision" : "0960be1feed2e62f62a5fddbb8d72b26008db881",
"version" : "3.1.0"
"revision" : "b3c237aff54b8307440157a2f5956bdea2e76791",
"version" : "2.31.2"
}
},
{
@@ -149,8 +140,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/maplibre/maplibre-gl-native-distribution",
"state" : {
"revision" : "13e41ab3d77ff5113e7e5d4ee87803b1f81f5683",
"version" : "6.31.0"
"revision" : "84a79bc375a301169390ac110c868f06c857b83f",
"version" : "6.27.0"
}
},
{
@@ -158,8 +149,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/matrix-org/matrix-analytics-events",
"state" : {
"revision" : "7d668b3e4be493843805b8a1ff4e13b261a19965",
"version" : "0.38.0"
"revision" : "4b143b14a16a231bd4fc3c6705845f852177abe3",
"version" : "0.37.0"
}
},
{
@@ -167,8 +158,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/element-hq/matrix-rich-text-editor-swift",
"state" : {
"revision" : "56077711bf495db926ec3f3efd36ed127fb9ceb1",
"version" : "2.42.1"
"revision" : "c0877fb9323d1ec2de56e4fe2da97f73cac36c38",
"version" : "2.42.0"
}
},
{
@@ -176,17 +167,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/element-hq/matrix-rust-components-swift",
"state" : {
"revision" : "dbdf59e13d0eade7fd9cbd01cfd564693b85b761",
"version" : "26.10.15"
}
},
{
"identity" : "matrix-rust-rtc",
"kind" : "remoteSourceControl",
"location" : "https://github.com/element-hq/matrix-rust-rtc",
"state" : {
"revision" : "c7a81b6742dc5e571b90b05f5109677384efb933",
"version" : "0.5.0-rc.5"
"revision" : "24c26f6697e03e42d176c61b5923ac958f5fa32d",
"version" : "26.7.3"
}
},
{
@@ -212,8 +194,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/PostHog/posthog-ios",
"state" : {
"revision" : "d97d9a0babda42ecee026bd0a5a9ea1756349dc1",
"version" : "3.85.3"
"revision" : "6e70aa24bbd3778182fe039f7f5800a17674a6d6",
"version" : "3.61.1"
}
},
{
@@ -221,8 +203,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/getsentry/sentry-cocoa",
"state" : {
"revision" : "8689e780a295dfdc6501ac0dbb502461e16d6551",
"version" : "9.29.2"
"revision" : "43abfbf9a26089ad34604c718ad0935440caf1d4",
"version" : "9.18.0"
}
},
{
@@ -248,8 +230,17 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-async-algorithms",
"state" : {
"revision" : "789dcf1f3d3f00251482f40a432ab7144c181987",
"version" : "1.1.6"
"revision" : "d0b4a06d0f173a2f3be27d3ea21b3c3aa18db440",
"version" : "1.1.4"
}
},
{
"identity" : "swift-clocks",
"kind" : "remoteSourceControl",
"location" : "https://github.com/pointfreeco/swift-clocks",
"state" : {
"revision" : "72d749bf341b78851203066ab421869b783ec42a",
"version" : "1.1.0"
}
},
{
@@ -257,8 +248,17 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-collections",
"state" : {
"revision" : "98ef3c98609a1e31b7e157b5b619579001a789d6",
"version" : "1.7.1"
"revision" : "a0cb0954ecb21e4e31b0070e6ed5674e8556685a",
"version" : "1.6.0"
}
},
{
"identity" : "swift-concurrency-extras",
"kind" : "remoteSourceControl",
"location" : "https://github.com/pointfreeco/swift-concurrency-extras",
"state" : {
"revision" : "5a3825302b1a0d744183200915a47b508c828e6f",
"version" : "1.3.2"
}
},
{
@@ -293,8 +293,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/pointfreeco/swift-snapshot-testing",
"state" : {
"revision" : "28e5de025e3fd98991791bfbf83023ab3708da03",
"version" : "1.19.6"
"revision" : "ad5e3190cc63dc288f28546f9c6827efc1e9d495",
"version" : "1.19.2"
}
},
{
@@ -302,8 +302,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/swiftlang/swift-syntax",
"state" : {
"revision" : "050f1a346fbbac0ca2cfb15a95274f7bd1cf0ccf",
"version" : "604.0.0"
"revision" : "79e4b74a295b6eb74a8b585e3a39d29e70c1dbd1",
"version" : "603.0.2"
}
},
{
@@ -311,8 +311,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/scinfu/SwiftSoup.git",
"state" : {
"revision" : "18b80329749eca5ea29fc50211dca5c7eff5bfec",
"version" : "2.13.9"
"revision" : "49dcadd93161f4a44b4994d3a3e8de9f085aface",
"version" : "2.13.5"
}
},
{
@@ -329,8 +329,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/tevelee/SwiftUI-Flow.git",
"state" : {
"revision" : "19e86b750b3c67260cbb28c459004c0dfdb11899",
"version" : "3.5.1"
"revision" : "798364823cdfc6afb4aff43eff5a3ddbca89b54f",
"version" : "3.4.0"
}
},
{
@@ -338,8 +338,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/siteline/SwiftUI-Introspect",
"state" : {
"revision" : "a37eca1db7bebc9437ee89508e7b4433ff34adb4",
"version" : "27.0.0"
"revision" : "26986a57e31c813f98262ddb62d4b07d40008535",
"version" : "26.0.1"
}
},
{
@@ -4,7 +4,8 @@
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
buildImplicitDependencies = "YES"
runPostActionsOnFailure = "NO">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
@@ -26,7 +27,14 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
shouldUseLaunchSchemeArgsEnv = "YES"
onlyGenerateCoverageForSpecifiedTargets = "NO">
<TestPlans>
<TestPlanReference
default = "YES"
reference = "container:AccessibilityTests/SupportingFiles/AccessibilityTests.xctestplan">
</TestPlanReference>
</TestPlans>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -36,12 +44,10 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<TestPlans>
<TestPlanReference
reference = "container:AccessibilityTests/SupportingFiles/AccessibilityTests.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
<Testables>
</Testables>
<CommandLineArguments>
</CommandLineArguments>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -62,6 +68,8 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<CommandLineArguments>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
@@ -69,6 +77,8 @@
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<CommandLineArguments>
</CommandLineArguments>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -4,7 +4,8 @@
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
buildImplicitDependencies = "YES"
runPostActionsOnFailure = "NO">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
@@ -29,6 +30,12 @@
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES"
onlyGenerateCoverageForSpecifiedTargets = "YES">
<TestPlans>
<TestPlanReference
default = "YES"
reference = "container:UnitTests/SupportingFiles/UnitTests.xctestplan">
</TestPlanReference>
</TestPlans>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -38,6 +45,10 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
</Testables>
<CommandLineArguments>
</CommandLineArguments>
<CodeCoverageTargets>
<BuildableReference
BuildableIdentifier = "primary"
@@ -47,12 +58,6 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</CodeCoverageTargets>
<TestPlans>
<TestPlanReference
reference = "container:UnitTests/SupportingFiles/UnitTests.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -74,17 +79,14 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
<EnvironmentVariables>
<EnvironmentVariable
key = "HTTPS_PROXY"
value = "localhost:9090"
isEnabled = "NO">
</EnvironmentVariable>
<EnvironmentVariable
key = "HTTP_PROXY"
value = "localhost:9090"
isEnabled = "NO">
</EnvironmentVariable>
<EnvironmentVariable
key = "UI_TESTS_SCREEN"
value = ""
@@ -113,6 +115,8 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
@@ -4,7 +4,8 @@
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
buildImplicitDependencies = "YES"
runPostActionsOnFailure = "NO">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
@@ -29,6 +30,12 @@
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES"
onlyGenerateCoverageForSpecifiedTargets = "YES">
<TestPlans>
<TestPlanReference
default = "YES"
reference = "container:IntegrationTests/SupportingFiles/IntegrationTests.xctestplan">
</TestPlanReference>
</TestPlans>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -38,6 +45,10 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
</Testables>
<CommandLineArguments>
</CommandLineArguments>
<CodeCoverageTargets>
<BuildableReference
BuildableIdentifier = "primary"
@@ -47,12 +58,6 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</CodeCoverageTargets>
<TestPlans>
<TestPlanReference
reference = "container:IntegrationTests/SupportingFiles/IntegrationTests.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -73,6 +78,8 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<CommandLineArguments>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
@@ -80,6 +87,8 @@
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<CommandLineArguments>
</CommandLineArguments>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -5,7 +5,8 @@
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
buildImplicitDependencies = "YES"
runPostActionsOnFailure = "NO">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
@@ -27,7 +28,8 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
shouldUseLaunchSchemeArgsEnv = "YES"
onlyGenerateCoverageForSpecifiedTargets = "NO">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -39,6 +41,8 @@
</MacroExpansion>
<Testables>
</Testables>
<CommandLineArguments>
</CommandLineArguments>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -62,6 +66,8 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
@@ -79,6 +85,8 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
@@ -4,7 +4,8 @@
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
buildImplicitDependencies = "YES"
runPostActionsOnFailure = "NO">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
@@ -29,6 +30,12 @@
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES"
onlyGenerateCoverageForSpecifiedTargets = "YES">
<TestPlans>
<TestPlanReference
default = "YES"
reference = "container:PreviewTests/SupportingFiles/PreviewTests.xctestplan">
</TestPlanReference>
</TestPlans>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -38,6 +45,10 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
</Testables>
<CommandLineArguments>
</CommandLineArguments>
<CodeCoverageTargets>
<BuildableReference
BuildableIdentifier = "primary"
@@ -47,12 +58,6 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</CodeCoverageTargets>
<TestPlans>
<TestPlanReference
reference = "container:PreviewTests/SupportingFiles/PreviewTests.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -73,6 +78,8 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<CommandLineArguments>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
@@ -80,6 +87,8 @@
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<CommandLineArguments>
</CommandLineArguments>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -5,7 +5,8 @@
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
buildImplicitDependencies = "YES"
runPostActionsOnFailure = "NO">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
@@ -27,7 +28,8 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
shouldUseLaunchSchemeArgsEnv = "YES"
onlyGenerateCoverageForSpecifiedTargets = "NO">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -39,6 +41,8 @@
</MacroExpansion>
<Testables>
</Testables>
<CommandLineArguments>
</CommandLineArguments>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -62,6 +66,8 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
@@ -79,6 +85,8 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<CommandLineArguments>
</CommandLineArguments>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
@@ -4,7 +4,8 @@
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
buildImplicitDependencies = "YES"
runPostActionsOnFailure = "NO">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
@@ -26,7 +27,14 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
shouldUseLaunchSchemeArgsEnv = "YES"
onlyGenerateCoverageForSpecifiedTargets = "NO">
<TestPlans>
<TestPlanReference
default = "YES"
reference = "container:UITests/SupportingFiles/UITests.xctestplan">
</TestPlanReference>
</TestPlans>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -36,12 +44,10 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<TestPlans>
<TestPlanReference
reference = "container:UITests/SupportingFiles/UITests.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
<Testables>
</Testables>
<CommandLineArguments>
</CommandLineArguments>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -62,6 +68,8 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<CommandLineArguments>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
@@ -69,6 +77,8 @@
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<CommandLineArguments>
</CommandLineArguments>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -4,7 +4,8 @@
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
buildImplicitDependencies = "YES"
runPostActionsOnFailure = "NO">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
@@ -29,6 +30,12 @@
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES"
onlyGenerateCoverageForSpecifiedTargets = "YES">
<TestPlans>
<TestPlanReference
default = "YES"
reference = "container:UnitTests/SupportingFiles/UnitTests.xctestplan">
</TestPlanReference>
</TestPlans>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -38,6 +45,10 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
</Testables>
<CommandLineArguments>
</CommandLineArguments>
<CodeCoverageTargets>
<BuildableReference
BuildableIdentifier = "primary"
@@ -47,12 +58,6 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</CodeCoverageTargets>
<TestPlans>
<TestPlanReference
reference = "container:UnitTests/SupportingFiles/UnitTests.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -73,6 +78,8 @@
ReferencedContainer = "container:ElementX.xcodeproj">
</BuildableReference>
</MacroExpansion>
<CommandLineArguments>
</CommandLineArguments>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
@@ -80,6 +87,8 @@
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<CommandLineArguments>
</CommandLineArguments>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -1,6 +0,0 @@
"NSCameraUsageDescription" = "يحتاج Element X إلى الوصول إلى الكاميرا لالتقاط الصور أو مقاطع الفيديو وإرسالها كرسائل.";
"NSFaceIDUsageDescription" = "يُستخدم Face ID لحماية الوصول إلى حسابك.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "لمشاركة موقعك المباشر، يحتاج Element X إلى الوصول إلى الموقع عندما يكون التطبيق في الخلفية.";
"NSLocationWhenInUseUsageDescription" = "امنح الوصول إلى الموقع حتى يتمكن Element X من مشاركة موقعك.";
"NSMicrophoneUsageDescription" = "يحتاج Element X إلى الوصول إلى الميكروفون لتسجيل الرسائل الصوتية وإرسالها.";
"NSPhotoLibraryUsageDescription" = "يتيح لك هذا حفظ الصور ومقاطع الفيديو في مكتبة الصور لديك.";
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,64 +0,0 @@
"aeroplane" = "طَائِرة";
"anchor" = "مِرسَاة";
"apple" = "تُفَّاحَة";
"ball" = "كُرَة";
"banana" = "مَوزَة";
"bell" = "جَرَس";
"bicycle" = "دَرّاجَة";
"book" = "كِتَاب";
"butterfly" = "فَرَاشَة";
"cactus" = "صبار";
"cake" = "كَعكَة";
"cat" = "هِرَّة";
"clock" = "سَاعَة";
"cloud" = "سَحابَة";
"corn" = "ذُرَة";
"dog" = "كلب";
"elephant" = "فِيل";
"fire" = "نار";
"fish" = "سَمَكة";
"flag" = "عَلَم";
"flower" = "زَهرَة";
"folder" = "مُجَلَّد";
"gift" = "هَدِيَّة";
"glasses" = "نَظَّارَة";
"globe" = "كُرَةٌ أرضِيَّة";
"guitar" = "غيتار";
"hammer" = "مِطرَقَة";
"hat" = "قُبَّعَة";
"headphones" = "سَمّاعَة رَأس";
"heart" = "قَلب";
"horse" = "حِصَان";
"hourglass" = "سَاعَةٌ رَملِيَّة";
"key" = "مِفتَاح";
"light_bulb" = "مِصبَاح";
"lion" = "أَسَد";
"lock" = "قُفل";
"moon" = "قَمَر";
"mushroom" = "فُطر";
"octopus" = "أُخطُبُوط";
"panda" = "باندَا";
"paperclip" = "مِشبَكُ وَرَق";
"pencil" = "قَلَمُ رَصاص";
"penguin" = "بطريق";
"pig" = "خِنزِير";
"pin" = "دَبُّوس";
"pizza" = "بِيتزا";
"rabbit" = "أَرنَب";
"robot" = "رُوبُوت";
"rocket" = "صَارُوخ";
"rooster" = "دِيك";
"santa" = "سانتا";
"scissors" = "مِقَصّ";
"smiley" = "اِبتِسَامَة";
"spanner" = "مِفتَاحُ رَبط";
"strawberry" = "فَراوِلَة";
"telephone" = "تِلِفُون";
"thumbs_up" = "رَفعُ إِبهَام";
"train" = "قِطَار";
"tree" = "شَجَرَة";
"trophy" = "كَأسُ النَّصر";
"trumpet" = "بُوق";
"turtle" = "سُلحفاة";
"umbrella" = "مِظَلَّة";
"unicorn" = "حصان وحيد القرن";
@@ -1,6 +1,6 @@
"NSCameraUsageDescription" = "Каб зрабіць фота ці відэа і адправіць іх у выглядзе паведамлення, Element X патрабуе доступу да камеры.";
"NSFaceIDUsageDescription" = "Face ID выкарыстоўваецца для доступу да праграмы.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "To share your location live in chats, location access is needed when the app is in the background.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "To share your live location, Element X needs location access when the app is in the background.";
"NSLocationWhenInUseUsageDescription" = "Дайце доступ да месцазнаходжання, каб Element X мог падзяліцца вашым месцазнаходжаннем.";
"NSMicrophoneUsageDescription" = "Каб запісваць і адпраўляць паведамленні з гукам, Element X патрабуе доступу да мікрафона.";
"NSPhotoLibraryUsageDescription" = "Дазваляе захоўваць фатаграфіі і відэа ў вашу бібліятэку.";
@@ -1,4 +1,4 @@
"a11y_add_avatar" = "Дадаць аватар";
"a11y_add_avatar" = "Add avatar";
"a11y_add_reaction" = "Дадаць рэакцыю: %1$@";
"a11y_address" = "Адрас";
"a11y_avatar" = "Аватар";
@@ -6,23 +6,16 @@
"a11y_collapse_message_text_field" = "Minimise message text field";
"a11y_create_poll_votes_allowed_decrease" = "Decrease votes allowed per person";
"a11y_create_poll_votes_allowed_increase" = "Increase votes allowed per person";
"a11y_custom_emoji" = "Custom emoji";
"a11y_delete" = "Выдаліць";
"a11y_duration" = "Працягласць: %1$@";
"a11y_duration" = "Duration: %1$@";
"a11y_edit_avatar" = "Змяніць аватар";
"a11y_edit_room_address_hint" = "Поўны адрас будзе %1$@";
"a11y_expand_message_text_field" = "Expand message text field";
"a11y_gallery_attachment" = "Gallery, attachment %1$d";
"a11y_gallery_failed_scan" = "Gallery, failed scan %1$d";
"a11y_gallery_image" = "Gallery, image %1$d";
"a11y_gallery_scanning" = "Gallery, scanning %1$d";
"a11y_gallery_video" = "Gallery, video %1$d";
"a11y_hide_password" = "Схаваць пароль";
"a11y_info" = "Інфармацыя";
"a11y_join_call" = "Далучыцца да выкліку";
"a11y_jump_to_bottom" = "Перайсці ўніз";
"a11y_jump_to_unread" = "Перайсці да непрачытаных";
"a11y_jump_to_unread_messages" = "Jump to first unread message";
"a11y_jump_to_unread" = "Jump to unread";
"a11y_notifications_mentions_only" = "Толькі згадкі";
"a11y_notifications_muted" = "Гук адключаны";
"a11y_notifications_new_mentions" = "Новыя згадкі";
@@ -40,7 +33,7 @@
"a11y_poll_end" = "Апытанне скончана";
"a11y_polls_will_remove_selection" = "Will remove previous selection";
"a11y_polls_winning_answer" = "This is the winning answer";
"a11y_position" = "Пазіцыя: %1$@";
"a11y_position" = "Position: %1$@";
"a11y_qr_code" = "QR-код";
"a11y_react_with" = "Рэагаваць з %1$@";
"a11y_react_with_other_emojis" = "Рэагаваць з іншымі эмодзі";
@@ -57,7 +50,6 @@
"a11y_start_call" = "Пазваніць";
"a11y_start_video_call" = "Start a video call";
"a11y_start_voice_call" = "Start a voice call";
"a11y_status" = "Статус";
"a11y_tombstoned_room" = "Tombstoned room";
"a11y_user_menu" = "Меню карыстальніка";
"a11y_video_preview" = "Video preview";
@@ -83,10 +75,9 @@
"action_call" = "Званок";
"action_cancel" = "Скасаваць";
"action_cancel_for_now" = "Адмяніць пакуль";
"action_choose_file" = "Выбраць файл";
"action_choose_file" = "Choose file";
"action_choose_photo" = "Выбраць фота";
"action_clear" = "Ачысціць";
"action_clear_all" = "Clear all";
"action_close" = "Закрыць";
"action_complete_verification" = "Праверка завершана";
"action_confirm" = "Пацвердзіць";
@@ -97,10 +88,9 @@
"action_copy_link" = "Скапіраваць спасылку";
"action_copy_link_to_message" = "Скапіраваць спасылку на паведамленне";
"action_copy_text" = "Скапіяваць тэкст";
"action_copy_to_clipboard" = "Copy to clipboard";
"action_create" = "Стварыць";
"action_create_room" = "Стварыце пакой";
"action_create_space" = "Стварыць прастору";
"action_create_space" = "Create space";
"action_deactivate" = "Дэактываваць";
"action_deactivate_account" = "Дэактываваць уліковы запіс";
"action_decline" = "Адхіліць";
@@ -145,14 +135,13 @@
"action_manage_account_and_devices" = "Manage account & devices";
"action_manage_devices" = "Кіраванне прыладамі";
"action_manage_rooms" = "Manage rooms";
"action_mark_as_read" = "Пазначыць як прачытанае";
"action_message" = "Паведамленне";
"action_minimize" = "Minimise";
"action_next" = "Далей";
"action_no" = "Не";
"action_not_now" = "Не зараз";
"action_ok" = "Добра";
"action_open_context_menu" = "Адкрыць кантэкстнае меню";
"action_open_context_menu" = "Open context menu";
"action_open_settings" = "Налады";
"action_open_with" = "Адкрыць з дапамогай";
"action_pin" = "Замацаваць";
@@ -220,8 +209,7 @@
"call_invalid_audio_device_bluetooth_devices_disabled" = "Element Call does not support using Bluetooth audio devices in this Android version. Please select a different audio device.";
"common_about" = "Аб праграме";
"common_acceptable_use_policy" = "Палітыка дапушчальнага выкарыстання";
"common_account_settings" = "Account settings";
"common_add_account" = "Дадаць уліковы запіс";
"common_add_account" = "Add an account";
"common_add_another_account" = "Add account";
"common_adding_caption" = "Adding caption";
"common_advanced_settings" = "Пашыраныя налады";
@@ -229,7 +217,6 @@
"common_analytics" = "Аналітыка";
"common_android_shortcuts_remove_reason_left_room" = "Вы выйшлі з пакоя";
"common_android_shortcuts_remove_reason_session_logged_out" = "You were logged out of the session";
"common_app_settings" = "App settings";
"common_appearance" = "Знешні выгляд";
"common_audio" = "Аўдыя";
"common_beta" = "Beta";
@@ -240,20 +227,18 @@
"common_call_started" = "Званок пачаўся";
"common_call_you_declined" = "You declined a call";
"common_chat_backup" = "Рэзервовае капіраванне чатаў";
"common_chats" = "Chats";
"common_code_block" = "Code block";
"common_copied_to_clipboard" = "Скапіравана ў буфер абмену";
"common_copyright" = "Аўтарскае права";
"common_creating_room" = "Стварэнне пакоя…";
"common_creating_space" = "Стварэнне прасторы…";
"common_creating_space" = "Creating space…";
"common_current_user_canceled_knock" = "Request canceled";
"common_current_user_left_room" = "Выйшаў з пакоя";
"common_current_user_left_space" = "Left space";
"common_current_user_rejected_invite" = "Invite declined";
"common_date_date_at_time" = "%1$@ у %2$@";
"common_date_date_at_time" = "%1$@ at %2$@";
"common_date_this_month" = "This month";
"common_decryption_error" = "Памылка расшыфроўкі";
"common_description" = "Апісанне";
"common_description" = "Description";
"common_developer_options" = "Параметры распрацоўшчыка";
"common_device_id" = "Device ID";
"common_direct_chat" = "Прамы чат";
@@ -264,7 +249,7 @@
"common_editing" = "Рэдагаванне";
"common_editing_caption" = "Editing caption";
"common_emote" = "* %1$@ %2$@";
"common_empty_file" = "Пусты файл";
"common_empty_file" = "Empty file";
"common_encryption" = "Encryption";
"common_encryption_enabled" = "Шыфраванне ўключана";
"common_ends_at" = "Ends at %1$@";
@@ -276,15 +261,13 @@
"common_favourite" = "Абраць";
"common_favourited" = "Абранае";
"common_file" = "Файл";
"common_file_deleted" = "Файл выдалены";
"common_file_saved" = "Файл захаваны";
"common_file_deleted" = "File deleted";
"common_file_saved" = "File saved";
"common_forward_message" = "Перасылка паведамлення";
"common_forward_to" = "Forward to";
"common_frequently_used" = "Frequently used";
"common_gallery" = "Галерэя";
"common_gallery" = "Gallery";
"common_gif" = "GIF";
"common_group_call_in_progress" = "Group call in progress";
"common_header_rooms" = "Rooms";
"common_image" = "Відарыс";
"common_in_reply_to" = "У адказ на %1$@";
"common_invite_unknown_profile" = "Гэты Matrix ID не знойдзены, таму запрашэнне можа быць не атрымана.";
@@ -297,25 +280,20 @@
"common_live_location_ended" = "Live location ended";
"common_loading" = "Загрузка…";
"common_loading_more" = "Loading more…";
"common_location_sharing" = "Location sharing";
"common_media_upload_quality" = "Media upload quality";
"common_message" = "Паведамленне";
"common_message_actions" = "Дзеянні з паведамленням";
"common_message_failed_to_send" = "Message failed to send";
"common_message_layout" = "Выгляд паведамлення";
"common_message_removed" = "Паведамленне выдалена";
"common_moderation_and_safety" = "Moderation & safety";
"common_modern" = "Сучасны";
"common_mute" = "Адкл. гук";
"common_name" = "Імя";
"common_name_and_id" = "%1$@ (%2$@)";
"common_no_results" = "Вынікаў няма";
"common_no_results_for" = "There are no results for “%1$@”. Try a new search term.";
"common_no_room_name" = "Няма назвы пакоя";
"common_no_space_name" = "No space name";
"common_not_encrypted" = "Не зашыфравана";
"common_offline" = "Па-за сеткай";
"common_on_a_call" = "On a call";
"common_open_source_licenses" = "Ліцэнзіі з адкрытым зыходным кодам";
"common_optic_id_ios" = "Optic ID";
"common_or" = "або";
@@ -349,9 +327,8 @@
"common_replying_to" = "Адказвае на %1$@";
"common_report_a_problem" = "Паведаміць аб праблеме";
"common_report_submitted" = "Скарга прынята";
"common_results_for" = "Results for “%1$@”";
"common_rich_text_editor" = "Рэдактар фарматаванага тэксту";
"common_role" = "Роля";
"common_role" = "Role";
"common_room" = "Пакой";
"common_room_name" = "Назва пакоя";
"common_room_name_placeholder" = "напрыклад, назва вашага праекта";
@@ -377,7 +354,6 @@
"common_shared_live_location" = "Shared live location";
"common_shared_location" = "Абагулена месцазнаходжанне";
"common_shared_space" = "Shared space";
"common_signed_in" = "Signed in";
"common_signing_out" = "Выхад";
"common_something_went_wrong" = "Нешта пайшло не так";
"common_something_went_wrong_message" = "We encountered an issue. Please try again.";
@@ -389,7 +365,6 @@
"common_success" = "Поспех";
"common_suggested" = "Suggested";
"common_suggestions" = "Прапановы";
"common_switch_accounts" = "Switch accounts";
"common_syncing" = "Сінхранізацыя";
"common_text" = "Тэкст";
"common_third_party_notices" = "Паведамленні трэціх асоб";
@@ -418,11 +393,11 @@
"common_verify_identity" = "Verify identity";
"common_verify_user" = "Verify user";
"common_video" = "Відэа";
"common_video_quality_high" = "Высокая якасць";
"common_video_quality_high" = "High quality";
"common_video_quality_high_description" = "Best quality but larger file size";
"common_video_quality_low" = "Нізкая якасць";
"common_video_quality_low" = "Low quality";
"common_video_quality_low_description" = "Fastest upload speed and smallest file size";
"common_video_quality_standard" = "Стандартная якасць";
"common_video_quality_standard" = "Standard quality";
"common_video_quality_standard_description" = "Balance of quality and upload speed";
"common_voice_message" = "Галасавое паведамленне";
"common_waiting" = "Чакаем…";
@@ -430,14 +405,12 @@
"common_waiting_live_location" = "Waiting for live location…";
"common_world_readable_history" = "Anyone can see history";
"common_you" = "Вы";
"common_your_account" = "Your account";
"confirm_recovery_key_banner_message" = "Пацвердзіце свой ключ аднаўлення, каб захаваць доступ да сховішча ключоў і гісторыі паведамленняў.";
"confirm_recovery_key_banner_primary_button_title" = "Enter your recovery key";
"confirm_recovery_key_banner_secondary_button_title" = "Forgot your recovery key?";
"confirm_recovery_key_banner_title" = "Ваша сховішча ключоў не сінхранізавана";
"content_scanner_not_found" = "Download not available.";
"content_scanner_not_found_title" = "Something went wrong";
"content_scanner_scanning" = "Scanning…";
"content_scanner_not_found_title" = "File not found";
"content_scanner_unsafe_message" = "Preview and download have been disabled.";
"content_scanner_unsafe_title" = "The file is not safe";
"crash_detection_dialog_content" = "Пры апошнім выкарыстанні %1$@ адбыўся збой. Хочаце абагуліць справаздачу аб збоі?";
@@ -460,7 +433,7 @@
"crypto_identity_change_profile_pin_violation" = "%1$@’s digital identity was reset.";
"crypto_identity_change_verification_violation_new" = "%1$@’s %2$@ digital identity was reset. %3$@";
"crypto_identity_change_withdraw_verification_action" = "Withdraw verification";
"dialog_allow_access" = "Дазволіць доступ";
"dialog_allow_access" = "Allow access";
"dialog_confirm_link_message" = "The link %1$@ is taking you to another site %2$@\n\nAre you sure you want to continue?";
"dialog_confirm_link_title" = "Double-check this link";
"dialog_default_video_quality_selector_subtitle" = "Select the default quality of videos you upload.";
@@ -511,11 +484,6 @@
"error_no_compatible_app_found" = "Не знойдзена сумяшчальная праграма для выканання гэтага дзеяння.";
"error_room_address_already_exists" = "This room address already exists. Please try editing the room address field or change the room name";
"error_room_address_invalid_symbols" = "Some characters are not allowed. Only letters, digits and the following symbols are supported ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _";
"error_sending_failure_invalid_mime_type" = "Invalid mime type: %@";
"error_sending_failure_missing_media_content" = "Missing media content";
"error_sending_failure_other" = "Error details: %@";
"error_sending_failure_sending_from_unverified_device" = "Sending from unverified device";
"error_sending_failure_unknown" = "Unknown error";
"error_some_messages_have_not_been_sent" = "Некаторыя паведамленні не былі адпраўлены";
"error_unknown" = "Выбачце, адбылася памылка";
"error.account_already_logged_in" = "You're already logged in on this device as %1$@.";
@@ -545,8 +513,6 @@
"notification_invitation_action_reject" = "Адхіліць";
"notification_invite_body" = "Запрасіў(-ла) вас у чат";
"notification_invite_body_with_sender" = "%1$@ запрасіў(-ла) вас у чат";
"notification_knock_request_body" = "Requested to join";
"notification_live_location_started_body" = "Started sharing their live location";
"notification_mentioned_you_body" = "Згадаў(-ла) вас: %1$@";
"notification_new_messages" = "Новыя паведамленні";
"notification_reaction_body" = "Адрэагаваў(-ла) на %1$@";
@@ -634,8 +600,8 @@
"screen_advanced_settings_share_presence_description" = "Калі гэта выключана, вы не зможаце адпраўляць або атрымліваць апавяшчэнні аб прачытанні або апавяшчэнні аб наборы тэксту";
"screen_advanced_settings_show_media_timeline_always_hide" = "Always hide";
"screen_advanced_settings_show_media_timeline_always_show" = "Always show";
"screen_advanced_settings_show_media_timeline_private_rooms" = "Show in private rooms";
"screen_advanced_settings_show_media_timeline_subtitle" = "Hidden media can always be shown by tapping on it.";
"screen_advanced_settings_show_media_timeline_private_rooms" = "In private rooms";
"screen_advanced_settings_show_media_timeline_subtitle" = "A hidden media can always be shown by tapping on it";
"screen_advanced_settings_show_media_timeline_title" = "Show media in timeline";
"screen_advanced_settings_view_source_description" = "Уключыце опцыю для прагляду паведамленняў у хроніцы.";
"screen_analytics_prompt_data_usage" = "Мы не будзем запісваць або прафіляваць любыя асабістыя даныя";
@@ -731,22 +697,14 @@
"screen_change_server_error_element_pro_required_title" = "Element Pro required";
"screen_change_server_error_invalid_homeserver" = "Нам не ўдалося звязацца з гэтым хатнім серверам. Упэўніцеся, што вы правільна ўвялі URL-адрас хатняга сервера. Калі URL-адрас пазначаны правільна, звярніцеся да адміністратара хатняга сервера за дадатковай дапамогай.";
"screen_change_server_error_invalid_well_known" = "Sliding sync недаступны з-за праблемы ў вядомым файле:\n%1$@";
"screen_change_server_error_no_sliding_sync_message" = "The selected account provider does not support sliding sync. The server needs to be upgraded to use %1$@.";
"screen_change_server_error_no_sliding_sync_message" = "The selected account provider does not support sliding sync. An upgrade to the server is needed to use %1$@.";
"screen_change_server_error_unauthorized_homeserver" = "%1$@ is not allowed to connect to %2$@.";
"screen_change_server_error_unauthorized_homeserver_content" = "This app has been configured to allow: %1$@.";
"screen_change_server_error_unauthorized_homeserver_title" = "Account provider %1$@ not allowed.";
"screen_change_server_form_header" = "URL хатняга сервера";
"screen_change_server_form_notice" = "Enter a domain address.";
"screen_change_server_navigation_title_login" = "Sign in";
"screen_change_server_navigation_title_register" = "Create account";
"screen_change_server_subtitle" = "Які адрас вашага сервера?";
"screen_change_server_textfield_footer_login" = "If your account is provided by your company or a community, then change the account provider (example: companyname.com).";
"screen_change_server_textfield_footer_register" = "Create an account on matrix.org for free. If you want to create an account with a different provider, then change it accordingly (example: communityname.org).";
"screen_change_server_textfield_header" = "Account provider";
"screen_change_server_textfield_placeholder" = "example.com";
"screen_change_server_title" = "Выберыце свой сервер";
"screen_change_server_title_login" = "Enter your account provider";
"screen_change_server_title_register" = "Choose an account provider";
"screen_chat_backup_key_backup_action_disable" = "Выключыць рэзервовае капіраванне";
"screen_chat_backup_key_backup_action_enable" = "Уключыце рэзервовае капіраванне";
"screen_chat_backup_key_backup_description" = "Надзейна захоўвайце вашу крыптаграфічную ідэнтыфікацыю і ключы паведамленняў на серверы. Гэта дазволіць вам праглядаць гісторыю паведамленняў на любых новых прыладах.%1$@ .";
@@ -793,7 +751,7 @@
"screen_create_room_private_option_description" = "Толькі запрошаныя людзі могуць атрымаць доступ да гэтага пакоя. Усе паведамленні абаронены end-to-end шыфраваннем.";
"screen_create_room_private_option_title" = "Private";
"screen_create_room_public_option_description" = "Любы можа знайсці гэты пакой. \nВы можаце змяніць гэта ў любы час у наладах пакоя.";
"screen_create_room_public_option_short_description" = "Anyone can join, including people outside your organisation.";
"screen_create_room_public_option_short_description" = "Anyone can join.";
"screen_create_room_public_option_title" = "Public";
"screen_create_room_room_access_section_knocking_option_description" = "Anyone can ask to join but an administrator or a moderator must accept the request.";
"screen_create_room_room_access_section_knocking_option_title" = "Папрасіце далучыцца";
@@ -801,7 +759,7 @@
"screen_create_room_room_access_section_knocking_restricted_option_title" = "Ask to join";
"screen_create_room_room_access_section_private_option_description" = "Only people invited can join.";
"screen_create_room_room_access_section_private_option_title" = "Private";
"screen_create_room_room_access_section_public_option_description" = "Anyone can join, including people outside your organisation.";
"screen_create_room_room_access_section_public_option_description" = "Anyone can join.";
"screen_create_room_room_access_section_public_option_title" = "Public";
"screen_create_room_room_access_section_restricted_option_description" = "Anyone in %1$@ can join.";
"screen_create_room_room_access_section_restricted_option_title" = "Standard";
@@ -966,10 +924,6 @@
"screen_knock_requests_list_empty_state_title" = "No pending request to join";
"screen_knock_requests_list_initial_loading_title" = "Loading requests to join…";
"screen_knock_requests_list_title" = "Requests to join";
"screen_labs_enable_gallery" = "Gallery messages";
"screen_labs_enable_gallery_description" = "Send multiple images or videos in one go. Stable on mobile, but not yet supported by web.";
"screen_labs_enable_knocking" = "Ask to join";
"screen_labs_enable_knocking_description" = "Users can request access to a room that is not open for anyone to join. Stable on mobile, web implementation exists but is experimental.";
"screen_labs_enable_threads" = "Enable thread replies";
"screen_labs_enable_threads_description" = "The app will restart to apply this change.";
"screen_labs_header_description" = "Try out our latest ideas in development. These features are not finalised; they may be unstable, may change.";
@@ -978,11 +932,11 @@
"screen_leave_space_choose_owners_action" = "Choose owners";
"screen_leave_space_last_admin_info" = "%1$@ (Admin)";
"screen_leave_space_subtitle" = "Select the rooms you’d like to leave which you're not the only administrator for:";
"screen_leave_space_subtitle_last_admin" = "You need to assign another administrator for this space before you can leave.";
"screen_leave_space_subtitle_last_admin" = "You need to assign another admin for this space before you can leave.";
"screen_leave_space_subtitle_last_owner" = "You are the only owner of %1$@. You need to transfer ownership to someone else before you leave.";
"screen_leave_space_subtitle_only_last_admin" = "You will not be removed from the following room(s) because you're the only administrator:";
"screen_leave_space_title" = "Leave %1$@?";
"screen_leave_space_title_last_admin" = "You are the only administrator for %1$@";
"screen_leave_space_title_last_admin" = "You are the only admin for %1$@";
"screen_leave_space_title_last_owner" = "Transfer ownership";
"screen_link_new_device_authentication_reason_ios" = "Confirm it's you before linking a new device.";
"screen_link_new_device_desktop_scanning_title" = "Сканіраваць QR-код";
@@ -990,7 +944,6 @@
"screen_link_new_device_desktop_step3" = "Адсканіруйце QR-код з дапамогай гэтай прылады";
"screen_link_new_device_desktop_submit" = "Гатовы да сканіравання";
"screen_link_new_device_desktop_title" = "Open %1$@ on a desktop computer to get the QR code";
"screen_link_new_device_desktop_warning" = "Only scan a QR code after following the steps above on your own device. Never scan a code sent by another person.";
"screen_link_new_device_enter_number_error_numbers_do_not_match" = "The numbers don’t match";
"screen_link_new_device_enter_number_notice" = "Enter 2-digit code";
"screen_link_new_device_enter_number_subtitle" = "This will verify that the connection to your other device is secure.";
@@ -1017,8 +970,6 @@
"screen_live_location_sheet_nobody_sharing" = "Nobody is sharing their location";
"screen_live_location_sheet_sharing_live_location" = "Sharing live location";
"screen_live_location_sheet_title" = "On the map";
"screen_local_network_opt_in_subtitle" = "Your homeserver is on your local network. To connect, %1$@ needs permission to reach devices on this network.";
"screen_local_network_opt_in_title" = "Allow access to local network";
"screen_login_error_deactivated_account" = "Гэты ўліковы запіс быў выдалены.";
"screen_login_error_invalid_credentials" = "Няправільнае імя карыстальніка і/або пароль";
"screen_login_error_invalid_user_id" = "Гэта несапраўдны ідэнтыфікатар карыстальніка. Чаканы фармат: ‘@user:homeserver.org’";
@@ -1069,16 +1020,10 @@
"screen_missing_key_backup_open_element_classic" = "Open Element Classic";
"screen_missing_key_backup_step_1" = "Open Element Classic on your device";
"screen_missing_key_backup_step_2_ios" = "Go to User settings > Security";
"screen_missing_key_backup_step_3_ios" = "Scroll down to Chat Backup and tap on Set up";
"screen_missing_key_backup_step_3_ios" = "Scroll down to Secure Backup and tap on Set up";
"screen_missing_key_backup_step_4" = "Follow the instructions to enable your key storage";
"screen_missing_key_backup_step_5" = "Come back to %1$@";
"screen_missing_key_backup_title" = "Enable your key storage before proceeding to %1$@";
"screen_moderation_and_safety_invites_heading" = "Invites";
"screen_moderation_and_safety_other_users_heading" = "Other users";
"screen_moderation_and_safety_share_presence_heading" = "Your appearance";
"screen_multi_account_announcement_action" = "Add account";
"screen_multi_account_announcement_description" = "Go to %1$@ to sign into another account. Then you can easily switch between them.";
"screen_multi_account_announcement_title" = "You can now add multiple accounts";
"screen_notification_optin_subtitle" = "Вы можаце змяніць налады пазней.";
"screen_notification_optin_title" = "Дазвольце апавяшчэнні і ніколі не прапускайце іх";
"screen_notification_settings_additional_settings_section_title" = "Дадатковыя налады";
@@ -1107,8 +1052,6 @@
"screen_notification_settings_mode_mentions" = "Згадванні";
"screen_notification_settings_notification_section_title" = "Апавясціць мяне";
"screen_notification_settings_room_mention_label" = "Апавясціць пра @room";
"screen_notification_settings_show_all_activity_subtitle" = "Dots or number of unread messages";
"screen_notification_settings_show_all_activity_title" = "Show all activity in the room list";
"screen_notification_settings_sound_custom_fallback" = "Custom";
"screen_notification_settings_sound_custom_sound_button_title" = "Custom sound...";
"screen_notification_settings_sound_delete_sound_error_title" = "Error deleting file";
@@ -1169,14 +1112,6 @@
"screen_polls_history_filter_ongoing" = "Бягучыя";
"screen_polls_history_filter_past" = "Мінулыя";
"screen_polls_history_title" = "Апытанні";
"screen_ptt_settings_battery_optimization" = "Ignore battery optimisation";
"screen_ptt_settings_battery_optimization_description" = "Stay active in background";
"screen_ptt_settings_covert_mode" = "Covert mode";
"screen_ptt_settings_covert_mode_description" = "Mute all channels";
"screen_ptt_settings_lock_screen" = "Show on lock screen";
"screen_ptt_settings_lock_screen_description" = "Access from the lock screen";
"screen_ptt_settings_system_overlay" = "Enable system overlay";
"screen_ptt_settings_system_overlay_description" = "Access a floating action button";
"screen_push_history_title" = "Push history";
"screen_qr_code_login_connecting_subtitle" = "Ўсталяванне бяспечнага злучэння";
"screen_qr_code_login_connection_note_secure_state_description" = "Не атрымалася ўсталяваць бяспечнае злучэнне з новай прыладай. Існуючыя прылады па-ранейшаму ў бяспецы, і вам не трэба турбавацца пра іх.";
@@ -1254,7 +1189,7 @@
"screen_report_content_hint" = "Прычына, па якой вы паскардзіліся на гэты змест";
"screen_report_room_leave_failed_alert_message" = "Your report was submitted successfully, but we encountered an issue while trying to leave the room. Please try again.";
"screen_report_room_leave_failed_alert_title" = "Unable to Leave Room";
"screen_report_room_reason_footer" = "Report this chat to your account provider. If the messages are encrypted, your account provider will not be able to read them.";
"screen_report_room_reason_footer" = "Report this room to your admin. If the messages are encrypted, your admin will not be able to read them.";
"screen_report_room_reason_placeholder" = "Describe the reason to report…";
"screen_report_room_title" = "Report room";
"screen_reset_encryption_confirmation_alert_action" = "Так, скінуць зараз";
@@ -1321,14 +1256,7 @@
"screen_room_change_role_section_users" = "Удзельнікі";
"screen_room_change_role_unsaved_changes_description" = "У вас ёсць незахаваныя змены.";
"screen_room_change_role_unsaved_changes_title" = "Захаваць змены?";
"screen_room_confirm_removal_reason_label" = "Reason (optional)";
"screen_room_confirm_removal_reason_placeholder" = "Enter reason…";
"screen_room_confirm_removal_reason_supporting_text" = "(Optional)";
"screen_room_confirm_removal_title" = "Remove message?";
"screen_room_details_add_topic_title" = "Дадаць тэму";
"screen_room_details_audio_push_to_talk" = "Push to talk";
"screen_room_details_audio_title" = "Room Audio";
"screen_room_details_audio_video_calls" = "Video calls";
"screen_room_details_badge_encrypted" = "Зашыфраваны";
"screen_room_details_badge_not_encrypted" = "Не зашыфраваны";
"screen_room_details_badge_public" = "Публічны пакой";
@@ -1354,9 +1282,6 @@
"screen_room_details_profile_row_title" = "Профіль";
"screen_room_details_requests_to_join_title" = "Requests to join";
"screen_room_details_roles_and_permissions" = "Ролі і дазволы";
"screen_room_details_room_audio_ptt" = "Push to talk";
"screen_room_details_room_audio_title" = "Room Audio";
"screen_room_details_room_audio_video_calls" = "Video calls";
"screen_room_details_room_name_label" = "Імя";
"screen_room_details_security_and_privacy_title" = "Security & privacy";
"screen_room_details_security_title" = "Бяспека";
@@ -1376,7 +1301,6 @@
"screen_room_invite_again_alert_message" = "Вы хочаце запрасіць іх назад?";
"screen_room_invite_again_alert_title" = "Вы адзін у гэтым чаце";
"screen_room_live_location_banner" = "Sharing live location";
"screen_room_maximum_messages_selected" = "Maximum messages selected";
"screen_room_member_details_block_alert_action" = "Заблакіраваць";
"screen_room_member_details_block_alert_description" = "Заблакіраваныя карыстальнікі не змогуць адпраўляць вам паведамленні, і ўсе іх паведамленні будуць схаваны. Вы можаце разблакіраваць іх у любы час.";
"screen_room_member_details_block_user" = "Заблакіраваць карыстальніка";
@@ -1417,8 +1341,7 @@
"screen_room_notification_settings_error_setting_mode" = "Не ўдалося наладзіць рэжым, паспрабуйце яшчэ раз.";
"screen_room_notification_settings_mentions_only_disclaimer" = "Ваш хатні сервер не падтрымлівае гэту опцыю ў зашыфраваных пакоях, вы не атрымаеце апавяшчэнне ў гэтым пакоі.";
"screen_room_notification_settings_mode_all_messages" = "Усе паведамленні";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Mentions and replies only";
"screen_room_notification_settings_mode_mute" = "Mute";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Толькі згадванні і ключавыя словы";
"screen_room_notification_settings_room_custom_settings_title" = "У гэтым пакоі паведаміце мяне пра";
"screen_room_pinned_banner_indicator" = "%1$@ з %2$@";
"screen_room_pinned_banner_indicator_description" = "%1$@ Замацаваныя паведамленні";
@@ -1443,7 +1366,6 @@
"screen_room_roles_and_permissions_room_details" = "Дэталі пакоя";
"screen_room_roles_and_permissions_space_details" = "Space details";
"screen_room_roles_and_permissions_title" = "Ролі і дазволы";
"screen_room_select_error_cannot_load_rooms" = "The room list associated with this account cannot be loaded.";
"screen_room_single_knock_request_accept_button_title" = "Прыняць";
"screen_room_single_knock_request_title" = "%1$@ wants to join this room";
"screen_room_single_knock_request_view_button_title" = "View";
@@ -1480,8 +1402,6 @@
"screen_roomlist_filter_invites_empty_state_title" = "У вас няма непрынятых запрашэнняў.";
"screen_roomlist_filter_low_priority" = "Нізкі прыярытэт";
"screen_roomlist_filter_low_priority_empty_state_title" = "You don’t have any low priority chats yet";
"screen_roomlist_filter_mention" = "Mention";
"screen_roomlist_filter_mention_empty_state_title" = "You don’t have any unread mentions";
"screen_roomlist_filter_mixed_empty_state_subtitle" = "Вы можаце прыбраць фільтры, каб убачыць іншыя вашыя чаты.";
"screen_roomlist_filter_mixed_empty_state_title" = "У вас няма чатаў для гэтай катэгорыі";
"screen_roomlist_filter_people" = "Людзі";
@@ -1507,7 +1427,7 @@
"screen_security_and_privacy_encryption_section_footer" = "Once enabled, encryption cannot be disabled.";
"screen_security_and_privacy_encryption_section_header" = "Encryption";
"screen_security_and_privacy_encryption_toggle_title" = "Enable end-to-end encryption";
"screen_security_and_privacy_room_access_anyone_option_description" = "Anyone can join, including people outside your organisation.";
"screen_security_and_privacy_room_access_anyone_option_description" = "Anyone can join.";
"screen_security_and_privacy_room_access_anyone_option_title" = "Anyone";
"screen_security_and_privacy_room_access_footer" = "Choose which spaces’ members can join this room without an invitation. %1$@";
"screen_security_and_privacy_room_access_footer_manage_spaces_action" = "Manage spaces";
@@ -1568,13 +1488,10 @@
"screen_session_verification_request_title" = "Verification requested";
"screen_session_verification_they_dont_match" = "Яны не супадаюць";
"screen_session_verification_they_match" = "Яны супадаюць";
"screen_session_verification_unavailable_subtitle" = "Please use another device or recovery key.";
"screen_session_verification_unavailable_title" = "Verification with this device is currently unavailable";
"screen_session_verification_use_another_device_subtitle" = "Make sure you have the app open in the other device before starting verification from here.";
"screen_session_verification_use_another_device_title" = "Open the app on another verified device";
"screen_session_verification_user_initiator_subtitle" = "For extra security, verify this user by comparing a set of emojis on your devices. Do this by using a trusted way to communicate.";
"screen_session_verification_user_initiator_title" = "Verify this user?";
"screen_session_verification_user_requesting_verification" = "User requesting verification:";
"screen_session_verification_user_responder_subtitle" = "For extra security, another user wants to verify your digital identity. You’ll be shown a set of emojis to compare.";
"screen_session_verification_waiting_another_device_subtitle" = "You should see a popup on the other device. Start the verification from there now.";
"screen_session_verification_waiting_another_device_title" = "Start verification on the other device";
@@ -1583,15 +1500,6 @@
"screen_session_verification_waiting_subtitle" = "Once accepted you’ll be able to continue with the verification.";
"screen_session_verification_waiting_to_accept_subtitle" = "Для працягу працы прыміце запыт на запуск працэсу праверкі ў іншым сеансе.";
"screen_session_verification_waiting_to_accept_title" = "Чаканне прыняцця запыту";
"screen_settings_add_account" = "Add account";
"screen_settings_user_status_away" = "Away";
"screen_settings_user_status_be_right_back" = "Be right back";
"screen_settings_user_status_custom" = "Custom…";
"screen_settings_user_status_custom_hint" = "Custom status…";
"screen_settings_user_status_focus_time" = "Focus time";
"screen_settings_user_status_in_a_meeting" = "In a meeting";
"screen_settings_user_status_on_the_road" = "On the road";
"screen_settings_user_status_placeholder" = "What's your status?";
"screen_share_location_live_location_disclaimer_title" = "Your live location history will be stored in the room and visible to members after the session ends.";
"screen_share_location_live_location_duration_picker_title" = "Choose how long to share your live location.";
"screen_share_location_live_location_missing_permissions" = "You do not have permissions to share your live location in this room";
@@ -1606,7 +1514,6 @@
"screen_signed_out_reason_2" = "Вы выдалілі сеанс з іншага сеансу";
"screen_signed_out_reason_3" = "Адміністратар вашага сервера ануляваў ваш доступ";
"screen_signed_out_subtitle" = "Магчыма, вы выйшлі з сістэмы па адной з прычын, пералічаных ніжэй. Калі ласка, увайдзіце яшчэ раз, каб працягнуць выкарыстанне %@.";
"screen_signed_out_subtitle_v2" = "This device was removed for one of the reasons listed below. Please sign in again to connect this device to your account.";
"screen_signed_out_title" = "Вы выйшлі з сістэмы";
"screen_signout_confirmation_dialog_content" = "Вы ўпэўненыя, што хочаце выдаліць гэту прыладу?";
"screen_signout_confirmation_dialog_submit" = "Выйсці";
@@ -1632,7 +1539,7 @@
"screen_space_list_parent_space" = "%1$@ space";
"screen_space_list_title" = "Прасторы";
"screen_space_menu_action_members" = "View members";
"screen_space_remove_rooms_confirmation_content" = "Removing a room will not affect the room access. To change the access go to Room info > Security & privacy.";
"screen_space_remove_rooms_confirmation_content" = "Removing a room will not affect the room access. To change the access go to Room info > Privacy & security.";
"screen_space_remove_rooms_confirmation_title_ios" = "Remove rooms from %1$@?";
"screen_space_settings_leave_space" = "Пакінуць прастору";
"screen_space_settings_roles_and_permissions" = "Ролі і дазволы";
@@ -1783,7 +1690,6 @@
"troubleshoot_notifications_test_push_loop_back_failure_2" = "Памылка: %1$@.";
"troubleshoot_notifications_test_push_loop_back_failure_3" = "Памылка, немагчыма праверыць push-апавяшчэнне.";
"troubleshoot_notifications_test_push_loop_back_failure_4" = "Памылка, тайм-аўт у чаканні push-апавяшчэння.";
"troubleshoot_notifications_test_push_loop_back_failure_rate_limit" = "Error: the push gateway is rate limiting this device, so notifications won't be reliable. Please set up a different push gateway.";
"troubleshoot_notifications_test_push_loop_back_success" = "Зварот цыклу назад заняў %1$d мс.";
"troubleshoot_notifications_test_push_loop_back_title" = "Тэст Націсніце кнопку вярнуцца";
"troubleshoot_notifications_test_unified_push_description" = "Пераканайцеся, што размеркавальнікі UnifiedPush даступныя.";
@@ -20,22 +20,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_gallery_more_media</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Gallery, %1$d more media</string>
<key>other</key>
<string>Gallery, %1$d more medias</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_polls_percent_of_total</key>
<dict>
<key>COUNT</key>
@@ -70,54 +54,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>action_forward_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Forward %1$d message</string>
<key>other</key>
<string>Forward %1$d messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_attachments</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d attachment…</string>
<key>other</key>
<string>%1$d attachments…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_media_items</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d media item…</string>
<key>other</key>
<string>%1$d media items…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_many_members</key>
<dict>
<key>COUNT</key>
@@ -288,22 +224,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_gallery_body</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Shared %1$d attachment</string>
<key>other</key>
<string>Shared %1$d attachments</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_invitations</key>
<dict>
<key>COUNT</key>
@@ -376,22 +296,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen.room.timeline_redacted_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d removed message</string>
<key>other</key>
<string>%1$d removed messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_advanced_settings_live_location_update_distance</key>
<dict>
<key>COUNT</key>
@@ -576,22 +480,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_messages_forwarded</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message forwarded</string>
<key>other</key>
<string>%1$d messages forwarded</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_multiple_knock_requests_title</key>
<dict>
<key>COUNT</key>
@@ -608,22 +496,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_selection_count</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message selected</string>
<key>other</key>
<string>%1$d messages selected</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_timeline_reaction_a11y</key>
<dict>
<key>COUNT</key>
@@ -726,7 +598,7 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_timeline_active_call_joined_count</key>
<key>screen_timeline_active_call_extra_joined_count</key>
<dict>
<key>COUNT</key>
<dict>
@@ -735,9 +607,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
<key>other</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
@@ -1,6 +1,6 @@
"NSCameraUsageDescription" = "За да правите снимки или видеа и да ги изпращате като съобщение, Element X се нуждае от достъп до камерата.";
"NSFaceIDUsageDescription" = "Face ID is used to protect access to your account.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "To share your location live in chats, location access is needed when the app is in the background.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "To share your live location, Element X needs location access when the app is in the background.";
"NSLocationWhenInUseUsageDescription" = "Предоставете достъп до местоположението, за да може Element X да споделя местоположението ви.";
"NSMicrophoneUsageDescription" = "За да записвате и изпращате съобщения с аудио, Element X се нуждае от достъп до микрофона.";
"NSPhotoLibraryUsageDescription" = "This lets you save images and videos to your photo library.";
@@ -6,23 +6,16 @@
"a11y_collapse_message_text_field" = "Minimise message text field";
"a11y_create_poll_votes_allowed_decrease" = "Decrease votes allowed per person";
"a11y_create_poll_votes_allowed_increase" = "Increase votes allowed per person";
"a11y_custom_emoji" = "Custom emoji";
"a11y_delete" = "Изтриване";
"a11y_duration" = "Duration: %1$@";
"a11y_edit_avatar" = "Edit avatar";
"a11y_edit_room_address_hint" = "Пълният адрес ще бъде %1$@";
"a11y_expand_message_text_field" = "Expand message text field";
"a11y_gallery_attachment" = "Gallery, attachment %1$d";
"a11y_gallery_failed_scan" = "Gallery, failed scan %1$d";
"a11y_gallery_image" = "Gallery, image %1$d";
"a11y_gallery_scanning" = "Gallery, scanning %1$d";
"a11y_gallery_video" = "Gallery, video %1$d";
"a11y_hide_password" = "Скриване на паролата";
"a11y_info" = "Info";
"a11y_join_call" = "Присъединяване към обаждане";
"a11y_jump_to_bottom" = "Скок към най-долу";
"a11y_jump_to_unread" = "Jump to unread";
"a11y_jump_to_unread_messages" = "Jump to first unread message";
"a11y_notifications_mentions_only" = "Само споменавания";
"a11y_notifications_muted" = "Заглушено";
"a11y_notifications_new_mentions" = "Нови споменавания";
@@ -57,7 +50,6 @@
"a11y_start_call" = "Започнете обаждане";
"a11y_start_video_call" = "Start a video call";
"a11y_start_voice_call" = "Start a voice call";
"a11y_status" = "Status";
"a11y_tombstoned_room" = "Tombstoned room";
"a11y_user_menu" = "Потребителско меню";
"a11y_video_preview" = "Video preview";
@@ -86,7 +78,6 @@
"action_choose_file" = "Choose file";
"action_choose_photo" = "Избор на снимка";
"action_clear" = "Изчистване";
"action_clear_all" = "Clear all";
"action_close" = "Затваряне";
"action_complete_verification" = "Завършване на потвърждаването";
"action_confirm" = "Потвърждаване";
@@ -97,7 +88,6 @@
"action_copy_link" = "Копиране на връзката";
"action_copy_link_to_message" = "Копиране на връзката към съобщението";
"action_copy_text" = "Копиране на текста";
"action_copy_to_clipboard" = "Copy to clipboard";
"action_create" = "Създаване";
"action_create_room" = "Създаване на стая";
"action_create_space" = "Create space";
@@ -145,7 +135,6 @@
"action_manage_account_and_devices" = "Manage account & devices";
"action_manage_devices" = "Управление на устройствата";
"action_manage_rooms" = "Manage rooms";
"action_mark_as_read" = "Mark as read";
"action_message" = "Съобщение";
"action_minimize" = "Minimise";
"action_next" = "Напред";
@@ -210,7 +199,7 @@
"banner_migrate_to_native_sliding_sync_action" = "Log Out & Upgrade";
"banner_migrate_to_native_sliding_sync_app_force_logout_title" = "%1$@ no longer supports the old protocol. Please log out and log back in to continue using the app.";
"banner_migrate_to_native_sliding_sync_description" = "Your server now supports a new, faster protocol. Log out and log back in to upgrade now. Doing this now will help you avoid a forced logout when the old protocol is removed later.";
"banner_migrate_to_native_sliding_sync_force_logout_title" = "Your account provider no longer supports the old protocol. Please sign out and sign back in to continue using the app.";
"banner_migrate_to_native_sliding_sync_force_logout_title" = "Your homeserver no longer supports the old protocol. Please log out and log back in to continue using the app.";
"banner_migrate_to_native_sliding_sync_title" = "Upgrade available";
"banner_new_sound_message" = "Your notification ping has been updated—clearer, quicker, and less disruptive.";
"banner_new_sound_title" = "We’ve refreshed your sounds";
@@ -220,7 +209,6 @@
"call_invalid_audio_device_bluetooth_devices_disabled" = "Element Call does not support using Bluetooth audio devices in this Android version. Please select a different audio device.";
"common_about" = "Относно";
"common_acceptable_use_policy" = "Политика за приемлива употреба";
"common_account_settings" = "Account settings";
"common_add_account" = "Добавяне на акаунт";
"common_add_another_account" = "Добавяне на друг акаунт";
"common_adding_caption" = "Adding caption";
@@ -229,7 +217,6 @@
"common_analytics" = "Статистика";
"common_android_shortcuts_remove_reason_left_room" = "Вие напуснахте стаята";
"common_android_shortcuts_remove_reason_session_logged_out" = "You were logged out of the session";
"common_app_settings" = "App settings";
"common_appearance" = "Облик";
"common_audio" = "Аудио";
"common_beta" = "Beta";
@@ -240,8 +227,6 @@
"common_call_started" = "Започнато обаждане";
"common_call_you_declined" = "You declined a call";
"common_chat_backup" = "Резервно копие на чатовете";
"common_chats" = "Chats";
"common_code_block" = "Code block";
"common_copied_to_clipboard" = "Copied to clipboard";
"common_copyright" = "Авторски права";
"common_creating_room" = "Създаване на стая…";
@@ -279,12 +264,10 @@
"common_file_deleted" = "Файлът е изтрит";
"common_file_saved" = "Файлът е запазен";
"common_forward_message" = "Препращане на съобщението";
"common_forward_to" = "Forward to";
"common_frequently_used" = "Frequently used";
"common_gallery" = "Gallery";
"common_gif" = "GIF";
"common_group_call_in_progress" = "Group call in progress";
"common_header_rooms" = "Rooms";
"common_image" = "Изображение";
"common_in_reply_to" = "В отговор на %1$@";
"common_invite_unknown_profile" = "Този Matrix ID не може да бъде намерен, така че поканата може да не бъде получена.";
@@ -297,25 +280,20 @@
"common_live_location_ended" = "Live location ended";
"common_loading" = "Зарежда се…";
"common_loading_more" = "Зарежда се още…";
"common_location_sharing" = "Location sharing";
"common_media_upload_quality" = "Media upload quality";
"common_message" = "Съобщение";
"common_message_actions" = "Message actions";
"common_message_failed_to_send" = "Message failed to send";
"common_message_layout" = "Оформление на съобщенията";
"common_message_removed" = "Съобщението е премахнато";
"common_moderation_and_safety" = "Moderation & safety";
"common_modern" = "Модерно";
"common_mute" = "Заглушаване";
"common_name" = "Name";
"common_name_and_id" = "%1$@ (%2$@)";
"common_no_results" = "Няма резултати";
"common_no_results_for" = "There are no results for “%1$@”. Try a new search term.";
"common_no_room_name" = "Няма име на стая";
"common_no_space_name" = "Няма име на пространство";
"common_not_encrypted" = "Без шифроване";
"common_offline" = "Офлайн";
"common_on_a_call" = "On a call";
"common_open_source_licenses" = "Лицензи за отворен код";
"common_optic_id_ios" = "Optic ID";
"common_or" = "или";
@@ -349,7 +327,6 @@
"common_replying_to" = "В отговор на %1$@";
"common_report_a_problem" = "Съобщаване за проблем";
"common_report_submitted" = "Докладът е изпратен";
"common_results_for" = "Results for “%1$@”";
"common_rich_text_editor" = "Редактор на богат текст";
"common_role" = "Role";
"common_room" = "Стая";
@@ -377,7 +354,6 @@
"common_shared_live_location" = "Shared live location";
"common_shared_location" = "Споделено местоположение";
"common_shared_space" = "Shared space";
"common_signed_in" = "Signed in";
"common_signing_out" = "Излизате";
"common_something_went_wrong" = "Нещо се обърка";
"common_something_went_wrong_message" = "Възникна проблем. Моля, опитайте отново.";
@@ -389,7 +365,6 @@
"common_success" = "Успешно";
"common_suggested" = "Suggested";
"common_suggestions" = "Предложения";
"common_switch_accounts" = "Switch accounts";
"common_syncing" = "Синхронизиране";
"common_text" = "Текст";
"common_third_party_notices" = "Уведомления от трети страни";
@@ -430,14 +405,12 @@
"common_waiting_live_location" = "Waiting for live location…";
"common_world_readable_history" = "Anyone can see history";
"common_you" = "Вие";
"common_your_account" = "Your account";
"confirm_recovery_key_banner_message" = "Потвърдете ключа си за възстановяване, за да запазите достъп до хранилището за ключове и историята на съобщенията си.";
"confirm_recovery_key_banner_primary_button_title" = "Въведете ключа си за възстановяване";
"confirm_recovery_key_banner_secondary_button_title" = "Forgot your recovery key?";
"confirm_recovery_key_banner_title" = "Хранилището ви за ключове не е синхронизирано";
"content_scanner_not_found" = "Download not available.";
"content_scanner_not_found_title" = "Something went wrong";
"content_scanner_scanning" = "Scanning…";
"content_scanner_not_found_title" = "File not found";
"content_scanner_unsafe_message" = "Preview and download have been disabled.";
"content_scanner_unsafe_title" = "The file is not safe";
"crash_detection_dialog_content" = "%1$@ се срина при последното използване. Искате ли да споделите доклад за срива с нас?";
@@ -499,7 +472,7 @@
"emoji_picker_category_recent" = "Recent emojis";
"emoji_picker_category_symbols" = "Символи";
"emoji_picker_search_placeholder" = "Search emojis";
"error_account_creation_not_possible" = "Your account provider needs to be upgraded to support Matrix Authentication Service and account creation.";
"error_account_creation_not_possible" = "Your homeserver needs to be upgraded to support Matrix Authentication Service and account creation.";
"error_failed_creating_the_permalink" = "Неуспешно създаване на постоянна връзка";
"error_failed_loading_map" = "%1$@ не успя да зареди картата. Моля, опитайте отново по-късно.";
"error_failed_loading_messages" = "Неуспешно зареждане на съобщения";
@@ -511,11 +484,6 @@
"error_no_compatible_app_found" = "No compatible app was found to handle this action.";
"error_room_address_already_exists" = "This room address already exists. Please try editing the room address field or change the room name";
"error_room_address_invalid_symbols" = "Some characters are not allowed. Only letters, digits and the following symbols are supported ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _";
"error_sending_failure_invalid_mime_type" = "Invalid mime type: %@";
"error_sending_failure_missing_media_content" = "Missing media content";
"error_sending_failure_other" = "Error details: %@";
"error_sending_failure_sending_from_unverified_device" = "Sending from unverified device";
"error_sending_failure_unknown" = "Unknown error";
"error_some_messages_have_not_been_sent" = "Някои съобщения не са изпратени";
"error_unknown" = "Съжаляваме, възникна грешка";
"error.account_already_logged_in" = "You're already logged in on this device as %1$@.";
@@ -545,8 +513,6 @@
"notification_invitation_action_reject" = "Reject";
"notification_invite_body" = "Поканиха ви за чат";
"notification_invite_body_with_sender" = "%1$@ invited you to chat";
"notification_knock_request_body" = "Requested to join";
"notification_live_location_started_body" = "Started sharing their live location";
"notification_mentioned_you_body" = "Ви спомена: %1$@";
"notification_new_messages" = "Нови съобщения";
"notification_reaction_body" = "Реагира с %1$@";
@@ -731,22 +697,14 @@
"screen_change_server_error_element_pro_required_title" = "Element Pro required";
"screen_change_server_error_invalid_homeserver" = "Не можахме да достигнем този сървър. Моля, проверете дали сте въвели правилно URL адреса на сървъра. Ако URL адресът е правилен, свържете се с администратора на вашия сървър за допълнителна помощ.";
"screen_change_server_error_invalid_well_known" = "Server isn't available due to an issue in the .well-known file:\n%1$@";
"screen_change_server_error_no_sliding_sync_message" = "The selected account provider does not support sliding sync. The server needs to be upgraded to use %1$@.";
"screen_change_server_error_no_sliding_sync_message" = "The selected account provider does not support sliding sync. An upgrade to the server is needed to use %1$@.";
"screen_change_server_error_unauthorized_homeserver" = "%1$@ is not allowed to connect to %2$@.";
"screen_change_server_error_unauthorized_homeserver_content" = "This app has been configured to allow: %1$@.";
"screen_change_server_error_unauthorized_homeserver_title" = "Account provider %1$@ not allowed.";
"screen_change_server_form_header" = "URL адрес на сървъра";
"screen_change_server_form_notice" = "Enter a domain address.";
"screen_change_server_navigation_title_login" = "Sign in";
"screen_change_server_navigation_title_register" = "Create account";
"screen_change_server_subtitle" = "Какъв е адресът на вашия сървър?";
"screen_change_server_textfield_footer_login" = "If your account is provided by your company or a community, then change the account provider (example: companyname.com).";
"screen_change_server_textfield_footer_register" = "Create an account on matrix.org for free. If you want to create an account with a different provider, then change it accordingly (example: communityname.org).";
"screen_change_server_textfield_header" = "Account provider";
"screen_change_server_textfield_placeholder" = "example.com";
"screen_change_server_title" = "Изберете своя сървър";
"screen_change_server_title_login" = "Enter your account provider";
"screen_change_server_title_register" = "Choose an account provider";
"screen_chat_backup_key_backup_action_disable" = "Изтриване на хранилището за ключове";
"screen_chat_backup_key_backup_action_enable" = "Включване на резервните копия";
"screen_chat_backup_key_backup_description" = "Съхранявайте сигурно криптографската си самоличност и ключовете за съобщения на сървъра. Това ще ви позволи да преглеждате историята на съобщенията си на всички нови устройства.%1$@ .";
@@ -761,7 +719,7 @@
"screen_chat_backup_recovery_action_setup" = "Get recovery key";
"screen_chat_backup_recovery_action_setup_description" = "Your chats are automatically backed up with end-to-end encryption. To restore this backup and retain your digital identity when you lose access to all your devices, you will need your recovery key.";
"screen_create_account_title" = "Създаване на акаунт";
"screen_create_new_recovery_key_list_item_1" = "Open %1$@ on a desktop device";
"screen_create_new_recovery_key_list_item_1" = "Open %1$@ in a desktop device";
"screen_create_new_recovery_key_list_item_2" = "Sign into your account again";
"screen_create_new_recovery_key_list_item_3" = "When asked to verify your device, select %1$@";
"screen_create_new_recovery_key_list_item_3_reset_all" = "“Reset all”";
@@ -793,7 +751,7 @@
"screen_create_room_private_option_description" = "Само поканени хора имат достъп до тази стая. Всички съобщения са шифровани от край до край.";
"screen_create_room_private_option_title" = "Private";
"screen_create_room_public_option_description" = "Всеки може да намери тази стая.\nМожете да промените това по всяко време в настройките на стаята.";
"screen_create_room_public_option_short_description" = "Anyone can join, including people outside your organisation.";
"screen_create_room_public_option_short_description" = "Anyone can join.";
"screen_create_room_public_option_title" = "Public";
"screen_create_room_room_access_section_knocking_option_description" = "Anyone can ask to join but an administrator or a moderator must accept the request.";
"screen_create_room_room_access_section_knocking_option_title" = "Allow ask to join";
@@ -865,10 +823,10 @@
"screen_edit_profile_updating_details" = "Обновяване на профила…";
"screen_edit_room_address_room_address_section_footer" = "You’ll need an address in order to make it visible in the public directory.";
"screen_edit_room_address_title" = "Edit address";
"screen_encryption_reset_action_continue_reset" = "Continue";
"screen_encryption_reset_action_continue_reset" = "Continue reset";
"screen_encryption_reset_bullet_1" = "Your account details, contacts, preferences, and chat list will be kept";
"screen_encryption_reset_bullet_2" = "You will lose any message history that’s stored only on the server";
"screen_encryption_reset_bullet_3" = "Other users will see that your digital identity has been reset";
"screen_encryption_reset_bullet_3" = "You will need to verify all your existing devices and contacts again";
"screen_encryption_reset_footer" = "Only reset your digital identity if you don't have access to another verified device and you don't have your recovery key.";
"screen_encryption_reset_title" = "Can't confirm? You’ll need to reset your digital identity.";
"screen_home_tab_chats" = "Всички чатове";
@@ -930,7 +888,7 @@
"screen_join_room_loading_alert_title" = "We couldn’t display this room preview";
"screen_join_room_space_not_supported_description" = "%1$@ does not support spaces yet. You can access spaces on web.";
"screen_join_room_space_not_supported_title" = "Spaces are not supported yet";
"screen_join_room_subtitle_knock" = "Tap the button below and a chat administrator will be notified. You'll be able to join the conversation once approved.";
"screen_join_room_subtitle_knock" = "Click the button below and a room administrator will be notified. You’ll be able to join the conversation once approved.";
"screen_join_room_subtitle_no_preview" = "You must be a member of this room to view the message history.";
"screen_join_room_title_knock" = "Want to join this room?";
"screen_join_room_title_no_preview" = "Preview is not available";
@@ -966,10 +924,6 @@
"screen_knock_requests_list_empty_state_title" = "No pending request to join";
"screen_knock_requests_list_initial_loading_title" = "Loading requests to join…";
"screen_knock_requests_list_title" = "Requests to join";
"screen_labs_enable_gallery" = "Gallery messages";
"screen_labs_enable_gallery_description" = "Send multiple images or videos in one go. Stable on mobile, but not yet supported by web.";
"screen_labs_enable_knocking" = "Ask to join";
"screen_labs_enable_knocking_description" = "Users can request access to a room that is not open for anyone to join. Stable on mobile, web implementation exists but is experimental.";
"screen_labs_enable_threads" = "Включване на отговори в нишка";
"screen_labs_enable_threads_description" = "The app will restart to apply this change.";
"screen_labs_header_description" = "Try out our latest ideas in development. These features are not finalised; they may be unstable, may change.";
@@ -978,11 +932,11 @@
"screen_leave_space_choose_owners_action" = "Choose owners";
"screen_leave_space_last_admin_info" = "%1$@ (Admin)";
"screen_leave_space_subtitle" = "Select the rooms you’d like to leave which you're not the only administrator for:";
"screen_leave_space_subtitle_last_admin" = "You need to assign another administrator for this space before you can leave.";
"screen_leave_space_subtitle_last_admin" = "You need to assign another admin for this space before you can leave.";
"screen_leave_space_subtitle_last_owner" = "You are the only owner of %1$@. You need to transfer ownership to someone else before you leave.";
"screen_leave_space_subtitle_only_last_admin" = "You will not be removed from the following room(s) because you're the only administrator:";
"screen_leave_space_title" = "Leave %1$@?";
"screen_leave_space_title_last_admin" = "You are the only administrator for %1$@";
"screen_leave_space_title_last_admin" = "You are the only admin for %1$@";
"screen_leave_space_title_last_owner" = "Transfer ownership";
"screen_link_new_device_authentication_reason_ios" = "Confirm it's you before linking a new device.";
"screen_link_new_device_desktop_scanning_title" = "Scan the QR code";
@@ -990,7 +944,6 @@
"screen_link_new_device_desktop_step3" = "Scan the QR code with this device";
"screen_link_new_device_desktop_submit" = "Ready to scan";
"screen_link_new_device_desktop_title" = "Open %1$@ on a desktop computer to get the QR code";
"screen_link_new_device_desktop_warning" = "Only scan a QR code after following the steps above on your own device. Never scan a code sent by another person.";
"screen_link_new_device_enter_number_error_numbers_do_not_match" = "The numbers don’t match";
"screen_link_new_device_enter_number_notice" = "Enter 2-digit code";
"screen_link_new_device_enter_number_subtitle" = "This will verify that the connection to your other device is secure.";
@@ -1017,8 +970,6 @@
"screen_live_location_sheet_nobody_sharing" = "Nobody is sharing their location";
"screen_live_location_sheet_sharing_live_location" = "Sharing live location";
"screen_live_location_sheet_title" = "On the map";
"screen_local_network_opt_in_subtitle" = "Your homeserver is on your local network. To connect, %1$@ needs permission to reach devices on this network.";
"screen_local_network_opt_in_title" = "Allow access to local network";
"screen_login_error_deactivated_account" = "Този акаунт бе деактивиран.";
"screen_login_error_invalid_credentials" = "Неправилно потребителско име и/или парола";
"screen_login_error_invalid_user_id" = "Това не е валиден потребителски идентификатор. Очакван формат: ‘@user:homeserver.org’";
@@ -1069,16 +1020,10 @@
"screen_missing_key_backup_open_element_classic" = "Open Element Classic";
"screen_missing_key_backup_step_1" = "Open Element Classic on your device";
"screen_missing_key_backup_step_2_ios" = "Go to User settings > Security";
"screen_missing_key_backup_step_3_ios" = "Scroll down to Chat Backup and tap on Set up";
"screen_missing_key_backup_step_3_ios" = "Scroll down to Secure Backup and tap on Set up";
"screen_missing_key_backup_step_4" = "Follow the instructions to enable your key storage";
"screen_missing_key_backup_step_5" = "Come back to %1$@";
"screen_missing_key_backup_title" = "Enable your key storage before proceeding to %1$@";
"screen_moderation_and_safety_invites_heading" = "Invites";
"screen_moderation_and_safety_other_users_heading" = "Other users";
"screen_moderation_and_safety_share_presence_heading" = "Your appearance";
"screen_multi_account_announcement_action" = "Add account";
"screen_multi_account_announcement_description" = "Go to %1$@ to sign into another account. Then you can easily switch between them.";
"screen_multi_account_announcement_title" = "You can now add multiple accounts";
"screen_notification_optin_subtitle" = "Можете да промените настройките си по-късно.";
"screen_notification_optin_title" = "Разрешете известията и никога не пропускайте съобщение";
"screen_notification_settings_additional_settings_section_title" = "Допълнителни настройки";
@@ -1107,8 +1052,6 @@
"screen_notification_settings_mode_mentions" = "Споменавания";
"screen_notification_settings_notification_section_title" = "Да бъда известяван за";
"screen_notification_settings_room_mention_label" = "Известяване за @room";
"screen_notification_settings_show_all_activity_subtitle" = "Dots or number of unread messages";
"screen_notification_settings_show_all_activity_title" = "Show all activity in the room list";
"screen_notification_settings_sound_custom_fallback" = "Custom";
"screen_notification_settings_sound_custom_sound_button_title" = "Custom sound...";
"screen_notification_settings_sound_delete_sound_error_title" = "Error deleting file";
@@ -1169,14 +1112,6 @@
"screen_polls_history_filter_ongoing" = "Текущи";
"screen_polls_history_filter_past" = "Приключили";
"screen_polls_history_title" = "Анкети";
"screen_ptt_settings_battery_optimization" = "Ignore battery optimisation";
"screen_ptt_settings_battery_optimization_description" = "Stay active in background";
"screen_ptt_settings_covert_mode" = "Covert mode";
"screen_ptt_settings_covert_mode_description" = "Mute all channels";
"screen_ptt_settings_lock_screen" = "Show on lock screen";
"screen_ptt_settings_lock_screen_description" = "Access from the lock screen";
"screen_ptt_settings_system_overlay" = "Enable system overlay";
"screen_ptt_settings_system_overlay_description" = "Access a floating action button";
"screen_push_history_title" = "Push history";
"screen_qr_code_login_connecting_subtitle" = "Establishing a secure connection";
"screen_qr_code_login_connection_note_secure_state_description" = "A secure connection could not be made to the new device. Your existing devices are still safe and you don't need to worry about them.";
@@ -1254,7 +1189,7 @@
"screen_report_content_hint" = "Причина за докладване на това съдържание";
"screen_report_room_leave_failed_alert_message" = "Your report was submitted successfully, but we encountered an issue while trying to leave the room. Please try again.";
"screen_report_room_leave_failed_alert_title" = "Unable to Leave Room";
"screen_report_room_reason_footer" = "Report this chat to your account provider. If the messages are encrypted, your account provider will not be able to read them.";
"screen_report_room_reason_footer" = "Report this room to your admin. If the messages are encrypted, your admin will not be able to read them.";
"screen_report_room_reason_placeholder" = "Describe the reason to report…";
"screen_report_room_title" = "Докладване на стаята";
"screen_reset_encryption_confirmation_alert_action" = "Yes, reset now";
@@ -1321,14 +1256,7 @@
"screen_room_change_role_section_users" = "Членове";
"screen_room_change_role_unsaved_changes_description" = "You have unsaved changes.";
"screen_room_change_role_unsaved_changes_title" = "Save changes?";
"screen_room_confirm_removal_reason_label" = "Reason (optional)";
"screen_room_confirm_removal_reason_placeholder" = "Enter reason…";
"screen_room_confirm_removal_reason_supporting_text" = "(Optional)";
"screen_room_confirm_removal_title" = "Remove message?";
"screen_room_details_add_topic_title" = "Добавяне на тема";
"screen_room_details_audio_push_to_talk" = "Push to talk";
"screen_room_details_audio_title" = "Room Audio";
"screen_room_details_audio_video_calls" = "Video calls";
"screen_room_details_badge_encrypted" = "С шифроване";
"screen_room_details_badge_not_encrypted" = "Без шифроване";
"screen_room_details_badge_public" = "Общодостъпна стая";
@@ -1354,9 +1282,6 @@
"screen_room_details_profile_row_title" = "Профил";
"screen_room_details_requests_to_join_title" = "Requests to join";
"screen_room_details_roles_and_permissions" = "Роли и разрешения";
"screen_room_details_room_audio_ptt" = "Push to talk";
"screen_room_details_room_audio_title" = "Room Audio";
"screen_room_details_room_audio_video_calls" = "Video calls";
"screen_room_details_room_name_label" = "Name";
"screen_room_details_security_and_privacy_title" = "Защита и поверителност";
"screen_room_details_security_title" = "Защита";
@@ -1376,7 +1301,6 @@
"screen_room_invite_again_alert_message" = "Искате ли да ги поканите обратно?";
"screen_room_invite_again_alert_title" = "Вие сте сами в този чат";
"screen_room_live_location_banner" = "Sharing live location";
"screen_room_maximum_messages_selected" = "Maximum messages selected";
"screen_room_member_details_block_alert_action" = "Блокиране";
"screen_room_member_details_block_alert_description" = "Блокираните потребители няма да могат да ви изпращат съобщения и всички техни съобщения ще бъдат скрити. Можете да ги отблокирате по всяко време.";
"screen_room_member_details_block_user" = "Блокиране на потребителя";
@@ -1415,10 +1339,9 @@
"screen_room_notification_settings_error_loading_settings" = "Възникна грешка при зареждането на настройките за известия.";
"screen_room_notification_settings_error_restoring_default" = "Неуспешно възстановяване на режима по подразбиране, моля, опитайте отново.";
"screen_room_notification_settings_error_setting_mode" = "Неуспешно задаване на режима, моля, опитайте отново.";
"screen_room_notification_settings_mentions_only_disclaimer" = "Your account provider does not support this option in encrypted chats, you won't get notified in this chat.";
"screen_room_notification_settings_mentions_only_disclaimer" = "Your homeserver does not support this option in encrypted rooms, you won't get notified in this room.";
"screen_room_notification_settings_mode_all_messages" = "Всички съобщения";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Mentions and replies only";
"screen_room_notification_settings_mode_mute" = "Mute";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Само споменавания и ключови думи";
"screen_room_notification_settings_room_custom_settings_title" = "В тази стая, да бъда известяван за";
"screen_room_pinned_banner_indicator" = "%1$@ of %2$@";
"screen_room_pinned_banner_indicator_description" = "%1$@ Pinned messages";
@@ -1443,7 +1366,6 @@
"screen_room_roles_and_permissions_room_details" = "Подробности за стаята";
"screen_room_roles_and_permissions_space_details" = "Подробности за пространството";
"screen_room_roles_and_permissions_title" = "Роли и разрешения";
"screen_room_select_error_cannot_load_rooms" = "The room list associated with this account cannot be loaded.";
"screen_room_single_knock_request_accept_button_title" = "Приемане";
"screen_room_single_knock_request_title" = "%1$@ wants to join this room";
"screen_room_single_knock_request_view_button_title" = "View";
@@ -1480,8 +1402,6 @@
"screen_roomlist_filter_invites_empty_state_title" = "Нямате чакащи покани.";
"screen_roomlist_filter_low_priority" = "Нисък приоритет";
"screen_roomlist_filter_low_priority_empty_state_title" = "You don’t have any low priority chats yet";
"screen_roomlist_filter_mention" = "Mention";
"screen_roomlist_filter_mention_empty_state_title" = "You don’t have any unread mentions";
"screen_roomlist_filter_mixed_empty_state_subtitle" = "Можете да премахнете избора на филтрите, за да видите другите си чатове";
"screen_roomlist_filter_mixed_empty_state_title" = "You don’t have chats for this selection";
"screen_roomlist_filter_people" = "Хора";
@@ -1568,13 +1488,10 @@
"screen_session_verification_request_title" = "Поискано е потвърждение";
"screen_session_verification_they_dont_match" = "Те не съвпадат";
"screen_session_verification_they_match" = "Те съвпадат";
"screen_session_verification_unavailable_subtitle" = "Please use another device or recovery key.";
"screen_session_verification_unavailable_title" = "Verification with this device is currently unavailable";
"screen_session_verification_use_another_device_subtitle" = "Уверете се, че приложението е отворено на другото устройство, преди да започнете потвърждението оттук.";
"screen_session_verification_use_another_device_title" = "Отворете приложението на друго потвърдено устройство";
"screen_session_verification_user_initiator_subtitle" = "For extra security, verify this user by comparing a set of emojis on your devices. Do this by using a trusted way to communicate.";
"screen_session_verification_user_initiator_title" = "Потвърждаване на този потребител?";
"screen_session_verification_user_requesting_verification" = "User requesting verification:";
"screen_session_verification_user_responder_subtitle" = "For extra security, another user wants to verify your digital identity. You’ll be shown a set of emojis to compare.";
"screen_session_verification_waiting_another_device_subtitle" = "You should see a popup on the other device. Start the verification from there now.";
"screen_session_verification_waiting_another_device_title" = "Start verification on the other device";
@@ -1583,15 +1500,6 @@
"screen_session_verification_waiting_subtitle" = "След като бъдете приети, ще можете да продължите потвърждението.";
"screen_session_verification_waiting_to_accept_subtitle" = "Приемете заявката, за да започнете процеса на потвърждаване в другата си сесия, за да продължите.";
"screen_session_verification_waiting_to_accept_title" = "В очакване на приемане на заявка";
"screen_settings_add_account" = "Add account";
"screen_settings_user_status_away" = "Away";
"screen_settings_user_status_be_right_back" = "Be right back";
"screen_settings_user_status_custom" = "Custom…";
"screen_settings_user_status_custom_hint" = "Custom status…";
"screen_settings_user_status_focus_time" = "Focus time";
"screen_settings_user_status_in_a_meeting" = "In a meeting";
"screen_settings_user_status_on_the_road" = "On the road";
"screen_settings_user_status_placeholder" = "What's your status?";
"screen_share_location_live_location_disclaimer_title" = "Your live location history will be stored in the room and visible to members after the session ends.";
"screen_share_location_live_location_duration_picker_title" = "Choose how long to share your live location.";
"screen_share_location_live_location_missing_permissions" = "You do not have permissions to share your live location in this room";
@@ -1603,10 +1511,9 @@
"screen_share_this_location_action" = "Споделяне на това местоположение";
"screen_sharing_location_option_sheet_title" = "Sharing options";
"screen_signed_out_reason_1" = "Променили сте паролата си в друга сесия";
"screen_signed_out_reason_2" = "You’ve changed your password on another device";
"screen_signed_out_reason_3" = "Your server's session expired or the administrator has blocked your access";
"screen_signed_out_reason_2" = "You have deleted the session from another session";
"screen_signed_out_reason_3" = "Your server’s administrator has invalidated your access";
"screen_signed_out_subtitle" = "You might have been signed out for one of the reasons listed below. Please sign in again to continue using %@.";
"screen_signed_out_subtitle_v2" = "This device was removed for one of the reasons listed below. Please sign in again to connect this device to your account.";
"screen_signed_out_title" = "Излезли сте";
"screen_signout_confirmation_dialog_content" = "Сигурни ли сте, че искате да излезете?";
"screen_signout_confirmation_dialog_submit" = "Изход";
@@ -1632,7 +1539,7 @@
"screen_space_list_parent_space" = "%1$@ пространство";
"screen_space_list_title" = "Пространства";
"screen_space_menu_action_members" = "Преглед на членовете";
"screen_space_remove_rooms_confirmation_content" = "Removing a room will not affect the room access. To change the access go to Room info > Security & privacy.";
"screen_space_remove_rooms_confirmation_content" = "Removing a room will not affect the room access. To change the access go to Room info > Privacy & security.";
"screen_space_remove_rooms_confirmation_title_ios" = "Remove rooms from %1$@?";
"screen_space_settings_leave_space" = "Напускане на пространството";
"screen_space_settings_roles_and_permissions" = "Роли и разрешения";
@@ -1783,7 +1690,6 @@
"troubleshoot_notifications_test_push_loop_back_failure_2" = "Грешка: %1$@";
"troubleshoot_notifications_test_push_loop_back_failure_3" = "Error, cannot test push.";
"troubleshoot_notifications_test_push_loop_back_failure_4" = "Error, timeout waiting for push.";
"troubleshoot_notifications_test_push_loop_back_failure_rate_limit" = "Error: the push gateway is rate limiting this device, so notifications won't be reliable. Please set up a different push gateway.";
"troubleshoot_notifications_test_push_loop_back_success" = "Push loop back took %1$d ms.";
"troubleshoot_notifications_test_push_loop_back_title" = "Test Push loop back";
"troubleshoot_notifications_test_unified_push_description" = "Ensure that UnifiedPush distributors are available.";
@@ -18,22 +18,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_gallery_more_media</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Gallery, %1$d more media</string>
<key>other</key>
<string>Gallery, %1$d more medias</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_polls_percent_of_total</key>
<dict>
<key>COUNT</key>
@@ -66,54 +50,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>action_forward_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Forward %1$d message</string>
<key>other</key>
<string>Forward %1$d messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_attachments</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d attachment…</string>
<key>other</key>
<string>%1$d attachments…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_media_items</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d media item…</string>
<key>other</key>
<string>%1$d media items…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_many_members</key>
<dict>
<key>COUNT</key>
@@ -274,22 +210,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_gallery_body</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Shared %1$d attachment</string>
<key>other</key>
<string>Shared %1$d attachments</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_invitations</key>
<dict>
<key>COUNT</key>
@@ -354,22 +274,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen.room.timeline_redacted_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d removed message</string>
<key>other</key>
<string>%1$d removed messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_advanced_settings_live_location_update_distance</key>
<dict>
<key>COUNT</key>
@@ -546,22 +450,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_messages_forwarded</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message forwarded</string>
<key>other</key>
<string>%1$d messages forwarded</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_multiple_knock_requests_title</key>
<dict>
<key>COUNT</key>
@@ -578,22 +466,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_selection_count</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message selected</string>
<key>other</key>
<string>%1$d messages selected</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_timeline_reaction_a11y</key>
<dict>
<key>COUNT</key>
@@ -690,7 +562,7 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_timeline_active_call_joined_count</key>
<key>screen_timeline_active_call_extra_joined_count</key>
<dict>
<key>COUNT</key>
<dict>
@@ -699,9 +571,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
<key>other</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
@@ -1,6 +1,6 @@
"NSCameraUsageDescription" = "Per fer fotos o vídeos i enviar-los com a missatge, Element X necessita accés a la càmera.";
"NSFaceIDUsageDescription" = "Face ID s'utilitza per accedir a l'aplicació.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "To share your location live in chats, location access is needed when the app is in the background.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "To share your live location, Element X needs location access when the app is in the background.";
"NSLocationWhenInUseUsageDescription" = "Concedeix accés a la ubicació perquè Element X pugui compartir la teva ubicació.";
"NSMicrophoneUsageDescription" = "Per gravar i enviar missatges amb àudio, Element X necessita accedir al micròfon.";
"NSPhotoLibraryUsageDescription" = "Això permet desar imatges i vídeos a la biblioteca de fotos.";
@@ -6,23 +6,16 @@
"a11y_collapse_message_text_field" = "Minimise message text field";
"a11y_create_poll_votes_allowed_decrease" = "Decrease votes allowed per person";
"a11y_create_poll_votes_allowed_increase" = "Increase votes allowed per person";
"a11y_custom_emoji" = "Custom emoji";
"a11y_delete" = "Elimina";
"a11y_duration" = "Duration: %1$@";
"a11y_edit_avatar" = "Edit avatar";
"a11y_edit_room_address_hint" = "The full address will be %1$@";
"a11y_expand_message_text_field" = "Expand message text field";
"a11y_gallery_attachment" = "Gallery, attachment %1$d";
"a11y_gallery_failed_scan" = "Gallery, failed scan %1$d";
"a11y_gallery_image" = "Gallery, image %1$d";
"a11y_gallery_scanning" = "Gallery, scanning %1$d";
"a11y_gallery_video" = "Gallery, video %1$d";
"a11y_hide_password" = "Amaga contrasenya";
"a11y_info" = "Info";
"a11y_join_call" = "Uneix-te a la trucada";
"a11y_jump_to_bottom" = "Vés al final";
"a11y_jump_to_unread" = "Jump to unread";
"a11y_jump_to_unread_messages" = "Jump to first unread message";
"a11y_notifications_mentions_only" = "Només mencions";
"a11y_notifications_muted" = "Silenciat";
"a11y_notifications_new_mentions" = "Noves mencions";
@@ -57,7 +50,6 @@
"a11y_start_call" = "Inicia trucada";
"a11y_start_video_call" = "Start a video call";
"a11y_start_voice_call" = "Start a voice call";
"a11y_status" = "Status";
"a11y_tombstoned_room" = "Tombstoned room";
"a11y_user_menu" = "Menú d'usuari";
"a11y_video_preview" = "Video preview";
@@ -86,7 +78,6 @@
"action_choose_file" = "Choose file";
"action_choose_photo" = "Tria una foto";
"action_clear" = "Esborra";
"action_clear_all" = "Clear all";
"action_close" = "Tanca";
"action_complete_verification" = "Completa la verificació";
"action_confirm" = "Confirma";
@@ -97,7 +88,6 @@
"action_copy_link" = "Copia l'enllaç";
"action_copy_link_to_message" = "Copia l'enllaç al missatge";
"action_copy_text" = "Copia text";
"action_copy_to_clipboard" = "Copy to clipboard";
"action_create" = "Crea";
"action_create_room" = "Crea sala";
"action_create_space" = "Create space";
@@ -145,7 +135,6 @@
"action_manage_account_and_devices" = "Manage account & devices";
"action_manage_devices" = "Gestiona dispositius";
"action_manage_rooms" = "Manage rooms";
"action_mark_as_read" = "Mark as read";
"action_message" = "Envia missatge";
"action_minimize" = "Minimise";
"action_next" = "Següent";
@@ -220,7 +209,6 @@
"call_invalid_audio_device_bluetooth_devices_disabled" = "Element Call does not support using Bluetooth audio devices in this Android version. Please select a different audio device.";
"common_about" = "Sobre l'aplicació";
"common_acceptable_use_policy" = "Política d'ús a acceptar";
"common_account_settings" = "Account settings";
"common_add_account" = "Add an account";
"common_add_another_account" = "Add account";
"common_adding_caption" = "Afegint llegenda";
@@ -229,7 +217,6 @@
"common_analytics" = "Analítiques";
"common_android_shortcuts_remove_reason_left_room" = "Has sortit de la sala";
"common_android_shortcuts_remove_reason_session_logged_out" = "You were logged out of the session";
"common_app_settings" = "App settings";
"common_appearance" = "Aspecte";
"common_audio" = "Àudio";
"common_beta" = "Beta";
@@ -240,8 +227,6 @@
"common_call_started" = "Trucada iniciada";
"common_call_you_declined" = "You declined a call";
"common_chat_backup" = "Còpia de seguretat de xat";
"common_chats" = "Chats";
"common_code_block" = "Code block";
"common_copied_to_clipboard" = "Copiat al porta-retalls";
"common_copyright" = "Drets d'autor";
"common_creating_room" = "Creant sala…";
@@ -279,12 +264,10 @@
"common_file_deleted" = "Fitxer eliminat";
"common_file_saved" = "Fitxer desat";
"common_forward_message" = "Reenvia missatge";
"common_forward_to" = "Forward to";
"common_frequently_used" = "Utilitzats freqüentment";
"common_gallery" = "Gallery";
"common_gif" = "GIF";
"common_group_call_in_progress" = "Group call in progress";
"common_header_rooms" = "Rooms";
"common_image" = "Imatge";
"common_in_reply_to" = "En resposta a %1$@";
"common_invite_unknown_profile" = "No s'ha trobat l'ID de Matrix, és possible que la invitació no s'hagi rebut.";
@@ -297,25 +280,20 @@
"common_live_location_ended" = "Live location ended";
"common_loading" = "S'està carregant…";
"common_loading_more" = "Carregant més…";
"common_location_sharing" = "Location sharing";
"common_media_upload_quality" = "Media upload quality";
"common_message" = "Missatge";
"common_message_actions" = "Accions de missatge";
"common_message_failed_to_send" = "Message failed to send";
"common_message_layout" = "Estil dels missatges";
"common_message_removed" = "Missatge eliminat";
"common_moderation_and_safety" = "Moderation & safety";
"common_modern" = "Modern";
"common_mute" = "Silencia";
"common_name" = "Name";
"common_name_and_id" = "%1$@ (%2$@)";
"common_no_results" = "Sense resultats";
"common_no_results_for" = "There are no results for “%1$@”. Try a new search term.";
"common_no_room_name" = "Sala sense nom";
"common_no_space_name" = "No space name";
"common_not_encrypted" = "Sense xifrar";
"common_offline" = "Fora de línia";
"common_on_a_call" = "On a call";
"common_open_source_licenses" = "Llicències de codi obert";
"common_optic_id_ios" = "Optic ID";
"common_or" = "o";
@@ -349,7 +327,6 @@
"common_replying_to" = "Responent a %1$@";
"common_report_a_problem" = "Informa d'un problema";
"common_report_submitted" = "S'ha enviat";
"common_results_for" = "Results for “%1$@”";
"common_rich_text_editor" = "Editor de text enriquit";
"common_role" = "Role";
"common_room" = "Sala";
@@ -377,7 +354,6 @@
"common_shared_live_location" = "Shared live location";
"common_shared_location" = "Ubicació compartida";
"common_shared_space" = "Shared space";
"common_signed_in" = "Signed in";
"common_signing_out" = "Tancant sessió";
"common_something_went_wrong" = "Alguna cosa ha anat malament";
"common_something_went_wrong_message" = "S'ha produït un problema. Torna-ho a intentar.";
@@ -389,7 +365,6 @@
"common_success" = "Correcte";
"common_suggested" = "Suggested";
"common_suggestions" = "Suggeriments";
"common_switch_accounts" = "Switch accounts";
"common_syncing" = "Sincronitzant";
"common_text" = "Text";
"common_third_party_notices" = "Avisos de tercers";
@@ -430,14 +405,12 @@
"common_waiting_live_location" = "Waiting for live location…";
"common_world_readable_history" = "Anyone can see history";
"common_you" = "Tu";
"common_your_account" = "Your account";
"confirm_recovery_key_banner_message" = "Confirma la clau de recuperació per mantenir l'accés a l'emmagatzematge de claus i a l'historial de missatges.";
"confirm_recovery_key_banner_primary_button_title" = "Introdueix clau de recuperació";
"confirm_recovery_key_banner_secondary_button_title" = "Has oblidat la clau de recuperació?";
"confirm_recovery_key_banner_title" = "L'emmagatzematge de claus no està sincronitzat";
"content_scanner_not_found" = "Download not available.";
"content_scanner_not_found_title" = "Something went wrong";
"content_scanner_scanning" = "Scanning…";
"content_scanner_not_found_title" = "File not found";
"content_scanner_unsafe_message" = "Preview and download have been disabled.";
"content_scanner_unsafe_title" = "The file is not safe";
"crash_detection_dialog_content" = "%1$@ ha fallat l'últim cop que es va utilitzar. Vols enviar un informe d'errors?";
@@ -511,11 +484,6 @@
"error_no_compatible_app_found" = "No s'ha trobat cap aplicació compatible per gestionar aquesta acció.";
"error_room_address_already_exists" = "Aquesta adreça de sala ja existeix. Prova d'editar el camp d'adreça o de canviar el nom de sala";
"error_room_address_invalid_symbols" = "Alguns caràcters no estan permesos. Només s'admeten lletres, dígits i els símbols següents: ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _";
"error_sending_failure_invalid_mime_type" = "Invalid mime type: %@";
"error_sending_failure_missing_media_content" = "Missing media content";
"error_sending_failure_other" = "Error details: %@";
"error_sending_failure_sending_from_unverified_device" = "Sending from unverified device";
"error_sending_failure_unknown" = "Unknown error";
"error_some_messages_have_not_been_sent" = "Alguns missatges no s'han enviat";
"error_unknown" = "S'ha produït un error";
"error.account_already_logged_in" = "You're already logged in on this device as %1$@.";
@@ -545,8 +513,6 @@
"notification_invitation_action_reject" = "Rebutja";
"notification_invite_body" = "T'ha convidat a xatejar";
"notification_invite_body_with_sender" = "%1$@ t'ha convidat a xatejar";
"notification_knock_request_body" = "Requested to join";
"notification_live_location_started_body" = "Started sharing their live location";
"notification_mentioned_you_body" = "T'ha mencionat: %1$@";
"notification_new_messages" = "Missatges nous";
"notification_reaction_body" = "Ha reaccionat amb %1$@";
@@ -731,22 +697,14 @@
"screen_change_server_error_element_pro_required_title" = "Element Pro required";
"screen_change_server_error_invalid_homeserver" = "No s'ha pogut accedir a aquest servidor. Comprova que hagis introduït correctament l'URL del servidor. Si ja és correcte, posa't en contacte amb l'administrador del servidor per a més informació.";
"screen_change_server_error_invalid_well_known" = "Servidor no disponible a causa d'un problema al fitxer .well-known:\n%1$@";
"screen_change_server_error_no_sliding_sync_message" = "The selected account provider does not support sliding sync. The server needs to be upgraded to use %1$@.";
"screen_change_server_error_no_sliding_sync_message" = "The selected account provider does not support sliding sync. An upgrade to the server is needed to use %1$@.";
"screen_change_server_error_unauthorized_homeserver" = "%1$@ is not allowed to connect to %2$@.";
"screen_change_server_error_unauthorized_homeserver_content" = "This app has been configured to allow: %1$@.";
"screen_change_server_error_unauthorized_homeserver_title" = "Account provider %1$@ not allowed.";
"screen_change_server_form_header" = "URL del servidor";
"screen_change_server_form_notice" = "Introdueix un domini.";
"screen_change_server_navigation_title_login" = "Sign in";
"screen_change_server_navigation_title_register" = "Create account";
"screen_change_server_subtitle" = "Quina és l'adreça del teu servidor?";
"screen_change_server_textfield_footer_login" = "If your account is provided by your company or a community, then change the account provider (example: companyname.com).";
"screen_change_server_textfield_footer_register" = "Create an account on matrix.org for free. If you want to create an account with a different provider, then change it accordingly (example: communityname.org).";
"screen_change_server_textfield_header" = "Account provider";
"screen_change_server_textfield_placeholder" = "example.com";
"screen_change_server_title" = "Selecciona el teu servidor";
"screen_change_server_title_login" = "Enter your account provider";
"screen_change_server_title_register" = "Choose an account provider";
"screen_chat_backup_key_backup_action_disable" = "Elimina l'emmagatzematge de claus";
"screen_chat_backup_key_backup_action_enable" = "Activa còpia de seguretat";
"screen_chat_backup_key_backup_description" = "Emmagatzema la teva identitat criptogràfica i les claus de missatge de forma segura al servidor. Això et permetrà veure l'historial de missatges en qualsevol dispositiu nou. %1$@.";
@@ -793,7 +751,7 @@
"screen_create_room_private_option_description" = "Només s'hi poden unir les persones convidades.";
"screen_create_room_private_option_title" = "Private";
"screen_create_room_public_option_description" = "Tothom pot trobar aquesta sala.\nPots canviar-ho en qualsevol moment a la configuració de sala.";
"screen_create_room_public_option_short_description" = "Anyone can join, including people outside your organisation.";
"screen_create_room_public_option_short_description" = "Anyone can join.";
"screen_create_room_public_option_title" = "Public";
"screen_create_room_room_access_section_knocking_option_description" = "Qualsevol persona pot sol·licitar unir-s'hi però un administrador o moderador l'haurà d'acceptar";
"screen_create_room_room_access_section_knocking_option_title" = "Permet sol·licituds d'unió";
@@ -966,10 +924,6 @@
"screen_knock_requests_list_empty_state_title" = "No hi ha sol·licituds d'unió pendents";
"screen_knock_requests_list_initial_loading_title" = "Carregant sol·licituds d'unió…";
"screen_knock_requests_list_title" = "Sol·licituds d'unió";
"screen_labs_enable_gallery" = "Gallery messages";
"screen_labs_enable_gallery_description" = "Send multiple images or videos in one go. Stable on mobile, but not yet supported by web.";
"screen_labs_enable_knocking" = "Ask to join";
"screen_labs_enable_knocking_description" = "Users can request access to a room that is not open for anyone to join. Stable on mobile, web implementation exists but is experimental.";
"screen_labs_enable_threads" = "Enable thread replies";
"screen_labs_enable_threads_description" = "The app will restart to apply this change.";
"screen_labs_header_description" = "Try out our latest ideas in development. These features are not finalised; they may be unstable, may change.";
@@ -978,11 +932,11 @@
"screen_leave_space_choose_owners_action" = "Choose owners";
"screen_leave_space_last_admin_info" = "%1$@ (Admin)";
"screen_leave_space_subtitle" = "Select the rooms you’d like to leave which you're not the only administrator for:";
"screen_leave_space_subtitle_last_admin" = "You need to assign another administrator for this space before you can leave.";
"screen_leave_space_subtitle_last_admin" = "You need to assign another admin for this space before you can leave.";
"screen_leave_space_subtitle_last_owner" = "You are the only owner of %1$@. You need to transfer ownership to someone else before you leave.";
"screen_leave_space_subtitle_only_last_admin" = "You will not be removed from the following room(s) because you're the only administrator:";
"screen_leave_space_title" = "Leave %1$@?";
"screen_leave_space_title_last_admin" = "You are the only administrator for %1$@";
"screen_leave_space_title_last_admin" = "You are the only admin for %1$@";
"screen_leave_space_title_last_owner" = "Transfer ownership";
"screen_link_new_device_authentication_reason_ios" = "Confirm it's you before linking a new device.";
"screen_link_new_device_desktop_scanning_title" = "Escaneja el QR";
@@ -990,7 +944,6 @@
"screen_link_new_device_desktop_step3" = "Escaneja el codi QR amb aquest dispositiu";
"screen_link_new_device_desktop_submit" = "Preparat per escanejar";
"screen_link_new_device_desktop_title" = "Open %1$@ on a desktop computer to get the QR code";
"screen_link_new_device_desktop_warning" = "Only scan a QR code after following the steps above on your own device. Never scan a code sent by another person.";
"screen_link_new_device_enter_number_error_numbers_do_not_match" = "The numbers don’t match";
"screen_link_new_device_enter_number_notice" = "Enter 2-digit code";
"screen_link_new_device_enter_number_subtitle" = "This will verify that the connection to your other device is secure.";
@@ -1017,8 +970,6 @@
"screen_live_location_sheet_nobody_sharing" = "Nobody is sharing their location";
"screen_live_location_sheet_sharing_live_location" = "Sharing live location";
"screen_live_location_sheet_title" = "On the map";
"screen_local_network_opt_in_subtitle" = "Your homeserver is on your local network. To connect, %1$@ needs permission to reach devices on this network.";
"screen_local_network_opt_in_title" = "Allow access to local network";
"screen_login_error_deactivated_account" = "Aquest compte s'ha desactivat.";
"screen_login_error_invalid_credentials" = "Usuari i/o contrasenya incorrectes";
"screen_login_error_invalid_user_id" = "Identificador d'usuari invàlid. Format esperat: ‘@usuari:servidor.org’";
@@ -1069,16 +1020,10 @@
"screen_missing_key_backup_open_element_classic" = "Open Element Classic";
"screen_missing_key_backup_step_1" = "Open Element Classic on your device";
"screen_missing_key_backup_step_2_ios" = "Go to User settings > Security";
"screen_missing_key_backup_step_3_ios" = "Scroll down to Chat Backup and tap on Set up";
"screen_missing_key_backup_step_3_ios" = "Scroll down to Secure Backup and tap on Set up";
"screen_missing_key_backup_step_4" = "Follow the instructions to enable your key storage";
"screen_missing_key_backup_step_5" = "Come back to %1$@";
"screen_missing_key_backup_title" = "Enable your key storage before proceeding to %1$@";
"screen_moderation_and_safety_invites_heading" = "Invites";
"screen_moderation_and_safety_other_users_heading" = "Other users";
"screen_moderation_and_safety_share_presence_heading" = "Your appearance";
"screen_multi_account_announcement_action" = "Add account";
"screen_multi_account_announcement_description" = "Go to %1$@ to sign into another account. Then you can easily switch between them.";
"screen_multi_account_announcement_title" = "You can now add multiple accounts";
"screen_notification_optin_subtitle" = "Pots canviar la configuració més tard.";
"screen_notification_optin_title" = "Permet les notificacions i no perdis cap missatge";
"screen_notification_settings_additional_settings_section_title" = "Configuració addicional";
@@ -1107,8 +1052,6 @@
"screen_notification_settings_mode_mentions" = "Mencions";
"screen_notification_settings_notification_section_title" = "Notifica'm a";
"screen_notification_settings_room_mention_label" = "Notifica'm a @sala";
"screen_notification_settings_show_all_activity_subtitle" = "Dots or number of unread messages";
"screen_notification_settings_show_all_activity_title" = "Show all activity in the room list";
"screen_notification_settings_sound_custom_fallback" = "Custom";
"screen_notification_settings_sound_custom_sound_button_title" = "Custom sound...";
"screen_notification_settings_sound_delete_sound_error_title" = "Error deleting file";
@@ -1169,14 +1112,6 @@
"screen_polls_history_filter_ongoing" = "En curs";
"screen_polls_history_filter_past" = "Pasades";
"screen_polls_history_title" = "Votacions";
"screen_ptt_settings_battery_optimization" = "Ignore battery optimisation";
"screen_ptt_settings_battery_optimization_description" = "Stay active in background";
"screen_ptt_settings_covert_mode" = "Covert mode";
"screen_ptt_settings_covert_mode_description" = "Mute all channels";
"screen_ptt_settings_lock_screen" = "Show on lock screen";
"screen_ptt_settings_lock_screen_description" = "Access from the lock screen";
"screen_ptt_settings_system_overlay" = "Enable system overlay";
"screen_ptt_settings_system_overlay_description" = "Access a floating action button";
"screen_push_history_title" = "Push history";
"screen_qr_code_login_connecting_subtitle" = "Establint una connexió segura";
"screen_qr_code_login_connection_note_secure_state_description" = "No s'ha pogut establir una connexió segura amb el dispositiu nou. Els dispositius existents continuen sent segurs, no te n'has de preocupar.";
@@ -1321,14 +1256,7 @@
"screen_room_change_role_section_users" = "Membres";
"screen_room_change_role_unsaved_changes_description" = "Hi ha canvis sense desar.";
"screen_room_change_role_unsaved_changes_title" = "Desar canvis?";
"screen_room_confirm_removal_reason_label" = "Reason (optional)";
"screen_room_confirm_removal_reason_placeholder" = "Enter reason…";
"screen_room_confirm_removal_reason_supporting_text" = "(Optional)";
"screen_room_confirm_removal_title" = "Remove message?";
"screen_room_details_add_topic_title" = "Afegeix tema";
"screen_room_details_audio_push_to_talk" = "Push to talk";
"screen_room_details_audio_title" = "Room Audio";
"screen_room_details_audio_video_calls" = "Video calls";
"screen_room_details_badge_encrypted" = "Xifrada";
"screen_room_details_badge_not_encrypted" = "No xifrada";
"screen_room_details_badge_public" = "Sala pública";
@@ -1354,9 +1282,6 @@
"screen_room_details_profile_row_title" = "Perfil";
"screen_room_details_requests_to_join_title" = "Sol·licituds d'unió";
"screen_room_details_roles_and_permissions" = "Rols i permisos";
"screen_room_details_room_audio_ptt" = "Push to talk";
"screen_room_details_room_audio_title" = "Room Audio";
"screen_room_details_room_audio_video_calls" = "Video calls";
"screen_room_details_room_name_label" = "Name";
"screen_room_details_security_and_privacy_title" = "Seguretat i privadesa";
"screen_room_details_security_title" = "Seguretat";
@@ -1376,7 +1301,6 @@
"screen_room_invite_again_alert_message" = "Vols tornar-los a convidar-los?";
"screen_room_invite_again_alert_title" = "No hi ha ningú més al xat";
"screen_room_live_location_banner" = "Sharing live location";
"screen_room_maximum_messages_selected" = "Maximum messages selected";
"screen_room_member_details_block_alert_action" = "Bloqueja";
"screen_room_member_details_block_alert_description" = "Els usuaris bloquejats no podran enviar-te missatges i tots els seus missatges s'amagaran. Pots desbloquejar-los en qualsevol moment.";
"screen_room_member_details_block_user" = "Bloqueja usuari";
@@ -1416,9 +1340,8 @@
"screen_room_notification_settings_error_restoring_default" = "No s'ha pogut restaurar el mode predeterminat. Torna-ho a provar.";
"screen_room_notification_settings_error_setting_mode" = "No s'ha pogut configurar el mode. Torna-ho a provar.";
"screen_room_notification_settings_mentions_only_disclaimer" = "El servidor no admet aquesta opció en sales xifrades, no rebras notificacions en aquesta sala.";
"screen_room_notification_settings_mode_all_messages" = "All messages";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Mentions and replies only";
"screen_room_notification_settings_mode_mute" = "Mute";
"screen_room_notification_settings_mode_all_messages" = "Tots els missatges";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Mencions y paraules clau (només)";
"screen_room_notification_settings_room_custom_settings_title" = "En aquesta sala, notifica'm en";
"screen_room_pinned_banner_indicator" = "%1$@ de %2$@";
"screen_room_pinned_banner_indicator_description" = "%1$@ missatges fixats";
@@ -1443,7 +1366,6 @@
"screen_room_roles_and_permissions_room_details" = "Detalls de sala";
"screen_room_roles_and_permissions_space_details" = "Space details";
"screen_room_roles_and_permissions_title" = "Rols i permisos";
"screen_room_select_error_cannot_load_rooms" = "The room list associated with this account cannot be loaded.";
"screen_room_single_knock_request_accept_button_title" = "Accepta";
"screen_room_single_knock_request_title" = "%1$@ vol unir-se a aquesta sala";
"screen_room_single_knock_request_view_button_title" = "View";
@@ -1480,8 +1402,6 @@
"screen_roomlist_filter_invites_empty_state_title" = "No tens cap invitació pendent.";
"screen_roomlist_filter_low_priority" = "Prioritat baixa";
"screen_roomlist_filter_low_priority_empty_state_title" = "You don’t have any low priority chats yet";
"screen_roomlist_filter_mention" = "Mention";
"screen_roomlist_filter_mention_empty_state_title" = "You don’t have any unread mentions";
"screen_roomlist_filter_mixed_empty_state_subtitle" = "Pots desseleccionar els filtres per veure els altres xats";
"screen_roomlist_filter_mixed_empty_state_title" = "Cap xats per a aquesta selecció";
"screen_roomlist_filter_people" = "Persones";
@@ -1568,13 +1488,10 @@
"screen_session_verification_request_title" = "Verificació sol·licitada";
"screen_session_verification_they_dont_match" = "No coincideixen";
"screen_session_verification_they_match" = "Coincideixen";
"screen_session_verification_unavailable_subtitle" = "Please use another device or recovery key.";
"screen_session_verification_unavailable_title" = "Verification with this device is currently unavailable";
"screen_session_verification_use_another_device_subtitle" = "Assegura't que tens l'aplicació oberta a l'altre dispositiu abans d'inicar la verificació des d'aquí.";
"screen_session_verification_use_another_device_title" = "Obre l'aplicació en un altre dispositiu verificat";
"screen_session_verification_user_initiator_subtitle" = "Per a més seguretat, verifica aquest usuari comparant un conjunt d'emoticones vostres dispositius. Fes-ho a través d'un mitjà de comunicació fiable, o en persona.";
"screen_session_verification_user_initiator_title" = "Vols verificar aquest usuari?";
"screen_session_verification_user_requesting_verification" = "User requesting verification:";
"screen_session_verification_user_responder_subtitle" = "Per a més seguretat, un altre usuari vol verificar la teva identitat. Se't mostrarà un conjunt d'emoticones a comparar.";
"screen_session_verification_waiting_another_device_subtitle" = "Hauries de veure una finestra emergent a l'altre dispositiu. Inicia, ara, la verificació des d'allà.";
"screen_session_verification_waiting_another_device_title" = "Inicia la verificació a l'altre dispositiu";
@@ -1583,15 +1500,6 @@
"screen_session_verification_waiting_subtitle" = "Un cop acceptat, podràs continuar amb la verificació.";
"screen_session_verification_waiting_to_accept_subtitle" = "Per continuar, accepta la sol·licitud per iniciar el procés de verificació a l'altra sessió.";
"screen_session_verification_waiting_to_accept_title" = "Esperant que s'accepti la sol·licitud";
"screen_settings_add_account" = "Add account";
"screen_settings_user_status_away" = "Away";
"screen_settings_user_status_be_right_back" = "Be right back";
"screen_settings_user_status_custom" = "Custom…";
"screen_settings_user_status_custom_hint" = "Custom status…";
"screen_settings_user_status_focus_time" = "Focus time";
"screen_settings_user_status_in_a_meeting" = "In a meeting";
"screen_settings_user_status_on_the_road" = "On the road";
"screen_settings_user_status_placeholder" = "What's your status?";
"screen_share_location_live_location_disclaimer_title" = "Your live location history will be stored in the room and visible to members after the session ends.";
"screen_share_location_live_location_duration_picker_title" = "Choose how long to share your live location.";
"screen_share_location_live_location_missing_permissions" = "You do not have permissions to share your live location in this room";
@@ -1606,7 +1514,6 @@
"screen_signed_out_reason_2" = "Has eliminat la sessió des d'una altra sessió";
"screen_signed_out_reason_3" = "L'administrador del teu servidor t'ha invalidat l'accés";
"screen_signed_out_subtitle" = "S'ha tancat la sessió per algun dels motius enumerats a continuació. Torna a iniciar sessió per continuar utilitzant %@.";
"screen_signed_out_subtitle_v2" = "This device was removed for one of the reasons listed below. Please sign in again to connect this device to your account.";
"screen_signed_out_title" = "Has tancat sessió";
"screen_signout_confirmation_dialog_content" = "Segur que vols tancar sessió?";
"screen_signout_confirmation_dialog_submit" = "Tanca sessió";
@@ -1632,7 +1539,7 @@
"screen_space_list_parent_space" = "%1$@ space";
"screen_space_list_title" = "Spaces";
"screen_space_menu_action_members" = "View members";
"screen_space_remove_rooms_confirmation_content" = "Removing a room will not affect the room access. To change the access go to Room info > Security & privacy.";
"screen_space_remove_rooms_confirmation_content" = "Removing a room will not affect the room access. To change the access go to Room info > Privacy & security.";
"screen_space_remove_rooms_confirmation_title_ios" = "Remove rooms from %1$@?";
"screen_space_settings_leave_space" = "Leave space";
"screen_space_settings_roles_and_permissions" = "Rols i permisos";
@@ -1783,7 +1690,6 @@
"troubleshoot_notifications_test_push_loop_back_failure_2" = "Error: %1$@.";
"troubleshoot_notifications_test_push_loop_back_failure_3" = "Error, no s'han pogut provar les notificacions push.";
"troubleshoot_notifications_test_push_loop_back_failure_4" = "Error, s'ha acabat el temps d'espera de la notificació push.";
"troubleshoot_notifications_test_push_loop_back_failure_rate_limit" = "Error: the push gateway is rate limiting this device, so notifications won't be reliable. Please set up a different push gateway.";
"troubleshoot_notifications_test_push_loop_back_success" = "El bucle de notificacions push ha tardat %1$d ms.";
"troubleshoot_notifications_test_push_loop_back_title" = "Prova el bucle de notificacions push";
"troubleshoot_notifications_test_unified_push_description" = "Assegura't que hi hagi distribuïdors d'UnifiedPush disponibles.";
@@ -18,22 +18,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_gallery_more_media</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Gallery, %1$d more media</string>
<key>other</key>
<string>Gallery, %1$d more medias</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_polls_percent_of_total</key>
<dict>
<key>COUNT</key>
@@ -66,54 +50,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>action_forward_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Forward %1$d message</string>
<key>other</key>
<string>Forward %1$d messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_attachments</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d attachment…</string>
<key>other</key>
<string>%1$d attachments…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_media_items</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d media item…</string>
<key>other</key>
<string>%1$d media items…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_many_members</key>
<dict>
<key>COUNT</key>
@@ -274,22 +210,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_gallery_body</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Shared %1$d attachment</string>
<key>other</key>
<string>Shared %1$d attachments</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_invitations</key>
<dict>
<key>COUNT</key>
@@ -354,22 +274,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen.room.timeline_redacted_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d removed message</string>
<key>other</key>
<string>%1$d removed messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_advanced_settings_live_location_update_distance</key>
<dict>
<key>COUNT</key>
@@ -546,22 +450,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_messages_forwarded</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message forwarded</string>
<key>other</key>
<string>%1$d messages forwarded</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_multiple_knock_requests_title</key>
<dict>
<key>COUNT</key>
@@ -578,22 +466,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_selection_count</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message selected</string>
<key>other</key>
<string>%1$d messages selected</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_timeline_reaction_a11y</key>
<dict>
<key>COUNT</key>
@@ -690,7 +562,7 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_timeline_active_call_joined_count</key>
<key>screen_timeline_active_call_extra_joined_count</key>
<dict>
<key>COUNT</key>
<dict>
@@ -699,9 +571,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
<key>other</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
@@ -1,6 +1,6 @@
"NSCameraUsageDescription" = "Chcete-li pořizovat snímky nebo videa a odesílat je jako zprávu, potřebuje Element X přístup k fotoaparátu.";
"NSFaceIDUsageDescription" = "K ochraně přístupu k vašemu účtu se používá Face ID.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "Chcete-li v chatech sdílet svou polohu v reálném čase, je nutné povolit přístup k poloze, i když je aplikace spuštěna na pozadí.";
"NSLocationWhenInUseUsageDescription" = "Díky tomu můžete v chatech sdílet svou aktuální polohu nebo místa v okolí.";
"NSFaceIDUsageDescription" = "K přístupu do aplikace se používá Face ID.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "Aby mohla aplikace Element X sdílet vaši aktuální polohu, potřebuje přístup k poloze, i když je aplikace spuštěna na pozadí.";
"NSLocationWhenInUseUsageDescription" = "Udělte přístup k poloze, aby mohl Element X sdílet vaši polohu.";
"NSMicrophoneUsageDescription" = "Aby bylo možné nahrávat a odesílat zprávy se zvukem, potřebuje Element X přístup k mikrofonu.";
"NSPhotoLibraryUsageDescription" = "To vám umožní ukládat obrázky a videa do knihovny fotografií.";
@@ -1,4 +1,4 @@
"a11y_add_avatar" = "Přidat avatar";
"a11y_add_avatar" = "Add avatar";
"a11y_add_reaction" = "Přidat reakci: %1$@";
"a11y_address" = "Adresa";
"a11y_avatar" = "Profilový obrázek";
@@ -6,23 +6,16 @@
"a11y_collapse_message_text_field" = "Minimalizovat textové pole zprávy";
"a11y_create_poll_votes_allowed_decrease" = "Decrease votes allowed per person";
"a11y_create_poll_votes_allowed_increase" = "Increase votes allowed per person";
"a11y_custom_emoji" = "Custom emoji";
"a11y_delete" = "Smazat";
"a11y_duration" = "Doba trvání: %1$@";
"a11y_duration" = "Duration: %1$@";
"a11y_edit_avatar" = "Upravit avatar";
"a11y_edit_room_address_hint" = "Úplná adresa bude %1$@";
"a11y_expand_message_text_field" = "Rozbalit textové pole zprávy";
"a11y_gallery_attachment" = "Gallery, attachment %1$d";
"a11y_gallery_failed_scan" = "Gallery, failed scan %1$d";
"a11y_gallery_image" = "Gallery, image %1$d";
"a11y_gallery_scanning" = "Gallery, scanning %1$d";
"a11y_gallery_video" = "Gallery, video %1$d";
"a11y_hide_password" = "Skrýt heslo";
"a11y_info" = "Informace";
"a11y_join_call" = "Připojit se k hovoru";
"a11y_jump_to_bottom" = "Přejít dolů";
"a11y_jump_to_unread" = "Přejít na nepřečtené";
"a11y_jump_to_unread_messages" = "Jump to first unread message";
"a11y_jump_to_unread" = "Jump to unread";
"a11y_notifications_mentions_only" = "Pouze zmínky";
"a11y_notifications_muted" = "Ztišeno";
"a11y_notifications_new_mentions" = "Nové zmínky";
@@ -40,12 +33,12 @@
"a11y_poll_end" = "Hlasování ukončeno";
"a11y_polls_will_remove_selection" = "Odstraní předchozí výběr";
"a11y_polls_winning_answer" = "Toto je vítězná odpověď";
"a11y_position" = "Pozice: %1$@";
"a11y_position" = "Position: %1$@";
"a11y_qr_code" = "QR kód";
"a11y_react_with" = "Reagovat s %1$@";
"a11y_react_with_other_emojis" = "Reagovat s dalšími emoji";
"a11y_read_receipts_multiple" = "Předchozí zprávu přečetli %1$@ a %2$@";
"a11y_read_receipts_single" = "Předchozí zprávu přečetl(a) %1$@";
"a11y_read_receipts_multiple" = "%1$@ a %2$@ přečetli";
"a11y_read_receipts_single" = "%1$@ přečetl(a)";
"a11y_read_receipts_tap_to_show_all_ios" = "Klepnutím zobrazíte vše";
"a11y_remove_reaction" = "Odstraňit reakci s %1$@";
"a11y_remove_reaction_with" = "Odstranit reakci pomocí %1$@";
@@ -57,7 +50,6 @@
"a11y_start_call" = "Zahájit hovor";
"a11y_start_video_call" = "Zahájit videohovor";
"a11y_start_voice_call" = "Zahájit hlasový hovor";
"a11y_status" = "Status";
"a11y_tombstoned_room" = "Místnost s náhrobkem";
"a11y_user_menu" = "Uživatelské menu";
"a11y_video_preview" = "Video preview";
@@ -86,7 +78,6 @@
"action_choose_file" = "Vyberte soubor";
"action_choose_photo" = "Vybrat fotku";
"action_clear" = "Vymazat";
"action_clear_all" = "Clear all";
"action_close" = "Zavřít";
"action_complete_verification" = "Dokončit ověření";
"action_confirm" = "Potvrdit";
@@ -97,7 +88,6 @@
"action_copy_link" = "Kopírovat odkaz";
"action_copy_link_to_message" = "Kopírovat odkaz na zprávu";
"action_copy_text" = "Kopírovat text";
"action_copy_to_clipboard" = "Copy to clipboard";
"action_create" = "Vytvořit";
"action_create_room" = "Vytvořit místnost";
"action_create_space" = "Vytvořte prostor";
@@ -107,7 +97,7 @@
"action_decline_and_block" = "Odmítnout a zablokovat";
"action_delete" = "Smazat";
"action_delete_account" = "Smazat účet";
"action_delete_file" = "Smazat soubor";
"action_delete_file" = "Delete file";
"action_delete_poll" = "Odstranit hlasování";
"action_deselect_all" = "Odznačit vše";
"action_disable" = "Zakázat";
@@ -145,7 +135,6 @@
"action_manage_account_and_devices" = "Správa účtu a zařízení";
"action_manage_devices" = "Spravovat zařízení";
"action_manage_rooms" = "Spravovat místnosti";
"action_mark_as_read" = "Mark as read";
"action_message" = "Zpráva";
"action_minimize" = "Minimalizovat";
"action_next" = "Další";
@@ -210,7 +199,7 @@
"banner_migrate_to_native_sliding_sync_action" = "Odhlásit se a upgradovat";
"banner_migrate_to_native_sliding_sync_app_force_logout_title" = "%1$@ již nepodporuje starý protokol. Odhlaste se a znovu přihlaste, abyste mohli pokračovat v používání aplikace.";
"banner_migrate_to_native_sliding_sync_description" = "Váš server nyní podporuje nový, rychlejší protokol. Chcete-li upgradovat, odhlaste se a znovu se přihlaste. Pokud to uděláte nyní, pomůže vám vyhnout se nucenému odhlášení, když bude starý protokol později odstraněn.";
"banner_migrate_to_native_sliding_sync_force_logout_title" = "Váš poskytovatel účtu již nepodporuje starý protokol. Chcete-li aplikaci nadále používat, odhlaste se a znovu se přihlaste.";
"banner_migrate_to_native_sliding_sync_force_logout_title" = "Váš domovský server již nepodporuje starý protokol. Chcete-li pokračovat v používání aplikace, odhlaste se a znovu se přihlaste.";
"banner_migrate_to_native_sliding_sync_title" = "Upgrade k dispozici";
"banner_new_sound_message" = "Váš zvuk oznámení byl aktualizován – je jasnější, rychlejší a méně rušivý.";
"banner_new_sound_title" = "Aktualizovali jsme vaše zvuky";
@@ -220,7 +209,6 @@
"call_invalid_audio_device_bluetooth_devices_disabled" = "Element Call nepodporuje používání Bluetooth zvukových zařízení v této verzi systému Android. Vyberte jiné zvukové zařízení.";
"common_about" = "O aplikaci";
"common_acceptable_use_policy" = "Zásady používání";
"common_account_settings" = "Account settings";
"common_add_account" = "Přidat účet";
"common_add_another_account" = "Přidat další účet";
"common_adding_caption" = "Přidání titulku";
@@ -229,7 +217,6 @@
"common_analytics" = "Analytika";
"common_android_shortcuts_remove_reason_left_room" = "Opustili jste místnost";
"common_android_shortcuts_remove_reason_session_logged_out" = "Byli jste odhlášeni z relace";
"common_app_settings" = "App settings";
"common_appearance" = "Vzhled";
"common_audio" = "Zvuk";
"common_beta" = "Beta";
@@ -240,8 +227,6 @@
"common_call_started" = "Hovor zahájen";
"common_call_you_declined" = "Odmítli jste hovor";
"common_chat_backup" = "Záloha chatu";
"common_chats" = "Chats";
"common_code_block" = "Code block";
"common_copied_to_clipboard" = "Zkopírováno do schránky";
"common_copyright" = "Autorská práva";
"common_creating_room" = "Vytváření místnosti…";
@@ -279,12 +264,10 @@
"common_file_deleted" = "Soubor smazán";
"common_file_saved" = "Soubor uložen";
"common_forward_message" = "Přeposlat zprávu";
"common_forward_to" = "Forward to";
"common_frequently_used" = "Často používané";
"common_gallery" = "Gallery";
"common_gif" = "GIF";
"common_group_call_in_progress" = "Group call in progress";
"common_header_rooms" = "Rooms";
"common_image" = "Obrázek";
"common_in_reply_to" = "V odpovědi na %1$@";
"common_invite_unknown_profile" = "Tento Matrix identifikátor nelze najít, takže pozvánka nemusí být přijata.";
@@ -297,25 +280,20 @@
"common_live_location_ended" = "Sdílení aktuální polohy skončilo";
"common_loading" = "Načítání…";
"common_loading_more" = "Načítání dalších…";
"common_location_sharing" = "Location sharing";
"common_media_upload_quality" = "Media upload quality";
"common_message" = "Zpráva";
"common_message_actions" = "Akce zprávy";
"common_message_failed_to_send" = "Zprávu se nepodařilo odeslat";
"common_message_layout" = "Zobrazení zpráv";
"common_message_removed" = "Zpráva byla odstraněna";
"common_moderation_and_safety" = "Moderation & safety";
"common_modern" = "Moderní";
"common_mute" = "Ztlumit";
"common_name" = "Název";
"common_name_and_id" = "%1$@ (%2$@)";
"common_no_results" = "Žádné výsledky";
"common_no_results_for" = "There are no results for “%1$@”. Try a new search term.";
"common_no_room_name" = "Žádný název místnosti";
"common_no_space_name" = "Žádný název prostoru";
"common_not_encrypted" = "Nešifrováno";
"common_offline" = "Offline";
"common_on_a_call" = "On a call";
"common_open_source_licenses" = "Licence s otevřeným zdrojovým kódem";
"common_optic_id_ios" = "Optic ID";
"common_or" = "nebo";
@@ -329,7 +307,7 @@
"common_please_wait" = "Počkejte prosím...";
"common_poll_end_confirmation" = "Opravdu chcete ukončit toto hlasování?";
"common_poll_summary" = "Hlasování: %1$@";
"common_poll_summary_prefix" = "Hlasování";
"common_poll_summary_prefix" = "Poll";
"common_poll_total_votes" = "Celkový počet hlasů: %1$@";
"common_poll_undisclosed_text" = "Výsledky se zobrazí po skončení hlasování";
"common_preparing" = "Příprava…";
@@ -349,7 +327,6 @@
"common_replying_to" = "Odpověď na %1$@";
"common_report_a_problem" = "Nahlásit problém";
"common_report_submitted" = "Zpráva odeslána";
"common_results_for" = "Results for “%1$@”";
"common_rich_text_editor" = "Editor formátovaného textu";
"common_role" = "Role";
"common_room" = "Místnost";
@@ -377,7 +354,6 @@
"common_shared_live_location" = "Sdílená aktuální poloha";
"common_shared_location" = "Sdílená poloha";
"common_shared_space" = "Sdílený prostor";
"common_signed_in" = "Signed in";
"common_signing_out" = "Odebrání zařízení";
"common_something_went_wrong" = "Něco se nepovedlo";
"common_something_went_wrong_message" = "Narazili jsme na problém. Zkuste to prosím znovu.";
@@ -389,7 +365,6 @@
"common_success" = "Úspěch";
"common_suggested" = "Doporučeno";
"common_suggestions" = "Návrhy";
"common_switch_accounts" = "Switch accounts";
"common_syncing" = "Synchronizace";
"common_text" = "Text";
"common_third_party_notices" = "Oznámení třetích stran";
@@ -430,14 +405,12 @@
"common_waiting_live_location" = "Čekání na aktuální polohu…";
"common_world_readable_history" = "Kdokoli může vidět historii";
"common_you" = "Vy";
"common_your_account" = "Your account";
"confirm_recovery_key_banner_message" = "Potvrďte klíč pro obnovení, abyste zachovali přístup k úložišti klíčů a historii zpráv.";
"confirm_recovery_key_banner_primary_button_title" = "Zadejte klíč pro obnovení";
"confirm_recovery_key_banner_secondary_button_title" = "Zapomněli jste klíč pro obnovení?";
"confirm_recovery_key_banner_title" = "Vaše úložiště klíčů není synchronizováno";
"content_scanner_not_found" = "Download not available.";
"content_scanner_not_found_title" = "Something went wrong";
"content_scanner_scanning" = "Scanning…";
"content_scanner_not_found_title" = "File not found";
"content_scanner_unsafe_message" = "Preview and download have been disabled.";
"content_scanner_unsafe_title" = "The file is not safe";
"crash_detection_dialog_content" = "%1$@ havaroval při posledním použití. Chcete se s námi podělit o zprávu o selhání?";
@@ -499,7 +472,7 @@
"emoji_picker_category_recent" = "Nedávné emotikony";
"emoji_picker_category_symbols" = "Symboly";
"emoji_picker_search_placeholder" = "Hledat emotikony";
"error_account_creation_not_possible" = "Váš poskytovatel účtu musí být upgradeován, aby podporoval Matrix Authentication Service a vytváření účtů.";
"error_account_creation_not_possible" = "Váš domovský server je třeba upgradovat, aby podporoval službu Matrix Authentication Service a vytváření účtu.";
"error_failed_creating_the_permalink" = "Vytvoření trvalého odkazu se nezdařilo";
"error_failed_loading_map" = "%1$@ nemohl načíst mapu. Zkuste to prosím později.";
"error_failed_loading_messages" = "Načítání zpráv se nezdařilo";
@@ -511,11 +484,6 @@
"error_no_compatible_app_found" = "Nebyla nalezena žádná kompatibilní aplikace, která by tuto akci zpracovala.";
"error_room_address_already_exists" = "Tato adresa místnosti již existuje, zkuste prosím upravit pole adresy místnosti nebo změnit název místnosti";
"error_room_address_invalid_symbols" = "Některé znaky nejsou povoleny. Podporovány jsou pouze písmena, číslice a následující symboly ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _";
"error_sending_failure_invalid_mime_type" = "Invalid mime type: %@";
"error_sending_failure_missing_media_content" = "Missing media content";
"error_sending_failure_other" = "Error details: %@";
"error_sending_failure_sending_from_unverified_device" = "Sending from unverified device";
"error_sending_failure_unknown" = "Unknown error";
"error_some_messages_have_not_been_sent" = "Některé zprávy nebyly odeslány";
"error_unknown" = "Omlouváme se, došlo k chybě";
"error.account_already_logged_in" = "Na tomto zařízení jste již přihlášeni jako %1$@.";
@@ -545,8 +513,6 @@
"notification_invitation_action_reject" = "Odmítnout";
"notification_invite_body" = "Vás pozval(a) do chatu";
"notification_invite_body_with_sender" = "%1$@ vás pozval(a) do chatu";
"notification_knock_request_body" = "Requested to join";
"notification_live_location_started_body" = "Started sharing their live location";
"notification_mentioned_you_body" = "Zmínili vás: %1$@";
"notification_new_messages" = "Nové zprávy";
"notification_reaction_body" = "Reagoval(a) s %1$@";
@@ -559,7 +525,7 @@
"notification_sender_mention_reply" = "%1$@ zmínil(a) nebo odpověděl(a)";
"notification_space_invite_body" = "Pozvali vás do prostoru";
"notification_space_invite_body_with_sender" = "%1$@ vás pozvali do prostoru";
"notification_test_push_notification_content" = "Prohlížíte si oznámení! Klepněte na mě!";
"notification_test_push_notification_content" = "Prohlížíte si oznámení! Klikněte na mě!";
"notification_thread_in_room" = "Vlákno v %1$@";
"notification_ticker_text_dm" = "%1$@: %2$@";
"notification_ticker_text_group" = "%1$@: %2$@ %3$@";
@@ -634,8 +600,8 @@
"screen_advanced_settings_share_presence_description" = "Pokud je tato funkce vypnutá, nebudete moci odesílat ani přijímat potvrzení o přečtení ani upozornění o psaní.";
"screen_advanced_settings_show_media_timeline_always_hide" = "Vždy skrýt";
"screen_advanced_settings_show_media_timeline_always_show" = "Vždy zobrazit";
"screen_advanced_settings_show_media_timeline_private_rooms" = "Zobrazit v soukromých místnostech";
"screen_advanced_settings_show_media_timeline_subtitle" = "Skrytá média lze vždy zobrazit klepnutím na ně.";
"screen_advanced_settings_show_media_timeline_private_rooms" = "V soukromých místnostech";
"screen_advanced_settings_show_media_timeline_subtitle" = "Skryté médium lze vždy zobrazit klepnutím na něj";
"screen_advanced_settings_show_media_timeline_title" = "Zobrazit média na časové ose";
"screen_advanced_settings_view_source_description" = "Povolit možnost zobrazení zdroje zprávy na časové ose.";
"screen_analytics_prompt_data_usage" = "Nezaznamenáváme ani neprofilujeme žádné údaje o účtu";
@@ -711,8 +677,8 @@
"screen_bug_report_editor_placeholder" = "Popište chybu…";
"screen_bug_report_editor_supporting" = "Pokud je to možné, prosím, napište popis anglicky.";
"screen_bug_report_error_description_too_short" = "Popis je příliš krátký, uveďte prosím více podrobností o tom, co se stalo. Děkujeme!";
"screen_bug_report_github_issue_description" = "Můžete zadat číslo souvisejícího problému na GitHubu, pokud existuje.";
"screen_bug_report_github_issue_label" = "Issue na GitHubu";
"screen_bug_report_github_issue_description" = "You can enter the number of an associated GitHub issue, if any.";
"screen_bug_report_github_issue_label" = "GitHub issue";
"screen_bug_report_include_crash_logs" = "Odeslat záznamy o selhání";
"screen_bug_report_include_logs" = "Povolit protokoly";
"screen_bug_report_include_logs_error" = "Vaše protokoly jsou příliš velké, proto je nelze zahrnout do této zprávy. Zašlete nám je prosím jiným způsobem.";
@@ -729,7 +695,7 @@
"screen_change_server_error_element_pro_required_action_ios" = "App Store";
"screen_change_server_error_element_pro_required_message" = "Na %1$@ je vyžadována aplikace Element Pro. Stáhněte si ji prosím z obchodu.";
"screen_change_server_error_element_pro_required_title" = "Vyžadován Element Pro";
"screen_change_server_error_invalid_homeserver" = "Nepodařilo se nám spojit s tímto poskytovatelem účtu. Zkontrolujte prosím, zda jste správně zadali URL adresu poskytovatele účtu. Pokud je URL adresa správná, obraťte se na administrátora poskytovatele účtu, který vám poskytne další pomoc.";
"screen_change_server_error_invalid_homeserver" = "Nepodařilo se nám připojit k tomuto domovskému serveru. Zkontrolujte prosím, zda jste správně zadali adresu URL domovského serveru. Pokud je adresa URL správná, obraťte se na správce domovského serveru, který vám poskytne další pomoc.";
"screen_change_server_error_invalid_well_known" = "Server není k dispozici kvůli problému se souborem well-known:\n%1$@";
"screen_change_server_error_no_sliding_sync_message" = "Vybraný poskytovatel účtu nepodporuje klouzavou synchronizaci. Pro použití %1$@ je nutná aktualizace serveru.";
"screen_change_server_error_unauthorized_homeserver" = "Uživateli %1$@ není dovoleno se připojit do %2$@.";
@@ -737,16 +703,8 @@
"screen_change_server_error_unauthorized_homeserver_title" = "Poskytovatel účtu %1$@ není povolen.";
"screen_change_server_form_header" = "Adresa URL domovského serveru";
"screen_change_server_form_notice" = "Zadejte adresu domény.";
"screen_change_server_navigation_title_login" = "Sign in";
"screen_change_server_navigation_title_register" = "Create account";
"screen_change_server_subtitle" = "Jaká je adresa vašeho serveru?";
"screen_change_server_textfield_footer_login" = "If your account is provided by your company or a community, then change the account provider (example: companyname.com).";
"screen_change_server_textfield_footer_register" = "Create an account on matrix.org for free. If you want to create an account with a different provider, then change it accordingly (example: communityname.org).";
"screen_change_server_textfield_header" = "Account provider";
"screen_change_server_textfield_placeholder" = "example.com";
"screen_change_server_title" = "Vyberte váš server";
"screen_change_server_title_login" = "Enter your account provider";
"screen_change_server_title_register" = "Choose an account provider";
"screen_chat_backup_key_backup_action_disable" = "Vypnout zálohování";
"screen_chat_backup_key_backup_action_enable" = "Zapnout zálohování";
"screen_chat_backup_key_backup_description" = "To vám umožní zobrazit historii chatu na všech nových zařízeních a je to nutné pro zálohování chatů a digitální identity. %1$@ .";
@@ -793,7 +751,7 @@
"screen_create_room_private_option_description" = "Do této místnosti mohou vstoupit pouze pozvaní.";
"screen_create_room_private_option_title" = "Soukromé";
"screen_create_room_public_option_description" = "Tuto místnost může najít kdokoli.\nTo můžete kdykoli změnit v nastavení místnosti.";
"screen_create_room_public_option_short_description" = "Připojit se může kdokoli, včetně osob mimo vaši organizaci.";
"screen_create_room_public_option_short_description" = "Vstoupit může kdokoli.";
"screen_create_room_public_option_title" = "Veřejné";
"screen_create_room_room_access_section_knocking_option_description" = "Kdokoli může požádat o vstup do místnosti, ale správce nebo moderátor bude muset žádost přijmout.";
"screen_create_room_room_access_section_knocking_option_title" = "Povolit žádost o vstup";
@@ -801,7 +759,7 @@
"screen_create_room_room_access_section_knocking_restricted_option_title" = "Požádat o vstup";
"screen_create_room_room_access_section_private_option_description" = "Vstoupit mohou pouze pozvaní lidé.";
"screen_create_room_room_access_section_private_option_title" = "Soukromé";
"screen_create_room_room_access_section_public_option_description" = "Připojit se může kdokoli, včetně osob mimo vaši organizaci.";
"screen_create_room_room_access_section_public_option_description" = "Vstoupit může kdokoli.";
"screen_create_room_room_access_section_public_option_title" = "Veřejné";
"screen_create_room_room_access_section_restricted_option_description" = "Kdokoli může vstoupit do %1$@.";
"screen_create_room_room_access_section_restricted_option_title" = "Standard";
@@ -817,8 +775,8 @@
"screen_create_room_topic_placeholder" = "Přidat popis…";
"screen_custom_recovery_key_confirm_error_mismatch" = "The recovery key you entered doesn't match";
"screen_custom_recovery_key_confirm_submit" = "Finish setup";
"screen_custom_recovery_key_confirm_subtitle" = "Zadejte znovu svůj klíč pro obnovení.";
"screen_custom_recovery_key_confirm_title" = "Potvrďte svůj klíč pro obnovení";
"screen_custom_recovery_key_confirm_subtitle" = "Enter your recovery key again.";
"screen_custom_recovery_key_confirm_title" = "Confirm your recovery key";
"screen_custom_recovery_key_input_strength" = "Strength";
"screen_custom_recovery_key_input_strength_a11y" = "Passphrase strength: %1$@";
"screen_custom_recovery_key_input_strength_moderate" = "Moderate";
@@ -826,12 +784,12 @@
"screen_custom_recovery_key_input_strength_very_strong" = "Very strong";
"screen_custom_recovery_key_input_strength_very_weak" = "Very weak";
"screen_custom_recovery_key_input_strength_weak" = "Weak";
"screen_custom_recovery_key_input_subtitle" = "Vyberte si klíč pro obnovení, který si budete moci zapamatovat.";
"screen_custom_recovery_key_input_title" = "Zadejte klíč pro obnovení";
"screen_custom_recovery_key_input_subtitle" = "Choose a recovery key that you can memorize.";
"screen_custom_recovery_key_input_title" = "Enter a recovery key";
"screen_custom_recovery_key_loading_a11y" = "Loading recovery key requirements";
"screen_custom_recovery_key_success_notice" = "To change your recovery key, go to Settings → Encryption → Backup";
"screen_custom_recovery_key_success_subtitle" = "Pomocí svého klíče pro obnovení můžete potvrdit nová zařízení nebo obnovit šifrované chaty, pokud ztratíte přístup ke všem svým zařízením.";
"screen_custom_recovery_key_success_title" = "Vaše záloha je nyní plně nastavena";
"screen_custom_recovery_key_success_subtitle" = "You can use your recovery key to confirm new devices or restore your encrypted chats if you lose access to all your devices.";
"screen_custom_recovery_key_success_title" = "Your backup is now fully set up";
"screen_deactivate_account_confirmation_dialog_content" = "Potvrďte prosím, že chcete smazat svůj účet. Tuto akci nelze vrátit zpět.";
"screen_deactivate_account_delete_all_messages" = "Smazat všechny mé zprávy";
"screen_deactivate_account_delete_all_messages_notice" = "Upozornění: Budoucí uživatelé mohou vidět neúplné konverzace.";
@@ -871,7 +829,7 @@
"screen_encryption_reset_bullet_3" = "Budete muset znovu ověřit všechna stávající zařízení a kontakty";
"screen_encryption_reset_footer" = "Digitální identitu resetujte pouze v případě, že nemáte přístup k jinému ověřenému zařízení a nemáte klíč pro obnovení.";
"screen_encryption_reset_title" = "Nelze potvrdit? Budete muset resetovat svou digitální identitu.";
"screen_home_tab_chats" = "Chaty";
"screen_home_tab_chats" = "Všechny chaty";
"screen_home_tab_spaces" = "Prostory";
"screen_identity_confirmation_cannot_confirm" = "Nemůžete potvrdit?";
"screen_identity_confirmation_create_new_recovery_key" = "Vytvoření nového klíče pro obnovení";
@@ -883,14 +841,14 @@
"screen_identity_confirmed_title" = "Zařízení ověřeno";
"screen_identity_use_another_device" = "Použít jiné zařízení";
"screen_identity_waiting_on_other_device" = "Čekání na jiném zařízení...";
"screen_image_edition_a11y_flip_image_horizontally" = "Otočit obrázek vodorovně";
"screen_image_edition_a11y_flip_image_horizontally_state_flipped" = "Otočeno vodorovně";
"screen_image_edition_a11y_flip_image_horizontally_state_original" = "Originál";
"screen_image_edition_a11y_flip_image_vertically" = "Otočit obrázek svisle";
"screen_image_edition_a11y_flip_image_vertically_state_flipped" = "Otočeno svisle ";
"screen_image_edition_a11y_flip_image_vertically_state_original" = "Originál";
"screen_image_edition_a11y_rotate_to_the_left" = "Otočit obrázek doleva";
"screen_image_edition_title" = "Upravit fotku";
"screen_image_edition_a11y_flip_image_horizontally" = "Flip image horizontally";
"screen_image_edition_a11y_flip_image_horizontally_state_flipped" = "Flipped horizontally";
"screen_image_edition_a11y_flip_image_horizontally_state_original" = "Original";
"screen_image_edition_a11y_flip_image_vertically" = "Flip image vertically";
"screen_image_edition_a11y_flip_image_vertically_state_flipped" = "Flipped vertically";
"screen_image_edition_a11y_flip_image_vertically_state_original" = "Original";
"screen_image_edition_a11y_rotate_to_the_left" = "Rotate the image to the left";
"screen_image_edition_title" = "Edit photo";
"screen_invite_users_already_a_member" = "Již členem";
"screen_invite_users_already_invited" = "Již pozván(a)";
"screen_invite_users_confirm_dialog_subtitle_multiple_users" = "Momentálně s těmito kontakty nemáte žádné chaty. Před pokračováním potvrďte jejich pozvání do této místnosti.";
@@ -930,7 +888,7 @@
"screen_join_room_loading_alert_title" = "Náhled této místnosti jsme nemohli zobrazit";
"screen_join_room_space_not_supported_description" = "%1$@ zatím nepodporuje prostory. Prostory můžete používat na webu.";
"screen_join_room_space_not_supported_title" = "Prostory zatím nejsou podporovány";
"screen_join_room_subtitle_knock" = "Klepněte na tlačítko níže a správce místnosti bude informován. Po schválení se budete moci připojit ke konverzaci.";
"screen_join_room_subtitle_knock" = "Klikněte na tlačítko níže a správce místnosti bude informován. Po schválení se budete moci připojit ke konverzaci.";
"screen_join_room_subtitle_no_preview" = "Pro zobrazení historie zpráv musíte být členem této místnosti.";
"screen_join_room_title_knock" = "Chcete se připojit k této místnosti?";
"screen_join_room_title_no_preview" = "Náhled není k dispozici";
@@ -966,10 +924,6 @@
"screen_knock_requests_list_empty_state_title" = "Žádná čekající žádost o vstup";
"screen_knock_requests_list_initial_loading_title" = "Načítání žádostí o vstup...";
"screen_knock_requests_list_title" = "Žádosti o vstup";
"screen_labs_enable_gallery" = "Gallery messages";
"screen_labs_enable_gallery_description" = "Send multiple images or videos in one go. Stable on mobile, but not yet supported by web.";
"screen_labs_enable_knocking" = "Ask to join";
"screen_labs_enable_knocking_description" = "Users can request access to a room that is not open for anyone to join. Stable on mobile, web implementation exists but is experimental.";
"screen_labs_enable_threads" = "Povolit odpovědi ve vlákně";
"screen_labs_enable_threads_description" = "Aplikace se restartuje, aby se tato změna projevila.";
"screen_labs_header_description" = "Vyzkoušejte naše nejnovější nápady, které jsou ve vývoji. Tyto funkce nejsou finalizované; mohou být nestabilní a mohou se změnit.";
@@ -990,7 +944,6 @@
"screen_link_new_device_desktop_step3" = "Naskenujte QR kód pomocí tohoto zařízení";
"screen_link_new_device_desktop_submit" = "Připraveno ke skenování";
"screen_link_new_device_desktop_title" = "Otevřete %1$@ na stolním počítači a získejte QR kód";
"screen_link_new_device_desktop_warning" = "Only scan a QR code after following the steps above on your own device. Never scan a code sent by another person.";
"screen_link_new_device_enter_number_error_numbers_do_not_match" = "Čísla se neshodují";
"screen_link_new_device_enter_number_notice" = "Zadejte dvoumístný kód";
"screen_link_new_device_enter_number_subtitle" = "Tím ověříte, zda je připojení k druhému zařízení bezpečné.";
@@ -1017,13 +970,11 @@
"screen_live_location_sheet_nobody_sharing" = "Nikdo nesdílí svou polohu";
"screen_live_location_sheet_sharing_live_location" = "Sdílení aktuální polohy";
"screen_live_location_sheet_title" = "Na mapě";
"screen_local_network_opt_in_subtitle" = "Your homeserver is on your local network. To connect, %1$@ needs permission to reach devices on this network.";
"screen_local_network_opt_in_title" = "Allow access to local network";
"screen_login_error_deactivated_account" = "Tento účet byl smazán.";
"screen_login_error_invalid_credentials" = "Nesprávné uživatelské jméno nebo heslo";
"screen_login_error_invalid_user_id" = "Toto není platný identifikátor uživatele. Očekávaný formát: '@user:homeserver.org'";
"screen_login_error_refresh_tokens" = "Tento server je nakonfigurován tak, aby používal obnovovací tokeny. Ty nejsou podporovány při použití přihlašovacích údajů založených na hesle.";
"screen_login_error_unsupported_authentication" = "Vybraný poskytovatel účtu nepodporuje přihlášení pomocí hesla ani OAuth. Kontaktujte prosím svého poskytovatele účtu nebo zvolte jiného.";
"screen_login_error_unsupported_authentication" = "Vybraný domovský server nepodporuje přihlášení pomocí hesla nebo OAuth. Kontaktujte prosím svého správce nebo vyberte jiný domovský server.";
"screen_login_form_header" = "Zadejte své údaje";
"screen_login_subtitle" = "Matrix je otevřená síť pro bezpečnou a decentralizovanou komunikaci.";
"screen_login_title" = "Vítejte zpět!";
@@ -1063,26 +1014,20 @@
"screen_media_upload_preview_item_count" = "Položka %1$d z %2$d";
"screen_media_upload_preview_optimize_image_quality_title" = "Optimalizace kvality obrazu";
"screen_media_upload_preview_processing" = "Probíhá zpracování…";
"screen_media_upload_preview_title" = "Přidat média";
"screen_media_upload_preview_title" = "Add media";
"screen_migration_message" = "Jedná se o jednorázový proces, prosíme o strpení.";
"screen_migration_title" = "Nastavení vašeho účtu";
"screen_missing_key_backup_open_element_classic" = "Otevřít Element Classic";
"screen_missing_key_backup_step_1" = "Otevřete Element Classic na svém zařízení";
"screen_missing_key_backup_step_2_ios" = "Přejděte do Nastavení uživatele > Zabezpečení";
"screen_missing_key_backup_step_3_ios" = "Přejděte dolů na položku Zálohování chatu a klepněte na Nastavit";
"screen_missing_key_backup_step_3_ios" = "Přejděte dolů na Bezpečné zálohování a klepněte na Nastavení";
"screen_missing_key_backup_step_4" = "Postupujte podle pokynů k povolení úložiště klíčů";
"screen_missing_key_backup_step_5" = "Vraťte se do %1$@";
"screen_missing_key_backup_title" = "Povolte úložiště klíčů, než budete pokračovat na %1$@";
"screen_moderation_and_safety_invites_heading" = "Invites";
"screen_moderation_and_safety_other_users_heading" = "Other users";
"screen_moderation_and_safety_share_presence_heading" = "Your appearance";
"screen_multi_account_announcement_action" = "Add account";
"screen_multi_account_announcement_description" = "Go to %1$@ to sign into another account. Then you can easily switch between them.";
"screen_multi_account_announcement_title" = "You can now add multiple accounts";
"screen_notification_optin_subtitle" = "Nastavení můžete později změnit.";
"screen_notification_optin_title" = "Povolte oznámení a nezmeškejte žádnou zprávu";
"screen_notification_settings_additional_settings_section_title" = "Další nastavení";
"screen_notification_settings_call_ringtone_label" = "Vyzváněcí tón hovoru";
"screen_notification_settings_call_ringtone_label" = "Call ringtone";
"screen_notification_settings_calls_label" = "Halsové a video hovory";
"screen_notification_settings_configuration_mismatch" = "Neshoda konfigurace";
"screen_notification_settings_configuration_mismatch_description" = "Zjednodušili jsme nastavení oznámení, abychom usnadnili hledání možností. \n\nNěkterá vlastní nastavení, která jste si vybrali v minulosti, se zde nezobrazují, ale jsou stále aktivní. \n\nPokud budete pokračovat, některá nastavení se mohou změnit.";
@@ -1097,56 +1042,54 @@
"screen_notification_settings_failed_fixing_configuration" = "Konfigurace nebyla opravena, zkuste to prosím znovu.";
"screen_notification_settings_group_chats" = "Skupinové chaty";
"screen_notification_settings_invite_for_me_label" = "Pozvánky";
"screen_notification_settings_mentions_only_disclaimer" = "Váš poskytovatel účtu tuto možnost v encrypted chatech nepodporuje, v některých chatech se vám proto nemusí zobrazovat oznámení.";
"screen_notification_settings_mentions_only_disclaimer" = "Váš domovský server tuto možnost v zašifrovaných místnostech nepodporuje, v některých místnostech nemusíte být upozorněni.";
"screen_notification_settings_mentions_section_title" = "Zmínky";
"screen_notification_settings_message_sound_dialog_choose_other" = "Vyberte jiný zvuk…";
"screen_notification_settings_message_sound_dialog_current_subtitle" = "Aktuálně používáte %1$@";
"screen_notification_settings_message_sound_dialog_title" = "Zvuk zprávy";
"screen_notification_settings_message_sound_label" = "Zvuk zprávy";
"screen_notification_settings_message_sound_dialog_choose_other" = "Choose another sound…";
"screen_notification_settings_message_sound_dialog_current_subtitle" = "Currently using %1$@";
"screen_notification_settings_message_sound_dialog_title" = "Message sound";
"screen_notification_settings_message_sound_label" = "Message sound";
"screen_notification_settings_mode_all" = "Vše";
"screen_notification_settings_mode_mentions" = "Zmínky";
"screen_notification_settings_notification_section_title" = "Upozornit mě na";
"screen_notification_settings_room_mention_label" = "Zmínky o @room";
"screen_notification_settings_show_all_activity_subtitle" = "Dots or number of unread messages";
"screen_notification_settings_show_all_activity_title" = "Show all activity in the room list";
"screen_notification_settings_sound_custom_fallback" = "Vlastní";
"screen_notification_settings_sound_custom_sound_button_title" = "Vlastní zvuk...";
"screen_notification_settings_sound_delete_sound_error_title" = "Chyba při mazání souboru";
"screen_notification_settings_sound_element_default" = "Výchozí nastavení Elementu";
"screen_notification_settings_room_mention_label" = "Upozornit mě na @room";
"screen_notification_settings_sound_custom_fallback" = "Custom";
"screen_notification_settings_sound_custom_sound_button_title" = "Custom sound...";
"screen_notification_settings_sound_delete_sound_error_title" = "Error deleting file";
"screen_notification_settings_sound_element_default" = "Element Default";
"screen_notification_settings_sound_element_fade" = "Element Fade";
"screen_notification_settings_sound_import_sound_error_title" = "Chyba při importu souboru";
"screen_notification_settings_sound_preview_sound_error_title" = "Problém s náhledem zvuku upozornění";
"screen_notification_settings_sound_section_title" = "Zvuk";
"screen_notification_settings_sound_set_sound_error_dismiss_a11y" = "Zrušit chybu zvukového upozornění";
"screen_notification_settings_sound_set_sound_error_title" = "Problém s nastavením zvuku upozornění";
"screen_notification_settings_sound_silent" = "Tichý";
"screen_notification_settings_sound_system_alert_ios" = "Upozornění";
"screen_notification_settings_sound_system_anticipate_ios" = "Předvídat";
"screen_notification_settings_sound_system_bell_ios" = "Zvon";
"screen_notification_settings_sound_system_bloom_ios" = "Květ";
"screen_notification_settings_sound_import_sound_error_title" = "Error importing file";
"screen_notification_settings_sound_preview_sound_error_title" = "Problem previewing alert sound";
"screen_notification_settings_sound_section_title" = "Sound";
"screen_notification_settings_sound_set_sound_error_dismiss_a11y" = "Dismiss alert sound error";
"screen_notification_settings_sound_set_sound_error_title" = "Problem setting alert sound";
"screen_notification_settings_sound_silent" = "Silent";
"screen_notification_settings_sound_system_alert_ios" = "Alert";
"screen_notification_settings_sound_system_anticipate_ios" = "Anticipate";
"screen_notification_settings_sound_system_bell_ios" = "Bell";
"screen_notification_settings_sound_system_bloom_ios" = "Bloom";
"screen_notification_settings_sound_system_calypso_ios" = "Calypso";
"screen_notification_settings_sound_system_chime_ios" = "Rozeznít";
"screen_notification_settings_sound_system_chime_ios" = "Chime";
"screen_notification_settings_sound_system_choo_choo_ios" = "Choo Choo";
"screen_notification_settings_sound_system_default" = "Výchozí nastavení systému";
"screen_notification_settings_sound_system_descent_ios" = "Klesání";
"screen_notification_settings_sound_system_electronic_ios" = "Elektronický";
"screen_notification_settings_sound_system_fanfare_ios" = "Fanfára";
"screen_notification_settings_sound_system_glass_ios" = "Sklo";
"screen_notification_settings_sound_system_horn_ios" = "Roh";
"screen_notification_settings_sound_system_ladder_ios" = "Žebřík";
"screen_notification_settings_sound_system_default" = "System Default";
"screen_notification_settings_sound_system_descent_ios" = "Descent";
"screen_notification_settings_sound_system_electronic_ios" = "Electronic";
"screen_notification_settings_sound_system_fanfare_ios" = "Fanfare";
"screen_notification_settings_sound_system_glass_ios" = "Glass";
"screen_notification_settings_sound_system_horn_ios" = "Horn";
"screen_notification_settings_sound_system_ladder_ios" = "Ladder";
"screen_notification_settings_sound_system_minuet_ios" = "Minuet";
"screen_notification_settings_sound_system_news_flash_ios" = "Bleskové zprávy";
"screen_notification_settings_sound_system_news_flash_ios" = "News Flash";
"screen_notification_settings_sound_system_noir_ios" = "Noir";
"screen_notification_settings_sound_system_sherwood_forest_ios" = "Sherwoodský les";
"screen_notification_settings_sound_system_spell_ios" = "Kouzlo";
"screen_notification_settings_sound_system_suspense_ios" = "Napětí";
"screen_notification_settings_sound_system_swish_ios" = "Svištění";
"screen_notification_settings_sound_system_telegraph_ios" = "Telegraf";
"screen_notification_settings_sound_system_sherwood_forest_ios" = "Sherwood Forest";
"screen_notification_settings_sound_system_spell_ios" = "Spell";
"screen_notification_settings_sound_system_suspense_ios" = "Suspense";
"screen_notification_settings_sound_system_swish_ios" = "Swish";
"screen_notification_settings_sound_system_telegraph_ios" = "Telegraph";
"screen_notification_settings_sound_system_tiptoes_ios" = "Tiptoes";
"screen_notification_settings_sound_system_tri_tone_ios" = "Třítónový";
"screen_notification_settings_sound_system_tri_tone_ios" = "Tri-tone";
"screen_notification_settings_sound_system_tweet_ios" = "Tweet";
"screen_notification_settings_sound_system_typewriters_ios" = "Psací stroje";
"screen_notification_settings_sound_system_update_ios" = "Aktualizace";
"screen_notification_settings_sound_system_typewriters_ios" = "Typewriters";
"screen_notification_settings_sound_system_update_ios" = "Update";
"screen_notification_settings_system_notifications_action_required" = "Chcete-li dostávat oznámení, změňte prosím svůj %1$@.";
"screen_notification_settings_system_notifications_action_required_content_link" = "systémová nastavení";
"screen_notification_settings_system_notifications_turned_off" = "Systémová oznámení byla vypnuta";
@@ -1169,14 +1112,6 @@
"screen_polls_history_filter_ongoing" = "Probíhající";
"screen_polls_history_filter_past" = "Minulé";
"screen_polls_history_title" = "Hlasování";
"screen_ptt_settings_battery_optimization" = "Ignore battery optimisation";
"screen_ptt_settings_battery_optimization_description" = "Stay active in background";
"screen_ptt_settings_covert_mode" = "Covert mode";
"screen_ptt_settings_covert_mode_description" = "Mute all channels";
"screen_ptt_settings_lock_screen" = "Show on lock screen";
"screen_ptt_settings_lock_screen_description" = "Access from the lock screen";
"screen_ptt_settings_system_overlay" = "Enable system overlay";
"screen_ptt_settings_system_overlay_description" = "Access a floating action button";
"screen_push_history_title" = "Historie push oznámení";
"screen_qr_code_login_connecting_subtitle" = "Navazování zabezpečeného spojení";
"screen_qr_code_login_connection_note_secure_state_description" = "K novému zařízení se nepodařilo navázat bezpečné připojení. Vaše stávající zařízení jsou stále v bezpečí a nemusíte se o ně obávat.";
@@ -1250,11 +1185,11 @@
"screen_recovery_key_setup_title" = "Získat klíč pro obnovení";
"screen_report_content_block_user" = "Zablokovat uživatele";
"screen_report_content_block_user_hint" = "Zaškrtněte, pokud chcete skrýt všechny aktuální a budoucí zprávy od tohoto uživatele";
"screen_report_content_explanation" = "Tato zpráva bude nahlášena vašemu poskytovateli účtu. Nebude moci číst žádné šifrované zprávy.";
"screen_report_content_explanation" = "Tato zpráva bude nahlášena správci vašeho domovského serveru. Nebude si moci přečíst žádné šifrované zprávy.";
"screen_report_content_hint" = "Důvod nahlášení tohoto obsahu";
"screen_report_room_leave_failed_alert_message" = "Vaše hlášení bylo úspěšně odesláno, ale při pokusu o opuštění místnosti jsme narazili na problém. Zkuste to prosím znovu.";
"screen_report_room_leave_failed_alert_title" = "Nelze opustit místnost";
"screen_report_room_reason_footer" = "Nahlaste tento chat poskytovateli vašeho účtu. Pokud jsou zprávy šifrované, poskytovatel vašeho účtu si je nebude moci přečíst.";
"screen_report_room_reason_footer" = "Nahlaste tuto místnost svému administrátorovi. Pokud jsou zprávy zašifrované, váš administrátor je nebude moci číst.";
"screen_report_room_reason_placeholder" = "Popište důvod...";
"screen_report_room_title" = "Nahlásit místnost";
"screen_reset_encryption_confirmation_alert_action" = "Ano, resetovat nyní";
@@ -1321,14 +1256,7 @@
"screen_room_change_role_section_users" = "Členové";
"screen_room_change_role_unsaved_changes_description" = "Máte neuložené změny.";
"screen_room_change_role_unsaved_changes_title" = "Uložit změny?";
"screen_room_confirm_removal_reason_label" = "Reason (optional)";
"screen_room_confirm_removal_reason_placeholder" = "Enter reason…";
"screen_room_confirm_removal_reason_supporting_text" = "(Optional)";
"screen_room_confirm_removal_title" = "Remove message?";
"screen_room_details_add_topic_title" = "Přidat téma";
"screen_room_details_audio_push_to_talk" = "Push to talk";
"screen_room_details_audio_title" = "Room Audio";
"screen_room_details_audio_video_calls" = "Video calls";
"screen_room_details_badge_encrypted" = "Šifrováno";
"screen_room_details_badge_not_encrypted" = "Není šifrováno";
"screen_room_details_badge_public" = "Veřejná místnost";
@@ -1354,9 +1282,6 @@
"screen_room_details_profile_row_title" = "Profil";
"screen_room_details_requests_to_join_title" = "Žádosti o vstup";
"screen_room_details_roles_and_permissions" = "Role a oprávnění";
"screen_room_details_room_audio_ptt" = "Push to talk";
"screen_room_details_room_audio_title" = "Room Audio";
"screen_room_details_room_audio_video_calls" = "Video calls";
"screen_room_details_room_name_label" = "Název";
"screen_room_details_security_and_privacy_title" = "Zabezpečení a soukromí";
"screen_room_details_security_title" = "Zabezpečení";
@@ -1376,7 +1301,6 @@
"screen_room_invite_again_alert_message" = "Chtěli byste je pozvat zpět?";
"screen_room_invite_again_alert_title" = "V tomto chatu jste sami";
"screen_room_live_location_banner" = "Sdílení aktuální polohy";
"screen_room_maximum_messages_selected" = "Maximum messages selected";
"screen_room_member_details_block_alert_action" = "Zablokovat";
"screen_room_member_details_block_alert_description" = "Blokovaní uživatelé vám nebudou moci posílat zprávy a všechny jejich zprávy budou skryty. Můžete je kdykoli odblokovat.";
"screen_room_member_details_block_user" = "Zablokovat uživatele";
@@ -1415,10 +1339,9 @@
"screen_room_notification_settings_error_loading_settings" = "Při načítání nastavení oznámení došlo k chybě.";
"screen_room_notification_settings_error_restoring_default" = "Obnovení výchozího režimu se nezdařilo, zkuste to prosím znovu.";
"screen_room_notification_settings_error_setting_mode" = "Nastavení režimu se nezdařilo, zkuste to prosím znovu.";
"screen_room_notification_settings_mentions_only_disclaimer" = "Váš poskytovatel účtu tuto možnost v encrypted chatech nepodporuje, v tomto chatu tedy nebudete dostávat oznámení.";
"screen_room_notification_settings_mentions_only_disclaimer" = "Váš domovský server tuto možnost nepodporuje v šifrovaných místnostech, v této místnosti nebudete dostávat upozornění.";
"screen_room_notification_settings_mode_all_messages" = "Všechny zprávy";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Pouze zmínky a odpovědi";
"screen_room_notification_settings_mode_mute" = "Mute";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Pouze zmínky a klíčová slova";
"screen_room_notification_settings_room_custom_settings_title" = "V této místnosti mě upozornit na";
"screen_room_pinned_banner_indicator" = "%1$@ z %2$@";
"screen_room_pinned_banner_indicator_description" = "%1$@ Připnuté zprávy";
@@ -1443,7 +1366,6 @@
"screen_room_roles_and_permissions_room_details" = "Podrobnosti místnosti";
"screen_room_roles_and_permissions_space_details" = "Detaily prostoru";
"screen_room_roles_and_permissions_title" = "Role a oprávnění";
"screen_room_select_error_cannot_load_rooms" = "The room list associated with this account cannot be loaded.";
"screen_room_single_knock_request_accept_button_title" = "Přijmout";
"screen_room_single_knock_request_title" = "%1$@ chce vstoupit do této místnosti";
"screen_room_single_knock_request_view_button_title" = "Zobrazit";
@@ -1480,8 +1402,6 @@
"screen_roomlist_filter_invites_empty_state_title" = "Nemáte žádné nevyřízené pozvánky.";
"screen_roomlist_filter_low_priority" = "Nízká priorita";
"screen_roomlist_filter_low_priority_empty_state_title" = "Zatím nemáte žádné chaty s nízkou prioritou";
"screen_roomlist_filter_mention" = "Mention";
"screen_roomlist_filter_mention_empty_state_title" = "You don’t have any unread mentions";
"screen_roomlist_filter_mixed_empty_state_subtitle" = "Můžete zrušit výběr filtrů, abyste viděli své další chaty";
"screen_roomlist_filter_mixed_empty_state_title" = "Nemáte chaty pro tento výběr";
"screen_roomlist_filter_people" = "Lidé";
@@ -1491,7 +1411,7 @@
"screen_roomlist_filter_unreads" = "Nepřečtené";
"screen_roomlist_filter_unreads_empty_state_title" = "Gratulujeme!\nNemáte žádné nepřečtené zprávy!";
"screen_roomlist_knock_event_sent_description" = "Žádost o vstup odeslána";
"screen_roomlist_main_space_title" = "Chaty";
"screen_roomlist_main_space_title" = "Všechny chaty";
"screen_roomlist_mark_as_read" = "Označit jako přečtené";
"screen_roomlist_mark_as_unread" = "Označit jako nepřečtené";
"screen_roomlist_tombstoned_room_description" = "Tato místnost byla aktualizována";
@@ -1507,7 +1427,7 @@
"screen_security_and_privacy_encryption_section_footer" = "Jakmile je povoleno, šifrování nelze zakázat.";
"screen_security_and_privacy_encryption_section_header" = "Šifrování";
"screen_security_and_privacy_encryption_toggle_title" = "Povolit koncové šifrování";
"screen_security_and_privacy_room_access_anyone_option_description" = "Připojit se může kdokoli, včetně osob mimo vaši organizaci.";
"screen_security_and_privacy_room_access_anyone_option_description" = "Vstoupit může kdokoli.";
"screen_security_and_privacy_room_access_anyone_option_title" = "Kdokoli";
"screen_security_and_privacy_room_access_footer" = "Vyberte, kteří členové prostorů mohou vstoupit do této místnosti bez pozvánky. %1$@";
"screen_security_and_privacy_room_access_footer_manage_spaces_action" = "Spravovat prostory";
@@ -1568,13 +1488,10 @@
"screen_session_verification_request_title" = "Požadováno ověření";
"screen_session_verification_they_dont_match" = "Neshodují se";
"screen_session_verification_they_match" = "Shodují se";
"screen_session_verification_unavailable_subtitle" = "Please use another device or recovery key.";
"screen_session_verification_unavailable_title" = "Verification with this device is currently unavailable";
"screen_session_verification_use_another_device_subtitle" = "Před zahájením ověřování se ujistěte, že máte aplikaci otevřenou na druhém zařízení.";
"screen_session_verification_use_another_device_title" = "Otevřete aplikaci na jiném ověřeném zařízení";
"screen_session_verification_user_initiator_subtitle" = "Pro větší bezpečnost ověřte tohoto uživatele porovnáním sady emotikonů na svých zařízeních. Proveďte to pomocí důvěryhodného způsobu komunikace.";
"screen_session_verification_user_initiator_title" = "Ověřte tohoto uživatele?";
"screen_session_verification_user_requesting_verification" = "User requesting verification:";
"screen_session_verification_user_responder_subtitle" = "Z důvodu zvýšené bezpečnosti chce jiný uživatel ověřit vaši digitální identitu. Zobrazí se vám sada emodži, které je třeba porovnat.";
"screen_session_verification_waiting_another_device_subtitle" = "Na druhém zařízení byste měli vidět vyskakovací okno. Začněte s ověrením tam.";
"screen_session_verification_waiting_another_device_title" = "Spusťte ověření na druhém zařízení";
@@ -1583,15 +1500,6 @@
"screen_session_verification_waiting_subtitle" = "Po přijetí budete moci pokračovat v ověřování.";
"screen_session_verification_waiting_to_accept_subtitle" = "Pro pokračování přijměte požadavek na zahájení ověření v jiné relaci.";
"screen_session_verification_waiting_to_accept_title" = "Čekání na přijetí žádosti";
"screen_settings_add_account" = "Add account";
"screen_settings_user_status_away" = "Away";
"screen_settings_user_status_be_right_back" = "Be right back";
"screen_settings_user_status_custom" = "Custom…";
"screen_settings_user_status_custom_hint" = "Custom status…";
"screen_settings_user_status_focus_time" = "Focus time";
"screen_settings_user_status_in_a_meeting" = "In a meeting";
"screen_settings_user_status_on_the_road" = "On the road";
"screen_settings_user_status_placeholder" = "What's your status?";
"screen_share_location_live_location_disclaimer_title" = "Vaše historie aktuální polohy bude uložena v místnosti a bude viditelná pro členy i po skončení relace.";
"screen_share_location_live_location_duration_picker_title" = "Zvolte, jak dlouho chcete sdílet svou aktuální polohu.";
"screen_share_location_live_location_missing_permissions" = "Nemáte oprávnění sdílet svou aktuální polohu v této místnosti.";
@@ -1606,7 +1514,6 @@
"screen_signed_out_reason_2" = "Odstranili jste relaci z jiné relace";
"screen_signed_out_reason_3" = "Správce vašeho serveru zrušil váš přístup";
"screen_signed_out_subtitle" = "Je možné, že jste byli odhlášeni z některého z níže uvedených důvodů. Chcete-li pokračovat v používání %@, přihlaste se znovu.";
"screen_signed_out_subtitle_v2" = "This device was removed for one of the reasons listed below. Please sign in again to connect this device to your account.";
"screen_signed_out_title" = "Jste odhlášeni";
"screen_signout_confirmation_dialog_content" = "Opravdu chcete odstranit toto zařízení?";
"screen_signout_confirmation_dialog_submit" = "Odebrat toto zařízení";
@@ -1640,7 +1547,7 @@
"screen_start_chat_error_starting_chat" = "Při pokusu o zahájení chatu došlo k chybě";
"screen_start_chat_join_room_by_address_action" = "Vstoupit do místnosti pomocí adresy";
"screen_start_chat_join_room_by_address_invalid_address" = "Neplatná adresa";
"screen_start_chat_join_room_by_address_placeholder" = "Zadejte adresu…";
"screen_start_chat_join_room_by_address_placeholder" = "Zadejte...";
"screen_start_chat_join_room_by_address_room_found" = "Odpovídající místnost nalezena";
"screen_start_chat_join_room_by_address_room_not_found" = "Místnost nebyla nalezena";
"screen_start_chat_join_room_by_address_supporting_text" = "např. #room-name:matrix.org";
@@ -1769,7 +1676,7 @@
"troubleshoot_notifications_test_display_notification_permission_failure" = "Oznámení nelze zobrazit.";
"troubleshoot_notifications_test_display_notification_success" = "Na oznámení bylo kliknuto!";
"troubleshoot_notifications_test_display_notification_title" = "Zobrazit oznámení";
"troubleshoot_notifications_test_display_notification_waiting" = "Klepnutím na oznámení pokračujte v testu.";
"troubleshoot_notifications_test_display_notification_waiting" = "Kliknutím na oznámení pokračujte v testu.";
"troubleshoot_notifications_test_firebase_availability_description" = "Ujistěte se, že je k dispozici Firebase.";
"troubleshoot_notifications_test_firebase_availability_failure" = "Firebase není k dispozici.";
"troubleshoot_notifications_test_firebase_availability_success" = "Firebase je k dispozici.";
@@ -1783,11 +1690,10 @@
"troubleshoot_notifications_test_push_loop_back_failure_2" = "Chyba: %1$@.";
"troubleshoot_notifications_test_push_loop_back_failure_3" = "Chyba, nelze otestovat push.";
"troubleshoot_notifications_test_push_loop_back_failure_4" = "Chyba, časový limit čekání na push.";
"troubleshoot_notifications_test_push_loop_back_failure_rate_limit" = "Error: the push gateway is rate limiting this device, so notifications won't be reliable. Please set up a different push gateway.";
"troubleshoot_notifications_test_push_loop_back_success" = "Push zpětná smyčka trvala %1$d ms.";
"troubleshoot_notifications_test_push_loop_back_title" = "Otestovat push pomocí zpětného volání";
"troubleshoot_notifications_test_unified_push_description" = "Ujistěte se, že jsou k dispozici distributoři UnifiedPush.";
"troubleshoot_notifications_test_unified_push_failure" = "Nebyli nalezeni žádní push distributoři.";
"troubleshoot_notifications_test_unified_push_title" = "Zkontrolovat UnifiedPush";
"vulkan_not_supported_dialog_content_android" = "Vaše zařízení je příliš staré, je vyžadováno zařízení s Androidem 8 nebo novějším.";
"vulkan_not_supported_dialog_title_android" = "Vykreslování map není podporováno";
"vulkan_not_supported_dialog_content_android" = "Your device is too old, a device with Android 8 or newer is required.";
"vulkan_not_supported_dialog_title_android" = "Rendering maps is not supported";
@@ -20,22 +20,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_gallery_more_media</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Gallery, %1$d more media</string>
<key>other</key>
<string>Gallery, %1$d more medias</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_polls_percent_of_total</key>
<dict>
<key>COUNT</key>
@@ -63,59 +47,11 @@
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>few</key>
<string></string>
<string>Přečetl(a) %1$@ a %2$d další</string>
<key>one</key>
<string>Předchozí zprávu přečetl(a) %1$@ a %2$d další</string>
<string>Přečetl(a) %1$@ a %2$d další</string>
<key>other</key>
<string>Předchozí zprávu přečetl(a) %1$@ a %2$d další</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>action_forward_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Forward %1$d message</string>
<key>other</key>
<string>Forward %1$d messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_attachments</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d attachment…</string>
<key>other</key>
<string>%1$d attachments…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_media_items</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d media item…</string>
<key>other</key>
<string>%1$d media items…</string>
<string>Přečetl(a) %1$@ a %2$d dalších</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
@@ -296,22 +232,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_gallery_body</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Shared %1$d attachment</string>
<key>other</key>
<string>Shared %1$d attachments</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_invitations</key>
<dict>
<key>COUNT</key>
@@ -384,22 +304,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen.room.timeline_redacted_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d removed message</string>
<key>other</key>
<string>%1$d removed messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_advanced_settings_live_location_update_distance</key>
<dict>
<key>COUNT</key>
@@ -478,12 +382,10 @@
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>few</key>
<string>%1$d stupně</string>
<key>one</key>
<string>%1$d stupeň</string>
<string>%1$d degree</string>
<key>other</key>
<string>%1$d stupňů</string>
<string>%1$d degrees</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
@@ -596,22 +498,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_messages_forwarded</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message forwarded</string>
<key>other</key>
<string>%1$d messages forwarded</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_multiple_knock_requests_title</key>
<dict>
<key>COUNT</key>
@@ -630,22 +516,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_selection_count</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message selected</string>
<key>other</key>
<string>%1$d messages selected</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_timeline_reaction_a11y</key>
<dict>
<key>COUNT</key>
@@ -754,7 +624,7 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_timeline_active_call_joined_count</key>
<key>screen_timeline_active_call_extra_joined_count</key>
<dict>
<key>COUNT</key>
<dict>
@@ -763,9 +633,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
<key>other</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
@@ -1,6 +1,6 @@
"NSCameraUsageDescription" = "Er mwyn tynnu lluniau neu fideos a'u hanfon fel neges mae Elfen X angen mynediad i'r camera.";
"NSFaceIDUsageDescription" = "Mae Face ID yn cael ei ddefnyddio i gael mynediad i'ch ap.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "To share your location live in chats, location access is needed when the app is in the background.";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "To share your live location, Element X needs location access when the app is in the background.";
"NSLocationWhenInUseUsageDescription" = "Caniatewch fynediad lleoliad fel y gall Elfen X rannu eich lleoliad.";
"NSMicrophoneUsageDescription" = "I recordio ac anfon negeseuon gyda sain, mae angen i Elfen X gael mynediad i'r meicroffon.";
"NSPhotoLibraryUsageDescription" = "Mae hyn yn caniatáu ichi gadw delweddau a fideos i'ch llyfrgell ffotograffau.";
@@ -6,23 +6,16 @@
"a11y_collapse_message_text_field" = "Lleihau maes testun neges";
"a11y_create_poll_votes_allowed_decrease" = "Decrease votes allowed per person";
"a11y_create_poll_votes_allowed_increase" = "Increase votes allowed per person";
"a11y_custom_emoji" = "Custom emoji";
"a11y_delete" = "Dileu";
"a11y_duration" = "Duration: %1$@";
"a11y_edit_avatar" = "Golygu afatar";
"a11y_edit_room_address_hint" = "Bydd y cyfeiriad llawn yn%1$@";
"a11y_expand_message_text_field" = "Ehangu maes testun neges";
"a11y_gallery_attachment" = "Gallery, attachment %1$d";
"a11y_gallery_failed_scan" = "Gallery, failed scan %1$d";
"a11y_gallery_image" = "Gallery, image %1$d";
"a11y_gallery_scanning" = "Gallery, scanning %1$d";
"a11y_gallery_video" = "Gallery, video %1$d";
"a11y_hide_password" = "Cuddio cyfrinair";
"a11y_info" = "Info";
"a11y_join_call" = "Ymuno â galwad";
"a11y_jump_to_bottom" = "Symud i'r gwaelod";
"a11y_jump_to_unread" = "Jump to unread";
"a11y_jump_to_unread_messages" = "Jump to first unread message";
"a11y_notifications_mentions_only" = "Crybwylliadau'n unig";
"a11y_notifications_muted" = "Wedi'i Dewi";
"a11y_notifications_new_mentions" = "Crybwylliadau newydd";
@@ -57,7 +50,6 @@
"a11y_start_call" = "Cychwyn galwad";
"a11y_start_video_call" = "Start a video call";
"a11y_start_voice_call" = "Start a voice call";
"a11y_status" = "Status";
"a11y_tombstoned_room" = "Ystafell Tombstoned";
"a11y_user_menu" = "Dewislen defnyddiwr";
"a11y_video_preview" = "Video preview";
@@ -86,7 +78,6 @@
"action_choose_file" = "Choose file";
"action_choose_photo" = "Dewis llun";
"action_clear" = "Clirio";
"action_clear_all" = "Clear all";
"action_close" = "Cau";
"action_complete_verification" = "Cwblhau'r gwirio";
"action_confirm" = "Cadarnhau";
@@ -97,7 +88,6 @@
"action_copy_link" = "Copïo dolen";
"action_copy_link_to_message" = "Copïo dolen i'r neges";
"action_copy_text" = "Copïo testun";
"action_copy_to_clipboard" = "Copy to clipboard";
"action_create" = "Creu";
"action_create_room" = "Creu ystafell";
"action_create_space" = "Create space";
@@ -145,7 +135,6 @@
"action_manage_account_and_devices" = "Manage account & devices";
"action_manage_devices" = "Rheoli dyfeisiau";
"action_manage_rooms" = "Manage rooms";
"action_mark_as_read" = "Mark as read";
"action_message" = "Neges";
"action_minimize" = "Minimise";
"action_next" = "Nesaf";
@@ -220,7 +209,6 @@
"call_invalid_audio_device_bluetooth_devices_disabled" = "Nid yw Element Call yn cefnogi defnyddio dyfeisiau sain Bluetooth yn y fersiwn Android hon. Dewiswch ddyfais sain wahanol.";
"common_about" = "Ynghylch";
"common_acceptable_use_policy" = "Polisi defnydd derbyniol";
"common_account_settings" = "Account settings";
"common_add_account" = "Ychwanegu cyfrif";
"common_add_another_account" = "Ychwanegu cyfrif arall";
"common_adding_caption" = "Ychwanegu capsiwn";
@@ -229,7 +217,6 @@
"common_analytics" = "Dadansoddeg";
"common_android_shortcuts_remove_reason_left_room" = "Rydych wedi gadael yr ystafell";
"common_android_shortcuts_remove_reason_session_logged_out" = "Rydych wedi'ch allgofnodi o'r sesiwn";
"common_app_settings" = "App settings";
"common_appearance" = "Gwedd";
"common_audio" = "Sain";
"common_beta" = "Beta";
@@ -240,8 +227,6 @@
"common_call_started" = "Galwad wedi dechrau";
"common_call_you_declined" = "You declined a call";
"common_chat_backup" = "Sgwrs wrth gefn";
"common_chats" = "Chats";
"common_code_block" = "Code block";
"common_copied_to_clipboard" = "Wedi'i gopïo i'r clipfwrdd";
"common_copyright" = "Hawlfraint";
"common_creating_room" = "Wrthi'n creu ystafell…";
@@ -279,12 +264,10 @@
"common_file_deleted" = "Ffeil wedi'i dileu";
"common_file_saved" = "Ffeil wedi'i chadw";
"common_forward_message" = "Anfonwyd neges ymlaen";
"common_forward_to" = "Forward to";
"common_frequently_used" = "Defnydd cyffredin";
"common_gallery" = "Gallery";
"common_gif" = "GIF";
"common_group_call_in_progress" = "Group call in progress";
"common_header_rooms" = "Rooms";
"common_image" = "Delwedd";
"common_in_reply_to" = "Mewn ymateb i %1$@";
"common_invite_unknown_profile" = "Nid oes modd dod o hyd i'r ID Matrics hwn, felly mae'n bosibl na fydd y gwahoddiad yn cael ei dderbyn.";
@@ -297,25 +280,20 @@
"common_live_location_ended" = "Live location ended";
"common_loading" = "Yn Llwytho…";
"common_loading_more" = "Wrthi'n llwytho mwy…";
"common_location_sharing" = "Location sharing";
"common_media_upload_quality" = "Media upload quality";
"common_message" = "Neges";
"common_message_actions" = "Gweithredoedd neges";
"common_message_failed_to_send" = "Message failed to send";
"common_message_layout" = "Cynllun y neges";
"common_message_removed" = "Neges wedi'i thynnu";
"common_moderation_and_safety" = "Moderation & safety";
"common_modern" = "Cyfoes";
"common_mute" = "Tewi";
"common_name" = "Name";
"common_name_and_id" = "%1$@ (%2$@)";
"common_no_results" = "Dim canlyniadau";
"common_no_results_for" = "There are no results for “%1$@”. Try a new search term.";
"common_no_room_name" = "Dim enw i'r ystafell";
"common_no_space_name" = "Dim enw gofod";
"common_not_encrypted" = "Heb ei amgryptio";
"common_offline" = "All-lein";
"common_on_a_call" = "On a call";
"common_open_source_licenses" = "Trwyddedau cod agored";
"common_optic_id_ios" = "ID optig";
"common_or" = "neu";
@@ -349,7 +327,6 @@
"common_replying_to" = "Yn ymateb i %1$@";
"common_report_a_problem" = "Adrodd am broblem";
"common_report_submitted" = "Adroddiad wedi ei gyflwyno";
"common_results_for" = "Results for “%1$@”";
"common_rich_text_editor" = "Golygydd testun cyfoethog";
"common_role" = "Role";
"common_room" = "Ystafell";
@@ -377,7 +354,6 @@
"common_shared_live_location" = "Shared live location";
"common_shared_location" = "Lleoliad yn cael ei rannu";
"common_shared_space" = "Shared space";
"common_signed_in" = "Signed in";
"common_signing_out" = "Allgofnodi";
"common_something_went_wrong" = "Aeth rhywbeth o'i le";
"common_something_went_wrong_message" = "Wedi canfod mater. Ceisiwch eto.";
@@ -389,7 +365,6 @@
"common_success" = "Llwyddiant";
"common_suggested" = "Suggested";
"common_suggestions" = "Awgrymiadau";
"common_switch_accounts" = "Switch accounts";
"common_syncing" = "Cydweddu";
"common_text" = "Testun";
"common_third_party_notices" = "Hysbysiadau trydydd parti";
@@ -430,14 +405,12 @@
"common_waiting_live_location" = "Waiting for live location…";
"common_world_readable_history" = "Anyone can see history";
"common_you" = "Chi";
"common_your_account" = "Your account";
"confirm_recovery_key_banner_message" = "Cadarnhewch eich allwedd adfer i gynnal mynediad i'ch storfa allweddi a'ch hanes negeseuon.";
"confirm_recovery_key_banner_primary_button_title" = "Rhowch eich allwedd adfer";
"confirm_recovery_key_banner_secondary_button_title" = "Wedi anghofio'ch allwedd adfer?";
"confirm_recovery_key_banner_title" = "Dyw eich allwedd storfa heb ei gydweddu";
"content_scanner_not_found" = "Download not available.";
"content_scanner_not_found_title" = "Something went wrong";
"content_scanner_scanning" = "Scanning…";
"content_scanner_not_found_title" = "File not found";
"content_scanner_unsafe_message" = "Preview and download have been disabled.";
"content_scanner_unsafe_title" = "The file is not safe";
"crash_detection_dialog_content" = "Chwalodd %1$@ y tro diwethaf iddo gael ei ddefnyddio. Hoffech chi rannu adroddiad gwall gyda ni?";
@@ -511,11 +484,6 @@
"error_no_compatible_app_found" = "Heb ganfod ap cydnaws i drin y weithred hon.";
"error_room_address_already_exists" = "Mae'r cyfeiriad ystafell hwn yn bodoli eisoes. Ceisiwch olygu'r maes cyfeiriad ystafell neu newid enw'r ystafell";
"error_room_address_invalid_symbols" = "Dyw rhai nodau ddim yn cael eu caniatáu. Dim ond llythrennau, digidau a'r symbolau canlynol sy'n cael eu cefnogi ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _";
"error_sending_failure_invalid_mime_type" = "Invalid mime type: %@";
"error_sending_failure_missing_media_content" = "Missing media content";
"error_sending_failure_other" = "Error details: %@";
"error_sending_failure_sending_from_unverified_device" = "Sending from unverified device";
"error_sending_failure_unknown" = "Unknown error";
"error_some_messages_have_not_been_sent" = "Nid yw rhai negeseuon wedi'u hanfon";
"error_unknown" = "Ymddiheuriadau, mae gwall wedi digwydd";
"error.account_already_logged_in" = "Rydych chi eisoes wedi mewngofnodi ar y ddyfais hon fel %1$@ .";
@@ -545,8 +513,6 @@
"notification_invitation_action_reject" = "Gwrthod";
"notification_invite_body" = "Wedi eich gwahodd i sgwrsio";
"notification_invite_body_with_sender" = "Mae %1$@ wedi eich gwahodd i sgwrsio";
"notification_knock_request_body" = "Requested to join";
"notification_live_location_started_body" = "Started sharing their live location";
"notification_mentioned_you_body" = "Wedi eich crybwyll: %1$@";
"notification_new_messages" = "Negeseuon Newydd";
"notification_reaction_body" = "Wedi ymateb gyda %1$@";
@@ -737,16 +703,8 @@
"screen_change_server_error_unauthorized_homeserver_title" = "Dyw darparwr cyfrif %1$@ dddim yn cael ei ganiatáu.";
"screen_change_server_form_header" = "URL y Gweinydd Cartref";
"screen_change_server_form_notice" = "Rhowch gyfeiriad parth.";
"screen_change_server_navigation_title_login" = "Sign in";
"screen_change_server_navigation_title_register" = "Create account";
"screen_change_server_subtitle" = "Beth yw cyfeiriad eich gweinydd?";
"screen_change_server_textfield_footer_login" = "If your account is provided by your company or a community, then change the account provider (example: companyname.com).";
"screen_change_server_textfield_footer_register" = "Create an account on matrix.org for free. If you want to create an account with a different provider, then change it accordingly (example: communityname.org).";
"screen_change_server_textfield_header" = "Account provider";
"screen_change_server_textfield_placeholder" = "example.com";
"screen_change_server_title" = "Dewiswch eich gweinydd";
"screen_change_server_title_login" = "Enter your account provider";
"screen_change_server_title_register" = "Choose an account provider";
"screen_chat_backup_key_backup_action_disable" = "Dileu storfa allweddi";
"screen_chat_backup_key_backup_action_enable" = "Trowch y copi wrth gefn ymlaen";
"screen_chat_backup_key_backup_description" = "Cadwch eich hunaniaeth cryptograffig a'ch allweddi neges yn ddiogel ar y gweinydd. Bydd hyn yn caniatáu ichi weld hanes eich neges ar unrhyw ddyfeisiau newydd. %1$@.";
@@ -793,7 +751,7 @@
"screen_create_room_private_option_description" = "Dim ond pobl wahoddwyd all gael mynediad i'r ystafell hon. Mae pob neges wedi'i hamgryptio o'r dechrau i'r diwedd.";
"screen_create_room_private_option_title" = "Private";
"screen_create_room_public_option_description" = "Gall unrhyw un ddod o hyd i'r ystafell hon.\nGallwch newid hyn unrhyw bryd yng ngosodiadau ystafell.";
"screen_create_room_public_option_short_description" = "Anyone can join, including people outside your organisation.";
"screen_create_room_public_option_short_description" = "Anyone can join.";
"screen_create_room_public_option_title" = "Public";
"screen_create_room_room_access_section_knocking_option_description" = "Gall unrhyw un ofyn am gael ymuno â'r ystafell ond bydd rhaid i weinyddwr neu gymedrolwr dderbyn y cais";
"screen_create_room_room_access_section_knocking_option_title" = "Gofyn i gael ymuno";
@@ -966,10 +924,6 @@
"screen_knock_requests_list_empty_state_title" = "Dim cais i ymuno yn disgwyl";
"screen_knock_requests_list_initial_loading_title" = "Yn llwytho ceisiadau i ymuno…";
"screen_knock_requests_list_title" = "Ceisiadau i ymuno";
"screen_labs_enable_gallery" = "Gallery messages";
"screen_labs_enable_gallery_description" = "Send multiple images or videos in one go. Stable on mobile, but not yet supported by web.";
"screen_labs_enable_knocking" = "Ask to join";
"screen_labs_enable_knocking_description" = "Users can request access to a room that is not open for anyone to join. Stable on mobile, web implementation exists but is experimental.";
"screen_labs_enable_threads" = "Enable thread replies";
"screen_labs_enable_threads_description" = "The app will restart to apply this change.";
"screen_labs_header_description" = "Try out our latest ideas in development. These features are not finalised; they may be unstable, may change.";
@@ -978,11 +932,11 @@
"screen_leave_space_choose_owners_action" = "Dewiswch Berchnogion";
"screen_leave_space_last_admin_info" = "%1$@ (Gweinyddwr)";
"screen_leave_space_subtitle" = "Dewiswch yr ystafelloedd yr hoffech chi eu gadael nad chi yw'r unig weinyddwr ar eu cyfer:";
"screen_leave_space_subtitle_last_admin" = "You need to assign another administrator for this space before you can leave.";
"screen_leave_space_subtitle_last_admin" = "You need to assign another admin for this space before you can leave.";
"screen_leave_space_subtitle_last_owner" = "You are the only owner of %1$@. You need to transfer ownership to someone else before you leave.";
"screen_leave_space_subtitle_only_last_admin" = "You will not be removed from the following room(s) because you're the only administrator:";
"screen_leave_space_title" = "Gadael %1$@ ?";
"screen_leave_space_title_last_admin" = "You are the only administrator for %1$@";
"screen_leave_space_title_last_admin" = "You are the only admin for %1$@";
"screen_leave_space_title_last_owner" = "Transfer ownership";
"screen_link_new_device_authentication_reason_ios" = "Confirm it's you before linking a new device.";
"screen_link_new_device_desktop_scanning_title" = "Sganiwch y cod QR";
@@ -990,7 +944,6 @@
"screen_link_new_device_desktop_step3" = "Sganiwch y cod QR gyda'r ddyfais hon";
"screen_link_new_device_desktop_submit" = "Yn barod i sganio";
"screen_link_new_device_desktop_title" = "Open %1$@ on a desktop computer to get the QR code";
"screen_link_new_device_desktop_warning" = "Only scan a QR code after following the steps above on your own device. Never scan a code sent by another person.";
"screen_link_new_device_enter_number_error_numbers_do_not_match" = "The numbers don’t match";
"screen_link_new_device_enter_number_notice" = "Enter 2-digit code";
"screen_link_new_device_enter_number_subtitle" = "This will verify that the connection to your other device is secure.";
@@ -1017,8 +970,6 @@
"screen_live_location_sheet_nobody_sharing" = "Nobody is sharing their location";
"screen_live_location_sheet_sharing_live_location" = "Sharing live location";
"screen_live_location_sheet_title" = "On the map";
"screen_local_network_opt_in_subtitle" = "Your homeserver is on your local network. To connect, %1$@ needs permission to reach devices on this network.";
"screen_local_network_opt_in_title" = "Allow access to local network";
"screen_login_error_deactivated_account" = "Mae'r cyfrif hwn wedi'i gau.";
"screen_login_error_invalid_credentials" = "Enw defnyddiwr a/neu gyfrinair anghywir";
"screen_login_error_invalid_user_id" = "Nid yw hwn yn ddynodwr defnyddiwr dilys. Fformat disgwyliedig: ‘@user:homeserver.org’";
@@ -1069,16 +1020,10 @@
"screen_missing_key_backup_open_element_classic" = "Open Element Classic";
"screen_missing_key_backup_step_1" = "Open Element Classic on your device";
"screen_missing_key_backup_step_2_ios" = "Go to User settings > Security";
"screen_missing_key_backup_step_3_ios" = "Scroll down to Chat Backup and tap on Set up";
"screen_missing_key_backup_step_3_ios" = "Scroll down to Secure Backup and tap on Set up";
"screen_missing_key_backup_step_4" = "Follow the instructions to enable your key storage";
"screen_missing_key_backup_step_5" = "Come back to %1$@";
"screen_missing_key_backup_title" = "Enable your key storage before proceeding to %1$@";
"screen_moderation_and_safety_invites_heading" = "Invites";
"screen_moderation_and_safety_other_users_heading" = "Other users";
"screen_moderation_and_safety_share_presence_heading" = "Your appearance";
"screen_multi_account_announcement_action" = "Add account";
"screen_multi_account_announcement_description" = "Go to %1$@ to sign into another account. Then you can easily switch between them.";
"screen_multi_account_announcement_title" = "You can now add multiple accounts";
"screen_notification_optin_subtitle" = "Gallwch newid eich gosodiadau yn nes ymlaen.";
"screen_notification_optin_title" = "Caniatáu hysbysiadau a pheidio byth â cholli neges";
"screen_notification_settings_additional_settings_section_title" = "Gosodiadau ychwanegol";
@@ -1107,8 +1052,6 @@
"screen_notification_settings_mode_mentions" = "Crybwyll";
"screen_notification_settings_notification_section_title" = "Rhoi gwybod i mi am";
"screen_notification_settings_room_mention_label" = "Rhoi gwybod i mi ar @ystafell";
"screen_notification_settings_show_all_activity_subtitle" = "Dots or number of unread messages";
"screen_notification_settings_show_all_activity_title" = "Show all activity in the room list";
"screen_notification_settings_sound_custom_fallback" = "Custom";
"screen_notification_settings_sound_custom_sound_button_title" = "Custom sound...";
"screen_notification_settings_sound_delete_sound_error_title" = "Error deleting file";
@@ -1169,14 +1112,6 @@
"screen_polls_history_filter_ongoing" = "Parhaus";
"screen_polls_history_filter_past" = "Gorffennol";
"screen_polls_history_title" = "Pleidleisiau";
"screen_ptt_settings_battery_optimization" = "Ignore battery optimisation";
"screen_ptt_settings_battery_optimization_description" = "Stay active in background";
"screen_ptt_settings_covert_mode" = "Covert mode";
"screen_ptt_settings_covert_mode_description" = "Mute all channels";
"screen_ptt_settings_lock_screen" = "Show on lock screen";
"screen_ptt_settings_lock_screen_description" = "Access from the lock screen";
"screen_ptt_settings_system_overlay" = "Enable system overlay";
"screen_ptt_settings_system_overlay_description" = "Access a floating action button";
"screen_push_history_title" = "Hanes gwthio";
"screen_qr_code_login_connecting_subtitle" = "Yn creu cysylltiad diogel";
"screen_qr_code_login_connection_note_secure_state_description" = "Nid oedd modd gwneud cysylltiad diogel â'r ddyfais newydd. Mae eich dyfeisiau presennol yn dal yn ddiogel a does dim angen i chi boeni amdanyn nhw.";
@@ -1321,14 +1256,7 @@
"screen_room_change_role_section_users" = "Aelodau";
"screen_room_change_role_unsaved_changes_description" = "Mae gennych newidiadau heb eu cadw.";
"screen_room_change_role_unsaved_changes_title" = "Cadw'r newidiadau?";
"screen_room_confirm_removal_reason_label" = "Reason (optional)";
"screen_room_confirm_removal_reason_placeholder" = "Enter reason…";
"screen_room_confirm_removal_reason_supporting_text" = "(Optional)";
"screen_room_confirm_removal_title" = "Remove message?";
"screen_room_details_add_topic_title" = "Ychwanegu pwnc";
"screen_room_details_audio_push_to_talk" = "Push to talk";
"screen_room_details_audio_title" = "Room Audio";
"screen_room_details_audio_video_calls" = "Video calls";
"screen_room_details_badge_encrypted" = "Wedi'i amgryptio";
"screen_room_details_badge_not_encrypted" = "Heb ei amgryptio";
"screen_room_details_badge_public" = "Ystafell gyhoeddus";
@@ -1354,9 +1282,6 @@
"screen_room_details_profile_row_title" = "Proffil";
"screen_room_details_requests_to_join_title" = "Ceisiadau i ymuno";
"screen_room_details_roles_and_permissions" = "Rolau a chaniatâd";
"screen_room_details_room_audio_ptt" = "Push to talk";
"screen_room_details_room_audio_title" = "Room Audio";
"screen_room_details_room_audio_video_calls" = "Video calls";
"screen_room_details_room_name_label" = "Name";
"screen_room_details_security_and_privacy_title" = "Diogelwch a phreifatrwydd";
"screen_room_details_security_title" = "Diogelwch";
@@ -1376,7 +1301,6 @@
"screen_room_invite_again_alert_message" = "Hoffech chi eu gwahodd yn ôl?";
"screen_room_invite_again_alert_title" = "Rydych chi ar eich pen eich hun yn y sgwrs hon";
"screen_room_live_location_banner" = "Sharing live location";
"screen_room_maximum_messages_selected" = "Maximum messages selected";
"screen_room_member_details_block_alert_action" = "Rhwystro";
"screen_room_member_details_block_alert_description" = "Fydd defnyddwyr sydd wedi'u rhwystro ddim yn gallu anfon negeseuon atoch a bydd eu holl negeseuon yn cael eu cuddio. Gallwch eu dadrwystro unrhyw bryd.";
"screen_room_member_details_block_user" = "Rhwystro defnyddiwr";
@@ -1417,8 +1341,7 @@
"screen_room_notification_settings_error_setting_mode" = "Wedi methu gosod y modd, ceisiwch eto.";
"screen_room_notification_settings_mentions_only_disclaimer" = "Nid yw eich gweinydd cartref yn cefnogi'r dewis hwn mewn ystafelloedd sydd wedi'u hamgryptio, chewch chi ddim eich hysbysu yn yr ystafell hon.";
"screen_room_notification_settings_mode_all_messages" = "Pob neges";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Dim ond Crybwylliadau ac Allweddeiriau";
"screen_room_notification_settings_mode_mute" = "Mute";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Crybwylliadau ac Allweddeiriau'n unig";
"screen_room_notification_settings_room_custom_settings_title" = "Yn yr ystafell hon, rhowch wybod i mi am";
"screen_room_pinned_banner_indicator" = "%1$@ o %2$@";
"screen_room_pinned_banner_indicator_description" = "%1$@ Neges wedi'u pinio";
@@ -1443,7 +1366,6 @@
"screen_room_roles_and_permissions_room_details" = "Manylion yr ystafell";
"screen_room_roles_and_permissions_space_details" = "Space details";
"screen_room_roles_and_permissions_title" = "Rolau a chaniatâd";
"screen_room_select_error_cannot_load_rooms" = "The room list associated with this account cannot be loaded.";
"screen_room_single_knock_request_accept_button_title" = "Derbyn";
"screen_room_single_knock_request_title" = "Mae %1$@ eisiau ymuno â'r ystafell hon";
"screen_room_single_knock_request_view_button_title" = "Golwg";
@@ -1480,8 +1402,6 @@
"screen_roomlist_filter_invites_empty_state_title" = "Does gennych chi ddim gwahoddiadau yn aros.";
"screen_roomlist_filter_low_priority" = "Blaenoriaeth Isel";
"screen_roomlist_filter_low_priority_empty_state_title" = "Does gennych chi ddim sgyrsiau blaenoriaeth isel eto";
"screen_roomlist_filter_mention" = "Mention";
"screen_roomlist_filter_mention_empty_state_title" = "You don’t have any unread mentions";
"screen_roomlist_filter_mixed_empty_state_subtitle" = "Gallwch ddad-ddewis hidlwyr er mwyn gweld eich sgyrsiau eraill";
"screen_roomlist_filter_mixed_empty_state_title" = "Does gennych chi ddim sgyrsiau ar gyfer y dewis hwn";
"screen_roomlist_filter_people" = "Pobl";
@@ -1568,13 +1488,10 @@
"screen_session_verification_request_title" = "Gofynnwyd am ddilysiad";
"screen_session_verification_they_dont_match" = "Dy'n nhw ddim yn cyfateb";
"screen_session_verification_they_match" = "Maen nhw'n cyfateb";
"screen_session_verification_unavailable_subtitle" = "Please use another device or recovery key.";
"screen_session_verification_unavailable_title" = "Verification with this device is currently unavailable";
"screen_session_verification_use_another_device_subtitle" = "Gwnewch yn siŵr fod gennych yr ap ar agor yn y ddyfais arall cyn dechrau dilysu o'r fan hon.";
"screen_session_verification_use_another_device_title" = "Agorwch yr ap ar ddyfais arall sydd wedi'i gwirio";
"screen_session_verification_user_initiator_subtitle" = "Er mwyn sicrhau diogelwch ychwanegol, gwiriwch y defnyddiwr hwn trwy gymharu set o emojis ar eich dyfeisiau. Gwnewch hyn trwy ddefnyddio ffordd ddibynadwy o gyfathrebu.";
"screen_session_verification_user_initiator_title" = "Dilysu'r defnyddiwr hwn?";
"screen_session_verification_user_requesting_verification" = "User requesting verification:";
"screen_session_verification_user_responder_subtitle" = "Er mwyn diogelwch ychwanegol, mae defnyddiwr arall eisiau gwirio pwy ydych chi. Bydd set o emojis yn cael eu dangos i chi eu cymharu.";
"screen_session_verification_waiting_another_device_subtitle" = "Dylech weld llamlen ar y ddyfais arall. Dechreuwch y dilysiad o'r fan honno nawr.";
"screen_session_verification_waiting_another_device_title" = "Cychwyn dilysu ar y ddyfais arall";
@@ -1583,15 +1500,6 @@
"screen_session_verification_waiting_subtitle" = "Unwaith y byddwch wedi'ch derbyn, byddwch yn gallu parhau â'r dilysu.";
"screen_session_verification_waiting_to_accept_subtitle" = "Derbyniwch y cais i gychwyn y broses ddilysu yn eich sesiwn arall i barhau.";
"screen_session_verification_waiting_to_accept_title" = "Yn aros i dderbyn cais";
"screen_settings_add_account" = "Add account";
"screen_settings_user_status_away" = "Away";
"screen_settings_user_status_be_right_back" = "Be right back";
"screen_settings_user_status_custom" = "Custom…";
"screen_settings_user_status_custom_hint" = "Custom status…";
"screen_settings_user_status_focus_time" = "Focus time";
"screen_settings_user_status_in_a_meeting" = "In a meeting";
"screen_settings_user_status_on_the_road" = "On the road";
"screen_settings_user_status_placeholder" = "What's your status?";
"screen_share_location_live_location_disclaimer_title" = "Your live location history will be stored in the room and visible to members after the session ends.";
"screen_share_location_live_location_duration_picker_title" = "Choose how long to share your live location.";
"screen_share_location_live_location_missing_permissions" = "You do not have permissions to share your live location in this room";
@@ -1606,7 +1514,6 @@
"screen_signed_out_reason_2" = "Rydych chi wedi dileu'r sesiwn o sesiwn arall";
"screen_signed_out_reason_3" = "Mae gweinyddwr eich gweinydd wedi annilysu eich mynediad";
"screen_signed_out_subtitle" = "Efallai eich bod wedi cael eich allgofnodi am un o'r rhesymau sy'n cael eu rhestru isod. Mewngofnodwch eto i barhau i ddefnyddio %@.";
"screen_signed_out_subtitle_v2" = "This device was removed for one of the reasons listed below. Please sign in again to connect this device to your account.";
"screen_signed_out_title" = "Rydych wedi'ch allgofnodi";
"screen_signout_confirmation_dialog_content" = "Ydych chi'n siŵr eich bod am allgofnodi?";
"screen_signout_confirmation_dialog_submit" = "Allgofnodi";
@@ -1632,7 +1539,7 @@
"screen_space_list_parent_space" = "Gofod %1$@";
"screen_space_list_title" = "Gofodau";
"screen_space_menu_action_members" = "View members";
"screen_space_remove_rooms_confirmation_content" = "Removing a room will not affect the room access. To change the access go to Room info > Security & privacy.";
"screen_space_remove_rooms_confirmation_content" = "Removing a room will not affect the room access. To change the access go to Room info > Privacy & security.";
"screen_space_remove_rooms_confirmation_title_ios" = "Remove rooms from %1$@?";
"screen_space_settings_leave_space" = "Gadael y gofod";
"screen_space_settings_roles_and_permissions" = "Rolau a chaniatâd";
@@ -1783,7 +1690,6 @@
"troubleshoot_notifications_test_push_loop_back_failure_2" = "Gwall: %1$@.";
"troubleshoot_notifications_test_push_loop_back_failure_3" = "Gwall, methu profi'r gwthio.";
"troubleshoot_notifications_test_push_loop_back_failure_4" = "Gwall, terfyn amser wrth aros am y gwthio.";
"troubleshoot_notifications_test_push_loop_back_failure_rate_limit" = "Error: the push gateway is rate limiting this device, so notifications won't be reliable. Please set up a different push gateway.";
"troubleshoot_notifications_test_push_loop_back_success" = "Cymerodd dolen gwthio nôl %1$d ms.";
"troubleshoot_notifications_test_push_loop_back_title" = "Prawf dolen gwthio'n ôl";
"troubleshoot_notifications_test_unified_push_description" = "Sicrhewch fod dosbarthwyr UnifiedPush ar gael.";
@@ -26,22 +26,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_gallery_more_media</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Gallery, %1$d more media</string>
<key>other</key>
<string>Gallery, %1$d more medias</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_polls_percent_of_total</key>
<dict>
<key>COUNT</key>
@@ -90,54 +74,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>action_forward_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Forward %1$d message</string>
<key>other</key>
<string>Forward %1$d messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_attachments</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d attachment…</string>
<key>other</key>
<string>%1$d attachments…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_media_items</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d media item…</string>
<key>other</key>
<string>%1$d media items…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_many_members</key>
<dict>
<key>COUNT</key>
@@ -362,22 +298,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_gallery_body</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Shared %1$d attachment</string>
<key>other</key>
<string>Shared %1$d attachments</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_invitations</key>
<dict>
<key>COUNT</key>
@@ -474,22 +394,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen.room.timeline_redacted_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d removed message</string>
<key>other</key>
<string>%1$d removed messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_advanced_settings_live_location_update_distance</key>
<dict>
<key>COUNT</key>
@@ -706,22 +610,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_messages_forwarded</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message forwarded</string>
<key>other</key>
<string>%1$d messages forwarded</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_multiple_knock_requests_title</key>
<dict>
<key>COUNT</key>
@@ -746,22 +634,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_selection_count</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message selected</string>
<key>other</key>
<string>%1$d messages selected</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_timeline_reaction_a11y</key>
<dict>
<key>COUNT</key>
@@ -898,7 +770,7 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_timeline_active_call_joined_count</key>
<key>screen_timeline_active_call_extra_joined_count</key>
<dict>
<key>COUNT</key>
<dict>
@@ -907,9 +779,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
<key>other</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
@@ -6,23 +6,16 @@
"a11y_collapse_message_text_field" = "Minimér tekstfeltet for beskeder";
"a11y_create_poll_votes_allowed_decrease" = "Decrease votes allowed per person";
"a11y_create_poll_votes_allowed_increase" = "Increase votes allowed per person";
"a11y_custom_emoji" = "Custom emoji";
"a11y_delete" = "Slet";
"a11y_duration" = "Duration: %1$@";
"a11y_edit_avatar" = "Redigér avatar";
"a11y_edit_room_address_hint" = "Den fulde adresse vil være %1$@";
"a11y_expand_message_text_field" = "Udvid tekstfeltet for beskeder";
"a11y_gallery_attachment" = "Gallery, attachment %1$d";
"a11y_gallery_failed_scan" = "Gallery, failed scan %1$d";
"a11y_gallery_image" = "Gallery, image %1$d";
"a11y_gallery_scanning" = "Gallery, scanning %1$d";
"a11y_gallery_video" = "Gallery, video %1$d";
"a11y_hide_password" = "Skjul adgangskode";
"a11y_info" = "Info";
"a11y_join_call" = "Deltag i opkald";
"a11y_jump_to_bottom" = "Hop til bunden";
"a11y_jump_to_unread" = "Jump to unread";
"a11y_jump_to_unread_messages" = "Jump to first unread message";
"a11y_notifications_mentions_only" = "Kun omtaler";
"a11y_notifications_muted" = "Lyd slået fra";
"a11y_notifications_new_mentions" = "Nye omtaler";
@@ -57,7 +50,6 @@
"a11y_start_call" = "Start et opkald";
"a11y_start_video_call" = "Start et videoopkald";
"a11y_start_voice_call" = "Start et taleopkald";
"a11y_status" = "Status";
"a11y_tombstoned_room" = "Deaktiveret rum";
"a11y_user_menu" = "Brugermenu";
"a11y_video_preview" = "Video preview";
@@ -86,7 +78,6 @@
"action_choose_file" = "Choose file";
"action_choose_photo" = "Vælg billede";
"action_clear" = "Ryd";
"action_clear_all" = "Clear all";
"action_close" = "Luk";
"action_complete_verification" = "Fuldfør verifikation";
"action_confirm" = "Bekræft";
@@ -97,7 +88,6 @@
"action_copy_link" = "Kopiér link";
"action_copy_link_to_message" = "Kopiér link til besked";
"action_copy_text" = "Kopiér tekst";
"action_copy_to_clipboard" = "Copy to clipboard";
"action_create" = "Opret";
"action_create_room" = "Opret et rum";
"action_create_space" = "Opret en klynge";
@@ -145,7 +135,6 @@
"action_manage_account_and_devices" = "Administrer konto og enheder";
"action_manage_devices" = "Administrer enheder";
"action_manage_rooms" = "Administrer rum";
"action_mark_as_read" = "Mark as read";
"action_message" = "Besked";
"action_minimize" = "Minimér";
"action_next" = "Næste";
@@ -220,7 +209,6 @@
"call_invalid_audio_device_bluetooth_devices_disabled" = "Element Call understøtter desværre ikke brug af Bluetooth-lydenheder i denne Android-version. Vælg venligst en anden lydenhed.";
"common_about" = "Om";
"common_acceptable_use_policy" = "Politik for acceptabel brug";
"common_account_settings" = "Account settings";
"common_add_account" = "Tilføj en konto";
"common_add_another_account" = "Tilføj en anden konto";
"common_adding_caption" = "Tilføjelse af billedtekst";
@@ -229,7 +217,6 @@
"common_analytics" = "Analyse-værktøj";
"common_android_shortcuts_remove_reason_left_room" = "Du forlod rummet";
"common_android_shortcuts_remove_reason_session_logged_out" = "Du blev logget ud af sessionen";
"common_app_settings" = "App settings";
"common_appearance" = "Udseende";
"common_audio" = "Lyd";
"common_beta" = "Beta";
@@ -240,8 +227,6 @@
"common_call_started" = "Opkald startet";
"common_call_you_declined" = "Du afviste et opkald";
"common_chat_backup" = "Backup af samtale";
"common_chats" = "Chats";
"common_code_block" = "Code block";
"common_copied_to_clipboard" = "Kopieret til udklipsholder";
"common_copyright" = "Ophavsret";
"common_creating_room" = "Opretter rum...";
@@ -279,12 +264,10 @@
"common_file_deleted" = "Fil slettet";
"common_file_saved" = "Fil gemt";
"common_forward_message" = "Videresend besked";
"common_forward_to" = "Forward to";
"common_frequently_used" = "Ofte brugt";
"common_gallery" = "Gallery";
"common_gif" = "GIF";
"common_group_call_in_progress" = "Group call in progress";
"common_header_rooms" = "Rooms";
"common_image" = "Billede";
"common_in_reply_to" = "Som svar på %1$@";
"common_invite_unknown_profile" = "Dette Matrix-ID kan ikke findes, så invitationen modtages muligvis ikke.";
@@ -297,25 +280,20 @@
"common_live_location_ended" = "Aktuel position afsluttet";
"common_loading" = "Indlæser...";
"common_loading_more" = "Indlæser flere...";
"common_location_sharing" = "Location sharing";
"common_media_upload_quality" = "Media upload quality";
"common_message" = "Besked";
"common_message_actions" = "Beskedhandlinger";
"common_message_failed_to_send" = "Beskeden blev ikke sendt";
"common_message_layout" = "Layout på beskeder";
"common_message_removed" = "Beskeden er fjernet";
"common_moderation_and_safety" = "Moderation & safety";
"common_modern" = "Moderne";
"common_mute" = "Lydløs";
"common_name" = "Navn";
"common_name_and_id" = "%1$@ (%2$@)";
"common_no_results" = "Ingen resultater";
"common_no_results_for" = "There are no results for “%1$@”. Try a new search term.";
"common_no_room_name" = "Intet rumnavn";
"common_no_space_name" = "Intet klyngenavn";
"common_not_encrypted" = "Ikke krypteret";
"common_offline" = "Offline";
"common_on_a_call" = "On a call";
"common_open_source_licenses" = "Open Source-licenser";
"common_optic_id_ios" = "Optisk ID";
"common_or" = "eller";
@@ -349,7 +327,6 @@
"common_replying_to" = "Svarer til %1$@";
"common_report_a_problem" = "Anmeld et problem";
"common_report_submitted" = "Anmeldelsen er indsendt";
"common_results_for" = "Results for “%1$@”";
"common_rich_text_editor" = "Rich text editor";
"common_role" = "Rolle";
"common_room" = "Rum";
@@ -377,7 +354,6 @@
"common_shared_live_location" = "Deling af aktuel position";
"common_shared_location" = "Delt placering";
"common_shared_space" = "Delt klynge";
"common_signed_in" = "Signed in";
"common_signing_out" = "Fjerner enhed";
"common_something_went_wrong" = "Noget gik galt";
"common_something_went_wrong_message" = "Vi stødte på et problem. Prøv venligst igen.";
@@ -389,7 +365,6 @@
"common_success" = "Succes";
"common_suggested" = "Forslag";
"common_suggestions" = "Forslag";
"common_switch_accounts" = "Switch accounts";
"common_syncing" = "Synkroniserer";
"common_text" = "Tekst";
"common_third_party_notices" = "Tredjepartsmeddelelser";
@@ -430,14 +405,12 @@
"common_waiting_live_location" = "Venter på aktuel position...";
"common_world_readable_history" = "Alle kan se historikken";
"common_you" = "Dig";
"common_your_account" = "Your account";
"confirm_recovery_key_banner_message" = "Bekræft din gendannelsesnøgle for at bevare adgangen til nøglelager og meddelelseshistorik.";
"confirm_recovery_key_banner_primary_button_title" = "Indtast din gendannelsesnøgle";
"confirm_recovery_key_banner_secondary_button_title" = "Har du glemt din gendannelsesnøgle?";
"confirm_recovery_key_banner_title" = "Dit nøglelager er ikke synkroniseret";
"content_scanner_not_found" = "Download not available.";
"content_scanner_not_found_title" = "Something went wrong";
"content_scanner_scanning" = "Scanning…";
"content_scanner_not_found_title" = "File not found";
"content_scanner_unsafe_message" = "Preview and download have been disabled.";
"content_scanner_unsafe_title" = "The file is not safe";
"crash_detection_dialog_content" = "%1$@ crashede sidste gang den blev brugt. Vil du dele en ulykkesrapport med os?";
@@ -511,11 +484,6 @@
"error_no_compatible_app_found" = "Der blev ikke fundet nogen kompatibel app til at håndtere denne handling.";
"error_room_address_already_exists" = "Denne rumadresse er allerede taget. Prøv at redigere rummets adressefelt eller at skifte rummets navn";
"error_room_address_invalid_symbols" = "Nogle tegn er ikke tilladt. Kun bogstaver, cifre og følgende symboler understøttes! $ & '() * +/; =? @ [] - . _";
"error_sending_failure_invalid_mime_type" = "Invalid mime type: %@";
"error_sending_failure_missing_media_content" = "Missing media content";
"error_sending_failure_other" = "Error details: %@";
"error_sending_failure_sending_from_unverified_device" = "Sending from unverified device";
"error_sending_failure_unknown" = "Unknown error";
"error_some_messages_have_not_been_sent" = "Nogle beskeder er ikke blevet sendt";
"error_unknown" = "Beklager, der opstod en fejl";
"error.account_already_logged_in" = "Du er allerede logget ind på denne enhed som %1$@.";
@@ -545,8 +513,6 @@
"notification_invitation_action_reject" = "Afvis";
"notification_invite_body" = "Inviterede dig til at samtale";
"notification_invite_body_with_sender" = "%1$@ inviterede dig til at samtale";
"notification_knock_request_body" = "Requested to join";
"notification_live_location_started_body" = "Started sharing their live location";
"notification_mentioned_you_body" = "Nævnte dig: %1$@";
"notification_new_messages" = "Nye beskeder";
"notification_reaction_body" = "Reagerede med%1$@";
@@ -737,16 +703,8 @@
"screen_change_server_error_unauthorized_homeserver_title" = "Kontoudbyder %1$@ er ikke tilladt.";
"screen_change_server_form_header" = "URL-adressen på din hjemmeserver";
"screen_change_server_form_notice" = "Indtast en domæneadresse.";
"screen_change_server_navigation_title_login" = "Sign in";
"screen_change_server_navigation_title_register" = "Create account";
"screen_change_server_subtitle" = "Hvad er adressen på din server?";
"screen_change_server_textfield_footer_login" = "If your account is provided by your company or a community, then change the account provider (example: companyname.com).";
"screen_change_server_textfield_footer_register" = "Create an account on matrix.org for free. If you want to create an account with a different provider, then change it accordingly (example: communityname.org).";
"screen_change_server_textfield_header" = "Account provider";
"screen_change_server_textfield_placeholder" = "example.com";
"screen_change_server_title" = "Vælg din server";
"screen_change_server_title_login" = "Enter your account provider";
"screen_change_server_title_register" = "Choose an account provider";
"screen_chat_backup_key_backup_action_disable" = "Slet nøglelager";
"screen_chat_backup_key_backup_action_enable" = "Aktivér sikkerhedskopiering";
"screen_chat_backup_key_backup_description" = "Dette giver dig mulighed for at se din chathistorik på alle nye enheder og er påkrævet til sikkerhedskopiering af chats og digital identitet.%1$@ .";
@@ -966,10 +924,6 @@
"screen_knock_requests_list_empty_state_title" = "Ingen ventende anmodning om at deltage";
"screen_knock_requests_list_initial_loading_title" = "Indlæser anmodninger om at deltage...";
"screen_knock_requests_list_title" = "Anmodninger om at deltage";
"screen_labs_enable_gallery" = "Gallery messages";
"screen_labs_enable_gallery_description" = "Send multiple images or videos in one go. Stable on mobile, but not yet supported by web.";
"screen_labs_enable_knocking" = "Ask to join";
"screen_labs_enable_knocking_description" = "Users can request access to a room that is not open for anyone to join. Stable on mobile, web implementation exists but is experimental.";
"screen_labs_enable_threads" = "Aktivér svar-tråde";
"screen_labs_enable_threads_description" = "Appen genstarter for at anvende denne ændring.";
"screen_labs_header_description" = "Prøv vores nyeste idéer under udvikling. Disse funktioner er ikke færdige; de ​​kan være ustabile og kan ændre sig.";
@@ -990,7 +944,6 @@
"screen_link_new_device_desktop_step3" = "Scan QR-koden med denne enhed";
"screen_link_new_device_desktop_submit" = "Klar til at scanne";
"screen_link_new_device_desktop_title" = "Åbn %1$@ på en stationær computer for at få QR-koden";
"screen_link_new_device_desktop_warning" = "Only scan a QR code after following the steps above on your own device. Never scan a code sent by another person.";
"screen_link_new_device_enter_number_error_numbers_do_not_match" = "Tallene stemmer ikke overens";
"screen_link_new_device_enter_number_notice" = "Indtast 2-cifret kode";
"screen_link_new_device_enter_number_subtitle" = "Dette vil bekræfte, at forbindelsen til din anden enhed er sikker.";
@@ -1017,8 +970,6 @@
"screen_live_location_sheet_nobody_sharing" = "Ingen deler deres placering";
"screen_live_location_sheet_sharing_live_location" = "Deler placering live";
"screen_live_location_sheet_title" = "På kortet";
"screen_local_network_opt_in_subtitle" = "Your homeserver is on your local network. To connect, %1$@ needs permission to reach devices on this network.";
"screen_local_network_opt_in_title" = "Allow access to local network";
"screen_login_error_deactivated_account" = "Denne konto er blevet slettet.";
"screen_login_error_invalid_credentials" = "Forkert brugernavn og/eller adgangskode";
"screen_login_error_invalid_user_id" = "Dette er ikke en gyldig brugeridentifikation. Forventet format: '@bruger:hjemmeserver.org'";
@@ -1073,12 +1024,6 @@
"screen_missing_key_backup_step_4" = "Følg instruktionerne for at aktivere dit nøglelager";
"screen_missing_key_backup_step_5" = "Gå tilbage til %1$@";
"screen_missing_key_backup_title" = "Aktivér dit nøglelager, før du fortsætter til %1$@";
"screen_moderation_and_safety_invites_heading" = "Invites";
"screen_moderation_and_safety_other_users_heading" = "Other users";
"screen_moderation_and_safety_share_presence_heading" = "Your appearance";
"screen_multi_account_announcement_action" = "Add account";
"screen_multi_account_announcement_description" = "Go to %1$@ to sign into another account. Then you can easily switch between them.";
"screen_multi_account_announcement_title" = "You can now add multiple accounts";
"screen_notification_optin_subtitle" = "Du kan ændre dine indstillinger senere.";
"screen_notification_optin_title" = "Tillad notifikationer, og gå aldrig glip af en besked";
"screen_notification_settings_additional_settings_section_title" = "Yderligere indstillinger";
@@ -1107,8 +1052,6 @@
"screen_notification_settings_mode_mentions" = "Omtaler";
"screen_notification_settings_notification_section_title" = "Giv mig besked om";
"screen_notification_settings_room_mention_label" = "Giv mig besked ved @room";
"screen_notification_settings_show_all_activity_subtitle" = "Dots or number of unread messages";
"screen_notification_settings_show_all_activity_title" = "Show all activity in the room list";
"screen_notification_settings_sound_custom_fallback" = "Custom";
"screen_notification_settings_sound_custom_sound_button_title" = "Custom sound...";
"screen_notification_settings_sound_delete_sound_error_title" = "Error deleting file";
@@ -1169,14 +1112,6 @@
"screen_polls_history_filter_ongoing" = "Igangværende";
"screen_polls_history_filter_past" = "Tidligere";
"screen_polls_history_title" = "Afstemninger";
"screen_ptt_settings_battery_optimization" = "Ignore battery optimisation";
"screen_ptt_settings_battery_optimization_description" = "Stay active in background";
"screen_ptt_settings_covert_mode" = "Covert mode";
"screen_ptt_settings_covert_mode_description" = "Mute all channels";
"screen_ptt_settings_lock_screen" = "Show on lock screen";
"screen_ptt_settings_lock_screen_description" = "Access from the lock screen";
"screen_ptt_settings_system_overlay" = "Enable system overlay";
"screen_ptt_settings_system_overlay_description" = "Access a floating action button";
"screen_push_history_title" = "Push-historik";
"screen_qr_code_login_connecting_subtitle" = "Etablerer en sikker forbindelse";
"screen_qr_code_login_connection_note_secure_state_description" = "Der kunne ikke oprettes en sikker forbindelse til den nye enhed. Dine eksisterende enheder er stadig sikre, og du behøver ikke bekymre dig om dem.";
@@ -1321,14 +1256,7 @@
"screen_room_change_role_section_users" = "Medlemmer";
"screen_room_change_role_unsaved_changes_description" = "Du har ændringer, der ikke er gemt.";
"screen_room_change_role_unsaved_changes_title" = "Gem ændringer?";
"screen_room_confirm_removal_reason_label" = "Reason (optional)";
"screen_room_confirm_removal_reason_placeholder" = "Enter reason…";
"screen_room_confirm_removal_reason_supporting_text" = "(Optional)";
"screen_room_confirm_removal_title" = "Remove message?";
"screen_room_details_add_topic_title" = "Tilføj emne";
"screen_room_details_audio_push_to_talk" = "Push to talk";
"screen_room_details_audio_title" = "Room Audio";
"screen_room_details_audio_video_calls" = "Video calls";
"screen_room_details_badge_encrypted" = "Krypteret";
"screen_room_details_badge_not_encrypted" = "Ikke krypteret";
"screen_room_details_badge_public" = "Offentligt rum";
@@ -1354,9 +1282,6 @@
"screen_room_details_profile_row_title" = "Profil";
"screen_room_details_requests_to_join_title" = "Anmodninger om at deltage";
"screen_room_details_roles_and_permissions" = "Roller og tilladelser";
"screen_room_details_room_audio_ptt" = "Push to talk";
"screen_room_details_room_audio_title" = "Room Audio";
"screen_room_details_room_audio_video_calls" = "Video calls";
"screen_room_details_room_name_label" = "Navn";
"screen_room_details_security_and_privacy_title" = "Sikkerhed og privatliv";
"screen_room_details_security_title" = "Sikkerhed";
@@ -1376,7 +1301,6 @@
"screen_room_invite_again_alert_message" = "Vil du invitere dem igen?";
"screen_room_invite_again_alert_title" = "Du er alene i denne samtale";
"screen_room_live_location_banner" = "Deler placering live";
"screen_room_maximum_messages_selected" = "Maximum messages selected";
"screen_room_member_details_block_alert_action" = "Bloker";
"screen_room_member_details_block_alert_description" = "Blokerede brugere vil ikke være i stand til at sende dig beskeder, og alle deres beskeder vil blive skjult. Du kan fjerne blokeringen af dem når som helst.";
"screen_room_member_details_block_user" = "Bloker bruger";
@@ -1416,9 +1340,8 @@
"screen_room_notification_settings_error_restoring_default" = "Gendannelse af standardtilstanden mislykkedes. Prøv igen.";
"screen_room_notification_settings_error_setting_mode" = "Kunne ikke indstille tilstanden. Prøv igen.";
"screen_room_notification_settings_mentions_only_disclaimer" = "Din hjemmeserver understøtter ikke denne indstilling i krypterede rum, du får ikke besked i dette rum.";
"screen_room_notification_settings_mode_all_messages" = "All messages";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Mentions and replies only";
"screen_room_notification_settings_mode_mute" = "Mute";
"screen_room_notification_settings_mode_all_messages" = "Alle beskeder";
"screen_room_notification_settings_mode_mentions_and_keywords" = "Kun omtaler og nøgleord";
"screen_room_notification_settings_room_custom_settings_title" = "Giv mig besked i dette rum for";
"screen_room_pinned_banner_indicator" = "%1$@ af %2$@";
"screen_room_pinned_banner_indicator_description" = "%1$@ Fastgjorte beskeder";
@@ -1443,7 +1366,6 @@
"screen_room_roles_and_permissions_room_details" = "Detaljer om rummet";
"screen_room_roles_and_permissions_space_details" = "Detaljer om klynge";
"screen_room_roles_and_permissions_title" = "Roller og tilladelser";
"screen_room_select_error_cannot_load_rooms" = "The room list associated with this account cannot be loaded.";
"screen_room_single_knock_request_accept_button_title" = "Accepter";
"screen_room_single_knock_request_title" = "%1$@ ønsker at deltage i dette rum";
"screen_room_single_knock_request_view_button_title" = "Vis";
@@ -1480,8 +1402,6 @@
"screen_roomlist_filter_invites_empty_state_title" = "Du har ingen afventende invitationer.";
"screen_roomlist_filter_low_priority" = "Lav prioritet";
"screen_roomlist_filter_low_priority_empty_state_title" = "Du har endnu ingen chats med lav prioritet";
"screen_roomlist_filter_mention" = "Mention";
"screen_roomlist_filter_mention_empty_state_title" = "You don’t have any unread mentions";
"screen_roomlist_filter_mixed_empty_state_subtitle" = "Du kan fravælge filtre for at se dine andre samtaler";
"screen_roomlist_filter_mixed_empty_state_title" = "Du har ingen samtaler til dette valg";
"screen_roomlist_filter_people" = "Brugere";
@@ -1568,13 +1488,10 @@
"screen_session_verification_request_title" = "Anmodet om verifikation";
"screen_session_verification_they_dont_match" = "De matcher ikke";
"screen_session_verification_they_match" = "De matcher";
"screen_session_verification_unavailable_subtitle" = "Please use another device or recovery key.";
"screen_session_verification_unavailable_title" = "Verification with this device is currently unavailable";
"screen_session_verification_use_another_device_subtitle" = "Sørg for, at du har appen åben på den anden enhed, før du starter verifikationen herfra.";
"screen_session_verification_use_another_device_title" = "Åbn appen på en anden bekræftet enhed";
"screen_session_verification_user_initiator_subtitle" = "For ekstra sikkerhed, verificér denne bruger ved at sammenligne et sæt emojier på jeres enheder. Gør dette ved at bruge en kommunikationsmetode i stoler på.";
"screen_session_verification_user_initiator_title" = "Verificér denne bruger?";
"screen_session_verification_user_requesting_verification" = "User requesting verification:";
"screen_session_verification_user_responder_subtitle" = "For ekstra sikkerhed ønsker en anden bruger at bekræfte din digitale identitet. I vil blive vist et sæt emojis, der skal sammenlignes.";
"screen_session_verification_waiting_another_device_subtitle" = "Du burde se en popup på den anden enhed. Start verifikationen derfra nu.";
"screen_session_verification_waiting_another_device_title" = "Start verifikation på den anden enhed";
@@ -1583,15 +1500,6 @@
"screen_session_verification_waiting_subtitle" = "Når du er blevet accepteret, kan du fortsætte med verifikationen.";
"screen_session_verification_waiting_to_accept_subtitle" = "Accepter anmodningen om at starte bekræftelsesprocessen i din anden session for at fortsætte.";
"screen_session_verification_waiting_to_accept_title" = "Venter på at acceptere anmodningen";
"screen_settings_add_account" = "Add account";
"screen_settings_user_status_away" = "Away";
"screen_settings_user_status_be_right_back" = "Be right back";
"screen_settings_user_status_custom" = "Custom…";
"screen_settings_user_status_custom_hint" = "Custom status…";
"screen_settings_user_status_focus_time" = "Focus time";
"screen_settings_user_status_in_a_meeting" = "In a meeting";
"screen_settings_user_status_on_the_road" = "On the road";
"screen_settings_user_status_placeholder" = "What's your status?";
"screen_share_location_live_location_disclaimer_title" = "Din live-positionshistorik gemmes i rummet og er synlig for medlemmerne, når sessionen er afsluttet.";
"screen_share_location_live_location_duration_picker_title" = "Vælg, hvor længe du vil dele din aktuelle position.";
"screen_share_location_live_location_missing_permissions" = "You do not have permissions to share your live location in this room";
@@ -1606,7 +1514,6 @@
"screen_signed_out_reason_2" = "Du har slettet sessionen fra en anden session";
"screen_signed_out_reason_3" = "Din serveradministrator har lukket for din adgang";
"screen_signed_out_subtitle" = "Du er muligvis blevet logget ud på grund af en af nedenstående årsager. Log ind igen for at fortsætte med at bruge%@.";
"screen_signed_out_subtitle_v2" = "This device was removed for one of the reasons listed below. Please sign in again to connect this device to your account.";
"screen_signed_out_title" = "Du er logget ud";
"screen_signout_confirmation_dialog_content" = "Er du sikker på, at ønsker at fjerne denne enhed?";
"screen_signout_confirmation_dialog_submit" = "Fjern denne enhed";
@@ -1783,7 +1690,6 @@
"troubleshoot_notifications_test_push_loop_back_failure_2" = "Fejl: %1$@.";
"troubleshoot_notifications_test_push_loop_back_failure_3" = "Fejl, kan ikke teste push.";
"troubleshoot_notifications_test_push_loop_back_failure_4" = "Fejl, timeout venter på push.";
"troubleshoot_notifications_test_push_loop_back_failure_rate_limit" = "Error: the push gateway is rate limiting this device, so notifications won't be reliable. Please set up a different push gateway.";
"troubleshoot_notifications_test_push_loop_back_success" = "Push loop back tog %1$d ms.";
"troubleshoot_notifications_test_push_loop_back_title" = "Afprøv Push loop back";
"troubleshoot_notifications_test_unified_push_description" = "Sørg for, at UnifiedPush-distributører er tilgængelige.";
@@ -18,22 +18,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_gallery_more_media</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Gallery, %1$d more media</string>
<key>other</key>
<string>Gallery, %1$d more medias</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>a11y_polls_percent_of_total</key>
<dict>
<key>COUNT</key>
@@ -43,7 +27,7 @@
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d%% af de samlede stemmer</string>
<string>%1$d% af de samlede stemmer</string>
<key>other</key>
<string>%1$d procent af det samlede antal stemmer</string>
</dict>
@@ -66,54 +50,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>action_forward_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Forward %1$d message</string>
<key>other</key>
<string>Forward %1$d messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_attachments</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d attachment…</string>
<key>other</key>
<string>%1$d attachments…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_gallery_reply_media_items</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d media item…</string>
<key>other</key>
<string>%1$d media items…</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>common_many_members</key>
<dict>
<key>COUNT</key>
@@ -272,22 +208,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_gallery_body</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>Shared %1$d attachment</string>
<key>other</key>
<string>Shared %1$d attachments</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>notification_invitations</key>
<dict>
<key>COUNT</key>
@@ -352,22 +272,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen.room.timeline_redacted_messages</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d removed message</string>
<key>other</key>
<string>%1$d removed messages</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_advanced_settings_live_location_update_distance</key>
<dict>
<key>COUNT</key>
@@ -544,22 +448,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_messages_forwarded</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message forwarded</string>
<key>other</key>
<string>%1$d messages forwarded</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_multiple_knock_requests_title</key>
<dict>
<key>COUNT</key>
@@ -576,22 +464,6 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_selection_count</key>
<dict>
<key>COUNT</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d message selected</string>
<key>other</key>
<string>%1$d messages selected</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_room_timeline_reaction_a11y</key>
<dict>
<key>COUNT</key>
@@ -688,7 +560,7 @@
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>
</dict>
<key>screen_timeline_active_call_joined_count</key>
<key>screen_timeline_active_call_extra_joined_count</key>
<dict>
<key>COUNT</key>
<dict>
@@ -697,9 +569,9 @@
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
<key>other</key>
<string>%1$d joined</string>
<string>+ %1$d joined</string>
</dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@COUNT@</string>

Some files were not shown because too many files have changed in this diff Show More