Merge main into quenting/react-captcha

This commit is contained in:
Quentin Gliech
2026-09-08 12:38:14 +02:00
62 changed files with 1728 additions and 634 deletions
+6 -12
View File
@@ -1,26 +1,20 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 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.
name: Build the frontend assets
description: Installs Node.js and builds the frontend assets from the frontend directory
description: Installs pnpm, Node.js and the dependencies, then builds the frontend assets
runs:
using: composite
steps:
- name: Install pnpm
uses: pnpm/action-setup@v6.0.5
- name: Install Node
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
- name: Install pnpm, Node.js and the dependencies
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
node-version-file: .node-version
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
shell: sh
cache: true
require-lockfile: true
- name: Build the frontend assets
run: pnpm --filter mas-frontend run build
+12
View File
@@ -1,3 +1,4 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 2025 New Vector Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -43,6 +44,17 @@ updates:
cooldown:
default-days: 14
# Rust releases every six weeks; the cooldown lets the .1 point release land first.
- package-ecosystem: "rust-toolchain"
directory: "/"
labels:
- "A-Dependencies"
- "Z-Deps-Backend"
schedule:
interval: "weekly"
cooldown:
default-days: 14
- package-ecosystem: "github-actions"
directory: "/"
labels:
+3 -3
View File
@@ -1,3 +1,4 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 2025 New Vector Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -123,9 +124,8 @@ jobs:
persist-credentials: false
- name: Install Rust toolchain
# Install the minimal toolchain, which includes rustc, rustdoc, and cargo.
run: |
rustup toolchain install stable --profile minimal
rustup toolchain install
rustup target add ${{ matrix.target }}
- name: Setup sccache
@@ -137,7 +137,7 @@ jobs:
version: 0.13.0
- name: Install cargo-zigbuild
uses: taiki-e/install-action@b8cecb83565409bcc297b2df6e77f030b2a468d5 # v2
uses: taiki-e/install-action@b6ff580856c41316412a0b9b60540fbc6f8c82cc # v2
with:
tool: cargo-zigbuild
+23 -52
View File
@@ -68,17 +68,11 @@ jobs:
with:
persist-credentials: false
- name: Install pnpm
uses: pnpm/action-setup@v6.0.9
- name: Install Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
- name: Install pnpm, Node.js and the dependencies
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
node-version-file: .node-version
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
cache: true
require-lockfile: true
- name: Lint
run: pnpm --filter mas-frontend run lint
@@ -96,17 +90,11 @@ jobs:
with:
persist-credentials: false
- name: Install pnpm
uses: pnpm/action-setup@v6.0.9
- name: Install Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
- name: Install pnpm, Node.js and the dependencies
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
node-version-file: .node-version
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
cache: true
require-lockfile: true
- name: Test
run: pnpm --filter mas-frontend test
@@ -124,17 +112,11 @@ jobs:
with:
persist-credentials: false
- name: Install pnpm
uses: pnpm/action-setup@v6.0.9
- name: Install Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
- name: Install pnpm, Node.js and the dependencies
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
node-version-file: .node-version
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
cache: true
require-lockfile: true
- name: Check for unused dependencies
run: pnpm --filter mas-frontend run knip
@@ -153,15 +135,12 @@ jobs:
persist-credentials: false
- name: Install Rust toolchain
# Install the minimal toolchain, which includes rustc, rustdoc, and cargo.
# Then install rustfmt for `cargo fmt`.
#
# --override sets this as the default rust toolchain version in this directory.
# rustfmt runs on nightly because .rustfmt.toml uses nightly-only options.
run: |
rustup toolchain install nightly --profile minimal --component rustfmt --override
rustup toolchain install nightly --profile minimal --component rustfmt
- name: Check style
run: cargo fmt --all -- --check
run: cargo +nightly fmt --all -- --check
cargo-deny:
name: Run `cargo deny` checks
@@ -182,8 +161,6 @@ jobs:
- name: Run `cargo-deny`
uses: EmbarkStudios/cargo-deny-action@3c6349835b2b7b196a839186cb8b78e02f7b5f25 # v2.1.1
with:
rust-version: stable
check-schema:
name: Check schema
@@ -200,7 +177,7 @@ jobs:
- name: Install Rust toolchain
run: |
rustup toolchain install stable
rustup toolchain install
- name: Setup sccache
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
@@ -241,11 +218,7 @@ jobs:
persist-credentials: false
- name: Install Rust toolchain
# Install the minimal toolchain with clippy, pinned to a version kept in
# sync with Dockerfile.
#
# --override sets this as the default rust toolchain version in this directory.
run: rustup toolchain install 1.96.0 --profile minimal --component clippy --override
run: rustup toolchain install
- uses: ./.github/actions/build-policies
@@ -270,11 +243,10 @@ jobs:
persist-credentials: false
- name: Install Rust toolchain
# Install the minimal toolchain, which includes rustc, rustdoc, and cargo.
run: rustup toolchain install stable --profile minimal
run: rustup toolchain install
- name: Install nextest
uses: taiki-e/install-action@b8cecb83565409bcc297b2df6e77f030b2a468d5 # v2
uses: taiki-e/install-action@b6ff580856c41316412a0b9b60540fbc6f8c82cc # v2
with:
tool: cargo-nextest
@@ -293,7 +265,7 @@ jobs:
path: nextest-archive.tar.zst
test:
name: Run test suite with Rust stable
name: Run test suite
needs: [rustfmt, opa-lint, compile-test-artifacts]
runs-on: ubuntu-24.04
@@ -326,11 +298,10 @@ jobs:
persist-credentials: false
- name: Install Rust toolchain
# Install the minimal toolchain, which includes rustc, rustdoc, and cargo.
run: rustup toolchain install stable --profile minimal
run: rustup toolchain install
- name: Install nextest
uses: taiki-e/install-action@b8cecb83565409bcc297b2df6e77f030b2a468d5 # v2
uses: taiki-e/install-action@b6ff580856c41316412a0b9b60540fbc6f8c82cc # v2
with:
tool: cargo-nextest
@@ -410,7 +381,7 @@ jobs:
- name: Upload logs
if: ${{ failure() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: ess-helm-logs
path: ess-helm-logs
+5 -4
View File
@@ -1,3 +1,4 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 2025 New Vector Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -107,17 +108,17 @@ jobs:
persist-credentials: false
- name: Install Rust toolchain
# Install the minimal toolchain, which includes rustc, rustdoc, and cargo.
#
# llvm-tools-preview installs some llvm tools, which are needed for `grcov` below.
# See https://github.com/rust-lang/rust/issues/85658 for stability tracking issue.
run: rustup toolchain install stable --profile minimal --component llvm-tools-preview
run: |
rustup toolchain install
rustup component add llvm-tools-preview
- name: Setup sccache
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
- name: Install grcov
uses: taiki-e/install-action@b8cecb83565409bcc297b2df6e77f030b2a468d5 # v2
uses: taiki-e/install-action@b6ff580856c41316412a0b9b60540fbc6f8c82cc # v2
with:
tool: grcov
+7 -10
View File
@@ -1,3 +1,4 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 2025 New Vector Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -30,25 +31,21 @@ jobs:
persist-credentials: false
- name: Install Rust toolchain
# Install the minimal toolchain, which includes rustc, rustdoc, and cargo
run: rustup toolchain install stable --profile minimal
run: rustup toolchain install
- name: Setup sccache
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
- name: Install mdbook
uses: taiki-e/install-action@b8cecb83565409bcc297b2df6e77f030b2a468d5 # v2
uses: taiki-e/install-action@b6ff580856c41316412a0b9b60540fbc6f8c82cc # v2
with:
tool: mdbook
- name: Install pnpm
uses: pnpm/action-setup@v6.0.9
- name: Install Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
- name: Install pnpm, Node.js and the dependencies
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
node-version-file: .node-version
cache: "pnpm"
cache: true
require-lockfile: true
- name: Build the documentation
run: sh misc/build-docs.sh
+10 -22
View File
@@ -1,3 +1,4 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 2025 New Vector Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -39,20 +40,13 @@ jobs:
persist-credentials: false
- name: Install Rust toolchain
# Only the minimal profile is required here to run `cargo metadata`
run: rustup toolchain install stable --profile minimal
run: rustup toolchain install
- name: Install pnpm
uses: pnpm/action-setup@v6.0.9
- name: Install Node
uses: actions/setup-node@v7.0.0
- name: Install pnpm, Node.js and the dependencies
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
node-version-file: .node-version
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
cache: true
require-lockfile: true
- name: Compute the new minor RC
id: next
@@ -80,17 +74,11 @@ jobs:
with:
persist-credentials: false
- name: Install pnpm
uses: pnpm/action-setup@v6.0.9
- name: Install Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
- name: Install pnpm, Node.js and the dependencies
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
node-version-file: .node-version
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
cache: true
require-lockfile: true
- name: Create a new branch in Localazy
run: pnpm exec localazy branch -w "$LOCALAZY_WRITE_KEY" create main "$BRANCH"
+6 -12
View File
@@ -1,3 +1,4 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 2025 New Vector Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -38,20 +39,13 @@ jobs:
persist-credentials: false
- name: Install Rust toolchain
# Only the minimal profile is required here to run `cargo`
run: rustup toolchain install stable --profile minimal
run: rustup toolchain install
- name: Install pnpm
uses: pnpm/action-setup@v6.0.9
- name: Install Node
uses: actions/setup-node@v7.0.0
- name: Install pnpm, Node.js and the dependencies
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
node-version-file: .node-version
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
cache: true
require-lockfile: true
- name: Extract the current version
id: current
+2 -2
View File
@@ -1,3 +1,4 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 2025 New Vector Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -35,8 +36,7 @@ jobs:
persist-credentials: false
- name: Install Rust toolchain
# Only the minimal profile is required here to run `cargo metadata`
run: rustup toolchain install stable --profile minimal
run: rustup toolchain install
- name: Set the crates version
env:
+5 -10
View File
@@ -1,3 +1,4 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 2025 New Vector Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -23,17 +24,11 @@ jobs:
with:
persist-credentials: false
- name: Install pnpm
uses: pnpm/action-setup@v6.0.9
- name: Install Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
- name: Install pnpm, Node.js and the dependencies
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
node-version-file: .node-version
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
cache: true
require-lockfile: true
- name: Compute the Localazy branch name
id: branch
+5 -10
View File
@@ -1,3 +1,4 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 2025 New Vector Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -22,17 +23,11 @@ jobs:
with:
persist-credentials: false
- name: Install pnpm
uses: pnpm/action-setup@v6.0.9
- name: Install Node
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
- name: Install pnpm, Node.js and the dependencies
uses: pnpm/setup@703c52620218391530e48b9e8870d5c0082e1b9b # v2.1.0
with:
node-version-file: .node-version
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
cache: true
require-lockfile: true
- name: Compute the Localazy branch name
id: branch
+1 -4
View File
@@ -1,11 +1,8 @@
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 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.
max_width = 100
comment_width = 80
wrap_comments = true
imports_granularity = "Crate"
use_small_heuristics = "Default"
group_imports = "StdExternalCrate"
Generated
+41 -38
View File
@@ -1747,7 +1747,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys 0.61.2",
"windows-sys 0.52.0",
]
[[package]]
@@ -2127,9 +2127,9 @@ dependencies = [
[[package]]
name = "h2"
version = "0.4.15"
version = "0.4.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155"
checksum = "a9f37a958b41b3b19ee2707c06439c0e9e547e847223eb791ecb0cb821c65e27"
dependencies = [
"atomic-waker",
"bytes",
@@ -2304,9 +2304,9 @@ dependencies = [
[[package]]
name = "http-body-util"
version = "0.1.3"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c"
dependencies = [
"bytes",
"futures-core",
@@ -3198,7 +3198,7 @@ dependencies = [
[[package]]
name = "mas-axum-utils"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"axum",
@@ -3233,7 +3233,7 @@ dependencies = [
[[package]]
name = "mas-cli"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"axum",
@@ -3293,6 +3293,7 @@ dependencies = [
"serde_yaml",
"sqlx",
"syn2mas",
"tempfile",
"tokio",
"tokio-util",
"tower",
@@ -3308,7 +3309,7 @@ dependencies = [
[[package]]
name = "mas-config"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"camino",
@@ -3339,7 +3340,7 @@ dependencies = [
[[package]]
name = "mas-context"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"console",
"opentelemetry",
@@ -3356,7 +3357,7 @@ dependencies = [
[[package]]
name = "mas-data-model"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"base64ct",
"chrono",
@@ -3378,7 +3379,7 @@ dependencies = [
[[package]]
name = "mas-email"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"async-trait",
"lettre",
@@ -3389,7 +3390,7 @@ dependencies = [
[[package]]
name = "mas-handlers"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"aide",
"anyhow",
@@ -3472,7 +3473,7 @@ dependencies = [
[[package]]
name = "mas-http"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"futures-util",
"headers",
@@ -3492,7 +3493,7 @@ dependencies = [
[[package]]
name = "mas-i18n"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"camino",
"icu_datetime",
@@ -3512,7 +3513,7 @@ dependencies = [
[[package]]
name = "mas-i18n-scan"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"camino",
"clap",
@@ -3526,7 +3527,7 @@ dependencies = [
[[package]]
name = "mas-iana"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"schemars 1.2.1",
"serde",
@@ -3534,7 +3535,7 @@ dependencies = [
[[package]]
name = "mas-iana-codegen"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3551,7 +3552,7 @@ dependencies = [
[[package]]
name = "mas-jose"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"base64ct",
"chrono",
@@ -3581,7 +3582,7 @@ dependencies = [
[[package]]
name = "mas-keystore"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"aead",
"base64ct",
@@ -3609,7 +3610,7 @@ dependencies = [
[[package]]
name = "mas-listener"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"bytes",
@@ -3633,7 +3634,7 @@ dependencies = [
[[package]]
name = "mas-matrix"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3643,7 +3644,7 @@ dependencies = [
[[package]]
name = "mas-matrix-synapse"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3660,7 +3661,7 @@ dependencies = [
[[package]]
name = "mas-oidc-client"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"assert_matches",
"async-trait",
@@ -3673,6 +3674,7 @@ dependencies = [
"http",
"http-body-util",
"language-tags",
"mas-data-model",
"mas-http",
"mas-iana",
"mas-jose",
@@ -3696,7 +3698,7 @@ dependencies = [
[[package]]
name = "mas-policy"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"arc-swap",
@@ -3713,7 +3715,7 @@ dependencies = [
[[package]]
name = "mas-router"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"axum",
"serde",
@@ -3724,7 +3726,7 @@ dependencies = [
[[package]]
name = "mas-spa"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"camino",
"serde",
@@ -3733,7 +3735,7 @@ dependencies = [
[[package]]
name = "mas-storage"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"async-trait",
"chrono",
@@ -3755,7 +3757,7 @@ dependencies = [
[[package]]
name = "mas-storage-pg"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"async-trait",
"chrono",
@@ -3787,7 +3789,7 @@ dependencies = [
[[package]]
name = "mas-tasks"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3819,7 +3821,7 @@ dependencies = [
[[package]]
name = "mas-templates"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"arc-swap",
@@ -3851,7 +3853,7 @@ dependencies = [
[[package]]
name = "mas-tower"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"http",
"opentelemetry",
@@ -4103,7 +4105,7 @@ dependencies = [
[[package]]
name = "oauth2-types"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"assert_matches",
"base64ct",
@@ -5287,7 +5289,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.61.2",
"windows-sys 0.52.0",
]
[[package]]
@@ -5345,7 +5347,7 @@ dependencies = [
"security-framework",
"security-framework-sys",
"webpki-root-certs",
"windows-sys 0.61.2",
"windows-sys 0.52.0",
]
[[package]]
@@ -5958,7 +5960,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
dependencies = [
"libc",
"windows-sys 0.61.2",
"windows-sys 0.60.2",
]
[[package]]
@@ -6279,7 +6281,7 @@ dependencies = [
[[package]]
name = "syn2mas"
version = "1.22.0"
version = "1.24.0"
dependencies = [
"anyhow",
"arc-swap",
@@ -6371,7 +6373,7 @@ dependencies = [
"getrandom 0.3.3",
"once_cell",
"rustix",
"windows-sys 0.61.2",
"windows-sys 0.52.0",
]
[[package]]
@@ -6804,6 +6806,7 @@ version = "0.3.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
dependencies = [
"chrono",
"matchers",
"nu-ansi-term",
"once_cell",
@@ -7548,7 +7551,7 @@ version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [
"windows-sys 0.61.2",
"windows-sys 0.48.0",
]
[[package]]
+31 -31
View File
@@ -9,7 +9,7 @@ members = ["crates/*"]
resolver = "2"
# Updated in the CI with a `sed` command
package.version = "1.22.0"
package.version = "1.24.0"
package.license = "AGPL-3.0-only OR LicenseRef-Element-Commercial"
package.authors = ["Element Backend Team"]
package.edition = "2024"
@@ -42,35 +42,35 @@ broken_intra_doc_links = "deny"
[workspace.dependencies]
# Workspace crates
mas-axum-utils = { path = "./crates/axum-utils/", version = "=1.22.0" }
mas-cli = { path = "./crates/cli/", version = "=1.22.0" }
mas-config = { path = "./crates/config/", version = "=1.22.0" }
mas-context = { path = "./crates/context/", version = "=1.22.0" }
mas-data-model = { path = "./crates/data-model/", version = "=1.22.0" }
mas-email = { path = "./crates/email/", version = "=1.22.0" }
mas-graphql = { path = "./crates/graphql/", version = "=1.22.0" }
mas-handlers = { path = "./crates/handlers/", version = "=1.22.0" }
mas-http = { path = "./crates/http/", version = "=1.22.0" }
mas-i18n = { path = "./crates/i18n/", version = "=1.22.0" }
mas-i18n-scan = { path = "./crates/i18n-scan/", version = "=1.22.0" }
mas-iana = { path = "./crates/iana/", version = "=1.22.0" }
mas-iana-codegen = { path = "./crates/iana-codegen/", version = "=1.22.0" }
mas-jose = { path = "./crates/jose/", version = "=1.22.0" }
mas-keystore = { path = "./crates/keystore/", version = "=1.22.0" }
mas-listener = { path = "./crates/listener/", version = "=1.22.0" }
mas-matrix = { path = "./crates/matrix/", version = "=1.22.0" }
mas-matrix-synapse = { path = "./crates/matrix-synapse/", version = "=1.22.0" }
mas-oidc-client = { path = "./crates/oidc-client/", version = "=1.22.0" }
mas-policy = { path = "./crates/policy/", version = "=1.22.0" }
mas-router = { path = "./crates/router/", version = "=1.22.0" }
mas-spa = { path = "./crates/spa/", version = "=1.22.0" }
mas-storage = { path = "./crates/storage/", version = "=1.22.0" }
mas-storage-pg = { path = "./crates/storage-pg/", version = "=1.22.0" }
mas-tasks = { path = "./crates/tasks/", version = "=1.22.0" }
mas-templates = { path = "./crates/templates/", version = "=1.22.0" }
mas-tower = { path = "./crates/tower/", version = "=1.22.0" }
oauth2-types = { path = "./crates/oauth2-types/", version = "=1.22.0" }
syn2mas = { path = "./crates/syn2mas", version = "=1.22.0" }
mas-axum-utils = { path = "./crates/axum-utils/", version = "=1.24.0" }
mas-cli = { path = "./crates/cli/", version = "=1.24.0" }
mas-config = { path = "./crates/config/", version = "=1.24.0" }
mas-context = { path = "./crates/context/", version = "=1.24.0" }
mas-data-model = { path = "./crates/data-model/", version = "=1.24.0" }
mas-email = { path = "./crates/email/", version = "=1.24.0" }
mas-graphql = { path = "./crates/graphql/", version = "=1.24.0" }
mas-handlers = { path = "./crates/handlers/", version = "=1.24.0" }
mas-http = { path = "./crates/http/", version = "=1.24.0" }
mas-i18n = { path = "./crates/i18n/", version = "=1.24.0" }
mas-i18n-scan = { path = "./crates/i18n-scan/", version = "=1.24.0" }
mas-iana = { path = "./crates/iana/", version = "=1.24.0" }
mas-iana-codegen = { path = "./crates/iana-codegen/", version = "=1.24.0" }
mas-jose = { path = "./crates/jose/", version = "=1.24.0" }
mas-keystore = { path = "./crates/keystore/", version = "=1.24.0" }
mas-listener = { path = "./crates/listener/", version = "=1.24.0" }
mas-matrix = { path = "./crates/matrix/", version = "=1.24.0" }
mas-matrix-synapse = { path = "./crates/matrix-synapse/", version = "=1.24.0" }
mas-oidc-client = { path = "./crates/oidc-client/", version = "=1.24.0" }
mas-policy = { path = "./crates/policy/", version = "=1.24.0" }
mas-router = { path = "./crates/router/", version = "=1.24.0" }
mas-spa = { path = "./crates/spa/", version = "=1.24.0" }
mas-storage = { path = "./crates/storage/", version = "=1.24.0" }
mas-storage-pg = { path = "./crates/storage-pg/", version = "=1.24.0" }
mas-tasks = { path = "./crates/tasks/", version = "=1.24.0" }
mas-templates = { path = "./crates/templates/", version = "=1.24.0" }
mas-tower = { path = "./crates/tower/", version = "=1.24.0" }
oauth2-types = { path = "./crates/oauth2-types/", version = "=1.24.0" }
syn2mas = { path = "./crates/syn2mas", version = "=1.24.0" }
# OpenAPI schema generation and validation
[workspace.dependencies.aide]
@@ -688,7 +688,7 @@ features = ["cors", "fs", "add-extension", "set-header"]
version = "0.1.41"
[workspace.dependencies.tracing-subscriber]
version = "0.3.23"
features = ["env-filter"]
features = ["env-filter", "chrono"]
[workspace.dependencies.tracing-appender]
version = "0.2.5"
+40 -18
View File
@@ -13,9 +13,8 @@
# The Debian version and version name must be in sync
ARG DEBIAN_VERSION=13
ARG DEBIAN_VERSION_NAME=trixie
# Keep in sync with .github/workflows/ci.yaml
ARG RUSTC_VERSION=1.96.0
# Keep in sync with .node-version
ARG RUSTUP_VERSION=1.29.0
# Keep in sync with .node-version and devEngines.runtime in package.json
ARG NODEJS_VERSION=24.15.0
# Keep in sync with .github/actions/build-policies/action.yml and policies/Makefile
ARG OPA_VERSION=1.13.1
@@ -39,8 +38,10 @@ COPY ./package.json ./pnpm-workspace.yaml ./pnpm-lock.yaml /app/
COPY ./frontend/package.json /app/frontend/
# Network access: to fetch dependencies
# The base image already provides the Node.js version pinned in
# `devEngines.runtime`, so skip pnpm's own runtime download.
RUN --network=default \
pnpm install --frozen-lockfile
pnpm install --frozen-lockfile --no-runtime
COPY ./frontend/ /app/frontend/
COPY ./templates/ /app/templates/
@@ -76,10 +77,42 @@ RUN --network=none \
########################################
## Build stage that builds the binary ##
########################################
FROM --platform=${BUILDPLATFORM} docker.io/library/rust:${RUSTC_VERSION}-${DEBIAN_VERSION_NAME} AS builder
FROM --platform=${BUILDPLATFORM} docker.io/library/buildpack-deps:${DEBIAN_VERSION_NAME} AS builder
ARG BUILDARCH
ARG CARGO_AUDITABLE_VERSION
ARG RUSTC_VERSION
ARG RUSTUP_VERSION
ENV RUSTUP_HOME=/usr/local/rustup \
CARGO_HOME=/usr/local/cargo \
PATH=/usr/local/cargo/bin:$PATH
# Checksums come from https://static.rust-lang.org/rustup/archive/<version>/<triple>/rustup-init.sha256
# Network access: to download rustup
RUN --network=default \
case "${BUILDARCH}" in \
amd64) RUSTUP_TRIPLE="x86_64-unknown-linux-gnu"; RUSTUP_SHA256="4acc9acc76d5079515b46346a485974457b5a79893cfb01112423c89aeb5aa10" ;; \
arm64) RUSTUP_TRIPLE="aarch64-unknown-linux-gnu"; RUSTUP_SHA256="9732d6c5e2a098d3521fca8145d826ae0aaa067ef2385ead08e6feac88fa5792" ;; \
*) echo "unsupported architecture: ${BUILDARCH}" >&2; exit 1 ;; \
esac && \
curl -fsSLo rustup-init "https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/${RUSTUP_TRIPLE}/rustup-init" && \
echo "${RUSTUP_SHA256} *rustup-init" | sha256sum -c - && \
chmod +x rustup-init && \
./rustup-init -y --no-modify-path --default-toolchain none && \
rm rustup-init
# Set the working directory
WORKDIR /app
# Copied on its own so the toolchain layer is cached independently of the source tree
COPY rust-toolchain.toml ./
# Network access: to download the toolchain and the cross-compilation targets
RUN --network=default \
rustup toolchain install && \
rustup target add \
x86_64-unknown-linux-gnu \
aarch64-unknown-linux-gnu
# Install pinned versions of cargo-auditable
# Network access: to fetch dependencies
@@ -87,14 +120,6 @@ RUN --network=default \
cargo install --locked \
cargo-auditable@=${CARGO_AUDITABLE_VERSION}
# Install all cross-compilation targets
# Network access: to download the targets
RUN --network=default \
rustup target add \
--toolchain "${RUSTC_VERSION}" \
x86_64-unknown-linux-gnu \
aarch64-unknown-linux-gnu
RUN --network=none \
dpkg --add-architecture arm64 && \
dpkg --add-architecture amd64
@@ -120,9 +145,6 @@ ENV \
CC_x86_64_unknown_linux_gnu=x86_64-linux-gnu-gcc \
CXX_x86_64_unknown_linux_gnu=x86_64-linux-gnu-g++
# Set the working directory
WORKDIR /app
# Copy the code
COPY ./ /app
ENV SQLX_OFFLINE=true
@@ -134,7 +156,7 @@ ARG TARGETARCH
# Network access: cargo auditable needs it
RUN --network=default \
--mount=type=cache,target=/root/.cargo/registry \
--mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/app/target \
RUST_TARGET=$(case "${TARGETARCH}" in \
amd64) echo "x86_64-unknown-linux-gnu" ;; \
+3
View File
@@ -91,6 +91,9 @@ mas-tower.workspace = true
syn2mas.workspace = true
[dev-dependencies]
tempfile = "3"
[build-dependencies]
anyhow.workspace = true
vergen-gitcl.workspace = true
+8 -5
View File
@@ -217,11 +217,14 @@ impl LifecycleManager {
self.hard_shutdown_token().cancel();
// TODO: we may want to have a time out on the task tracker, in case we have
// really stuck tasks on it
self.task_tracker().wait().await;
tracing::info!("All tasks are done, exitting");
tokio::select! {
() = self.task_tracker().wait() => {
tracing::info!("All tasks are done, exiting");
},
() = tokio::time::sleep(self.timeout) => {
tracing::warn!("Hard shutdown timeout reached with tasks still running, exiting anyway");
},
}
if likely_crashed {
ExitCode::FAILURE
+57
View File
@@ -627,4 +627,61 @@ mod tests {
let manager = password_manager_from_config(&config).await;
assert!(manager.is_err());
}
/// RAII guard that removes an environment variable when dropped,
/// ensuring cleanup even if the test panics.
struct EnvVarGuard(&'static str);
impl EnvVarGuard {
fn set(key: &'static str, value: impl AsRef<std::ffi::OsStr>) -> Self {
// SAFETY: single-threaded tokio test runtime; no other thread
// is reading or writing the environment concurrently.
#[expect(unsafe_code)]
unsafe {
std::env::set_var(key, value);
}
Self(key)
}
}
impl Drop for EnvVarGuard {
fn drop(&mut self) {
// SAFETY: single-threaded tokio test runtime; no other thread
// is reading or writing the environment concurrently.
#[expect(unsafe_code)]
unsafe {
std::env::remove_var(self.0);
}
}
}
#[tokio::test]
async fn test_database_connection_with_pgpass() {
// Write a temporary pgpass file and point PGPASSFILE at it
let pgpass_content = "*:*:*:testuser:testpassword\n";
let pgpass_file = tempfile::NamedTempFile::new().expect("failed to create temp file");
tokio::fs::write(pgpass_file.path(), pgpass_content)
.await
.expect("failed to write pgpass file");
// Set PGPASSFILE for sqlx to pick up the password from the pgpass file
let _guard = EnvVarGuard::set("PGPASSFILE", pgpass_file.path());
let config = serde_json::from_value(serde_json::json!({
"uri": "postgresql://testuser@localhost/test"
}))
.unwrap();
let opts = DatabaseConnectOptions {
log_slow_statements: false,
};
let result = database_connect_options_from_config(&config, &opts).await;
assert!(result.is_ok());
let debug = format!("{:?}", result.unwrap());
assert!(
debug.contains("testpassword"),
"pgpass password was not resolved: {debug}"
);
}
}
+7 -2
View File
@@ -4,6 +4,8 @@
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
// Please see LICENSE files in the repository root for full details.
use std::sync::LazyLock;
use console::{Color, Style};
use opentelemetry::{TraceId, trace::TraceContextExt as _};
use tracing::{Level, Subscriber};
@@ -12,13 +14,16 @@ use tracing_subscriber::{
fmt::{
FormatEvent, FormatFields,
format::{DefaultFields, Writer},
time::{FormatTime, SystemTime},
time::{ChronoLocal, FormatTime},
},
registry::LookupSpan,
};
use crate::LogContext;
static TIMER: LazyLock<ChronoLocal> =
LazyLock::new(|| ChronoLocal::new("%Y-%m-%dT%H:%M:%S%.6f%:z".to_owned()));
/// An event formatter usable by the [`tracing_subscriber`] crate, which
/// includes the log context and the OTEL trace ID.
#[derive(Debug, Default)]
@@ -98,7 +103,7 @@ where
let ansi = writer.has_ansi_escapes();
let metadata = event.metadata();
SystemTime.format_time(&mut writer)?;
TIMER.format_time(&mut writer)?;
let level = FmtLevel::new(metadata.level(), ansi);
write!(&mut writer, " {level} ")?;
+1 -5
View File
@@ -125,13 +125,9 @@ pub fn doc(operation: TransformOperation) -> TransformOperation {
let response = ErrorResponse::from_error(&RouteError::UsernameNotValid);
t.description("Username is not valid").example(response)
})
.response_with::<409, RouteError, _>(|t| {
let response = ErrorResponse::from_error(&RouteError::UserAlreadyExists);
t.description("User already exists").example(response)
})
.response_with::<409, RouteError, _>(|t| {
let response = ErrorResponse::from_error(&RouteError::UsernameReserved);
t.description("Username is reserved by the homeserver")
t.description("User already exists or the username is reserved by the homeserver")
.example(response)
})
}
+41
View File
@@ -155,6 +155,9 @@ pub enum Credentials {
#[serde(rename = "m.login.token")]
Token { token: String },
#[serde(rename = "m.login.application_service")]
ApplicationService,
#[serde(other)]
Unsupported,
}
@@ -164,6 +167,7 @@ impl Credentials {
match self {
Self::Password { .. } => "m.login.password",
Self::Token { .. } => "m.login.token",
Self::ApplicationService => "m.login.application_service",
Self::Unsupported => "unsupported",
}
}
@@ -199,6 +203,9 @@ pub enum RouteError {
#[error("unsupported login method")]
Unsupported,
#[error("appservice login not supported")]
AppserviceLoginUnsupported,
#[error("unsupported identifier type")]
UnsupportedIdentifier,
@@ -266,6 +273,11 @@ impl IntoResponse for RouteError {
error: "Invalid login type",
status: StatusCode::BAD_REQUEST,
},
Self::AppserviceLoginUnsupported => MatrixError {
errcode: "M_APPSERVICE_LOGIN_UNSUPPORTED",
error: "Application services can't log in through the legacy authentication API on this server",
status: StatusCode::BAD_REQUEST,
},
Self::UnsupportedIdentifier => MatrixError {
errcode: "M_UNKNOWN",
error: "Unsupported login identifier",
@@ -394,6 +406,10 @@ pub(crate) async fn post(
.await?
}
(_, Credentials::ApplicationService) => {
return Err(RouteError::AppserviceLoginUnsupported);
}
_ => {
return Err(RouteError::Unsupported);
}
@@ -1686,6 +1702,31 @@ mod tests {
"###);
}
/// Test the response of an `m.login.application_service` login.
#[sqlx::test(migrator = "mas_storage_pg::MIGRATOR")]
async fn test_appservice_login_unsupported(pool: PgPool) {
setup();
let state = TestState::from_pool(pool).await.unwrap();
let request = Request::post("/_matrix/client/v3/login").json(serde_json::json!({
"type": "m.login.application_service",
"identifier": {
"type": "m.id.user",
"user": "_irc_example",
},
}));
let response = state.request(request).await;
response.assert_status(StatusCode::BAD_REQUEST);
let body: serde_json::Value = response.json();
insta::assert_json_snapshot!(body, @r###"
{
"errcode": "M_APPSERVICE_LOGIN_UNSUPPORTED",
"error": "Application services can't log in through the legacy authentication API on this server"
}
"###);
}
/// Test `m.login.token` login flow.
#[sqlx::test(migrator = "mas_storage_pg::MIGRATOR")]
async fn test_login_token_login(pool: PgPool) {
+2
View File
@@ -51,3 +51,5 @@ rand_chacha.workspace = true
rustls.workspace = true
tokio.workspace = true
wiremock.workspace = true
mas-data-model.workspace = true
+7 -2
View File
@@ -7,6 +7,7 @@
use std::collections::HashMap;
use chrono::{DateTime, Duration, Utc};
use mas_data_model::{Clock, clock::MockClock};
use mas_iana::{jose::JsonWebSignatureAlg, oauth::OAuthClientAuthenticationMethod};
use mas_jose::{
claims::{self, hash_token},
@@ -37,9 +38,13 @@ const REFRESH_TOKEN: &str = "RefreshToken1";
const SUBJECT_IDENTIFIER: &str = "SubjectID";
const ID_TOKEN_SIGNING_ALG: JsonWebSignatureAlg = JsonWebSignatureAlg::Rs256;
/// The current time, as seen by every test in this crate.
///
/// Tests never read the system clock: they use a [`MockClock`] frozen at a
/// fixed instant, so token timestamps and verification always agree no matter
/// how long the setup in between takes.
fn now() -> DateTime<Utc> {
#[expect(clippy::disallowed_methods)]
Utc::now()
MockClock::default().now()
}
async fn init_test() -> (reqwest::Client, MockServer, Url) {
+84 -18
View File
@@ -32,7 +32,10 @@ use mas_i18n::DataLocale;
use mas_iana::jose::JsonWebSignatureAlg;
use mas_policy::{Violation, ViolationVariant};
use mas_router::{Account, GraphQL, PostAuthAction, UrlBuilder};
use oauth2_types::scope::{OPENID, Scope};
use oauth2_types::{
requests::ResponseMode,
scope::{OPENID, Scope},
};
use rand::{
Rng, SeedableRng,
distributions::{Alphanumeric, DistString},
@@ -750,20 +753,32 @@ impl TemplateContext for ConsentContext {
sample_list(
Client::samples(now, rng)
.into_iter()
.map(|client| {
let mut grant = AuthorizationGrant::sample(now, rng);
let action = PostAuthAction::continue_grant(grant.id);
// XXX
grant.client_id = client.id;
Self {
grant,
client,
action,
matrix_user: MatrixUser {
mxid: "@alice:example.com".to_owned(),
display_name: Some("Alice".to_owned()),
},
}
.flat_map(|client| {
[
(None, ResponseMode::Query),
(None, ResponseMode::Fragment),
(None, ResponseMode::FormPost),
(Some("some-state".to_owned()), ResponseMode::Query),
(Some("some-state".to_owned()), ResponseMode::Fragment),
(Some("some-state".to_owned()), ResponseMode::FormPost),
]
.map(|(state, response_mode)| {
let mut grant = AuthorizationGrant::sample(now, rng);
let action = PostAuthAction::continue_grant(grant.id);
// XXX
grant.client_id = client.id;
grant.state = state;
grant.response_mode = response_mode;
Self {
grant,
client: client.clone(),
action,
matrix_user: MatrixUser {
mxid: "@alice:example.com".to_owned(),
display_name: Some("Alice".to_owned()),
},
}
})
})
.collect(),
)
@@ -820,10 +835,22 @@ impl TemplateContext for PolicyViolationContext {
grant.client_id = client.id;
let authorization_grant = PolicyViolationContext::for_authorization_grant(
grant,
grant.clone(),
client.clone(),
Vec::new(),
);
let authorization_grant_invalid_scope =
PolicyViolationContext::for_authorization_grant(
grant,
client.clone(),
vec![Violation {
msg: "scope 'foo' not allowed".to_owned(),
redirect_uri: None,
field: None,
variant: None,
}],
);
let device_code_grant = PolicyViolationContext::for_device_code_grant(
DeviceCodeGrant {
id: Ulid::from_datetime_with_rng(now, rng),
@@ -838,11 +865,42 @@ impl TemplateContext for PolicyViolationContext {
user_agent: None,
locale: None,
},
client,
client.clone(),
Vec::new(),
);
[authorization_grant, device_code_grant]
let device_code_grant_invalid_scope =
PolicyViolationContext::for_device_code_grant(
DeviceCodeGrant {
id: Ulid::from_datetime_with_rng(now, rng),
state: mas_data_model::DeviceCodeGrantState::Pending,
client_id: client.id,
scope: [OPENID].into_iter().collect(),
user_code: Alphanumeric.sample_string(rng, 6).to_uppercase(),
device_code: Alphanumeric.sample_string(rng, 32),
created_at: now - Duration::try_minutes(5).unwrap(),
expires_at: now + Duration::try_minutes(25).unwrap(),
ip_address: None,
user_agent: None,
locale: None,
},
client,
vec![Violation {
msg: "user has too many active sessions".to_owned(),
redirect_uri: None,
field: None,
variant: Some(ViolationVariant::TooManySessions {
need_to_remove: 1,
}),
}],
);
[
authorization_grant,
authorization_grant_invalid_scope,
device_code_grant,
device_code_grant_invalid_scope,
]
})
.collect(),
)
@@ -902,6 +960,14 @@ impl TemplateContext for CompatLoginPolicyViolationContext {
{
sample_list(vec![
CompatLoginPolicyViolationContext { violations: vec![] },
CompatLoginPolicyViolationContext {
violations: vec![Violation {
msg: "scope 'foo' not allowed".to_owned(),
redirect_uri: None,
field: None,
variant: None,
}],
},
CompatLoginPolicyViolationContext {
violations: vec![Violation {
msg: "user has too many active sessions".to_owned(),
+7 -1
View File
@@ -195,7 +195,13 @@ fn function_add_params_to_url(
// Merge the exising and the additional parameters together
// Use a BTreeMap for determinism (because it orders keys)
let params: BTreeMap<&String, &Value> = params.iter().chain(existing.iter()).collect();
// Parameters which have no value (e.g. an absent `state`) are skipped, as they
// can't be serialized back to a query string
let params: BTreeMap<&String, &Value> = params
.iter()
.chain(existing.iter())
.filter(|(_key, value)| !value.is_none() && !value.is_undefined())
.collect();
// Transform them back to urlencoded
let params = serde_urlencoded::to_string(params).map_err(|e| {
+7
View File
@@ -27,8 +27,15 @@ ignore = [
# Engine/Store, and as the advisory says explicitly:
# > This bug is not triggerable by guest WebAssembly programs.
"RUSTSEC-2026-0222",
# A bug in wasmtime, but we are not affected as we're not using the WASI
# capabilities and filesystem APIs
"RUSTSEC-2026-0269",
]
# Only warn about unmaintained crates in direct dependencies of the workspace,
# not transitive dependencies
unmaintained = "workspace"
[licenses]
version = 2
allow = [
+1 -1
View File
@@ -2310,7 +2310,7 @@
}
},
"409": {
"description": "Username is reserved by the homeserver",
"description": "User already exists or the username is reserved by the homeserver",
"content": {
"application/json": {
"schema": {
+1 -1
View File
@@ -1,7 +1,7 @@
# About Application Services login
Encrypted Application Services/Bridges currently leverage the `m.login.application_service` login type to create devices for users.
This API is *not* available in the Matrix Authentication Service.
This API is *not* available in the Matrix Authentication Service: as per [Matrix 1.19](https://spec.matrix.org/v1.19/application-service-api/#registration), calling `/login` with this login type returns a 400 HTTP status code with an `M_APPSERVICE_LOGIN_UNSUPPORTED` error code.
We're working on a solution to support this use case, but in the meantime, this means **encrypted bridges will not work with the Matrix Authentication Service.**
A workaround is to disable E2EE support in your bridge setup.
+3 -3
View File
@@ -19,8 +19,8 @@ There are two main ways to contribute to MAS:
To get MAS running locally from source you will need to:
- [Install Rust and Cargo](https://www.rust-lang.org/learn/get-started). We recommend using the latest stable version of Rust.
- [Install Node.js](https://nodejs.org/). We recommend using the latest LTS version of Node.js. The frontend uses pnpm, which is installed automatically via corepack — see below.
- [Install Rust and Cargo](https://www.rust-lang.org/learn/get-started). The exact version is pinned in `rust-toolchain.toml`; rustup installs it automatically when you run cargo in the repo.
- [Install Node.js](https://nodejs.org/). Any recent version works to bootstrap: the exact version is pinned in `devEngines.runtime` in `package.json`, and pnpm downloads it on install. The frontend uses pnpm, which is installed automatically via corepack — see below.
- [Install Open Policy Agent](https://www.openpolicyagent.org/docs#1-download-opa)
## 4. Get the source
@@ -79,7 +79,7 @@ Most of them can be updated by running `sh misc/update.sh` at the root of the pr
Make sure your code adheres to our Rust and TypeScript code style by running:
- `cargo +nightly fmt` (with the nightly toolchain installed)
- `cargo +nightly fmt` (`.rustfmt.toml` uses nightly-only options, so this needs the nightly toolchain installed)
- `pnpm run format` in the `frontend` directory
- `make fmt` in the `policies` directory (if changed)
+2 -2
View File
@@ -63,8 +63,8 @@ The image can also be built from the source:
Building from the source requires:
- The latest stable [Rust toolchain](https://www.rust-lang.org/learn/get-started)
- [Node.js (24 and later)](https://nodejs.org/en/), with [corepack](https://nodejs.org/api/corepack.html) enabled so pnpm@11 is provisioned automatically
- The [Rust toolchain](https://www.rust-lang.org/learn/get-started) pinned by `rust-toolchain.toml` (installed automatically by rustup)
- [Node.js](https://nodejs.org/en/), with [corepack](https://nodejs.org/api/corepack.html) enabled so pnpm@11 is provisioned automatically; pnpm then downloads the Node.js version pinned in `package.json`
- the [Open Policy Agent](https://www.openpolicyagent.org/docs/latest/#running-opa) binary (or alternatively, Docker)
1. Get the source
+50 -39
View File
@@ -27,7 +27,7 @@ export type LocalazyMetadata = {
};
const localazyMetadata: LocalazyMetadata = {
projectUrl: "https://localazy.com/p/matrix-authentication-service!v1.22",
projectUrl: "https://localazy.com/p/matrix-authentication-service!v1.24",
baseLocale: "en",
languages: [
{
@@ -174,6 +174,15 @@ const localazyMetadata: LocalazyMetadata = {
localizedName: "Svenska",
pluralType: (n) => { return (n===1) ? "one" : "other"; }
},
{
language: "tr",
region: "",
script: "",
isRtl: false,
name: "Turkish",
localizedName: "Türkçe",
pluralType: (n) => { return (n===1) ? "one" : "other"; }
},
{
language: "uk",
region: "",
@@ -208,25 +217,26 @@ const localazyMetadata: LocalazyMetadata = {
file: "frontend.json",
path: "",
cdnFiles: {
"cs": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/cs/frontend.json",
"da": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/da/frontend.json",
"de": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/de/frontend.json",
"en": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/en/frontend.json",
"et": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/et/frontend.json",
"fi": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/fi/frontend.json",
"fr": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/fr/frontend.json",
"hu": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/hu/frontend.json",
"nb_NO": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/nb-NO/frontend.json",
"nl": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/nl/frontend.json",
"pl": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/pl/frontend.json",
"pt": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/pt/frontend.json",
"pt_BR": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/pt-BR/frontend.json",
"ru": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/ru/frontend.json",
"sk": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/sk/frontend.json",
"sv": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/sv/frontend.json",
"uk": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/uk/frontend.json",
"uz": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/uz/frontend.json",
"zh#Hans": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/zh-Hans/frontend.json"
"cs": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/cs/frontend.json",
"da": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/da/frontend.json",
"de": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/de/frontend.json",
"en": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/en/frontend.json",
"et": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/et/frontend.json",
"fi": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/fi/frontend.json",
"fr": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/fr/frontend.json",
"hu": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/hu/frontend.json",
"nb_NO": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/nb-NO/frontend.json",
"nl": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/nl/frontend.json",
"pl": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/pl/frontend.json",
"pt": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/pt/frontend.json",
"pt_BR": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/pt-BR/frontend.json",
"ru": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/ru/frontend.json",
"sk": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/sk/frontend.json",
"sv": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/sv/frontend.json",
"tr": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/tr/frontend.json",
"uk": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/uk/frontend.json",
"uz": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/uz/frontend.json",
"zh#Hans": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/zh-Hans/frontend.json"
}
},
{
@@ -234,25 +244,26 @@ const localazyMetadata: LocalazyMetadata = {
file: "file.json",
path: "",
cdnFiles: {
"cs": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/cs/file.json",
"da": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/da/file.json",
"de": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/de/file.json",
"en": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/en/file.json",
"et": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/et/file.json",
"fi": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/fi/file.json",
"fr": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/fr/file.json",
"hu": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/hu/file.json",
"nb_NO": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/nb-NO/file.json",
"nl": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/nl/file.json",
"pl": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/pl/file.json",
"pt": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/pt/file.json",
"pt_BR": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/pt-BR/file.json",
"ru": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/ru/file.json",
"sk": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/sk/file.json",
"sv": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/sv/file.json",
"uk": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/uk/file.json",
"uz": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/uz/file.json",
"zh#Hans": "https://delivery.localazy.com/_a643710470041658449213cbf79a/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/zh-Hans/file.json"
"cs": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/cs/file.json",
"da": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/da/file.json",
"de": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/de/file.json",
"en": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/en/file.json",
"et": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/et/file.json",
"fi": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/fi/file.json",
"fr": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/fr/file.json",
"hu": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/hu/file.json",
"nb_NO": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/nb-NO/file.json",
"nl": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/nl/file.json",
"pl": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/pl/file.json",
"pt": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/pt/file.json",
"pt_BR": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/pt-BR/file.json",
"ru": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/ru/file.json",
"sk": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/sk/file.json",
"sv": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/sv/file.json",
"tr": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/tr/file.json",
"uk": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/uk/file.json",
"uz": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/uz/file.json",
"zh#Hans": "https://delivery.localazy.com/_a6406816515547716152c4539eac/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/zh-Hans/file.json"
}
}
]
+40 -40
View File
@@ -2,9 +2,9 @@
"action": {
"back": "Zurück",
"cancel": "Abbrechen",
"clear": "Löschen",
"clear": "Leeren",
"close": "Schließen",
"collapse": "Zusammenbruch",
"collapse": "Reduzieren",
"confirm": "Bestätigen",
"continue": "Weiter",
"edit": "Bearbeiten",
@@ -12,7 +12,7 @@
"save": "Speichern",
"save_and_continue": "Speichern und fortfahren",
"sign_out": "Abmelden",
"start_over": "Von vorne anfangen"
"start_over": "Neu beginnen"
},
"branding": {
"privacy_policy": {
@@ -26,12 +26,12 @@
},
"common": {
"e2ee": "Ende-zu-Ende-Verschlüsselung",
"loading": "Lade …",
"loading": "Wird geladen …",
"next": "Weiter",
"password": "Passwort",
"previous": "Zurück",
"saved": "Gespeichert",
"saving": "Speichern..."
"saving": "Wird gespeichert …"
},
"frontend": {
"account": {
@@ -39,21 +39,21 @@
"contact_info": "Kontaktinformation",
"delete_account": {
"alert_description": "Dieses Konto wird dauerhaft entfernt und du hast keinen Zugriff mehr auf deine Nachrichten.",
"alert_title": "Du bist kurz davor, alle deine Daten zu verlieren.",
"alert_title": "Du bist kurz davor, alle deine Daten zu verlieren",
"button": "Account löschen",
"dialog_description": "<text>Bestätige, dass du dein Konto löschen möchtest:</text>\n<profile />\n<list>\n<item>Du kannst dein Konto nicht reaktivieren</item>\n<item>Du kannst dich nicht mehr anmelden</item>\n<item>Niemand kann deinen Benutzernamen (MXID) wieder verwenden, auch du nicht.</item>\n<item>Du verlässt alle Gruppen und Chats</item>\n<item>Du wirst vom Identitätsserver entfernt und niemand kann dich mit deiner E-Mail-Adresse oder Telefonnummer finden</item>\n</list>\n<text>Deine alten Nachrichten sind für die jeweiligen Empfänger weiterhin sichtbar. Möchtest du deine gesendeten Nachrichten vor zukünftigen Gruppen-Besuchern verbergen?</text>",
"dialog_description": "<text>Bestätige, dass du dein Konto löschen möchtest:</text>\n<profile />\n<list>\n<item>Du kannst dein Konto nicht reaktivieren</item>\n<item>Du kannst dich nicht mehr anmelden</item>\n<item>Niemand kann deinen Nutzernamen (MXID) wieder verwenden, auch du nicht.</item>\n<item>Du verlässt alle Gruppen und Chats</item>\n<item>Du wirst vom Identitätsserver entfernt und niemand kann dich mit deiner E-Mail-Adresse oder Telefonnummer finden</item>\n</list>\n<text>Deine alten Nachrichten sind für die jeweiligen Empfänger weiterhin sichtbar. Möchtest du deine gesendeten Nachrichten vor zukünftigen Gruppen-Besuchern verbergen?</text>",
"dialog_title": "Dieses Konto löschen?",
"erase_checkbox_label": "Ja, alle meine Nachrichten vor neuen Mitgliedern verbergen",
"incorrect_password": "Falsches Passwort, versuch's nochmal",
"incorrect_password": "Falsches Passwort, bitte versuche es erneut",
"mxid_label": "Bestätige deine Matrix-ID ({{ mxid }})",
"mxid_mismatch": "Dieser Wert passt nicht zu deiner Matrix-ID.",
"mxid_mismatch": "Dieser Wert passt nicht zu deiner Matrix-ID",
"password_label": "Gib dein Passwort ein, um weiterzumachen"
},
"edit_profile": {
"display_name_help": "Dies ist der öffentliche Nutzername.",
"display_name_label": "Anzeigename",
"title": "Profil bearbeiten",
"username_label": "Benutzername"
"username_label": "Nutzername"
},
"password": {
"change": "Passwort ändern",
@@ -67,13 +67,13 @@
"title": "Dein Konto"
},
"add_email_form": {
"email_denied_error": "Die eingegebene E-Mail wird von der Serverrichtlinie nicht zugelassen.",
"email_denied_error": "Die eingegebene E-Mail wird von der Serverrichtlinie nicht zugelassen",
"email_field_help": "Gib eine alternative E-Mail-Adresse an, mit der du auf dieses Konto zugreifen kannst.",
"email_field_label": "E-Mail-Adresse hinzufügen",
"email_in_use_error": "Die eingegebene E-Mail wird bereits verwendet",
"email_invalid_error": "Die eingegebene E-Mail-Adresse ist ungültig",
"incorrect_password_error": "Falsches Passwort, versuch's nochmal",
"password_confirmation": "Bestätige dein Passwort, um diese E-Mail-Adresse hinzuzufügen."
"incorrect_password_error": "Falsches Passwort, bitte versuche es erneut",
"password_confirmation": "Bestätige dein Passwort, um diese E-Mail-Adresse hinzuzufügen"
},
"browser_session_details": {
"current_badge": "Aktuell"
@@ -99,22 +99,22 @@
"unknown": "Unbekannter Gerätetyp"
},
"email_in_use": {
"heading": "Die E-Mail-Adresse {{email}} wird bereits verwendet."
"heading": "Die E-Mail-Adresse {{email}} wird bereits verwendet"
},
"end_session_button": {
"confirmation_modal_body_text": "Stelle sicher, dass du immer Zugriff auf ein anderes verifiziertes Gerät oder deinen Wiederherstellungsschlüssel hast, um zu vermeiden, dass dein verschlüsselter Chatverlauf verloren geht.",
"confirmation_modal_title": "Möchten Sie dieses Gerät wirklich entfernen?",
"confirmation_modal_title": "Möchtest du dieses Gerät wirklich entfernen?",
"text": "Gerät entfernen"
},
"error": {
"hideDetails": "Details ausblenden",
"showDetails": "Details anzeigen",
"subtitle": "Ein unerwarteter Fehler ist aufgetreten, bitte versuch's nochmal.",
"subtitle": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuche es erneut.",
"title": "Etwas ist schief gelaufen"
},
"errors": {
"field_required": "Dieses Feld ist ein Pflichtfeld",
"rate_limit_exceeded": "Du hast in kurzer Zeit zu viele Anfragen gestellt. Warte bitte ein paar Minuten und versuch's nochmal."
"rate_limit_exceeded": "Du hast in kurzer Zeit zu viele Anfragen gestellt. Bitte warte ein paar Minuten und versuche es erneut."
},
"last_active": {
"active_date": "Aktiv {{relativeDate}}",
@@ -145,15 +145,15 @@
"current_password_label": "Aktuelles Passwort",
"failure": {
"description": {
"account_locked": "Dein Konto ist gesperrt und kann im Moment nicht wiederhergestellt werden. Wenn du das nicht erwartet hast, wende dich bitte an deinen Server-Admin.",
"account_locked": "Dein Konto ist gesperrt und kann derzeit nicht wiederhergestellt werden. Wenn du das nicht erwartet hast, wende dich an deinen Kontoanbieter.",
"expired_recovery_ticket": "Der Link zur Kontowiederherstellung ist abgelaufen. Bitte fang den Prozess noch mal von vorne an.",
"invalid_new_password": "Das neue Passwort, das du gewählt hast, ist ungültig; es entspricht möglicherweise nicht den Sicherheitsrichtlinien.",
"no_current_password": "Du hast kein aktuelles Passwort.",
"no_such_recovery_ticket": "Der Link zum Wiederherstellen ist nicht gültig. Wenn du den Link aus der E-Mail zum Wiederherstellen kopiert hast, schau bitte nach, ob du den vollständigen Link kopiert hast.",
"password_changes_disabled": "Passwortänderungen sind deaktiviert.",
"recovery_ticket_already_used": "Der Wiederherstellungslink wurde bereits verwendet. Er kann nicht erneut verwendet werden.",
"unspecified": "Das könnte ein vorübergehendes Problem sein, also versuch's später nochmal. Wenn das Problem weiterhin besteht, wende dich bitte an deinen Server-Admin.",
"wrong_password": "Das Passwort, das du als dein aktuelles Passwort angegeben hast, ist falsch. Versuch's bitte nochmal."
"unspecified": "Das könnte ein vorübergehendes Problem sein. Bitte versuche es später erneut. Wenn das Problem weiterhin besteht, wende dich an deinen Kontoanbieter.",
"wrong_password": "Das Passwort, das du als aktuelles Passwort angegeben hast, ist falsch. Bitte versuche es erneut."
},
"title": "Aktualisierung des Passworts fehlgeschlagen"
},
@@ -170,7 +170,7 @@
},
"password_reset": {
"consumed": {
"subtitle": "Um ein neues Passwort zu erstellen, fang einfach von vorne an und wähle „Passwort vergessen“.",
"subtitle": "Um ein neues Passwort zu erstellen, beginne neu und wähle „Passwort vergessen“.",
"title": "Der Link zum Zurücksetzen deines Passworts wurde bereits verwendet"
},
"expired": {
@@ -214,11 +214,11 @@
"extended_repeat": "Wiederholte Zeichenmuster wie „abcabcabc“ sind leicht zu erraten.",
"key_pattern": "Kurze Eingaben sind leicht zu erraten.",
"names_by_themselves": "Einzelne Vor- oder Nachnamen sind leicht zu erraten.",
"pwned": "Dein Passwort wurde durch eine Datenpanne im Internet preisgegeben.",
"pwned": "Dieses Passwort wird zu häufig verwendet. Bitte wähle ein Passwort, das schwerer zu erraten ist.",
"recent_years": "Die letzten Jahre sind leicht zu erraten.",
"sequences": "Gängige Zeichenfolgen wie „abc“ sind leicht zu erraten.",
"similar_to_common": "Dies ähnelt einem häufig verwendeten Passwort.",
"simple_repeat": "Sich wiederholende Zeichen wie \"aaa\" sind leicht zu erraten.",
"simple_repeat": "Sich wiederholende Zeichen wie aaa sind leicht zu erraten.",
"straight_row": "Gerade Reihen von Tasten auf deiner Tastatur sind leicht zu erraten.",
"top_hundred": "Dies ist ein häufig verwendetes Passwort.",
"top_ten": "Dies ist ein häufig verwendetes Passwort.",
@@ -229,27 +229,27 @@
"reset_cross_signing": {
"cancelled": {
"description_1": "Du kannst dieses Fenster schließen und zur App zurückgehen, um weiterzumachen.",
"description_2": "Wenn du dich überall abgemeldet hast und deinen Wiederherstellungs-Schlüssel nicht mehr weißt, musst du deine Identität zurücksetzen.",
"heading": "Identitätszurücksetzung abgebrochen."
"description_2": "Wenn du keinen Zugriff auf ein anderes verifiziertes Gerät hast und deinen Wiederherstellungsschlüssel nicht hast, musst du deine digitale Identität zurücksetzen, um die App weiter nutzen zu können.",
"heading": "Zurücksetzen der digitalen Identität abgebrochen"
},
"description": "Wenn du auf keinem anderen Gerät angemeldet bist und deinen Wiederherstellungs-Schlüssel verloren hast, musst du deine Identität zurücksetzen, um die App weiter nutzen zu können.",
"description": "Wenn du keinen Zugriff auf ein anderes verifiziertes Gerät hast und deinen Wiederherstellungsschlüssel nicht hast, musst du deine digitale Identität zurücksetzen, um die App weiter nutzen zu können.",
"effect_list": {
"neutral_1": "Du verlierst alle Nachrichten, die nur auf dem Server gespeichert sind.",
"neutral_1": "Du verlierst alle Nachrichten, die nur auf dem Server gespeichert sind",
"neutral_2": "Du musst alle deine Geräte und Kontakte nochmal verifizieren.",
"positive_1": "Deine Kontodaten, Kontakte, Einstellungen und Chat-Liste bleiben erhalten."
"positive_1": "Deine Kontodaten, Kontakte, Einstellungen und Chat-Liste bleiben erhalten"
},
"failure": {
"description": "Das könnte ein vorübergehendes Problem sein, also versuch's später nochmal. Wenn das Problem weiterhin besteht, wende dich bitte an deinen Server-Admin.",
"heading": "Zurücksetzen der Krypto-Identität konnte nicht zugelassen werden"
"description": "Das könnte ein vorübergehendes Problem sein. Bitte versuche es später erneut. Wenn das Problem weiterhin besteht, wende dich an deinen Kontoanbieter.",
"heading": "Zurücksetzen der digitalen Identität konnte nicht zugelassen werden"
},
"finish_reset": "Reset beenden",
"heading": "Erstelle eine neue Identität, solltest du sie nicht auf andere Weise bestätigen können.",
"heading": "Setze deine digitale Identität zurück, falls du sie nicht anders bestätigen kannst",
"start_reset": "Reset starten",
"success": {
"description": "Das Zurücksetzen der Identität wurde für die nächsten {{minutes}} Minuten genehmigt. Du kannst dieses Fenster schließen und zur App zurückkehren, um fortzufahren.",
"heading": "Identität erfolgreich zurückgesetzt. Geh zurück zur App, um den Vorgang abzuschließen."
"description": "Das Zurücksetzen der digitalen Identität wurde für die nächsten {{minutes}} Minuten genehmigt. Du kannst dieses Fenster schließen und zur App zurückkehren, um fortzufahren.",
"heading": "Digitale Identität erfolgreich zurückgesetzt. Kehre zur App zurück, um den Vorgang abzuschließen."
},
"warning": "Setze deine Identität nur zurück, wenn du keinen Zugriff auf ein anderes angemeldetes Gerät hast und deinen Wiederherstellungsschlüssel verloren hast."
"warning": "Setze deine digitale Identität nur zurück, wenn du keinen Zugriff auf ein anderes verifiziertes Gerät hast und deinen Wiederherstellungsschlüssel nicht hast."
},
"session": {
"client_id_label": "Client-ID",
@@ -283,8 +283,8 @@
"delete_button_confirmation_modal": {
"action": "E-Mail löschen",
"body": "Diese E-Mail löschen?",
"incorrect_password": "Falsches Passwort, versuch's nochmal",
"password_confirmation": "Bestätige dein Passwort, um diese E-Mail-Adresse zu löschen."
"incorrect_password": "Falsches Passwort, bitte versuche es erneut",
"password_confirmation": "Bestätige dein Passwort, um diese E-Mail-Adresse zu löschen"
},
"delete_button_title": "E-Mail-Adresse entfernen",
"email": "E-Mail"
@@ -302,8 +302,8 @@
"inactive_90_days": "Alle deine Sitzungen waren in den letzten 90 Tagen aktiv."
},
"num_sessions_filtered_header": {
"header:one": "{{count}} Geräte entsprechen Ihren Suchkriterien ({{unfiltered_session_total}})",
"header:other": "{{count}} Geräte entsprechen Ihren Suchkriterien ({{unfiltered_session_total}})",
"header:one": "{{count}} Gerät entspricht deinen Suchkriterien ({{unfiltered_session_total}})",
"header:other": "{{count}} Geräte entsprechen deinen Suchkriterien ({{unfiltered_session_total}})",
"unfiltered_session_total:one": "{{count}} insgesamt",
"unfiltered_session_total:other": "{{count}} insgesamt"
},
@@ -328,7 +328,7 @@
"heading": "Bestätige deine E-Mail",
"invalid_code_alert": {
"description": "Überprüfe den Code, der an deine E-Mail-Adresse gesendet wurde, und aktualisiere die folgenden Felder, um fortzufahren.",
"title": "Du hast den falschen Code eingegeben."
"title": "Du hast den falschen Code eingegeben"
},
"resend_code": "Code erneut senden"
}
@@ -337,7 +337,7 @@
"scope": {
"edit_profile": "Bearbeite dein Profil und deine Kontaktdaten",
"manage_sessions": "Verwalte deine Geräte und Sitzungen",
"mas_admin": "Beliebige Benutzer verwalten (urn:mas:admin)",
"mas_admin": "Beliebige Nutzer verwalten (urn:mas:admin)",
"send_messages": "Neue Nachrichten in deinem Namen senden",
"synapse_admin": "Den Synapse-Homeserver verwalten (urn:synapse:admin:*)",
"view_messages": "Zeig deine vorhandenen Nachrichten und Daten an",
+3 -3
View File
@@ -145,14 +145,14 @@
"current_password_label": "Senine salasõna",
"failure": {
"description": {
"account_locked": "Sinu kasutajakonto on lukustatud ning salasõna taastamist ei ole hetkel võimalik teha. Kui antud olukord tundub sulle kahtlane, siis palun teavita sellest sinu serveri haldajat.",
"account_locked": "Sinu kasutajakonto on lukustatud ning salasõna taastamist ei ole hetkel võimalik teha. Kui antud olukord tundub sulle kahtlane, siis palun teavita sellest sinu teenusepakkujat.",
"expired_recovery_ticket": "Salasõna taastamiseks mõeldud link on aegunud. Palun alusta taastamisprotsessi algusest.",
"invalid_new_password": "Sinu sisestatud uus salasõna pole korrektne, ta ilmselt ei vasta seadistatud turvareeglitele.",
"no_current_password": "Sul on hetkel kehtiv salasõna määramata.",
"no_such_recovery_ticket": "Salasõna taastamiseks mõeldud link on vigane. Kui sa kopeerisid ja e-kirjast, siis palun kontrolli, et kopeerisid kogu lingi ühe tervikuna.",
"password_changes_disabled": "Salasõnade muutmine pole lubatud.",
"recovery_ticket_already_used": "Sa oled salasõna taastamiseks mõeldud linki juba kasutanud ja seda ei saa uuesti teha.",
"unspecified": "See ilmselt on ajutine probleem, palun proovi mõne aja pärast uuesti. Kui viga ei kao, siis abi saad serveri haldajalt.",
"unspecified": "See ilmselt on ajutine probleem, palun proovi mõne aja pärast uuesti. Kui viga ei kao, siis abi saad oma teenusepakkujalt.",
"wrong_password": "Sinu sisestatud salasõna ei vasta hetkel kehtivale salasõnale. Palun proovi uuesti.,"
},
"title": "Salasõna uuendamine ei õnnestunud"
@@ -239,7 +239,7 @@
"positive_1": "Sinu kasutajakonto andmed, kontaktid, eelistused ja vestluste loendid jäävad muutmata"
},
"failure": {
"description": "See ilmselt on ajutine probleem, palun proovi mõne aja pärast uuesti. Kui viga ei kao, siis abi saad serveri haldajalt.",
"description": "See ilmselt on ajutine probleem, palun proovi mõne aja pärast uuesti. Kui viga ei kao, siis abi saad oma teenusepakkujalt.",
"heading": "Krüptoidentiteedi lähtestamise lubamine ei õnnestunud"
},
"finish_reset": "Lõpeta lähtestamine",
+1 -1
View File
@@ -103,7 +103,7 @@
},
"end_session_button": {
"confirmation_modal_body_text": "Assurez-vous de toujours avoir accès à un autre appareil vérifié ou à votre clé de récupération afin d'éviter de perdre l'historique de vos discussions chiffrées.",
"confirmation_modal_title": "Êtes-vous sûr de vouloir terminer cette session ?",
"confirmation_modal_title": "Êtes-vous sûr de vouloir supprimer cet appareil ?",
"text": "Supprimer lappareil"
},
"error": {
+5 -5
View File
@@ -99,7 +99,7 @@
"unknown": "Onbekend apparaattype"
},
"email_in_use": {
"heading": "The email address {{email}} is already in use."
"heading": "The email address {{email}} is already in use"
},
"end_session_button": {
"confirmation_modal_body_text": "Make sure you always have access to another verified device or your recovery key to avoid losing your encrypted chat history.",
@@ -145,14 +145,14 @@
"current_password_label": "Huidig wachtwoord",
"failure": {
"description": {
"account_locked": "Your account is locked and can not be recovered at this time. If this is not expected, please contact your server administrator.",
"account_locked": "Your account is locked and can not be recovered at this time. If this is not expected, please contact your account provider.",
"expired_recovery_ticket": "The recovery link has expired. Please start the account recovery process again from the start.",
"invalid_new_password": "The new password you chose is invalid; it may not meet the configured security policy.",
"no_current_password": "You don't have a current password.",
"no_such_recovery_ticket": "The recovery link is invalid. If you copied the link from the recovery e-mail, please check the full link was copied.",
"password_changes_disabled": "Password changes are disabled.",
"recovery_ticket_already_used": "The recovery link has already been used. It cannot be used again.",
"unspecified": "This might be a temporary problem, so please try again later. If the problem persists, please contact your server administrator.",
"unspecified": "This might be a temporary problem, so please try again later. If the problem persists, please contact your account provider.",
"wrong_password": "The password you supplied as your current password is incorrect. Please try again."
},
"title": "Failed to update password"
@@ -230,7 +230,7 @@
"cancelled": {
"description_1": "You can close this window and go back to the app to continue.",
"description_2": "If dont have access to any other verified devices and you dont have your recovery key, then youll need to reset your digital identity to continue using the app.",
"heading": "Digital identity reset cancelled."
"heading": "Digital identity reset cancelled"
},
"description": "Als u niet bent aangemeld bij andere apparaten en u bent uw herstelsleutel kwijt, moet u uw identiteit opnieuw instellen om de app te kunnen blijven gebruiken.",
"effect_list": {
@@ -239,7 +239,7 @@
"positive_1": "Your account details, contacts, preferences, and chat list will be kept"
},
"failure": {
"description": "This might be a temporary problem, so please try again later. If the problem persists, please contact your server administrator.",
"description": "This might be a temporary problem, so please try again later. If the problem persists, please contact your account provider.",
"heading": "Failed to allow digital identity reset"
},
"finish_reset": "Finish reset",
+14 -14
View File
@@ -25,7 +25,7 @@
}
},
"common": {
"e2ee": "Szyfrowanie typu end-to-end",
"e2ee": "Szyfrowanie end-to-end",
"loading": "Wczytywanie…",
"next": "Dalej",
"password": "Hasło",
@@ -35,7 +35,7 @@
},
"frontend": {
"account": {
"account_password": "Hasło do konta",
"account_password": "Hasło konta",
"contact_info": "Dane kontaktowe",
"delete_account": {
"alert_description": "To konto zostanie trwale usunięte i nie będziesz już mieć dostępu do żadnych wiadomości.",
@@ -76,7 +76,7 @@
"password_confirmation": "Potwierdź hasło do swojego konta, aby dodać ten adres e-mail"
},
"browser_session_details": {
"current_badge": "Aktualny"
"current_badge": "Aktualne"
},
"browser_sessions_overview": {
"body:one": "{{count}} aktywna sesja",
@@ -120,7 +120,7 @@
"last_active": {
"active_date": "Aktywne {{relativeDate}}",
"active_now": "Aktywne teraz",
"inactive_90_days": "Nieaktywny przez ponad 90 dni"
"inactive_90_days": "Nieaktywne przez ponad 90 dni"
},
"nav": {
"device_limit_error": "Osiągnięto limit urządzeń",
@@ -146,14 +146,14 @@
"current_password_label": "Aktualne hasło",
"failure": {
"description": {
"account_locked": "Twoje konto jest zablokowane i nie można go obecnie odzyskać. Jeśli nie jest to oczekiwane, skontaktuj się z administratorem serwera.",
"account_locked": "Twoje konto jest zablokowane i nie można go obecnie odzyskać. Jeśli nie spodziewałeś się tej informacji, skontaktuj się z dostawcą konta.",
"expired_recovery_ticket": "Link do odzyskiwania wygasł. Rozpocznij proces odzyskiwania konta od początku.",
"invalid_new_password": "Wybrane nowe hasło jest nieprawidłowe i może nie spełniać skonfigurowanych zasad bezpieczeństwa.",
"no_current_password": "Nie masz aktualnego hasła.",
"no_such_recovery_ticket": "Link odzyskiwania jest nieprawidłowy. Jeśli skopiowałeś link z e-maila odzyskiwania, sprawdź, czy został skopiowany w całości.",
"password_changes_disabled": "Możliwość zmiany hasła jest wyłączona.",
"recovery_ticket_already_used": "Link odzyskiwania został już użyty. Nie można go użyć ponownie.",
"unspecified": "To może być problem tymczasowy, więc spróbuj ponownie później. Jeśli problem będzie się powtarzał, skontaktuj się z administratorem serwera.",
"unspecified": "To może być problem tymczasowy, spróbuj ponownie później. Jeśli problem będzie się powtarzał, skontaktuj się z dostawcą konta.",
"wrong_password": "Podane hasło jest nieprawidłowe. Spróbuj ponownie."
},
"title": "Nie udało się zaktualizować hasła"
@@ -233,14 +233,14 @@
"description_2": "Jeśli wylogowałeś się z dowolnego miejsca i nie pamiętasz kodu odzyskiwania, nadal musisz zresetować swoją tożsamość.",
"heading": "Resetowanie tożsamości zostało anulowane."
},
"description": "Jeśli nie zalogowałeś się na żadnym innym urządzeniu i utraciłeś klucz odzyskiwania, musisz zresetować swoją tożsamość, aby móc nadal korzystać z aplikacji.",
"description": "Jeśli nie masz dostępu do innych zweryfikowanych urządzeń i nie posiadasz klucza odzyskiwania, musisz zresetować swoją tożsamość cyfrową, aby móc nadal korzystać z aplikacji.",
"effect_list": {
"neutral_1": "Utracisz całą historię wiadomości przechowywaną wyłącznie na serwerze",
"neutral_2": "Będziesz musiał ponownie zweryfikować wszystkie swoje istniejące urządzenia i kontakty",
"positive_1": "Twoje dane konta, kontakty, preferencje i lista czatów zostaną zachowane"
},
"failure": {
"description": "To może być problem tymczasowy, więc spróbuj ponownie później. Jeśli problem będzie się powtarzał, skontaktuj się z administratorem serwera.",
"description": "To może być problem tymczasowy, spróbuj ponownie później. Jeśli problem będzie się powtarzał, skontaktuj się z dostawcą konta.",
"heading": "Nie udało się zezwolić na zresetowanie tożsamości kryptograficznej"
},
"finish_reset": "Zakończ resetowanie",
@@ -254,14 +254,14 @@
},
"session": {
"client_id_label": "Identyfikator klienta",
"current": "Aktualny",
"current": "Aktualne",
"device_id_label": "Identyfikator urządzenia",
"finished_label": "Zakończone",
"generic_browser_session": "Sesja przeglądarki",
"ip_label": "Adres IP",
"last_active_label": "Ostatnio aktywny",
"last_active_label": "Ostatnio aktywne",
"name_for_platform": "{{name}} dla {{platform}}",
"scopes_label": "Zakresy",
"scopes_label": "Możliwości",
"set_device_name": {
"help": "Ustaw nazwę, która ułatwi identyfikację tego urządzenia.",
"label": "Nazwa urządzenia",
@@ -345,10 +345,10 @@
"edit_profile": "Edytuj swój profil i dane kontaktowe",
"manage_sessions": "Zarządzaj swoimi urządzeniami i sesjami",
"mas_admin": "Zarządzaj użytkownikami (urn:mas:admin)",
"send_messages": "Wysyłaj nowe wiadomości w Twoim imieniu",
"send_messages": "Wysyłanie nowych wiadomości w Twoim imieniu",
"synapse_admin": "Administrowanie serwerem (urn:synapse:admin:*)",
"view_messages": "Przegląd istniejących wiadomości i danych",
"view_profile": "Przegląd informacji o profilu i danych kontaktowych"
"view_messages": "Przeglądanie istniejących wiadomości i danych",
"view_profile": "Przeglądanie informacji profilowych i danych kontaktowych"
}
}
}
+5 -5
View File
@@ -99,7 +99,7 @@
"unknown": "Unknown device type"
},
"email_in_use": {
"heading": "The email address {{email}} is already in use."
"heading": "The email address {{email}} is already in use"
},
"end_session_button": {
"confirmation_modal_body_text": "Make sure you always have access to another verified device or your recovery key to avoid losing your encrypted chat history.",
@@ -145,14 +145,14 @@
"current_password_label": "Senha atual",
"failure": {
"description": {
"account_locked": "Your account is locked and can not be recovered at this time. If this is not expected, please contact your server administrator.",
"account_locked": "Your account is locked and can not be recovered at this time. If this is not expected, please contact your account provider.",
"expired_recovery_ticket": "The recovery link has expired. Please start the account recovery process again from the start.",
"invalid_new_password": "The new password you chose is invalid; it may not meet the configured security policy.",
"no_current_password": "You don't have a current password.",
"no_such_recovery_ticket": "The recovery link is invalid. If you copied the link from the recovery e-mail, please check the full link was copied.",
"password_changes_disabled": "Password changes are disabled.",
"recovery_ticket_already_used": "The recovery link has already been used. It cannot be used again.",
"unspecified": "This might be a temporary problem, so please try again later. If the problem persists, please contact your server administrator.",
"unspecified": "This might be a temporary problem, so please try again later. If the problem persists, please contact your account provider.",
"wrong_password": "The password you supplied as your current password is incorrect. Please try again."
},
"title": "Failed to update password"
@@ -230,7 +230,7 @@
"cancelled": {
"description_1": "You can close this window and go back to the app to continue.",
"description_2": "If dont have access to any other verified devices and you dont have your recovery key, then youll need to reset your digital identity to continue using the app.",
"heading": "Digital identity reset cancelled."
"heading": "Digital identity reset cancelled"
},
"description": "If dont have access to any other verified devices and you dont have your recovery key, then youll need to reset your digital identity to continue using the app.",
"effect_list": {
@@ -239,7 +239,7 @@
"positive_1": "Your account details, contacts, preferences, and chat list will be kept"
},
"failure": {
"description": "This might be a temporary problem, so please try again later. If the problem persists, please contact your server administrator.",
"description": "This might be a temporary problem, so please try again later. If the problem persists, please contact your account provider.",
"heading": "Failed to allow digital identity reset"
},
"finish_reset": "Finish reset",
+5 -5
View File
@@ -99,7 +99,7 @@
"unknown": "Unknown device type"
},
"email_in_use": {
"heading": "The email address {{email}} is already in use."
"heading": "The email address {{email}} is already in use"
},
"end_session_button": {
"confirmation_modal_body_text": "Make sure you always have access to another verified device or your recovery key to avoid losing your encrypted chat history.",
@@ -145,14 +145,14 @@
"current_password_label": "Súčasné heslo",
"failure": {
"description": {
"account_locked": "Your account is locked and can not be recovered at this time. If this is not expected, please contact your server administrator.",
"account_locked": "Your account is locked and can not be recovered at this time. If this is not expected, please contact your account provider.",
"expired_recovery_ticket": "The recovery link has expired. Please start the account recovery process again from the start.",
"invalid_new_password": "The new password you chose is invalid; it may not meet the configured security policy.",
"no_current_password": "You don't have a current password.",
"no_such_recovery_ticket": "The recovery link is invalid. If you copied the link from the recovery e-mail, please check the full link was copied.",
"password_changes_disabled": "Password changes are disabled.",
"recovery_ticket_already_used": "The recovery link has already been used. It cannot be used again.",
"unspecified": "This might be a temporary problem, so please try again later. If the problem persists, please contact your server administrator.",
"unspecified": "This might be a temporary problem, so please try again later. If the problem persists, please contact your account provider.",
"wrong_password": "The password you supplied as your current password is incorrect. Please try again."
},
"title": "Failed to update password"
@@ -230,7 +230,7 @@
"cancelled": {
"description_1": "You can close this window and go back to the app to continue.",
"description_2": "If dont have access to any other verified devices and you dont have your recovery key, then youll need to reset your digital identity to continue using the app.",
"heading": "Digital identity reset cancelled."
"heading": "Digital identity reset cancelled"
},
"description": "If dont have access to any other verified devices and you dont have your recovery key, then youll need to reset your digital identity to continue using the app.",
"effect_list": {
@@ -239,7 +239,7 @@
"positive_1": "Your account details, contacts, preferences, and chat list will be kept"
},
"failure": {
"description": "This might be a temporary problem, so please try again later. If the problem persists, please contact your server administrator.",
"description": "This might be a temporary problem, so please try again later. If the problem persists, please contact your account provider.",
"heading": "Failed to allow digital identity reset"
},
"finish_reset": "Finish reset",
+347
View File
@@ -0,0 +1,347 @@
{
"action": {
"back": "Geri",
"cancel": "İptal",
"clear": "Temizle",
"close": "Kapat",
"collapse": "Daralt",
"confirm": "Onayla",
"continue": "Devam Et",
"edit": "Düzenle",
"expand": "Genişlet",
"save": "Kaydet",
"save_and_continue": "Kaydet ve devam et",
"sign_out": "Çıkış Yap",
"start_over": "Baştan başla"
},
"branding": {
"privacy_policy": {
"alt": "Hizmet gizlilik politikasına bağlantı",
"link": "Gizlilik Politikası"
},
"terms_and_conditions": {
"alt": "Hizmet şartları ve koşullarına bağlantı",
"link": "Şartlar & Koşullar"
}
},
"common": {
"e2ee": "Uçtan uca şifreleme",
"loading": "Yükleniyor…",
"next": "Sonraki",
"password": "Şifre",
"previous": "Önceki",
"saved": "Kaydedildi",
"saving": "Kaydediliyor…"
},
"frontend": {
"account": {
"account_password": "Hesap parolası",
"contact_info": "İletişim bilgileri",
"delete_account": {
"alert_description": "Bu hesap kalıcı olarak silinecek ve artık mesajlarınıza erişemeyeceksiniz.",
"alert_title": "Verilerinizin tamamını kaybetmek üzeresiniz.",
"button": "Hesabı sil",
"dialog_description": "<text> Hesabınızı silmek istediğinizi onaylayın: </text>\n<profile />\n<list> \n<item> Hesabınızı yeniden etkinleştiremeyeceksiniz </item> \n<item> Artık oturum açamayacaksınız </item> \n<item> Siz de dahil olmak üzere hiç kimse kullanıcı adınızı (MXID) yeniden kullanamayacak </item>\n<item> Katıldığınız tüm odalardan ve doğrudan mesajlardan ayrılacaksınız </item>\n<item> Kimlik sunucusundan kaldırılacaksınız ve hiç kimse sizi e-posta adresiniz veya telefon numaranızla bulamayacak </item>\n</list> \n<text> Eski mesajlarınız, onları alan kişiler tarafından hala görülebilir. Gelecekte odalara katılan kişilerden gönderdiğiniz mesajları gizlemek ister misiniz? </text>",
"dialog_title": "Bu hesabı silmek istiyor musunuz?",
"erase_checkbox_label": "Evet, yeni katılanlardan tüm mesajlarımı gizle.",
"incorrect_password": "Hatalı parola, lütfen tekrar deneyin",
"mxid_label": "Matrix Kimliğinizi ({{ mxid }}) onaylayın",
"mxid_mismatch": "Bu değer, Matrix Kimliğinizle eşleşmiyor.",
"password_label": "Devam etmek için şifrenizi girin"
},
"edit_profile": {
"display_name_help": "Oturum açtığınız her yerde diğerler kullanıcılar bunu görecektir.",
"display_name_label": "Görünen ad",
"title": "Profili düzenle",
"username_label": "Kullanıcı Adı"
},
"password": {
"change": "Parola değiştir",
"change_disabled": "Yönetici tarafından parola değiştirme özelliği devre dışı bırakılmıştır.",
"label": "Şifre"
},
"sign_out": {
"button": "Hesaptan çıkış yap",
"dialog": "Bu hesaptan çıkış yapmak ister misiniz?"
},
"title": "Hesabınız"
},
"add_email_form": {
"email_denied_error": "Girilen e-posta adresi, sunucu politikası gereği kabul edilmiyor",
"email_field_help": "Bu hesaba erişmek için kullanabileceğiniz alternatif bir e-posta adresi ekleyin.",
"email_field_label": "E-posta ekle",
"email_in_use_error": "Girilen e-posta adresi zaten kullanımda",
"email_invalid_error": "The entered email is invalid",
"incorrect_password_error": "Hatalı parola, lütfen tekrar deneyin",
"password_confirmation": "Bu e-posta adresini eklemek için hesap şifrenizi onaylayın"
},
"browser_session_details": {
"current_badge": "Geçerli"
},
"browser_sessions_overview": {
"body:one": "{{count}} aktif oturum",
"body:other": "{{count}} aktif oturumlar",
"heading": "Tarayıcılar",
"no_active_sessions": {
"default": "Herhangi bir web tarayıcısına giriş yapmadınız.",
"inactive_90_days": "Son 90 gün içinde tüm oturumlarınız aktif olmuştur."
},
"view_all_button": "Tümünü görüntüle"
},
"compat_session_detail": {
"client_details_title": "Müşteri bilgileri",
"name": "İsim"
},
"device_type_icon_label": {
"mobile": "Mobil",
"pc": "Bilgisayar",
"tablet": "Tablet",
"unknown": "Bilinmeyen cihaz türü"
},
"email_in_use": {
"heading": "{{email}} e-posta adresi zaten kullanımda."
},
"end_session_button": {
"confirmation_modal_body_text": "Şifrelenmiş sohbet geçmişinizi kaybetmemek için her zaman başka bir doğrulanmış cihaza veya kurtarma anahtarınıza erişiminizin olduğundan emin olun.",
"confirmation_modal_title": "Bu cihazı kaldırmak istediğinizden emin misiniz?",
"text": "Cihazı kaldır"
},
"error": {
"hideDetails": "Ayrıntıları gizle",
"showDetails": "Detayları göster",
"subtitle": "Beklenmeyen bir hata oluştu. Lütfen tekrar deneyin.",
"title": "Bir şeyler ters gitti."
},
"errors": {
"field_required": "Bu alan zorunludur",
"rate_limit_exceeded": "Kısa süre içinde çok fazla istekte bulundunuz. Lütfen birkaç dakika bekleyin ve tekrar deneyin."
},
"last_active": {
"active_date": "Aktif {{relativeDate}}",
"active_now": "Şu anda aktif",
"inactive_90_days": "90 günden fazla süredir aktif değil"
},
"nav": {
"device_limit_error": "Cihaz limitine ulaşıldı",
"devices": "Cihazlar",
"plan": "Plan",
"settings": "Ayarlar"
},
"not_found_alert_title": "Bulunamadı.",
"oauth2_client_detail": {
"details_title": "Müşteri bilgileri",
"name": "İsim",
"policy": "Politika",
"terms": "Hizmet şartları"
},
"oauth2_session_detail": {
"client_details_name": "İsim",
"client_title": "Müşteri bilgileri"
},
"pagination_controls": {
"total": "Toplam: {{totalCount}}"
},
"password_change": {
"current_password_label": "Mevcut parola",
"failure": {
"description": {
"account_locked": "Hesabınız kilitlendi ve şu anda kurtarılamıyor. Bu durum beklenmedik bir şeyse, lütfen sunucu yöneticinizle iletişime geçin.",
"expired_recovery_ticket": "Kurtarma bağlantısının süresi doldu. Lütfen hesap kurtarma işlemine baştan başlayın.",
"invalid_new_password": "Seçtiğiniz yeni parola geçersiz; yapılandırılmış güvenlik politikasına uymuyor olabilir.",
"no_current_password": "Şu anda geçerli bir parolanız yok.",
"no_such_recovery_ticket": "Kurtarma bağlantısı geçersiz. Kurtarma e-postasındaki bağlantıyı kopyaladıysanız, lütfen bağlantının tamamının kopyalandığından emin olun.",
"password_changes_disabled": "Parola değiştirme özelliği devre dışı bırakılmıştır.",
"recovery_ticket_already_used": "Kurtarma bağlantısı daha önce kullanıldı. Tekrar kullanılamaz.",
"unspecified": "Bu geçici bir sorun olabilir, lütfen daha sonra tekrar deneyin. Sorun devam ederse, lütfen sunucu yöneticinizle iletişime geçin.",
"wrong_password": "Girdiğiniz geçerli parola yanlış. Lütfen tekrar deneyin."
},
"title": "Parola güncelleme başarısız oldu."
},
"new_password_again_label": "Yeni parolayı tekrar girin.",
"new_password_label": "Yeni parola",
"passwords_match": "Parolalar eşleşiyor!",
"passwords_no_match": "Parolalar eşleşmiyor",
"subtitle": "Hesabınız için yeni bir parola belirleyin.",
"success": {
"description": "Parolanız başarıyla güncellendi.",
"title": "Parola güncellendi"
},
"title": "Parolanızı değiştirin"
},
"password_reset": {
"consumed": {
"subtitle": "Yeni bir parola oluşturmak için, baştan başlayın ve \"Parolamı unuttum\" seçeneğini seçin.",
"title": "Parolanızı sıfırlamak için kullanılan bağlantı daha önce kullanıldı"
},
"expired": {
"resend_email": "Resend email",
"subtitle": "{{email}} adresine gönderilecek yeni bir e-posta isteği gönderin.",
"title": "Parolanızı sıfırlama bağlantısının süresi doldu"
},
"subtitle": "Hesabınız için yeni bir parola belirleyin.",
"title": "Parolanızı sıfırlayın"
},
"password_strength": {
"placeholder": "Parola gücü",
"score": {
"0": "Son derece zayıf bir parola",
"1": "Çok zayıf bir parola",
"2": "Zayıf parola",
"3": "Güçlü parola",
"4": "Çok güçlü parola"
},
"suggestion": {
"all_uppercase": "Bazı harfleri büyük harfle yazın, ancak hepsini değil.",
"another_word": "Daha az kullanılan kelimeler ekleyin.",
"associated_years": "Sizinle ilişkilendirilen yıllardan kaçının.",
"capitalization": "İlk harften başlayarak diğer harfleri de büyük harfle yazın.",
"dates": "Sizinle ilişkilendirilen tarih ve yıllardan kaçının.",
"l33t": "'a' yerine '@' gibi tahmin edilebilir harf değişikliklerinden kaçının.",
"longer_keyboard_pattern": "Daha uzun kalıplar kullanın ve yazma yönünü birden fazla kez değiştirin.",
"no_need": "Semboller, rakamlar veya büyük harfler kullanmadan da güçlü şifreler oluşturabilirsiniz.",
"pwned": "Bu parolayı başka yerlerde kullanıyorsanız, değiştirmeniz gerekir.",
"recent_years": "Son yılları göz ardı edin.",
"repeated": "Aynı kelimeleri ve karakterleri tekrar etmekten kaçının.",
"reverse_words": "Sık kullanılan kelimelerin ters yazılışlarından kaçının.",
"sequences": "Sık kullanılan karakter dizilerinden kaçının.",
"use_words": "Birden fazla kelime kullanın, ancak yaygın ifadelerden kaçının."
},
"too_weak": "Bu parola çok zayıf.",
"warning": {
"common": "Bu, yaygın olarak kullanılan bir paroladır.",
"common_names": "Yaygın isimler ve soyadları tahmin etmek kolaydır.",
"dates": "Tarihleri tahmin etmek kolaydır.",
"extended_repeat": "\"abcabcabc\" gibi tekrarlanan karakter dizileri tahmin edilmesi kolaydır.",
"key_pattern": "Kısa metin kalıplarını tahmin etmek kolaydır.",
"names_by_themselves": "Tek isim veya soyadı tahmin etmek kolaydır.",
"pwned": "Parolanız internette yaşanan bir veri ihlali sonucu ifşa edildi.",
"recent_years": "Son yılları tahmin etmek kolaydır.",
"sequences": "\"abc\" gibi yaygın karakter dizileri tahmin edilmesi kolaydır.",
"similar_to_common": "Bu, yaygın olarak kullanılan bir parolaya benziyor.",
"simple_repeat": "\"aaa\" gibi tekrarlanan karakterler tahmin edilmesi kolaydır.",
"straight_row": "Girdiğiniz harflerin düz sıralar halinde dizilmiş olması tahmin etmeyi kolaylaştırır.",
"top_hundred": "Bu, sık kullanılan bir paroladır.",
"top_ten": "Bu, çok sık kullanılan bir parola.",
"user_inputs": "Kişisel veya sayfa ile ilgili herhangi bir veri bulunmamalıdır.",
"word_by_itself": "Tek kelimeleri tahmin etmek kolaydır."
}
},
"reset_cross_signing": {
"cancelled": {
"description_1": "Bu pencereyi kapatıp uygulamaya geri dönerek devam edebilirsiniz.",
"description_2": "Başka doğrulanmış cihazlara erişiminiz yoksa ve kurtarma anahtarınız da yoksa, uygulamayı kullanmaya devam etmek için dijital kimliğinizi sıfırlamanız gerekecektir.",
"heading": "Dijital kimlik sıfırlama işlemi iptal edildi."
},
"description": "Başka doğrulanmış cihazlara erişiminiz yoksa ve kurtarma anahtarınız da yoksa, uygulamayı kullanmaya devam etmek için dijital kimliğinizi sıfırlamanız gerekecektir.",
"effect_list": {
"neutral_1": "Yalnızca sunucuda saklanan tüm mesaj geçmişinizi kaybedeceksiniz",
"neutral_2": "You will need to verify all your existing devices and contacts again",
"positive_1": "Hesap bilgileriniz, kişileriniz, tercihleriniz ve sohbet listeniz saklanacaktır"
},
"failure": {
"description": "Bu geçici bir sorun olabilir, lütfen daha sonra tekrar deneyin. Sorun devam ederse, lütfen sunucu yöneticinizle iletişime geçin.",
"heading": "Dijital kimlik sıfırlama işlemi başarısız oldu"
},
"finish_reset": "Sıfırlamayı tamamla",
"heading": "Başka bir şekilde doğrulama yapamıyorsanız dijital kimliğinizi sıfırlayın",
"start_reset": "Sıfırlamayı başlat",
"success": {
"description": "Dijital kimlik sıfırlama işlemi {{minutes}} dakika boyunca onaylanmıştır. Bu pencereyi kapatıp uygulamaya geri dönerek devam edebilirsiniz.",
"heading": "Dijital kimlik sıfırlama işlemi başarıyla oluşturuldu. İşlemi tamamlamak için uygulamaya geri dönün."
},
"warning": "Kimliğinizi yalnızca oturum açtığınız başka bir cihaza erişiminiz yoksa ve kurtarma anahtarınızı kaybettiyseniz sıfırlayın."
},
"session": {
"client_id_label": "Client ID",
"current": "Geçerli",
"device_id_label": "Cihaz Kimliği",
"finished_label": "Tamamlandı",
"generic_browser_session": "Tarayıcı oturumu",
"ip_label": "IP Adresi",
"last_active_label": "Son Etkinlik",
"name_for_platform": "{{name}}, {{platform}} için",
"scopes_label": "Kapsamlar",
"set_device_name": {
"help": "Bu cihazı kolayca tanımanıza yardımcı olacak bir ad belirleyin.",
"label": "Cihaz adı",
"title": "Cihaz adını düzenle"
},
"signed_in_label": "Giriş yapıldı",
"title": "Cihaz detayları",
"unknown_browser": "Bilinmeyen tarayıcı",
"unknown_device": "Bilinmeyen cihaz",
"uri_label": "Uri"
},
"session_detail": {
"alert": {
"button": "Geri dön",
"text": "Bu oturum mevcut değil veya artık aktif değil.",
"title": "{{deviceId}} oturumu bulunamadı"
}
},
"user_email": {
"delete_button_confirmation_modal": {
"action": "E-postayı sil",
"body": "Bu e-postayı silmek ister misiniz?",
"incorrect_password": "Hatalı parola, lütfen tekrar deneyin",
"password_confirmation": "Bu e-posta adresini silmek için hesap parolanızı onaylayın"
},
"delete_button_title": "E-posta adresini kaldır",
"email": "E-posta"
},
"user_sessions_overview": {
"approaching_session_limit_warning_description:one": "{{count}} cihaz sayısının {{num_sessions}}ini kullandınız. Sınırınıza ulaştığınızda, başka bir cihaz eklemek için mevcut bir cihazı kaldırmanız gerekecektir.",
"approaching_session_limit_warning_description:other": "{{num_sessions}} veya {{count}} cihaz sayısından birini kullandınız. Sınırınıza ulaştığınızda, başka bir cihaz eklemek için mevcut bir cihazı kaldırmanız gerekecektir.",
"approaching_session_limit_warning_header": "Dikkat, cihaz limitinize yaklaşıyorsunuz",
"heading": "Oturum açtığınız yer",
"hit_session_limit_warning_description:one": "{{count}} aygıt yuvasından {{num_sessions}} aygıtını kullandınız. Tekrar oturum açmayı denediğinizde, mevcut bir aygıtı kaldırmanız gerekecektir.",
"hit_session_limit_warning_description:other": "{{num_sessions}} veya {{count}} aygıt yuvalarından birini kullandınız. Tekrar oturum açmayı denediğinizde, mevcut bir aygıtı kaldırmanız gerekecektir.",
"hit_session_limit_warning_header": "Cihaz limitine ulaştınız",
"no_active_sessions": {
"default": "Şu anda hiçbir uygulamaya giriş yapmadınız.",
"inactive_90_days": "Son 90 gün içinde tüm oturumlarınız aktif olmuştur."
},
"num_sessions_filtered_header": {
"header:one": "Filtrenize uyan {{count}} cihaz var ({{unfiltered_session_total}})",
"header:other": "Filtrenize uyan {{count}} cihaz var ({{unfiltered_session_total}})",
"unfiltered_session_total:one": "Toplam {{count}}",
"unfiltered_session_total:other": "Toplam {{count}}"
},
"num_sessions_header:one": "{{count}} cihaz",
"num_sessions_header:other": "{{count}} cihaz",
"session_limit_info:one": "{{count}}/{{limit}} aygıt yuvalarını kullandınız.",
"session_limit_info:other": "{{count}}/{{limit}} aygıt yuvalarını kullandınız."
},
"verify_email": {
"code_expired_alert": {
"description": "Kodun süresi doldu. Lütfen yeni bir kod talep edin.",
"title": "Kodun süresi doldu."
},
"code_field_error": "Kod tanınmadı",
"code_field_label": "6 haneli kod",
"code_field_wrong_shape": "Kod 6 rakamdan oluşmalıdır",
"email_sent_alert": {
"description": "Yeni kodu aşağıya girin",
"title": "Yeni kod gönderildi"
},
"enter_code_prompt": "Gönderilen 6 haneli kodu girin: <email>{{email}}</email>",
"heading": "E-postanızı doğrulayın",
"invalid_code_alert": {
"description": "E-postanıza gönderilen kodu kontrol edin ve devam etmek için aşağıdaki alanları güncelleyin.",
"title": "Yanlış kod girdiniz"
},
"resend_code": "Resend code"
}
},
"mas": {
"scope": {
"edit_profile": "Profilinizi ve iletişim bilgilerinizi düzenleyin",
"manage_sessions": "Cihazlarınızı ve oturumlarınızı yönetin",
"mas_admin": "Kullanıcıları yönet (urn:mas:admin)",
"send_messages": "Sizin adınıza mesaj gönderin",
"synapse_admin": "Sunucuyu yönetin (urn:synapse:admin:*)",
"view_messages": "Mevcut mesajları ve verilerinizi görüntüleyinmessages",
"view_profile": "Profil bilgilerinizi ve iletişim bilgilerinizi görüntüleyin"
}
}
}
+3 -3
View File
@@ -146,14 +146,14 @@
"current_password_label": "Поточний пароль",
"failure": {
"description": {
"account_locked": "Ваш обліковий запис заблоковано, і зараз його неможливо відновити. Якщо цього не передбачалося, зверніться до адміністратора сервера.",
"account_locked": "Ваш обліковий запис заблоковано, і зараз його неможливо відновити. Якщо цього не передбачалося, зверніться до постачальника вашого облікового запису.",
"expired_recovery_ticket": "Посилання для відновлення застаріло. Розпочніть процес відновлення облікового запису спочатку.",
"invalid_new_password": "Обраний вами новий пароль неприпустимий; він може не відповідати налаштованій політиці безпеки.",
"no_current_password": "У вас немає поточного пароля.",
"no_such_recovery_ticket": "Посилання для відновлення недійсне. Якщо ви скопіювали посилання з електронної пошти для відновлення, перевірте, чи скопійовано повне посилання.",
"password_changes_disabled": "Зміна пароля вимкнена.",
"recovery_ticket_already_used": "Посилання для відновлення вже використано. Його не можна використовувати повторно.",
"unspecified": "Це може бути тимчасова проблема, тому спробуйте пізніше. Якщо проблема не зникає, зверніться до адміністратора свого сервера.",
"unspecified": "Це може бути тимчасова проблема, тому повторіть спробу пізніше. Якщо проблема не зникне, зверніться до постачальника вашого облікового запису.",
"wrong_password": "Пароль, який ви вказали як свій поточний пароль, неправильний. Спробуйте ще раз."
},
"title": "Не вдалося оновити пароль"
@@ -240,7 +240,7 @@
"positive_1": "Ваші дані облікового запису, контакти, налаштування та список бесід будуть збережені"
},
"failure": {
"description": "Це може бути тимчасова проблема, тому спробуйте пізніше. Якщо проблема не зникає, зверніться до адміністратора свого сервера.",
"description": "Це може бути тимчасова проблема, тому повторіть спробу пізніше. Якщо проблема не зникне, зверніться до постачальника вашого облікового запису.",
"heading": "Не вдалося дозволити скидання криптоідентичності"
},
"finish_reset": "Завершити скидання",
+114 -114
View File
@@ -4,15 +4,15 @@
"cancel": "Bekor qilish",
"clear": "Tozalash",
"close": "Yopish",
"collapse": "Collapse",
"confirm": "Confirm",
"collapse": "Yigish",
"confirm": "Tasdiqlash",
"continue": "Davom etish",
"edit": "Tahrirlash",
"expand": "Expand",
"expand": "Kengaytirish",
"save": "Saqlash",
"save_and_continue": "Save and continue",
"save_and_continue": "Saqlash va davom ettirish",
"sign_out": "Chiqish",
"start_over": "Start over"
"start_over": "Qaytadan boshlang"
},
"branding": {
"privacy_policy": {
@@ -25,29 +25,29 @@
}
},
"common": {
"e2ee": "End-to-end encryption",
"e2ee": "Abonent shifrlash ( E2EE )",
"loading": "Yuklanmoqda…",
"next": "Keyingisi",
"password": "Parol",
"previous": "Oldingi",
"saved": "Saved",
"saving": "Saving…"
"saved": "Saqlandi",
"saving": "Saqlanmoqda…"
},
"frontend": {
"account": {
"account_password": "Account password",
"contact_info": "Contact info",
"account_password": "Hisob paroli",
"contact_info": "Kontakt maʼlumoti",
"delete_account": {
"alert_description": "This account will be permanently erased and youll no longer have access to any of your messages.",
"alert_title": "Youre about to lose all of your data",
"button": "Delete account",
"dialog_description": "<text>Confirm that you would like to delete your account:</text>\n<profile />\n<list>\n<item>You will not be able to reactivate your account</item>\n<item>You will no longer be able to sign in</item>\n<item>No one will be able to reuse your username (MXID), including you</item>\n<item>You will leave all rooms and direct messages you are in</item>\n<item>You will be removed from the identity server, and no one will be able to find you with your email or phone number</item>\n</list>\n<text>Your old messages will still be visible to people who received them. Would you like to hide your sent messages from people who join rooms in the future?</text>",
"dialog_title": "Delete this account?",
"erase_checkbox_label": "Yes, hide all my messages from new joiners",
"incorrect_password": "Incorrect password, please try again",
"mxid_label": "Confirm your Matrix ID ({{ mxid }})",
"mxid_mismatch": "This value does not match your Matrix ID",
"password_label": "Enter your password to continue"
"alert_description": "Bu hisob butunlay oʻchirib tashlanadi va siz endi xabarlaringizning birortasiga ham kira olmaysiz.",
"alert_title": "Siz barcha maʻlumotlaringizni yoʻqotish arafasidasiz",
"button": "Akkauntni ochirish",
"dialog_description": "<text> Hisobingizni oʻchirishni xohlayotganingizni tasdiqlang:</text> <profile /> \n<list>\n <item> Hisobingizni qayta faollashtira olmaysiz</item> \n<item> Endi tizimga kira olmaysiz</item> \n<item> Hech kim, shu jumladan siz ham, foydalanuvchi nomingizni (MXID) qayta ishlata olmaydi</item> \n<item> Siz barcha xonalarni va toʻgridan-toʻgʻri xabarlaringizni tark etasiz</item> \n<item> Siz identifikatsiya serveridan oʻchirilasiz va hech kim sizni elektron pochta yoki telefon raqamingiz bilan topa olmaydi</item> </list> \n<text> Eski xabarlaringiz ularni olgan odamlarga koʻrinadigan boʻladi. Kelajakda xonalarga qoʻshilgan odamlardan yuborilgan xabarlaringizni yashirishni xohlaysizmi?</text>",
"dialog_title": "Bu akkaunt oʻchirib tashlansinmi?",
"erase_checkbox_label": "Ha, barcha xabarlarimni yangi qoʻshilganlardan yashirish",
"incorrect_password": "Parol notoʻgʻri,qaytadan urining.",
"mxid_label": "Matrix identifikatoringizni tasdiqlang ({{ mxid }})",
"mxid_mismatch": "Bu qiymat sizning Matrix ID raqamingizga mos kelmaydi",
"password_label": "Davom etish uchun parolingizni kiriting"
},
"edit_profile": {
"display_name_help": "Siz tizimga kirgan joyingizda boshqalar buni koʻrishadi.",
@@ -61,19 +61,19 @@
"label": "Parol"
},
"sign_out": {
"button": "Sign out of account",
"dialog": "Sign out of this account?"
"button": "Hisobdan chiqish",
"dialog": "Bu hisobdan chiqilsinmi?"
},
"title": "Sizning hisobingiz"
},
"add_email_form": {
"email_denied_error": "The entered email is not allowed by the server policy",
"email_denied_error": "Kiritilgan elektron pochta manzili server siyosati tomonidan ruxsat etilmagan",
"email_field_help": "Bu hisobga kirish uchun ishlatishingiz mumkin bolgan muqobil email manzilini kiriting.",
"email_field_label": "Email manzilini kiritish",
"email_in_use_error": "The entered email is already in use",
"email_in_use_error": "Kiritilgan elektron pochta allaqachon ishlatilmoqda",
"email_invalid_error": "Kiritilgan elektron pochta manzili notogʻri",
"incorrect_password_error": "Incorrect password, please try again",
"password_confirmation": "Confirm your account password to add this email address"
"incorrect_password_error": "Parol notoʻgʻri,qaytadan urining.",
"password_confirmation": "Ushbu elektron pochta manzilini qoʻshish uchun hisobingiz parolini tasdiqlang"
},
"browser_session_details": {
"current_badge": "Hozirgi"
@@ -83,8 +83,8 @@
"body:other": "{{count}} ta faol seans",
"heading": "Brauzerlar",
"no_active_sessions": {
"default": "You are not signed in to any web browsers.",
"inactive_90_days": "All your sessions have been active in the last 90 days."
"default": "Siz hech qanday veb-brauzerga kirmagansiz.",
"inactive_90_days": "Soʻnggi 90 kun ichida barcha sessiyalaringiz faol boʻldi."
},
"view_all_button": "Hammasini korish"
},
@@ -99,10 +99,10 @@
"unknown": "Nomalum qurilma turi"
},
"email_in_use": {
"heading": "The email address {{email}} is already in use."
"heading": "{{email}} elektron pochta manzili allaqachon ishlatilmoqda."
},
"end_session_button": {
"confirmation_modal_body_text": "Make sure you always have access to another verified device or your recovery key to avoid losing your encrypted chat history.",
"confirmation_modal_body_text": "Shifrlangan chat tarixingizni yoʻqotmaslik uchun har doim boshqa tasdiqlangan qurilmaga yoki tiklash kalitingizga kirish huquqiga ega ekanligingizga ishonch hosil qiling.",
"confirmation_modal_title": "Haqiqatan ham bu qurilmani olib tashlamoqchimisiz?",
"text": "Qurilmani olib tashlash"
},
@@ -114,7 +114,7 @@
},
"errors": {
"field_required": "Ushbu qator toʻldirilishi shart",
"rate_limit_exceeded": "You've made too many requests in a short period. Please wait a few minutes and try again."
"rate_limit_exceeded": "Qisqa vaqt ichida juda koʻp soʻrov yubordingiz. Iltimos, bir necha daqiqa kuting va qayta urinib koʻring."
},
"last_active": {
"active_date": "Faol {{relativeDate}}",
@@ -122,9 +122,9 @@
"inactive_90_days": "90+ kun davomida faol emas"
},
"nav": {
"device_limit_error": "Device limit reached",
"device_limit_error": "Qurilma limitiga yetdi",
"devices": "Qurilmalar",
"plan": "Plan",
"plan": "Tarif",
"settings": "Sozlamalar"
},
"not_found_alert_title": "Topilmadi.",
@@ -145,19 +145,19 @@
"current_password_label": "Joriy parol",
"failure": {
"description": {
"account_locked": "Your account is locked and can not be recovered at this time. If this is not expected, please contact your server administrator.",
"expired_recovery_ticket": "The recovery link has expired. Please start the account recovery process again from the start.",
"account_locked": "Hisobingiz qulflangan va hozirda uni qayta tiklab boʻlmaydi. Agar bu kutilmasa, iltimos, server administratoringizga murojaat qiling.",
"expired_recovery_ticket": "Tiklash havolasi muddati tugagan. Hisobni tiklash jarayonini boshidan qayta boshlang.",
"invalid_new_password": "Siz tanlagan yangi parol yaroqsiz; u sozlangan xavfsizlik siyosatiga mos kelmasligi mumkin.",
"no_current_password": "Sizda joriy parol yoq.",
"no_such_recovery_ticket": "The recovery link is invalid. If you copied the link from the recovery e-mail, please check the full link was copied.",
"no_such_recovery_ticket": "Qayta tiklash havolasi yaroqsiz. Agar siz havolani tiklash elektron pochtasidan nusxa koʻchirgan boʻlsangiz, iltimos, toʻliq havola nusxalanganligini tekshiring.",
"password_changes_disabled": "Parolni ozgartirish faolsizlantirildi.",
"recovery_ticket_already_used": "The recovery link has already been used. It cannot be used again.",
"recovery_ticket_already_used": "Qayta tiklash havolasi allaqachon ishlatilgan. Uni qayta ishlatib boʻlmaydi.",
"unspecified": "Bu vaqtinchalik muammo bolishi mumkin, keyinroq qayta urining. Agar muammo bartaraf etilmasa, server administratoriga murojaat qiling.",
"wrong_password": "Joriy parol sifatida kiritgan parolingiz notogri. Iltimos, qayta urinib koring."
},
"title": "Parolni yangilab bolmadi."
},
"new_password_again_label": "Enter new password again",
"new_password_again_label": "Yangi parolni qayta kiriting",
"new_password_label": "Yangi parol",
"passwords_match": "Parollar mos keldi!",
"passwords_no_match": "Parollar mos kelmadi",
@@ -170,101 +170,101 @@
},
"password_reset": {
"consumed": {
"subtitle": "To create a new password, start over and select ”Forgot password“.",
"title": "The link to reset your password has already been used"
"subtitle": "Yangi parol yaratish uchun boshidan boshlang va ʼʼParolni unutdingizmiʼʼ ni tanlang.",
"title": "Parolingizni tiklash havolasi allaqachon ishlatilgan"
},
"expired": {
"resend_email": "Elektron pochtani qayta yuborish",
"subtitle": "Request a new email that will be sent to: {{email}}",
"title": "The link to reset your password has expired"
"subtitle": "{{email}} manziliga yuboriladigan yangi elektron pochta xabarini soʻrang",
"title": "Parolingizni tiklash havolasi muddati tugagan"
},
"subtitle": "Hisobingiz uchun yangi parol tanlang.",
"title": "Reset your password"
"title": "Parolingizni qayta tiklash"
},
"password_strength": {
"placeholder": "Password strength",
"placeholder": "Parol kuchi",
"score": {
"0": "Extremely weak password",
"1": "Very weak password",
"2": "Weak password",
"3": "Strong password",
"4": "Very strong password"
"0": "Juda zaif parol",
"1": "Juda zaif parol",
"2": "Zaif parol",
"3": "Kuchli parol",
"4": "Juda kuchli parol"
},
"suggestion": {
"all_uppercase": "Capitalise some, but not all letters.",
"another_word": "Add more words that are less common.",
"associated_years": "Avoid years that are associated with you.",
"capitalization": "Capitalise more than the first letter.",
"dates": "Avoid dates and years that are associated with you.",
"l33t": "Avoid predictable letter substitutions like '@' for 'a'.",
"longer_keyboard_pattern": "Use longer keyboard patterns and change typing direction multiple times.",
"no_need": "You can create strong passwords without using symbols, numbers, or uppercase letters.",
"pwned": "If you use this password elsewhere, you should change it.",
"recent_years": "Avoid recent years.",
"repeated": "Avoid repeated words and characters.",
"reverse_words": "Avoid reversed spellings of common words.",
"sequences": "Avoid common character sequences.",
"use_words": "Use multiple words, but avoid common phrases."
"all_uppercase": "Baʼzi harflarni bosh harf bilan yozing, lekin hammasini emas.",
"another_word": "Kamroq uchraydigan soʻzlarni qoʻshing.",
"associated_years": "Siz bilan bogʻliq yillardan qoching.",
"capitalization": "Birinchi harfdan koʻproq bosh harf bilan yozing.",
"dates": "Siz bilan bogʻliq sanalar va yillardan qoching.",
"l33t": "“a” harfi orniga “@” kabi oldindan aytib boladigan harf almashtirishlardan saqlaning.",
"longer_keyboard_pattern": "Uzunroq klaviatura naqshlaridan foydalaning va yozish yoʻnalishini bir necha marta oʻzgartiring.",
"no_need": "Siz belgilar, raqamlar yoki katta harflardan foydalanmasdan kuchli parollar yaratishingiz mumkin.",
"pwned": "Agar siz ushbu parolni boshqa joyda ishlatsangiz, uni oʻzgartirishingiz kerak.",
"recent_years": "Soʻnggi yillardagi voqealardan qoching.",
"repeated": "Takrorlanadigan soʻzlar va belgilardan saqlaning.",
"reverse_words": "Umumiy soʻzlarning teskari yozilishidan saqlaning.",
"sequences": "Umumiy belgilar ketma-ketligidan qoching.",
"use_words": "Bir nechta soʻzlardan foydalaning, lekin umumiy iboralardan qoching."
},
"too_weak": "This password is too weak",
"too_weak": "Bu parol juda zaif",
"warning": {
"common": "This is a commonly used password.",
"common_names": "Common names and surnames are easy to guess.",
"dates": "Dates are easy to guess.",
"extended_repeat": "Repeated character patterns like \"abcabcabc\" are easy to guess.",
"key_pattern": "Short keyboard patterns are easy to guess.",
"names_by_themselves": "Single names or surnames are easy to guess.",
"pwned": "Your password was exposed by a data breach on the Internet.",
"recent_years": "Recent years are easy to guess.",
"sequences": "Common character sequences like \"abc\" are easy to guess.",
"similar_to_common": "This is similar to a commonly used password.",
"simple_repeat": "Repeated characters like \"aaa\" are easy to guess.",
"straight_row": "Straight rows of keys on your keyboard are easy to guess.",
"top_hundred": "This is a frequently used password.",
"top_ten": "This is a heavily used password.",
"user_inputs": "There should not be any personal or page related data.",
"word_by_itself": "Single words are easy to guess."
"common": "Bu tez-tez ishlatiladigan parol.",
"common_names": "Umumiy ismlar va familiyalarni taxmin qilish oson.",
"dates": "Sanalar taxmin qilish oson.",
"extended_repeat": "\"abcabcabc\" kabi takroriy belgi naqshlarini taxmin qilish oson.",
"key_pattern": "Qisqa klaviatura birikmalarini topish oson.",
"names_by_themselves": "Bitta ism yoki familiyani taxmin qilish oson.",
"pwned": "Parolingiz internetda maʻlumotlarning oʻgʻirlanishi natijasida oshkor boʻldi.",
"recent_years": "Yillar oson topiladi.",
"sequences": "\"abc\" kabi keng tarqalgan belgilar ketma-ketligini taxmin qilish oson.",
"similar_to_common": "Bu keng tarqalgan parolga oʻxshaydi.",
"simple_repeat": "\"aaa\" kabi takroriy belgilarni taxmin qilish oson.",
"straight_row": "Klaviaturangizdagi tugmalarning toʻgʻri qatorlarini taxmin qilish oson.",
"top_hundred": "Bu tez-tez ishlatiladigan parol.",
"top_ten": "Bu juda koʻp ishlatiladigan parol.",
"user_inputs": "Shaxsiy yoki sahifa bilan bogʻliq maʻlumotlar boʻlmasligi kerak.",
"word_by_itself": "Alohida soʻzlarni taxmin qilish oson."
}
},
"reset_cross_signing": {
"cancelled": {
"description_1": "You can close this window and go back to the app to continue.",
"description_2": "If dont have access to any other verified devices and you dont have your recovery key, then youll need to reset your digital identity to continue using the app.",
"heading": "Digital identity reset cancelled."
"description_1": "Davom etish uchun ushbu oynani yopib, ilovaga qaytishingiz mumkin.",
"description_2": "Agar boshqa tasdiqlangan qurilmalarga kirish imkoningiz boʻlmasa va sizda tiklash kaliti boʻlmasa, ilovadan foydalanishda davom etish uchun raqamli identifikatsiyangizni tiklashingiz kerak boʻladi.",
"heading": "Raqamli identifikatsiyani tiklash bekor qilindi."
},
"description": "Agar boshqa tasdiqlangan qurilmalarga kirish imkoningiz boʻlmasa va sizda tiklash kaliti boʻlmasa, ilovadan foydalanishda davom etish uchun raqamli identifikatsiyangizni tiklashingiz kerak boʻladi.",
"effect_list": {
"neutral_1": "You will lose any message history that's stored only on the server",
"neutral_1": "Faqat serverda saqlangan har qanday xabarlar tarixi oʻchib ketadi",
"neutral_2": "You will need to verify all your existing devices and contacts again",
"positive_1": "Your account details, contacts, preferences, and chat list will be kept"
"positive_1": "Hisob maʼlumotlaringiz, kontaktlaringiz, sozlamalaringiz va suhbatlar roʻyxatingiz saqlanib qoladi"
},
"failure": {
"description": "Bu vaqtinchalik muammo bolishi mumkin, keyinroq qayta urining. Agar muammo bartaraf etilmasa, server administratoriga murojaat qiling.",
"heading": "Failed to allow digital identity reset"
"heading": "Raqamli identifikatsiyani qayta tiklashga ruxsat berilmadi"
},
"finish_reset": "Finish reset",
"finish_reset": "Qayta tiklashni tugatish",
"heading": "Boshqa usulda tasdiqlay olmasangiz, raqamli identifikatoringizni asliga qaytaring",
"start_reset": "Start reset",
"start_reset": "Qayta tiklashni boshlang",
"success": {
"description": "Raqamli identifikatorni tiklash keyingi {{minutes}} daqiqa uchun tasdiqlandi. Bu oynani yopib, davom etish uchun ilovaga qaytishingiz mumkin.",
"heading": "Digital identity reset successfully. Go back to the app to finish the process."
"heading": "Raqamli identifikatsiya muvaffaqiyatli tiklandi. Jarayonni yakunlash uchun ilovaga qayting."
},
"warning": "Only reset your digital identity if you don't have access to another verified device and you don't have your recovery key."
"warning": "Agar boshqa tasdiqlangan qurilmaga kira olmasangiz va zaxira kalitingiz bolmasa, raqamli identifikatoringizni asliga qaytaring."
},
"session": {
"client_id_label": "Mijoz ID raqami",
"current": "Hozirgi",
"device_id_label": "Qurilma ID",
"finished_label": "Tugadi",
"generic_browser_session": "Browser session",
"generic_browser_session": "Brauzer sessiyasi",
"ip_label": "IP-manzil",
"last_active_label": "Oxirgi faollik",
"name_for_platform": "{{platform}} uchun {{name}}",
"scopes_label": "Kolamlar",
"set_device_name": {
"help": "Set a name that will help you identify this device.",
"label": "Device name",
"title": "Edit device name"
"help": "Ushbu qurilmani aniqlashga yordam beradigan nom oʻrnating.",
"label": "Qurilma nomi",
"title": "Qurilma nomini tahrirlash"
},
"signed_in_label": "Kirish",
"title": "Qurilma tafsilotlari",
@@ -283,39 +283,39 @@
"delete_button_confirmation_modal": {
"action": "Elektron pochtani oʻchirish",
"body": "Bu email ochirib tashlansinmi?",
"incorrect_password": "Incorrect password, please try again",
"password_confirmation": "Confirm your account password to delete this email address"
"incorrect_password": "Parol notoʻgʻri,qaytadan urining.",
"password_confirmation": "Ushbu elektron pochta manzilini oʻchirish uchun hisobingiz parolini tasdiqlang"
},
"delete_button_title": "Elektron pochta manzilini olib tashlash",
"email": "Elektron pochta"
},
"user_sessions_overview": {
"approaching_session_limit_warning_description:one": "You've used {{num_sessions}} of {{count}} device slot. Once you reach your limit, you'll need to remove an existing device to add another.",
"approaching_session_limit_warning_description:other": "You've used {{num_sessions}} of {{count}} device slots. Once you reach your limit, you'll need to remove an existing device to add another.",
"approaching_session_limit_warning_header": "Heads up, you're close to your device limit",
"approaching_session_limit_warning_description:one": "Siz {{count}} qurilma uyasidan {{num_sessions}} dan foydalandingiz. Cheklovga yetganingizdan soʻng, yangi qurilma qoʻshish uchun mavjud qurilmadan birini olib tashlashingiz kerak boʻladi.",
"approaching_session_limit_warning_description:other": "Siz {{count}} qurilma uyalaridan {{num_sessions}} dan foydalangansiz. Cheklovga yetganingizdan soʻng, boshqa qurilma qoʻshish uchun mavjud qurilmadan birini olib tashlashingiz kerak boʻladi.",
"approaching_session_limit_warning_header": "Diqqat! Qurilmangiz limitiga yaqinlashdingiz",
"heading": "Qayerda tizimga kirgansiz",
"hit_session_limit_warning_description:one": "You've used {{num_sessions}} of {{count}} device slot. When you try to sign-in again, you'll need to remove an existing device.",
"hit_session_limit_warning_description:other": "You've used {{num_sessions}} of {{count}} device slots. When you try to sign-in again, you'll need to remove an existing device.",
"hit_session_limit_warning_header": "You've hit the device limit",
"hit_session_limit_warning_description:one": "Siz {{count}} qurilma uyasidan {{num_sessions}} dan foydalandingiz. Qayta kirishga urinayotganingizda, mavjud qurilmani olib tashlashingiz kerak boʻladi.",
"hit_session_limit_warning_description:other": "Siz {{count}} qurilma uyalaridan {{num_sessions}} dan foydalangansiz. Qayta kirishga urinayotganingizda, mavjud qurilmani olib tashlashingiz kerak boʻladi.",
"hit_session_limit_warning_header": "Qurilmalar soni limitiga yetdingiz",
"no_active_sessions": {
"default": "You are not signed in to any application.",
"inactive_90_days": "All your sessions have been active in the last 90 days."
"default": "Siz hech qanday ilovaga kirmagansiz.",
"inactive_90_days": "Soʻnggi 90 kun ichida barcha sessiyalaringiz faol boʻldi."
},
"num_sessions_filtered_header": {
"header:one": "{{count}} device matches your filter ({{unfiltered_session_total}})",
"header:other": "{{count}} devices match your filter ({{unfiltered_session_total}})",
"unfiltered_session_total:one": "{{count}} total",
"unfiltered_session_total:other": "{{count}} total"
"header:one": "{{count}} qurilmasi sizning filtringizga mos keladi ({{unfiltered_session_total}})",
"header:other": "{{count}} qurilmalari sizning filtringizga mos keladi ({{unfiltered_session_total}})",
"unfiltered_session_total:one": "Jami {{count}}",
"unfiltered_session_total:other": "Jami {{count}}"
},
"num_sessions_header:one": "{{count}} device",
"num_sessions_header:other": "{{count}} devices",
"session_limit_info:one": "You've used {{count}}/{{limit}} device slots",
"session_limit_info:other": "You've used {{count}}/{{limit}} device slots"
"num_sessions_header:one": "{{count}} qurilmasi",
"num_sessions_header:other": "{{count}} qurilmalari",
"session_limit_info:one": "Siz {{count}}/{{limit}} qurilma uyalaridan foydalangansiz",
"session_limit_info:other": "Siz {{count}}/{{limit}} qurilma uyalaridan foydalangansiz"
},
"verify_email": {
"code_expired_alert": {
"description": "The code has expired. Please request a new code.",
"title": "Code expired"
"description": "Kodning amal qilish muddati tugagan. Iltimos, yangi kod soʻrang.",
"title": "Kod muddati tugagan"
},
"code_field_error": "Kod tan olinmadi",
"code_field_label": "6 xonali kod",
+2 -2
View File
@@ -116,9 +116,9 @@
"rate_limit_exceeded": "你在短时间内发出了过多请求。请于几分钟后重试。"
},
"last_active": {
"active_date": "活跃 {{relativeDate}}",
"active_date": "活跃 {{relativeDate}}",
"active_now": "活跃",
"inactive_90_days": "已停用90天以上"
"inactive_90_days": "已停用 90 天以上"
},
"nav": {
"device_limit_error": "已达到设备数量上限",
+10
View File
@@ -0,0 +1,10 @@
// 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.
// Submit the form on the next tick, so the browser can paint the
// placeholder before navigating away.
setTimeout(() => {
document.forms[0].submit();
}, 0);
@@ -0,0 +1,104 @@
// 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.
// This is taken from the swagger-ui/dist/oauth2-redirect.html file
interface SwaggerUIRedirectOauth2 {
state?: string;
redirectUrl: string;
auth: {
name: string;
code?: string;
schema: { get(key: string): string };
};
errCb: (error: {
authId: string;
source: string;
level: string;
message: string;
}) => void;
callback: (result: {
auth: SwaggerUIRedirectOauth2["auth"];
redirectUrl: string;
token?: unknown;
isValid?: boolean;
}) => void;
}
interface RedirectOpener extends Window {
swaggerUIRedirectOauth2: SwaggerUIRedirectOauth2;
}
const oauth2 = (window.opener as RedirectOpener).swaggerUIRedirectOauth2;
const sentState = oauth2.state;
const redirectUrl = oauth2.redirectUrl;
let qpString: string;
if (/code|token|error/.test(window.location.hash)) {
qpString = window.location.hash.substring(1).replace("?", "&");
} else {
qpString = location.search.substring(1);
}
const arr = qpString.split("&");
for (let i = 0; i < arr.length; i++) {
arr[i] = `"${arr[i].replace("=", '":"')}"`;
}
const qp: Record<string, string> = qpString
? JSON.parse(`{${arr.join()}}`, (key, value) =>
key === "" ? value : decodeURIComponent(value),
)
: {};
const isValid = qp.state === sentState;
if (
(oauth2.auth.schema.get("flow") === "accessCode" ||
oauth2.auth.schema.get("flow") === "authorizationCode" ||
oauth2.auth.schema.get("flow") === "authorization_code") &&
!oauth2.auth.code
) {
if (!isValid) {
oauth2.errCb({
authId: oauth2.auth.name,
source: "auth",
level: "warning",
message:
"Authorization may be unsafe, passed state was changed in server. The passed state wasn't returned from auth server.",
});
}
if (qp.code) {
delete oauth2.state;
oauth2.auth.code = qp.code;
oauth2.callback({ auth: oauth2.auth, redirectUrl: redirectUrl });
} else {
let oauthErrorMsg: string | undefined;
if (qp.error) {
oauthErrorMsg = `[${qp.error}]: ${
qp.error_description
? `${qp.error_description}. `
: "no accessCode received from the server. "
}${qp.error_uri ? `More info: ${qp.error_uri}` : ""}`;
}
oauth2.errCb({
authId: oauth2.auth.name,
source: "auth",
level: "error",
message:
oauthErrorMsg ||
"[Authorization failed]: no accessCode received from the server.",
});
}
} else {
oauth2.callback({
auth: oauth2.auth,
token: qp,
isValid: isValid,
redirectUrl: redirectUrl,
});
}
window.close();
+8 -4
View File
@@ -1,5 +1,6 @@
#!/bin/sh
# Copyright 2025, 2026 Element Creations Ltd.
# Copyright 2025 New Vector Ltd.
#
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
@@ -22,14 +23,15 @@ if [ "${CF_PAGES:-""}" = "1" ]; then
# Source the environment variables to add cargo to the path
. "$HOME/.cargo/env"
# Install the minimal toolchain, which includes rustc, rustdoc, and cargo
rustup toolchain install stable --profile minimal
# Install the toolchain pinned in rust-toolchain.toml
rustup toolchain install
# Install mdbook
MDBOOK_URL="https://github.com/rust-lang/mdBook/releases/download/v${MDBOOK_VERSION}/mdbook-v${MDBOOK_VERSION}-$(uname -m)-unknown-linux-gnu.tar.gz"
curl --proto '=https' --tlsv1.2 -sSfL "${MDBOOK_URL}" | tar -C "$HOME/.cargo/bin" -xzv
# Enable pnpm via corepack (Node and corepack are pre-installed on Cloudflare Pages)
# Enable pnpm via corepack (Node and corepack are pre-installed on Cloudflare
# Pages, which picks the Node version from .node-version)
corepack enable
fi
@@ -55,5 +57,7 @@ rm -rf target/book/rustdoc
mv target/doc target/book/rustdoc
# Build the frontend storybook
pnpm install --frozen-lockfile
# Node is already provided by Cloudflare Pages / the CI runner, so skip pnpm's
# own runtime download.
pnpm install --frozen-lockfile --no-runtime
pnpm --filter mas-frontend exec storybook build -o ../target/book/storybook
+7
View File
@@ -2,6 +2,13 @@
"name": "matrix-authentication-service",
"private": true,
"packageManager": "pnpm@11.3.0+sha512.2c403d6594527287672b1f7056343a1f7c3634036a67ffabfcc2b3d7595d843768f8787148d1b57cf7956c90606bbd192857c363af19e96d2d0ec9ec5741d215",
"devEngines": {
"runtime": {
"name": "node",
"version": "24.15.0",
"onFail": "download"
}
},
"devDependencies": {
"@localazy/cli": "^2.0.11",
"semver": "^7.8.5"
+126
View File
@@ -14,6 +14,9 @@ importers:
'@localazy/cli':
specifier: ^2.0.11
version: 2.0.11
node:
specifier: runtime:24.15.0
version: runtime:24.15.0
semver:
specifier: ^7.8.5
version: 7.8.5
@@ -3971,6 +3974,127 @@ packages:
resolution: {integrity: sha512-MRlTqhAfoMx/4mhEbPo3Hi02g9LJZaJkka69V6h67Cb1gjrAG0jsTE4CZX1eptNx+VCAwJmfpnDIF4P0Nh1A7A==}
engines: {node: '>=18'}
node@runtime:24.15.0:
resolution:
type: variations
variants:
- resolution:
archive: tarball
bin:
node: bin/node
integrity: sha256-3UvHfctfTJoslkNzm7WTUAzLCUE+xCyqD47w5e8RYJU=
type: binary
url: https://nodejs.org/download/release/v24.15.0/node-v24.15.0-aix-ppc64.tar.gz
targets:
- cpu: ppc64
os: aix
- resolution:
archive: tarball
bin:
node: bin/node
integrity: sha256-NyMxuWl3mrXRW5SYhPxur4jVr+h73ouogdZAC5EA/8Q=
type: binary
url: https://nodejs.org/download/release/v24.15.0/node-v24.15.0-darwin-arm64.tar.gz
targets:
- cpu: arm64
os: darwin
- resolution:
archive: tarball
bin:
node: bin/node
integrity: sha256-/9XuKTRnkn8+5zGlU+uI/R9Iz3TuvC10prq+SvIoZzs=
type: binary
url: https://nodejs.org/download/release/v24.15.0/node-v24.15.0-darwin-x64.tar.gz
targets:
- cpu: x64
os: darwin
- resolution:
archive: tarball
bin:
node: bin/node
integrity: sha256-c6/CNNVYwkkZh19RwtHqACoq2k6m+DYBo4OGn++mTu0=
type: binary
url: https://nodejs.org/download/release/v24.15.0/node-v24.15.0-linux-arm64.tar.gz
targets:
- cpu: arm64
os: linux
- resolution:
archive: tarball
bin:
node: bin/node
integrity: sha256-sfiJAKSxY2XqulYmkwT8Edp1gdvwNVLUSV+azh/AX20=
type: binary
url: https://nodejs.org/download/release/v24.15.0/node-v24.15.0-linux-ppc64le.tar.gz
targets:
- cpu: ppc64le
os: linux
- resolution:
archive: tarball
bin:
node: bin/node
integrity: sha256-+YVFVDnVL+m43mqPbQe/7MxzbepSfofqyv5ajXUWo4A=
type: binary
url: https://nodejs.org/download/release/v24.15.0/node-v24.15.0-linux-s390x.tar.gz
targets:
- cpu: s390x
os: linux
- resolution:
archive: tarball
bin:
node: bin/node
integrity: sha256-RINoctmuxJ8ea1KpqSKHLbmisC0jWmFqVoG2qF/sjYk=
type: binary
url: https://nodejs.org/download/release/v24.15.0/node-v24.15.0-linux-x64.tar.gz
targets:
- cpu: x64
os: linux
- resolution:
archive: zip
bin:
node: node.exe
integrity: sha256-yet0Au2ibiun5EtnJ/yFqN5WxQlbH3Hr0wYokiEaoRY=
prefix: node-v24.15.0-win-arm64
type: binary
url: https://nodejs.org/download/release/v24.15.0/node-v24.15.0-win-arm64.zip
targets:
- cpu: arm64
os: win32
- resolution:
archive: zip
bin:
node: node.exe
integrity: sha256-zFFJ6r1Td5zh573FQBZDYi0MfmgAreGJKKdn6UC7DmI=
prefix: node-v24.15.0-win-x64
type: binary
url: https://nodejs.org/download/release/v24.15.0/node-v24.15.0-win-x64.zip
targets:
- cpu: x64
os: win32
- resolution:
archive: tarball
bin:
node: bin/node
integrity: sha256-MemKqWCgZ9qR7f/V2TvEZle10qgClhLDWfXyrABgFSo=
type: binary
url: https://unofficial-builds.nodejs.org/download/release/v24.15.0/node-v24.15.0-linux-arm64-musl.tar.gz
targets:
- cpu: arm64
os: linux
libc: musl
- resolution:
archive: tarball
bin:
node: bin/node
integrity: sha256-9Vr1vUicU0exE8pllMrgClSzC6V6xYdTJDEb/G9HYuM=
type: binary
url: https://unofficial-builds.nodejs.org/download/release/v24.15.0/node-v24.15.0-linux-x64-musl.tar.gz
targets:
- cpu: x64
os: linux
libc: musl
version: 24.15.0
hasBin: true
normalize-path@2.1.1:
resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==}
engines: {node: '>=0.10.0'}
@@ -8411,6 +8535,8 @@ snapshots:
node-releases@2.0.52: {}
node@runtime:24.15.0: {}
normalize-path@2.1.1:
dependencies:
remove-trailing-separator: 1.1.0
+11
View File
@@ -0,0 +1,11 @@
# 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.
[toolchain]
channel = "1.96.0"
profile = "minimal"
# No rustfmt: .rustfmt.toml uses nightly-only options, so formatting runs as `cargo +nightly fmt`.
# No cross-compilation targets: the Dockerfile and build.yaml add the ones they need.
components = ["clippy"]
+3 -1
View File
@@ -25,7 +25,9 @@ Please see LICENSE files in the repository root for full details.
{% if mode == "form_post" %}
<form method="post" action="{{ uri }}">
{% for key, value in params|items %}
<input type="hidden" name="{{ key }}" value="{{ value }}" />
{% if value is not none and value is defined %}
<input type="hidden" name="{{ key }}" value="{{ value }}" />
{% endif %}
{% endfor %}
<button class="{{ class }}" data-kind="{{ kind }}" data-size="lg" type="submit">{{ text }}</button>
</form>
+2 -1
View File
@@ -1,4 +1,5 @@
{#
Copyright 2025, 2026 Element Creations Ltd.
Copyright 2024, 2025 New Vector Ltd.
Copyright 2021-2024 The Matrix.org Foundation C.I.C.
@@ -28,5 +29,5 @@ Please see LICENSE files in the repository root for full details.
{# Submit the form in JavaScript on the next tick, so that if the browser
wants to display the placeholder instead of a blank page, it can #}
<script>setTimeout(function() { document.forms[0].submit(); }, 0);</script>
{{ include_asset('src/entrypoints/form-post.ts') | indent(2) | safe }}
{% endblock %}
@@ -7,7 +7,7 @@ Please see LICENSE files in the repository root for full details.
{% extends "base.html" %}
{% set is_too_many_sessions = violations | length == 1 and violations[0].code == "too-many-sessions" %}
{% set is_too_many_sessions = violations | length == 1 and violations[0].code | default("") == "too-many-sessions" %}
{% set num_sessions_need_to_remove = violations[0].need_to_remove if is_too_many_sessions else none %}
{% block content %}
+1 -1
View File
@@ -8,7 +8,7 @@ Please see LICENSE files in the repository root for full details.
{% extends "base.html" %}
{% set is_too_many_sessions = violations | length == 1 and violations[0].code == "too-many-sessions" %}
{% set is_too_many_sessions = violations | length == 1 and violations[0].code | default("") == "too-many-sessions" %}
{% set num_sessions_need_to_remove = violations[0].need_to_remove if is_too_many_sessions else none %}
{% block content %}
+3 -73
View File
@@ -1,4 +1,5 @@
{#
Copyright 2025, 2026 Element Creations Ltd.
Copyright 2024, 2025 New Vector Ltd.
Copyright 2024 The Matrix.org Foundation C.I.C.
@@ -12,78 +13,7 @@ Please see LICENSE files in the repository root for full details.
<html lang="en">
<head>
<title>API documentation: OAuth2 Redirect</title>
{{ include_asset('src/entrypoints/swagger-oauth2-redirect.ts') | indent(4) | safe }}
</head>
<body>
<script>
'use strict';
function run () {
var oauth2 = window.opener.swaggerUIRedirectOauth2;
var sentState = oauth2.state;
var redirectUrl = oauth2.redirectUrl;
var isValid, qp, arr;
if (/code|token|error/.test(window.location.hash)) {
qp = window.location.hash.substring(1).replace('?', '&');
} else {
qp = location.search.substring(1);
}
arr = qp.split("&");
arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';});
qp = qp ? JSON.parse('{' + arr.join() + '}',
function (key, value) {
return key === "" ? value : decodeURIComponent(value);
}
) : {};
isValid = qp.state === sentState;
if ((
oauth2.auth.schema.get("flow") === "accessCode" ||
oauth2.auth.schema.get("flow") === "authorizationCode" ||
oauth2.auth.schema.get("flow") === "authorization_code"
) && !oauth2.auth.code) {
if (!isValid) {
oauth2.errCb({
authId: oauth2.auth.name,
source: "auth",
level: "warning",
message: "Authorization may be unsafe, passed state was changed in server. The passed state wasn't returned from auth server."
});
}
if (qp.code) {
delete oauth2.state;
oauth2.auth.code = qp.code;
oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl});
} else {
let oauthErrorMsg;
if (qp.error) {
oauthErrorMsg = "["+qp.error+"]: " +
(qp.error_description ? qp.error_description+ ". " : "no accessCode received from the server. ") +
(qp.error_uri ? "More info: "+qp.error_uri : "");
}
oauth2.errCb({
authId: oauth2.auth.name,
source: "auth",
level: "error",
message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server."
});
}
} else {
oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});
}
window.close();
}
if (document.readyState !== 'loading') {
run();
} else {
document.addEventListener('DOMContentLoaded', function () {
run();
});
}
</script>
</body>
<body></body>
</html>
+29 -29
View File
@@ -7,7 +7,7 @@
"sign_in": "Anmelden",
"sign_out": "Abmelden",
"skip": "Überspringen",
"start_over": "Von vorne anfangen"
"start_over": "Neu beginnen"
},
"app": {
"human_name": "Matrix Authentication Service",
@@ -27,11 +27,11 @@
"common": {
"display_name": "Anzeigename",
"email_address": "E-Mail-Adresse",
"loading": "Lade …",
"loading": "Wird geladen …",
"mxid": "Matrix-ID",
"password": "Passwort",
"password_confirm": "Passwort wiederholen",
"username": "Benutzername"
"password_confirm": "Passwort bestätigen",
"username": "Nutzername"
},
"error": {
"unexpected": "Unerwarteter Fehler"
@@ -39,11 +39,11 @@
"mas": {
"account": {
"deactivated": {
"description": "Dieses Konto (<em>%(mxid)s</em>) wurde entfernt. Wenn du dies nicht erwartet hast, wende dich an den Server Admin",
"description": "Dieses Konto (<em>%(mxid)s</em>) wurde entfernt. Wenn du dies nicht erwartet hast, wende dich an den Kontoanbieter.",
"heading": "Konto gelöscht"
},
"locked": {
"description": "Dieses Konto (<em>%(mxid)s</em>) wurde gesperrt. Wenn du dies nicht erwartet hast, wende dich an den Server Admin.",
"description": "Dieses Konto (<em>%(mxid)s</em>) wurde gesperrt. Wenn du dies nicht erwartet hast, wende dich an den Kontoanbieter.",
"heading": "Konto gesperrt"
},
"logged_out": {
@@ -57,7 +57,7 @@
},
"change_password": {
"change": "Passwort ändern",
"confirm": "Passwort wiederholen",
"confirm": "Passwort bestätigen",
"current": "Aktuelles Passwort",
"heading": "Mein Passwort ändern",
"new": "Neues Passwort"
@@ -79,8 +79,8 @@
"security_code": "Sicherheitscode"
},
"device_code_link": {
"description": "Eingeben Sie den Sicherheitscode ein, der auf Ihrem anderen Gerät angezeigt wird",
"headline": "Gib den Code ein, der auf deinem Gerät angezeigt wird.",
"description": "Gib den Sicherheitscode ein, der auf deinem anderen Gerät angezeigt wird",
"headline": "Gerät zu deinem Konto hinzufügen",
"verification_code": "Bestätigungscode"
},
"device_consent": {
@@ -113,10 +113,10 @@
"emails": {
"greeting": "Hallo %(username)s,",
"recovery": {
"click_button": "Klick unten, um ein neues Passwort zu erstellen:",
"click_button": "Wähle die Schaltfläche unten, um ein neues Passwort zu erstellen:",
"copy_link": "Kopier den folgenden Link und füge ihn in deinen Browser ein, um ein neues Passwort zu erstellen:",
"create_new_password": "Neues Passwort erstellen",
"fallback": "Funktioniert der Button bei Ihnen nicht?",
"fallback": "Funktioniert die Schaltfläche bei dir nicht?",
"headline": "Du hast das Zurücksetzen des Passworts für dein Konto bei %(server_name)s angefordert.",
"subject": "Setze dein Konto Passwort zurück (%(mxid)s)",
"you_can_ignore": "Wenn du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach ignorieren. Dein aktuelles Passwort funktioniert weiterhin."
@@ -128,7 +128,7 @@
}
},
"errors": {
"captcha": "Die CAPTCHA-Überprüfung hat nicht geklappt, versuch's nochmal.",
"captcha": "Die CAPTCHA-Überprüfung ist fehlgeschlagen, bitte versuche es erneut",
"denied_policy": "Abgelehnt durch Richtlinie: %(policy)s",
"email_banned": "E-Mail ist durch die Serverrichtlinie gesperrt",
"email_domain_banned": "Die E-Mail-Domain ist durch die Serverrichtlinie gesperrt",
@@ -137,14 +137,14 @@
"field_required": "Dieses Feld ist ein Pflichtfeld",
"invalid_credentials": "Ungültige Anmeldeinformationen",
"password_mismatch": "Die Passwortfelder stimmen nicht überein",
"rate_limit_exceeded": "Du hast in kurzer Zeit zu viele Anfragen gestellt. Warte bitte ein paar Minuten und versuch's nochmal.",
"username_all_numeric": "Der Benutzername darf nicht nur aus Zahlen bestehen",
"username_banned": "Der Benutzername ist durch die Serverrichtlinie gesperrt",
"rate_limit_exceeded": "Du hast in kurzer Zeit zu viele Anfragen gestellt. Bitte warte ein paar Minuten und versuche es erneut.",
"username_all_numeric": "Der Nutzername darf nicht nur aus Zahlen bestehen",
"username_banned": "Der Nutzername ist durch die Serverrichtlinie gesperrt",
"username_invalid_chars": "Der Nutzername enthält ungültige Zeichen. Verwende nur Kleinbuchstaben, Zahlen, Bindestriche und Unterstriche.",
"username_not_allowed": "Der Benutzername ist gemäß der Serverrichtlinie nicht zulässig",
"username_taken": "Dieser Benutzername ist bereits vergeben",
"username_too_long": "Der Benutzername ist zu lang",
"username_too_short": "Der Benutzername ist zu kurz"
"username_not_allowed": "Der Nutzername ist gemäß der Serverrichtlinie nicht zulässig",
"username_taken": "Dieser Nutzername ist bereits vergeben",
"username_too_long": "Der Nutzername ist zu lang",
"username_too_short": "Der Nutzername ist zu kurz"
},
"legacy_consent": {
"this_will_setup": "Dadurch wird <span>%(client_name)s</span> mit deinem <span>%(server_name)s</span> Konto eingerichtet."
@@ -160,7 +160,7 @@
"headline": "Melde dich zum Verbinden an"
},
"no_login_methods": "Keine Anmeldemethoden verfügbar.",
"username_or_email": "Benutzername oder E-Mail-Adresse"
"username_or_email": "Nutzername oder E-Mail-Adresse"
},
"navbar": {
"my_account": "Mein Konto",
@@ -168,13 +168,13 @@
"signed_in_as": "Angemeldet als <span class=\"font-semibold\">%(username)s</span>."
},
"not_found": {
"description": "Die Seite, die du gesucht hast, gibt's nicht oder wurde verschoben.",
"description": "Die Seite, die du gesucht hast, existiert nicht oder wurde verschoben",
"heading": "Seite nicht gefunden"
},
"not_you": "Nicht %(username)s?",
"or_separator": "Oder",
"policy_violation": {
"description": "Dies kann am Client liegen, der die Anfrage erstellt hat, am aktuell angemeldeten Benutzer oder an der Anfrage selbst.",
"description": "Dies kann an der Anwendung liegen, die die Anfrage erstellt hat, am aktuell angemeldeten Nutzer oder an der Anfrage selbst.",
"heading": "Die Autorisierungsanfrage wurde durch eine Richtlinie dieses Dienstes abgelehnt",
"logged_as": "Eingeloggt als <span class=\"font-semibold\">%(username)s</span>",
"too_many_sessions": {
@@ -185,7 +185,7 @@
},
"recovery": {
"consumed": {
"description": "Um ein neues Passwort zu erstellen, fang einfach von vorne an und wähle „Passwort vergessen.",
"description": "Um ein neues Passwort zu erstellen, beginne neu und wähle „Passwort vergessen.",
"heading": "Der Link zum Zurücksetzen deines Passworts wurde bereits verwendet"
},
"disabled": {
@@ -205,7 +205,7 @@
"save_and_continue": "Speichern und fortfahren"
},
"progress": {
"change_email": "Probier's mal mit einer anderen E-Mail-Adresse",
"change_email": "Andere E-Mail-Adresse versuchen",
"description": "Eine E-Mail mit einem Link zum Zurücksetzen deines Passworts wurde versendet, wenn es ein Konto mit <span>%(email)s</span> gibt.",
"heading": "Überprüfe deine E-Mails!",
"resend_email": "E-Mail erneut senden"
@@ -223,17 +223,17 @@
"description": "Wähle einen Nutzernamen, um fortzufahren.",
"heading": "Konto erstellen"
},
"terms_of_service": "Ich stimme den <a href=\"%s\" data-kind=\"primary\" class=\"cpd-link\">Allgemeinen Geschäftsbedingungen</a> zu."
"terms_of_service": "Ich stimme den <a href=\"%s\" data-kind=\"primary\" class=\"cpd-link\">Allgemeinen Geschäftsbedingungen</a> zu"
},
"registration_token": {
"description": "Gib das Registrierungstoken ein, das du vom Homeserver-Admin bekommen hast.",
"description": "Gib ein Registrierungstoken ein, das du von deinem Kontoanbieter erhalten hast.",
"field": "Registrierungstoken",
"headline": "Registrierungstoken"
},
"scope": {
"edit_profile": "Bearbeite dein Profil und deine Kontaktdaten",
"manage_sessions": "Verwalte deine Geräte und Sitzungen",
"mas_admin": "Beliebige Benutzer verwalten (urn:mas:admin)",
"mas_admin": "Beliebige Nutzer verwalten (urn:mas:admin)",
"send_messages": "Neue Nachrichten in deinem Namen senden",
"synapse_admin": "Den Synapse-Homeserver verwalten (urn:synapse:admin:*)",
"view_messages": "Zeig deine vorhandenen Nachrichten und Daten an",
@@ -252,7 +252,7 @@
"enforced_by_policy": "Erzwungen durch Server-Richtlinie",
"forced_display_name": "Verwendet den folgenden Anzeigenamen",
"forced_email": "Verwendet die folgende E-Mail-Adresse",
"forced_localpart": "Verwendet den folgenden Benutzernamen",
"forced_localpart": "Verwendet den folgenden Nutzernamen",
"import_data": {
"description": "Bestätige die Informationen, die mit dem neuen %(server_name)s Konto verknüpft werden.",
"heading": "Deine Daten importieren"
@@ -262,7 +262,7 @@
"link_existing": "Mit einem bestehenden Konto verknüpfen",
"provider_name": "%(human_name)s Konto",
"signup_with_upstream": {
"heading": "Setze die Anmeldung mit %(human_name)s Konto fort."
"heading": "Setze die Anmeldung mit %(human_name)s Konto fort"
},
"suggested_display_name": "Anzeigenamen importieren",
"suggested_email": "E-Mail-Adresse importieren",
+2 -2
View File
@@ -10,7 +10,7 @@
},
"continue": "Continue",
"@continue": {
"context": "form_post.html:25:28-48, pages/consent.html:71:28-48, pages/device_link.html:42:28-48, pages/login.html:68:30-50, pages/reauth.html:32:28-48, pages/recovery/start.html:38:26-46, pages/register/password.html:80:26-46, pages/register/steps/display_name.html:43:28-48, pages/register/steps/registration_token.html:41:28-48, pages/register/steps/verify_email.html:51:26-46, pages/sso.html:52:28-48"
"context": "form_post.html:26:28-48, pages/consent.html:71:28-48, pages/device_link.html:42:28-48, pages/login.html:68:30-50, pages/reauth.html:32:28-48, pages/recovery/start.html:38:26-46, pages/register/password.html:80:26-46, pages/register/steps/display_name.html:43:28-48, pages/register/steps/registration_token.html:41:28-48, pages/register/steps/verify_email.html:51:26-46, pages/sso.html:52:28-48"
},
"create_account": "Create Account",
"@create_account": {
@@ -83,7 +83,7 @@
},
"loading": "Loading…",
"@loading": {
"context": "form_post.html:14:27-46"
"context": "form_post.html:15:27-46"
},
"mxid": "Matrix ID",
"@mxid": {
+3 -3
View File
@@ -39,11 +39,11 @@
"mas": {
"account": {
"deactivated": {
"description": "See kasutajakonto (<em>%(mxid)s</em>) on kustutatud. Kui see nii ei peaks olema, siis palun võta ühendust oma serveri haldajaga.",
"description": "See kasutajakonto (<em>%(mxid)s</em>) on kustutatud. Kui see nii ei peaks olema, siis palun võta ühendust oma teenusepakkujaga.",
"heading": "Kasutajakonto on kustutatud"
},
"locked": {
"description": "See kasutajakonto (<em>%(mxid)s</em>) on lukustatud. Kui see nii ei peaks olema, siis palun võta ühendust oma serveri haldajaga.",
"description": "See kasutajakonto (<em>%(mxid)s</em>) on lukustatud. Kui see nii ei peaks olema, siis palun võta ühendust oma teenusepakkujaga.",
"heading": "Kasutajakonto on lukustatud"
},
"logged_out": {
@@ -226,7 +226,7 @@
"terms_of_service": "Ma nõustun <a href=\"%s\" data-kind=\"primary\" class=\"cpd-link\">teenuse kasutustingimustega</a>"
},
"registration_token": {
"description": "Palun sisesta registreerimise tunnusluba, mille serveri haldaja on sulle andnud.",
"description": "Palun sisesta registreerimise tunnusluba, mille sinu teenusepakkuja on sulle andnud.",
"field": "Registreerimise tunnusluba",
"headline": "Registreerimise tunnusluba"
},
+2 -2
View File
@@ -79,8 +79,8 @@
"security_code": "Code de sécurité"
},
"device_code_link": {
"description": "Associer un appareil",
"headline": "Entrez le code affiché sur votre appareil",
"description": "Saisissez le code de sécurité affiché sur votre autre appareil",
"headline": "Associer un nouvel appareil à votre compte",
"verification_code": "Code de vérification"
},
"device_consent": {
+6 -6
View File
@@ -39,11 +39,11 @@
"mas": {
"account": {
"deactivated": {
"description": "To konto (<em>%(mxid)s</em>) zostało usunięte. Jeśli jest to nieoczekiwane, skontaktuj się z administratorem serwera.",
"description": "To konto (<em>%(mxid)s</em>) zostało usunięte. Jeśli jest to nieoczekiwane, skontaktuj się z dostawcą konta.",
"heading": "Konto usunięte"
},
"locked": {
"description": "To konto (<em>%(mxid)s</em>) zostało zablokowane. Jeśli jest to nieoczekiwane, skontaktuj się z administratorem serwera.",
"description": "To konto (<em>%(mxid)s</em>) zostało zablokowane. Jeśli jest to nieoczekiwane, skontaktuj się z dostawcą konta.",
"heading": "Konto zablokowane"
},
"logged_out": {
@@ -226,7 +226,7 @@
"terms_of_service": "Wyrażam zgodę na <a href=\"%s\" data-kind=\"primary\" class=\"cpd-link\">warunki korzystania z serwisu</a>"
},
"registration_token": {
"description": "Wprowadź token rejestracyjny dostarczony przez administratora serwera domowego.",
"description": "Wprowadź token rejestracyjny dostarczony przez dostawcę Twojego konta.",
"field": "Token rejestracyjny",
"headline": "Token rejestracyjny"
},
@@ -234,10 +234,10 @@
"edit_profile": "Edytuj swój profil i dane kontaktowe",
"manage_sessions": "Zarządzaj swoimi urządzeniami i sesjami",
"mas_admin": "Zarządzaj użytkownikami (urn:mas:admin)",
"send_messages": "Wysyłaj nowe wiadomości w Twoim imieniu",
"send_messages": "Wysyłanie nowych wiadomości w Twoim imieniu",
"synapse_admin": "Administrowanie serwerem (urn:synapse:admin:*)",
"view_messages": "Przegląd istniejących wiadomości i danych",
"view_profile": "Przegląd informacji o profilu i danych kontaktowych"
"view_messages": "Przeglądanie istniejących wiadomości i danych",
"view_profile": "Przeglądanie informacji profilowych i danych kontaktowych"
},
"upstream_oauth2": {
"link_mismatch": {
+277
View File
@@ -0,0 +1,277 @@
{
"action": {
"back": "Geri",
"cancel": "İptal",
"continue": "Devam Et",
"create_account": "Hesap Oluştur",
"sign_in": "Giriş Yap",
"sign_out": "Çıkış Yap",
"skip": "Atla",
"start_over": "Baştan başla"
},
"app": {
"human_name": "Matrix Authentication Service",
"name": "matrix-authentication-service",
"technical_description": "OpenID Connect keşif belgesi: <a class=\"cpd-link\" data-kind=\"primary\" href=\"%(discovery_url)s\">%(discovery_url)s</a>"
},
"branding": {
"privacy_policy": {
"alt": "Hizmet gizlilik politikasına bağlantı",
"link": "Gizlilik Politikası"
},
"terms_and_conditions": {
"alt": "Hizmet şartları ve koşullarına bağlantı",
"link": "Şartlar & Koşullar"
}
},
"common": {
"email_address": "E-posta Adresi",
"loading": "Yükleniyor…",
"mxid": "Matrix Kimliği",
"password": "Şifre",
"password_confirm": "Şifreyi onayla",
"username": "Kullanıcı Adı"
},
"error": {
"unexpected": "Beklenmeyen hata"
},
"mas": {
"account": {
"deactivated": {
"description": "Bu hesap (<em>%(mxid)s</em>) silindi. Beklenmedik bir durumsa, sunucu yöneticinizle iletişime geçin.",
"heading": "Hesap silindi"
},
"locked": {
"description": "Bu hesap (<em>%(mxid)s</em>) kilitlendi. Bu beklenmedik bir durumsa, sunucu yöneticinizle iletişime geçin.",
"heading": "Hesap kilitlendi"
},
"logged_out": {
"description": "Bu oturum sonlandırılmıştır. Tekrar giriş yapabilmek için lütfen oturumu kapatın.",
"heading": "Oturum sonlandırıldı"
}
},
"back_to_homepage": "Ana sayfaya geri dön",
"captcha": {
"noscript": "Bu form bir CAPTCHA ile korunmaktadır ve gönderilebilmesi için JavaScript'in etkinleştirilmesi gerekmektedir. Lütfen tarayıcınızda JavaScript'i etkinleştirin ve bu sayfayı yeniden yükleyin."
},
"change_password": {
"change": "Parola değiştir",
"confirm": "Şifreyi onayla",
"current": "Mevcut parola",
"heading": "Parolamı değiştir",
"new": "Yeni parola"
},
"choose_display_name": {
"description": "Bu, diğer kişilerin göreceği isimdir. Bunu istediğiniz zaman değiştirebilirsiniz.",
"headline": "Görüntülenecek adınızı seçin"
},
"consent": {
"continue_to": "<span>%(client_name)s</span> devam edilsin mi?",
"scope_list_preface": "Devam ederek, <span>%(client_name)s</span>'in şunları yapmasına izin vermiş oluyorsunuz:",
"this_will_setup": "Bu işlem, %(client_name)s (<span>%(client_uri)s</span>) cihazını <span>%(server_name)s</span> hesabınızla eşleştirecektir.",
"use_another_account": "Başka bir hesap kullanın"
},
"device_card": {
"access_requested": "Erişim talebi",
"generic_device": "Cihaz",
"ip_address": "IP Adresi",
"security_code": "Güvenlik kodu"
},
"device_code_link": {
"description": "Diğer cihazınızda gösterilen güvenlik kodunu girin",
"headline": "Hesabınıza yeni bir cihaz bağlayın",
"verification_code": "Doğrulama kodu"
},
"device_consent": {
"confirm_device": "Evet, bunun benim cihazım olduğunu ve oturum açmak istediğimi onaylıyorum.",
"denied": {
"description": "%(client_name)s'e erişimi reddettiniz. Bu pencereyi kapatabilirsiniz.",
"heading": "Erişim engellendi"
},
"description": "<strong> Başka bir cihaz olan </strong>, %(client_name)s cihazını <span>, %(server_name)s, </span> hesabınızla bağlantı istiyor. Bu cihazı tanıdığınızdan emin olun.",
"grant_access": "Erişim izni ver",
"granted": {
"description": "%(client_name)s kullanıcısına erişim izni verdiniz. Bu pencereyi kapatabilirsiniz.",
"heading": "Erişim izni verildi"
},
"title": "Hesabınıza erişim izni verecek misiniz?",
"warning": {
"description": "Bu cihazın gerçekten sizin cihazınız olduğundan emin misiniz? Yöneticiler veya BT destek ekibi sizden bunu kabul etmenizi asla istemez.",
"title": "Hesabınıza uzaktan erişim sağlayan bir cihaza erişim izni vermek üzeresiniz"
}
},
"device_display_name": {
"client_on_device": "%(client_name)s, %(device_name)s üzerinde",
"name_for_platform": "%(name)s / %(platform)s",
"unknown_device": "Bilinmeyen cihaz"
},
"email_in_use": {
"description": "Hesap bilgilerinizi unuttuysanız, hesabınızı kurtarabilirsiniz. Ayrıca sıfırdan başlayıp farklı bir e-posta adresi de kullanabilirsiniz.",
"title": "<span>%(email)s</span> e-posta adresi zaten kullanımda."
},
"emails": {
"greeting": "Merhaba %(username)s,",
"recovery": {
"click_button": "Yeni bir parola oluşturmak için aşağıdaki düğmeye tıklayın:",
"copy_link": "Yeni bir parola oluşturmak için aşağıdaki bağlantıyı kopyalayıp tarayıcınıza yapıştırın:",
"create_new_password": "Yeni parola oluştur",
"fallback": "Buton sizde çalışmıyor mu?",
"headline": "%(server_name)s hesabınız için parola sıfırlama talebinde bulundunuz.",
"subject": "Hesap parolanızı sıfırlayın (%(mxid)s)",
"you_can_ignore": "Yeni bir parola talep etmediyseniz, bu e-postayı dikkate almayın. Mevcut parolanız çalışmaya devam edecektir."
},
"verify": {
"body_html": "Bu e-posta adresini doğrulamak için gereken doğrulama kodunuz: <strong>%(code)s</strong>",
"body_text": "Bu e-posta adresini doğrulamak için gereken doğrulama kodunuz: %(code)s",
"subject": "E-posta doğrulama kodunuz: %(code)s"
}
},
"errors": {
"captcha": "CAPTCHA doğrulaması başarısız oldu, lütfen tekrar deneyin",
"denied_policy": "Politika gereği reddedildi: %(policy)s",
"email_banned": "Sunucu politikası gereği e-posta kullanımı yasaktır.",
"email_domain_banned": "E-posta etki alanı, sunucu politikası tarafından yasaklandı",
"email_domain_not_allowed": "E-posta alan adı sunucu politikası tarafından izin verilmiyor",
"email_not_allowed": "Sunucu politikası gereği e-posta gönderimine izin verilmiyor",
"field_required": "Bu alan zorunludur",
"invalid_credentials": "Geçersiz kimlik bilgileri",
"password_mismatch": "Parola alanları birbiriyle uyuşmuyor",
"rate_limit_exceeded": "Kısa süre içinde çok fazla istekte bulundunuz. Lütfen birkaç dakika bekleyin ve tekrar deneyin.",
"username_all_numeric": "Kullanıcı adı yalnızca rakamlardan oluşamaz",
"username_banned": "Kullanıcı adı sunucu politikası gereği yasaklanmıştır",
"username_invalid_chars": "Kullanıcı adı geçersiz karakterler içeriyor. Yalnızca küçük harfler, rakamlar, tire ve alt çizgi kullanın.",
"username_not_allowed": "Kullanıcı adı sunucu politikası gereği izin verilmiyor",
"username_taken": "Bu kullanıcı adı zaten alınmış",
"username_too_long": "Kullanıcı adı çok uzun",
"username_too_short": "Kullanıcı adı çok kısa"
},
"legacy_consent": {
"this_will_setup": "Bu işlem, <span>%(client_name)s</span> cihazını <span>%(server_name)s</span> hesabınızla eşleştirecektir."
},
"login": {
"call_to_register": "Henüz hesabınız yok mu?",
"continue_with_provider": "%(provider)s ile devam edin",
"description": "Devam etmek için lütfen giriş yapın:",
"forgot_password": "Parolanızı mı unuttunuz?",
"headline": "Giriş Yap",
"link": {
"description": "<span class=\"break-keep text-links\">%(provider)s</span> hesabınızı bağlama",
"headline": "Bağlantıya erişmek için giriş yapın"
},
"no_login_methods": "Kullanılabilir giriş yöntemi yok.",
"username_or_email": "Kullanıcı adı veya E-posta"
},
"navbar": {
"my_account": "Hesabım",
"register": "Hesap oluştur",
"signed_in_as": "<span class=\"font-semibold\">%(username)s</span> olarak giriş yapıldı."
},
"not_found": {
"description": "Aradığınız sayfa mevcut değil veya taşınmış",
"heading": "Sayfa bulunamadı"
},
"not_you": "%(username)s değil mi?",
"policy_violation": {
"description": "Bu durum, isteği oluşturan istemci, şu anda oturum açmış olan kullanıcı veya isteğin kendisinden kaynaklanıyor olabilir.",
"heading": "Yetkilendirme isteği, bu hizmet tarafından uygulanan politika nedeniyle reddedildi",
"logged_as": "<span class=\"font-semibold\">%(username)s</span> olarak kaydedildi.",
"too_many_sessions": {
"description": "Hesabınız maksimum sayıda cihazda oturum açmış durumda. Devam etmek için, <span class=\"font-semibold\"> mevcut cihazlarınızdan %(num_devices_to_remove)s kaldırın </span> ve tekrar oturum açın.",
"heading": "Cihaz limitine ulaşıldı",
"manage_devices": "Cihazları yönetin"
}
},
"recovery": {
"consumed": {
"description": "Yeni bir parola oluşturmak için baştan başlayın ve \"Parolamı unuttum\" seçeneğini seçin.",
"heading": "Parolanızı sıfırlamak için kullanılan bağlantı daha önce kullanıldı"
},
"disabled": {
"description": "Giriş bilgilerinizi kaybettiyseniz, hesabınızı kurtarmak için lütfen yöneticiyle iletişime geçin.",
"heading": "Hesap kurtarma devre dışı bırakıldı."
},
"expired": {
"description": "Aşağıdaki adreslere gönderilecek yeni bir e-posta isteği gönderin: <span>%(email)s</span>.",
"heading": "Parolanızı sıfırlama bağlantısının süresi doldu"
},
"finish": {
"confirm": "Yeni parolayı tekrar girin.",
"description": "Hesabınız için yeni bir parola belirleyin.",
"heading": "Parolanızı sıfırlayın",
"new": "Yeni parola",
"save_and_continue": "Kaydet ve devam et"
},
"progress": {
"change_email": "Farklı bir e-posta adresi deneyin",
"description": "<span>%(email)s</span> kullanan bir hesabınız varsa, parolanızı sıfırlamak için bağlantı içeren bir e-posta gönderdik.",
"heading": "E-postalarınızı kontrol edin"
},
"start": {
"description": "Parolanızı sıfırlamak için bağlantı içeren bir e-posta gönderilecektir.",
"heading": "Devam etmek için e-postanızı girin."
}
},
"register": {
"call_to_login": "Zaten hesabınız var mı?",
"continue_with_email": "E-posta adresiyle devam edin",
"continue_with_password": "Parolayla devam et",
"create_account": {
"description": "Devam etmek için bir kullanıcı adı seçin.",
"heading": "Hesap oluştur"
},
"terms_of_service": "<a href=\"%s\" data-kind=\"primary\" class=\"cpd-link\"> Şartları ve Koşulları </a> kabul ediyorum"
},
"registration_token": {
"description": "Ana sunucu yöneticisi tarafından sağlanan bir kayıt belirteci girin.",
"field": "Kayıt anahtarı",
"headline": "Kayıt anahtarı"
},
"scope": {
"edit_profile": "Profilinizi ve iletişim bilgilerinizi düzenleyin",
"manage_sessions": "Cihazlarınızı ve oturumlarınızı yönetin",
"mas_admin": "Kullanıcıları yönet (urn:mas:admin)",
"send_messages": "Sizin adınıza mesaj gönderin",
"synapse_admin": "Sunucuyu yönetin (urn:synapse:admin:*)",
"view_messages": "Mevcut mesajları ve verilerinizi görüntüleyinmessages",
"view_profile": "Profil bilgilerinizi ve iletişim bilgilerinizi görüntüleyin"
},
"upstream_oauth2": {
"link_mismatch": {
"heading": "Bu üst hesap zaten başka bir hesaba bağlı."
},
"register": {
"choose_username": {
"description": "Bu daha sonra değiştirilemez."
},
"create_account": "Yeni hesap oluşturun",
"enforced_by_policy": "Sunucu politikası tarafından uygulanır",
"forced_display_name": "Aşağıdaki görünen adı kullanacağız",
"forced_email": "Aşağıdaki e-posta adresini kullanacağım",
"forced_localpart": "Aşağıdaki kullanıcı adını kullanacağım",
"import_data": {
"description": "Yeni %(server_name)s hesabınızla ilişkilendirilecek bilgileri onaylayın.",
"heading": "Verilerinizi içe aktarın"
},
"imported_from_upstream": "Ana hesabınızdan içe aktarıldı",
"imported_from_upstream_with_name": "%(human_name)s hesabınızdan içe aktarıldı",
"link_existing": "Mevcut bir hesaba bağlantı",
"provider_name": "%(human_name)s hesabı",
"signup_with_upstream": {
"heading": "%(human_name)s hesabınızla kaydolmaya devam edin"
},
"suggested_display_name": "İçe aktarılan görünen ad",
"suggested_email": "E-posta adresini içe aktar",
"use": "Kullan"
},
"suggest_link": {
"action": "Bağlantı",
"heading": "Mevcut hesabınıza bağlanın"
}
},
"verify_email": {
"6_digit_code": "6 haneli kod",
"description": "Gönderilen 6 haneli kodu girin: <em>%(email)s</em>",
"headline": "E-postanızı doğrulayın"
}
}
}
+3 -3
View File
@@ -39,11 +39,11 @@
"mas": {
"account": {
"deactivated": {
"description": "Цей обліковий запис (<em>%(mxid)s</em>) видалено. Якщо цього не передбачалося, зверніться до адміністратора сервера.",
"description": "Цей обліковий запис (<em>%(mxid)s</em>) видалено. Якщо цього не передбачалося, зверніться до постачальника вашого облікового запису.",
"heading": "Обліковий запис видалено"
},
"locked": {
"description": "Цей обліковий запис (<em>%(mxid)s</em>) заблоковано. Якщо цього не передбачалося, зверніться до адміністратора сервера.",
"description": "Цей обліковий запис (<em>%(mxid)s</em>) заблоковано. Якщо цього не передбачалося, зверніться до постачальника вашого облікового запису.",
"heading": "Обліковий запис заблоковано"
},
"logged_out": {
@@ -226,7 +226,7 @@
"terms_of_service": "Я погоджуюся з <a href=\"%s\" data-kind=\"primary\" class=\"cpd-link\">Умовами та положеннями</a>"
},
"registration_token": {
"description": "Введіть реєстраційний токен, наданий адміністратором домашнього сервера.",
"description": "Введіть реєстраційний токен, наданий постачальником вашого облікового запису.",
"field": "Токен реєстрації",
"headline": "Токен реєстрації"
},
+112 -8
View File
@@ -5,7 +5,9 @@
"continue": "Davom etish",
"create_account": "Ro'yxatdan o'tish",
"sign_in": "Kirish",
"sign_out": "Chiqish"
"sign_out": "Chiqish",
"skip": "Oʻtkazib yuborish",
"start_over": "Qaytadan boshlang"
},
"app": {
"human_name": "Matrix Authentication Service",
@@ -35,6 +37,20 @@
"unexpected": "Kutilmagan xato"
},
"mas": {
"account": {
"deactivated": {
"description": "Ushbu hisob (<em>%(mxid)s</em>) oʻchirildi. Agar bu kutilmasa, server administratoringiz bilan bogʻlaning.",
"heading": "Hisob oʻchirildi"
},
"locked": {
"description": "Ushbu hisob (<em>%(mxid)s</em>) qulflangan. Agar bu kutilmasa, server administratoringizga murojaat qiling.",
"heading": "Hisob qulflangan"
},
"logged_out": {
"description": "Bu sessiya tugatildi. Qayta kirish uchun tizimdan chiqing",
"heading": "Sessiya tugadi"
}
},
"back_to_homepage": "Bosh sahifaga qaytish",
"captcha": {
"noscript": "Bu shakl CAPTCHA bilan himoyalangan va uni yuborish uchun JavaScript yoqilishi kerak. Brauzeringizda JavaScriptni yoqing va bu sahifani qayta yuklang."
@@ -46,30 +62,65 @@
"heading": "Parolni ozgartirish",
"new": "Yangi parol"
},
"choose_display_name": {
"description": "Bu boshqa odamlar koʻradigan nom. Buni istalgan vaqtda oʻzgartirishingiz mumkin.",
"headline": "Koʻrsatiladigan nomingizni tanlang"
},
"consent": {
"continue_to": "<span>%(client_name)s</span> ga oʻtishni xohlaysizmi?",
"scope_list_preface": "Davom etish orqali siz <span>%(client_name)s</span> ga quyidagilarga ruxsat berasiz:",
"this_will_setup": "Bu sizning <span>%(server_name)s</span> hisobingiz bilan %(client_name)s (<span>%(client_uri)s</span>) ni oʻrnatadi.",
"use_another_account": "Boshqa hisobdan foydalaning"
},
"device_card": {
"access_requested": "Ruxsat soraldi",
"generic_device": "Qurilma",
"ip_address": "IP manzili"
"ip_address": "IP manzili",
"security_code": "Xavfsizlik kodi"
},
"device_code_link": {
"description": "Qurilmani ulang",
"headline": "Qurilmangizda chiqqan kodni kiriting"
"description": "Boshqa qurilmangizda koʻrsatilgan xavfsizlik kodini kiriting",
"headline": "Qurilmangizda chiqqan kodni kiriting",
"verification_code": "Tasdiqlash kodi"
},
"device_consent": {
"confirm_device": "Ha, men bu mening qurilmam ekanligini tasdiqlayman va unga kirishni xohlayman.",
"denied": {
"description": "Siz %(client_name)s uchun ruxsatni rad etdingiz. Bu oynani yopishingiz mumkin.",
"heading": "Ruxsat berilmadi"
},
"description": "<strong>Boshqa qurilma</strong> %(client_name)s ni sizning <span>%(server_name)s</span> hisobingiz bilan bogʻlamoqchi. Ushbu qurilmani tanib olganingizga ishonch hosil qiling.",
"grant_access": "Kirishga ruxsat berish",
"granted": {
"description": "Siz %(client_name)s uchun ruxsat berdingiz. Bu oynani yopishingiz mumkin.",
"heading": "Ruxsat berildi"
},
"title": "Hisobingizga kirish huquqi berilsinmi?",
"warning": {
"description": "Bu sizning qurilmangiz ekanligiga aminmisiz? Administratorlar yoki IT qoʻllab-quvvatlash xizmati sizdan buni qabul qilishingizni hech qachon soʻramaydi.",
"title": "Siz hisobingizga masofaviy qurilmaga kirish huquqini bermoqchisiz"
}
},
"device_display_name": {
"client_on_device": "%(client_name)s ustida %(device_name)s",
"name_for_platform": "%(platform)s uchun %(name)s",
"unknown_device": "Nomalum qurilma."
},
"email_in_use": {
"description": "Agar hisob qaydnomangiz maʻlumotlarini unutgan boʻlsangiz, hisobingizni tiklashingiz mumkin. Shuningdek, qayta boshlashingiz va boshqa elektron pochta manzilidan foydalanishingiz mumkin.",
"title": "<span>%(email)s</span> elektron pochta manzili allaqachon ishlatilmoqda"
},
"emails": {
"greeting": "Salom %(username)s ,",
"recovery": {
"click_button": "Yangi parol yaratish uchun quyidagi tugmani bosing:",
"copy_link": "Yangi parol yaratish uchun quyidagi havolani nusxalang va brauzerga joylashtiring:",
"create_new_password": "Yangi parol yarating",
"fallback": "Tugma siz uchun ishlamayaptimi?",
"headline": "Siz %(server_name)s hisobingiz uchun parolni qayta tiklashni soʻradingiz.",
"subject": "Hisob parolingizni qayta oʻrnating (%(mxid)s)",
"you_can_ignore": "Agar siz yangi parol soʻramagan boʻlsangiz, ushbu elektron pochta xabarini eʻtiborsiz qoldirishingiz mumkin. Joriy parolingiz ishlashda davom etadi."
},
"verify": {
"body_html": "Ushbu elektron pochta manzilini tasdiqlash uchun tasdiqlash kodingiz: <strong>%(code)s</strong>",
"body_text": "Ushbu elektron pochta manzilini tasdiqlash uchun tasdiqlash kodingiz: %(code)s",
@@ -79,21 +130,37 @@
"errors": {
"captcha": "CAPTCHA tekshiruvi amalga oshmadi, qayta urining",
"denied_policy": "Siyosat tomonidan rad etilgan: %(policy)s",
"email_banned": "Elektron pochta server siyosati tomonidan taqiqlangan",
"email_domain_banned": "Elektron pochta domeni server siyosati tomonidan taqiqlangan",
"email_domain_not_allowed": "Elektron pochta domeni server siyosati tomonidan ruxsat etilmagan",
"email_not_allowed": "Server siyosati elektron pochtaga ruxsat bermagan",
"field_required": "Ushbu qator toʻldirilishi shart",
"invalid_credentials": "Hisob malumotlari yaroqsiz",
"password_mismatch": "Parol maydonlari mos kelmayapti",
"username_taken": "Bu foydalanuvchi nomi allaqachon band"
"rate_limit_exceeded": "Qisqa vaqt ichida juda koʻp soʻrov yubordingiz. Iltimos, bir necha daqiqa kuting va qayta urinib koʻring.",
"username_all_numeric": "Foydalanuvchi nomi faqat raqamlardan iborat boʻlmasligi kerak",
"username_banned": "Foydalanuvchi nomi server siyosati tomonidan taqiqlangan",
"username_invalid_chars": "Foydalanuvchi nomida yaroqsiz belgilar mavjud. Faqat kichik harflar, raqamlar, tire va pastki chiziqlardan foydalaning.",
"username_not_allowed": "Foydalanuvchi nomi server siyosati tomonidan ruxsat etilmagan",
"username_taken": "Bu foydalanuvchi nomi allaqachon band",
"username_too_long": "Foydalanuvchi nomi juda uzun",
"username_too_short": "Foydalanuvchi nomi juda qisqa"
},
"legacy_consent": {
"this_will_setup": "Bu sizning <span>%(server_name)s</span> hisobingiz bilan <span>%(client_name)s</span> ni oʻrnatadi."
},
"login": {
"call_to_register": "Hali hisobingiz yoqmi?",
"continue_with_provider": "%(provider)s bilan davom etish",
"description": "Davom etish uchun tizimga kiring:",
"forgot_password": "Parolni unutdingizmi?",
"headline": "Kirish",
"link": {
"description": "<span class=\"break-keep text-links\">%(provider)s</span> hisobingiz ulanmoqda",
"headline": "Havola uchun tizimga kiring"
},
"no_login_methods": "Kirish usullari mavjud emas."
"no_login_methods": "Kirish usullari mavjud emas.",
"username_or_email": "Foydalanuvchi nomi yoki elektron pochta manzili"
},
"navbar": {
"my_account": "Mening hisobim",
@@ -109,28 +176,60 @@
"policy_violation": {
"description": "Bu sorovni yaratgan mijoz, hozirda tizimga kirgan foydalanuvchi yoki sorovning ozi bilan bogliq bolishi mumkin.",
"heading": "Avtorizatsiya sorovi ushbu xizmatda amalda bolgan siyosat tufayli rad etildi.",
"logged_as": "<span class=\"font-semibold\">%(username)s</span> sifatida kirildi"
"logged_as": "<span class=\"font-semibold\">%(username)s</span> sifatida kirildi",
"too_many_sessions": {
"description": "Hisobingiz allaqachon maksimal miqdordagi qurilmalarda tizimga kirgan. Davom etish uchun mavjud qurilmalaringizdan <span class=\"font-semibold\"> </span> %(num_devices_to_remove)s ni olib tashlang va qaytadan kiring.",
"heading": "Qurilma limitiga yetdi",
"manage_devices": "Qurilmalarni boshqarish"
}
},
"recovery": {
"consumed": {
"description": "Yangi parol yaratish uchun boshidan boshlang va ʼʼParolni unutdingizmi“ ni tanlang.",
"heading": "Parolingizni tiklash havolasi allaqachon ishlatilgan"
},
"disabled": {
"description": "Agar hisob maʻlumotlaringizni yoʻqotib qoʻysangiz, hisobingizni tiklash uchun administrator bilan bogʻlaning.",
"heading": "Hisobni tiklash oʻchirib qoʻyilgan"
},
"expired": {
"description": "Quyidagi manzilga yuboriladigan yangi elektron pochta xabarini soʻrang: <span>%(email)s</span>.",
"heading": "Parolingizni tiklash havolasi muddati tugagan",
"resend_email": "Elektron pochtani qayta yuborish"
},
"finish": {
"confirm": "Yangi parolni qayta kiriting",
"description": "Hisobingiz uchun yangi parol tanlang.",
"new": "Yangi parol"
"heading": "Parolingizni qayta tiklash",
"new": "Yangi parol",
"save_and_continue": "Saqlash va davom ettirish"
},
"progress": {
"change_email": "Boshqa elektron pochta manzilini sinab koʻring",
"description": "Agar <span>%(email)s</span> dan foydalanadigan hisob mavjud boʻlsa, parolingizni tiklash uchun havola bilan elektron pochta xabarini yubordik.",
"heading": "Elektron pochtangizni tekshiring",
"resend_email": "Elektron pochtani qayta yuborish"
},
"start": {
"description": "Parolingizni tiklash uchun havola bilan elektron pochta xabari yuboriladi.",
"heading": "Davom etish uchun elektron pochta manzilingizni kiriting"
}
},
"register": {
"call_to_login": "Hisobingiz allaqachon bormi?",
"continue_with_email": "Elektron pochta manzili bilan davom eting",
"continue_with_password": "Parol bilan davom eting",
"create_account": {
"description": "Davom etish uchun foydalanuvchi nomini tanlang.",
"heading": "Hisob yaratish"
},
"terms_of_service": "Men roziman <a href=\"%s\" data-kind=\"primary\" class=\"cpd-link\">Foydalanish shartlari</a>"
},
"registration_token": {
"description": "Homeserver administratori tomonidan taqdim etilgan roʻyxatdan oʻtish tokenini kiriting.",
"field": "Roʻyxatdan oʻtish tokeni",
"headline": "Roʻyxatdan oʻtish tokeni"
},
"scope": {
"edit_profile": "Profilingiz va aloqa maʼlumotlaringizni tahrirlang",
"manage_sessions": "Qurilmalaringiz va sessiyalaringizni boshqaring",
@@ -159,7 +258,12 @@
"heading": "Malumotlaringizni import qiling"
},
"imported_from_upstream": "Yuqori darajadagi hisobingizdan import qilindi",
"imported_from_upstream_with_name": "%(human_name)s hisobingizdan import qilindi",
"link_existing": "Mavjud hisobga havola",
"provider_name": "%(human_name)s hisobi",
"signup_with_upstream": {
"heading": "%(human_name)s hisobingiz bilan roʻyxatdan oʻtishda davom eting"
},
"suggested_display_name": "Korsatish nomini import qilish",
"suggested_email": "Elektron pochta manzilini import qilish",
"use": "Foydalanish"
+1 -1
View File
@@ -79,7 +79,7 @@
"security_code": "安全代码"
},
"device_code_link": {
"description": "关联设备",
"description": "输入你另一设备上显示的安全代码",
"headline": "关联新设备到账户",
"verification_code": "验证码"
},