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%(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,",