diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index a54f89c2c..9726f6b5b 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -10,7 +10,9 @@ on:
# Only run for pull requests if relevant files were changed
pull_request:
- branches: [main]
+ branches:
+ - main
+ - 'release/**'
paths:
- Dockerfile
- docker-bake.hcl
@@ -31,10 +33,37 @@ env:
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index
jobs:
+ compute-version:
+ name: Compute version using git describe
+ runs-on: ubuntu-24.04
+ outputs:
+ describe: ${{ steps.git.outputs.describe }}
+ timestamp: ${{ steps.git.outputs.timestamp }}
+ steps:
+ - name: Checkout the code
+ uses: actions/checkout@v4.2.2
+ with:
+ # Need a full clone so that `git describe` reports the right version
+ fetch-depth: 0
+
+ - name: Compute version and timestamp out of git history
+ id: git
+ run: |
+ echo "describe=$(git describe --tags --match 'v*.*.*' --always)" >> $GITHUB_OUTPUT
+ echo "timestamp=$(git log -1 --format=%ct)" >> $GITHUB_OUTPUT
+
+
build-binaries:
name: Build binaries
runs-on: ubuntu-22.04
+ needs:
+ - compute-version
+
+ env:
+ VERGEN_GIT_DESCRIBE: ${{ needs.compute-version.outputs.describe }}
+ SOURCE_DATE_EPOCH: ${{ needs.compute-version.outputs.timestamp }}
+
permissions:
contents: read
@@ -136,6 +165,13 @@ jobs:
packages: write
id-token: write
+ needs:
+ - compute-version
+
+ env:
+ VERGEN_GIT_DESCRIBE: ${{ needs.compute-version.outputs.describe }}
+ SOURCE_DATE_EPOCH: ${{ needs.compute-version.outputs.timestamp }}
+
steps:
- name: Docker meta
id: meta
diff --git a/.github/workflows/merge-back.yaml b/.github/workflows/merge-back.yaml
new file mode 100644
index 000000000..68cca7236
--- /dev/null
+++ b/.github/workflows/merge-back.yaml
@@ -0,0 +1,72 @@
+name: Merge back a reference to main
+on:
+ workflow_call:
+ inputs:
+ sha:
+ required: true
+ type: string
+ secrets:
+ BOT_GITHUB_TOKEN:
+ required: true
+
+jobs:
+ merge-back:
+ name: Merge back the reference to main
+ runs-on: ubuntu-22.04
+
+ steps:
+ - name: Push branch and open a PR
+ uses: actions/github-script@v7.0.1
+ env:
+ SHA: ${{ inputs.sha }}
+ with:
+ github-token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ script: |
+ const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');
+ const sha = process.env.SHA;
+ const branch = `ref-merge/${sha}`;
+ const ref = `heads/${branch}`;
+
+ await github.rest.git.createRef({
+ owner,
+ repo,
+ ref,
+ sha,
+ });
+ console.log(`Created branch ${branch} to ${sha}`);
+
+ // Create a PR to merge the branch back to main
+ const pr = await github.rest.pulls.create({
+ owner,
+ repo,
+ head: branch,
+ base: 'main',
+ title: `Automatic merge back to main`,
+ body: `This pull request was automatically created by the release workflow. It merges the release branch back to main.`,
+ maintainer_can_modify: true,
+ });
+ console.log(`Created pull request #${pr.data.number} to merge the release branch back to main`);
+ console.log(`PR URL: ${pr.data.html_url}`);
+
+ // Add the `T-Task` label to the PR
+ await github.rest.issues.addLabels({
+ owner,
+ repo,
+ issue_number: pr.data.number,
+ labels: ['T-Task'],
+ });
+
+ // Enable auto-merge on the PR
+ await github.graphql(
+ `
+ mutation AutoMerge($id: ID!) {
+ enablePullRequestAutoMerge(input: {
+ pullRequestId: $id,
+ mergeMethod: MERGE,
+ }) {
+ clientMutationId
+ }
+ }
+ `,
+ { id: pr.data.node_id },
+ );
diff --git a/.github/workflows/release-branch.yaml b/.github/workflows/release-branch.yaml
index 340b4e747..6c83b928d 100644
--- a/.github/workflows/release-branch.yaml
+++ b/.github/workflows/release-branch.yaml
@@ -73,6 +73,14 @@ jobs:
secrets:
BOT_GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+ merge-back:
+ uses: ./.github/workflows/merge-back.yaml
+ needs: [tag]
+ with:
+ sha: ${{ needs.tag.outputs.sha }}
+ secrets:
+ BOT_GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+
branch:
name: Create a new release branch
runs-on: ubuntu-22.04
@@ -103,20 +111,3 @@ jobs:
sha,
});
console.log(`Created branch ${branch} from ${sha}`);
-
- - name: Checkout the code
- uses: actions/checkout@v4.2.2
- with:
- ref: "release/v${{ needs.compute-version.outputs.short }}"
-
- - name: Open a pull request to merge the branch into main
- env:
- VERSION: ${{ needs.compute-version.outputs.short }}
- GH_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
- run: |
- gh pr create \
- --title "Release branch $VERSION" \
- --body "This pull request was automatically created by the release workflow. It merges the release branch back to main." \
- --base main \
- --head "release/v$VERSION" \
- --label "T-Task"
diff --git a/.github/workflows/release-bump.yaml b/.github/workflows/release-bump.yaml
index 508b262c8..fb6da0a39 100644
--- a/.github/workflows/release-bump.yaml
+++ b/.github/workflows/release-bump.yaml
@@ -42,7 +42,7 @@ jobs:
- name: Compute the new minor RC
id: next
env:
- BUMP: ${{ github.event.inputs.rc && 'prerelease' || 'patch' }}
+ BUMP: ${{ inputs.rc && 'prerelease' || 'patch' }}
VERSION: ${{ steps.current.outputs.version }}
run: echo "version=$(npx --yes semver@7.5.4 -i "$BUMP" --preid rc "$VERSION")" >> "$GITHUB_OUTPUT"
@@ -54,6 +54,15 @@ jobs:
secrets:
BOT_GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+ merge-back:
+ uses: ./.github/workflows/merge-back.yaml
+ needs: [tag]
+ if: inputs.merge-back
+ with:
+ sha: ${{ needs.tag.outputs.sha }}
+ secrets:
+ BOT_GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+
update-branch:
name: Update the release branch
runs-on: ubuntu-22.04
@@ -83,21 +92,3 @@ jobs:
sha,
});
console.log(`Updated branch ${branch} to ${sha}`);
-
- - name: Checkout the code
- uses: actions/checkout@v4.2.2
- with:
- ref: "${{ github.ref_name }}"
-
- - name: Open a pull request to merge the release branch back to main
- if: github.event.inputs.merge-back
- env:
- VERSION: ${{ needs.compute-version.outputs.version }}
- GH_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
- run: |
- gh pr create \
- --title "Release branch $VERSION" \
- --body "This pull request was automatically created by the release workflow. It merges the release branch back to main." \
- --base main \
- --head "$GITHUB_REF_NAME" \
- --label "T-Task"
diff --git a/Cargo.lock b/Cargo.lock
index 83d18c232..38b48f285 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3117,7 +3117,7 @@ dependencies = [
[[package]]
name = "mas-axum-utils"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"async-trait",
"axum",
@@ -3151,7 +3151,7 @@ dependencies = [
[[package]]
name = "mas-cli"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"anyhow",
"axum",
@@ -3224,7 +3224,7 @@ dependencies = [
[[package]]
name = "mas-config"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"anyhow",
"camino",
@@ -3254,7 +3254,7 @@ dependencies = [
[[package]]
name = "mas-data-model"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"base64ct",
"chrono",
@@ -3276,7 +3276,7 @@ dependencies = [
[[package]]
name = "mas-email"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"async-trait",
"lettre",
@@ -3287,7 +3287,7 @@ dependencies = [
[[package]]
name = "mas-handlers"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"aide",
"anyhow",
@@ -3362,7 +3362,7 @@ dependencies = [
[[package]]
name = "mas-http"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"futures-util",
"headers",
@@ -3382,7 +3382,7 @@ dependencies = [
[[package]]
name = "mas-i18n"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"camino",
"icu_calendar",
@@ -3405,7 +3405,7 @@ dependencies = [
[[package]]
name = "mas-i18n-scan"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"camino",
"clap",
@@ -3419,7 +3419,7 @@ dependencies = [
[[package]]
name = "mas-iana"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"schemars",
"serde",
@@ -3427,7 +3427,7 @@ dependencies = [
[[package]]
name = "mas-iana-codegen"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3443,7 +3443,7 @@ dependencies = [
[[package]]
name = "mas-jose"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"base64ct",
"chrono",
@@ -3473,7 +3473,7 @@ dependencies = [
[[package]]
name = "mas-keystore"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"aead",
"base64ct",
@@ -3501,7 +3501,7 @@ dependencies = [
[[package]]
name = "mas-listener"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"anyhow",
"bytes",
@@ -3525,7 +3525,7 @@ dependencies = [
[[package]]
name = "mas-matrix"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3535,7 +3535,7 @@ dependencies = [
[[package]]
name = "mas-matrix-synapse"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3552,7 +3552,7 @@ dependencies = [
[[package]]
name = "mas-oidc-client"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"assert_matches",
"async-trait",
@@ -3588,7 +3588,7 @@ dependencies = [
[[package]]
name = "mas-policy"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"anyhow",
"mas-data-model",
@@ -3604,7 +3604,7 @@ dependencies = [
[[package]]
name = "mas-router"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"axum",
"serde",
@@ -3615,7 +3615,7 @@ dependencies = [
[[package]]
name = "mas-spa"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"camino",
"serde",
@@ -3624,7 +3624,7 @@ dependencies = [
[[package]]
name = "mas-storage"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"async-trait",
"chrono",
@@ -3646,7 +3646,7 @@ dependencies = [
[[package]]
name = "mas-storage-pg"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"async-trait",
"chrono",
@@ -3672,7 +3672,7 @@ dependencies = [
[[package]]
name = "mas-tasks"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"anyhow",
"async-trait",
@@ -3703,7 +3703,7 @@ dependencies = [
[[package]]
name = "mas-templates"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"anyhow",
"arc-swap",
@@ -3733,7 +3733,7 @@ dependencies = [
[[package]]
name = "mas-tower"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"http",
"opentelemetry",
@@ -3990,7 +3990,7 @@ dependencies = [
[[package]]
name = "oauth2-types"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"assert_matches",
"chrono",
@@ -6103,7 +6103,7 @@ dependencies = [
[[package]]
name = "syn2mas"
-version = "0.13.0-rc.1"
+version = "0.13.0"
dependencies = [
"anyhow",
"camino",
diff --git a/Cargo.toml b/Cargo.toml
index f950c56a3..26e65aaa5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,7 +4,7 @@ members = ["crates/*"]
resolver = "2"
# Updated in the CI with a `sed` command
-package.version = "0.13.0-rc.1"
+package.version = "0.13.0"
package.license = "AGPL-3.0-only"
package.authors = ["Element Backend Team"]
package.edition = "2021"
@@ -27,34 +27,34 @@ broken_intra_doc_links = "deny"
[workspace.dependencies]
# Workspace crates
-mas-axum-utils = { path = "./crates/axum-utils/", version = "=0.13.0-rc.1" }
-mas-cli = { path = "./crates/cli/", version = "=0.13.0-rc.1" }
-mas-config = { path = "./crates/config/", version = "=0.13.0-rc.1" }
-mas-data-model = { path = "./crates/data-model/", version = "=0.13.0-rc.1" }
-mas-email = { path = "./crates/email/", version = "=0.13.0-rc.1" }
-mas-graphql = { path = "./crates/graphql/", version = "=0.13.0-rc.1" }
-mas-handlers = { path = "./crates/handlers/", version = "=0.13.0-rc.1" }
-mas-http = { path = "./crates/http/", version = "=0.13.0-rc.1" }
-mas-i18n = { path = "./crates/i18n/", version = "=0.13.0-rc.1" }
-mas-i18n-scan = { path = "./crates/i18n-scan/", version = "=0.13.0-rc.1" }
-mas-iana = { path = "./crates/iana/", version = "=0.13.0-rc.1" }
-mas-iana-codegen = { path = "./crates/iana-codegen/", version = "=0.13.0-rc.1" }
-mas-jose = { path = "./crates/jose/", version = "=0.13.0-rc.1" }
-mas-keystore = { path = "./crates/keystore/", version = "=0.13.0-rc.1" }
-mas-listener = { path = "./crates/listener/", version = "=0.13.0-rc.1" }
-mas-matrix = { path = "./crates/matrix/", version = "=0.13.0-rc.1" }
-mas-matrix-synapse = { path = "./crates/matrix-synapse/", version = "=0.13.0-rc.1" }
-mas-oidc-client = { path = "./crates/oidc-client/", version = "=0.13.0-rc.1" }
-mas-policy = { path = "./crates/policy/", version = "=0.13.0-rc.1" }
-mas-router = { path = "./crates/router/", version = "=0.13.0-rc.1" }
-mas-spa = { path = "./crates/spa/", version = "=0.13.0-rc.1" }
-mas-storage = { path = "./crates/storage/", version = "=0.13.0-rc.1" }
-mas-storage-pg = { path = "./crates/storage-pg/", version = "=0.13.0-rc.1" }
-mas-tasks = { path = "./crates/tasks/", version = "=0.13.0-rc.1" }
-mas-templates = { path = "./crates/templates/", version = "=0.13.0-rc.1" }
-mas-tower = { path = "./crates/tower/", version = "=0.13.0-rc.1" }
-oauth2-types = { path = "./crates/oauth2-types/", version = "=0.13.0-rc.1" }
-syn2mas = { path = "./crates/syn2mas", version = "=0.13.0-rc.1" }
+mas-axum-utils = { path = "./crates/axum-utils/", version = "=0.13.0" }
+mas-cli = { path = "./crates/cli/", version = "=0.13.0" }
+mas-config = { path = "./crates/config/", version = "=0.13.0" }
+mas-data-model = { path = "./crates/data-model/", version = "=0.13.0" }
+mas-email = { path = "./crates/email/", version = "=0.13.0" }
+mas-graphql = { path = "./crates/graphql/", version = "=0.13.0" }
+mas-handlers = { path = "./crates/handlers/", version = "=0.13.0" }
+mas-http = { path = "./crates/http/", version = "=0.13.0" }
+mas-i18n = { path = "./crates/i18n/", version = "=0.13.0" }
+mas-i18n-scan = { path = "./crates/i18n-scan/", version = "=0.13.0" }
+mas-iana = { path = "./crates/iana/", version = "=0.13.0" }
+mas-iana-codegen = { path = "./crates/iana-codegen/", version = "=0.13.0" }
+mas-jose = { path = "./crates/jose/", version = "=0.13.0" }
+mas-keystore = { path = "./crates/keystore/", version = "=0.13.0" }
+mas-listener = { path = "./crates/listener/", version = "=0.13.0" }
+mas-matrix = { path = "./crates/matrix/", version = "=0.13.0" }
+mas-matrix-synapse = { path = "./crates/matrix-synapse/", version = "=0.13.0" }
+mas-oidc-client = { path = "./crates/oidc-client/", version = "=0.13.0" }
+mas-policy = { path = "./crates/policy/", version = "=0.13.0" }
+mas-router = { path = "./crates/router/", version = "=0.13.0" }
+mas-spa = { path = "./crates/spa/", version = "=0.13.0" }
+mas-storage = { path = "./crates/storage/", version = "=0.13.0" }
+mas-storage-pg = { path = "./crates/storage-pg/", version = "=0.13.0" }
+mas-tasks = { path = "./crates/tasks/", version = "=0.13.0" }
+mas-templates = { path = "./crates/templates/", version = "=0.13.0" }
+mas-tower = { path = "./crates/tower/", version = "=0.13.0" }
+oauth2-types = { path = "./crates/oauth2-types/", version = "=0.13.0" }
+syn2mas = { path = "./crates/syn2mas", version = "=0.13.0" }
# OpenAPI schema generation and validation
[workspace.dependencies.aide]
diff --git a/Dockerfile b/Dockerfile
index b7d5fc0a8..269e7946a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -142,6 +142,10 @@ RUN --network=default \
# Build the rest
COPY ./ /app
ENV SQLX_OFFLINE=true
+
+ARG VERGEN_GIT_DESCRIBE
+ENV VERGEN_GIT_DESCRIBE=${VERGEN_GIT_DESCRIBE}
+
# Network access: cargo auditable needs it
RUN --network=default \
cargo auditable build \
diff --git a/crates/cli/build.rs b/crates/cli/build.rs
index 9ae5f0674..18e64cc21 100644
--- a/crates/cli/build.rs
+++ b/crates/cli/build.rs
@@ -1,4 +1,4 @@
-// Copyright 2024 New Vector Ltd.
+// Copyright 2024, 2025 New Vector Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only
// Please see LICENSE in the repository root for full details.
@@ -6,7 +6,18 @@
use vergen_gitcl::{Emitter, GitclBuilder, RustcBuilder};
fn main() -> anyhow::Result<()> {
- let gitcl = GitclBuilder::default().describe(true, true, None).build()?;
+ // At build time, we override the version through the environment variable
+ // VERGEN_GIT_DESCRIBE. In some contexts, it means this variable is set but
+ // empty, so we unset it here.
+ if let Ok(ver) = std::env::var("VERGEN_GIT_DESCRIBE") {
+ if ver.is_empty() {
+ std::env::remove_var("VERGEN_GIT_DESCRIBE");
+ }
+ }
+
+ let gitcl = GitclBuilder::default()
+ .describe(true, false, Some("v*.*.*"))
+ .build()?;
let rustc = RustcBuilder::default().semver(true).build()?;
Emitter::default()
diff --git a/docker-bake.hcl b/docker-bake.hcl
index 1c3e94d9c..0df1c848f 100644
--- a/docker-bake.hcl
+++ b/docker-bake.hcl
@@ -1,3 +1,8 @@
+// This is used to set the version reported by the binary through an environment
+// variable. This is mainly useful when building out of a git context, like in
+// CI, where we don't have the full commit history available
+variable "VERGEN_GIT_DESCRIBE" {}
+
// This is what is baked by GitHub Actions
group "default" { targets = ["regular", "debug", "syn2mas"] }
@@ -11,8 +16,11 @@ target "docker-metadata-action-syn2mas" {}
target "base" {
args = {
// This is set so that when we use a git context, the .git directory is
- // present, as we infer the version at build time out of it
+ // present, as we may be infering the version at build time out of it
BUILDKIT_CONTEXT_KEEP_GIT_DIR = 1
+
+ // Pass down the version from an external git describe source
+ VERGEN_GIT_DESCRIBE = "${VERGEN_GIT_DESCRIBE}"
}
platforms = [
diff --git a/frontend/.storybook/locales.ts b/frontend/.storybook/locales.ts
index cc6b32722..fd23f68ad 100644
--- a/frontend/.storybook/locales.ts
+++ b/frontend/.storybook/locales.ts
@@ -66,6 +66,15 @@ const localazyMetadata: LocalazyMetadata = {
localizedName: "Eesti",
pluralType: (n) => { return (n===1) ? "one" : "other"; }
},
+ {
+ language: "fi",
+ region: "",
+ script: "",
+ isRtl: false,
+ name: "Finnish",
+ localizedName: "Suomi",
+ pluralType: (n) => { return (n===1) ? "one" : "other"; }
+ },
{
language: "fr",
region: "",
@@ -131,6 +140,7 @@ const localazyMetadata: LocalazyMetadata = {
"de": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/de/frontend.json",
"en": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/en/frontend.json",
"et": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/et/frontend.json",
+ "fi": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/fi/frontend.json",
"fr": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/fr/frontend.json",
"nl": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/nl/frontend.json",
"pt": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/7c203a8ac8bd48c3c4609a8effcd0fbac430f9b2/pt/frontend.json",
@@ -148,6 +158,7 @@ const localazyMetadata: LocalazyMetadata = {
"de": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/de/file.json",
"en": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/en/file.json",
"et": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/et/file.json",
+ "fi": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/fi/file.json",
"fr": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/fr/file.json",
"nl": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/nl/file.json",
"pt": "https://delivery.localazy.com/_a7077282040550503700322ddb6e/_e0/5b69b0350dccfd47c245a5d41c1b9fdf6912cc6e/pt/file.json",
diff --git a/frontend/locales/cs.json b/frontend/locales/cs.json
index 67ca92c97..b21e49621 100644
--- a/frontend/locales/cs.json
+++ b/frontend/locales/cs.json
@@ -62,7 +62,7 @@
"email_exists_error": "Zadaný e-mail je již přidán k tomuto účtu",
"email_field_help": "Přidejte alternativní e-mail, který můžete použít pro přístup k tomuto účtu.",
"email_field_label": "Přidat e-mail",
- "email_in_use_error": "The entered email is already in use",
+ "email_in_use_error": "Zadaný e-mail se již používá",
"email_invalid_alert": {
"text": "Zadaný email je neplatný",
"title": "Neplatný e-mail"
@@ -102,7 +102,7 @@
"web": "Web"
},
"email_in_use": {
- "heading": "The email address {{email}} is already in use."
+ "heading": "E-mailová adresa {{email}} se již používá."
},
"end_session_button": {
"confirmation_modal_title": "Opravdu chcete ukončit tuto relaci?",
@@ -338,8 +338,8 @@
},
"verify_email": {
"code_expired_alert": {
- "description": "The code has expired. Please request a new code.",
- "title": "Code expired"
+ "description": "Platnost kódu vypršela. Vyžádejte si prosím nový kód.",
+ "title": "Kód vypršel"
},
"code_field_error": "Kód nebyl rozpoznán",
"code_field_label": "6místný kód",
diff --git a/frontend/locales/de.json b/frontend/locales/de.json
index 9167696ee..b4df32452 100644
--- a/frontend/locales/de.json
+++ b/frontend/locales/de.json
@@ -62,7 +62,7 @@
"email_exists_error": "Die eingegebene E-Mail-Adresse ist diesem Konto bereits zugeordnet",
"email_field_help": "Fügen Sie eine alternative E-Mail-Adresse hinzu, mit der Sie auf dieses Konto zugreifen können.",
"email_field_label": "E-Mail-Adresse hinzufügen",
- "email_in_use_error": "The entered email is already in use",
+ "email_in_use_error": "Die eingegebene E-Mail-Adresse wird bereits verwendet",
"email_invalid_alert": {
"text": "Die eingegebene E-Mail-Adresse ist ungültig",
"title": "Ungültige Email-Adresse"
@@ -101,7 +101,7 @@
"web": "Web"
},
"email_in_use": {
- "heading": "The email address {{email}} is already in use."
+ "heading": "Die E-Mail-Adresse {{email}} wird bereits verwendet."
},
"end_session_button": {
"confirmation_modal_title": "Sind Sie sicher, dass Sie diese Sitzung abmelden möchten?",
@@ -116,7 +116,7 @@
"error_boundary_title": "Etwas ist schief gelaufen",
"errors": {
"field_required": "Dieses Feld ist erforderlich",
- "rate_limit_exceeded": "You've made too many requests in a short period. Please wait a few minutes and try again."
+ "rate_limit_exceeded": "Sie haben in kurzer Zeit zu viele Anfragen gestellt. Bitte warten Sie ein paar Minuten und versuchen Sie es erneut."
},
"last_active": {
"active_date": "Aktiv {{relativeDate}}",
@@ -175,15 +175,15 @@
},
"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": "Um ein neues Passwort zu erstellen, beginnen Sie von vorne und wählen Sie „Passwort vergessen“.",
+ "title": "Der Link zum Zurücksetzen Ihres Passworts wurde bereits verwendet"
},
"expired": {
- "resend_email": "Resend email",
- "subtitle": "Request a new email that will be sent to: {{email}}",
- "title": "The link to reset your password has expired"
+ "resend_email": "E-Mail erneut senden",
+ "subtitle": "Fordern Sie eine neue E-Mail an, die gesendet wird an: {{email}}",
+ "title": "Der Link zum Zurücksetzen Ihres Passworts ist abgelaufen"
},
- "subtitle": "Choose a new password for your account.",
+ "subtitle": "Wählen Sie ein neues Passwort für Ihr Konto.",
"title": "Passwort zurücksetzen"
},
"password_strength": {
@@ -335,8 +335,8 @@
},
"verify_email": {
"code_expired_alert": {
- "description": "The code has expired. Please request a new code.",
- "title": "Code expired"
+ "description": "Der Code ist abgelaufen. Bitte fordern Sie einen neuen Code an.",
+ "title": "Code abgelaufen"
},
"code_field_error": "Code nicht erkannt",
"code_field_label": "6-stelliger Code",
diff --git a/frontend/locales/et.json b/frontend/locales/et.json
index 8e864c096..4718b1f37 100644
--- a/frontend/locales/et.json
+++ b/frontend/locales/et.json
@@ -62,7 +62,7 @@
"email_exists_error": "Sisestatud e-posti aadress on juba selle kasutajakontoga seotud",
"email_field_help": "Ligipääsuks sellele kasutajakontole lisa täiendav e-posti aadress.",
"email_field_label": "Lisa e-posti aadress",
- "email_in_use_error": "The entered email is already in use",
+ "email_in_use_error": "Sisestatud e-posti aadress on juba kasutusel",
"email_invalid_alert": {
"text": "Lisatud e-posti aadress on vigane",
"title": "Vigane e-posti aadress"
@@ -101,7 +101,7 @@
"web": "Veebirakendus"
},
"email_in_use": {
- "heading": "The email address {{email}} is already in use."
+ "heading": "E-posti aadress {{email}} on juba kasutusel."
},
"end_session_button": {
"confirmation_modal_title": "Kas sa oled kindel, et soovid selle sessiooni lõpetada?",
@@ -335,8 +335,8 @@
},
"verify_email": {
"code_expired_alert": {
- "description": "The code has expired. Please request a new code.",
- "title": "Code expired"
+ "description": "Kood on aegunud. Palun tee päring uue koodi saamiseks.",
+ "title": "Kood on aegunud"
},
"code_field_error": "Kood pole õige",
"code_field_label": "6-numbriline kood",
diff --git a/frontend/locales/fi.json b/frontend/locales/fi.json
new file mode 100644
index 000000000..d1f47d15f
--- /dev/null
+++ b/frontend/locales/fi.json
@@ -0,0 +1,371 @@
+{
+ "action": {
+ "back": "Takaisin",
+ "cancel": "Peruuta",
+ "clear": "Tyhjennä",
+ "close": "Sulje",
+ "collapse": "Supista",
+ "continue": "Jatka",
+ "edit": "Muokkaa",
+ "expand": "Laajenna",
+ "save": "Tallenna",
+ "save_and_continue": "Tallenna ja jatka",
+ "start_over": "Aloita alusta"
+ },
+ "branding": {
+ "privacy_policy": {
+ "alt": "Linkki palvelun tietosuojakäytäntöön",
+ "link": "Tietosuojakäytäntö"
+ },
+ "terms_and_conditions": {
+ "alt": "Linkki palvelun käyttöehtoihin",
+ "link": "Käyttöehdot"
+ }
+ },
+ "common": {
+ "add": "Lisää",
+ "e2ee": "Päästä päähän -salaus",
+ "error": "Virhe",
+ "loading": "Ladataan…",
+ "next": "Seuraava",
+ "previous": "Edellinen",
+ "saved": "Tallennettu",
+ "saving": "Tallennetaan…"
+ },
+ "frontend": {
+ "account": {
+ "account_password": "Tilin salasana",
+ "contact_info": "Yhteystiedot",
+ "edit_profile": {
+ "display_name_help": "Muut näkevät tämän kaikkialla, missä olet kirjautuneena sisään.",
+ "display_name_label": "Näyttönimi",
+ "title": "Muokkaa profiilia",
+ "username_label": "Käyttäjänimi"
+ },
+ "password": {
+ "change": "Vaihda salasana",
+ "change_disabled": "Ylläpitäjä on poistanut salasanan vaihdon käytöstä.",
+ "label": "Salasana"
+ },
+ "title": "Tilisi"
+ },
+ "add_email_form": {
+ "email_denied_alert": {
+ "text": "Palvelimen käytäntö ei salli syötettyä sähköpostia.",
+ "title": "Käytännön kieltämä sähköposti"
+ },
+ "email_denied_error": "Palvelimen käytäntö ei salli syötettyä sähköpostia",
+ "email_exists_alert": {
+ "text": "Syötetty sähköpostiosoite on jo lisätty tähän tiliin",
+ "title": "Sähköposti on jo olemassa"
+ },
+ "email_exists_error": "Syötetty sähköpostiosoite on jo lisätty tähän tiliin",
+ "email_field_help": "Lisää vaihtoehtoinen sähköpostiosoite, jolla voit käyttää tätä tiliä.",
+ "email_field_label": "Lisää sähköpostiosoite",
+ "email_in_use_error": "Annettu sähköpostiosoite on jo käytössä",
+ "email_invalid_alert": {
+ "text": "Syötetty sähköpostiosoite on virheellinen",
+ "title": "Virheellinen sähköpostiosoite"
+ },
+ "email_invalid_error": "Syötetty sähköpostiosoite on virheellinen"
+ },
+ "app_sessions_list": {
+ "error": "Sovellusten istuntojen lataaminen epäonnistui",
+ "heading": "Sovellukset"
+ },
+ "browser_session_details": {
+ "current_badge": "Nykyinen",
+ "session_details_title": "Istunto"
+ },
+ "browser_sessions_overview": {
+ "body:one": "{{count}} aktiivinen istunto",
+ "body:other": "{{count}} aktiivista istuntoa",
+ "heading": "Selaimet",
+ "no_active_sessions": {
+ "default": "Et ole kirjautunut mihinkään verkkoselaimeen.",
+ "inactive_90_days": "Kaikki istuntosi ovat olleet aktiivisia viimeisten 90 päivän aikana."
+ },
+ "view_all_button": "Näytä kaikki"
+ },
+ "compat_session_detail": {
+ "client_details_title": "Sovelluksen tiedot",
+ "name": "Nimi",
+ "session_details_title": "Istunto"
+ },
+ "device_type_icon_label": {
+ "desktop": "Pöytätietokone",
+ "mobile": "Puhelin",
+ "pc": "Tietokone",
+ "tablet": "Tabletti",
+ "unknown": "Tuntematon laitetyyppi",
+ "web": "Verkko"
+ },
+ "email_in_use": {
+ "heading": "Sähköpostiosoite {{email}} on jo käytössä."
+ },
+ "end_session_button": {
+ "confirmation_modal_title": "Haluatko varmasti lopettaa tämän istunnon?",
+ "text": "Kirjaudu ulos"
+ },
+ "error": {
+ "hideDetails": "Piilota tiedot",
+ "showDetails": "Näytä tiedot",
+ "subtitle": "Tapahtui odottamaton virhe. Yritä uudelleen.",
+ "title": "Jokin meni pieleen"
+ },
+ "error_boundary_title": "Jokin meni pieleen",
+ "errors": {
+ "field_required": "Tämä kenttä on pakollinen",
+ "rate_limit_exceeded": "Olet tehnyt liian monta pyyntöä lyhyessä ajassa. Odota muutama minuutti ja yritä uudelleen."
+ },
+ "last_active": {
+ "active_date": "Aktiivinen {{relativeDate}}",
+ "active_now": "Aktiivinen nyt",
+ "inactive_90_days": "Ei aktiivinen yli 90 päivää"
+ },
+ "nav": {
+ "devices": "Laitteet",
+ "profile": "Profiili",
+ "sessions": "Istunnot",
+ "settings": "Asetukset"
+ },
+ "not_found_alert_title": "Ei löytynyt.",
+ "not_logged_in_alert": "Et ole kirjautunut sisään.",
+ "oauth2_client_detail": {
+ "details_title": "Sovelluksen tiedot",
+ "id": "Sovelluksen tunnus",
+ "name": "Nimi",
+ "policy": "Käytäntö",
+ "terms": "Käyttöehdot"
+ },
+ "oauth2_session_detail": {
+ "client_details_name": "Nimi",
+ "client_title": "Sovelluksen tiedot",
+ "session_details_title": "Istunto"
+ },
+ "pagination_controls": {
+ "total": "Yhteensä: {{totalCount}}"
+ },
+ "password_change": {
+ "current_password_label": "Nykyinen salasana",
+ "failure": {
+ "description": {
+ "account_locked": "Tilisi on lukittu eikä sitä voi palauttaa tällä hetkellä. Jos et odottanut tätä, ota yhteyttä palvelimen ylläpitäjään.",
+ "expired_recovery_ticket": "Palautuslinkki on vanhentunut. Aloita tilin palautusprosessi uudelleen alusta.",
+ "invalid_new_password": "Valitsemasi uusi salasana on virheellinen; se ei ehkä vastaa määritettyä suojauskäytäntöä.",
+ "no_current_password": "Sinulla ei ole nykyistä salasanaa.",
+ "no_such_recovery_ticket": "Palautuslinkki on virheellinen. Jos kopioit linkin palautussähköpostista, tarkista, että kopioit koko linkin.",
+ "password_changes_disabled": "Salasanan vaihtaminen on poistettu käytöstä.",
+ "recovery_ticket_already_used": "Palautuslinkki on jo käytetty. Sitä ei voi käyttää uudelleen.",
+ "unspecified": "Tämä saattaa olla väliaikainen ongelma, joten yritä myöhemmin uudelleen. Jos ongelma jatkuu, ota yhteyttä palvelimen ylläpitäjään.",
+ "wrong_password": "Nykyiseksi salasanaksi antamasi salasana on virheellinen. Yritä uudelleen."
+ },
+ "title": "Salasanan vaihtaminen epäonnistui"
+ },
+ "new_password_again_label": "Syötä uusi salasana uudelleen",
+ "new_password_label": "Uusi salasana",
+ "passwords_match": "Salasanat täsmäävät!",
+ "passwords_no_match": "Salasanat eivät täsmää",
+ "subtitle": "Valitse tilillesi uusi salasana.",
+ "success": {
+ "description": "Salasanasi on vaihdettu onnistuneesti.",
+ "title": "Salasana vaihdettu"
+ },
+ "title": "Vaihda salasanasi"
+ },
+ "password_reset": {
+ "consumed": {
+ "subtitle": "Jos haluat luoda uuden salasanan, aloita alusta ja valitse \"Unohditko salasanasi?\".",
+ "title": "Salasanan palautuslinkki on jo käytetty"
+ },
+ "expired": {
+ "resend_email": "Lähetä sähköposti uudelleen",
+ "subtitle": "Pyydä uusi sähköpostiviesti, joka lähetetään osoitteeseen: {{email}}",
+ "title": "Linkki salasanasi palauttamiseen on vanhentunut"
+ },
+ "subtitle": "Valitse tilillesi uusi salasana.",
+ "title": "Palauta salasanasi"
+ },
+ "password_strength": {
+ "placeholder": "Salasanan vahvuus",
+ "score": {
+ "0": "Erittäin heikko salasana",
+ "1": "Todella heikko salasana",
+ "2": "Heikko salasana",
+ "3": "Vahva salasana",
+ "4": "Todella vahva salasana"
+ },
+ "suggestion": {
+ "all_uppercase": "Kirjoita jotkut kirjaimet isolla, mutta älä kaikkia.",
+ "another_word": "Lisää harvinaisempia sanoja.",
+ "associated_years": "Vältä vuosilukuja, jotka liittyvät sinuun.",
+ "capitalization": "Kirjoita isoilla kirjaimilla enemmän kuin vain ensimmäinen kirjain.",
+ "dates": "Vältä päivämääriä ja vuosia, jotka liittyvät sinuun.",
+ "l33t": "Vältä ennakoitavissa olevia kirjainten korvauksia, kuten 'a' korvaamista '@' symbolilla.",
+ "longer_keyboard_pattern": "Käytä pidempiä näppäinkuvioita ja vaihda kirjoitussuuntaa useita kertoja.",
+ "no_need": "Voit luoda vahvoja salasanoja ilman symboleja, numeroita tai isoja kirjaimia.",
+ "pwned": "Jos käytät tätä salasanaa muualla, vaihda se.",
+ "recent_years": "Vältä lähivuosia.",
+ "repeated": "Vältä toistuvia sanoja ja merkkejä.",
+ "reverse_words": "Vältä yleisien sanojen takaperin kirjoitusta.",
+ "sequences": "Vältä yleisiä merkkijonoja.",
+ "use_words": "Käytä useita sanoja, mutta vältä yleisiä lauseita."
+ },
+ "too_weak": "Tämä salasana on liian heikko",
+ "warning": {
+ "common": "Tämä on yleisesti käytetty salasana.",
+ "common_names": "Yleiset nimet ja sukunimet on helppo arvata.",
+ "dates": "Päivämäärät on helppo arvata.",
+ "extended_repeat": "Toistuvat merkkikuviot, kuten \"abcabcabcabc\", on helppo arvata.",
+ "key_pattern": "Lyhyet näppäinkuviot on helppo arvata.",
+ "names_by_themselves": "Yksittäiset nimet tai sukunimet on helppo arvata.",
+ "pwned": "Salasanasi paljastui internetissä tapahtuneen tietomurron yhteydessä.",
+ "recent_years": "Lähivuodet on helppo arvata.",
+ "sequences": "Yleiset merkkijonot, kuten \"abc\", on helppo arvata.",
+ "similar_to_common": "Tämä on samanlainen kuin yleisesti käytetty salasana.",
+ "simple_repeat": "Toistuvat merkit, kuten \"aaa\", on helppo arvata.",
+ "straight_row": "Näppäimistön suorat näppäinrivit on helppo arvata.",
+ "top_hundred": "Tämä on usein käytetty salasana.",
+ "top_ten": "Tämä on paljon käytetty salasana.",
+ "user_inputs": "Henkilökohtaisia tai sivuun liittyviä tietoja ei pitäisi olla.",
+ "word_by_itself": "Yksittäiset sanat on helppo arvata."
+ }
+ },
+ "reset_cross_signing": {
+ "button": "Nollaa identiteetti",
+ "cancelled": {
+ "description_1": "Voit sulkea tämän ikkunan ja palata sovellukseen jatkaaksesi.",
+ "description_2": "Jos olet kirjautunut ulos kaikkialta etkä muista palautuskoodiasi, sinun on silti nollattava identiteettisi.",
+ "heading": "Identiteetin nollaus peruutettu."
+ },
+ "description": "Jos et ole kirjautunut muihin laitteisiin ja olet kadottanut palautusavaimesi, sinun on nollattava identiteettisi, jotta voit jatkaa sovelluksen käyttöä.",
+ "effect_list": {
+ "negative_1": "Menetät nykyisen viestihistoriasi",
+ "negative_2": "Sinun on vahvistettava kaikki olemassa olevat laitteesi ja yhteystietosi uudelleen",
+ "neutral_1": "Menetät kaiken viestihistorian, joka on tallella vain palvelimella",
+ "neutral_2": "Sinun on vahvistettava kaikki olemassa olevat laitteesi ja yhteystietosi uudelleen",
+ "positive_1": "Tilitietosi, yhteystiedot, asetukset ja keskustelulista säilytetään"
+ },
+ "failure": {
+ "description": "Tämä saattaa olla väliaikainen ongelma, joten yritä myöhemmin uudelleen. Jos ongelma jatkuu, ota yhteyttä palvelimen ylläpitäjään.",
+ "heading": "Kryptografisen identiteetin nollauksen salliminen epäonnistui",
+ "title": "Kryptografisen identiteetin nollauksen salliminen epäonnistui"
+ },
+ "finish_reset": "Viimeistele nollaus",
+ "heading": "Nollaa identiteettisi, jos et voi vahvistaa muulla tavalla",
+ "start_reset": "Aloita nollaus",
+ "success": {
+ "description": "Identiteetin nollaus on hyväksytty seuraavaksi {{minutes}} minuutiksi. Voit sulkea tämän ikkunan ja palata sovellukseen jatkaaksesi.",
+ "heading": "Identiteetin nollaus onnistui. Palaa takaisin sovellukseen viimeistelläksesi prosessin.",
+ "title": "Kryptografisen identiteetin nollaus tilapäisesti sallittu"
+ },
+ "warning": "Nollaa identiteettisi vain, jos et voi käyttää toista laitetta, johon olet kirjautunut, ja olet kadottanut palautusavaimesi."
+ },
+ "selectable_session": {
+ "label": "Valitse istunto"
+ },
+ "session": {
+ "client_id_label": "Sovelluksen tunnus",
+ "current": "Nykyinen",
+ "current_badge": "Nykyinen",
+ "device_id_label": "Laitteen tunnus",
+ "finished_date": "Päättyi ",
+ "finished_label": "Päättyi",
+ "id_label": "ID",
+ "ip_label": "IP-osoite",
+ "last_active_label": "Viimeksi aktiivinen",
+ "last_auth_label": "Viimeisin todennus",
+ "name_for_platform": "{{name}} {{platform}}:lle",
+ "scopes_label": "Vaikutusalue",
+ "signed_in_date": "Kirjautunut sisään ",
+ "signed_in_label": "Kirjautunut sisään",
+ "title": "Laitteen tiedot",
+ "unknown_browser": "Tuntematon selain",
+ "unknown_device": "Tuntematon laite",
+ "uri_label": "Osoite",
+ "user_id_label": "Käyttäjätunnus",
+ "username_label": "Käyttäjänimi"
+ },
+ "session_detail": {
+ "alert": {
+ "button": "Palaa takaisin",
+ "text": "Tätä istuntoa ei ole olemassa tai se ei ole enää aktiivinen.",
+ "title": "Istuntoa ei löydy: {{deviceId}}"
+ }
+ },
+ "unknown_route": "Tuntematon reitti {{route}}",
+ "unverified_email_alert": {
+ "button": "Tarkista ja vahvista",
+ "text:one": "Sinulla on {{count}} vahvistamaton sähköpostiosoite.",
+ "text:other": "Sinulla on {{count}} vahvistamatonta sähköpostiosoitetta.",
+ "title": "Vahvistamaton sähköpostiosoite"
+ },
+ "user_email": {
+ "cant_delete_primary": "Valitse toinen ensisijainen sähköpostiosoite poistaaksesi tämän.",
+ "delete_button_confirmation_modal": {
+ "action": "Poista sähköposti",
+ "body": "Poistetaanko tämä sähköposti?"
+ },
+ "delete_button_title": "Poista sähköpostiosoite",
+ "email": "Sähköposti",
+ "make_primary_button": "Tee ensisijaiseksi",
+ "not_verified": "Ei vahvistettu",
+ "primary_email": "Ensisijainen sähköposti",
+ "retry_button": "Lähetä koodi uudelleen",
+ "unverified": "Vahvistamaton"
+ },
+ "user_email_list": {
+ "heading": "Sähköpostit",
+ "no_primary_email_alert": "Ei ensisijaista sähköpostiosoitetta"
+ },
+ "user_greeting": {
+ "error": "Käyttäjän lataaminen epäonnistui"
+ },
+ "user_name": {
+ "display_name_field_label": "Näyttönimi"
+ },
+ "user_sessions_overview": {
+ "active_sessions:one": "{{count}} aktiivinen istunto",
+ "active_sessions:other": "{{count}} aktiivista istuntoa",
+ "heading": "Missä olet kirjautuneena",
+ "no_active_sessions": {
+ "default": "Et ole kirjautunut mihinkään sovellukseen.",
+ "inactive_90_days": "Kaikki istuntosi ovat olleet aktiivisia viimeisten 90 päivän aikana."
+ }
+ },
+ "verify_email": {
+ "code_expired_alert": {
+ "description": "Koodi on vanhentunut. Pyydä uusi koodi.",
+ "title": "Koodi vanhentunut"
+ },
+ "code_field_error": "Koodia ei tunnistettu",
+ "code_field_label": "6-numeroinen koodi",
+ "code_field_wrong_shape": "Koodin on oltava 6-numeroinen",
+ "email_sent_alert": {
+ "description": "Kirjoita uusi koodi alle.",
+ "title": "Uusi koodi lähetetty"
+ },
+ "enter_code_prompt": "Syötä 6-numeroinen koodi, joka lähetettiin osoitteeseen: {{email}}",
+ "heading": "Vahvista sähköpostiosoitteesi",
+ "invalid_code_alert": {
+ "description": "Tarkista sähköpostiisi lähetetty koodi ja päivitä alla olevat kentät jatkaaksesi.",
+ "title": "Syötit väärän koodin"
+ },
+ "resend_code": "Lähetä koodi uudelleen",
+ "resend_email": "Lähetä sähköposti uudelleen",
+ "sent": "Lähetetty!",
+ "unknown_email": "Tuntematon sähköpostiosoite"
+ }
+ },
+ "mas": {
+ "scope": {
+ "edit_profile": "Muokata profiiliasi ja yhteystietojasi",
+ "manage_sessions": "Hallinnoida laitteitasi ja istuntojasi",
+ "mas_admin": "Hallinnoida mitä tahansa käyttäjää matrix-authentication-servicessä",
+ "send_messages": "Lähettää uusia viestejä puolestasi",
+ "synapse_admin": "Hallinnoida Synapse-kotipalvelinta",
+ "view_messages": "Tarkastella olemassa olevia viestejäsi ja tietojasi",
+ "view_profile": "Tarkastella profiilitietojasi ja yhteystietojasi"
+ }
+ }
+}
\ No newline at end of file
diff --git a/frontend/locales/sv.json b/frontend/locales/sv.json
index 3b8391ad3..2079c8db1 100644
--- a/frontend/locales/sv.json
+++ b/frontend/locales/sv.json
@@ -62,7 +62,7 @@
"email_exists_error": "Den angivna e-postadressen har redan lagts till i det här kontot",
"email_field_help": "Lägg till en alternativ e-postadress som du kan använda för att komma åt det här kontot.",
"email_field_label": "Lägg till e-post",
- "email_in_use_error": "The entered email is already in use",
+ "email_in_use_error": "Det angivna e-postmeddelandet används redan",
"email_invalid_alert": {
"text": "Den angivna e-postadressen är ogiltig",
"title": "Ogiltig e-postadress"
@@ -101,7 +101,7 @@
"web": "Webb"
},
"email_in_use": {
- "heading": "The email address {{email}} is already in use."
+ "heading": "E-postadressen {{email}} är redan i bruk."
},
"end_session_button": {
"confirmation_modal_title": "Är du säker på att du vill avsluta denna session?",
@@ -335,8 +335,8 @@
},
"verify_email": {
"code_expired_alert": {
- "description": "The code has expired. Please request a new code.",
- "title": "Code expired"
+ "description": "Koden har upphört att gälla. Begär en ny kod.",
+ "title": "Koden har löpt ut"
},
"code_field_error": "Koden känns inte igen",
"code_field_label": "6-siffrig kod",
diff --git a/frontend/locales/uk.json b/frontend/locales/uk.json
index 65aec1c0c..2454eed26 100644
--- a/frontend/locales/uk.json
+++ b/frontend/locales/uk.json
@@ -62,7 +62,7 @@
"email_exists_error": "Введена електронна пошта вже додана до цього облікового запису",
"email_field_help": "Додайте альтернативну електронну пошту, яку ви можете використовувати для доступу до цього облікового запису.",
"email_field_label": "Додати електронну пошту",
- "email_in_use_error": "The entered email is already in use",
+ "email_in_use_error": "Введена електронна пошта вже використовується",
"email_invalid_alert": {
"text": "Введена електронна пошта недійсна",
"title": "Невірна електронна пошта"
@@ -102,7 +102,7 @@
"web": "Web"
},
"email_in_use": {
- "heading": "The email address {{email}} is already in use."
+ "heading": "Адреса електронної пошти {{email}} вже використовується."
},
"end_session_button": {
"confirmation_modal_title": "Ви впевнені, що хочете закінчити цю сесію?",
@@ -338,8 +338,8 @@
},
"verify_email": {
"code_expired_alert": {
- "description": "The code has expired. Please request a new code.",
- "title": "Code expired"
+ "description": "Термін дії коду закінчився. Будь ласка, запитайте новий код.",
+ "title": "Термін дії коду закінчився"
},
"code_field_error": "Код не розпізнано",
"code_field_label": "6-значний код",
diff --git a/tools/syn2mas/package-lock.json b/tools/syn2mas/package-lock.json
index c414f3969..9032888d9 100644
--- a/tools/syn2mas/package-lock.json
+++ b/tools/syn2mas/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@vector-im/syn2mas",
- "version": "0.13.0-rc.1",
+ "version": "0.13.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@vector-im/syn2mas",
- "version": "0.13.0-rc.1",
+ "version": "0.13.0",
"license": "AGPL-3.0-only",
"dependencies": {
"command-line-args": "^6.0.0",
diff --git a/tools/syn2mas/package.json b/tools/syn2mas/package.json
index ce3d21386..7919cdaef 100644
--- a/tools/syn2mas/package.json
+++ b/tools/syn2mas/package.json
@@ -1,6 +1,6 @@
{
"name": "@vector-im/syn2mas",
- "version": "0.13.0-rc.1",
+ "version": "0.13.0",
"description": "A tool to migrate Synapse users and sessions to the Matrix Authentication Service",
"license": "AGPL-3.0-only",
"author": "Matrix.org",
diff --git a/translations/cs.json b/translations/cs.json
index 2acaa05d2..d4b3b1803 100644
--- a/translations/cs.json
+++ b/translations/cs.json
@@ -6,7 +6,7 @@
"create_account": "Vytvořit účet",
"sign_in": "Přihlásit se",
"sign_out": "Odhlásit",
- "skip": "Skip",
+ "skip": "Přeskočit",
"start_over": "Začít znovu",
"submit": "Odeslat"
},
@@ -55,8 +55,8 @@
"new": "Nové heslo"
},
"choose_display_name": {
- "description": "This is the name other people will see. You can change this at any time.",
- "headline": "Choose your display name"
+ "description": "To je jméno, které uvidí ostatní lidé. Můžete to kdykoli změnit.",
+ "headline": "Zvolte zobrazované jméno"
},
"consent": {
"client_wants_access": "%(client_name)s na adrese %(redirect_uri)s chce získat přístup k vašemu účtu.",
@@ -87,8 +87,8 @@
}
},
"email_in_use": {
- "description": "If you have forgotten your account credentials, you can recover your account. You can also start over and use a different email address.",
- "title": "The email address %(email)s is already in use"
+ "description": "Pokud jste zapomněli přihlašovací údaje k účtu, můžete účet obnovit. Můžete také začít znovu a použít jinou e-mailovou adresu.",
+ "title": "E-mailová adresa %(email)s je již používána"
},
"emails": {
"greeting": "Dobrý den, %(username)s,",
diff --git a/translations/de.json b/translations/de.json
index 641e2929f..780f50aa5 100644
--- a/translations/de.json
+++ b/translations/de.json
@@ -6,7 +6,7 @@
"create_account": "Konto erstellen",
"sign_in": "Anmelden",
"sign_out": "Abmelden",
- "skip": "Skip",
+ "skip": "Überspringen",
"start_over": "Von vorne anfangen",
"submit": "Absenden"
},
@@ -55,8 +55,8 @@
"new": "Neues Passwort"
},
"choose_display_name": {
- "description": "This is the name other people will see. You can change this at any time.",
- "headline": "Choose your display name"
+ "description": "Dies ist der Name, den andere Leute sehen werden. Sie können dies jederzeit ändern.",
+ "headline": "Wähle deinen Anzeigenamen"
},
"consent": {
"client_wants_access": "%(client_name)s auf %(redirect_uri)s möchte auf Ihr Konto zugreifen.",
@@ -87,8 +87,8 @@
}
},
"email_in_use": {
- "description": "If you have forgotten your account credentials, you can recover your account. You can also start over and use a different email address.",
- "title": "The email address %(email)s is already in use"
+ "description": "Wenn Sie Ihre Kontoinformationen vergessen haben, können Sie Ihr Konto wiederherstellen. Sie können auch von vorne beginnen und eine andere E-Mail-Adresse verwenden.",
+ "title": "Die E-Mail-Adresse %(email)s wird bereits verwendet"
},
"emails": {
"greeting": "Hallo %(username)s,",
diff --git a/translations/et.json b/translations/et.json
index 4c9f9ca79..9c8d3eb69 100644
--- a/translations/et.json
+++ b/translations/et.json
@@ -6,7 +6,7 @@
"create_account": "Loo konto",
"sign_in": "Logi sisse",
"sign_out": "Logi välja",
- "skip": "Skip",
+ "skip": "Jäta vahele",
"start_over": "Alusta uuesti",
"submit": "Saada"
},
@@ -55,8 +55,8 @@
"new": "Uus salasõna"
},
"choose_display_name": {
- "description": "This is the name other people will see. You can change this at any time.",
- "headline": "Choose your display name"
+ "description": "Sellise nimena näevad sind kõik teised kasutajad. Seda saad hiljem alati muuta.",
+ "headline": "Vali oma kuvatav nimi"
},
"consent": {
"client_wants_access": "%(client_name)s aadressil %(redirect_uri)s soovib ligipääsu sinu kasutajakontole.",
@@ -87,8 +87,8 @@
}
},
"email_in_use": {
- "description": "If you have forgotten your account credentials, you can recover your account. You can also start over and use a different email address.",
- "title": "The email address %(email)s is already in use"
+ "description": "Kui sa oled unustanud oma konto kasutajanime ja/või salasõna, siis on sul võimalik taastada ligipääs oma kasutajakontole. Lisaks saad uue e-posti aadressi abil alustada nullist.",
+ "title": "E-posti aadress %(email)s on juba kasutusel"
},
"emails": {
"greeting": "Tere %(username)s,",
@@ -186,7 +186,7 @@
"call_to_login": "Sul on kasutajakonto juba olemas?",
"continue_with_email": "Jätka e-posti aadressiga",
"create_account": {
- "description": "Alustamiseks palun loo kasutajakonto:",
+ "description": "Jätkamiseks palun vali kasutajanimi.",
"heading": "Loo kasutajakonto"
},
"sign_in_instead": "Siis logi sisse",
diff --git a/translations/fi.json b/translations/fi.json
new file mode 100644
index 000000000..7c9852c5b
--- /dev/null
+++ b/translations/fi.json
@@ -0,0 +1,245 @@
+{
+ "action": {
+ "back": "Takaisin",
+ "cancel": "Peruuta",
+ "continue": "Jatka",
+ "create_account": "Luo tili",
+ "sign_in": "Kirjaudu sisään",
+ "sign_out": "Kirjaudu ulos",
+ "skip": "Ohita",
+ "start_over": "Aloita alusta",
+ "submit": "Lähetä"
+ },
+ "app": {
+ "human_name": "Matrix Authentication Service",
+ "name": "matrix-authentication-service",
+ "technical_description": "OpenID Connect -metatietoasiakirja: %(discovery_url)s"
+ },
+ "branding": {
+ "privacy_policy": {
+ "alt": "Linkki palvelun tietosuojakäytäntöön",
+ "link": "Tietosuojakäytäntö"
+ },
+ "terms_and_conditions": {
+ "alt": "Linkki palvelun käyttöehtoihin",
+ "link": "Käyttöehdot"
+ }
+ },
+ "common": {
+ "display_name": "Näyttönimi",
+ "email_address": "Sähköpostiosoite",
+ "loading": "Ladataan…",
+ "mxid": "Matrix tunnus",
+ "password": "Salasana",
+ "password_confirm": "Vahvista salasana",
+ "username": "Käyttäjänimi"
+ },
+ "error": {
+ "unexpected": "Odottamaton virhe"
+ },
+ "mas": {
+ "add_email": {
+ "description": "Kirjoita sähköpostiosoite, jotta voit palauttaa tilisi, jos menetät pääsysi siihen.",
+ "heading": "Lisää sähköpostiosoite"
+ },
+ "back_to_homepage": "Palaa etusivulle",
+ "captcha": {
+ "noscript": "Tämä lomake on suojattu CAPTCHA:lla, ja sen lähettäminen edellyttää JavaScriptin käyttöönottoa. Ota JavaScript käyttöön selaimessasi ja lataa tämä sivu uudelleen."
+ },
+ "change_password": {
+ "change": "Vaihda salasana",
+ "confirm": "Vahvista salasana",
+ "current": "Nykyinen salasana",
+ "description": "Tämä vaihtaa tilisi salasanan.",
+ "heading": "Vaihda salasanani",
+ "new": "Uusi salasana"
+ },
+ "choose_display_name": {
+ "description": "Tämä on nimi, jonka muut ihmiset näkevät. Voit muuttaa tätä milloin tahansa.",
+ "headline": "Valitse näyttönimesi"
+ },
+ "consent": {
+ "client_wants_access": "%(client_name)s osoitteessa %(redirect_uri)s haluaa päästä tilillesi.",
+ "heading": "Sallitaanko pääsy tilillesi?",
+ "make_sure_you_trust": "Varmista, että luotat %(client_name)s -sovellukseen.",
+ "this_will_allow": "Tämä antaa %(client_name)s -sovellukselle luvan:",
+ "you_may_be_sharing": "Saatat jakaa arkaluonteisia tietoja tämän sivuston tai sovelluksen kanssa."
+ },
+ "device_card": {
+ "access_requested": "Pääsyä pyydetty",
+ "device_code": "Koodi",
+ "generic_device": "Laite",
+ "ip_address": "IP-osoite"
+ },
+ "device_code_link": {
+ "description": "Yhdistä laite",
+ "headline": "Syötä laitteessasi näkyvä koodi"
+ },
+ "device_consent": {
+ "another_device_access": "Toinen laite haluaa päästä tilillesi.",
+ "denied": {
+ "description": "Kielsit pääsyn %(client_name)s -sovellukselta. Voit sulkea tämän ikkunan.",
+ "heading": "Pääsy kielletty"
+ },
+ "granted": {
+ "description": "Annoit pääsyn %(client_name)s -sovellukselle. Voit sulkea tämän ikkunan.",
+ "heading": "Pääsy myönnetty"
+ }
+ },
+ "email_in_use": {
+ "description": "Jos olet unohtanut tilisi tunnistetiedot, voit palauttaa tilisi. Voit myös aloittaa alusta ja käyttää toista sähköpostiosoitetta.",
+ "title": "Sähköpostiosoite %(email)s on jo käytössä"
+ },
+ "emails": {
+ "greeting": "Hei %(username)s,",
+ "recovery": {
+ "click_button": "Luo uusi salasana napsauttamalla alla olevaa painiketta:",
+ "copy_link": "Luo uusi salasana kopioimalla seuraava linkki ja liittämällä se selaimeen:",
+ "create_new_password": "Luo uusi salasana",
+ "headline": "Pyysit salasanan palautusta %(server_name)s -tilillesi.",
+ "subject": "Palauta tilisi salasana (%(mxid)s)",
+ "you_can_ignore": "Jos et pyytänyt uutta salasanaa, voit jättää tämän sähköpostiviestin huomiotta. Nykyinen salasanasi toimii edelleen."
+ },
+ "verify": {
+ "body_html": "Tämän sähköpostiosoitteen vahvistuskoodi on: %(code)s",
+ "body_text": "Vahvistuskoodisi tämän sähköpostiosoitteen vahvistamiseksi on: %(code)s",
+ "subject": "Sähköpostisi vahvistuskoodi on: %(code)s"
+ }
+ },
+ "errors": {
+ "captcha": "CAPTCHA-vahvistus epäonnistui, yritä uudelleen",
+ "denied_policy": "Käytäntö hylkäsi pyynnön: %(policy)s",
+ "email_domain_banned": "Sähköpostin verkkotunnus on kielletty palvelinkäytännössä",
+ "email_domain_not_allowed": "Palvelinkäytäntö ei salli sähköpostin verkkotunnusta",
+ "field_required": "Tämä kenttä on pakollinen",
+ "invalid_credentials": "Virheelliset kirjautumistiedot",
+ "password_mismatch": "Salasanakentät eivät täsmää",
+ "rate_limit_exceeded": "Olet tehnyt liian monta pyyntöä lyhyessä ajassa. Odota muutama minuutti ja yritä uudelleen.",
+ "username_all_numeric": "Käyttäjänimi ei voi koostua pelkästään numeroista",
+ "username_invalid_chars": "Käyttäjänimi sisältää virheellisiä merkkejä. Käytä vain pieniä kirjaimia, numeroita, viivoja ja alaviivoja.",
+ "username_taken": "Tämä käyttäjänimi on jo käytössä.",
+ "username_too_long": "Käyttäjänimi on liian pitkä",
+ "username_too_short": "Käyttäjänimi on liian lyhyt"
+ },
+ "login": {
+ "call_to_register": "Eikö sinulla ole vielä tiliä?",
+ "continue_with_provider": "Jatka %(provider)s -tilillä",
+ "description": "Kirjaudu sisään jatkaaksesi:",
+ "forgot_password": "Unohditko salasanasi?",
+ "headline": "Kirjaudu sisään",
+ "link": {
+ "description": "Yhdistetään %(provider)s -tiliäsi",
+ "headline": "Kirjaudu sisään yhdistääksesi tilit"
+ },
+ "no_login_methods": "Kirjautumistapoja ei ole käytettävissä.",
+ "separator": "Tai"
+ },
+ "navbar": {
+ "my_account": "Oma tili",
+ "register": "Luo tili",
+ "signed_in_as": "Kirjautunut sisään käyttäjällä %(username)s."
+ },
+ "not_found": {
+ "description": "Etsimääsi sivua ei ole olemassa tai se on siirretty.",
+ "heading": "Sivua ei löydy"
+ },
+ "not_you": "Etkö ole %(username)s?",
+ "or_separator": "Tai",
+ "policy_violation": {
+ "description": "Tämä voi johtua pyynnön laatineesta sovelluksesta, kirjautuneesta käyttäjästä tai itse pyynnöstä.",
+ "heading": "Valtuutuspyyntö hylättiin tämän palvelun noudattaman käytännön mukaisesti",
+ "logged_as": "Kirjautuneena käyttäjälle %(username)s"
+ },
+ "recovery": {
+ "consumed": {
+ "description": "Jos haluat luoda uuden salasanan, aloita alusta ja valitse \"Unohditko salasanasi?\".",
+ "heading": "Linkki salasanasi palauttamiseen on jo käytetty"
+ },
+ "disabled": {
+ "description": "Jos olet kadottanut tunnuksesi, ota yhteyttä ylläpitäjään tilisi palauttamiseksi.",
+ "heading": "Tilin palautus on poistettu käytöstä"
+ },
+ "expired": {
+ "description": "Pyydä uutta sähköpostia, joka lähetetään osoitteeseen: %(email)s.",
+ "heading": "Linkki salasanasi palauttamiseen on vanhentunut",
+ "resend_email": "Lähetä sähköposti uudelleen"
+ },
+ "finish": {
+ "confirm": "Syötä uusi salasana uudelleen",
+ "description": "Valitse tilillesi uusi salasana.",
+ "heading": "Palauta salasanasi",
+ "new": "Uusi salasana",
+ "save_and_continue": "Tallenna ja jatka"
+ },
+ "progress": {
+ "change_email": "Kokeile toista sähköpostia",
+ "description": "Lähetimme sähköpostia, jossa on linkki salasanasi palauttamiseen, jos jokin tili käyttää osoittetta %(email)s.",
+ "heading": "Tarkista sähköpostisi",
+ "resend_email": "Lähetä sähköposti uudelleen"
+ },
+ "start": {
+ "description": "Saat sähköpostiviestin, jossa on linkki salasanasi palauttamiseen.",
+ "heading": "Syötä sähköpostiosoitteesi jatkaaksesi"
+ }
+ },
+ "register": {
+ "call_to_login": "Onko sinulla jo tili?",
+ "continue_with_email": "Jatka sähköpostiosoitteella",
+ "create_account": {
+ "description": "Valitse käyttäjänimi jatkaaksesi.",
+ "heading": "Luo tili"
+ },
+ "sign_in_instead": "Kirjaudu sisään sen sijaan",
+ "terms_of_service": "Hyväksyn Käyttöehdot"
+ },
+ "scope": {
+ "edit_profile": "Muokata profiiliasi ja yhteystietojasi",
+ "manage_sessions": "Hallinnoida laitteitasi ja istuntojasi",
+ "mas_admin": "Hallinnoida mitä tahansa käyttäjää matrix-authentication-servicessä",
+ "send_messages": "Lähettää uusia viestejä puolestasi",
+ "synapse_admin": "Hallinnoida Synapse-kotipalvelinta",
+ "view_messages": "Tarkastella olemassa olevia viestejäsi ja tietojasi",
+ "view_profile": "Tarkastella profiilitietojasi ja yhteystietojasi"
+ },
+ "upstream_oauth2": {
+ "link_mismatch": {
+ "heading": "Tämä tili on jo yhdistetty toiseen tiliin."
+ },
+ "register": {
+ "choose_username": {
+ "description": "Tätä ei voi muuttaa myöhemmin.",
+ "heading": "Valitse käyttäjänimesi"
+ },
+ "create_account": "Luo uusi tili",
+ "enforced_by_policy": "Palvelinkäytännön pakottama",
+ "forced_display_name": "Käytetään seuraavaa näyttönimeä",
+ "forced_email": "Käytetään seuraavaa sähköpostiosoitetta",
+ "forced_localpart": "Käytetään seuraavaa käyttäjänimeä",
+ "import_data": {
+ "description": "Vahvista tiedot, jotka liitetään uuteen %(server_name)s -tiliisi.",
+ "heading": "Tuo tietosi"
+ },
+ "imported_from_upstream": "Tuotu toiselta tililtäsi",
+ "imported_from_upstream_with_name": "Tuotu %(human_name)s -tililtäsi",
+ "link_existing": "Yhdistä olemassa olevaan tiliin",
+ "provider_name": "%(human_name)s -tili",
+ "signup_with_upstream": {
+ "heading": "Jatka rekisteröitymistä %(human_name)s -tililläsi"
+ },
+ "suggested_display_name": "Tuo näyttönimi",
+ "suggested_email": "Tuo sähköpostiosoite",
+ "use": "Käytä"
+ },
+ "suggest_link": {
+ "action": "Yhdistä",
+ "heading": "Yhdistä olemassa olevaan tiliisi"
+ }
+ },
+ "verify_email": {
+ "6_digit_code": "6-numeroinen koodi",
+ "code": "Koodi",
+ "description": "Syötä 6-numeroinen koodi, joka lähetettiin osoitteeseen: %(email)s",
+ "headline": "Vahvista sähköpostiosoitteesi"
+ }
+ }
+}
\ No newline at end of file
diff --git a/translations/sv.json b/translations/sv.json
index 46f102fc9..ca0a26490 100644
--- a/translations/sv.json
+++ b/translations/sv.json
@@ -6,7 +6,7 @@
"create_account": "Skapa konto",
"sign_in": "Logga in",
"sign_out": "Logga ut",
- "skip": "Skip",
+ "skip": "Hoppa över",
"start_over": "Börja om",
"submit": "Skicka in"
},
@@ -55,8 +55,8 @@
"new": "Nytt lösenord"
},
"choose_display_name": {
- "description": "This is the name other people will see. You can change this at any time.",
- "headline": "Choose your display name"
+ "description": "Detta är namnet andra människor kommer att se. Du kan ändra detta när som helst.",
+ "headline": "Välj ditt visningsnamn"
},
"consent": {
"client_wants_access": "%(client_name)s på %(redirect_uri)s vill få tillgång till ditt konto.",
@@ -87,8 +87,8 @@
}
},
"email_in_use": {
- "description": "If you have forgotten your account credentials, you can recover your account. You can also start over and use a different email address.",
- "title": "The email address %(email)s is already in use"
+ "description": "Om du har glömt dina kontouppgifter kan du återställa ditt konto. Du kan också börja om och använda en annan e-postadress.",
+ "title": "E-postadressen %(email)s är redan i bruk"
},
"emails": {
"greeting": "Hej %(username)s,",
diff --git a/translations/uk.json b/translations/uk.json
index 9fd4c6237..37ca1733b 100644
--- a/translations/uk.json
+++ b/translations/uk.json
@@ -6,7 +6,7 @@
"create_account": "Створити обліковий запис",
"sign_in": "Увійти",
"sign_out": "Вийти",
- "skip": "Skip",
+ "skip": "Пропустити",
"start_over": "Розпочати знову",
"submit": "Надіслати"
},
@@ -55,8 +55,8 @@
"new": "Новий пароль"
},
"choose_display_name": {
- "description": "This is the name other people will see. You can change this at any time.",
- "headline": "Choose your display name"
+ "description": "Це ім'я, яке побачать інші люди. Ви можете змінити його в будь-який час.",
+ "headline": "Виберіть своє ім'я для відображення"
},
"consent": {
"client_wants_access": "%(client_name)s за %(redirect_uri)s хоче звернутися до вашого облікового запису.",
@@ -87,8 +87,8 @@
}
},
"email_in_use": {
- "description": "If you have forgotten your account credentials, you can recover your account. You can also start over and use a different email address.",
- "title": "The email address %(email)s is already in use"
+ "description": "Якщо ви забули свої облікові дані, ви можете відновити обліковий запис. Ви також можете почати спочатку та використати іншу електронну адресу.",
+ "title": "Адреса електронної пошти %(email)s вже використовується"
},
"emails": {
"greeting": "Вітаю %(username)s,",