diff --git a/.drone.yml b/.drone.yml
new file mode 100644
index 00000000..8ea23a42
--- /dev/null
+++ b/.drone.yml
@@ -0,0 +1,205 @@
+kind: pipeline
+type: exec
+name: Nightly
+
+steps:
+ - name: Prepare
+ commands:
+ - ln -s /var/lib/drone-runner-exec/.local $HOME/.local
+ - ln -s /var/lib/drone-runner-exec/fdroid $HOME/fdroid
+
+ - name: Run Tests
+ commands:
+ - ./ci.py --ci-run-tests
+ - sonar-scanner -Dsonar.projectKey=SelfPrivacy-Flutter-App -Dsonar.sources=. -Dsonar.host.url=http://analyzer.lan:9000 -Dsonar.login="$SONARQUBE_TOKEN"
+ environment:
+ SONARQUBE_TOKEN:
+ from_secret: SONARQUBE_TOKEN
+
+ - name: Build Nightly Linux Release Artifact (Binary)
+ commands:
+ - ./ci.py --ci-build-linux
+
+ - name: Build Nightly Release Artifact (.APK)
+ commands:
+ - ./ci.py --ci-build-apk
+
+ - name: Sign and Commit Nightly Android Release Artifact (.APK) for F-Droid Repository
+ commands:
+ - rm -rf $HOME/fdroid/build/org.selfprivacy.app.nightly && mkdir $HOME/fdroid/build/org.selfprivacy.app.nightly
+ - git archive --format=tar HEAD | tar x -C $HOME/fdroid/build/org.selfprivacy.app.nightly
+ - ./ci.py --sign-apk-fdroid-nightly
+ environment:
+ STANDALONE_KEYSTORE_PASS:
+ from_secret: STANDALONE_KEYSTORE_PASS
+ FDROID_KEYSTORE_PASS:
+ from_secret: FDROID_KEYSTORE_PASS
+ GOOGLE_KEYSTORE_PASS:
+ from_secret: GOOGLE_KEYSTORE_PASS
+
+ - name: Deploy F-Droid Repository
+ commands:
+ - ./ci.py --deploy-fdroid-repo
+ environment:
+ SSH_PRIVATE_KEY:
+ from_secret: SSH_PRIVATE_KEY
+
+trigger:
+ event:
+ - push
+ branch:
+ - master
+
+node:
+ server: builder
+
+---
+
+kind: pipeline
+type: exec
+name: Release
+
+steps:
+ - name: Prepare
+ commands:
+ - ln -s /var/lib/drone-runner-exec/.local $HOME/.local
+ - ln -s /var/lib/drone-runner-exec/fdroid $HOME/fdroid
+ - if podman volume exists release; then podman volume rm -f release; podman volume create release; else podman volume create release; fi
+ - git config user.email "builder@selfprivacy.org"
+ - git config user.name "Builder"
+
+ - name: Create an Empty Gitea Release
+ commands:
+ - ./ci.py --gitea-create-release
+ environment:
+ GITEA_RELEASE_TOKEN:
+ from_secret: GITEA_RELEASE_TOKEN
+
+ - name: Build Intermediate Linux Release Artifact (Binary)
+ commands:
+ - ./ci.py --build-linux
+ environment:
+ STANDALONE_KEYSTORE_PASS:
+ from_secret: STANDALONE_KEYSTORE_PASS
+ FDROID_KEYSTORE_PASS:
+ from_secret: FDROID_KEYSTORE_PASS
+ GOOGLE_KEYSTORE_PASS:
+ from_secret: GOOGLE_KEYSTORE_PASS
+
+ - name: Build Intermediate Android Release Artifact (.APK)
+ commands:
+ - ./ci.py --build-apk
+ environment:
+ STANDALONE_KEYSTORE_PASS:
+ from_secret: STANDALONE_KEYSTORE_PASS
+ FDROID_KEYSTORE_PASS:
+ from_secret: FDROID_KEYSTORE_PASS
+ GOOGLE_KEYSTORE_PASS:
+ from_secret: GOOGLE_KEYSTORE_PASS
+
+ - name: Build Intermediate Android Release Artifact (Bundle)
+ commands:
+ - ./ci.py --build-bundle
+ environment:
+ STANDALONE_KEYSTORE_PASS:
+ from_secret: STANDALONE_KEYSTORE_PASS
+ FDROID_KEYSTORE_PASS:
+ from_secret: FDROID_KEYSTORE_PASS
+ GOOGLE_KEYSTORE_PASS:
+ from_secret: GOOGLE_KEYSTORE_PASS
+
+ - name: Sign Android Release Artifact (.APK) for Standalone Use
+ commands:
+ - ./ci.py --sign-apk-standalone
+ environment:
+ STANDALONE_KEYSTORE_PASS:
+ from_secret: STANDALONE_KEYSTORE_PASS
+ FDROID_KEYSTORE_PASS:
+ from_secret: FDROID_KEYSTORE_PASS
+ GOOGLE_KEYSTORE_PASS:
+ from_secret: GOOGLE_KEYSTORE_PASS
+
+ - name: Sign and Commit Android Release Artifact (.APK) for F-Droid Repository
+ commands:
+ - rm -rf $HOME/fdroid/build/org.selfprivacy.app && mkdir $HOME/fdroid/build/org.selfprivacy.app
+ - git archive --format=tar HEAD | tar x -C $HOME/fdroid/build/org.selfprivacy.app
+ - ./ci.py --sign-apk-fdroid
+ environment:
+ STANDALONE_KEYSTORE_PASS:
+ from_secret: STANDALONE_KEYSTORE_PASS
+ FDROID_KEYSTORE_PASS:
+ from_secret: FDROID_KEYSTORE_PASS
+ GOOGLE_KEYSTORE_PASS:
+ from_secret: GOOGLE_KEYSTORE_PASS
+
+ - name: Sign Android Release Artifact (Bundle) for Google Play
+ commands:
+ - ./ci.py --sign-bundle
+ environment:
+ STANDALONE_KEYSTORE_PASS:
+ from_secret: STANDALONE_KEYSTORE_PASS
+ FDROID_KEYSTORE_PASS:
+ from_secret: FDROID_KEYSTORE_PASS
+ GOOGLE_KEYSTORE_PASS:
+ from_secret: GOOGLE_KEYSTORE_PASS
+
+ - name: Package Linux AppImage Artifact
+ commands:
+ - ./ci.py --package-linux-appimage
+
+ - name: Package Linux Flatpak Artifact
+ commands:
+ - ./ci.py --package-linux-flatpak
+
+ - name: Package Linux Archive Artifact
+ commands:
+ - ./ci.py --package-linux-archive
+
+ - name: Push Artifacts to the Release Volume
+ commands:
+ - git add -v *.AppImage *.AppImage.zsync *.flatpak *.apk *.apk.idsig *.aab *.tar.zstd
+ - git commit -m Release
+ - git archive --format=tar HEAD | podman volume import release -
+
+trigger:
+ event:
+ - tag
+
+node:
+ server: builder
+
+---
+
+kind: pipeline
+type: exec
+name: Deploy
+
+steps:
+ - name: Prepare
+ commands:
+ - ln -s /var/lib/drone-runner-exec/.local $HOME/.local
+ - podman unshare podman volume mount release
+
+ - name: Deploy Artifacts to Gitea
+ commands:
+ - ./ci.py --deploy-gitea-release
+ environment:
+ GITEA_RELEASE_TOKEN:
+ from_secret: GITEA_RELEASE_TOKEN
+
+ - name: Deploy F-Droid Repository
+ commands:
+ - ./ci.py --deploy-fdroid-repo
+ environment:
+ SSH_PRIVATE_KEY:
+ from_secret: SSH_PRIVATE_KEY
+
+trigger:
+ event:
+ - tag
+
+node:
+ server: builder
+
+depends_on:
+ - Release
diff --git a/.editorconfig b/.editorconfig
index 80a3e35b..206f5ceb 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -14,3 +14,6 @@ max_line_length = 150
[*.md]
trim_trailing_whitespace = false
+
+[*.json]
+indent_size = 4
diff --git a/.gitea/ISSUE_TEMPLATE/bug.yaml b/.gitea/ISSUE_TEMPLATE/bug.yaml
new file mode 100644
index 00000000..f9441722
--- /dev/null
+++ b/.gitea/ISSUE_TEMPLATE/bug.yaml
@@ -0,0 +1,68 @@
+name: Bug report
+about: File a bug report
+labels:
+ - Bug
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for taking the time to fill out this bug report! Please provide a short but a descriptive title for your issue.
+ - type: textarea
+ id: expected-behaviour
+ attributes:
+ label: Expected Behavior
+ description: What did you expect to happen?
+ validations:
+ required: true
+ - type: textarea
+ id: actual-behaviour
+ attributes:
+ label: Actual Behavior
+ description: What actually happened?
+ validations:
+ required: true
+ - type: textarea
+ id: steps-to-reproduce
+ attributes:
+ label: Steps to Reproduce
+ description: What steps can we follow to reproduce this issue?
+ placeholder: |
+ 1. First step
+ 2. Second step
+ 3. and so on...
+ validations:
+ required: true
+ - type: textarea
+ id: context
+ attributes:
+ label: Context and notes
+ description: Additional information about environment or what were you trying to do. If you have an idea how to fix this issue, please describe it here too.
+ - type: textarea
+ id: logs
+ attributes:
+ label: Relevant log output
+ description: Please copy and paste any relevant log output, if you have any. This will be automatically formatted into code, so no need for backticks.
+ render: shell
+ - type: input
+ id: app-version
+ attributes:
+ label: App Version
+ description: What version of SelfPrivacy app are you running? You can find it in the "About" section of the app.
+ validations:
+ required: true
+ - type: input
+ id: api-version
+ attributes:
+ label: Server API Version
+ description: What version of SelfPrivacy API are you running? You can find it in the "About" section of the app. Leave it empty if your app is not connected to the server yet.
+ - type: dropdown
+ id: os
+ attributes:
+ label: Operating System
+ description: What operating system are you using?
+ options:
+ - Android
+ - iOS
+ - Linux
+ - macOS
+ - Windows
diff --git a/.gitea/ISSUE_TEMPLATE/feature.yaml b/.gitea/ISSUE_TEMPLATE/feature.yaml
new file mode 100644
index 00000000..8ff40a0f
--- /dev/null
+++ b/.gitea/ISSUE_TEMPLATE/feature.yaml
@@ -0,0 +1,23 @@
+name: Feature request
+about: Suggest an idea for this project
+label:
+ - Feature request
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for taking the time to fill out this feature request! Please provide a short but a descriptive title for your issue.
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Describe the feature you'd like to see.
+ placeholder: |
+ As a user, I want to be able to...
+ validations:
+ required: true
+ - type: textarea
+ id: context
+ attributes:
+ label: Context and notes
+ description: Additional information about environment and what were you trying to do. If you have an idea how to implement this feature, please describe it here too.
diff --git a/.gitea/ISSUE_TEMPLATE/translation.yaml b/.gitea/ISSUE_TEMPLATE/translation.yaml
new file mode 100644
index 00000000..c7348b94
--- /dev/null
+++ b/.gitea/ISSUE_TEMPLATE/translation.yaml
@@ -0,0 +1,29 @@
+name: Translation issue
+about: File a translation (localization) issue
+labels:
+ - Translations
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Translations can be modified and discussed on [Weblate](https://weblate.selfprivacy.org/projects/selfprivacy/). You can fix the mistranslation issue yourself there. Using the search, you can also find the string ID of the mistranslated string. If your issue is more complex, please file it here
+
+ If you are a member of SelfPrivacy core team, you **must** fix the issue yourself on Weblate.
+ - type: input
+ id: language
+ attributes:
+ label: Language
+ description: What language is affected?
+ placeholder: |
+ English
+ validations:
+ required: true
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Describe the issue in detail. If you have an idea how to fix this issue, please describe it here too. Include the string ID of the mistranslated string, if possible.
+ placeholder: |
+ The string `string.id` is translated as "foo", but it should be "bar".
+ validations:
+ required: true
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
new file mode 100644
index 00000000..c52968cd
--- /dev/null
+++ b/.github/workflows/windows.yml
@@ -0,0 +1,29 @@
+name: Windows Builder
+
+on: tag
+
+jobs:
+ build-windows:
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ # Install Python dependencies
+ - run: pip install requests pyyaml
+
+ # Install Flutter
+ - uses: subosito/flutter-action@v2
+ with:
+ flutter-version: '3.3.10'
+ channel: 'stable'
+
+ # Build Windows artifact
+ - run: flutter build windows
+
+ # Archive the build
+ - run: python ci.py --package-windows-archive
+
+ # Upload the build
+ - run: python ci.py --deploy-windows-archive
+ env:
+ GITEA_RELEASE_TOKEN: ${{ secrets.GITEA_RELEASE_TOKEN }}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..32bc427d
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,58 @@
+FROM ubuntu:22.04
+
+ARG PACKAGES="build-essential openjdk-11-jdk-headless clang cmake curl git jq libblkid1 \
+ libblkid-dev libc6 libc6-dev libc-bin libcrypt1 libdbus-1-3 libexpat1 libffi7 \
+ libgcc-s1 libgcrypt20 libgcrypt20-dev libglib2.0-0 libglib2.0-dev libglu1-mesa \
+ libgpg-error0 libgtk-3-0 libgtk-3-dev liblz4-1 liblz4-dev liblzma5 liblzma-dev \
+ libmount1 libpcre3 libselinux1 libsepol2 libstdc++-10-dev libstdc++6 libuuid1 \
+ ninja-build pkg-config rsync unzip xz-utils zlib1g unzip libsecret-1-dev libsecret-tools \
+ libsecret-1-0 libjsoncpp-dev fuse flatpak-builder binutils coreutils desktop-file-utils \
+ fakeroot fuse libgdk-pixbuf2.0-dev patchelf python3-pip python3-setuptools squashfs-tools \
+ strace util-linux zsync"
+ARG ANDROID_SDK_TOOLS_VERSION="8512546"
+ARG ANDROID_SDK_TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS_VERSION}_latest.zip"
+ARG FLUTTER_VERSION="3.3.1"
+ARG FLUTTER_URL="https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz"
+ARG FREEDESKTOP_SDK_VERSION="22.08"
+
+# Update packages
+RUN apt-get update && apt-get upgrade -y && apt-get install -y $PACKAGES
+
+WORKDIR /opt
+
+# Install Android SDK
+ADD $ANDROID_SDK_TOOLS_URL .
+RUN mkdir -p android-sdk/cmdline-tools && unzip commandlinetools-linux-${ANDROID_SDK_TOOLS_VERSION}_latest.zip \
+ && rm commandlinetools-linux-${ANDROID_SDK_TOOLS_VERSION}_latest.zip && mv cmdline-tools android-sdk/cmdline-tools/latest
+
+# Install Flutter
+ENV FLUTTER_HOME "/opt/flutter"
+ADD $FLUTTER_URL .
+RUN tar -vxf flutter_linux_${FLUTTER_VERSION}-stable.tar.xz && \
+ rm flutter_linux_${FLUTTER_VERSION}-stable.tar.xz
+# Flutter doesn't work without write permissions, so fuck it, fuck
+RUN chmod -R 777 $FLUTTER_HOME
+RUN git config --system --add safe.directory $FLUTTER_HOME
+
+ENV ANDROID_HOME "/opt/android-sdk"
+ENV ANDROID_SDK_ROOT "${ANDROID_HOME}"
+ENV PATH "$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/build-tools/30.0.3:/opt/flutter/bin"
+
+# Install needed Android SDK packages
+RUN yes | sdkmanager 'build-tools;30.0.3' 'platforms;android-29' 'platforms;android-30' 'platforms;android-31'
+
+WORKDIR /tmp
+
+# Prepare dependencies for offline build
+ENV PUB_CACHE "/tmp/flutter_pub_cache"
+ENV GRADLE_USER_HOME "/tmp/gradle"
+RUN git clone --depth=1 --single-branch https://git.selfprivacy.org/kherel/selfprivacy.org.app.git deps
+WORKDIR /tmp/deps
+RUN flutter build linux
+RUN flutter build apk --flavor production
+WORKDIR /tmp
+RUN rm -rf deps
+RUN find $GRADLE_USER_HOME/daemon -exec chmod 777 {} \;
+
+# Install AppImage Builder and F-Droid Server
+RUN pip3 install appimage-builder fdroidserver
diff --git a/README.md b/README.md
index 35c31b44..1e132b91 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,57 @@
# SelfPrivacy App
-- [Official site](https://selfprivacy.org)
-- [SelfPrivacy App (F-Droid)](https://f-droid.org/en/packages/pro.kherel.selfprivacy/)
+SelfPrivacy — is a platform on your cloud hosting, that allows to deploy your own private services and control them using mobile application.
-## Getting Started
+To use this application, you'll be required to create accounts of different service providers. Please reffer to this manual: https://selfprivacy.org/docs/getting-started/
-This project is a starting point for a Flutter application.
+Application will do the following things for you:
-A few resources to get you started if this is your first Flutter project:
+1. Create your personal server
+2. Setup NixOS
+3. Bring all services to the ready-to-use state. Services include:
-- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
-- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
+* E-mail, ready to use with DeltaChat
+* NextCloud - your personal cloud storage
+* Bitwarden — secure and private password manager
+* Pleroma — your private fediverse space for blogging
+* Jitsi — awesome Zoom alternative
+* Gitea — your own Git server
+* OpenConnect — Personal VPN server
-For help getting started with Flutter, view our
-[online documentation](https://flutter.dev/docs), which offers tutorials,
-samples, guidance on mobile development, and a full API reference.
+**Project is currently in open beta state**. Feel free to try it. It would be much appreciated if you would provide us with some feedback.
+
+## Building
+
+Supported platforms are Android, Linux, and Windows. We are looking forward to support iOS and macOS builds.
+
+For Linux builds, make sure you have these packages installed:
+|Arch-based|Debian-based|
+|----------|------------|
+|pacman -S ninja xdg-user-dirs gnome-keyring unzip xz-utils zip|apt install ninja-build xdg-user-dirs gnome-keyring unzip xz-utils zip|
+
+Install [Flutter](https://docs.flutter.dev/get-started/install/linux) and [Android SDK tools](https://developer.android.com/studio/command-line/sdkmanager), then try your setup:
+
+```
+flutter pub get
+
+# Build .APK for Android
+flutter build --flavor production apk
+# Build AAB bundle for Google Play
+flutter build --flavor production aab
+# Build Linux binaries
+flutter build linux
+# Build Windows binaries
+flutter build windows
+
+# Package AppImage
+appimage-builder --recipe appimage.yml
+# Package Flatpak
+flatpak-builder --force-clean --repo=flatpak-repo flatpak-build flatpak.yml
+flatpak build-bundle flatpak-repo org.selfprivacy.app.flatpak org.selfprivacy.app
+```
+
+## Translations
+
+[![Translation status](http://weblate.selfprivacy.org/widgets/selfprivacy/-/selfprivacy-app/multi-auto.svg)](http://weblate.selfprivacy.org/engage/selfprivacy/)
+
+Translations are stored in `assets/translations/*.json` and can be edited on .
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 9d16cb20..ff0f9356 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -13,6 +13,7 @@ analyzer:
exclude:
- lib/generated_plugin_registrant.dart
- lib/**.g.dart
+ - lib/**.graphql.dart
linter:
# The lint rules applied to this project can be customized in the
@@ -28,17 +29,16 @@ linter:
# producing the lint.
rules:
avoid_print: false # Uncomment to disable the `avoid_print` rule
- prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
- always_use_package_imports: true
- invariant_booleans: true
- no_adjacent_strings_in_list: true
- unnecessary_statements: true
always_declare_return_types: true
- always_put_required_named_parameters_first: true
always_put_control_body_on_new_line: true
+ always_put_required_named_parameters_first: true
+ always_use_package_imports: true
avoid_escaping_inner_quotes: true
avoid_setters_without_getters: true
+ collection_methods_unrelated_type: true
+ combinators_ordering: true
eol_at_end_of_file: true
+ no_adjacent_strings_in_list: true
prefer_constructors_over_static_methods: true
prefer_expression_function_bodies: true
prefer_final_in_for_each: true
@@ -48,12 +48,18 @@ linter:
prefer_if_elements_to_conditional_expressions: true
prefer_mixin: true
prefer_null_aware_method_calls: true
+ prefer_single_quotes: true
require_trailing_commas: true
sized_box_shrink_expand: true
sort_constructors_first: true
+ unawaited_futures: true
unnecessary_await_in_return: true
+ unnecessary_null_aware_operator_on_extension_on_nullable: true
unnecessary_null_checks: true
unnecessary_parenthesis: true
+ unnecessary_statements: true
+ unnecessary_to_list_in_spreads: true
+ unreachable_from_main: true
use_enums: true
use_if_null_to_convert_nulls_to_bools: true
use_is_even_rather_than_modulo: true
@@ -61,6 +67,7 @@ linter:
use_named_constants: true
use_setters_to_change_properties: true
use_string_buffers: true
+ use_string_in_part_of_directives: true
use_super_parameters: true
use_to_and_as_if_applicable: true
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 0963724e..9d678878 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -26,7 +26,9 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
- compileSdkVersion flutter.compileSdkVersion
+ namespace 'org.selfprivacy.app'
+
+ compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
sourceSets {
@@ -48,18 +50,41 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId "pro.kherel.selfprivacy"
+ applicationId "org.selfprivacy.app"
minSdkVersion 21
- targetSdkVersion 31
+ targetSdkVersion 33
+ compileSdkVersion 33
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
- buildTypes {
- release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
- signingConfig signingConfigs.debug
+ flavorDimensions "default"
+ productFlavors {
+ fdroid {
+ applicationId "pro.kherel.selfprivacy"
+ }
+ production {
+ applicationIdSuffix ""
+ }
+ nightly {
+ applicationIdSuffix ".nightly"
+ versionCode project.getVersionCode()
+ versionName "nightly-" + project.getVersionCode()
+ }
+ }
+
+ flavorDimensions "default"
+ productFlavors {
+ fdroid {
+ applicationId "pro.kherel.selfprivacy"
+ }
+ production {
+ applicationIdSuffix ""
+ }
+ nightly {
+ applicationIdSuffix ".nightly"
+ versionCode project.getVersionCode()
+ versionName "nightly-" + project.getVersionCode()
}
}
}
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
index 27e1af1d..dddeb01f 100644
--- a/android/app/src/debug/AndroidManifest.xml
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -1,5 +1,5 @@
+ package="org.selfprivacy.app">
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 33c2ba9a..50f47475 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
+ package="org.selfprivacy.app">
diff --git a/android/build.gradle b/android/build.gradle
index 31e95773..13645686 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,5 +1,18 @@
buildscript {
ext.kotlin_version = '1.6.10'
+ ext.getVersionCode = { ->
+ try {
+ def stdout = new ByteArrayOutputStream()
+ exec {
+ commandLine 'git', 'rev-list', '--first-parent', '--count', 'HEAD'
+ standardOutput = stdout
+ }
+ return Integer.parseInt(stdout.toString().trim())
+ }
+ catch (ignored) {
+ return -1
+ }
+ }
repositories {
google()
jcenter()
@@ -26,6 +39,6 @@ subprojects {
project.evaluationDependsOn(':app')
}
-task clean(type: Delete) {
+tasks.register("clean", Delete) {
delete rootProject.buildDir
}
diff --git a/android/gradle.properties b/android/gradle.properties
index a6738207..c396be2a 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,4 +1,4 @@
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
-android.enableR8=true
+android.bundle.enableUncompressedNativeLibs=false
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index cc5527d7..02e5f581 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
diff --git a/appimage.yml b/appimage.yml
new file mode 100644
index 00000000..40bcc3c3
--- /dev/null
+++ b/appimage.yml
@@ -0,0 +1,53 @@
+# appimage-builder recipe see https://appimage-builder.readthedocs.io for details
+version: 1
+script:
+ - rm -rf AppDir || true
+ - cp -r build/linux/x64/release/bundle AppDir
+ - install -Dm644 assets/images/icon/logo.svg AppDir/usr/share/icons/hicolor/scalable/apps/org.selfprivacy.app.svg
+AppDir:
+ path: AppDir
+ app_info:
+ id: org.selfprivacy.app
+ name: SelfPrivacy
+ icon: org.selfprivacy.app
+ version: 0.9.1
+ exec: selfprivacy
+ exec_args: $@
+ apt:
+ arch:
+ - amd64
+ allow_unauthenticated: true
+ sources:
+ - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted
+ - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted
+ - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy universe
+ - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates universe
+ - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy multiverse
+ - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse
+ - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
+ - sourceline: deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted
+ - sourceline: deb http://security.ubuntu.com/ubuntu/ jammy-security universe
+ - sourceline: deb http://security.ubuntu.com/ubuntu/ jammy-security multiverse
+ include:
+ - libjsoncpp-dev
+ - libsecret-1-0
+ - xdg-desktop-portal
+ test:
+ fedora-30:
+ image: appimagecrafters/tests-env:fedora-30
+ command: ./AppRun
+ debian-stable:
+ image: appimagecrafters/tests-env:debian-stable
+ command: ./AppRun
+ archlinux-latest:
+ image: appimagecrafters/tests-env:archlinux-latest
+ command: ./AppRun
+ centos-7:
+ image: appimagecrafters/tests-env:centos-7
+ command: ./AppRun
+ ubuntu-xenial:
+ image: appimagecrafters/tests-env:ubuntu-xenial
+ command: ./AppRun
+AppImage:
+ arch: x86_64
+ update-information: guess
diff --git a/assets/images/icon/logo.svg b/assets/images/icon/logo.svg
new file mode 100644
index 00000000..881a57fe
--- /dev/null
+++ b/assets/images/icon/logo.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/logos/cloudflare.svg b/assets/images/logos/cloudflare.svg
new file mode 100644
index 00000000..03a60465
--- /dev/null
+++ b/assets/images/logos/cloudflare.svg
@@ -0,0 +1 @@
+
diff --git a/assets/images/logos/desec.svg b/assets/images/logos/desec.svg
new file mode 100644
index 00000000..cb54b268
--- /dev/null
+++ b/assets/images/logos/desec.svg
@@ -0,0 +1,89 @@
+
+
+
+
diff --git a/assets/images/logos/digital_ocean.png b/assets/images/logos/digital_ocean.png
new file mode 100644
index 00000000..04f5efd5
Binary files /dev/null and b/assets/images/logos/digital_ocean.png differ
diff --git a/assets/images/logos/digital_ocean.svg b/assets/images/logos/digital_ocean.svg
new file mode 100644
index 00000000..98b04c36
--- /dev/null
+++ b/assets/images/logos/digital_ocean.svg
@@ -0,0 +1,6 @@
+
diff --git a/assets/images/logos/hetzner.svg b/assets/images/logos/hetzner.svg
new file mode 100644
index 00000000..5cafc101
--- /dev/null
+++ b/assets/images/logos/hetzner.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/markdown/about-be.md b/assets/markdown/about-be.md
new file mode 100644
index 00000000..71a9ef3e
--- /dev/null
+++ b/assets/markdown/about-be.md
@@ -0,0 +1,12 @@
+### Пра нас
+
+Усё больш арганізацый жадаюць валодаць нашымі дадзенымі
+Праект дазваляе толькі Вам у поўнай меры распараджацца ўласнымі **дадзенымі** на сваім сэрвэры.
+
+### Наша місія
+
+Лічбавая незалежнасць і прыватнасць, даступныя кожнаму
+
+### Мэта
+
+Распрацаваць праграму, якая дазволіць кожнаму разгарнуць свае прыватныя паслугі для сябе і сваіх суседзяў.
\ No newline at end of file
diff --git a/assets/markdown/about-cs.md b/assets/markdown/about-cs.md
new file mode 100644
index 00000000..4d0a01e2
--- /dev/null
+++ b/assets/markdown/about-cs.md
@@ -0,0 +1,12 @@
+### O nás
+
+More and more corporations want to control our data.
+We want to have full control of our **data** on our own.
+
+### Naše poslání
+
+Digitální nezávislost a soukromí dostupné všem
+
+### Cíl
+
+Rozvíjet program, který umožní každému nasadit své soukromé služby pro sebe a své sousedy.
\ No newline at end of file
diff --git a/assets/markdown/about-de.md b/assets/markdown/about-de.md
new file mode 100644
index 00000000..401af514
--- /dev/null
+++ b/assets/markdown/about-de.md
@@ -0,0 +1,12 @@
+### Über uns
+
+Immer mehr Unternehmen wollen unsere Daten kontrollieren.
+Wir wollen selbst die volle Kontrolle über unsere **data** haben.
+
+### Unsere Mission
+
+Digitale Unabhängigkeit und Privatsphäre für alle verfügbar
+
+### Ziel
+
+Das Programm entwickeln, das es jedem ermöglicht, seine privaten Dienste für sich und seine Nachbarn einzusetzen.
\ No newline at end of file
diff --git a/assets/markdown/about-es.md b/assets/markdown/about-es.md
new file mode 100644
index 00000000..3963aa6e
--- /dev/null
+++ b/assets/markdown/about-es.md
@@ -0,0 +1,12 @@
+### About us
+
+More and more corporations want to control our data.
+We want to have full control of our **data** on our own.
+
+### Our mission
+
+Digital independence and privacy, available to everyone
+
+### Target
+
+Develop the program, which will allow everyone to deploy their private services for themselves and their neighbours.
\ No newline at end of file
diff --git a/assets/markdown/about-fr.md b/assets/markdown/about-fr.md
new file mode 100644
index 00000000..3963aa6e
--- /dev/null
+++ b/assets/markdown/about-fr.md
@@ -0,0 +1,12 @@
+### About us
+
+More and more corporations want to control our data.
+We want to have full control of our **data** on our own.
+
+### Our mission
+
+Digital independence and privacy, available to everyone
+
+### Target
+
+Develop the program, which will allow everyone to deploy their private services for themselves and their neighbours.
\ No newline at end of file
diff --git a/assets/markdown/about-it.md b/assets/markdown/about-it.md
new file mode 100644
index 00000000..3963aa6e
--- /dev/null
+++ b/assets/markdown/about-it.md
@@ -0,0 +1,12 @@
+### About us
+
+More and more corporations want to control our data.
+We want to have full control of our **data** on our own.
+
+### Our mission
+
+Digital independence and privacy, available to everyone
+
+### Target
+
+Develop the program, which will allow everyone to deploy their private services for themselves and their neighbours.
\ No newline at end of file
diff --git a/assets/markdown/about-ja.md b/assets/markdown/about-ja.md
new file mode 100644
index 00000000..3963aa6e
--- /dev/null
+++ b/assets/markdown/about-ja.md
@@ -0,0 +1,12 @@
+### About us
+
+More and more corporations want to control our data.
+We want to have full control of our **data** on our own.
+
+### Our mission
+
+Digital independence and privacy, available to everyone
+
+### Target
+
+Develop the program, which will allow everyone to deploy their private services for themselves and their neighbours.
\ No newline at end of file
diff --git a/assets/markdown/about-ka.md b/assets/markdown/about-ka.md
new file mode 100644
index 00000000..3963aa6e
--- /dev/null
+++ b/assets/markdown/about-ka.md
@@ -0,0 +1,12 @@
+### About us
+
+More and more corporations want to control our data.
+We want to have full control of our **data** on our own.
+
+### Our mission
+
+Digital independence and privacy, available to everyone
+
+### Target
+
+Develop the program, which will allow everyone to deploy their private services for themselves and their neighbours.
\ No newline at end of file
diff --git a/assets/markdown/about-nl.md b/assets/markdown/about-nl.md
new file mode 100644
index 00000000..3963aa6e
--- /dev/null
+++ b/assets/markdown/about-nl.md
@@ -0,0 +1,12 @@
+### About us
+
+More and more corporations want to control our data.
+We want to have full control of our **data** on our own.
+
+### Our mission
+
+Digital independence and privacy, available to everyone
+
+### Target
+
+Develop the program, which will allow everyone to deploy their private services for themselves and their neighbours.
\ No newline at end of file
diff --git a/assets/markdown/about-pl.md b/assets/markdown/about-pl.md
new file mode 100644
index 00000000..ebd41246
--- /dev/null
+++ b/assets/markdown/about-pl.md
@@ -0,0 +1,12 @@
+### About us
+
+More and more corporations want to control our data.
+We want to have full control of our **data** on our own.
+
+### Misja projektu
+
+Niezależność i prywatność cyfrowa dostępna dla wszystkich
+
+### Cel
+
+Opracuj program, dzięki któremu każdy będzie mógł stworzyć prywatne usługi dla siebie i swoich bliskich.
\ No newline at end of file
diff --git a/assets/markdown/about-ru.md b/assets/markdown/about-ru.md
index c93abce2..15c0f237 100644
--- a/assets/markdown/about-ru.md
+++ b/assets/markdown/about-ru.md
@@ -5,7 +5,7 @@
### Миссия проекта
-Цифровая независимость и приватность доступная каждому.
+Цифровая независимость и приватность, доступная каждому
### Цель
diff --git a/assets/markdown/about-sk.md b/assets/markdown/about-sk.md
new file mode 100644
index 00000000..d3135d3b
--- /dev/null
+++ b/assets/markdown/about-sk.md
@@ -0,0 +1,12 @@
+### O nás
+
+More and more corporations want to control our data.
+We want to have full control of our **data** on our own.
+
+### Naše poslanie
+
+Digitálna nezávislosť a súkromie dostupné pre každého
+
+### Cieľ
+
+Vytvorte program, ktorý umožní každému vytvoriť súkromné služby pre seba a svojich blízkych.
\ No newline at end of file
diff --git a/assets/markdown/about-th.md b/assets/markdown/about-th.md
new file mode 100644
index 00000000..3963aa6e
--- /dev/null
+++ b/assets/markdown/about-th.md
@@ -0,0 +1,12 @@
+### About us
+
+More and more corporations want to control our data.
+We want to have full control of our **data** on our own.
+
+### Our mission
+
+Digital independence and privacy, available to everyone
+
+### Target
+
+Develop the program, which will allow everyone to deploy their private services for themselves and their neighbours.
\ No newline at end of file
diff --git a/assets/markdown/about-uk.md b/assets/markdown/about-uk.md
new file mode 100644
index 00000000..fee81d64
--- /dev/null
+++ b/assets/markdown/about-uk.md
@@ -0,0 +1,12 @@
+### Про нас
+
+Все більше корпорацій хочуть контролювати свої дані.
+Ми хочемо мати повний контроль над нашими.
+
+### Наша місія
+
+Цифрова незалежність і конфіденційність доступні кожному
+
+### Ціль
+
+Розробити програму, яка дозволить кожному розгорнути свої приватні послуги для себе та їх сусідів.
\ No newline at end of file
diff --git a/assets/markdown/how_backblaze-be.md b/assets/markdown/how_backblaze-be.md
new file mode 100644
index 00000000..76e364e3
--- /dev/null
+++ b/assets/markdown/how_backblaze-be.md
@@ -0,0 +1,8 @@
+### Як атрымаць Backblaze API Token
+1. Перайдзіце па спасылцы https://secure.backblaze.com/user_signin.htm і аўтарызуйцеся
+2. У левай частцы інтэрфейсу абярыце **App Keys** y **B2 Cloud Storage** падкатэгорыі.
+3. Націсніце на сінюю кнопку **Generate New Master Application Key**.
+4. Пацвердзіце стварэнне ва ўсплываючым акне.
+5. Схавайце _keyID_ і _applicationKey_ у бяспечным месце. Напрыклад, у мэнеджэры пароляў.
+
+![Атрыманіе токена Backblaze](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-cs.md b/assets/markdown/how_backblaze-cs.md
new file mode 100644
index 00000000..f1a87840
--- /dev/null
+++ b/assets/markdown/how_backblaze-cs.md
@@ -0,0 +1,8 @@
+### Jak získat Backblaze API Token
+1. Navštivte následující odkaz a autorizujte se: https://secure.backblaze.com/user_signin.htm
+2. V levé části rozhraní vyberte položku **App Keys** v podkategorii **B2 Cloud Storage**.
+3. Klikněte na modré tlačítko **Generate New Master Application Key** (Vygenerovat nový hlavní aplikační klíč**).
+4. V zobrazeném vyskakovacím okně potvrďte vygenerování.
+5. Save _keyID_ and _applicationKey_ in the safe place.. Například ve správci hesel.
+
+![Nastavení tokenu Backblaze](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-de.md b/assets/markdown/how_backblaze-de.md
new file mode 100644
index 00000000..a9ef0c1c
--- /dev/null
+++ b/assets/markdown/how_backblaze-de.md
@@ -0,0 +1,8 @@
+### So erhalten Sie das Backblaze-API-Token
+1. Besuchen Sie den folgenden Link und melden Sie sich an: https://secure.backblaze.com/user_signin.htm
+2. Wählen Sie auf der linken Seite der Benutzeroberfläche **App Keys** in der Unterkategorie **B2 Cloud Storage** aus.
+3. Klicken Sie auf die blaue Schaltfläche **Generate New Master Application Key**.
+4. Bestätigen Sie im erscheinenden Popup-Fenster die Generierung.
+5. Speichern Sie _keyID_ und _applicationKey_ an einem sicheren Ort. Zum Beispiel im Passwort-Manager.
+
+![Backblaze token Einrichtung](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-es.md b/assets/markdown/how_backblaze-es.md
new file mode 100644
index 00000000..b1e341d1
--- /dev/null
+++ b/assets/markdown/how_backblaze-es.md
@@ -0,0 +1,8 @@
+### How to get Backblaze API Token
+1. Visit the following link and authorize: https://secure.backblaze.com/user_signin.htm
+2. On the left side of the interface, select **App Keys** in the **B2 Cloud Storage** subcategory.
+3. Click on the blue **Generate New Master Application Key** button.
+4. In the appeared pop-up window confirm the generation.
+5. Save _keyID_ and _applicationKey_ in the safe place. For example, in the password manager.
+
+![Backblaze token setup](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-fr.md b/assets/markdown/how_backblaze-fr.md
new file mode 100644
index 00000000..b1e341d1
--- /dev/null
+++ b/assets/markdown/how_backblaze-fr.md
@@ -0,0 +1,8 @@
+### How to get Backblaze API Token
+1. Visit the following link and authorize: https://secure.backblaze.com/user_signin.htm
+2. On the left side of the interface, select **App Keys** in the **B2 Cloud Storage** subcategory.
+3. Click on the blue **Generate New Master Application Key** button.
+4. In the appeared pop-up window confirm the generation.
+5. Save _keyID_ and _applicationKey_ in the safe place. For example, in the password manager.
+
+![Backblaze token setup](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-it.md b/assets/markdown/how_backblaze-it.md
new file mode 100644
index 00000000..b1e341d1
--- /dev/null
+++ b/assets/markdown/how_backblaze-it.md
@@ -0,0 +1,8 @@
+### How to get Backblaze API Token
+1. Visit the following link and authorize: https://secure.backblaze.com/user_signin.htm
+2. On the left side of the interface, select **App Keys** in the **B2 Cloud Storage** subcategory.
+3. Click on the blue **Generate New Master Application Key** button.
+4. In the appeared pop-up window confirm the generation.
+5. Save _keyID_ and _applicationKey_ in the safe place. For example, in the password manager.
+
+![Backblaze token setup](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-ja.md b/assets/markdown/how_backblaze-ja.md
new file mode 100644
index 00000000..b1e341d1
--- /dev/null
+++ b/assets/markdown/how_backblaze-ja.md
@@ -0,0 +1,8 @@
+### How to get Backblaze API Token
+1. Visit the following link and authorize: https://secure.backblaze.com/user_signin.htm
+2. On the left side of the interface, select **App Keys** in the **B2 Cloud Storage** subcategory.
+3. Click on the blue **Generate New Master Application Key** button.
+4. In the appeared pop-up window confirm the generation.
+5. Save _keyID_ and _applicationKey_ in the safe place. For example, in the password manager.
+
+![Backblaze token setup](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-ka.md b/assets/markdown/how_backblaze-ka.md
new file mode 100644
index 00000000..b1e341d1
--- /dev/null
+++ b/assets/markdown/how_backblaze-ka.md
@@ -0,0 +1,8 @@
+### How to get Backblaze API Token
+1. Visit the following link and authorize: https://secure.backblaze.com/user_signin.htm
+2. On the left side of the interface, select **App Keys** in the **B2 Cloud Storage** subcategory.
+3. Click on the blue **Generate New Master Application Key** button.
+4. In the appeared pop-up window confirm the generation.
+5. Save _keyID_ and _applicationKey_ in the safe place. For example, in the password manager.
+
+![Backblaze token setup](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-nl.md b/assets/markdown/how_backblaze-nl.md
new file mode 100644
index 00000000..b1e341d1
--- /dev/null
+++ b/assets/markdown/how_backblaze-nl.md
@@ -0,0 +1,8 @@
+### How to get Backblaze API Token
+1. Visit the following link and authorize: https://secure.backblaze.com/user_signin.htm
+2. On the left side of the interface, select **App Keys** in the **B2 Cloud Storage** subcategory.
+3. Click on the blue **Generate New Master Application Key** button.
+4. In the appeared pop-up window confirm the generation.
+5. Save _keyID_ and _applicationKey_ in the safe place. For example, in the password manager.
+
+![Backblaze token setup](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-pl.md b/assets/markdown/how_backblaze-pl.md
new file mode 100644
index 00000000..a14ec3ed
--- /dev/null
+++ b/assets/markdown/how_backblaze-pl.md
@@ -0,0 +1,8 @@
+### Jak otrzymać Backblaze API Token
+1. Odwiedź poniższy link i autoryzuj: https://secure.backblaze.com/user_signin.htm
+2. Po lewej stronie wybierz **App Keys** w podkategorіі **B2 Cloud Storage**.
+3. Naciśnij **Generate New Master Application Key**.
+4. W wyświetlonym oknie podręcznym potwierdź generację.
+5. Zapisz _keyID_ i _applicationKey_ w bezpiecznym miejscu. Na przykład w menedżerze haseł.
+
+![Otrzymanie tokena Backblaze](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-ru.md b/assets/markdown/how_backblaze-ru.md
index 2938f1cb..27beb7e7 100644
--- a/assets/markdown/how_backblaze-ru.md
+++ b/assets/markdown/how_backblaze-ru.md
@@ -5,4 +5,4 @@
4. Во всплывающем окне подтверждаем генерацию.
5. Сохраняем _keyID_ и _applicationKey_ в надёжном месте. Например в менеджере паролей.
-![Backblaze token setup](resource:assets/images/gifs/Backblaze.gif)
+![Получение токена Backblaze](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-sk.md b/assets/markdown/how_backblaze-sk.md
new file mode 100644
index 00000000..7736c858
--- /dev/null
+++ b/assets/markdown/how_backblaze-sk.md
@@ -0,0 +1,8 @@
+### Ako získať token API spoločnosti Backblaze
+1. Navštívte nasledujúci odkaz a autorizujte sa: https://secure.backblaze.com/user_signin.htm
+2. Na ľavej strane rozhrania vyberte položku **App Keys** v podkategórii **B2 Cloud Storage** podkategória.
+3. Kliknite na modré tlačidlo **Generate New Master Application Key**.
+4. V zobrazenom pop-up okne potvrďte generovanie.
+5. Uložte _keyID_ and _applicationKey_ in bezpečné miesto. Napríklad v správcovi hesiel.
+
+![Prijatie tokenu Backblaze](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-th.md b/assets/markdown/how_backblaze-th.md
new file mode 100644
index 00000000..b1e341d1
--- /dev/null
+++ b/assets/markdown/how_backblaze-th.md
@@ -0,0 +1,8 @@
+### How to get Backblaze API Token
+1. Visit the following link and authorize: https://secure.backblaze.com/user_signin.htm
+2. On the left side of the interface, select **App Keys** in the **B2 Cloud Storage** subcategory.
+3. Click on the blue **Generate New Master Application Key** button.
+4. In the appeared pop-up window confirm the generation.
+5. Save _keyID_ and _applicationKey_ in the safe place. For example, in the password manager.
+
+![Backblaze token setup](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_backblaze-uk.md b/assets/markdown/how_backblaze-uk.md
new file mode 100644
index 00000000..115aeec9
--- /dev/null
+++ b/assets/markdown/how_backblaze-uk.md
@@ -0,0 +1,8 @@
+## Як отримати Backblaze API токен
+1. Перейдіть за посиланням і авторизуйте: https://secure.backblaze.com/user_signin.htm
+2. У лівій частині інтерфейсу виберіть **App Keys** у підкатегорії **B2 Cloud Storage**.
+3. Натисніть кнопку синій **Створити новий майстер-ключ програми**.
+4. У з'явилось спливаюче вікно підтверджують покоління.
+5. Save _KeyID_ and _applicationKey_ in the safe place. Наприклад, в менеджері паролів.
+
+![Backblaze токен налаштування](resource:assets/images/gifs/Backblaze.gif)
diff --git a/assets/markdown/how_cloudflare-be.md b/assets/markdown/how_cloudflare-be.md
new file mode 100644
index 00000000..7cf9c11f
--- /dev/null
+++ b/assets/markdown/how_cloudflare-be.md
@@ -0,0 +1,17 @@
+### Як атрымаць токен Cloudflare API
+1. Перайдзіце па наступнай спасылцы: https://dash.cloudflare.com/
+2. У правым куце націсніце на значок профілю (чалавек у крузе). Для мабільнай версіі сайта ў левым верхнім куце націсніце кнопку **Menu** (тры гарызантальныя палоскі), у выпадальным меню націсніце **My Profile**.
+3. Ёсць чатыры катэгорыі канфігурацыі на выбар: *Communication*, *Authentication*, **API Tokens**, *Session*. Выберыце **API Tokens**.
+4. Націсніце на кнопку **Create Token**.
+5. Спусціцеся ўніз і паглядзіце поле **Create Custom Token** і націсніце кнопку **Get Started** справа.
+6. У полі **Token Name** дайце назву токену.
+7. Далей у нас налады. У крайнім левым полі абярыце **Zone**. У самым доўгім полі па цэнтры абярыце **DNS**. У крайнім правым полі абярыце **Edit**.
+8. Далей прама пад гэтым радком націсніце «Дадаць яшчэ». З'явіцца аналагічнае поле.
+9. У самым левым полі новага радка выберыце аналагічна папярэдняму радку — **Zone**. У цэнтры — крыху іншае. Тут абярыце тое ж, што і злева — **Zone**. У крайнім правым полі абярыце **Read**.
+10. Далей паглядзіце на **Resources Zone**. Пад гэтым надпісам радок з двума палямі. Злева павінна быць **Include**, а справа павінна быць **Specific Zone**. Пасля таго як вы выберыце канкрэтную зону, справа з'явіцца іншае поле. Выберыце ў ім свой дамен.
+11. Прагартайце ўніз і націсніце сінюю кнопку **Continue to Summary**.
+12. Правер, ці ўсё ў цябе правільна. Аналагічны радок павінен прысутнічаць: *Domain — DNS:Edit, Zone:Read*.
+13. Націсніце на **Create Token**.
+14. Створаны токен капіюем і захоўваем у надзейным месцы (пажадана ў мэнэджару пароляў).
+
+![Настройка токену Cloudfire](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-cs.md b/assets/markdown/how_cloudflare-cs.md
new file mode 100644
index 00000000..8dc86bb4
--- /dev/null
+++ b/assets/markdown/how_cloudflare-cs.md
@@ -0,0 +1,17 @@
+### Jak získat token API Cloudflare
+1. Přejděte na následující odkaz: https://dash.cloudflare.com/.
+2. V pravém rohu klikněte na ikonu profilu (mužík v kruhu). V případě mobilní verze webu klikněte v levém horním rohu na **Menu** (tři vodorovné pruhy), v rozbalovací nabídce klikněte na **My profile**.
+Na výběr jsou čtyři kategorie nastavení: *Communication*, *Authentication*, **API Tokens**, *Session*. Vyberte možnost **API Tokens**.
+4. Klikněte na tlačítko **Create Token**.
+5. Přejděte dolů, zobrazte pole **Create Custom Token** a klikněte na tlačítko **Get Started** vpravo.
+6. V poli **Token Name** pojmenujte svůj token.
+7. Dále máme přístupová práva. V poli zcela vlevo vyberte možnost **Zone**. V nejdelším poli uprostřed vyberte položku **DNS**. V pravém krajním poli vyberte možnost **Edit**.
+8. Poté hned pod tímto řádkem klepněte na tlačítko Přidat další. Zobrazí se podobné pole.
+9. Na zcela levé straně nového řádku vyberte totéž co u předchozího řádku - **Zone**. Prostřední pole se mírně liší. Zde vyberte totéž co na levém okraji - **Zone**. Na pravém okraji zcela vpravo vyberte možnost **Read**.
+10. Dále se podívejte na položku **Zone Resources**. Pod ním se nachází řádek se dvěma poli. V levém z nich by mělo být uvedeno **Include** a v pravém **Specific Zone**. Jakmile vyberete možnost Specifická zóna, objeví se vpravo další pole. V něm vyberte svou doménu.
+11. Přejděte úplně dolů a klikněte na modré tlačítko **Continue to Summary**.
+12. Zkontrolujte, zda jste vše provedli správně. Měl by se objevit podobný řádek: *Domain - DNS:Edit, Zone:Read*.
+13. Klepněte na tlačítko **Create Token**.
+14. Zkopírujte vytvořený token a uložte jej na bezpečné místo (nejlépe do správce hesel).
+
+![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-de.md b/assets/markdown/how_cloudflare-de.md
new file mode 100644
index 00000000..4b81e00f
--- /dev/null
+++ b/assets/markdown/how_cloudflare-de.md
@@ -0,0 +1,17 @@
+### Wie man Cloudflare API Token bekommt
+1. Besuchen Sie den folgenden link: https://dash.cloudflare.com/
+2. Klicken Sie in der rechten Ecke auf das Profilsymbol (ein Mann in einem Kreis). Bei der mobilen Version der Website klicken Sie in der oberen linken Ecke auf die Schaltfläche **Menu** (drei horizontale Balken), im Dropdown-Menü klicken Sie auf **My Profile**
+3. Es gibt vier Konfigurationskategorien, aus denen Sie wählen können: *Communication*, *Authentication*, **API Tokens**, *Session*. Wählen Sie **API Tokens**.
+4. Klicken Sie auf die Schaltfläche **Create Token**.
+5. Gehen Sie nach unten und sehen Sie das Feld **Create Custom Token** und klicken Sie auf der rechten Seite auf die Schaltfläche **Get Started**.
+6. Geben Sie in das Feld **Token Name** einen Namen für Ihr Token ein.
+7. Als nächstes folgen die Berechtigungen. Wählen Sie im Feld ganz links **Zone**. Wählen Sie im längsten Feld in der Mitte **DNS**. Wählen Sie im Feld ganz rechts **Edit**.
+8. Klicken Sie anschließend direkt unter dieser Zeile auf Add More. Ein ähnliches Feld wird angezeigt.
+9. Wählen Sie im ganz linken Feld der neuen Zeile, ähnlich wie in der letzten Zeile, **Zone**. In der Mitte - ein wenig anders. Wählen Sie hier dasselbe wie in der linken Zeile - **Zone**. Im Feld ganz rechts wählen Sie **Read**.
+10. Als nächstes sehen Sie sich **Zone Resources** an. Unter dieser Aufschrift befindet sich eine Zeile mit zwei Feldern. Auf der linken Seite muss **Include** und auf der rechten Seite **Specific Zone** stehen. Sobald Sie Spezifische Zone auswählen, erscheint rechts ein weiteres Feld. Wählen Sie dort Ihre Domain aus.
+11. Streichen Sie nach unten und drücken Sie die blaue Schaltfläche **Continue to Summary**.
+12. Überprüfen Sie, ob Sie alles richtig gemacht haben. Eine ähnliche Zeichenfolge muss vorhanden sein: *Domain — DNS:Edit, Zone:Read*.
+13. Klicken Sie auf **Create Token**.
+14. Kopieren Sie das erstellte Token und speichern Sie es an einem zuverlässigen Ort (vorzugsweise im Passwort-Manager).
+
+![Cloudflare token Einrichtung](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-es.md b/assets/markdown/how_cloudflare-es.md
new file mode 100644
index 00000000..61fb4b4e
--- /dev/null
+++ b/assets/markdown/how_cloudflare-es.md
@@ -0,0 +1,17 @@
+### How to get Cloudflare API Token
+1. Visit the following link: https://dash.cloudflare.com/
+2. the right corner, click on the profile icon (a man in a circle). For the mobile version of the site, in the upper left corner, click the **Menu** button (three horizontal bars), in the dropdown menu, click on **My Profile**
+3. There are four configuration categories to choose from: *Communication*, *Authentication*, **API Tokens**, *Session*. Choose **API Tokens**.
+4. Click on **Create Token** button.
+5. Go down to the bottom and see the **Create Custom Token** field and press **Get Started** button on the right side.
+6. In the **Token Name** field, give your token a name.
+7. Next we have Permissions. In the leftmost field, select **Zone**. In the longest field, center, select **DNS**. In the rightmost field, select **Edit**.
+8. Next, right under this line, click Add More. Similar field will appear.
+9. In the leftmost field of the new line, select, similar to the last line — **Zone**. In the center — a little different. Here choose the same as in the left — **Zone**. In the rightmost field, select **Read**.
+10. Next look at **Zone Resources**. Under this inscription there is a line with two fields. The left must have **Include** and the right must have **Specific Zone**. Once you select Specific Zone, another field appears on the right. Choose your domain in it.
+11. Flick to the bottom and press the blue **Continue to Summary** button.
+12. Check if you got everything right. A similar string must be present: *Domain — DNS:Edit, Zone:Read*.
+13. Click on **Create Token**.
+14. We copy the created token, and save it in a reliable place (preferably in the password manager).
+
+![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-fr.md b/assets/markdown/how_cloudflare-fr.md
new file mode 100644
index 00000000..61fb4b4e
--- /dev/null
+++ b/assets/markdown/how_cloudflare-fr.md
@@ -0,0 +1,17 @@
+### How to get Cloudflare API Token
+1. Visit the following link: https://dash.cloudflare.com/
+2. the right corner, click on the profile icon (a man in a circle). For the mobile version of the site, in the upper left corner, click the **Menu** button (three horizontal bars), in the dropdown menu, click on **My Profile**
+3. There are four configuration categories to choose from: *Communication*, *Authentication*, **API Tokens**, *Session*. Choose **API Tokens**.
+4. Click on **Create Token** button.
+5. Go down to the bottom and see the **Create Custom Token** field and press **Get Started** button on the right side.
+6. In the **Token Name** field, give your token a name.
+7. Next we have Permissions. In the leftmost field, select **Zone**. In the longest field, center, select **DNS**. In the rightmost field, select **Edit**.
+8. Next, right under this line, click Add More. Similar field will appear.
+9. In the leftmost field of the new line, select, similar to the last line — **Zone**. In the center — a little different. Here choose the same as in the left — **Zone**. In the rightmost field, select **Read**.
+10. Next look at **Zone Resources**. Under this inscription there is a line with two fields. The left must have **Include** and the right must have **Specific Zone**. Once you select Specific Zone, another field appears on the right. Choose your domain in it.
+11. Flick to the bottom and press the blue **Continue to Summary** button.
+12. Check if you got everything right. A similar string must be present: *Domain — DNS:Edit, Zone:Read*.
+13. Click on **Create Token**.
+14. We copy the created token, and save it in a reliable place (preferably in the password manager).
+
+![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-it.md b/assets/markdown/how_cloudflare-it.md
new file mode 100644
index 00000000..61fb4b4e
--- /dev/null
+++ b/assets/markdown/how_cloudflare-it.md
@@ -0,0 +1,17 @@
+### How to get Cloudflare API Token
+1. Visit the following link: https://dash.cloudflare.com/
+2. the right corner, click on the profile icon (a man in a circle). For the mobile version of the site, in the upper left corner, click the **Menu** button (three horizontal bars), in the dropdown menu, click on **My Profile**
+3. There are four configuration categories to choose from: *Communication*, *Authentication*, **API Tokens**, *Session*. Choose **API Tokens**.
+4. Click on **Create Token** button.
+5. Go down to the bottom and see the **Create Custom Token** field and press **Get Started** button on the right side.
+6. In the **Token Name** field, give your token a name.
+7. Next we have Permissions. In the leftmost field, select **Zone**. In the longest field, center, select **DNS**. In the rightmost field, select **Edit**.
+8. Next, right under this line, click Add More. Similar field will appear.
+9. In the leftmost field of the new line, select, similar to the last line — **Zone**. In the center — a little different. Here choose the same as in the left — **Zone**. In the rightmost field, select **Read**.
+10. Next look at **Zone Resources**. Under this inscription there is a line with two fields. The left must have **Include** and the right must have **Specific Zone**. Once you select Specific Zone, another field appears on the right. Choose your domain in it.
+11. Flick to the bottom and press the blue **Continue to Summary** button.
+12. Check if you got everything right. A similar string must be present: *Domain — DNS:Edit, Zone:Read*.
+13. Click on **Create Token**.
+14. We copy the created token, and save it in a reliable place (preferably in the password manager).
+
+![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-ja.md b/assets/markdown/how_cloudflare-ja.md
new file mode 100644
index 00000000..61fb4b4e
--- /dev/null
+++ b/assets/markdown/how_cloudflare-ja.md
@@ -0,0 +1,17 @@
+### How to get Cloudflare API Token
+1. Visit the following link: https://dash.cloudflare.com/
+2. the right corner, click on the profile icon (a man in a circle). For the mobile version of the site, in the upper left corner, click the **Menu** button (three horizontal bars), in the dropdown menu, click on **My Profile**
+3. There are four configuration categories to choose from: *Communication*, *Authentication*, **API Tokens**, *Session*. Choose **API Tokens**.
+4. Click on **Create Token** button.
+5. Go down to the bottom and see the **Create Custom Token** field and press **Get Started** button on the right side.
+6. In the **Token Name** field, give your token a name.
+7. Next we have Permissions. In the leftmost field, select **Zone**. In the longest field, center, select **DNS**. In the rightmost field, select **Edit**.
+8. Next, right under this line, click Add More. Similar field will appear.
+9. In the leftmost field of the new line, select, similar to the last line — **Zone**. In the center — a little different. Here choose the same as in the left — **Zone**. In the rightmost field, select **Read**.
+10. Next look at **Zone Resources**. Under this inscription there is a line with two fields. The left must have **Include** and the right must have **Specific Zone**. Once you select Specific Zone, another field appears on the right. Choose your domain in it.
+11. Flick to the bottom and press the blue **Continue to Summary** button.
+12. Check if you got everything right. A similar string must be present: *Domain — DNS:Edit, Zone:Read*.
+13. Click on **Create Token**.
+14. We copy the created token, and save it in a reliable place (preferably in the password manager).
+
+![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-ka.md b/assets/markdown/how_cloudflare-ka.md
new file mode 100644
index 00000000..61fb4b4e
--- /dev/null
+++ b/assets/markdown/how_cloudflare-ka.md
@@ -0,0 +1,17 @@
+### How to get Cloudflare API Token
+1. Visit the following link: https://dash.cloudflare.com/
+2. the right corner, click on the profile icon (a man in a circle). For the mobile version of the site, in the upper left corner, click the **Menu** button (three horizontal bars), in the dropdown menu, click on **My Profile**
+3. There are four configuration categories to choose from: *Communication*, *Authentication*, **API Tokens**, *Session*. Choose **API Tokens**.
+4. Click on **Create Token** button.
+5. Go down to the bottom and see the **Create Custom Token** field and press **Get Started** button on the right side.
+6. In the **Token Name** field, give your token a name.
+7. Next we have Permissions. In the leftmost field, select **Zone**. In the longest field, center, select **DNS**. In the rightmost field, select **Edit**.
+8. Next, right under this line, click Add More. Similar field will appear.
+9. In the leftmost field of the new line, select, similar to the last line — **Zone**. In the center — a little different. Here choose the same as in the left — **Zone**. In the rightmost field, select **Read**.
+10. Next look at **Zone Resources**. Under this inscription there is a line with two fields. The left must have **Include** and the right must have **Specific Zone**. Once you select Specific Zone, another field appears on the right. Choose your domain in it.
+11. Flick to the bottom and press the blue **Continue to Summary** button.
+12. Check if you got everything right. A similar string must be present: *Domain — DNS:Edit, Zone:Read*.
+13. Click on **Create Token**.
+14. We copy the created token, and save it in a reliable place (preferably in the password manager).
+
+![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-nl.md b/assets/markdown/how_cloudflare-nl.md
new file mode 100644
index 00000000..61fb4b4e
--- /dev/null
+++ b/assets/markdown/how_cloudflare-nl.md
@@ -0,0 +1,17 @@
+### How to get Cloudflare API Token
+1. Visit the following link: https://dash.cloudflare.com/
+2. the right corner, click on the profile icon (a man in a circle). For the mobile version of the site, in the upper left corner, click the **Menu** button (three horizontal bars), in the dropdown menu, click on **My Profile**
+3. There are four configuration categories to choose from: *Communication*, *Authentication*, **API Tokens**, *Session*. Choose **API Tokens**.
+4. Click on **Create Token** button.
+5. Go down to the bottom and see the **Create Custom Token** field and press **Get Started** button on the right side.
+6. In the **Token Name** field, give your token a name.
+7. Next we have Permissions. In the leftmost field, select **Zone**. In the longest field, center, select **DNS**. In the rightmost field, select **Edit**.
+8. Next, right under this line, click Add More. Similar field will appear.
+9. In the leftmost field of the new line, select, similar to the last line — **Zone**. In the center — a little different. Here choose the same as in the left — **Zone**. In the rightmost field, select **Read**.
+10. Next look at **Zone Resources**. Under this inscription there is a line with two fields. The left must have **Include** and the right must have **Specific Zone**. Once you select Specific Zone, another field appears on the right. Choose your domain in it.
+11. Flick to the bottom and press the blue **Continue to Summary** button.
+12. Check if you got everything right. A similar string must be present: *Domain — DNS:Edit, Zone:Read*.
+13. Click on **Create Token**.
+14. We copy the created token, and save it in a reliable place (preferably in the password manager).
+
+![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-pl.md b/assets/markdown/how_cloudflare-pl.md
new file mode 100644
index 00000000..2cfb615b
--- /dev/null
+++ b/assets/markdown/how_cloudflare-pl.md
@@ -0,0 +1,17 @@
+### Jak uzyskać token API Cloudflare'a
+1. Przejdź pod następujący link: https://dash.cloudflare.com/.
+2. W prawym rogu kliknij ikonę profilu (człowiek w kółku). W przypadku wersji mobilnej strony, w lewym górnym rogu kliknij **Menu** (trzy poziome paski), w rozwijanym menu kliknij **My Profile**.
+Do wyboru są cztery kategorie ustawień: *Communication*, *Authentication*, **API Tokens**, *Session*. Należy wybrać **API Tokens**.
+4. Kliknij przycisk **Create token**.
+5. Zjedź na dół, zobacz pole **Create Custom Token** i kliknij przycisk **Get Started** po prawej stronie.
+6. W polu **Token Name** nadaj nazwę swojemu tokenowi.
+7. Następnie mamy prawa dostępu. W skrajnie lewym polu wybierz **Zone**. W najdłuższym polu, środkowym, wybierz **DNS**. W skrajnie prawym polu wybierz **Edit**.
+8. Następnie, tuż pod tym wierszem, kliknij Add more. Pojawi się podobne pole.
+9. W skrajnie lewej części nowej linii wybierz to samo, co w poprzedniej linii - **Zone**. Środkowe pole jest nieco inne. Tutaj wybierz to samo, co na lewym marginesie - **Zone**. W skrajnie prawym marginesie wybierz **Read**.
+10. Następnie spójrz na **Strefę zasobów**. Poniżej tego znajduje się linia z dwoma polami. W lewym powinno być **Include**, a w prawym **Specific Zone**. Gdy wybierzesz Specific Zone, po prawej stronie pojawi się kolejne pole. Wybierz w nim swoją domenę.
+11. Przejdź na sam dół i kliknij niebieski przycisk **Continue to Summary**.
+12. Sprawdź, czy wszystko zrobiłeś poprawnie. Powinna pojawić się podobna linia: *Domain - DNS:Edit, Zone:Read*.
+13. Kliknij na **Create Token**.
+14. Skopiuj utworzony token i zapisz go w bezpiecznym miejscu (najlepiej w menedżerze haseł).
+
+![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-ru.md b/assets/markdown/how_cloudflare-ru.md
index d6cc0072..0eb2fca9 100644
--- a/assets/markdown/how_cloudflare-ru.md
+++ b/assets/markdown/how_cloudflare-ru.md
@@ -1,18 +1,17 @@
-### Как получить Cloudflare API Token
-1. Переходим по [ссылке](https://dash.cloudflare.com/) и авторизуемся в ранее созданном аккаунте. https://dash.cloudflare.com/
-2. В правом верхнем углу кликаем на иконку профиля (для мобильной версии сайта: в верхнем левом углу нажимаем кнопку **Меню** с тремя горизонтальными полосками). В выпавшем меню кликаем на пункт **My Profile**.
-![My profile](resource:assets/images/pics/myprofile.png)
-3. Нам предлагается на выбор, четыре категории настройки: **Preferences**, **Authentication**, **API Tokens**, **Sessions**. Выбираем **API Tokens**.
-4. Самым первым пунктом видим кнопку **Create Token**. С полной уверенностью в себе и желанием обрести приватность, нажимаем на неё.
-5. Спускаемся в самый низ и видим поле **Create Custom Token** и кнопку **Get Started** с правой стороны. Нажимаем.
-6. В поле **Token Name** даём своему токену имя. Можете покреативить и отнестись к этому как к наименованию домашнего зверька :)
-7. Далее, у нас **Permissions**. В первом поле выбираем **Zone**. Во втором поле, по центру, выбираем **DNS**. В последнем поле выбираем **Edit**.
-8. Нажимаем на синюю надпись снизу **+ Add more** (сразу же под левым полем которое мы заполняли ранее). Вуаля, у нас появились новые поля. Заполняем по аналогии с предыдущим пунктом, в первом поле выбираем **Zone**, во-втором тоже **Zone**. А уже в третьем нажимаем на **Read**. Давайте сверим с тем, что у вас получилось:
-![Permissions](resource:assets/images/pics/permissions.png)
-8. Далее смотрим на **Zone Resources**. Под этой надписью есть строка с двумя полями. В первом должно быть **Include**, а во втором — **Specific Zone**. Как только Вы выберите **Specific Zone**, справа появится ещё одно поле. В нём выбираем наш домен.
-9. Листаем в самый низ и нажимаем на синюю кнопку **Continue to Summary**.
-10. Проверяем, всё ли мы правильно выбрали. Должна присутствовать подобная строка: ваш.домен — **DNS:Edit, Zone:Read**.
-11. Нажимаем **Create Token**.
-12. Копируем созданный токен, и сохраняем его в надёжном месте (желательно — в менеджере паролей).
+### Как получить токен API Cloudflare
+1. Перейдите по следующей ссылке: https://dash.cloudflare.com/.
+2. В правом углу нажмите на значок профиля (человечек в круге). Для мобильной версии сайта: в левом верхнем углу нажмите на кнопку **Menu** (три горизонтальные полоски), в выпадающем меню нажмите на **My Profile**.
+3. На выбор предлагаются четыре категории настроек: *Communication*, *Authentication*, **API Tokens**, *Session*. Выберите **API Tokens**.
+4. Нажмите на кнопку **Create token**.
+5. Спуститесь в самый низ, увидите поле **Create Custom Token** и нажмите кнопку **Get Started** справа.
+6. В поле **Token Name** дайте имя вашему токену.
+7. Далее у нас есть права доступа. В крайнем левом поле выберите **Zone**. В самом длинном поле, по центру, выберите **DNS**. В крайнем правом поле выберите **Edit**.
+8. Далее, прямо под этой строкой, нажмите **Добавить еще**. Появится аналогичное поле.
+9. В крайнем левом поле новой строки выберите, аналогично предыдущей строке - **Zone**. В центральном - немного иначе. Здесь выберите то же, что и в левом - **Zone**. В крайнем правом поле выберите **Read**.
+10. Далее посмотрите на **Resources Zone**. Под этой надписью находится строка с двумя полями. В левом должно быть **Include**, а в правом - **Specific Zone**. Как только вы выберете Specific Zone, справа появится еще одно поле. Выберите в нем свой домен.
+11. Перейдите в самый низ и нажмите синюю кнопку **Continue to Summary**.
+12. Проверьте, все ли вы сделали правильно. Должна присутствовать аналогичная строка: *Domain - DNS:Edit, Zone:Read*.
+13. Нажмите на **Create Token**.
+14. Копируем созданный токен и сохраняем его в надежном месте (желательно в менеджере паролей).
![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-sk.md b/assets/markdown/how_cloudflare-sk.md
new file mode 100644
index 00000000..63df2bd4
--- /dev/null
+++ b/assets/markdown/how_cloudflare-sk.md
@@ -0,0 +1,17 @@
+### Ako získať token API Cloudflare
+1. Navštívte nasledujúce prepojenie: https://dash.cloudflare.com/
+2. V pravom rohu kliknite na ikonu profilu (muž v kruhu). V prípade mobilnej verzie stránky kliknite v ľavom hornom rohu na tlačidlo **Menu** (tri vodorovné pruhy), v rozbaľovacej ponuke kliknite na **My profile**
+3. Na výber sú štyri kategórie konfigurácie: *Communication*, *Authentication*, **Toky API**, *Session*. Vyberte **API Tokens**.
+4. Kliknite na tlačidlo **Create Token**.
+5. Prejdite na spodnú časť a zobrazte pole **Create Custom Token** a stlačte tlačidlo **Get Started** na pravej strane.
+6. V poli **Token Name** zadajte svoj token.
+7. Ďalej tu máme položku Permissions. V ľavom krajnom poli vyberte položku **Zone**. V najdlhšom poli uprostred vyberte položku **DNS**. V krajnom pravom poli vyberte položku **Edit**.
+8. Ďalej priamo pod týmto riadkom kliknite na položku **Pridať ďalšie**. Zobrazí sa podobné pole.
+9. V krajnom ľavom poli nového riadku vyberte podobne ako v predchádzajúcom riadku - **Zone**. V strede - trochu inak. Tu vyberte rovnako ako v ľavom poli - **Zone**. V krajnom pravom poli vyberte položku **Read**.
+10. Ďalej sa pozrite na položku **Zone Resources**. Pod týmto nápisom sa nachádza riadok s dvoma poľami. V ľavom musí byť uvedené **Include** a v pravom **Specific Zone**. Keď vyberiete položku **Špecifická zóna**, vpravo sa objaví ďalšie pole. V ňom vyberte svoju doménu.
+11. Prejdite na spodnú časť a stlačte modré tlačidlo **Continue to Summary**.
+12. Skontrolujte, či máte všetko správne. Musí sa vyskytovať podobný reťazec: *Domain — DNS:Edit, Zone:Read*.
+13. Kliknite na **Create Token**.
+14. Vytvorený token skopírujeme a uložíme ho na spoľahlivé miesto (najlepšie do správcu hesiel).
+
+![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-th.md b/assets/markdown/how_cloudflare-th.md
new file mode 100644
index 00000000..61fb4b4e
--- /dev/null
+++ b/assets/markdown/how_cloudflare-th.md
@@ -0,0 +1,17 @@
+### How to get Cloudflare API Token
+1. Visit the following link: https://dash.cloudflare.com/
+2. the right corner, click on the profile icon (a man in a circle). For the mobile version of the site, in the upper left corner, click the **Menu** button (three horizontal bars), in the dropdown menu, click on **My Profile**
+3. There are four configuration categories to choose from: *Communication*, *Authentication*, **API Tokens**, *Session*. Choose **API Tokens**.
+4. Click on **Create Token** button.
+5. Go down to the bottom and see the **Create Custom Token** field and press **Get Started** button on the right side.
+6. In the **Token Name** field, give your token a name.
+7. Next we have Permissions. In the leftmost field, select **Zone**. In the longest field, center, select **DNS**. In the rightmost field, select **Edit**.
+8. Next, right under this line, click Add More. Similar field will appear.
+9. In the leftmost field of the new line, select, similar to the last line — **Zone**. In the center — a little different. Here choose the same as in the left — **Zone**. In the rightmost field, select **Read**.
+10. Next look at **Zone Resources**. Under this inscription there is a line with two fields. The left must have **Include** and the right must have **Specific Zone**. Once you select Specific Zone, another field appears on the right. Choose your domain in it.
+11. Flick to the bottom and press the blue **Continue to Summary** button.
+12. Check if you got everything right. A similar string must be present: *Domain — DNS:Edit, Zone:Read*.
+13. Click on **Create Token**.
+14. We copy the created token, and save it in a reliable place (preferably in the password manager).
+
+![Cloudflare token setup](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_cloudflare-uk.md b/assets/markdown/how_cloudflare-uk.md
new file mode 100644
index 00000000..27e3a5c4
--- /dev/null
+++ b/assets/markdown/how_cloudflare-uk.md
@@ -0,0 +1,17 @@
+### Як отримати токен Cloudflare API
+1. Перейдіть за цим посиланням: https://dash.cloudflare.com/
+2. В правому куті натисніть на іконку профілю (людина в колі). Для мобільної версії сайту, у верхньому лівому кутку натисніть кнопку **Menu** (три горизонтальні смужки), у випадаючому меню натисніть **My profile**
+3. Є чотири категорії конфігурації на вибір: *Communication*, *Authentication*, **API Tokens**, *Session*. Виберіть **API Tokens**.
+4. Натисніть кнопку **Create Token**.
+5. Спустіться вниз і перегляньте поле **Create Custom Token** і натисніть кнопку **Get Started** праворуч.
+6. У полі **Назва токена** введіть назву токена.
+7. Далі у нас є Дозволи. У крайньому лівому полі виберіть **Zone**. У найдовшому полі по центру виберіть **DNS**. У крайньому правому полі виберіть **Edit**.
+8. Далі прямо під цим рядком натисніть «Add more». З'явиться аналогічне поле.
+9. У крайньому лівому полі нового рядка виберіть, як і в останньому рядку, — **Zone**. У центрі — трохи інше. Тут вибираємо те саме, що й зліва — **Zone**. У крайньому правому полі виберіть **Read**.
+10. Далі подивіться на **Zone Resources**. Під цим написом — рядок із двома полями. Ліворуч має бути **Include**, а праворуч має бути **Specific Zone**. Після вибору «Specific Zone» праворуч з’явиться ще одне поле. Виберіть у ньому свій домен.
+11. Прокрутіть униз і натисніть синю кнопку **Continue to Summary**.
+12. Перевірте, чи все ви зробили правильно. Подібний рядок має бути присутнім: *Domain — DNS:Edit, Zone:Read*.
+13. Натисніть **Create Token**.
+14. Копіюємо створений токен і зберігаємо в надійному місці (бажано в менеджері паролів).
+
+![Cloudflare налаштування токена](resource:assets/images/gifs/CloudFlare.gif)
diff --git a/assets/markdown/how_desec-en.md b/assets/markdown/how_desec-en.md
new file mode 100644
index 00000000..b5bac67c
--- /dev/null
+++ b/assets/markdown/how_desec-en.md
@@ -0,0 +1,9 @@
+### How to get deSEC API Token
+1. Log in at: https://desec.io/login
+2. Go to **Domains** page at: https://desec.io/domains
+3. Go to **Token management** tab.
+4. Click on the round "plus" button in the upper right corner.
+5. **"Generate New Token"** dialogue must be displayed. Enter any **Token name** you wish. *Advanced settings* are not required, so do not touch anything there.
+6. Click on **Save**.
+7. Make sure you save the token's "**secret value**" as it will only be displayed once.
+8. Now you can safely **close** the dialogue.
\ No newline at end of file
diff --git a/assets/markdown/how_desec-ru.md b/assets/markdown/how_desec-ru.md
new file mode 100644
index 00000000..a93acc77
--- /dev/null
+++ b/assets/markdown/how_desec-ru.md
@@ -0,0 +1,9 @@
+### Как получить deSEC API Токен
+1. Авторизуемся в deSEC: https://desec.io/login
+2. Переходим на страницу **Domains** по ссылке: https://desec.io/domains
+3. Переходим на вкладку **Token management**.
+4. Нажимаем на большую кнопку с плюсом в правом верхнем углу страницы.
+5. Должен был появиться **"Generate New Token"** диалог. Вводим любое имя токена в **Token name**. *Advanced settings* необязательны, так что ничего там не трогаем.
+6. Кликаем **Save**.
+7. Обязательно сохраняем "**secret value**" ключ токена, потому что он отображается исключительно один раз.
+8. Теперь спокойно закрываем диалог, нажав **close**.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-be.md b/assets/markdown/how_digital_ocean-be.md
new file mode 100644
index 00000000..d817db12
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-be.md
@@ -0,0 +1,12 @@
+### Як атрымаць токен Digital Ocean API
+1. Перайдзіце па наступнай [link](https://cloud.digitalocean.com/) і падпішыцеся
+ у толькі што створаны ўліковы запіс.
+2. Увайдзіце ў раней створаны праект. Калі вы яго не стварылі,
+ тады, калі ласка, працягвайце.
+3. Перайдзіце па спасылцы "API" на панэлі злева.
+4. Націсніце на кнопку "Generation New Token".
+5. Увядзіце любую назву токена.
+6. Усталюйце час заканчэння тэрміну дзеяння на "No Expiry".
+7. Усталюйце сцяжок "Write (optional)".
+8. Цяпер націсніце на кнопку "Generate Token".
+9. Пасля гэтага будзе паказаны токен. Захоўвайце яго ў любым надзейным месцы, пажадана ў менеджэры пароляў.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-cs.md b/assets/markdown/how_digital_ocean-cs.md
new file mode 100644
index 00000000..9d20f2dd
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-cs.md
@@ -0,0 +1,12 @@
+### Jak získat token API Digital Ocean
+1. Navštivte následující [link](https://cloud.digitalocean.com/) a podepište se.
+ k nově vytvořenému účtu.
+2. Vstupte do dříve vytvořeného projektu. Pokud jste žádný nevytvořili,
+ pak prosím pokračujte.
+3. Přejděte na odkaz "API" na levé liště.
+4. Klikněte na tlačítko "Generate New Token" (Vygenerovat nový token).
+5. Zadejte libovolný název tokenu.
+6. Nastavte dobu platnosti na "No expiry".
+7. Zaškrtněte políčko "Write (optional)".
+8. Nyní klikněte na tlačítko "Generate Token".
+9. Poté se zobrazí token. Uložte jej na libovolné spolehlivé místo, nejlépe do správce hesel.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-de.md b/assets/markdown/how_digital_ocean-de.md
new file mode 100644
index 00000000..79c04259
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-de.md
@@ -0,0 +1,12 @@
+### So erhalten Sie das Digital Ocean API-Token
+1. Besuchen Sie den folgenden [link](https://cloud.digitalocean.com/) und melden Sie sich
+ in das neu erstellte Konto an.
+2. Gehen Sie in ein zuvor erstelltes Projekt. Wenn Sie noch keine erstellt haben,
+ dann bitte fortfahren.
+3. Gehen Sie zum Link "API" in der linken Leiste.
+4. Klicken Sie auf "Generate New Token".
+5. Geben Sie einen beliebigen Namen für das Token ein.
+6. Setzen Sie die Ablaufzeit auf "No expiry".
+7. Aktivieren Sie das Kontrollkästchen "Write (optional)".
+8. Klicken Sie nun auf die Schaltfläche "Generate Token".
+9. Danach wird der Token angezeigt. Bewahren Sie es an einem zuverlässigen Ort auf, vorzugsweise in einem Passwort-Manager.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-en.md b/assets/markdown/how_digital_ocean-en.md
new file mode 100644
index 00000000..dc6355c2
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-en.md
@@ -0,0 +1,12 @@
+### How to get Digital Ocean API Token
+1. Visit the following [link](https://cloud.digitalocean.com/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Go to the "API" link on the left bar.
+4. Click on the "Generate New Token".
+5. Enter any name for the token.
+6. Put expiration time to "No expiry".
+7. Check the "Write (optional)" checkbox.
+8. Now click on the "Generate Token" button.
+9. After that, the token will be shown. Store it in any reliable place, preferably a password manager.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-es.md b/assets/markdown/how_digital_ocean-es.md
new file mode 100644
index 00000000..dc6355c2
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-es.md
@@ -0,0 +1,12 @@
+### How to get Digital Ocean API Token
+1. Visit the following [link](https://cloud.digitalocean.com/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Go to the "API" link on the left bar.
+4. Click on the "Generate New Token".
+5. Enter any name for the token.
+6. Put expiration time to "No expiry".
+7. Check the "Write (optional)" checkbox.
+8. Now click on the "Generate Token" button.
+9. After that, the token will be shown. Store it in any reliable place, preferably a password manager.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-fr.md b/assets/markdown/how_digital_ocean-fr.md
new file mode 100644
index 00000000..dc6355c2
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-fr.md
@@ -0,0 +1,12 @@
+### How to get Digital Ocean API Token
+1. Visit the following [link](https://cloud.digitalocean.com/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Go to the "API" link on the left bar.
+4. Click on the "Generate New Token".
+5. Enter any name for the token.
+6. Put expiration time to "No expiry".
+7. Check the "Write (optional)" checkbox.
+8. Now click on the "Generate Token" button.
+9. After that, the token will be shown. Store it in any reliable place, preferably a password manager.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-it.md b/assets/markdown/how_digital_ocean-it.md
new file mode 100644
index 00000000..dc6355c2
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-it.md
@@ -0,0 +1,12 @@
+### How to get Digital Ocean API Token
+1. Visit the following [link](https://cloud.digitalocean.com/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Go to the "API" link on the left bar.
+4. Click on the "Generate New Token".
+5. Enter any name for the token.
+6. Put expiration time to "No expiry".
+7. Check the "Write (optional)" checkbox.
+8. Now click on the "Generate Token" button.
+9. After that, the token will be shown. Store it in any reliable place, preferably a password manager.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-ja.md b/assets/markdown/how_digital_ocean-ja.md
new file mode 100644
index 00000000..dc6355c2
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-ja.md
@@ -0,0 +1,12 @@
+### How to get Digital Ocean API Token
+1. Visit the following [link](https://cloud.digitalocean.com/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Go to the "API" link on the left bar.
+4. Click on the "Generate New Token".
+5. Enter any name for the token.
+6. Put expiration time to "No expiry".
+7. Check the "Write (optional)" checkbox.
+8. Now click on the "Generate Token" button.
+9. After that, the token will be shown. Store it in any reliable place, preferably a password manager.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-ka.md b/assets/markdown/how_digital_ocean-ka.md
new file mode 100644
index 00000000..dc6355c2
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-ka.md
@@ -0,0 +1,12 @@
+### How to get Digital Ocean API Token
+1. Visit the following [link](https://cloud.digitalocean.com/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Go to the "API" link on the left bar.
+4. Click on the "Generate New Token".
+5. Enter any name for the token.
+6. Put expiration time to "No expiry".
+7. Check the "Write (optional)" checkbox.
+8. Now click on the "Generate Token" button.
+9. After that, the token will be shown. Store it in any reliable place, preferably a password manager.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-nl.md b/assets/markdown/how_digital_ocean-nl.md
new file mode 100644
index 00000000..dc6355c2
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-nl.md
@@ -0,0 +1,12 @@
+### How to get Digital Ocean API Token
+1. Visit the following [link](https://cloud.digitalocean.com/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Go to the "API" link on the left bar.
+4. Click on the "Generate New Token".
+5. Enter any name for the token.
+6. Put expiration time to "No expiry".
+7. Check the "Write (optional)" checkbox.
+8. Now click on the "Generate Token" button.
+9. After that, the token will be shown. Store it in any reliable place, preferably a password manager.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-pl.md b/assets/markdown/how_digital_ocean-pl.md
new file mode 100644
index 00000000..42496f98
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-pl.md
@@ -0,0 +1,12 @@
+### Jak uzyskać token API Digital Ocean
+1. Wejdź na stronę [link](https://cloud.digitalocean.com/) i zaloguj się
+ na konto, które właśnie utworzyłeś.
+2. Zaloguj się do wcześniej utworzonego projektu. Jeśli jeszcze nie utworzyłeś projektu,
+ to przejdź dalej.
+3. Kliknij na link "API" w lewym panelu.
+4. Kliknij na przycisk "Generate New Token".
+5. Wprowadź dowolną nazwę dla tokena.
+6. Ustaw datę wygaśnięcia na "No expiry".
+7. Zaznacz pole wyboru "Write (optional)".
+8. Teraz kliknij przycisk "Generate Token".
+9. Na ekranie pojawi się wówczas token. Przechowuj go w dowolnym bezpiecznym miejscu, najlepiej w menedżerze haseł.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-ru.md b/assets/markdown/how_digital_ocean-ru.md
new file mode 100644
index 00000000..ad3ddaa3
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-ru.md
@@ -0,0 +1,12 @@
+### Как получить API-токен Digital Ocean
+1. Перейдите по следующей [link](https://cloud.digitalocean.com/) и войдите
+ в только что созданную учетную запись.
+2. Войдите в ранее созданный проект. Если вы еще не создали проект,
+ тогда приступайте.
+3. Перейдите по ссылке "API" на левой панели.
+4. Нажмите на кнопку "Generate New Token".
+5. Введите любое имя для токена.
+6. Установите срок действия на "No expiry".
+7. Установите флажок "Write (optional)".
+8. Теперь нажмите на кнопку "Generate Token".
+9. После этого на экране появится токен. Сохраните его в любом надежном месте, лучше всего в менеджере паролей.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-sk.md b/assets/markdown/how_digital_ocean-sk.md
new file mode 100644
index 00000000..92b7561f
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-sk.md
@@ -0,0 +1,12 @@
+### Ako získať token API Digital Ocean
+1. Navštívte nasledujúci [link](https://cloud.digitalocean.com/) a prihláste sa
+ do novo vytvoreného účtu.
+2. Vstúpte do predtým vytvoreného projektu. Ak ste ho ešte nevytvorili,
+ potom pokračujte ďalej.
+3. Prejdite na odkaz "API" na ľavej lište.
+4. Kliknite na tlačidlo "Generate New Token".
+5. Zadajte ľubovoľný názov tokenu.
+6. Nastavte čas vypršania platnosti na "No expiry".
+7. Začiarknite políčko "Write (optional)" zaškrtávacie políčko.
+8. Teraz kliknite na tlačidlo "Generate Token" tlačidlo.
+9. Potom sa zobrazí token. Uložte ho na akékoľvek spoľahlivé miesto, najlepšie do správcu hesiel.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-th.md b/assets/markdown/how_digital_ocean-th.md
new file mode 100644
index 00000000..dc6355c2
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-th.md
@@ -0,0 +1,12 @@
+### How to get Digital Ocean API Token
+1. Visit the following [link](https://cloud.digitalocean.com/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Go to the "API" link on the left bar.
+4. Click on the "Generate New Token".
+5. Enter any name for the token.
+6. Put expiration time to "No expiry".
+7. Check the "Write (optional)" checkbox.
+8. Now click on the "Generate Token" button.
+9. After that, the token will be shown. Store it in any reliable place, preferably a password manager.
\ No newline at end of file
diff --git a/assets/markdown/how_digital_ocean-uk.md b/assets/markdown/how_digital_ocean-uk.md
new file mode 100644
index 00000000..dc6355c2
--- /dev/null
+++ b/assets/markdown/how_digital_ocean-uk.md
@@ -0,0 +1,12 @@
+### How to get Digital Ocean API Token
+1. Visit the following [link](https://cloud.digitalocean.com/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Go to the "API" link on the left bar.
+4. Click on the "Generate New Token".
+5. Enter any name for the token.
+6. Put expiration time to "No expiry".
+7. Check the "Write (optional)" checkbox.
+8. Now click on the "Generate Token" button.
+9. After that, the token will be shown. Store it in any reliable place, preferably a password manager.
\ No newline at end of file
diff --git a/assets/markdown/how_fallback_old-be.md b/assets/markdown/how_fallback_old-be.md
new file mode 100644
index 00000000..0f3b619d
--- /dev/null
+++ b/assets/markdown/how_fallback_old-be.md
@@ -0,0 +1,3 @@
+У наступным акне увядзіце токен, атрыманы з кансолі папярэдняй версіі прыкладання.
+
+Увядзіце яго без слова *Bearer*.
diff --git a/assets/markdown/how_fallback_old-cs.md b/assets/markdown/how_fallback_old-cs.md
new file mode 100644
index 00000000..2080eded
--- /dev/null
+++ b/assets/markdown/how_fallback_old-cs.md
@@ -0,0 +1,3 @@
+V dalším okně zadejte token získaný z konzoly předchozí verze aplikace.
+
+Zadejte ji bez slova *Bearer*.
diff --git a/assets/markdown/how_fallback_old-de.md b/assets/markdown/how_fallback_old-de.md
new file mode 100644
index 00000000..c00d7799
--- /dev/null
+++ b/assets/markdown/how_fallback_old-de.md
@@ -0,0 +1,3 @@
+Geben Sie im nächsten Fenster das Token ein, das Sie von der Konsole der vorherigen Version der Anwendung erhalten haben.
+
+Geben Sie es ohne das Wort *Bearer* ein.
diff --git a/assets/markdown/how_fallback_old-es.md b/assets/markdown/how_fallback_old-es.md
new file mode 100644
index 00000000..c12504e7
--- /dev/null
+++ b/assets/markdown/how_fallback_old-es.md
@@ -0,0 +1,3 @@
+In the next window, enter the token obtained from the console of the previous version of the application.
+
+Enter it without the word *Bearer*.
diff --git a/assets/markdown/how_fallback_old-fr.md b/assets/markdown/how_fallback_old-fr.md
new file mode 100644
index 00000000..c12504e7
--- /dev/null
+++ b/assets/markdown/how_fallback_old-fr.md
@@ -0,0 +1,3 @@
+In the next window, enter the token obtained from the console of the previous version of the application.
+
+Enter it without the word *Bearer*.
diff --git a/assets/markdown/how_fallback_old-it.md b/assets/markdown/how_fallback_old-it.md
new file mode 100644
index 00000000..c12504e7
--- /dev/null
+++ b/assets/markdown/how_fallback_old-it.md
@@ -0,0 +1,3 @@
+In the next window, enter the token obtained from the console of the previous version of the application.
+
+Enter it without the word *Bearer*.
diff --git a/assets/markdown/how_fallback_old-ja.md b/assets/markdown/how_fallback_old-ja.md
new file mode 100644
index 00000000..c12504e7
--- /dev/null
+++ b/assets/markdown/how_fallback_old-ja.md
@@ -0,0 +1,3 @@
+In the next window, enter the token obtained from the console of the previous version of the application.
+
+Enter it without the word *Bearer*.
diff --git a/assets/markdown/how_fallback_old-ka.md b/assets/markdown/how_fallback_old-ka.md
new file mode 100644
index 00000000..c12504e7
--- /dev/null
+++ b/assets/markdown/how_fallback_old-ka.md
@@ -0,0 +1,3 @@
+In the next window, enter the token obtained from the console of the previous version of the application.
+
+Enter it without the word *Bearer*.
diff --git a/assets/markdown/how_fallback_old-nl.md b/assets/markdown/how_fallback_old-nl.md
new file mode 100644
index 00000000..c12504e7
--- /dev/null
+++ b/assets/markdown/how_fallback_old-nl.md
@@ -0,0 +1,3 @@
+In the next window, enter the token obtained from the console of the previous version of the application.
+
+Enter it without the word *Bearer*.
diff --git a/assets/markdown/how_fallback_old-pl.md b/assets/markdown/how_fallback_old-pl.md
new file mode 100644
index 00000000..e5c2f114
--- /dev/null
+++ b/assets/markdown/how_fallback_old-pl.md
@@ -0,0 +1,3 @@
+W kolejnym oknie wprowadź token uzyskany z konsoli poprzedniej wersji aplikacji.
+
+Należy wpisać bez słowa *Bearer*.
diff --git a/assets/markdown/how_fallback_old-sk.md b/assets/markdown/how_fallback_old-sk.md
new file mode 100644
index 00000000..2c307149
--- /dev/null
+++ b/assets/markdown/how_fallback_old-sk.md
@@ -0,0 +1,3 @@
+V ďalšom okne zadajte token získaný z konzoly predchádzajúcej verzie aplikácie.
+
+Musíte vstúpiť bez slova *Bearer*.
diff --git a/assets/markdown/how_fallback_old-th.md b/assets/markdown/how_fallback_old-th.md
new file mode 100644
index 00000000..c12504e7
--- /dev/null
+++ b/assets/markdown/how_fallback_old-th.md
@@ -0,0 +1,3 @@
+In the next window, enter the token obtained from the console of the previous version of the application.
+
+Enter it without the word *Bearer*.
diff --git a/assets/markdown/how_fallback_old-uk.md b/assets/markdown/how_fallback_old-uk.md
new file mode 100644
index 00000000..2d02d3fe
--- /dev/null
+++ b/assets/markdown/how_fallback_old-uk.md
@@ -0,0 +1,3 @@
+У наступне вікно введіть токен, отриманий з консолі попередньої версії програми.
+
+Введіть його без слова *bearer*.
diff --git a/assets/markdown/how_fallback_ssh-be.md b/assets/markdown/how_fallback_ssh-be.md
new file mode 100644
index 00000000..3ad871bc
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-be.md
@@ -0,0 +1,19 @@
+Увайдзіце на ваш сервер як root карыстальнік і праглядзіце змесціва файла `/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+Гэты файл будзе мець падобную канструкцыю:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Скапіруйце токен з файла і ўстаўце яго ў наступнае акно.
diff --git a/assets/markdown/how_fallback_ssh-cs.md b/assets/markdown/how_fallback_ssh-cs.md
new file mode 100644
index 00000000..7b74ac74
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-cs.md
@@ -0,0 +1,19 @@
+Přihlaste se k serveru jako uživatel root a podívejte se na obsah souboru `/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+Tento soubor bude mít podobnou konstrukci:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_ke_zkopírování",
+ "name": "název_zařízení",
+ "date": "datum"
+ }
+```
+
+Zkopírujte token ze souboru a vložte jej do dalšího okna.
diff --git a/assets/markdown/how_fallback_ssh-de.md b/assets/markdown/how_fallback_ssh-de.md
new file mode 100644
index 00000000..f6da0343
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-de.md
@@ -0,0 +1,19 @@
+Melden Sie sich als Root-Benutzer auf Ihrem Server an und sehen Sie sich den Inhalt der Datei `/etc/nixos/userdata/tokens.json` an
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+Diese Datei hat einen ähnlichen Aufbau:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_zum_Kopieren",
+ "name": "Gerätname",
+ "date": "Datum"
+ }
+```
+
+Kopieren Sie das Token aus der Datei und fügen Sie es im nächsten Fenster ein.
diff --git a/assets/markdown/how_fallback_ssh-es.md b/assets/markdown/how_fallback_ssh-es.md
new file mode 100644
index 00000000..ce90e76a
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-es.md
@@ -0,0 +1,19 @@
+Login as root user to your server and look at the contents of the file `/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_ssh-fr.md b/assets/markdown/how_fallback_ssh-fr.md
new file mode 100644
index 00000000..ce90e76a
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-fr.md
@@ -0,0 +1,19 @@
+Login as root user to your server and look at the contents of the file `/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_ssh-it.md b/assets/markdown/how_fallback_ssh-it.md
new file mode 100644
index 00000000..ce90e76a
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-it.md
@@ -0,0 +1,19 @@
+Login as root user to your server and look at the contents of the file `/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_ssh-ja.md b/assets/markdown/how_fallback_ssh-ja.md
new file mode 100644
index 00000000..ce90e76a
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-ja.md
@@ -0,0 +1,19 @@
+Login as root user to your server and look at the contents of the file `/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_ssh-ka.md b/assets/markdown/how_fallback_ssh-ka.md
new file mode 100644
index 00000000..ce90e76a
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-ka.md
@@ -0,0 +1,19 @@
+Login as root user to your server and look at the contents of the file `/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_ssh-nl.md b/assets/markdown/how_fallback_ssh-nl.md
new file mode 100644
index 00000000..ce90e76a
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-nl.md
@@ -0,0 +1,19 @@
+Login as root user to your server and look at the contents of the file `/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_ssh-pl.md b/assets/markdown/how_fallback_ssh-pl.md
new file mode 100644
index 00000000..0e18b3e5
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-pl.md
@@ -0,0 +1,19 @@
+Zaloguj się jako użytkownik root na swoim serwerze i przejrzyj zawartość pliku `/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+W tym pliku będzie podobny wzór:
+
+`json
+{
+ { "tokens": [
+ {
+ { "token": "token_który_był_skopedowany",
+ { "name": "device_name",
+ { "data": "data"
+ }
+```
+
+Skopiuj token z pliku i wklej w kolejnym oknie.
diff --git a/assets/markdown/how_fallback_ssh-sk.md b/assets/markdown/how_fallback_ssh-sk.md
new file mode 100644
index 00000000..bd5d4a86
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-sk.md
@@ -0,0 +1,19 @@
+Prihláste sa ako používateľ root na server a pozrite sa na obsah súboru `/etc/nixos/userdata/tokens.json
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+V tomto súbore bude podobný dizajn:
+
+``json
+{
+ {"tokens": [
+ {
+ {"token": "token_which_has_been_scoped",
+ {"name": "device_name",
+ {"date": "date"
+ }
+```
+
+Skopírujte token zo súboru a vložte ho do ďalšieho okna.
diff --git a/assets/markdown/how_fallback_ssh-th.md b/assets/markdown/how_fallback_ssh-th.md
new file mode 100644
index 00000000..ce90e76a
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-th.md
@@ -0,0 +1,19 @@
+Login as root user to your server and look at the contents of the file `/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_ssh-uk.md b/assets/markdown/how_fallback_ssh-uk.md
new file mode 100644
index 00000000..568d3264
--- /dev/null
+++ b/assets/markdown/how_fallback_ssh-uk.md
@@ -0,0 +1,19 @@
+Увійдіть від користувача root до вашого сервера і подивіться на вміст файла`/etc/nixos/userdata/tokens.json`
+
+```sh
+cat /etc/nixos/userdata/tokens.json
+```
+
+Цей файл буде мати подібну конструкцію:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Скопіюйте токен з файла і вставте його в наступне вікно.
diff --git a/assets/markdown/how_fallback_terminal-be.md b/assets/markdown/how_fallback_terminal-be.md
new file mode 100644
index 00000000..675d3902
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-be.md
@@ -0,0 +1,26 @@
+У панэлі кіравання серверам Hetzner перайдзіце на ўкладку **Rescue**. Затым націсніце на **Enable rescue & power cycle**.
+
+У полі *Choose a Recue OS* выберыце **linux64**, а ў *SSH Key* выберыце свой ключ, калі ён быў дададзены ў ваш уліковы запіс Hetzner.
+
+Націсніце **Enable rescue & power cycle** і дачакайцеся перазагрузкі сервера. На экране адлюструюцца лагін і пароль. Увайдзіце ў сістэму root, выкарыстоўваючы свой лагін і пароль.
+
+Падключыце файлавую сістэму сервера і паглядзіце змесціва файла токена:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+Гэты файл будзе мець падобную канструкцыю:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Скапіруйце токен з файла і ўстаўце яго ў наступнае акно.
diff --git a/assets/markdown/how_fallback_terminal-cs.md b/assets/markdown/how_fallback_terminal-cs.md
new file mode 100644
index 00000000..16a993a1
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-cs.md
@@ -0,0 +1,26 @@
+V ovládacím panelu serveru Hetzner přejděte na kartu **Rescue**. Poté klikněte na možnost **Enable rescue & power cycle**.
+
+V části *Choose a Recue OS* vyberte **linux64** a v části *SSH Key* vyberte svůj klíč, pokud byl přidán do vašeho účtu Hetzner.
+
+Klikněte na tlačítko **Enable rescue & power cycle** a počkejte, až se server restartuje. Na obrazovce se zobrazí přihlašovací jméno a heslo. Přihlaste se k uživateli root pomocí přihlašovacích údajů a hesla.
+
+Připojte souborový systém serveru a zobrazte obsah souboru token:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+Tento soubor bude mít podobnou konstrukci:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_ke_zkopírování",
+ "name": "název_zařízení",
+ "date": "datum"
+ }
+```
+
+Zkopírujte token ze souboru a vložte jej do dalšího okna.
diff --git a/assets/markdown/how_fallback_terminal-de.md b/assets/markdown/how_fallback_terminal-de.md
new file mode 100644
index 00000000..7031612a
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-de.md
@@ -0,0 +1,26 @@
+Gehen Sie im Control Panel des Hetzner-Servers auf den Tab **Rescue**. Klicken Sie dann auf **Enable rescue & power cycle**.
+
+In *Choose a Recue OS* wählen Sie **linux64** aus und in *SSH Key* wählen Sie Ihren Schlüssel aus, wen er zu ihrem Htzner-Konto hinzugefügt wurde.
+
+Klicken Sie auf **Enable rescue & power cycle** und warten Sie, bis der Server neu gestartet wird. Login und Passwort werden auf dem Bildschirm angezeigt. Melden Sie sich mit Ihren Anmelde- und Kennwortinformationen beim Root-Benutzer an.
+
+Mounten Sie Ihr Server-Dateisystem und sehen Sie sich den Inhalt der Token-Datei an:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+Diese Datei hat einen ähnlichen Aufbau:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_zum_Kopieren",
+ "name": "Gerätname",
+ "date": "Datum"
+ }
+```
+
+Kopieren Sie das Token aus der Datei und fügen Sie es im nächsten Fenster ein.
diff --git a/assets/markdown/how_fallback_terminal-es.md b/assets/markdown/how_fallback_terminal-es.md
new file mode 100644
index 00000000..77c97efa
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-es.md
@@ -0,0 +1,26 @@
+In the Hetzner server control panel, go to the **Rescue** tab. Then, click on **Enable rescue & power cycle**.
+
+In *Choose a Recue OS* select **linux64**, and in *SSH Key* select your key if it has been added to your Hetzner account.
+
+Click **Enable rescue & power cycle** and wait for the server to reboot. The login and password will be displayed on the screen. Login to the root user using your login and password information.
+
+Mount your server file system and see the contents of the token file:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_terminal-fr.md b/assets/markdown/how_fallback_terminal-fr.md
new file mode 100644
index 00000000..77c97efa
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-fr.md
@@ -0,0 +1,26 @@
+In the Hetzner server control panel, go to the **Rescue** tab. Then, click on **Enable rescue & power cycle**.
+
+In *Choose a Recue OS* select **linux64**, and in *SSH Key* select your key if it has been added to your Hetzner account.
+
+Click **Enable rescue & power cycle** and wait for the server to reboot. The login and password will be displayed on the screen. Login to the root user using your login and password information.
+
+Mount your server file system and see the contents of the token file:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_terminal-it.md b/assets/markdown/how_fallback_terminal-it.md
new file mode 100644
index 00000000..77c97efa
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-it.md
@@ -0,0 +1,26 @@
+In the Hetzner server control panel, go to the **Rescue** tab. Then, click on **Enable rescue & power cycle**.
+
+In *Choose a Recue OS* select **linux64**, and in *SSH Key* select your key if it has been added to your Hetzner account.
+
+Click **Enable rescue & power cycle** and wait for the server to reboot. The login and password will be displayed on the screen. Login to the root user using your login and password information.
+
+Mount your server file system and see the contents of the token file:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_terminal-ja.md b/assets/markdown/how_fallback_terminal-ja.md
new file mode 100644
index 00000000..77c97efa
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-ja.md
@@ -0,0 +1,26 @@
+In the Hetzner server control panel, go to the **Rescue** tab. Then, click on **Enable rescue & power cycle**.
+
+In *Choose a Recue OS* select **linux64**, and in *SSH Key* select your key if it has been added to your Hetzner account.
+
+Click **Enable rescue & power cycle** and wait for the server to reboot. The login and password will be displayed on the screen. Login to the root user using your login and password information.
+
+Mount your server file system and see the contents of the token file:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_terminal-ka.md b/assets/markdown/how_fallback_terminal-ka.md
new file mode 100644
index 00000000..77c97efa
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-ka.md
@@ -0,0 +1,26 @@
+In the Hetzner server control panel, go to the **Rescue** tab. Then, click on **Enable rescue & power cycle**.
+
+In *Choose a Recue OS* select **linux64**, and in *SSH Key* select your key if it has been added to your Hetzner account.
+
+Click **Enable rescue & power cycle** and wait for the server to reboot. The login and password will be displayed on the screen. Login to the root user using your login and password information.
+
+Mount your server file system and see the contents of the token file:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_terminal-nl.md b/assets/markdown/how_fallback_terminal-nl.md
new file mode 100644
index 00000000..77c97efa
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-nl.md
@@ -0,0 +1,26 @@
+In the Hetzner server control panel, go to the **Rescue** tab. Then, click on **Enable rescue & power cycle**.
+
+In *Choose a Recue OS* select **linux64**, and in *SSH Key* select your key if it has been added to your Hetzner account.
+
+Click **Enable rescue & power cycle** and wait for the server to reboot. The login and password will be displayed on the screen. Login to the root user using your login and password information.
+
+Mount your server file system and see the contents of the token file:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_terminal-pl.md b/assets/markdown/how_fallback_terminal-pl.md
new file mode 100644
index 00000000..2abbe479
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-pl.md
@@ -0,0 +1,26 @@
+W panelu sterowania serwera Hetzner przejdź do zakładki **Rescue**. Następnie kliknij **Enable rescue & power cycle**.
+
+W *Choose a Recue OS* wybierz **linux64**, a w *SSH Key* swój klucz, jeśli został dodany do konta Hetznera.
+
+Naciśnij **Enable rescue & power cycle** i poczekaj na ponowne uruchomienie serwera. Zostanie wyświetlone hasło logowania. Zaloguj się na użytkownika root, używając informacji o loginie i haśle.
+
+Zamontuj system plików swojego serwera i spójrz na zawartość pliku token:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+W tym pliku będzie podobny wzór:
+
+`json
+{
+ { "tokens": [
+ {
+ { "token": "token_który_był_skopedowany",
+ { "name": "device_name",
+ { "data": "data"
+ }
+```
+
+Skopiuj token z pliku i wklej w kolejnym oknie.
diff --git a/assets/markdown/how_fallback_terminal-sk.md b/assets/markdown/how_fallback_terminal-sk.md
new file mode 100644
index 00000000..40a8f231
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-sk.md
@@ -0,0 +1,26 @@
+V ovládacom paneli servera Hetzner prejdite na kartu **Rescue**. Potom kliknite na **Enable rescue & power cycle**.
+
+V časti *Choose a Recue OS* vyberte **linux64** a v časti *SSH Key* vyberte svoj kľúč, ak bol pridaný do vášho účtu Hetzner.
+
+Stlačte tlačidlo **Enable rescue & power cycle** a počkajte, kým sa server reštartuje. Zobrazí sa prihlasovacie heslo. Prihláste sa ako používateľ root pomocou prihlasovacích údajov a hesla.
+
+Pripojte súborový systém servera a pozrite si obsah súboru token:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+V tomto súbore bude podobný dizajn:
+
+``json
+{
+ {"tokens": [
+ {
+ {"token": "token_which_has_been_scoped",
+ {"name": "device_name",
+ {"date": "date"
+ }
+```
+
+Skopírujte token zo súboru a vložte ho do ďalšieho okna.
diff --git a/assets/markdown/how_fallback_terminal-th.md b/assets/markdown/how_fallback_terminal-th.md
new file mode 100644
index 00000000..77c97efa
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-th.md
@@ -0,0 +1,26 @@
+In the Hetzner server control panel, go to the **Rescue** tab. Then, click on **Enable rescue & power cycle**.
+
+In *Choose a Recue OS* select **linux64**, and in *SSH Key* select your key if it has been added to your Hetzner account.
+
+Click **Enable rescue & power cycle** and wait for the server to reboot. The login and password will be displayed on the screen. Login to the root user using your login and password information.
+
+Mount your server file system and see the contents of the token file:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+This file will have a similar construction:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Copy the token from the file and paste it in the next window.
diff --git a/assets/markdown/how_fallback_terminal-uk.md b/assets/markdown/how_fallback_terminal-uk.md
new file mode 100644
index 00000000..c72f9f7e
--- /dev/null
+++ b/assets/markdown/how_fallback_terminal-uk.md
@@ -0,0 +1,26 @@
+На панелі керування сервером Hetzner перейдіть на вкладку **Rescue**. Після цього натисніть кнопку **Enable rescue & power cycle**.
+
+У полі *Choose a Recue OS* виберіть **linux64**, а в *SSH Key* свій ключ, якщо він був доданий у ваш обліковий запис Hetzner.
+
+Натисніть **Enable rescue & power cycle** і зачекайте, поки сервер перезавантажить. На екрані з'явиться логін і пароль. Увійдіть до користувача root за допомогою вашої реєстраційних даних і паролів.
+
+Змонтувати файлову систему вашого сервера і переглянути вміст файла токенів:
+
+```sh
+mount /dev/sda1 /mnt
+cat /mnt/etc/nixos/userdata/tokens.json
+```
+
+Цей файл буде мати подібну конструкцію:
+
+```json
+{
+ "tokens": [
+ {
+ "token": "token_to_copy",
+ "name": "device_name",
+ "date": "date"
+ }
+```
+
+Скопіюйте токен з файла і вставте його в наступне вікно.
diff --git a/assets/markdown/how_hetzner-be.md b/assets/markdown/how_hetzner-be.md
new file mode 100644
index 00000000..758f6ca0
--- /dev/null
+++ b/assets/markdown/how_hetzner-be.md
@@ -0,0 +1,21 @@
+### Як атрымаць Hetzner API Token
+1. Перайдзіце па наступнай [спасылцы](https://console.hetzner.cloud/) і падпішыцеся
+ у толькі што створаны ўліковы запіс.
+2. Увайдзіце ў раней створаны праект. Калі вы яго не стварылі,
+ тады, калі ласка, працягвайце.
+3. Навядзіце курсор мышы на бакавую панэль. Панэль павінна разгарнуцца і паказаць нас
+ меню. Нас цікавіць апошні — **Security** (значок а ключ).
+4. Далей у верхняй частцы інтэрфейсу мы бачым прыблізна
+ наступнае: **SSH Keys, API Tokens, Certificates, Members.** Вы
+ патрэбныя **API Tokens**. Націсніце на яго.
+5. У правай частцы інтэрфейсу павінна быць **Generate API token** button. Калі вы карыстаецеся мабільнай версіяй вэб-старонкі, у
+ у правым ніжнім куце вы ўбачыце **red cross**. Націсніце гэтую кнопку.
+6. У полі **Description** дайце нашаму токену імя (гэта можа быць любое
+ імя, якое вам падабаецца. На сутнасць гэта не ўплывае.
+7. Пад полем **permissions** мы бачым магчымасць выбару
+ **дазволы**. Выберыце **Read & Write**.
+8. Націсніце **Generate API Token.**
+9. Пасля гэтага будзе паказаны наш ключ. Захоўвайце яго ў надзейным месцы,
+ або ў менеджэры пароляў, што лепш.
+
+![Наладжванне маркера Hetzner](рэсурс:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-cs.md b/assets/markdown/how_hetzner-cs.md
new file mode 100644
index 00000000..500efe54
--- /dev/null
+++ b/assets/markdown/how_hetzner-cs.md
@@ -0,0 +1,23 @@
+### Jak získat Hetzner API Token
+1. Navštivte následující [link](https://console.hetzner.cloud/) a podepište se.
+ k nově vytvořenému účtu.
+2. Vstupte do dříve vytvořeného projektu. Pokud jste žádný nevytvořili,
+ pak prosím pokračujte.
+3. Kurzorem myši najeďte na boční panel. Panel by se měl rozbalit a zobrazit nám
+ nabídku. Nás zajímá poslední z nich - **Security** (ikona tzv.
+ klávesy).
+4. Dále v horní části rozhraní vidíme přibližně následující položky
+ následující: ***SSH Keys, API Tokens, Certificates, Members**.
+ potřebujete **API Tokens**. Klepněte na něj.
+5. V pravé části rozhraní by se mělo nacházet **Generate API
+ token** tlačítko. Pokud používáte mobilní verzi og webové stránky, v části
+ pravém dolním rohu uvidíte **červený křížek**. Stiskněte toto tlačítko.
+6. V poli **Description** pojmenujte náš token (může to být libovolný název).
+ název, který se vám líbí. Na podstatu to nemá vliv.
+7. Pod polem **Description** vidíme možnost zvolit si.
+ **Permissions**. Vyberte možnost **Read && Write**.
+8. Klikněte na tlačítko **Generate API Token**.
+9. Poté se zobrazí náš klíč. Uložte jej na spolehlivé místo,
+ nebo ve správci hesel, což je lepší.
+
+![Nastavení tokenu Hetzner](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-de.md b/assets/markdown/how_hetzner-de.md
new file mode 100644
index 00000000..5430c70b
--- /dev/null
+++ b/assets/markdown/how_hetzner-de.md
@@ -0,0 +1,23 @@
+### So erhalten Sie das Hetzner-API-Token
+1. Besuchen Sie den folgenden [link](https://console.hetzner.cloud/) und melden Sie sich
+ in das neu erstellte Konto an.
+2. Gehen Sie in ein zuvor erstelltes Projekt. Wenn Sie noch keine erstellt haben,
+ dann bitte fortfahren.
+3. Bewegen Sie den Mauszeiger über das Seitenpanel. Panel sollte sich erweitern und uns
+ Ein Menü zeigen. Uns interessiert letzteres — **Security** (Symbol eines
+ Schlüssels).
+4. Als nächstes können wir im oberen Teil der Oberfläache ungefähr sehen
+ Folgendes: **SSH Keys, API Tokens, Certificates, Members.** Sie
+ benötigen **API Tokens**. Klicken Sie es an.
+5. Im rechten Teil der Benutzeroberfläche sollte **Generate API
+ Token** stehen. Wenn Sie die mobile Version der Webseite verwenden, in der
+ In der unteren rechten Ecke sehen Sie **red cross**. Drücken Sie diesen Knopf.
+6. Geben Sie im Feld **Description** unserem Token einen Namen (dies kann ein beliebiger Name
+ sein). Es beeinflusst nicht die Essenz.
+7. Unter dem Feld **Description** sehen wir eine Auswahlmöglichkeit
+ **permissions**. Wählen Sie **Read & Write**.
+8. Klicken Sie auf **Generate API Token.**
+9. Danach wird unser Schlüssel angezeigt. Bewahren Sie es an einem zuverlässigen Ort auf,
+ oder im Passwortmanager, was besser ist.
+
+![Hetzner token Einrichtung](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-es.md b/assets/markdown/how_hetzner-es.md
new file mode 100644
index 00000000..6f859c18
--- /dev/null
+++ b/assets/markdown/how_hetzner-es.md
@@ -0,0 +1,23 @@
+### How to get Hetzner API Token
+1. Visit the following [link](https://console.hetzner.cloud/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Hover side panel with mouse cursor. Panel should expand and show us
+ a menu. We're interested in the last one — **Security** (icon of a
+ key).
+4. Next, in the upper part of an interface, we can see approximately
+ the following: **SSH Keys, API Tokens, Certificates, Members.** You
+ need **API Tokens**. Click on it.
+5. In the right part of the interface, there should be **Generate API
+ token** button. If you're using mobile version og a webpage, in the
+ lower right corner you'll see **red cross**. Push that button.
+6. In the **Description** field, give our token a name (this can be any
+ name that you like. It doesn't influence the essence.
+7. Under the **Description** field we can see a possibility to choose
+ **permissions**. Pick **Read & Write**.
+8. Click **Generate API Token.**
+9. After that, our key will be shown. Store it in the reliable place,
+ or in the password manager, which is better.
+
+![Hetzner token setup](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-fr.md b/assets/markdown/how_hetzner-fr.md
new file mode 100644
index 00000000..6f859c18
--- /dev/null
+++ b/assets/markdown/how_hetzner-fr.md
@@ -0,0 +1,23 @@
+### How to get Hetzner API Token
+1. Visit the following [link](https://console.hetzner.cloud/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Hover side panel with mouse cursor. Panel should expand and show us
+ a menu. We're interested in the last one — **Security** (icon of a
+ key).
+4. Next, in the upper part of an interface, we can see approximately
+ the following: **SSH Keys, API Tokens, Certificates, Members.** You
+ need **API Tokens**. Click on it.
+5. In the right part of the interface, there should be **Generate API
+ token** button. If you're using mobile version og a webpage, in the
+ lower right corner you'll see **red cross**. Push that button.
+6. In the **Description** field, give our token a name (this can be any
+ name that you like. It doesn't influence the essence.
+7. Under the **Description** field we can see a possibility to choose
+ **permissions**. Pick **Read & Write**.
+8. Click **Generate API Token.**
+9. After that, our key will be shown. Store it in the reliable place,
+ or in the password manager, which is better.
+
+![Hetzner token setup](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-it.md b/assets/markdown/how_hetzner-it.md
new file mode 100644
index 00000000..6f859c18
--- /dev/null
+++ b/assets/markdown/how_hetzner-it.md
@@ -0,0 +1,23 @@
+### How to get Hetzner API Token
+1. Visit the following [link](https://console.hetzner.cloud/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Hover side panel with mouse cursor. Panel should expand and show us
+ a menu. We're interested in the last one — **Security** (icon of a
+ key).
+4. Next, in the upper part of an interface, we can see approximately
+ the following: **SSH Keys, API Tokens, Certificates, Members.** You
+ need **API Tokens**. Click on it.
+5. In the right part of the interface, there should be **Generate API
+ token** button. If you're using mobile version og a webpage, in the
+ lower right corner you'll see **red cross**. Push that button.
+6. In the **Description** field, give our token a name (this can be any
+ name that you like. It doesn't influence the essence.
+7. Under the **Description** field we can see a possibility to choose
+ **permissions**. Pick **Read & Write**.
+8. Click **Generate API Token.**
+9. After that, our key will be shown. Store it in the reliable place,
+ or in the password manager, which is better.
+
+![Hetzner token setup](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-ja.md b/assets/markdown/how_hetzner-ja.md
new file mode 100644
index 00000000..6f859c18
--- /dev/null
+++ b/assets/markdown/how_hetzner-ja.md
@@ -0,0 +1,23 @@
+### How to get Hetzner API Token
+1. Visit the following [link](https://console.hetzner.cloud/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Hover side panel with mouse cursor. Panel should expand and show us
+ a menu. We're interested in the last one — **Security** (icon of a
+ key).
+4. Next, in the upper part of an interface, we can see approximately
+ the following: **SSH Keys, API Tokens, Certificates, Members.** You
+ need **API Tokens**. Click on it.
+5. In the right part of the interface, there should be **Generate API
+ token** button. If you're using mobile version og a webpage, in the
+ lower right corner you'll see **red cross**. Push that button.
+6. In the **Description** field, give our token a name (this can be any
+ name that you like. It doesn't influence the essence.
+7. Under the **Description** field we can see a possibility to choose
+ **permissions**. Pick **Read & Write**.
+8. Click **Generate API Token.**
+9. After that, our key will be shown. Store it in the reliable place,
+ or in the password manager, which is better.
+
+![Hetzner token setup](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-ka.md b/assets/markdown/how_hetzner-ka.md
new file mode 100644
index 00000000..6f859c18
--- /dev/null
+++ b/assets/markdown/how_hetzner-ka.md
@@ -0,0 +1,23 @@
+### How to get Hetzner API Token
+1. Visit the following [link](https://console.hetzner.cloud/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Hover side panel with mouse cursor. Panel should expand and show us
+ a menu. We're interested in the last one — **Security** (icon of a
+ key).
+4. Next, in the upper part of an interface, we can see approximately
+ the following: **SSH Keys, API Tokens, Certificates, Members.** You
+ need **API Tokens**. Click on it.
+5. In the right part of the interface, there should be **Generate API
+ token** button. If you're using mobile version og a webpage, in the
+ lower right corner you'll see **red cross**. Push that button.
+6. In the **Description** field, give our token a name (this can be any
+ name that you like. It doesn't influence the essence.
+7. Under the **Description** field we can see a possibility to choose
+ **permissions**. Pick **Read & Write**.
+8. Click **Generate API Token.**
+9. After that, our key will be shown. Store it in the reliable place,
+ or in the password manager, which is better.
+
+![Hetzner token setup](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-nl.md b/assets/markdown/how_hetzner-nl.md
new file mode 100644
index 00000000..6f859c18
--- /dev/null
+++ b/assets/markdown/how_hetzner-nl.md
@@ -0,0 +1,23 @@
+### How to get Hetzner API Token
+1. Visit the following [link](https://console.hetzner.cloud/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Hover side panel with mouse cursor. Panel should expand and show us
+ a menu. We're interested in the last one — **Security** (icon of a
+ key).
+4. Next, in the upper part of an interface, we can see approximately
+ the following: **SSH Keys, API Tokens, Certificates, Members.** You
+ need **API Tokens**. Click on it.
+5. In the right part of the interface, there should be **Generate API
+ token** button. If you're using mobile version og a webpage, in the
+ lower right corner you'll see **red cross**. Push that button.
+6. In the **Description** field, give our token a name (this can be any
+ name that you like. It doesn't influence the essence.
+7. Under the **Description** field we can see a possibility to choose
+ **permissions**. Pick **Read & Write**.
+8. Click **Generate API Token.**
+9. After that, our key will be shown. Store it in the reliable place,
+ or in the password manager, which is better.
+
+![Hetzner token setup](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-pl.md b/assets/markdown/how_hetzner-pl.md
new file mode 100644
index 00000000..f16aec17
--- /dev/null
+++ b/assets/markdown/how_hetzner-pl.md
@@ -0,0 +1,23 @@
+### Jak uzyskać Hetzner API Token
+1. Odwiedź następujący [link](https://console.hetzner.cloud/) i zaloguj się
+ na nowo utworzone konto.
+2. Wejdź do wcześniej utworzonego projektu. Jeśli jeszcze go nie stworzyłeś,
+ to proszę przejść dalej.
+3. Najedź kursorem myszy na panel boczny. Panel powinien się rozwinąć i pokazać nam
+ menu. Nas interesuje ostatnie z nich - **Security** (ikona klucza).
+ .
+4. Następnie w górnej części interfejsu możemy zobaczyć ok.
+ następujące elementy: ***SSH Keys, API Tokens, Certificates, Members.**
+Klikamy na nie.
+5. W prawej części interfejsu powinien znajdować się przycisk **Generate API
+ token**. Jeśli korzystasz z mobilnej wersji strony, w prawym dolnym rogu pojawi się
+ dolnym prawym rogu pojawi się **red cross**. Wciśnij ten przycisk.
+6. W polu **Description** nadaj naszemu tokenowi nazwę (może to być dowolna nazwa).
+ nazwa, która Ci się podoba. Nie ma ona wpływu na istotę.
+7. Pod polem **Description** widzimy możliwość wyboru.
+ **permissions**. Pick **Read & Write**.
+8. Klikamy **Generate API Token**.
+9. Po tej czynności pojawi się nasz klucz. Przechowuj go w wiarygodnym miejscu,
+lub w menedżerze haseł, co jest lepsze.
+
+![Ustawienie tokena Hetznera](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-sk.md b/assets/markdown/how_hetzner-sk.md
new file mode 100644
index 00000000..f5ab24dc
--- /dev/null
+++ b/assets/markdown/how_hetzner-sk.md
@@ -0,0 +1,23 @@
+### Ako získať Hetzner API Token
+1. Navštívte nasledujúci [link](https://console.hetzner.cloud/) a prihláste sa
+ do novo vytvoreného účtu.
+2. Vstúpte do predtým vytvoreného projektu. Ak ste ho ešte nevytvorili,
+ potom pokračujte ďalej.
+3. Kurzorom myši prejdite na bočný panel. Panel by sa mal rozbaliť a zobraziť nám
+ ponuku. Zaujíma nás posledné z nich - **Security** (ikona
+ klávesu).
+4. Ďalej v hornej časti rozhrania vidíme približne
+ nasledovné: **SSH Keys, API Tokens, Certificates, Members.**.
+ potrebujete **API Tokens**. Kliknite naň.
+5. V pravej časti rozhrania by sa malo nachádzať **Generate API
+ token** tlačidlo. Ak používate mobilnú verziu og webovej stránky, v časti
+ pravom dolnom rohu uvidíte **red cross**. Stlačte toto tlačidlo.
+6. V poli **Description** uveďte názov nášho tokenu (môže to byť akýkoľvek názov
+ , ktorý sa vám páči. Nemá to vplyv na podstatu.
+7. Pod poľom **Description** vidíme možnosť výberu
+ **permissions**. Vyberte možnosť **Read & Write**.
+8. Kliknite na tlačidlo **Generate API Token.**.
+9. Potom sa zobrazí náš kľúč. Uložte ho na spoľahlivé miesto,
+ alebo v správcovi hesiel, čo je lepšie.
+
+![Nastavenie tokenu Hetzner](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-th.md b/assets/markdown/how_hetzner-th.md
new file mode 100644
index 00000000..6f859c18
--- /dev/null
+++ b/assets/markdown/how_hetzner-th.md
@@ -0,0 +1,23 @@
+### How to get Hetzner API Token
+1. Visit the following [link](https://console.hetzner.cloud/) and sign
+ into newly created account.
+2. Enter into previously created project. If you haven't created one,
+ then please proceed.
+3. Hover side panel with mouse cursor. Panel should expand and show us
+ a menu. We're interested in the last one — **Security** (icon of a
+ key).
+4. Next, in the upper part of an interface, we can see approximately
+ the following: **SSH Keys, API Tokens, Certificates, Members.** You
+ need **API Tokens**. Click on it.
+5. In the right part of the interface, there should be **Generate API
+ token** button. If you're using mobile version og a webpage, in the
+ lower right corner you'll see **red cross**. Push that button.
+6. In the **Description** field, give our token a name (this can be any
+ name that you like. It doesn't influence the essence.
+7. Under the **Description** field we can see a possibility to choose
+ **permissions**. Pick **Read & Write**.
+8. Click **Generate API Token.**
+9. After that, our key will be shown. Store it in the reliable place,
+ or in the password manager, which is better.
+
+![Hetzner token setup](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/markdown/how_hetzner-uk.md b/assets/markdown/how_hetzner-uk.md
new file mode 100644
index 00000000..82f15ce9
--- /dev/null
+++ b/assets/markdown/how_hetzner-uk.md
@@ -0,0 +1,23 @@
+## як отримати Hetzner API токен
+1. Завітайте на наступний [посилання](https://console.hetzner.cloud/) і підпишіться
+на новостворений рахунок.
+2. Введіть раніше створений проект. Якщо ви не створили його,
+тоді, будь ласка, продовжуйте.
+3. Наведіть вказівник на бічну панель з курсором миші. Панель повинна розгорнути і показати нам
+меню. Нас цікавить останній — **БЕЗПЕКА** (значок а
+ключ).
+4. Далі, у верхній частині інтерфейсу, ми можемо побачити приблизно
+Нижче наведено **ключі SSH, ключі API, сертифікати, члени.** Ви
+Потрібно **API-Токени**. Клікніть на нього.
+5. У правій частині інтерфейсу має бути **Generate API
+ токен**. Якщо ви користуєтеся мобільною версією, або веб-сторінкою, в
+у нижньому правому куті ви побачите **червоний хрест**. Натисніть цю кнопку.
+6. У полі **Опис** надайте нашому жетону назву (це може бути будь-яка
+ім'я, яке тобі подобається. Це не впливає на суть.
+7. У полі **Опис** ми можемо побачити можливість вибору
+**дозволи**. Виберіть **Читати і писати**.
+8. Натисніть **Створити ключ API.**
+9. Після цього буде показано наш ключ. Зберігайте його в надійному місці,
+або в менеджері паролів, що краще.
+
+![Hetzner токен налаштування](resource:assets/images/gifs/Hetzner.gif)
diff --git a/assets/translations/az.json b/assets/translations/az.json
new file mode 100644
index 00000000..763d6b61
--- /dev/null
+++ b/assets/translations/az.json
@@ -0,0 +1,501 @@
+{
+ "test": "az-test",
+ "locale": "az",
+ "basis": {
+ "providers": "Provayderlər",
+ "providers_title": "Sizin məlumat mərkəziniz",
+ "select": "Seçin",
+ "services": "Xidmətlər",
+ "users": "İstifadəçilər",
+ "more": "Çox",
+ "next": "Sonrakı",
+ "got_it": "Anladım",
+ "settings": "Parametrlər",
+ "password": "Parol",
+ "create": "Yeni əlavə et",
+ "confirmation": "Təsdiq",
+ "cancel": "Ləğv edin",
+ "delete": "Silin",
+ "close": "Bağla",
+ "connect": "Qoşulmaq",
+ "domain": "Domen",
+ "saving": "Qənaət…",
+ "username": "İstifadəçilər adı",
+ "later": "Keçidin, sonra tənzimləyin",
+ "connect_to_existing": "Mövcud serverə qoşulun",
+ "reset": "Sıfırlayın",
+ "details": "Təfərrüatlar",
+ "no_data": "İnformasiya yoxdur",
+ "wait": "Gözləyin",
+ "remove": "Silin",
+ "done": "Hazır",
+ "continue": "Davam et",
+ "alert": "Bildiriş",
+ "services_title": "Şəxsi, şəxsi və müstəqil xidmətləriniz.",
+ "loading": "Yüklənir…",
+ "apply": "Müraciət edin",
+ "app_name": "SelfPrivacy"
+ },
+ "more_page": {
+ "configuration_wizard": "Quraşdırma Sihirbazı",
+ "onboarding": "Salamlar",
+ "create_ssh_key": "SSH admin açarları",
+ "console": "Konsol",
+ "application_settings": "Tətbiq parametrləri",
+ "about_project": "SelfPrivacy haqqında",
+ "about_application": "Proqram haqqında"
+ },
+ "console_page": {
+ "title": "Konsol",
+ "waiting": "Başlama gözlənilir…",
+ "copy": "Kopyalayın"
+ },
+ "about_application_page": {
+ "application_version_text": "Tətbiq versiyası {}",
+ "api_version_text": "Server API versiyası {}",
+ "privacy_policy": "Gizlilik Siyasəti",
+ "title": "Tətbiq haqqında"
+ },
+ "application_settings": {
+ "title": "Tətbiq parametrləri",
+ "dark_theme_title": "Qaranlıq mövzu",
+ "reset_config_title": "Tətbiq Sıfırlayın",
+ "reset_config_description": "API və Super İstifadəçi Açarlarını sıfırlayın.",
+ "delete_server_title": "Serveri silin",
+ "dark_theme_description": "Rəng mövzusunu dəyişdirin",
+ "delete_server_description": "Əməliyyat serveri siləcək. Bundan sonra o, əlçatmaz olacaq.",
+ "system_dark_theme_title": "Defolt sistem mövzusu",
+ "system_dark_theme_description": "Sistem parametrlərindən asılı olaraq açıq və ya qaranlıq mövzudan istifadə edin",
+ "dangerous_settings": "Təhlükəli Parametrlər"
+ },
+ "ssh": {
+ "title": "SSH açarları",
+ "create": "SSH açarı yaradın",
+ "delete": "SSH açarını silin",
+ "delete_confirm_question": "Növbəti SSH açarı silmək istədiyinizə əminsiniz?",
+ "subtitle_with_keys": "{} açarlar",
+ "subtitle_without_keys": "Açar yoxdur",
+ "no_key_name": "Adsız açar",
+ "root_title": "Bunlar super istifadəçi açarlarıdır",
+ "input_label": "İctimai ED25519 və ya RSA açarı",
+ "root_subtitle": "Burada göstərilən açarların sahibləri server məlumatlarına və parametrlərinə tam giriş əldə edirlər. Yalnız açarlarınızı əlavə edin."
+ },
+ "onboarding": {
+ "page1_title": "Rəqəmsal müstəqillik hər kəs üçün əlçatandır",
+ "page1_text": "Mail, VPN, Messenger, sosial şəbəkə və daha çox şəxsi serverinizdə, tam nəzarətiniz altında.",
+ "page2_title": "SelfPrivacy bulud deyil, şəxsi məlumat mərkəzinizdir",
+ "page2_server_provider_title": "Server provayderi",
+ "page2_dns_provider_title": "DNS provayderi",
+ "page2_dns_provider_text": "İnternetdə olmaq üçün sizə domen lazımdır. Domenin serverinizə işarə etməsi üçün sizə etibarlı DNS server lazımdır. Biz sizə dəstəklənən DNS serverlərindən birini seçməyi və bütün qeydləri avtomatik konfiqurasiya etməyi təklif edəcəyik. Onları əl ilə qurmaq istəyirsiniz? Bu da mümkündür.",
+ "page2_backup_provider_title": "Yedək provayderi",
+ "page2_text": "SelfPrivacy yalnız seçdiyiniz xidmət təminatçıları ilə işləyir. Hesablarınız yoxdursa, onları yaratmağınıza kömək edəcəyik.",
+ "page2_server_provider_text": "Server provayderi öz məlumat mərkəzində serverinizə xidmət göstərəcək. SelfPrivacy avtomatik olaraq ona qoşulacaq və sizin üçün server quracaq.",
+ "page2_backup_provider_text": "Bəs serverə bir şey olarsa? Haker hücumu, xidmətdən imtina və ya sadəcə məlumatların təsadüfən silinməsi? Məlumatlarınız ehtiyat yaddaş provayderinizlə başqa yerdə təhlükəsiz olacaq. Onların hamısı təhlükəsiz şəkildə şifrələnib və siz serverinizi bərpa edə bilərsiniz."
+ },
+ "about_us_page": {
+ "title": "SelfPrivacy haqqında"
+ },
+ "resource_chart": {
+ "month": "Ay",
+ "day": "Gün",
+ "hour": "Saat",
+ "cpu_title": "CPU İstifadəsi",
+ "network_title": "Şəbəkə istifadəsi",
+ "in": "Alındı",
+ "out": "Göndərildi"
+ },
+ "server": {
+ "card_title": "Server",
+ "general_information": "Ümumi məlumat",
+ "resource_usage": "Resurs istehlakı",
+ "allow_autoupgrade": "Avtomatik yeniləmələrə icazə verin",
+ "allow_autoupgrade_hint": "Serverdə yeniləmələrin avtomatik quraşdırılmasına icazə verin",
+ "reboot_after_upgrade": "Yeniləmələrdən sonra yenidən başladın",
+ "description": "Bu, bütün xidmətlərinizin işlədiyi virtual kompüterdir",
+ "reboot_after_upgrade_hint": "Yeniləmələri tətbiq etdikdən sonra serveri avtomatik yenidən başladın",
+ "server_timezone": "Server saat qurşağı",
+ "select_timezone": "Saat qurşağınızı seçin",
+ "timezone_search_bar": "Saat qurşağı adı və ya vaxt ofset dəyəri",
+ "server_id": "Server İD",
+ "status": "Status",
+ "cpu": "CPU",
+ "ram": "RAM yaddaşı",
+ "disk": "Disk",
+ "monthly_cost": "Aylıq xərc",
+ "location": "Yerləşdirmə",
+ "core_count": {
+ "one": "{} nüvəs",
+ "two": "{} nüvələr",
+ "few": "{} nüvələr",
+ "other": "{} nüvələr",
+ "many": "{} nüvələr"
+ }
+ },
+ "record": {
+ "root": "Kök domen",
+ "api": "SelfPrivacy APİ",
+ "cloud": "Fayl buludu",
+ "git": "Git Server",
+ "meet": "Video konfrans",
+ "social": "Sosial Mediya",
+ "password": "Parol meneceri",
+ "vpn": "VPN",
+ "mx": "MX rekordu",
+ "spf": "SPF rekordu",
+ "dkim": "DKIM açarı",
+ "dmarc": "DMARC rekordu"
+ },
+ "domain": {
+ "card_title": "Domen",
+ "screen_title": "Domain və DNS",
+ "ok": "Qeydlər qaydasındadır",
+ "error": "Problemlər tapıldı",
+ "refreshing": "Data yenilənməsi…",
+ "uninitialized": "Data hələ alınmayıb",
+ "services_title": "Servislər",
+ "email_title": "E-poçt",
+ "email_subtitle": "Təhlükəsiz e-poçt mübadiləsi üçün tələb olunan qeydlər.",
+ "update_list": "Siyahını yeniləyin",
+ "error_subtitle": "Düzəltmək üçün bura klikləyin",
+ "services_subtitle": "Xidmətlərin fəaliyyəti üçün “A” tipli qeydlər lazımdır."
+ },
+ "backup": {
+ "card_title": "Ehtiyat nüsxəsi",
+ "reupload_key": "Açar yeniləməsini məcbur edin",
+ "reuploaded_key": "Server açarı yeniləndi",
+ "initialize": "Qurunmaq",
+ "waiting_for_rebuild": "Bir neçə dəqiqədən sonra ilk nüsxəni yarada biləcəksiniz.",
+ "restore": "Kopyadan bərpa edin",
+ "no_backups": "Yedəkləmə hələ yoxdur",
+ "create_new": "Yeni nüsxə yaradın",
+ "creating": "Surəti çıxarmaq: {}%",
+ "restoring": "Kopyadan bərpa edilir",
+ "error_pending": "Server xəta verdi: aşağıda yoxlayın",
+ "restore_alert": "Siz {} tərəfindən yaradılmış nüsxədən bərpa etmək üzrəsiniz. Bütün cari məlumatlar itiriləcək. Sən əminsən?",
+ "refresh": "Statusu yenilə",
+ "refetch_backups": "Kopya siyahısını yeniləyin",
+ "refetching_list": "Siyahı bir neçə dəqiqəyə yenilənəcək",
+ "description": "İstənilən vəziyyətdə sizə kömək edəcək: haker hücumu, serverin silinməsi və s."
+ },
+ "storage": {
+ "card_title": "Server yaddaşı",
+ "status_ok": "Heç bir disk problemi tapılmadı",
+ "status_error": "Disk sahəsi tükənir",
+ "disk_usage": "{} istifadə olunur",
+ "disk_total": "{} ümumi · {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "Bayt",
+ "extend_volume_button": "Yaddaşı genişləndirin",
+ "extending_volume_title": "Yaddaş genişləndirilməsi",
+ "extending_volume_price_info": "Qiymətə ƏDV daxildir və Hetzner tərəfindən təqdim edilən qiymət məlumatlarına əsaslanır. Proses zamanı server yenidən işə salınacaq.",
+ "extending_volume_error": "Yaddaş genişləndirilməsinə başlamaq alınmadı.",
+ "size": "Ölçüsü",
+ "extending_volume_description": "Yaddaş ölçüsünün dəyişdirilməsi, serverin özünü genişləndirmədən serverinizdə daha çox məlumat saxlamağa imkan verəcəkdir. Həcmi yalnız artırmaq olar, onu azaltmaq olmaz.",
+ "data_migration_title": "Məlumat miqrasiya",
+ "data_migration_notice": "Məlumatların köçürülməsi zamanı bütün xidmətlər deaktiv ediləcək.",
+ "start_migration_button": "Miqrasiyaya başlayın",
+ "migration_process": "Köçür…",
+ "migration_done": "Tamamlayın"
+ },
+ "service_page": {
+ "move": "Başqa sürücüyə keçin",
+ "open_in_browser": "Brauzerdə açın",
+ "restart": "Xidməti yenidən başladın",
+ "disable": "Xidməti söndürün",
+ "enable": "Xidməti aktivləşdirin",
+ "uses": "{volume} üzərində {usage} istifadə edir",
+ "status": {
+ "active": "Açılır və qaçır",
+ "inactive": "Dayandı",
+ "failed": "Başlamaq alınmadı",
+ "off": "Əlil",
+ "activating": "Yandırılır",
+ "deactivating": "Söndürür",
+ "reloading": "Yenidən başladıldı"
+ }
+ },
+ "mail": {
+ "login_info": "İstifadəçilər sekmesinden istifadəçi adı və paroldan istifadə edin. IMAP portu: 143, STARTTLS. SMTP portu: 587, STARTTLS.",
+ "title": "E-poçt",
+ "subtitle": "Ailə və ya şirkət üçün e-poçt."
+ },
+ "video": {
+ "subtitle": "Jitsi meet Zoom və Google meet-in əla analoqudur və bu, rahatlıqla yanaşı, yüksək keyfiyyətli video konfransların təhlükəsizliyini təmin edir.",
+ "title": "video konfrans",
+ "login_info": "Hesab tələb olunmur."
+ },
+ "cloud": {
+ "login_info": "Administrator girişi: admin, parol əsas istifadəçi ilə eynidir. NextCloud admin interfeysində yeni istifadəçilər yaradın.",
+ "title": "Fayl bulud",
+ "subtitle": "Bulud xidmətlərinin məlumatlarınıza baxmasının qarşısını alın. NextCloud istifadə edin - bütün məlumatlarınız üçün təhlükəsiz ev."
+ },
+ "git": {
+ "login_info": "Saytda hesab yaradılmalıdır. İlk qeydiyyatdan keçmiş istifadəçi administrator olur.",
+ "title": "Git Server",
+ "subtitle": "Microsoft-a deyil, sizə məxsus şəxsi Github alternativi."
+ },
+ "users": {
+ "not_ready": "Birinci istifadəçini əlavə etmək üçün Provayderlər bölməsində server, domen və DNS-ni birləşdirin",
+ "could_not_fetch_description": "İnternet bağlantısını yoxlayın və yenidən cəhd edin",
+ "username_rule": "Adda yalnız kiçik Latın hərfləri, rəqəmlər, alt xətt ola bilər, rəqəmlərlə başlaya bilməz",
+ "add_new_user": "İlk istifadəçini əlavə edin",
+ "new_user": "Yeni istifadəçi",
+ "delete_user": "İstifadəçini silin",
+ "nobody_here": "İstifadəçilər burada göstəriləcək",
+ "login": "Daxil ol",
+ "new_user_info_note": "Yeni istifadəçi avtomatik olaraq bütün xidmətlərə çıxış əldə edəcək",
+ "delete_confirm_question": "Hesabınızı silmək istədiyinizə əminsiniz?",
+ "reset_password": "Parolu sıfırlayın",
+ "account": "Hesab",
+ "send_registration_data": "Detalları paylaşın",
+ "could_not_fetch_users": "İstifadəçiləri əldə etmək alınmadı",
+ "refresh_users": "İstifadəçi siyahısını yeniləyin",
+ "could_not_create_user": "İstifadəçi yaratmaq alınmadı",
+ "could_not_delete_user": "İstifadəçini silmək alınmadı",
+ "could_not_add_ssh_key": "SSH açarı yaratmaq alınmadı",
+ "email_login": "E-poçt Avtorizasiyası",
+ "no_ssh_notice": "Bu istifadəçi üçün yalnız SSH və E-poçt hesabları yaradılmışdır. Bütün xidmətlər üçün vahid icazə hələ tətbiq edilməyib.",
+ "details_title": "İstifadəçi məlumatları"
+ },
+ "initializing": {
+ "select_provider": "Aşağıda SelfPrivacy tərəfindən dəstəklənən provayderlərin seçimi var",
+ "select_provider_countries_text_do": "ABŞ, Hollandiya, Sinqapur, Böyük Britaniya, Almaniya, Kanada, Hindistan, Avstraliya",
+ "connect_to_server_provider_text": "Token API-dən istifadə edərək SelfPrivacy proqramı sizin adınıza server sifariş edə və konfiqurasiya edə biləcək",
+ "no_locations_found": "Heç bir məkan tapılmadı, lütfən, hesabınızın mövcud olduğundan əmin olun",
+ "choose_server_type_text": "Server resursları hansı xidmətlərin başlaya biləcəyini müəyyənləşdirir. İstənilən vaxt serveri genişləndirə bilərsiniz",
+ "no_server_types_found": "Heç bir mövcud server növləri tapılmadı! Lütfən, server provayderinə girişinizin olduğundan əmin olun...",
+ "server_rebooted": "Server yenidən başladıldı, son yoxlamanı gözləyirik…",
+ "one_more_restart": "İndi təhlükəsizlik sertifikatlarını aktivləşdirmək üçün əlavə reboot olacaq.",
+ "connect_to_server": "Serverdən başlayaq.",
+ "select_provider_notice": "“Kiçik server” dedikdə biz iki prosessor xətti və iki giqabayt operativ yaddaşa malik serveri nəzərdə tuturuq.",
+ "select_provider_countries_title": "Mövcud ölkələr",
+ "select_provider_countries_text_hetzner": "Almaniya, Finlandiya, ABŞ",
+ "select_provider_price_title": "Orta qiymət",
+ "select_provider_price_text_hetzner": "Kiçik bir server və 50 GB disk sahəsi üçün ayda € 8",
+ "select_provider_price_text_do": "Kiçik server və 50 GB disk sahəsi üçün ayda $17",
+ "select_provider_payment_title": "Ödəmə metodları",
+ "select_provider_payment_text_hetzner": "Bank kartları, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_do": "Bank kartları, Google Pay, PayPal",
+ "select_provider_email_notice": "Yeni müştərilər üçün e-poçt hostinqi mövcud deyil. İlk ödənişdən sonra onu açmaq mümkün olacaq.",
+ "select_provider_site_button": "Saytı ziyarət edin",
+ "connect_to_server_provider": "Giriş ",
+ "how": "API Tokenini necə əldə etmək olar",
+ "provider_bad_key_error": "Provayder API açarı yanlışdır",
+ "could_not_connect": "Provayderə qoşulmaq alınmadı.",
+ "choose_location_type": "Harada server sifariş etmək olar?",
+ "choose_location_type_text": "Mövcud konfiqurasiyalar, qiymətlər və serverə qoşulma sürətiniz yer seçimindən asılı olacaq.",
+ "locations_not_found": "Vay!",
+ "locations_not_found_text": "Bu məkanda icarəyə verilə bilən server yoxdur",
+ "back_to_locations": "Başqasını seçək",
+ "choose_server_type": "Hansı server növünü seçmək lazımdır?",
+ "choose_server_type_notice": "Diqqət etməli olduğunuz əsas şey prosessor iplərinin sayı və RAM miqdarıdır. Xidmət məlumatları ayrıca ödənilən və asanlıqla genişləndirilə bilən ayrıca diskdə yerləşdiriləcək.",
+ "choose_server_type_ram": "RAM üçün {} GB",
+ "choose_server_type_storage": "{} GB sistem yaddaşı",
+ "choose_server_type_payment_per_month": "{} aylıq",
+ "backblaze_bad_key_error": "Backblaze vault haqqında məlumat yanlışdır",
+ "select_dns": "İndi DNS provayderini seçək",
+ "manage_domain_dns": "Domeninizin DNS-ni idarə etmək üçün",
+ "use_this_domain": "Biz bu domendən istifadə edirik?",
+ "use_this_domain_text": "Göstərdiyiniz token bu domen üzərində nəzarəti təmin edir",
+ "connect_backblaze_storage": "Backblaze bulud yaddaşınızı birləşdirin",
+ "no_connected_domains": "Hazırda heç bir bağlı domen yoxdur",
+ "loading_domain_list": "Domenlərin siyahısı yüklənir",
+ "found_more_domains": "Birdən çox domen tapıldı, təhlükəsizliyiniz üçün lazımsız domenləri silin",
+ "save_domain": "Domeni yadda saxla",
+ "final": "Son addım",
+ "create_server": "Server yaradın",
+ "what": "Bunun mənası nədi?",
+ "server_started": "Server işləyir. İndi yoxlanılacaq və yenidən işə salınacaq…",
+ "server_created": "Server yaradıldı. DNS ünvanları yoxlanılır və server işə salınır…",
+ "until_the_next_check": "Növbəti yoxlamaya qədər: ",
+ "check": "Yoxlanış",
+ "create_master_account": "Əsas hesab yaradın",
+ "enter_username_and_password": "İstifadəçi adı və mürəkkəb parol daxil edin",
+ "finish": "Hər şey işə salınıb",
+ "checks": "Yoxlamalar aparıldı:. \n{} / {}",
+ "steps": {
+ "hosting": "Hostinq",
+ "server_type": "Server növü",
+ "dns_provider": "DNS provayderi",
+ "backups_provider": "Yedəkləmələr",
+ "domain": "Domen",
+ "master_account": "Master hesab",
+ "server": "Server",
+ "dns_setup": "DNS qurulması",
+ "nixos_installation": "NixOS quraşdırılması",
+ "server_reboot": "Serverin yenidən yüklənməsi",
+ "final_checks": "Son yoxlamalar"
+ }
+ },
+ "recovering": {
+ "domain_recovery_description": "Serverə daxil olmaq istədiyiniz domeni daxil edin:",
+ "method_device_description": "Proqramı başqa cihazda açın və cihaz idarəetmə ekranını açın. Avtorizasiya nişanı əldə etmək üçün \"Cihaz əlavə et\" üzərinə klikləyin.",
+ "modal_confirmation_title": "Bu həqiqətən sizin serverinizdir?",
+ "modal_confirmation_description": "Yanlış serverə qoşulmaq dağıdıcı ola bilər.",
+ "modal_confirmation_ip_invalid": "IP DNS qeydində göstərilənə uyğun gəlmir",
+ "generic_error": "Əməliyyat uğursuz oldu, yenidən cəhd edin.",
+ "recovery_main_header": "Mövcud serverə qoşulun",
+ "domain_recover_placeholder": "Sizin domeniniz",
+ "domain_recover_error": "Bu domenlə server tapmaq mümkün olmadı",
+ "method_select_description": "Giriş metodunu seçin:",
+ "method_select_other_device": "Başqa cihazda girişim var",
+ "method_select_recovery_key": "Məndə bərpa açarı var",
+ "method_select_nothing": "Məndə bunların heç biri yoxdur",
+ "method_device_button": "Token aldım",
+ "method_device_input_description": "İcazə nişanınızı daxil edin",
+ "method_device_input_placeholder": "Token",
+ "method_recovery_input_description": "Bərpa nişanınızı daxil edin",
+ "fallback_select_description": "Bundan sənə nə var? İlk uyğun gələni seçin:",
+ "fallback_select_token_copy": "Tətbiqin başqa versiyasından icazə nişanının surəti.",
+ "fallback_select_root_ssh": "SSH vasitəsilə serverə Root girişi.",
+ "fallback_select_provider_console": "Hostinq konsoluna giriş.",
+ "authorization_failed": "Bu açarla daxil olmaq alınmadı",
+ "fallback_select_provider_console_hint": "Məsələn: Hetzner.",
+ "provider_connected": "{} qoşulur",
+ "provider_connected_description": "Əlaqə quruldu. {} girişi ilə nişanınızı daxil edin:",
+ "provider_connected_placeholder": "{} nişanı",
+ "confirm_server": "Serveri təsdiqləyin",
+ "confirm_server_description": "Server tapdım! Onun olduğunu təsdiq edin:",
+ "confirm_server_accept": "Bəli, odur",
+ "confirm_server_decline": "Başqa server seçin",
+ "choose_server": "Server seçin",
+ "choose_server_description": "Hansı serverlə əlaqə saxladığınızı müəyyən etmək mümkün olmadı.",
+ "no_servers": "Hesabınızda mövcud server yoxdur.",
+ "domain_not_available_on_token": "Daxil edilmiş işarənin tələb olunan domenə girişi yoxdur.",
+ "modal_confirmation_dns_valid": "Əks DNS düzgündür",
+ "modal_confirmation_dns_invalid": "Əks DNS fərqli domenə işarə edir",
+ "modal_confirmation_ip_valid": "IP DNS qeydində göstərilənə uyğun gəlir"
+ },
+ "devices": {
+ "main_screen": {
+ "description": "Bu cihazların SelfPrivacy proqramı vasitəsilə server idarəçiliyinə tam çıxışı var.",
+ "header": "Cihazlar",
+ "this_device": "Bu cihaz",
+ "other_devices": "Digər cihazlar",
+ "authorize_new_device": "Yeni cihaza icazə verin",
+ "access_granted_on": "Giriş verilmişdir {}",
+ "tip": "Girişi ləğv etmək üçün cihaza klikləyin."
+ },
+ "revoke_device_alert": {
+ "description": "{} cihazı artıq serveri idarə edə bilməyəcək.",
+ "header": "Giriş ləğv edilsin?",
+ "yes": "Geri çəkilmək",
+ "no": "Ləğv et"
+ },
+ "add_new_device_screen": {
+ "header": "Yeni Cihaz Avtorizasiyası",
+ "description": "Bu açarı yeni cihaza daxil edin:",
+ "please_wait": "Zəhmət olmasa, gözləyin",
+ "tip": "Açar 10 dəqiqə etibarlıdır.",
+ "expired": "Açarın müddəti bitib.",
+ "get_new_key": "Yeni açar alın"
+ }
+ },
+ "recovery_key": {
+ "key_main_description": "Səlahiyyətli cihazlar mövcud olmadıqda SelfPrivacy avtorizasiyası üçün tələb olunur.",
+ "key_receiving_description": "Bu açarı təhlükəsiz yerə yazın. O, serverinizə tam giriş imkanı verir:",
+ "key_connection_error": "Serverə qoşulmaq alınmadı.",
+ "key_synchronizing": "Sinxronizasiya…",
+ "key_main_header": "Bərpa açarı",
+ "key_amount_toggle": "İstifadəsini məhdudlaşdırın",
+ "key_amount_field_title": "Maks. istifadə sayı",
+ "key_duedate_toggle": "İstifadə müddətini məhdudlaşdırın",
+ "key_duedate_field_title": "Son istifadə tarixi",
+ "key_receive_button": "Açar alın",
+ "key_valid": "Açarınız etibarlıdır",
+ "key_invalid": "Açarınız artıq etibarlı deyil",
+ "key_valid_until": "{} tarixinə qədər etibarlıdır",
+ "key_valid_for": "Daha {} dəfə istifadə edə bilərsiniz",
+ "key_creation_date": "Yaradılıb {}",
+ "key_replace_button": "Yeni açar yaradın",
+ "key_receiving_info": "Bu açar artıq göstərilməyəcək, lakin siz onu yenisi ilə əvəz edə bilərsiniz.",
+ "key_receiving_done": "Hazır!",
+ "generation_error": "Açar yaratmaq alınmadı. {}"
+ },
+ "modals": {
+ "unexpected_error": "Provayder tərəfindən gözlənilməz xəta.",
+ "dns_removal_error": "DNS qeydlərini silmək mümkün deyil.",
+ "server_deletion_error": "Server silinə bilməz.",
+ "server_validators_error": "Server siyahısını əldə etmək alınmadı.",
+ "already_exists": "Belə bir server artıq mövcuddur.",
+ "destroy_server": "Serveri məhv edib yenisini yaratmaq?",
+ "try_again": "Bir daha cəhd etmək üçün?",
+ "are_you_sure": "Sən əminsən?",
+ "purge_all_keys": "Bütün avtorizasiya açarları silinsin?",
+ "purge_all_keys_confirm": "Bəli, bütün düymələri silin",
+ "delete_server_volume": "Server və yaddaş silinsin?",
+ "reboot": "Yenidən yükləyin",
+ "you_cant_use_this_api": "Siz oxşar TLD ilə domen üçün bu API istifadə edə bilməzsiniz.",
+ "yes": "Bəli",
+ "no": "Yox"
+ },
+ "jobs": {
+ "create_ssh_key": "{} üçün SSH açarı yaradın",
+ "title": "Tapşırıqlar",
+ "start": "İcra etməyə başlayın",
+ "empty": "Tapşırıq yoxdur",
+ "create_user": "İstifadəçi yaradın",
+ "delete_user": "İstifadəçini silin",
+ "service_turn_off": "Dayan",
+ "service_turn_on": "Başlayın",
+ "job_added": "Tapşırıq əlavə edildi",
+ "run_jobs": "Tapşırıqları yerinə yetirin",
+ "reboot_success": "Server yenidən işə salınır",
+ "reboot_failed": "Serveri yenidən başlatmaq alınmadı, qeydləri yoxlayın.",
+ "config_pull_failed": "Server konfiqurasiyasını yeniləmək alınmadı. Proqram təminatı yeniləməsi başladı.",
+ "upgrade_success": "Server yeniləməsi başladı",
+ "upgrade_failed": "Server yeniləməsi uğursuz oldu",
+ "upgrade_server": "Serveri yeniləyin",
+ "reboot_server": "Serveri yenidən başladın",
+ "delete_ssh_key": "{} üçün SSH açarını silin",
+ "server_jobs": "Serverdəki tapşırıqlar",
+ "reset_user_password": "İstifadəçi parolunu sıfırlayın",
+ "generic_error": "Serverə qoşulmaq alınmadı!"
+ },
+ "validations": {
+ "already_exist": "Artıq mövcuddur",
+ "length_not_equal": "[] sətirinin uzunluğu {}-ə bərabər olmalıdır",
+ "required": "Məcburi sahə",
+ "invalid_format": "Səhv format",
+ "invalid_format_password": "İçərisində boş simvol olmamalıdır",
+ "invalid_format_ssh": "SSH açar formatına əməl edilməlidir",
+ "root_name": "İstifadəçi adı 'root' ola bilməz",
+ "length_longer": "[] sətirinin uzunluğu {}-dən kiçik və ya ona bərabər olmalıdır"
+ },
+ "not_ready_card": {
+ "in_menu": "Server hələ konfiqurasiya edilməyib, əlaqə sihirbazından istifadə edin."
+ },
+ "password_manager": {
+ "title": "Parol Meneceri",
+ "subtitle": "Bu, təhlükəsizliyinizin əsasıdır. Bitwarden sizə cihazlar arasında parollar yaratmağa, saxlamağa, köçürməyə və onları formalara çevirməyə kömək edəcək.",
+ "login_info": "Saytda hesab yaradılmalıdır."
+ },
+ "social_network": {
+ "title": "sosial Mediya",
+ "subtitle": "İnanmaq çətindir, lakin öz qaydaları və auditoriyası olan öz sosial şəbəkənizi yaratmaq mümkün oldu.",
+ "login_info": "Аккаунт нужно создать на сайте."
+ },
+ "vpn": {
+ "title": "VPN server",
+ "subtitle": "Bağlı VPN serveri"
+ },
+ "timer": {
+ "sec": "{} san"
+ },
+ "support": {
+ "title": "SelfPrivacy Dəstək"
+ },
+ "developer_settings": {
+ "title": "Tərtibatçı Seçimləri\naçar",
+ "subtitle": "Bu parametrlər yalnız sazlama üçündür. Nə etdiyinizi bilmirsinizsə, onları dəyişməyin.",
+ "server_setup": "Server Quraşdırma Sihirbazı",
+ "use_staging_acme": "Test ACME serverindən istifadə",
+ "use_staging_acme_description": "Bu dəyəri dəyişdirmək üçün tətbiqi yenidən qurun.",
+ "routing": "Roulinq tətbiqləri",
+ "reset_onboarding": "Xoş gəldin ziyarət bayrağını sıfırlayın",
+ "reset_onboarding_description": "Enerji ekranını yenidən göstərmək üçün güc açarının sıfırlanması",
+ "cubit_statuses": "Yükləmə kubitlərinin cari vəziyyəti"
+ }
+}
diff --git a/assets/translations/be.json b/assets/translations/be.json
new file mode 100644
index 00000000..d634d64b
--- /dev/null
+++ b/assets/translations/be.json
@@ -0,0 +1,511 @@
+{
+ "initializing": {
+ "how": "Як атрымаць API токен",
+ "provider_bad_key_error": "Няверны API ключ правайдэра",
+ "could_not_connect": "Не ўдалося злучыцца з правайдэрам.",
+ "choose_location_type": "Дзе замовіць сервер?",
+ "choose_location_type_text": "Ад выбару лакацыі будуць залежаць даступныя канфігурацыі, кошты і хуткасць вашага злучэння з серверам.",
+ "locations_not_found": "Ой!",
+ "back_to_locations": "Выбраць іншы",
+ "no_locations_found": "Не знойдзена лакацый, пераканайцеся, што ваш рахунак даступны",
+ "choose_server_type": "Які тып сервера выбраць?",
+ "choose_server_type_ram": "{} GB RAM",
+ "choose_server_type_payment_per_month": "{} у месяц",
+ "no_server_types_found": "Не знойдзена даступных тыпаў сервера! Калі ласка, пераканайцеся, што ў вас ёсць доступ да правайдэра сервера...",
+ "backblaze_bad_key_error": "Інфармацыя аб Backblaze сховішча няслушная",
+ "select_dns": "Цяпер давайце выберам DNS-правайдэра",
+ "what": "Што гэта значыць?",
+ "server_rebooted": "Сервер перазагружаны, чакаем апошнюю праверку…",
+ "server_created": "Сервер створаны. Ідзе праверка DNS адрасоў і запуск сервера…",
+ "until_the_next_check": "Да наступнай праверкі: ",
+ "check": "Праверка",
+ "create_master_account": "Стварыце галоўны ўліковы запіс",
+ "enter_username_and_password": "Увядзіце імя карыстальніка і складаны пароль",
+ "finish": "Усё ініцыялізавана",
+ "checks": "Праверак выканана: \n{} / {}",
+ "choose_server_type_storage": "{} GB сістэмнага сховішча",
+ "locations_not_found_text": "У гэтым месцы не аказалася даступных сервераў для арэнды",
+ "choose_server_type_text": "Ад рэсурсаў сервера залежыць, якія сервісы змогуць запусціцца. Пашырыць сервер можна будзе ў любы час",
+ "choose_server_type_notice": "Галоўнае, на што варта звярнуць увагу - колькасць патокаў працэсара і аб'ём аператыўнай памяці. Дадзеныя сэрвісаў будуць размешчаны на асобным дыску, які аплачваецца асобна і лёгка пашыраем.",
+ "server_started": "Сервер запушчаны. Цяпер ён будзе правераны і перагружаны…",
+ "one_more_restart": "Цяпер будзе дадатковая перазагрузка для актывацыі сертыфікатаў бяспекі.",
+ "manage_domain_dns": "Для кіравання DNS вашага дамена",
+ "use_this_domain": "Ужываем гэты дамен?",
+ "use_this_domain_text": "Указаны вамі токен дае кантроль над гэтым даменам",
+ "connect_backblaze_storage": "Падлучыце хмарнае сховішча Backblaze",
+ "no_connected_domains": "У дадзены момант падлучаных даменаў няма",
+ "loading_domain_list": "Загружаем спіс даменаў",
+ "found_more_domains": "Знойдзена больш аднаго дамена, для вашай бяспекі, просім Вам выдаліць не патрэбныя дамены",
+ "save_domain": "Захаваць дамен",
+ "final": "Апошні крок",
+ "create_server": "Стварыць сервер",
+ "connect_to_server": "Пачнём з сервера.",
+ "select_provider": "Ніжэй падборка правайдэраў, якіх падтрымлівае SelfPrivacy",
+ "select_provider_notice": "Пад 'Невялікім серверам' маецца на ўвазе сервер з двума струменямі працэсара і двума гігабайтамі аператыўнай памяці.",
+ "select_provider_countries_title": "Даступныя краіны",
+ "select_provider_countries_text_hetzner": "Германія, Фінляндыя, ЗША",
+ "select_provider_countries_text_do": "ЗША, Нідэрланды, Сінгапур, Вялікабрытанія, Германія, Канада, Індыя, Аўстралія",
+ "select_provider_price_title": "Сярэдні кошт",
+ "select_provider_price_text_hetzner": "€8 у месяц за невялікі сервер і 50GB месцы на дыску",
+ "select_provider_price_text_do": "$17 у месяц за невялікі сервер і 50GB месцы на дыску",
+ "select_provider_payment_title": "Метады аплаты",
+ "select_provider_payment_text_hetzner": "Банкаўскія карты, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_do": "Банкаўскія карты, Google Pay, PayPal",
+ "select_provider_email_notice": "Хостынг электроннай пошты недаступны для новых кліентаў. Разблакаваць можна будзе пасля першай аплаты.",
+ "select_provider_site_button": "Наведаць сайт",
+ "connect_to_server_provider": "Аўтарызавацца ў ",
+ "connect_to_server_provider_text": "З дапамогай API токена праграма SelfPrivacy зможа ад вашага імя замовіць і наладзіць сервер",
+ "steps": {
+ "nixos_installation": "Ўстаноўка NixOS",
+ "hosting": "Хостынг",
+ "server_type": "Тып сервера",
+ "dns_provider": "DNS правайдэр",
+ "backups_provider": "Рэзервовыя копіі",
+ "domain": "Дамен",
+ "master_account": "Майстар акаўнт",
+ "server": "Сервер",
+ "dns_setup": "Устаноўка DNS",
+ "server_reboot": "Перазагрузка сервера",
+ "final_checks": "Фінальныя праверкі"
+ },
+ "server_provider_description": "Месца, дзе будуць знаходзіцца вашыя дадзеныя і службы SelfPrivacy:",
+ "dns_provider_description": "Гэта дазволіць звязаць ваш дамен з IP адрасам:",
+ "connect_to_dns": "Падлучыце DNS правайдэра",
+ "select_provider_payment_text_cloudflare": "Банкаўскія карты",
+ "dns_provider_bad_key_error": "API ключ няслушны",
+ "select_provider_price_free": "Бясплатна",
+ "connect_to_dns_provider_text": "З дапамогай API токена прыкладанне SelfPrivacy наладзіць DNS запісы"
+ },
+ "recovering": {
+ "generic_error": "Памылка правядзення аперацыі, паспрабуйце яшчэ раз.",
+ "recovery_main_header": "Падключыцца да існуючага сервера",
+ "domain_recovery_description": "Увядзіце дамен, па якім вы жадаеце атрымаць доступ да сервера:",
+ "domain_recover_placeholder": "Дамен",
+ "domain_recover_error": "Не удалося знайсці сервер з такім даменам",
+ "method_select_description": "Выбярыце спосаб уваходу:",
+ "method_select_other_device": "У мяне ёсць доступ на іншай прыладзе",
+ "method_select_recovery_key": "У мяне ёсць ключ аднаўлення",
+ "method_select_nothing": "У мяне нічога з гэтага няма",
+ "method_device_description": "Адкрыйце прыкладанне на іншай прыладзе і адкрыйце экран кіравання прыладамі. Націсніце \"Дадаць прыладу\" каб атрымаць токен для аўтарызацыі.",
+ "method_device_button": "Я атрымаў токен",
+ "method_device_input_placeholder": "Токен",
+ "method_recovery_input_description": "Увядзіце ваш токен аднаўлення",
+ "method_device_input_description": "Увядзіце ваш токен аўтарызацыі",
+ "fallback_select_description": "Што ў вас з гэтага ёсць? Абярыце першае, што падыходзіць:",
+ "fallback_select_token_copy": "Копія токена аўтарызацыі з іншай версіі праграмы.",
+ "fallback_select_root_ssh": "Каранёвы доступ да сервера праз SSH.",
+ "authorization_failed": "Не ўдалося ўвайсці з гэтым ключом",
+ "fallback_select_provider_console_hint": "Напрыклад, Hetzner.",
+ "provider_connected": "Падлучэнне да вашага {}",
+ "provider_connected_placeholder": "Токен {}",
+ "confirm_server": "Пацвердзіце сервер",
+ "confirm_server_description": "Знайшлі сервер! Пацьвердзіце, што гэта ён:",
+ "confirm_server_accept": "Да, гэта ён",
+ "confirm_server_decline": "Выбраць іншы сервер",
+ "choose_server_description": "Не атрымалася вызначыць, з якім серверам вы ўсталёўваеце сувязь.",
+ "domain_not_available_on_token": "Уведзены токен не мае доступу да патрэбнага дамену.",
+ "modal_confirmation_title": "Гэта сапраўды ваш сэрвер?",
+ "modal_confirmation_dns_valid": "Зваротны DNS карэктны",
+ "modal_confirmation_dns_invalid": "Зваротны DNS паказвае на іншы дамен",
+ "modal_confirmation_ip_invalid": "IP не супадае з паказаным у DNS запісу",
+ "fallback_select_provider_console": "Доступ да кансолі хостынгу.",
+ "provider_connected_description": "Сувязь устаноўлена. Увядзіце свой токен з доступам да {}:",
+ "choose_server": "Выберыце сервер",
+ "no_servers": "На вашым акаўнце няма даступных сэрвэраў.",
+ "modal_confirmation_description": "Падлучэнне да няправільнага сервера можа прывесці да дэструктыўных наступстваў.",
+ "modal_confirmation_ip_valid": "IP супадае з паказаным у DNS запісу"
+ },
+ "devices": {
+ "main_screen": {
+ "header": "Прылады",
+ "this_device": "Гэта прылада",
+ "other_devices": "Іншыя прылады",
+ "authorize_new_device": "Аўтарызаваць новую прыладу",
+ "access_granted_on": "Доступ выдадзены {}",
+ "tip": "Націсніце на прыладу, каб адклікаць доступ.",
+ "description": "Гэтыя прылады маюць поўны доступ да кіравання серверам праз прыкладанне SelfPrivacy."
+ },
+ "add_new_device_screen": {
+ "description": "Увядзіце гэты ключ на новай прыладзе:",
+ "expired": "Тэрмін дзеяння ключа скончыўся.",
+ "get_new_key": "Атрымаць новы ключ",
+ "header": "Аўтарызацыя новай прылады",
+ "please_wait": "Калі ласка, пачакайце",
+ "tip": "Ключ сапраўдны 10 хвілін."
+ },
+ "revoke_device_alert": {
+ "header": "Адклікаць доступ?",
+ "yes": "Адклікаць",
+ "no": "Адменіць",
+ "description": "Прылада {} больш не зможа кіраваць серверам."
+ }
+ },
+ "test": "by-test",
+ "locale": "by",
+ "basis": {
+ "providers": "Правайдэр",
+ "providers_title": "Ваш Дата Цэнтр",
+ "select": "Выбраць",
+ "services_title": "Вашы асабістыя, прыватныя і незалежныя сэрвісы.",
+ "next": "Далей",
+ "delete": "Выдаліць",
+ "later": "Прапусціць і наладзіць потым",
+ "no_data": "Няма дадзеных",
+ "services": "Сэрвісы",
+ "users": "Ужыткоўнікі",
+ "more": "Дадаткова",
+ "got_it": "Зразумеў",
+ "settings": "Налады",
+ "password": "Пароль",
+ "create": "Cтварыць",
+ "confirmation": "Пацверджанне",
+ "cancel": "Адмяніць",
+ "close": "Закрыць",
+ "connect": "Падключыць",
+ "domain": "Дамен",
+ "saving": "Захаванне…",
+ "username": "Імя ўжыткоўніка",
+ "loading": "Загрузка…",
+ "connect_to_existing": "Падключыцца да існуючага сервера",
+ "reset": "Скінуць",
+ "details": "Падрабязная інфармацыя",
+ "wait": "Пачакайце",
+ "remove": "Выдаліць",
+ "apply": "Ужыць",
+ "done": "Гатова",
+ "continue": "Працягнуць",
+ "alert": "Паведамленне",
+ "app_name": "SelfPrivacy"
+ },
+ "recovery_key": {
+ "key_connection_error": "Не ўдалося злучыцца з серверам.",
+ "key_synchronizing": "Сінхранізацыя…",
+ "key_main_header": "Ключ аднаўлення",
+ "key_amount_toggle": "Абмежаваць выкарыстання",
+ "key_amount_field_title": "Макс. кольк-ць ужыванняў",
+ "key_duedate_toggle": "Абмежаваць тэрмін выкарыстання",
+ "key_duedate_field_title": "Дата заканчэння тэрміну дзеяння",
+ "key_receive_button": "Атрымаць ключ",
+ "key_valid": "Ваш ключ сапраўдны",
+ "key_invalid": "Ваш ключ больш не сапраўдны",
+ "key_valid_until": "Дзейнічае да {}",
+ "key_creation_date": "Створаны {}",
+ "key_replace_button": "Згенераваць новы ключ",
+ "key_receiving_done": "Зроблена!",
+ "generation_error": "Не ўдалося згенераваць ключ. {}",
+ "key_main_description": "Неабходна для аўтарызацыі SelfPrivacy, калі аўтарызаваныя прылады недаступныя.",
+ "key_valid_for": "Можна выкарыстоўваць яшчэ {} раз",
+ "key_receiving_description": "Запішыце гэты ключ у бяспечным месцы. Ён дае поўны доступ да вашага сервера:",
+ "key_receiving_info": "Гэты ключ больш не будзе паказаны, але вы зможаце замяніць яго новым."
+ },
+ "modals": {
+ "server_validators_error": "Не ўдалося атрымаць спіс сервераў.",
+ "already_exists": "Такі сервер ужо існуе.",
+ "destroy_server": "Знішчыць сервер і стварыць новы?",
+ "try_again": "Паспрабаваць яшчэ раз?",
+ "are_you_sure": "Вы ўпэўнены?",
+ "purge_all_keys": "Сцерці ўсе ключы аўтарызацыі?",
+ "purge_all_keys_confirm": "Так, сцерці ўсе ключы",
+ "reboot": "Перазагрузіць",
+ "you_cant_use_this_api": "Нельга выкарыстоўваць гэты API для дамен з падобным TLD.",
+ "yes": "Да",
+ "no": "Не",
+ "dns_removal_error": "Немагчыма выдаліць запісы DNS.",
+ "server_deletion_error": "Немагчыма выдаліць сервер.",
+ "unexpected_error": "Непрадбачаная памылка з боку правайдэра.",
+ "delete_server_volume": "Выдаліць сервер і сховішча?",
+ "volume_creation_error": "Не ўдалося стварыць том."
+ },
+ "timer": {
+ "sec": "{} сек"
+ },
+ "jobs": {
+ "title": "Задачы",
+ "start": "Пачаць выкананне",
+ "empty": "Задач няма",
+ "delete_user": "Выдаліць карыстальніка",
+ "service_turn_off": "Спыніць",
+ "service_turn_on": "Запусціць",
+ "job_added": "Задача дададзена",
+ "run_jobs": "Запусціце задачы",
+ "reboot_success": "Сервер перазагружаецца",
+ "reboot_failed": "Не ўдалося перазагрузіць сервер, праверце логі.",
+ "upgrade_success": "Запушчана абнаўленне сервера",
+ "upgrade_failed": "Абнавіць сервер не выйшла",
+ "upgrade_server": "Абнавіць сервер",
+ "create_ssh_key": "Стварыць SSH ключ для {}",
+ "delete_ssh_key": "Выдаліць SSH ключ для {}",
+ "server_jobs": "Задачы на серверы",
+ "generic_error": "Не ўдалося падключыцца да сервера!",
+ "create_user": "Стварыць карыстальніка",
+ "config_pull_failed": "Не ўдалося абнавіць канфігурацыю сервера. Абнаўленне ПЗ запушчана.",
+ "reset_user_password": "Скінуць пароль карыстальніка",
+ "reboot_server": "Перазагрузіць сервер"
+ },
+ "more_page": {
+ "configuration_wizard": "Майстар наладкі",
+ "application_settings": "Налады праграмы",
+ "about_project": "Аб праекце SelfPrivacy",
+ "about_application": "Аб праграме",
+ "onboarding": "Прівітанне",
+ "create_ssh_key": "SSH ключы адміністратара",
+ "console": "Кансоль"
+ },
+ "about_application_page": {
+ "application_version_text": "Версія праграмы {}",
+ "title": "Аб праграме",
+ "api_version_text": "Версія API сервера {}",
+ "privacy_policy": "Палітыка прыватнасці"
+ },
+ "application_settings": {
+ "reset_config_description": "Скінуць API ключы i суперкарыстальніка.",
+ "delete_server_description": "Дзеянне прывядзе да выдалення сервера. Пасля гэтага ён будзе недаступны.",
+ "title": "Налады праграмы",
+ "dark_theme_title": "Цёмная тэма",
+ "dark_theme_description": "Змяніць каляровую тэму",
+ "reset_config_title": "Скід налад",
+ "delete_server_title": "Выдаліць сервер",
+ "system_dark_theme_title": "Сістэмная тэма па-змаўчанні",
+ "system_dark_theme_description": "Выкарыстоўвайце светлую ці цёмную тэмы ў залежнасці ад сістэмных налад",
+ "dangerous_settings": "Небяспечныя наладкі"
+ },
+ "ssh": {
+ "root_subtitle": "Уладальнікі паказаных тут ключоў атрымліваюць поўны доступ да дадзеных і налад сервера. Дадавайце выключна свае ключы.",
+ "title": "SSH ключы",
+ "create": "Дадаць SSH ключ",
+ "delete": "Выдаліць SSH ключ",
+ "delete_confirm_question": "Вы ўпэўненыя, што хочаце выдаліць наступны ключ?",
+ "subtitle_with_keys": "Ключэй: {}",
+ "subtitle_without_keys": "Ключэй няма",
+ "no_key_name": "Безназоўны ключ",
+ "root_title": "Гэта ключы суперкарыстальніка",
+ "input_label": "Публічны ED25519 або RSA ключ"
+ },
+ "onboarding": {
+ "page1_title": "Лічбавая незалежнасць, даступная ўсім нам",
+ "page1_text": "Почта, VPN, Пасыльнік, социальная сеть и многое другое на Вашем личном сервере, под Вашим полным контролем.",
+ "page2_server_provider_text": "Сервер-правайдэр будзе абслугоўваць ваш сервер у сваім дата-цэнтры. SelfPrivacy аўтаматычна далучыцца да яго і наладзіць вам сервер.",
+ "page2_dns_provider_text": "Вам патрэбен дамен, каб мець месца ў Інтэрнеце. Вам таксама патрэбен надзейны пастаўшчык DNS, каб дамен паказваў на ваш сервер. Мы прапануем вам выбраць падтрымоўванага пастаўшчыка DNS для аўтаматычнай налады сеткі.",
+ "page2_backup_provider_text": "Што рабіць, калі нешта здарыцца з вашым серверам? Уявіце сабе хакерскую атаку, выпадковае выдаленне даных або адмову ў абслугоўванні? Вашы дадзеныя будуць захоўвацца ў бяспецы ў пастаўшчыка рэзервовых копій. Яны будуць надзейна зашыфраваны і даступныя для аднаўлення вашага сервера ў любы час.",
+ "page2_title": "SelfPrivacy - гэта не воблака, а ваш асабісты дата-цэнтр",
+ "page2_text": "SelfPrivacy працуе толькі з сэрвіс-правайдэрамі на ваш выбар. Калі ў Вас няма ўліковых запісаў, мы дапаможам іх стварыць.",
+ "page2_server_provider_title": "Сервер-правайдэр",
+ "page2_dns_provider_title": "DNS-правайдэр",
+ "page2_backup_provider_title": "Бэкап-правайдэр"
+ },
+ "record": {
+ "api": "SelfPrivacy API",
+ "social": "Сацыяльная сетка",
+ "password": "Менеджэр пароляў",
+ "root": "Каранёвы дамен",
+ "cloud": "Файлавае воблака",
+ "git": "Git сервер",
+ "meet": "Відэаканферэнцыі",
+ "vpn": "VPN",
+ "mx": "Запіс MX",
+ "dmarc": "Запіс DMARC",
+ "spf": "Запіс SPF",
+ "dkim": "DKIM ключ"
+ },
+ "domain": {
+ "error": "Праблемы знойдзены",
+ "uninitialized": "Дадзеныя яшчэ не атрыманы",
+ "email_subtitle": "Запісы неабходныя для бяспечнага абмену электроннай поштай.",
+ "card_title": "Дамен",
+ "screen_title": "Дамен і DNS",
+ "ok": "Запісы ў парадку",
+ "error_subtitle": "Націсніце тут, каб выправіць іх",
+ "refreshing": "Абнаўленне дадзеных…",
+ "services_title": "Сэрвісы",
+ "services_subtitle": "Запісы тыпу \"A\" неабходныя для працы сэрвісаў.",
+ "email_title": "Электронная пошта",
+ "update_list": "Абнавіць спіс"
+ },
+ "backup": {
+ "description": "Выручыць Вас у любой сітуацыі: хакерская атака, выдаленне сервера і г.д.",
+ "no_backups": "Рэзервовых копій пакуль няма",
+ "error_pending": "Сервер вярнуў памылку, праверце яе ніжэй",
+ "restore_alert": "Вы збіраецеся аднавіць з рэзервовай копіі, створанай {}. Усе бягучыя даныя будуць страчаны. Вы ўпэўнены?",
+ "card_title": "Рэзервовае капіраванне",
+ "reupload_key": "Прымусова абнавіць ключ",
+ "reuploaded_key": "Ключ на серверы абноўлены",
+ "initialize": "Ініцыялізаваць",
+ "waiting_for_rebuild": "Вы зможаце стварыць першую рэзервовую копію праз некалькі хвілін.",
+ "restore": "Аднавіць з рэзервовай копіі",
+ "create_new": "Стварыць новую рэзервовую копію",
+ "creating": "Стварэнне новай рэзервовай копіі: {}%",
+ "restoring": "Аднаўленне з рэзервовай копіі",
+ "refresh": "Абнавіць статус",
+ "refetch_backups": "Абнавіць спіс копій",
+ "refetching_list": "Праз некалькі хвілін спіс будзе абноўлены"
+ },
+ "validations": {
+ "required": "Абавязковае поле",
+ "already_exist": "Ужо існуе",
+ "invalid_format_password": "Пароль не павінен змяшчаць прабелы",
+ "root_name": "Імя карыстальніка не можа быць 'root'",
+ "length_not_equal": "Даўжыня радка [], павінна быць роўна {}",
+ "length_longer": "Даўжыня радка [], павінна быць менш або роўна {}",
+ "invalid_format": "Няправільны фармат",
+ "invalid_format_ssh": "Павінен прытрымлівацца фармату SSH ключоў"
+ },
+ "storage": {
+ "extending_volume_title": "Пашырэнне сховішча",
+ "extending_volume_description": "Змяненне памеру сховішча дазволіць вам трымаць больш дадзеных на вашым серверы без пашырэння самога сервера. Аб'ём можна толькі павялічыць: зменшыць aб'ём не мажліва.",
+ "status_ok": "Праблем на дыску не знайдзена",
+ "status_error": "Мала месца на дыску",
+ "disk_usage": "{} выкарыстана",
+ "disk_total": "{} усяго · {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "Байт",
+ "extend_volume_button": "Пашырыць сховішча",
+ "extending_volume_price_info": "Кошт уключае ПДВ і ацэньваецца на аснове дадзеных аб цэнах, прадстаўленых Hetzner. Сервер будзе перагружаны падчас працэсу.",
+ "extending_volume_error": "Не ўдалося ініцыялізаваць пашырэнне тома.",
+ "size": "Памер",
+ "data_migration_title": "Міграцыя дадзеных",
+ "card_title": "Сховішча",
+ "data_migration_notice": "Падчас міграцыі ўсе службы будуць адключаны.",
+ "start_migration_button": "Пачаць міграцыю",
+ "migration_process": "Мігруем…",
+ "migration_done": "Скончыць"
+ },
+ "service_page": {
+ "status": {
+ "active": "Запушчаны і працуе",
+ "inactive": "Астаноўлены",
+ "failed": "Не ўдалося запусціць",
+ "off": "Адключана",
+ "activating": "Уключаецца",
+ "deactivating": "Выключаецца",
+ "reloading": "Перазапускаецца"
+ },
+ "open_in_browser": "Адкрыць у браўзэры",
+ "restart": "Перазапусціць сэрвіс",
+ "disable": "Выключыць сэрвіс",
+ "enable": "Уключыць сэрвіс",
+ "move": "Перамясціць на іншы дыск",
+ "uses": "Выкарыстоўвае {usage} на {volume}"
+ },
+ "console_page": {
+ "title": "Кансоль",
+ "waiting": "Чакаем ініцыялізацыі…",
+ "copy": "Капіяваць"
+ },
+ "about_us_page": {
+ "title": "Аб праекце SelfPrivacy"
+ },
+ "resource_chart": {
+ "month": "Месяц",
+ "day": "Дзень",
+ "hour": "Гадзіна",
+ "cpu_title": "Выкарыстанне працэсара",
+ "network_title": "Выкарыстанне сеткі",
+ "in": "Атрымлена",
+ "out": "Адпраўлена"
+ },
+ "server": {
+ "card_title": "Сервер",
+ "description": "Гэта віртуальны кампутар на якім працуюць усе вашыя сэрвісы",
+ "general_information": "Агульная інфармацыя",
+ "resource_usage": "Ужыванне рэсурсаў",
+ "allow_autoupgrade": "Дазволіць аўта-абнаўленні",
+ "allow_autoupgrade_hint": "Дазволіць аўтаматычную ўстаноўку абнаўленняў на сервер",
+ "reboot_after_upgrade": "Перазагружаць пасля абнаўленняў",
+ "reboot_after_upgrade_hint": "Аўтаматычна перазагружаць сервер пасля прымянення абнаўленняў",
+ "server_timezone": "Часавы пояс сервера",
+ "select_timezone": "Абярыце гадзінны пояс",
+ "timezone_search_bar": "Назва гадзіннага пояса або значэнне зруху часу",
+ "server_id": "ID сервера",
+ "status": "Статус",
+ "cpu": "Працэсар",
+ "ram": "Аператыўная памяць",
+ "disk": "Дыск",
+ "monthly_cost": "Штомесячны кошт",
+ "location": "Размяшчэнне",
+ "core_count": {
+ "one": "{} ядро",
+ "two": "{} ядра",
+ "few": "{} ядра",
+ "many": "{} ядраў",
+ "other": "{} ядраў"
+ }
+ },
+ "not_ready_card": {
+ "in_menu": "Сервер яшчэ не наладжаны. Калі ласка, завяршыце наладку з дапамогай майстра наладкі для далейшай працы."
+ },
+ "mail": {
+ "login_info": "Выкарыстоўвайце лагін і пароль з укладкі ўжытоўнікаў. IMAP порт: 143, STARTTLS. SMTP порт: 587, STARTTLS.",
+ "title": "Пошта",
+ "subtitle": "Электронная пошта для сям'і або кампаніі."
+ },
+ "password_manager": {
+ "subtitle": "Гэта база вашай бяспекі. Bitwarden дапаможа вам ствараць, захоўваць і перамяшчаць паролі паміж прыладамі, а таксама ўводзіць іх па запыце з дапамогай аўтазапаўнення.",
+ "title": "Менеджэр пароляў",
+ "login_info": "Акаўнт трэба стварыць на сайце."
+ },
+ "cloud": {
+ "subtitle": "Не дазваляйце хмарным сэрвісам праглядаць вашыя дадзеныя. Выкарыстоўвайце NextCloud - надзейны дом для ўсіх Вашых дадзеных.",
+ "title": "Файлавае воблака",
+ "login_info": "Лагін адміністратара: admin, пароль такі ж як у асноўнага карыстальніка. Стварайце новых карыстальнікаў у інтэрфейсе адміністратара NextCloud."
+ },
+ "social_network": {
+ "subtitle": "Складана паверыць, але стала магчымым стварыць сваю ўласную сацыяльную сетку, са сваімі правіламі і аўдыторыяй.",
+ "title": "Сацыяльная сетка",
+ "login_info": "Акаўнт трэба стварыць на сайце."
+ },
+ "video": {
+ "title": "Відэаканферэнцыя",
+ "subtitle": "Zoom і Google Meet - гэта добра, але Jitsi Meet - вартая альтэрнатыва, якая таксама дае вам упэўненасць, што вас не слухаюць.",
+ "login_info": "Акаўнт не патрабуецца."
+ },
+ "git": {
+ "title": "Git-сервер",
+ "subtitle": "Прыватная альтэрнатыва Github, якая належыць вам, а не Microsoft.",
+ "login_info": "Акаўнт трэба стварыць на сайце. Першы зарэгістраваны карыстач становіцца адміністратарам."
+ },
+ "vpn": {
+ "title": "VPN сервер",
+ "subtitle": "Закрыты VPN сервер"
+ },
+ "users": {
+ "add_new_user": "Дадайце першага карыстальніка",
+ "new_user": "Новы карыстальнік",
+ "delete_user": "Выдаліць карыстальніка",
+ "not_ready": "Падлучыце сервер, дамен і DNS у раздзеле Правайдэры каб дадаць першага карыстальніка",
+ "nobody_here": "Тут будуць адлюстроўвацца карыстальнікі",
+ "login": "Логін",
+ "new_user_info_note": "Новы карыстальнік аўтаматычна атрымае доступ да ўсіх сэрвісаў",
+ "delete_confirm_question": "Вы напраўда хочаце выдаліць уліковы запіс?",
+ "reset_password": "Скінуць пароль",
+ "account": "Уліковы запіс",
+ "send_registration_data": "Падзяліцца рэквізітамі",
+ "could_not_fetch_users": "Не ўдалося атрымаць карыстальнікаў",
+ "could_not_fetch_description": "Праверце інтэрнэт злучэнне і паспрабуйце зноў",
+ "refresh_users": "Абнавіць спіс карыстальнікаў",
+ "could_not_create_user": "Не ўдалося стварыць карыстальніка",
+ "could_not_delete_user": "Не ўдалося выдаліць карыстальніка",
+ "could_not_add_ssh_key": "Не ўдалося стварыць SSH ключ",
+ "username_rule": "Імя можа мець толькі маленькія лацінскія літары, лічбы, падкрэслення і не можа пачынацца з лічбы",
+ "email_login": "Аўтарызацыя па Email",
+ "no_ssh_notice": "Для гэтага карыстальніка створаны толькі SSH і Email акаўнты. Адзіная аўтарызацыя для ўсіх сэрвісаў яшчэ не рэалізавана.",
+ "details_title": "Карыстальніцкія дадзеныя"
+ },
+ "developer_settings": {
+ "reset_onboarding_description": "Скід перамыкача ўключэння для паўторнага адлюстравання экрана ўключэння",
+ "title": "Налады распрацоўніка",
+ "subtitle": "Гэтыя налады прызначаны толькі для адладкі. Не мяняйце іх, калі не ведаеце, што робіце.",
+ "server_setup": "Майстар усталёўкі сервера",
+ "use_staging_acme": "Выкарыстанне тэставага ACME сервера",
+ "use_staging_acme_description": "Ужываецца пры наладзе новага сервера.",
+ "routing": "Маршрутызацыя прыкладанняў",
+ "reset_onboarding": "Скінуць сцяг наведвання прывітання",
+ "cubit_statuses": "Бягучы статут кубітаў загрузкі",
+ "ignore_tls": "Не правяраць сертыфікаты TLS",
+ "ignore_tls_description": "Прыкладанне не будзе правяраць сертыфікаты TLS пры падключэнні да сервера."
+ },
+ "support": {
+ "title": "Падтрымка SelfPrivacy"
+ }
+}
diff --git a/assets/translations/cs.json b/assets/translations/cs.json
new file mode 100644
index 00000000..d989c463
--- /dev/null
+++ b/assets/translations/cs.json
@@ -0,0 +1,511 @@
+{
+ "test": "cz-test",
+ "locale": "cz",
+ "basis": {
+ "providers": "Poskytovatelé",
+ "providers_title": "Vaše Datové Centrum",
+ "select": "Vybrat",
+ "services": "Služby",
+ "services_title": "Vaše osobní, soukromé a nezávislé služby.",
+ "users": "Uživatelé",
+ "more": "Více",
+ "next": "Další",
+ "got_it": "Mám to",
+ "settings": "Nastavení",
+ "password": "Heslo",
+ "create": "Přidat nový",
+ "confirmation": "Potvrzení",
+ "cancel": "Zrušit",
+ "delete": "Vymazat",
+ "close": "Zavřít",
+ "connect": "Připojit",
+ "domain": "Doména",
+ "saving": "Ukládání…",
+ "username": "Uživatelské Jméno",
+ "loading": "Načítání…",
+ "connect_to_existing": "Připojte se k existujícímu serveru",
+ "reset": "Resetovat",
+ "details": "Podrobnosti",
+ "no_data": "Žádná data",
+ "wait": "Počkat",
+ "remove": "Vymazat",
+ "apply": "Použít",
+ "done": "Hotovo",
+ "continue": "Pokračovat",
+ "alert": "Upozornění",
+ "later": "Přeskočit na nastavení později",
+ "app_name": "SelfPrivacy"
+ },
+ "about_application_page": {
+ "title": "O příloze",
+ "privacy_policy": "Zásady ochrany osobních údajů",
+ "api_version_text": "Verze API serveru {}",
+ "application_version_text": "Verze aplikace {}"
+ },
+ "more_page": {
+ "about_project": "O nás",
+ "about_application": "O příloze",
+ "onboarding": "Pozdravy",
+ "console": "Konzole",
+ "application_settings": "Nastavení aplikace",
+ "configuration_wizard": "Průvodce nastavením",
+ "create_ssh_key": "Superuživatelské klíče SSH"
+ },
+ "console_page": {
+ "title": "Konzole",
+ "waiting": "Čekání na inicializaci…",
+ "copy": "Kopírovat"
+ },
+ "application_settings": {
+ "title": "Nastavení aplikace",
+ "dark_theme_title": "Tmavé téma",
+ "reset_config_title": "Obnovení konfigurace aplikace",
+ "reset_config_description": "Obnovení klíčů API a uživatele root.",
+ "delete_server_title": "Odstranit server",
+ "dark_theme_description": "Přepnutí tématu aplikace",
+ "delete_server_description": "Tím odstraníte svůj server. Nebude již přístupný.",
+ "system_dark_theme_title": "Výchozí téma systému",
+ "system_dark_theme_description": "Použití světlého nebo tmavého motivu v závislosti na nastavení systému",
+ "dangerous_settings": "Nebezpečná nastavení"
+ },
+ "ssh": {
+ "title": "Klíče SSH",
+ "create": "Vytvoření klíče SSH",
+ "delete": "Odstranění klíče SSH",
+ "delete_confirm_question": "Jste si jisti, že chcete odstranit klíč SSH?",
+ "subtitle_with_keys": "{} klíče",
+ "subtitle_without_keys": "Žádné klíče",
+ "no_key_name": "Nejmenovaný klíč",
+ "root_title": "Jedná se o klíče superuživatele",
+ "input_label": "Veřejný klíč ED25519 nebo RSA",
+ "root_subtitle": "Majitelé těchto klíčů získají plný přístup k serveru a mohou na něm dělat cokoli. Na server můžete přidávat pouze své vlastní klíče."
+ },
+ "onboarding": {
+ "page1_title": "Digitální nezávislost dostupná nám všem",
+ "page1_text": "Mail, VPN, Messenger, sociální sítě a mnoho dalšího na vašem soukromém serveru, který máte pod kontrolou.",
+ "page2_text": "Služba SelfPrivacy spolupracuje pouze s poskytovateli, které si vyberete. Pokud u nich nemáte požadované účty, pomůžeme vám je vytvořit.",
+ "page2_server_provider_title": "Poskytovatel serveru",
+ "page2_dns_provider_title": "Poskytovatel DNS",
+ "page2_backup_provider_title": "Poskytovatel zálohování",
+ "page2_backup_provider_text": "Co když se něco stane s vaším serverem? Představte si útok hackera, náhodné smazání dat nebo odepření služby? Vaše data budou v bezpečí u poskytovatele záloh. Budou bezpečně zašifrovány a kdykoli přístupné pro obnovení vašeho serveru.",
+ "page2_title": "SelfPrivacy není cloud, je to vaše osobní datové centrum",
+ "page2_server_provider_text": "Poskytovatel serveru udržuje váš server ve vlastním datovém centru. SelfPrivacy se automaticky připojí k poskytovateli a nastaví vše potřebné.",
+ "page2_dns_provider_text": "Abyste měli místo na internetu, potřebujete doménu. A také potřebujete spolehlivého poskytovatele DNS, aby doména směřovala na váš server. Doporučíme vám vybrat podporovaného poskytovatele DNS pro automatické nastavení sítě."
+ },
+ "resource_chart": {
+ "month": "Měsíc",
+ "day": "Den",
+ "hour": "Hodina",
+ "cpu_title": "Využití CPU",
+ "network_title": "Používání sítě",
+ "in": "Převzato z",
+ "out": "Odesláno"
+ },
+ "server": {
+ "card_title": "Server",
+ "description": "Všechny vaše služby jsou k dispozici zde",
+ "general_information": "Obecné informace",
+ "resource_usage": "Využití zdrojů",
+ "allow_autoupgrade": "Povolit automatickou aktualizaci",
+ "allow_autoupgrade_hint": "Povolení automatických aktualizací balíčků na serveru",
+ "reboot_after_upgrade": "Restart po aktualizaci",
+ "reboot_after_upgrade_hint": "Restartování bez výzvy po použití změn na serveru",
+ "timezone_search_bar": "Název časového pásma nebo hodnota časového posunu",
+ "server_id": "ID serveru",
+ "status": "Stav",
+ "cpu": "CPU",
+ "ram": "Paměť",
+ "disk": "Místní disk",
+ "monthly_cost": "Měsíční náklady",
+ "location": "Umístění",
+ "core_count": {
+ "two": "{} jádra",
+ "few": "{} jádra",
+ "many": "{} jádra",
+ "other": "{} jádra",
+ "one": "{} jádro"
+ },
+ "server_timezone": "Časové pásmo serveru",
+ "select_timezone": "Časové pásmo serveru"
+ },
+ "initializing": {
+ "locations_not_found": "Ups!",
+ "connect_to_server": "Začněme serverem.",
+ "select_provider": "Vyberte si libovolného poskytovatele z následujícího seznamu, všichni podporují službu SelfPrivacy",
+ "select_provider_notice": "Pod pojmem \"relativně malý\" rozumíme počítač se dvěma jádry procesoru a dvěma gigabajty paměti RAM.",
+ "select_provider_countries_text_do": "USA, Nizozemsko, Singapur, Velká Británie, Německo, Kanada, Indie, Austrálie",
+ "select_provider_email_notice": "E-mailový hosting nebude pro nové klienty k dispozici. Nicméně bude odemčen, jakmile dokončíte první platbu.",
+ "choose_location_type_text": "Různá místa poskytují různé konfigurace serverů, ceny a rychlosti připojení.",
+ "choose_server_type_text": "Různé možnosti prostředků podporují různé služby. Nebojte se, svůj server můžete kdykoli rozšířit",
+ "manage_domain_dns": "Správa domény DNS",
+ "use_this_domain_text": "Vámi zadaný token poskytuje přístup k následující doméně",
+ "no_connected_domains": "V současné době nejsou připojeny žádné domény",
+ "found_more_domains": "Nalezeno více než jedna doména. V zájmu vlastní bezpečnosti vás prosíme o odstranění nepotřebných domén",
+ "server_created": "Vytvořený server. Probíhá kontrola DNS a spouštění serveru…",
+ "choose_server_type_notice": "Důležité je zaměřit se na procesor a paměť RAM. Data vašich služeb budou uložena na připojeném svazku, který lze snadno rozšířit a za který se platí zvlášť.",
+ "connect_backblaze_storage": "Připojení úložiště Backblaze",
+ "save_domain": "Uložit doménu",
+ "final": "Závěrečný krok",
+ "create_server": "Vytvořit server",
+ "what": "Co to znamená?",
+ "server_rebooted": "Server byl restartován. Čeká se na poslední ověření…",
+ "select_provider_countries_title": "Dostupné země",
+ "select_provider_countries_text_hetzner": "Německo, Finsko, USA",
+ "select_provider_price_title": "Průměrná cena",
+ "select_provider_price_text_hetzner": "8 € měsíčně za relativně malý server a 50 GB diskového úložiště",
+ "select_provider_price_text_do": "17 dolarů měsíčně za relativně malý server a 50 GB diskového úložiště",
+ "select_provider_payment_title": "Platební metody",
+ "select_provider_payment_text_hetzner": "Kreditní karty, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_do": "Kreditní karty, Google Pay, PayPal",
+ "select_provider_site_button": "Navštivte stránku",
+ "connect_to_server_provider": "Nyní se přihlaste ",
+ "connect_to_server_provider_text": "S tokenem API si SelfPrivacy bude moci pronajmout počítač a nastavit na něm svůj server",
+ "how": "Jak získat token API",
+ "provider_bad_key_error": "Klíč API poskytovatele je neplatný",
+ "could_not_connect": "Nelze se připojit k poskytovateli.",
+ "choose_location_type": "Kde si chcete objednat server?",
+ "locations_not_found_text": "Nejsou k dispozici žádné servery k pronájmu",
+ "back_to_locations": "Vyberte něco jiného",
+ "no_locations_found": "Nebyla nalezena žádná dostupná místa, ujistěte se, že je váš účet přístupný",
+ "choose_server_type": "Jaký typ serveru potřebujete?",
+ "choose_server_type_ram": "{} GB paměti RAM",
+ "choose_server_type_storage": "{} GB systémového úložiště",
+ "choose_server_type_payment_per_month": "{} měsíčně",
+ "no_server_types_found": "Nebyly nalezeny žádné dostupné typy serverů. Ujistěte se, že je váš účet přístupný, a zkuste změnit umístění serveru.",
+ "backblaze_bad_key_error": "Informace o úložišti Backblaze jsou neplatné",
+ "select_dns": "Nyní vybereme poskytovatele DNS",
+ "use_this_domain": "Použít tuto doménu?",
+ "server_started": "Server byl spuštěn. Nyní bude ověřen a restartován…",
+ "until_the_next_check": "Do příští kontroly: ",
+ "check": "Podívejte se na stránky",
+ "one_more_restart": "Ještě jeden restart pro použití bezpečnostních certifikátů.",
+ "create_master_account": "Vytvoření hlavního účtu",
+ "loading_domain_list": "Načítání seznamu domén",
+ "enter_username_and_password": "Zadejte uživatelské jméno a silné heslo",
+ "finish": "Vše je inicializováno",
+ "checks": "Kontroly byly dokončeny\n{} z {}",
+ "steps": {
+ "server": "Server",
+ "dns_setup": "Instalace služby DNS",
+ "hosting": "Hostování",
+ "server_type": "Typ serveru",
+ "dns_provider": "Poskytovatel DNS",
+ "backups_provider": "Zálohování",
+ "domain": "Doména",
+ "master_account": "Hlavní účet",
+ "nixos_installation": "Instalace systému NixOS",
+ "server_reboot": "Restartování serveru",
+ "final_checks": "Závěrečné kontroly"
+ },
+ "server_provider_description": "Místo, kde budou umístěna vaše data a služby SelfPrivacy:",
+ "dns_provider_description": "Toto propojí vaši doménu s IP adresou:",
+ "dns_provider_bad_key_error": "Klíč API je neplatný",
+ "connect_to_dns": "Připojte poskytovatele DNS",
+ "select_provider_price_free": "Zdarma",
+ "select_provider_payment_text_cloudflare": "Bankovní karty",
+ "connect_to_dns_provider_text": "Pomocí rozhraní token API nakonfiguruje aplikace SelfPrivacy záznamy DNS"
+ },
+ "about_us_page": {
+ "title": "O nás"
+ },
+ "users": {
+ "no_ssh_notice": "Pro tohoto uživatele jsou vytvořeny pouze účty e-mailu a SSH. Jednotné přihlašování pro všechny služby se chystá brzy.",
+ "add_new_user": "Přidání prvního uživatele",
+ "new_user": "Nový uživatel",
+ "nobody_here": "Nikdo zde není",
+ "login": "Přihlášení",
+ "new_user_info_note": "Novému uživateli bude automaticky přidělen přístup ke všem službám",
+ "delete_confirm_question": "Jste si jistý?",
+ "reset_password": "Obnovení hesla",
+ "account": "Účet",
+ "send_registration_data": "Sdílení přihlašovacích údajů",
+ "could_not_fetch_users": "Nepodařilo se načíst seznam uživatelů",
+ "could_not_fetch_description": "Zkontrolujte prosím své internetové připojení a zkuste to znovu",
+ "refresh_users": "Obnovení seznamu uživatelů",
+ "could_not_create_user": "Nepodařilo se vytvořit uživatele",
+ "could_not_delete_user": "Nepodařilo se odstranit uživatele",
+ "email_login": "Přihlášení e-mailem",
+ "delete_user": "Odstranění uživatele",
+ "not_ready": "Připojte prosím server, doménu a DNS na kartě Poskytovatelé, abyste mohli přidat prvního uživatele",
+ "could_not_add_ssh_key": "Nepodařilo se přidat klíč SSH",
+ "username_rule": "Uživatelské jméno musí obsahovat pouze malá písmena latinky, číslice a podtržítka, nesmí začínat číslicí",
+ "details_title": "Údaje o uživateli"
+ },
+ "record": {
+ "root": "Kořenová doména",
+ "api": "API SelfPrivacy",
+ "cloud": "Oblak souborů",
+ "git": "Server Git",
+ "social": "Sociální síť",
+ "password": "Správce hesel",
+ "vpn": "VPN",
+ "mx": "Záznam MX",
+ "dmarc": "Záznam DMARC",
+ "spf": "Záznam SPF",
+ "dkim": "Klíč DKIM",
+ "meet": "Videokonference"
+ },
+ "domain": {
+ "card_title": "Doména",
+ "ok": "Záznamy jsou v pořádku",
+ "error": "Zjištěné problémy",
+ "error_subtitle": "Klepnutím sem je opravíte",
+ "refreshing": "Obnovení stavu…",
+ "services_title": "Služby",
+ "services_subtitle": "Pro každou službu jsou vyžadovány záznamy typu \"A\".",
+ "email_title": "Email",
+ "email_subtitle": "Záznamy nezbytné pro bezpečnou výměnu emailů.",
+ "update_list": "Aktualizace seznamu",
+ "screen_title": "Doména a DNS",
+ "uninitialized": "Data ještě nejsou načtena"
+ },
+ "backup": {
+ "card_title": "Záloha",
+ "reupload_key": "Vynutit klíč k opětovnému nahrání",
+ "reuploaded_key": "Znovu nahraný klíč",
+ "initialize": "Inicializace",
+ "waiting_for_rebuild": "První zálohu budete moci vytvořit během několika minut.",
+ "restore": "Obnovení ze zálohy",
+ "no_backups": "Zatím nejsou k dispozici žádné zálohy",
+ "creating": "Vytvoření nové zálohy: {}%",
+ "restoring": "Obnovení ze zálohy",
+ "error_pending": "Server vrátil chybu, zkontrolujte ji níže",
+ "refresh": "Stav obnovení",
+ "refetch_backups": "Opětovné načtení seznamu záloh",
+ "description": "Zachrání vás v případě incidentu: útoku hackerů, vymazání serveru atd.",
+ "create_new": "Vytvoření nové zálohy",
+ "restore_alert": "Chystáte se obnovit ze zálohy vytvořené dne {}. Všechna aktuální data budou ztracena. Jste si jisti?",
+ "refetching_list": "Za několik minut bude seznam aktualizován"
+ },
+ "storage": {
+ "card_title": "Úložiště serveru",
+ "status_ok": "Využití disku je v pořádku",
+ "status_error": "Málo místa na disku",
+ "disk_usage": "{} použito",
+ "disk_total": "{} celkem - {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "Byty",
+ "extend_volume_button": "Rozšíření objemu",
+ "extending_volume_title": "Rozšíření objemu",
+ "extending_volume_price_info": "Cena je uvedena včetně DPH a je odhadnuta na základě cenových údajů poskytnutých společností Hetzner. Po změně velikosti bude server restartován.",
+ "extending_volume_error": "Nepodařilo se inicializovat rozšíření svazku.",
+ "size": "Velikost",
+ "data_migration_title": "Migrace dat",
+ "data_migration_notice": "Během migrace budou všechny služby vypnuty.",
+ "start_migration_button": "Zahájení migrace",
+ "migration_process": "Migrace…",
+ "migration_done": "Dokončení",
+ "extending_volume_description": "Změna velikosti svazku vám umožní uložit na server více dat, aniž byste museli rozšiřovat samotný server. Svazek lze pouze rozšířit: zmenšení není možné."
+ },
+ "service_page": {
+ "open_in_browser": "Otevřít v prohlížeči",
+ "disable": "Zakázat službu",
+ "enable": "Povolení služby",
+ "move": "Přesun do jiného svazku",
+ "status": {
+ "active": "Zprovoznění a provoz",
+ "inactive": "Zastaveno",
+ "off": "Bezbariérový",
+ "activating": "Aktivace",
+ "reloading": "Restartování",
+ "failed": "Nepodařilo se spustit",
+ "deactivating": "Deaktivace"
+ },
+ "restart": "Restartování služby",
+ "uses": "Používá {usage} na {volume}"
+ },
+ "mail": {
+ "title": "E-mail",
+ "subtitle": "E-mail pro společnost a rodinu.",
+ "login_info": "Použijte uživatelské jméno a heslo z karty uživatelů. Port IMAP je 143 se STARTTLS, port SMTP je 587 se STARTTLS."
+ },
+ "cloud": {
+ "title": "Cloudové úložiště",
+ "subtitle": "Nedovolte cloudovým službám číst vaše data pomocí služby NextCloud.",
+ "login_info": "Přihlašovací jméno je admin, heslo je stejné jako u hlavního uživatele. Vytvoření nových účtů v rozhraní Nextcloud."
+ },
+ "password_manager": {
+ "title": "Správce hesel",
+ "login_info": "Na webových stránkách si musíte vytvořit účet.",
+ "subtitle": "Základna vašeho zabezpečení. Bitwarden vám pomůže vytvářet, ukládat a přesouvat hesla mezi zařízeními a také je zadávat na vyžádání pomocí automatického doplňování."
+ },
+ "video": {
+ "title": "Video konference",
+ "subtitle": "Zoom a Google Meet jsou dobré, ale Jitsi Meet je hodnotná alternativa, která vám navíc dává jistotu, že vás nikdo neposlouchá.",
+ "login_info": "Není potřeba žádný účet."
+ },
+ "social_network": {
+ "title": "Sociální síť",
+ "login_info": "Na webových stránkách si musíte vytvořit účet.",
+ "subtitle": "Je těžké tomu uvěřit, ale je možné vytvořit si vlastní sociální síť s vlastními pravidly a cílovou skupinou."
+ },
+ "git": {
+ "title": "Server Git",
+ "subtitle": "Soukromá alternativa ke Githubu, která patří vám, ale ne Microsoftu.",
+ "login_info": "Na webových stránkách si musíte vytvořit účet. První uživatel se stane administrátorem."
+ },
+ "vpn": {
+ "title": "Server VPN",
+ "subtitle": "Soukromý server VPN"
+ },
+ "recovering": {
+ "recovery_main_header": "Připojení k existujícímu serveru",
+ "domain_recover_placeholder": "Vaše doména",
+ "domain_recover_error": "Server s takovou doménou nebyl nalezen",
+ "method_select_description": "Vyberte metodu obnovy:",
+ "method_select_other_device": "Mám přístup na jiném zařízení",
+ "method_select_recovery_key": "Mám klíč pro obnovení",
+ "method_select_nothing": "Nic z toho nemám",
+ "method_device_button": "Obdržel jsem svůj žeton",
+ "method_device_input_description": "Zadejte svůj autorizační token",
+ "method_device_input_placeholder": "Token",
+ "method_recovery_input_description": "Zadejte svůj klíč k obnovení",
+ "fallback_select_description": "Co přesně máte? Vyberte první dostupnou možnost:",
+ "fallback_select_token_copy": "Kopie tokenu autentizace z jiné verze aplikace.",
+ "fallback_select_root_ssh": "Kořenový přístup SSH k serveru.",
+ "fallback_select_provider_console": "Přístup ke konzole serveru mého prodiveru.",
+ "authorization_failed": "Nelze se přihlásit pomocí tohoto klíče",
+ "provider_connected": "Připojení k poskytovateli {}",
+ "provider_connected_description": "Komunikace navázána. Zadejte svůj token s přístupem k {}:",
+ "provider_connected_placeholder": "Token {}",
+ "confirm_server": "Potvrzení serveru",
+ "confirm_server_accept": "Ano! To je ono",
+ "confirm_server_decline": "Výběr jiného serveru",
+ "choose_server": "Výběr serveru",
+ "choose_server_description": "Nepodařilo se nám zjistit, ke kterému serveru se snažíte připojit.",
+ "no_servers": "Na vašem účtu nejsou k dispozici žádné servery.",
+ "modal_confirmation_title": "Je to skutečně váš server?",
+ "modal_confirmation_description": "Pokud se připojíte k nesprávnému serveru, můžete přijít o všechna data.",
+ "modal_confirmation_dns_valid": "Reverzní DNS je platný",
+ "modal_confirmation_dns_invalid": "Reverzní DNS ukazuje na jinou doménu",
+ "modal_confirmation_ip_invalid": "IP není stejná jako v záznamu DNS",
+ "generic_error": "Operace se nezdařila, zkuste to prosím znovu.",
+ "domain_recovery_description": "Zadejte doménu serveru, ke které chcete získat přístup:",
+ "method_device_description": "Otevřete aplikaci v jiném zařízení a přejděte na stránku zařízení. Stisknutím tlačítka \"Přidat zařízení\" získáte token.",
+ "fallback_select_provider_console_hint": "Například: Hetzner.",
+ "confirm_server_description": "Našel jsem váš server! Potvrďte, že je to ten správný:",
+ "domain_not_available_on_token": "Vybraná doména není na tomto tokenu k dispozici.",
+ "modal_confirmation_ip_valid": "IP je stejná jako v záznamu DNS"
+ },
+ "devices": {
+ "main_screen": {
+ "header": "Zařízení",
+ "description": "Tato zařízení mají plný přístup k serveru prostřednictvím aplikace SelfPrivacy.",
+ "tip": "Stisknutím tlačítka na zařízení zrušíte přístup.",
+ "this_device": "Toto zařízení",
+ "other_devices": "Ostatní zařízení",
+ "authorize_new_device": "Autorizace nového zařízení",
+ "access_granted_on": "Přístup udělen na {}"
+ },
+ "revoke_device_alert": {
+ "header": "Odvolání přístup?",
+ "description": "Zařízení {} již nebude mít přístup k serveru.",
+ "yes": "Odvolání",
+ "no": "Zrušit"
+ },
+ "add_new_device_screen": {
+ "header": "Autorizace nového zařízení",
+ "description": "Zadejte klíč zařízení, které chcete autorizovat:",
+ "please_wait": "Počkejte prosím",
+ "tip": "Klíč je platný po dobu 10 minut.",
+ "expired": "Platnost klíče vypršela.",
+ "get_new_key": "Získat nový klíč"
+ }
+ },
+ "not_ready_card": {
+ "in_menu": "Server ještě není nastaven. Pro další práci dokončete nastavení pomocí průvodce nastavením."
+ },
+ "recovery_key": {
+ "key_connection_error": "Nepodařilo se připojit k serveru.",
+ "key_synchronizing": "Synchronizace…",
+ "key_receiving_done": "Hotovo!",
+ "generation_error": "Nepodařilo se vygenerovat klíč pro obnovení. {}",
+ "key_main_header": "Klíč pro obnovu",
+ "key_main_description": "Vyžaduje se pro autorizaci SelfPrivacy, pokud nejsou k dispozici autorizovaná zařízení.",
+ "key_amount_toggle": "Omezit používání",
+ "key_amount_field_title": "Maximální počet použití",
+ "key_duedate_toggle": "Omezit dobu používání",
+ "key_duedate_field_title": "Datum vypršení platnosti",
+ "key_receive_button": "Přijmout klíč",
+ "key_valid": "Váš klíč je platný",
+ "key_invalid": "Váš klíč již není platný",
+ "key_valid_until": "Platí do {}",
+ "key_valid_for": "{} můžete použít vícekrát",
+ "key_creation_date": "Vytvořeno {}",
+ "key_replace_button": "Generování nového klíče",
+ "key_receiving_description": "Tento klíč si zapište na bezpečné místo. Umožní vám plný přístup k serveru:",
+ "key_receiving_info": "Tento klíč se již nebude zobrazovat, ale můžete jej nahradit novým."
+ },
+ "timer": {
+ "sec": "{} sek"
+ },
+ "jobs": {
+ "title": "Seznam pracovních míst",
+ "start": "Start",
+ "empty": "Žádná pracovní místa",
+ "create_user": "Vytvoření uživatele",
+ "delete_user": "Odstranění uživatele",
+ "service_turn_off": "Zastavte",
+ "service_turn_on": "Zapnout",
+ "job_added": "Přidaná práce",
+ "run_jobs": "Spouštění úloh",
+ "reboot_success": "Server se restartuje",
+ "reboot_failed": "Server se nepodařilo restartovat. Zkontrolujte protokoly aplikace.",
+ "config_pull_failed": "Nepodařilo se stáhnout aktualizaci konfigurace. Přesto byla spuštěna aktualizace softwaru.",
+ "upgrade_success": "Zahájena aktualizace serveru",
+ "upgrade_failed": "Aktualizace serveru nefungovala",
+ "upgrade_server": "Aktualizace serveru",
+ "reboot_server": "Restartování serveru",
+ "create_ssh_key": "Vytvoření klíče SSH pro {}",
+ "delete_ssh_key": "Odstranění klíče SSH pro {}",
+ "server_jobs": "Úlohy na serveru",
+ "reset_user_password": "Obnovení hesla uživatele",
+ "generic_error": "Nelze se připojit k serveru!"
+ },
+ "validations": {
+ "already_exist": "Již existuje",
+ "invalid_format": "Nesprávný formát",
+ "root_name": "Nemůže být 'root'",
+ "required": "Povinné pole",
+ "invalid_format_password": "Heslo nesmí obsahovat mezery",
+ "invalid_format_ssh": "Musí dodržovat formát klíče SSH",
+ "length_not_equal": "Délka je [], mělo by být {}",
+ "length_longer": "Délka řetězce [] musí být menší nebo rovna {}"
+ },
+ "modals": {
+ "dns_removal_error": "Nepodařilo se odstranit záznamy DNS.",
+ "server_deletion_error": "Nepodařilo se odstranit aktivní server.",
+ "server_validators_error": "Nelze načíst seznam serverů.",
+ "already_exists": "Takový server již existuje.",
+ "unexpected_error": "Neočekávaná chyba při umisťování na straně poskytovatele.",
+ "destroy_server": "Zničit server a vytvořit nový?",
+ "try_again": "Mám to zkusit znovu?",
+ "are_you_sure": "Jste si jistý?",
+ "purge_all_keys": "Vyčistit všechny ověřovací klíče?",
+ "purge_all_keys_confirm": "Ano, vyčistěte všechny mé žetony",
+ "delete_server_volume": "Smazat server a svazek?",
+ "reboot": "Restartovat",
+ "you_cant_use_this_api": "Toto rozhraní API nelze použít pro doménu s podobnou TLD.",
+ "yes": "Ano",
+ "no": "Ne",
+ "volume_creation_error": "Svazek se nepodařilo vytvořit."
+ },
+ "support": {
+ "title": "Podpora SelfPrivacy"
+ },
+ "developer_settings": {
+ "title": "Nastavení vývojáře",
+ "subtitle": "Tato nastavení slouží pouze k ladění. Neměňte je, pokud nevíte, co děláte.",
+ "server_setup": "Nastavení serveru",
+ "use_staging_acme": "Použití testovacího serveru ACME",
+ "use_staging_acme_description": "Používá se při nastavování nového serveru.",
+ "routing": "Směrování aplikací",
+ "reset_onboarding": "Obnovení uvítací vlajky pro návštěvu",
+ "reset_onboarding_description": "Resetování vypínače pro opětovné zobrazení obrazovky pro zapnutí napájení",
+ "cubit_statuses": "Stavy nakládky zařízení Cubit",
+ "ignore_tls": "Nekontrolujte certifikáty TLS",
+ "ignore_tls_description": "Aplikace nebude při připojování k serveru ověřovat certifikáty TLS."
+ }
+}
diff --git a/assets/translations/de.json b/assets/translations/de.json
new file mode 100644
index 00000000..4a39b818
--- /dev/null
+++ b/assets/translations/de.json
@@ -0,0 +1,511 @@
+{
+ "test": "de-test",
+ "locale": "de",
+ "basis": {
+ "providers": "Provider",
+ "password": "Passwort",
+ "create": "Hinzufügen",
+ "confirmation": "Bestätigung",
+ "providers_title": "Ihr Rechenzentrum",
+ "select": "Auswählen",
+ "services": "Dienste",
+ "users": "Benutzer",
+ "more": "Mehr",
+ "next": "Weiter",
+ "got_it": "Verstanden",
+ "settings": "Einstellungen",
+ "cancel": "Abbrechen",
+ "delete": "Löschen",
+ "close": "Schließen",
+ "connect": "Verbinden",
+ "domain": "Domäne",
+ "saving": "Speichern…",
+ "username": "Benutzername",
+ "loading": "Laden…",
+ "later": "Überspringen und später einstellen",
+ "connect_to_existing": "Mit einem existierenden Server verbinden",
+ "reset": "Zurücksetzen",
+ "details": "Einzelheiten",
+ "no_data": "Keine Daten",
+ "wait": "Warten",
+ "remove": "Entfernen",
+ "done": "Fertig",
+ "continue": "Fortfahren",
+ "alert": "Alarm",
+ "services_title": "Ihre persönliche, private und unabhängige Dienste.",
+ "apply": "Anwenden",
+ "app_name": "SelfPrivacy"
+ },
+ "more_page": {
+ "configuration_wizard": "Setup-Assistent",
+ "about_project": "Über uns",
+ "about_application": "Über",
+ "onboarding": "Onboarding",
+ "create_ssh_key": "Superuser SSH Schlüssel",
+ "console": "Konsole",
+ "application_settings": "Anwendungseinstellungen"
+ },
+ "console_page": {
+ "title": "Konsole",
+ "waiting": "Warten auf Initialisierung…",
+ "copy": "Kopieren"
+ },
+ "about_us_page": {
+ "title": "Über uns"
+ },
+ "about_application_page": {
+ "title": "Über",
+ "application_version_text": "Anwendungsversion {}",
+ "api_version_text": "Server API Version {}",
+ "privacy_policy": "Datenschutzerklärung"
+ },
+ "application_settings": {
+ "title": "Anwendungseinstellungen",
+ "dark_theme_title": "Dunkles Thema",
+ "dark_theme_description": "Ihr Anwendungsdesign wechseln",
+ "reset_config_title": "Anwendungseinstellungen zurücksetzen",
+ "reset_config_description": "API Sclüssel und root Benutzer zurücksetzen.",
+ "delete_server_title": "Server löschen",
+ "delete_server_description": "Das wird Ihren Server löschen. Es wird nicht mehr zugänglich sein.",
+ "system_dark_theme_title": "Standard-Systemthema",
+ "system_dark_theme_description": "Verwenden Sie je nach Systemeinstellungen ein helles oder dunkles Thema",
+ "dangerous_settings": "Gefährliche Einstellungen"
+ },
+ "ssh": {
+ "title": "SSH Schlüssel",
+ "create": "SSH Schlüssel erstellen",
+ "delete": "SSH Schlüssel entfernen",
+ "delete_confirm_question": "Sind Sie sicher, dass Sie SSH SChlüssel entfernen wollen?",
+ "subtitle_with_keys": "{} Schlüssel",
+ "subtitle_without_keys": "Keine Slüssel",
+ "no_key_name": "Unbennanter Schlüssel",
+ "root_title": "Das sind superuser Schlüsseln",
+ "root_subtitle": "Besitzer dieser Schlüssel erhalten vollen Zugriff auf den Server und können alles darauf tun. Fügen Sie dem Server nur Ihre eigenen Schlüssel hinzu.",
+ "input_label": "Öffentlicher ED25519 oder RSA Schlüssel"
+ },
+ "onboarding": {
+ "page2_server_provider_text": "Ein Serveranbieter unterhält Ihren Server in einem eigenen Rechenzentrum. SelfPrivacy verbindet sich automatisch mit dem Anbieter und richtet alle notwendigen Dinge ein.",
+ "page1_title": "Digitale Unabhägigkeit ist für jeden von uns verfügbar",
+ "page1_text": "E-Mail, VPN, Messenger, soziales Netzwerk und viel mehr auf Ihrem privaten Server unter Ihrer Kontrolle.",
+ "page2_title": "SelfPrivacy ist keine Cloud, sondern Ihr perönliches Rechenzentrum",
+ "page2_text": "SelfPrivacy funktioniert nur mit Providern Ihrer Wahl. Wenn Sie dort keine erforderlichen Konten haben, helfen wir Ihnen, sie zu erstellen.",
+ "page2_server_provider_title": "Serveranbieter",
+ "page2_dns_provider_title": "DNS-Provider",
+ "page2_backup_provider_title": "Backup-Provider",
+ "page2_dns_provider_text": "Sie brauchen einen Domainnamen, um im Internet zu sein. Sie benötigen außerdem einen zuverlässigen DNS-Provider, damit die Domain auf ihren Server verweist. Wir empfehlen Ihnen, einen unterstützten DNS-Anbieter auszuwählen, um das Netzwerk automatisch einzurichten. Wollen Sie es manuell einstellen? Das geht auch.",
+ "page2_backup_provider_text": "Was ist, wenn etwas mit Ihrem Server passiert? Stellen Sie sich einen Hackerangriff, eine versehentliche Datenlöschung oder DOS-Angriff vor? Ihre Daten werden bei Ihrem Anbieter von Backups sicher aufbewahrt. Sie werden sicher verschlüsselt und sind jederzeit zugänglich, um Ihren Server damit wiederherzustellen."
+ },
+ "resource_chart": {
+ "month": "Monat",
+ "day": "Tag",
+ "hour": "Stunde",
+ "cpu_title": "CPU Auslastung",
+ "network_title": "Netzwerknutzung",
+ "in": "Empfangen",
+ "out": "Gesendet"
+ },
+ "server": {
+ "card_title": "Server",
+ "description": "Dies ist ein virtueller Computer, auf dem alle Ihre Dienste ausgeführt werden",
+ "general_information": "Allgemeine Information",
+ "resource_usage": "Ressourcenverwendung",
+ "allow_autoupgrade": "Automatische Aktualisierung erlauben",
+ "allow_autoupgrade_hint": "Automatische Installation der Updates auf dem Server erlauben",
+ "reboot_after_upgrade": "Neustart nach der Aktualisierung",
+ "reboot_after_upgrade_hint": "Automatisch den Server neustarten nach der Anwendung der Aktualisierungen",
+ "server_timezone": "Server Zeitzone",
+ "select_timezone": "Zeitzone auswählen",
+ "timezone_search_bar": "Zeitzonenname oder Zeitverschiebungswert",
+ "server_id": "Server ID",
+ "status": "Status",
+ "cpu": "CPU",
+ "ram": "Arbeitsspeicher",
+ "disk": "Festplatte",
+ "monthly_cost": "Monatliche Kosten",
+ "location": "Standort",
+ "core_count": {
+ "one": "{} Kern",
+ "two": "{} Kerne",
+ "few": "{} Kerne",
+ "many": "{} Kerne",
+ "other": "{} Kerne"
+ }
+ },
+ "record": {
+ "root": "Root Domain",
+ "api": "SelfPrivacy API",
+ "git": "Git Server",
+ "meet": "Videokonferenz",
+ "social": "Soziales Netzwerk",
+ "password": "Passwortmanager",
+ "vpn": "VPN",
+ "dkim": "DKIM Shlüssel",
+ "mx": "MX Eintrag",
+ "dmarc": "DMARC Eintrag",
+ "spf": "SPF Eintrag",
+ "cloud": "Datencloud"
+ },
+ "domain": {
+ "screen_title": "Domäne und DNS",
+ "ok": "Aufnahmen sind in Ordnung",
+ "error": "Probleme gefunden",
+ "error_subtitle": "Tippen sie hier, um sie zu beheben. Dadurch werden auch benutzerdefinierte DNS-Einträge entfernt.",
+ "uninitialized": "Daten sind noch nicht vorhanden",
+ "services_title": "Dienste",
+ "email_title": "E-Mail",
+ "email_subtitle": "Für sicheren E-Mail-Austauch benötigte Einträge.",
+ "update_list": "Liste aktualisieren",
+ "card_title": "Domäne",
+ "refreshing": "Statusaktualisierung…",
+ "services_subtitle": "Einträge vom Typ \"A\", die für jeden Dienst erfordelich sind."
+ },
+ "backup": {
+ "card_title": "Backup",
+ "description": "Retten Sie im Falle eines Hackerangriffs, Serverlöschung usw.",
+ "reupload_key": "Erneute Hochladung des Schlüssels erzwingen",
+ "reuploaded_key": "Schlüssel auf dem Server wurde Aktualisiert",
+ "initialize": "Initialisieren",
+ "restore": "Von der Sicherungskopie wiederherstellen",
+ "no_backups": "Backups sind noch nicht vorhanden",
+ "create_new": "Neuen Backup erstellen",
+ "creating": "Erstellung eines neuen Backups: {}%",
+ "restoring": "Wiederherstellung aus Backups",
+ "restore_alert": "Sie sind dabei die am {} erstellten Backup wiederherzutellen. Alle aktuelle Daten gehen dabei verloren. Sind Sie sicher?",
+ "refresh": "Status Aktualisieren",
+ "refetch_backups": "Backupliste neuladen",
+ "waiting_for_rebuild": "In wenigen Minuten können Sie Ihren ersten Backup erstellen.",
+ "error_pending": "Server hat einen Fehler zurückgegeben, überprüfen Sie es unten",
+ "refetching_list": "In wenigen Minuten wird die Liste neugeladen"
+ },
+ "storage": {
+ "card_title": "Serverspeicher",
+ "status_ok": "Die Festplattennutzung ist in Ordnung",
+ "status_error": "Geringer Speicherplatz",
+ "disk_usage": "{} belegt",
+ "disk_total": "{} insgesamt · {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "Byte",
+ "extend_volume_button": "Speicher erweitern",
+ "extending_volume_title": "Speichererweiterung",
+ "extending_volume_description": "Durch die Speichererweiterung können Sie mehr Daten auf Ihrem Server speichern, ohne den Server selbst zu erweitern. Speicher kann nur erweitert werden, Verringerung ist nicht möglich.",
+ "extending_volume_error": "Speichererweiterung konnte nicht initialisiert werden.",
+ "size": "Größe",
+ "data_migration_title": "Datenmigration",
+ "data_migration_notice": "Während der Migration werden alle Dienste ausgeschaltet.",
+ "start_migration_button": "Migration starten",
+ "migration_process": "Migrieren…",
+ "migration_done": "Beenden",
+ "extending_volume_price_info": "Der Preis enthält die gesetzliche Mehrwertsteuer und wird anhand der von Hetzner bereitgestellten Preisangaben geschätzt. Der Server wird nach der Größenänderung neu gestartet."
+ },
+ "not_ready_card": {
+ "in_menu": "Server ist noch nicht eingerichtet. Bitte beenden Sie die Einrichtung mit dem Einrichtungsassistenten, um fortzufahren."
+ },
+ "service_page": {
+ "enable": "Dienst aktivieren",
+ "status": {
+ "deactivating": "Wird deaktiviert",
+ "active": "In Betrieb",
+ "inactive": "Gestoppt",
+ "failed": "Fehler beim Starten",
+ "off": "Deaktiviert",
+ "activating": "Wird aktiviert",
+ "reloading": "Wird neugestartet"
+ },
+ "open_in_browser": "Im Browser öffnen",
+ "restart": "Dienst neustarten",
+ "disable": "Dienst ausschalten",
+ "move": "Zu einer anderen Festplatte wechseln",
+ "uses": "Belegt {usage} auf {volume}"
+ },
+ "mail": {
+ "login_info": "Verwenden Sie den Benutzernamen und das Passwort von dem Benutzertab. IMAP-Port ist 143 mit STARTTLS, SMTP-Port ist 587 mit STARTTLS.",
+ "title": "E-Mail",
+ "subtitle": "E-Mail für Familie und Unternehmen."
+ },
+ "password_manager": {
+ "title": "Passwortmanager",
+ "subtitle": "Basis Ihrer Sicherheit. Bitwarden hilft Ihnen beim Erstellen, Speichern und Übertragung von Passwörtern zwischen Geräten sowie bei der Eingabe mithilfe der automatischen Vervollständigung.",
+ "login_info": "Ihr Konto müssen Sie auf der Webseite erstellen."
+ },
+ "modals": {
+ "unexpected_error": "Unerwarteter Fehler beim Platzieren von Seiten des Anbieters.",
+ "delete_server_volume": "Server und Speicher löschen?",
+ "dns_removal_error": "DNS-Einträge konnten nicht entfernt werden.",
+ "server_deletion_error": "Aktiver Server konnte nicht gelöscht werden.",
+ "server_validators_error": "Verfügbare Server konnten nicht abgerufen werden.",
+ "already_exists": "Ein solcher Server existiert bereits.",
+ "destroy_server": "Den Server zerstören und einen neuen erstellen?",
+ "try_again": "Nochmal versuchen?",
+ "are_you_sure": "Sind Sie sicher?",
+ "purge_all_keys": "Alle Authentifizierungsschlüssel löschen?",
+ "purge_all_keys_confirm": "Ja, alle meine Token löschen",
+ "reboot": "Neustarten",
+ "you_cant_use_this_api": "Sie können diese API nicht für Domains mit einer solchen TLD verwenden.",
+ "yes": "Ja",
+ "no": "Nein",
+ "volume_creation_error": "Volume konnte nicht erstellt werden."
+ },
+ "jobs": {
+ "create_user": "Benutzer erstellen",
+ "service_turn_on": "Starten",
+ "reboot_success": "Server wird neugestartet",
+ "reboot_failed": "Der Server konnte nicht neugestartet werden. Überprüfen Sie die Logs der Anwendung.",
+ "create_ssh_key": "SSH-Schlüssel erstellen für {}",
+ "generic_error": "Es konnte keine Verbindung zum Server hergestellt werden!",
+ "delete_user": "Benutzer löschen",
+ "service_turn_off": "Abschalten",
+ "job_added": "Aufgabe hinzugefügt",
+ "run_jobs": "Aufgaben ausführen",
+ "title": "Aufgaben",
+ "start": "Starten",
+ "empty": "Keine Aufgaben",
+ "config_pull_failed": "Konfigurationsaktualisierung konnte nicht ausgeführt werden. Software-Aktualisierung trotzdem gestartet.",
+ "upgrade_success": "Serveraktualisierung gestartet",
+ "upgrade_failed": "Serveraktualisierung fehlgeschlagen",
+ "upgrade_server": "Server aktualisieren",
+ "reboot_server": "Server neustarten",
+ "delete_ssh_key": "SSH-Schlüssel löschen für {}",
+ "server_jobs": "Aufgaben auf dem Server",
+ "reset_user_password": "Passwort des Benutzers zurücksetzen"
+ },
+ "initializing": {
+ "locations_not_found": "Oops!",
+ "backblaze_bad_key_error": "Die Backblaze-Speicherinformationen sind ungültig",
+ "select_dns": "Lassen Sie uns nun einen DNS-Provider auswählen",
+ "manage_domain_dns": "Zum Verwalten des DNS Ihrer Domain",
+ "use_this_domain": "Diese Domäne verwenden?",
+ "use_this_domain_text": "Das von Ihnen bereitgestellte Token gewährt Zugriff auf die folgende Domäne",
+ "connect_backblaze_storage": "Backblaze-Speicher verbinden",
+ "no_connected_domains": "Derzeit keine verbundenen Domains",
+ "loading_domain_list": "Domänenliste wird geladen",
+ "found_more_domains": "Mehr als eine Domain gefunden. Zu Ihrer eigenen Sicherheit bitten wir Sie, nicht benötigte Domains zu löschen",
+ "save_domain": "Domäne speichern",
+ "final": "Letzter Schritt",
+ "create_server": "Server erstellen",
+ "select_provider_countries_text_do": "USA, Niederlande, Singapur, Großbritannien, Deutschland, Kanada, Indien, Australien",
+ "select_provider_price_text_do": "17 Dollar pro Monat für einen relativ kleinen Server und 50 GB Festplattenspeicher",
+ "connect_to_server_provider_text": "Mit dem API-Token kann SelfPrivacy eine Maschine mieten und Ihren Server darauf einrichten",
+ "choose_location_type_text": "Unterschiedliche Standorte bieten unterschiedliche Serverkonfigurationen, Preise und Verbindungsgeschwindigkeiten.",
+ "choose_server_type_text": "Unterschiedliche Ressourcenfunktionen unterstützen unterschiedliche Dienste. Keine Sorge, Sie können Ihren Server jederzeit erweitern",
+ "no_server_types_found": "Keine verfügbaren Servertypen gefunden. Stellen Sie sicher, dass auf Ihr Konto zugegriffen werden kann und versuchen Sie Ihren Serverstandort zu ändern.",
+ "one_more_restart": "Noch ein Neustart, um Ihre Sicherheitszertifikate anzuwenden.",
+ "checks": "Überprüfungen sind abgeschlossen \n{} aus {}",
+ "connect_to_server": "Beginnen wir mit einem Server.",
+ "select_provider": "Wählen Sie einen beliebigen Anbieter aus der folgenden Liste aus, sie alle unterstützen SelfPrivacy",
+ "select_provider_notice": "Mit „relativ klein“ meinen wir eine Maschine mit 2 CPU-Kernen und 2 Gigabyte RAM.",
+ "select_provider_countries_title": "verfügbare Länder",
+ "select_provider_countries_text_hetzner": "Deutschland, Finnland, USA",
+ "select_provider_price_title": "Durchschnittspreis",
+ "select_provider_price_text_hetzner": "8 Euro pro Monat für einen relativ kleinen Server und 50 GB Festplattenspeicher",
+ "select_provider_payment_title": "Zahlungsarten",
+ "select_provider_payment_text_hetzner": "Kreditkarten, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_do": "Kreditkarten, Google Pay, PayPal",
+ "select_provider_email_notice": "E-Mail-Hosting ist für Neukunden nicht verfügbar. Es wird jedoch freigeschaltet, sobald Sie Ihre erste Zahlung abgeschlossen haben.",
+ "select_provider_site_button": "Webseite besuchen",
+ "connect_to_server_provider": "Anmelden bei ",
+ "how": "So erhalten Sie ein API-Token",
+ "provider_bad_key_error": "Der API-Schlüssel des Anbieters ist ungültig",
+ "could_not_connect": "Es konnte keine Verbindung zum Anbieter hergestellt werden.",
+ "choose_location_type": "Wo möchten Sie Ihren Server mieten?",
+ "locations_not_found_text": "An diesem Standort stehen keine Server zum Mieten zur Verfügung",
+ "back_to_locations": "Wählen Sie einen anderen aus",
+ "no_locations_found": "Keine verfügbaren Standorte gefunden, stellen Sie sicher, dass auf Ihr Konto zugegriffen werden kann",
+ "choose_server_type": "Welche Art von Server benötigen Sie?",
+ "choose_server_type_notice": "Die wichtigsten Dinge, die man sich ansehen sollte, sind CPU und RAM. Die Daten Ihrer Dienste werden auf einem leicht erweiterbaren und separat zu zahlenden Datenträger gespeichert.",
+ "choose_server_type_ram": "{} GB Arbeitsspeicher",
+ "choose_server_type_storage": "{} GB Systemspeicher",
+ "choose_server_type_payment_per_month": "{} pro Monat",
+ "what": "Was bedeutet das?",
+ "server_rebooted": "Server neugestartet. Warten auf die letzte Bestätigung…",
+ "server_started": "Server gestartet. Es wird jetzt validiert und neugestartet…",
+ "server_created": "Server erstellt. DNS-Prüfungen und Server starten…",
+ "until_the_next_check": "Bis zur nächsten Überprüfung: ",
+ "check": "Überprüfung",
+ "create_master_account": "Hauptkonto erstellen",
+ "enter_username_and_password": "Geben Sie den Benutzernamen und ein gutes Passwort ein",
+ "finish": "Alles initialisiert",
+ "steps": {
+ "hosting": "Hosting",
+ "server_type": "Server-Typ",
+ "dns_provider": "DNS-Anbieter",
+ "backups_provider": "Sicherungskopien",
+ "domain": "Bereich",
+ "master_account": "Hauptkonto",
+ "server": "Server",
+ "dns_setup": "DNS-Einrichtung",
+ "nixos_installation": "NixOS-Installation",
+ "server_reboot": "Server-Neustart",
+ "final_checks": "Endgültige Kontrollen"
+ },
+ "dns_provider_bad_key_error": "Der API-Schlüssel ist ungültig",
+ "connect_to_dns": "Verbinden Sie den DNS-Anbieter",
+ "connect_to_dns_provider_text": "Mithilfe der Token-API konfiguriert die SelfPrivacy-Anwendung DNS-Einträge",
+ "server_provider_description": "Der Ort, an dem sich Ihre Daten und SelfPrivacy-Dienste befinden:",
+ "dns_provider_description": "Dadurch wird Ihre Domain mit einer IP-Adresse verknüpft:",
+ "select_provider_price_free": "Kostenlos",
+ "select_provider_payment_text_cloudflare": "Bankkarten"
+ },
+ "validations": {
+ "length_not_equal": "Länge ist [], sollte {} sein",
+ "required": "Erforderlich",
+ "already_exist": "Ist bereits vorhanden",
+ "invalid_format": "Ungültiges Format",
+ "invalid_format_password": "Das Passwort darf keine Leerzeichen enthalten",
+ "invalid_format_ssh": "Muss dem SSH-Schlüsselformat entsprechen",
+ "root_name": "Benutzername darf nicht root sein",
+ "length_longer": "Länge ist [], sollte kürzer oder gleich {} sein"
+ },
+ "users": {
+ "could_not_create_user": "Benutzer konnte nicht erstellt werden",
+ "could_not_delete_user": "Benutzer konnte nicht gelöscht werden",
+ "could_not_add_ssh_key": "SSH-Schlüssel konnte nicht hinzugefügt werden",
+ "username_rule": "Der Benutzername darf nur lateinische Kleinbuchstaben, Ziffern und Unterstriche enthalten und darf nicht mit einer Ziffer beginnen",
+ "no_ssh_notice": "Für diesen Benutzer werden nur E-Mail- und SSH-Konten erstellt. Single Sign On für alle Dienste ist in Kürze verfügbar.",
+ "add_new_user": "Fügen Sie den ersten Benutzer hinzu",
+ "new_user": "Neuer Benutzer",
+ "delete_user": "Benutzer löschen",
+ "not_ready": "Bitte verbinden Sie Server, Domain und DNS im Providertab, um den ersten Benutzer hinzufügen zu können",
+ "nobody_here": "Hier werden Benutzer angezeigt",
+ "login": "Login",
+ "new_user_info_note": "Neuen Benutzern wird automatisch Zugang zu allen Diensten gewährt",
+ "delete_confirm_question": "Sind Sie sicher?",
+ "reset_password": "Passwort zurücksetzen",
+ "account": "Konto",
+ "send_registration_data": "Anmeldedaten teilen",
+ "could_not_fetch_users": "Benutzerliste konnte nicht abgerufen werden",
+ "could_not_fetch_description": "Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut",
+ "refresh_users": "Benutzerliste aktualisieren",
+ "email_login": "E-Mail-Anmeldung",
+ "details_title": "Angaben zum Benutzer"
+ },
+ "devices": {
+ "main_screen": {
+ "header": "Geräte",
+ "description": "Diese Geräte haben über die SelfPrivacy-App vollen Zugriff auf den Server.",
+ "this_device": "Dieses Gerät",
+ "other_devices": "Andere Geräte",
+ "authorize_new_device": "Neues Gerät autorisieren",
+ "access_granted_on": "Zugriff gewährt auf {}",
+ "tip": "Tippen Sie auf das Gerät, um den Zugriff zu widerrufen."
+ },
+ "add_new_device_screen": {
+ "header": "Neues Gerät autorisieren",
+ "expired": "Der Schlüssel ist nicht mehr gültig.",
+ "description": "Geben Sie den Schlüssel auf dem Gerät ein, das Sie autorisieren möchten:",
+ "please_wait": "Bitte warten",
+ "tip": "Der Schlüssel ist 10 Minuten gültig.",
+ "get_new_key": "Neuen Schlüssel erhalten"
+ },
+ "revoke_device_alert": {
+ "header": "Zugangsberechtigung aufheben?",
+ "description": "Das Gerät {} hat auf den Server keinen Zugriff mehr.",
+ "yes": "Widerrufen",
+ "no": "Abbrechen"
+ }
+ },
+ "recovering": {
+ "domain_recovery_description": "Geben Sie eine Serverdomäne ein, für die Sie Zugriff erhalten möchten:",
+ "method_device_description": "Öffnen Sie die Anwendung auf einem anderen Gerät und gehen Sie dann zur Geräteseite. Drücken Sie auf „Gerät hinzufügen“, um Ihren Token zu erhalten.",
+ "fallback_select_token_copy": "Kopie des Authentifizierungstokens von einer anderen Version der Anwendung.",
+ "provider_connected_description": "Kommunikation hergestellt. Eingabe Ihres Tokens Token mit Zugriff auf {}:",
+ "choose_server_description": "Wir konnten nicht herausfinden, mit welchem Server Sie sich verbinden möchten.",
+ "modal_confirmation_dns_invalid": "Reverse DNS zeigt auf eine andere Domain",
+ "generic_error": "Vorgang fehlgeschlagen, bitte versuchen Sie es erneut.",
+ "recovery_main_header": "Verbindung zu einem vorhandenen Server herstellen",
+ "domain_recover_placeholder": "Ihre Domain",
+ "domain_recover_error": "Server mit dieser Domain wurde nicht gefunden",
+ "method_select_description": "Wählen Sie eine Wiederherstellungsmethode aus:",
+ "method_select_other_device": "Ich habe Zugriff auf einem anderen Gerät",
+ "method_select_recovery_key": "Ich habe einen Wiederherstellungsschlüssel",
+ "method_select_nothing": "Ich habe nichts davon",
+ "method_device_button": "Ich habe mein Token erhalten",
+ "method_device_input_description": "Geben Sie Ihr Autorisierungstoken ein",
+ "method_device_input_placeholder": "Token",
+ "method_recovery_input_description": "Geben Sie Ihren Wiederherstellungsschlüssel ein",
+ "fallback_select_description": "Was genau haben Sie? Wählen Sie die erste verfügbare Option:",
+ "fallback_select_root_ssh": "Root-SSH-Zugriff auf den Server.",
+ "fallback_select_provider_console": "Zugang zur Serverkonsole meines Providers.",
+ "authorization_failed": "Anmeldung mit diesem Schlüssel nicht möglich",
+ "fallback_select_provider_console_hint": "Zum Beispiel: Hetzner.",
+ "provider_connected": "Verbinden Sie sich mit Ihrem {}",
+ "provider_connected_placeholder": "Token des {}",
+ "confirm_server": "Server bestätigen",
+ "confirm_server_description": "Server gefunden! Bestätigen Sie, dass es das Richtige ist:",
+ "confirm_server_accept": "Ja! Das ist es",
+ "confirm_server_decline": "Einen anderen Server wählen",
+ "choose_server": "Wählen Sie Ihren Server",
+ "no_servers": "Auf Ihrem Konto sind keine Server verfügbar.",
+ "domain_not_available_on_token": "Die ausgewählte Domäne ist auf diesem Token nicht verfügbar.",
+ "modal_confirmation_title": "Ist es wirklich Ihr Server?",
+ "modal_confirmation_description": "Wenn Sie sich mit einem falschen Server verbinden, können Sie alle Ihre Daten verlieren.",
+ "modal_confirmation_dns_valid": "Reverse DNS ist gültig",
+ "modal_confirmation_ip_valid": "Die IP ist die gleiche wie im DNS-Eintrag",
+ "modal_confirmation_ip_invalid": "Die IP ist nicht dieselbe wie im DNS-Eintrag"
+ },
+ "recovery_key": {
+ "key_connection_error": "Es konnte keine Verbindung zum Server hergestellt werden.",
+ "key_main_description": "Wird für die SelfPrivacy-Autorisierung benötigt, wenn alle Ihre anderen autorisierten Geräte nicht verfügbar sind.",
+ "key_synchronizing": "Synchronisieren…",
+ "key_main_header": "Wiederherstellungsschlüssel",
+ "key_amount_toggle": "Nutzung einschränken",
+ "key_amount_field_title": "Maximale Anzahl von Nutzungen",
+ "key_duedate_toggle": "Zeitlich begrenzen",
+ "key_duedate_field_title": "Ablaufsdatum",
+ "key_receive_button": "Schlüssel erhalten",
+ "key_valid": "Ihr Schlüssel ist gültig",
+ "key_invalid": "Ihr Schlüssel ist nicht mehr gültig",
+ "key_valid_until": "Gültig bis {}",
+ "key_valid_for": "Gültig für {} Nutzungen",
+ "key_creation_date": "Erstellt am {}",
+ "key_replace_button": "Neuen Schlüssel generieren",
+ "key_receiving_info": "Der Schlüssel wird nie wieder angezeigt, aber Sie können ihn durch einen anderen ersetzen.",
+ "key_receiving_done": "Fertig!",
+ "generation_error": "Wiederherstellungsschlüssel konnte nicht generiert werden. {}",
+ "key_receiving_description": "Notieren Sie sich diesen Schlüssel und bewahren Sie ihn an einem sicheren Ort auf. Es wird verwendet, um den vollen Zugriff auf Ihren Server wiederherzustellen:"
+ },
+ "video": {
+ "title": "Videokonferenz",
+ "subtitle": "Zoom und Google Meet sind gut, aber Jitsi Meet ist eine wertvolle Alternative, ber der Sie sicher sein können, das Ihre Gespräche nicht abgehört werden.",
+ "login_info": "Kein Konto erforderlich."
+ },
+ "cloud": {
+ "title": "Cloud-Speicher",
+ "subtitle": "Erlauben Sie Cloud-Diensten nicht, Ihre Daten zu lesen, indem Sie NextCloud verwenden.",
+ "login_info": "Login für den Administrator ist admin, Passwort ist dasselbe wie bei Ihrem Hauptbenutzer. Erstellen Sie neue Konten in der Nextcloud-Oberfläche."
+ },
+ "social_network": {
+ "title": "Soziales Netzwerk",
+ "subtitle": "Es ist schwer zu glauben, aber jetzt ist es möglich ein eigenes soziales Netzwerk mit Ihren eigenen Regeln und einer eigenen Zielgruppe zu erstellen.",
+ "login_info": "Sie müssen ein Konto auf der Website erstellen."
+ },
+ "git": {
+ "title": "Git-Server",
+ "subtitle": "Private Alternative zum Github, die Ihnen und nicht Microsoft gehört.",
+ "login_info": "Sie müssen ein Konto auf der Website erstellen. Der erste Benutzer wird zum Administrator."
+ },
+ "vpn": {
+ "title": "VPN-Server",
+ "subtitle": "Privater VPN-Server"
+ },
+ "timer": {
+ "sec": "{} Sek"
+ },
+ "support": {
+ "title": "SelfPrivacy-Unterstützung"
+ },
+ "developer_settings": {
+ "title": "Einstellungen für Entwickler",
+ "subtitle": "Diese Einstellungen sind nur für Debugging-Zwecke gedacht. Ändern Sie sie nicht, wenn Sie nicht wissen, was Sie tun.",
+ "server_setup": "Server-Einrichtung",
+ "use_staging_acme": "Verwendung des ACME-Testservers",
+ "use_staging_acme_description": "Wird beim Einrichten eines neuen Servers verwendet.",
+ "routing": "Anwendungsrouting",
+ "reset_onboarding": "Setzen Sie die Willkommensflagge für den Besuch zurück",
+ "reset_onboarding_description": "Zurücksetzen des Netzschalters, um den Einschaltbildschirm erneut aufzurufen",
+ "cubit_statuses": "Aktueller Status der Ladequbits",
+ "ignore_tls": "Überprüfen Sie keine TLS-Zertifikate",
+ "ignore_tls_description": "Die Anwendung validiert TLS-Zertifikate nicht, wenn sie eine Verbindung zum Server herstellt."
+ }
+}
diff --git a/assets/translations/en.json b/assets/translations/en.json
index 46cee9b8..95a22f58 100644
--- a/assets/translations/en.json
+++ b/assets/translations/en.json
@@ -1,122 +1,142 @@
{
- "test": "en-test",
- "locale": "en",
- "basis": {
- "_comment": "Basic interface elements",
- "providers": "Providers",
- "services": "Services",
- "users": "Users",
- "more": "More",
- "next": "Next",
- "got_it": "Got it",
- "settings": "Settings",
- "password": "Password",
- "create": "Add new",
- "confirmation": "Confirmation",
- "cancel": "Cancel",
- "delete": "Delete",
- "close": "Close",
- "connect": "Connect",
- "domain": "Domain",
- "saving": "Saving..",
- "nickname": "Nickname",
- "loading": "Loading...",
- "later": "Skip to setup later",
- "connect_to_existing": "Connect to an existing server",
- "reset": "Reset",
- "details": "Details",
- "no_data": "No data",
- "wait": "Wait",
- "remove": "Remove",
- "apply": "Apply",
- "done": "Done"
- },
- "more": {
- "_comment": "'More' tab",
- "configuration_wizard": "Setup wizard",
- "about_project": "About us",
- "about_app": "About application",
- "onboarding": "Onboarding",
- "create_ssh_key": "Create SSH key",
- "generate_key": "Generate key",
- "generate_key_text": "You can generate ssh key",
- "console": "Console",
- "remove": "Remove",
- "enable": "Enable",
- "ok": "ok",
- "continue": "Continue",
- "ssh_key_exist_text": "You have generated ssh key",
- "yes_delete": "Yes, delete my SSH key",
- "share": "Share",
- "copy_buffer": "Copy to buffer",
- "copied_ssh": "SSH copied to clipboard",
- "delete_ssh_text": "Delete SSH key?",
- "about_app_page": {
- "text": "Application version v.{}"
+ "test": "en-test",
+ "locale": "en",
+ "basis": {
+ "app_name": "SelfPrivacy",
+ "providers": "Providers",
+ "providers_title": "Your Data Center",
+ "select": "Select",
+ "services": "Services",
+ "services_title": "Your personal, private and independent services.",
+ "users": "Users",
+ "more": "More",
+ "next": "Next",
+ "got_it": "Got it",
+ "settings": "Settings",
+ "password": "Password",
+ "create": "Add new",
+ "confirmation": "Confirmation",
+ "cancel": "Cancel",
+ "delete": "Delete",
+ "close": "Close",
+ "connect": "Connect",
+ "domain": "Domain",
+ "saving": "Saving…",
+ "username": "Username",
+ "loading": "Loading…",
+ "later": "Skip to setup later",
+ "connect_to_existing": "Connect to an existing server",
+ "reset": "Reset",
+ "details": "Details",
+ "no_data": "No data",
+ "wait": "Wait",
+ "remove": "Remove",
+ "apply": "Apply",
+ "done": "Done",
+ "continue": "Continue",
+ "alert": "Alert",
+ "copied_to_clipboard": "Copied to clipboard!",
+ "please_connect": "Please connect your server, domain and DNS provider to dive in!"
},
- "settings": {
- "title": "Application settings",
- "1": "Dark Theme",
- "2": "Change your the app theme",
- "3": "Reset app config",
- "4": "Reset api keys and root user",
- "5": "Delete Server",
- "6": "This removes the Server. It will be no longer accessible"
- }
- },
- "ssh": {
- "title": "SSH keys",
- "create": "Create SSH key",
- "delete": "Delete SSH key",
- "delete_confirm_question": "Are you sure you want to delete SSH key?",
- "subtitle_with_keys": "{} keys",
- "subtitle_without_keys": "No keys",
- "no_key_name": "Unnamed key",
- "root": {
- "title": "These are superuser keys",
- "subtitle": "Owners of these keys get full access to the server and can do anything on it. Only add your own keys to the server."
+ "more_page": {
+ "configuration_wizard": "Setup wizard",
+ "about_project": "About us",
+ "about_application": "About",
+ "onboarding": "Onboarding",
+ "create_ssh_key": "Superuser SSH keys",
+ "console": "Console",
+ "application_settings": "Application settings"
},
- "input_label": "Public ED25519 or RSA key"
- },
- "onboarding": {
- "_comment": "Onboarding pages",
- "page1_title": "Digital independence, available to all of us",
- "page1_text": "Mail, VPN, Messenger, social network and much more on your private server, under your control.",
- "page2_title": "SelfPrivacy — it's not a cloud, but your personal datacenter",
- "page2_text": "SelfPrivacy works only with your provider accounts: Hetzner, Cloudflare, Backblaze. If you do not own those, we'll help you to create them"
- },
- "providers": {
- "_comment": "'Providers' tab",
- "page_title": "Your Data Center",
- "server": {
- "card_title": "Server",
- "status": "Status — Good",
- "bottom_sheet": {
- "1": "It's a virtual computer, where all your services live.",
- "2": "General information",
- "3": "Location"
- },
- "chart": {
+ "console_page": {
+ "title": "Console",
+ "waiting": "Waiting for initialization…",
+ "copy": "Copy"
+ },
+ "about_us_page": {
+ "title": "About us"
+ },
+ "about_application_page": {
+ "title": "About",
+ "application_version_text": "Application version {}",
+ "api_version_text": "Server API version {}",
+ "privacy_policy": "Privacy policy"
+ },
+ "application_settings": {
+ "title": "Application settings",
+ "system_dark_theme_title": "System default theme",
+ "system_dark_theme_description": "Use light or dark theme depending on system settings",
+ "dark_theme_title": "Dark theme",
+ "dark_theme_description": "Switch your application theme",
+ "dangerous_settings": "Dangerous settings",
+ "reset_config_title": "Reset application config",
+ "reset_config_description": "Resets API keys and root user.",
+ "delete_server_title": "Delete server",
+ "delete_server_description": "This removes your server. It will be no longer accessible."
+ },
+ "ssh": {
+ "title": "SSH keys",
+ "create": "Create SSH key",
+ "delete": "Delete SSH key",
+ "delete_confirm_question": "Are you sure you want to delete SSH key?",
+ "subtitle_with_keys": "{} keys",
+ "subtitle_without_keys": "No keys",
+ "no_key_name": "Unnamed key",
+ "root_title": "These are superuser keys",
+ "root_subtitle": "Owners of these keys get full access to the server and can do anything on it. Only add your own keys to the server.",
+ "input_label": "Public ED25519, ECDSA or RSA key"
+ },
+ "onboarding": {
+ "page1_title": "Digital independence, available to all of us",
+ "page1_text": "Mail, VPN, Messenger, social network and much more on your private server, under your control.",
+ "page2_title": "SelfPrivacy is not a cloud, it's Your personal datacenter",
+ "page2_text": "SelfPrivacy only works with providers that you choose. If you do not have required accounts in those, we'll help you to create them.",
+ "page2_server_provider_title": "Server provider",
+ "page2_server_provider_text": "A server provider maintains your server in its own data center. SelfPrivacy will automatically connect to the provider and setup all necessary things.",
+ "page2_dns_provider_title": "DNS provider",
+ "page2_dns_provider_text": "You need a domain to have a place in the Internet. And you also need a reliable DNS provider to have the domain pointed to your server. We will suggest you pick a supported DNS provider to automatically setup networking.",
+ "page2_backup_provider_title": "Backup provider",
+ "page2_backup_provider_text": "What if something happens to your server? Imagine a hacker attack, an accidental data deletion or denial of service? Your data will be kept safe in your provider of backups. They will be securely encrypted and anytime accessible to restore your server with."
+ },
+ "resource_chart": {
"month": "Month",
"day": "Day",
- "hour": "Hour"
- }
+ "hour": "Hour",
+ "cpu_title": "CPU Usage",
+ "network_title": "Network Usage",
+ "in": "In",
+ "out": "Out"
},
- "domain": {
- "card_title": "Domain",
- "status": "Status — Good",
- "bottom_sheet": {
- "1": "It's your personal internet address that will point to the server and other services of yours."
- },
- "screen_title": "Domain and DNS",
- "states": {
- "ok": "Records are OK",
- "error": "Problems found",
- "error_subtitle": "Tap here to fix them",
- "refreshing": "Refreshing status...",
- "uninitialized": "Data is not retrieved yet"
- },
- "record_description": {
+ "server": {
+ "card_title": "Server",
+ "description": "All your services live here",
+ "general_information": "General information",
+ "resource_usage": "Resource usage",
+ "allow_autoupgrade": "Allow auto-upgrade",
+ "allow_autoupgrade_hint": "Allow automatic packages upgrades on server",
+ "reboot_after_upgrade": "Reboot after upgrade",
+ "reboot_after_upgrade_hint": "Reboot without prompt after applying changes on server",
+ "server_timezone": "Server timezone",
+ "select_timezone": "Select timezone",
+ "timezone_search_bar": "Timezone name or time shift value",
+ "server_id": "Server ID",
+ "status": "Status",
+ "cpu": "CPU",
+ "ram": "Memory",
+ "disk": "Disk local",
+ "monthly_cost": "Monthly cost",
+ "location": "Location",
+ "pricing_error": "Couldn't fetch provider prices",
+ "server_provider": "Server Provider",
+ "dns_provider": "DNS Provider",
+ "core_count": {
+ "one": "{} core",
+ "two": "{} cores",
+ "few": "{} cores",
+ "many": "{} cores",
+ "other": "{} cores"
+ }
+ },
+ "record": {
"root": "Root domain",
"api": "SelfPrivacy API",
"cloud": "File cloud",
@@ -129,295 +149,483 @@
"dmarc": "DMARC record",
"spf": "SPF record",
"dkim": "DKIM key"
- },
- "cards": {
- "services": {
- "title": "Services",
- "subtitle": "Type “A” records required for each service."
- },
- "email": {
- "title": "Email",
- "subtitle": "Records necessary for secure email exchange."
- }
- }
+ },
+ "domain": {
+ "card_title": "Domain",
+ "screen_title": "Domain and DNS",
+ "ok": "Records are OK",
+ "error": "Problems found",
+ "error_subtitle": "Tap here to fix them. This will also remove custom records.",
+ "refreshing": "Refreshing status…",
+ "uninitialized": "Data is not retrieved yet",
+ "services_title": "Services",
+ "services_subtitle": "Type “A” records required for each service.",
+ "email_title": "Email",
+ "email_subtitle": "Records necessary for secure email exchange.",
+ "update_list": "Update list"
},
"backup": {
- "card_title": "Backup",
- "status": "Status — Good",
- "bottom_sheet": {
- "1": "Will save your day in case of incident: hackers attack, server deletion, etc.",
- "2": "3Gb/10Gb, last backup was yesterday {}"
- },
- "reuploadKey": "Force reupload key",
- "reuploadedKey": "Key reuploaded",
- "initialize": "Initialize",
- "waitingForRebuild": "You will be able to create your first backup in a few minutes.",
- "restore": "Restore from backup",
- "no_backups": "There are no backups yet",
- "create_new": "Create a new backup",
- "creating": "Creating a new backup: {}%",
- "restoring": "Restoring from backup",
- "error_pending": "Server returned error, check it below",
- "restore_alert": "You are about to restore from backup created on {}. All current data will be lost. Are you sure?",
- "refresh": "Refresh status",
- "refetchBackups": "Refetch backup list",
- "refetchingList": "In a few minutes list will be updated"
- }
- },
- "not_ready_card": {
- "_comment": "Card shown when user skips initial setup",
- "1": "Please finish application setup using ",
- "2": "@:more.configuration_wizard",
- "3": " for further work",
- "in_menu": "Server is not set up yet. Please finish setup using setup wizard for further work."
- },
- "services": {
- "_comment": "Вкладка сервисы",
- "title": "Your personal, private and independent services.",
- "mail": {
- "title": "E-Mail",
- "subtitle": "E-Mail for company and family.",
- "login_info": "Use username and password from users tab. IMAP port is 143 with STARTTLS, SMTP port is 587 with STARTTLS.",
- "bottom_sheet": {
- "1": "To connect to the mailserver, please use {} domain alongside with username and password, that you created. Also feel free to invite",
- "2": "new users"
- }
+ "card_title": "Backup",
+ "card_subtitle": "Manage your backups",
+ "description": "Will save your day in case of incident: hackers attack, server deletion, etc.",
+ "reupload_key": "Force reupload key",
+ "reuploaded_key": "Key reuploaded",
+ "initialize": "Initialize",
+ "waiting_for_rebuild": "You will be able to create your first backup in a few minutes.",
+ "restore": "Restore from backup",
+ "no_backups": "There are no backups yet",
+ "create_new": "Create a new backup",
+ "creating": "Creating a new backup: {}%",
+ "restoring": "Restoring from backup",
+ "error_pending": "Server returned error, check it below",
+ "restore_alert": "You are about to restore from backup created on {}. All current data will be lost. Are you sure?",
+ "refresh": "Refresh status",
+ "refetch_backups": "Refetch backup list",
+ "refetch_backups_subtitle": "Invalidate cache and refetch data from your storage provider. May cause additional charges.",
+ "reupload_key_subtitle": "Will instruct the server to initialize backup storage again. Use if something is broken.",
+ "refetching_list": "In a few minutes list will be updated",
+ "select_all": "Backup everything",
+ "create_new_select_heading": "Select what to backup",
+ "start": "Start backup",
+ "service_busy": "Another backup operation is in progress",
+ "latest_snapshots": "Latest snapshots",
+ "latest_snapshots_subtitle": "Showing last 15 snapshots",
+ "show_more": "Show more",
+ "autobackup_period_title": "Automatic backups period",
+ "autobackup_period_subtitle": "Backups created every {period}",
+ "autobackup_period_never": "Automatic backups are disabled",
+ "autobackup_period_every": "Every {period}",
+ "autobackup_period_disable": "Disable automatic backups",
+ "autobackup_custom": "Custom",
+ "autobackup_custom_hint": "Enter custom period in minutes",
+ "autobackup_set_period": "Set period",
+ "autobackup_period_set": "Period set",
+ "backups_encryption_key": "Encryption key",
+ "backups_encryption_key_subtitle": "Keep it in a safe place.",
+ "backups_encryption_key_copy": "Copy the encryption key",
+ "backups_encryption_key_show": "Show the encryption key",
+ "backups_encryption_key_description": "This key is used to encrypt your backups. If you lose it, you will not be able to restore your backups. Keep it in a safe place, as it will be useful if you ever need to restore from backups manually.",
+ "backups_encryption_key_not_found": "Encryption key not found yet, please try again later.",
+ "pending_jobs": "Currently running backup jobs",
+ "snapshots_title": "Snapshot list",
+ "forget_snapshot": "Forget snapshot",
+ "forget_snapshot_alert": "You are about to delete this snapshot. Are you sure? This action usually cannot be undone.",
+ "forget_snapshot_error": "Couldn't forget snapshot",
+ "snapshot_modal_heading": "Snapshot details",
+ "snapshot_service_title": "Service",
+ "snapshot_creation_time_title": "Creation time",
+ "snapshot_id_title": "Snapshot ID",
+ "snapshot_modal_select_strategy": "Select the restore strategy",
+ "snapshot_modal_download_verify_option_title": "Download, verify and then replace",
+ "snapshot_modal_download_verify_option_description": "Less risk, but more free space needed. Downloads entire snapshot to the temporary storage, verifies it and then replaces the current data.",
+ "snapshot_modal_inplace_option_title": "Replace in place",
+ "snapshot_modal_inplace_option_description": "Less free space needed, but more risk. Replaces current data with the snapshot data during the download.",
+ "snapshot_modal_service_not_found": "This is a snapshot of a service you don't have on your server anymore. Usually this shouldn't happen, and we cannot do the automatic restore. You can still download the snapshot and restore it manually. Contact SelfPrivacy support if you need help.",
+ "restore_started": "Restore started, check the jobs list for the current status",
+ "snapshot_reason_title": "Creation reason",
+ "snapshot_reasons": {
+ "auto": "Created automatically",
+ "explicit": "Created by your explicit request",
+ "pre_restore": "Created as a precaution before risky restore",
+ "unknown": "Unknown"
+ },
+ "rotation_quotas_title": "Snapshot rotation settings",
+ "set_rotation_quotas": "Set new rotation quotas",
+ "quotas_set": "New backup rotation quotas set",
+ "quotas_only_applied_to_autobackups": "These settings are only applied to automatic backups. Manual backups won't get deleted.",
+ "quota_titles": {
+ "last": "How many latest backups to keep",
+ "daily": "How many daily backups to keep",
+ "weekly": "How many weekly backups to keep",
+ "monthly": "How many monthly backups to keep",
+ "yearly": "How many yearly backups to keep"
+ },
+ "quota_subtitles": {
+ "no_effect": "This rule has no effect because another rule will keep more backups",
+ "last": {
+ "zero": "Rule is disabled",
+ "one": "Last {} backup will be kept regardless of its age",
+ "two": "Last {} backups will be kept regardless of their age",
+ "few": "Last {} backups will be kept regardless of their age",
+ "many": "Last {} backups will be kept regardless of their age",
+ "other": "Last {} backups will be kept regardless of their age"
+ },
+ "last_infinite": "All backups will be kept",
+ "daily": {
+ "zero": "Rule is disabled",
+ "one": "Last {} daily backup will be kept",
+ "two": "Last {} daily backups will be kept",
+ "few": "Last {} daily backups will be kept",
+ "many": "Last {} daily backups will be kept",
+ "other": "Last {} daily backups will be kept"
+ },
+ "daily_infinite": "All daily backups will be kept",
+ "weekly": {
+ "zero": "Rule is disabled",
+ "one": "Last {} weekly backup will be kept",
+ "two": "Last {} weekly backups will be kept",
+ "few": "Last {} weekly backups will be kept",
+ "many": "Last {} weekly backups will be kept",
+ "other": "Last {} weekly backups will be kept"
+ },
+ "weekly_infinite": "All weekly backups will be kept",
+ "monthly": {
+ "zero": "Rule is disabled",
+ "one": "Last {} monthly backup will be kept",
+ "two": "Last {} monthly backups will be kept",
+ "few": "Last {} monthly backups will be kept",
+ "many": "Last {} monthly backups will be kept",
+ "other": "Last {} monthly backups will be kept"
+ },
+ "monthly_infinite": "All monthly backups will be kept",
+ "yearly": {
+ "zero": "Rule is disabled",
+ "one": "Last {} yearly backup will be kept",
+ "two": "Last {} yearly backups will be kept",
+ "few": "Last {} yearly backups will be kept",
+ "many": "Last {} yearly backups will be kept",
+ "other": "Last {} yearly backups will be kept"
+ },
+ "yearly_infinite": "All yearly backups will be kept"
+ }
},
- "messenger": {
- "title": "Messenger",
- "subtitle": "Telegram or Signal not so private as Delta.Chat that uses your private server.",
- "login_info": "Use the same username and password as for e-mail.",
- "bottom_sheet": {
- "1": "For connection, please use {} domain and credentials that you created."
- }
+ "storage": {
+ "card_title": "Server Storage",
+ "status_ok": "Disk usage is OK",
+ "status_error": "Low disk space",
+ "disk_usage": "{} used",
+ "disk_total": "{} total · {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "Bytes",
+ "extend_volume_button": "Extend volume",
+ "extending_volume_title": "Extending volume",
+ "extending_volume_description": "Resizing volume will allow you to store more data on your server without extending the server itself. Volume can only be extended: shrinking is not possible.",
+ "extending_volume_price_info": "Price includes VAT and is estimated from pricing data provided by your server provider. Server will be rebooted after resizing.",
+ "extending_volume_error": "Couldn't initialize volume extending.",
+ "extending_volume_modal_description": "Upgrade to {} for {} plan per month.",
+ "size": "Size",
+ "price": "Price",
+ "data_migration_title": "Data migration",
+ "data_migration_notice": "During migration all services will be turned off.",
+ "start_migration_button": "Start migration",
+ "migration_process": "Migrating…",
+ "migration_done": "Finish"
+ },
+ "not_ready_card": {
+ "in_menu": "Server is not set up yet. Please finish setup using setup wizard for further work."
+ },
+ "service_page": {
+ "nothing_here": "Nothing here",
+ "open_in_browser": "Open in browser",
+ "restart": "Restart service",
+ "disable": "Disable service",
+ "enable": "Enable service",
+ "move": "Move to another volume",
+ "uses": "Uses {usage} on {volume}",
+ "snapshots": "Backup snapshots",
+ "status": {
+ "active": "Up and running",
+ "inactive": "Stopped",
+ "failed": "Failed to start",
+ "off": "Disabled",
+ "activating": "Activating",
+ "deactivating": "Deactivating",
+ "reloading": "Restarting"
+ }
+ },
+ "mail": {
+ "title": "E-Mail",
+ "subtitle": "E-Mail for company and family.",
+ "login_info": "Use username and password from users tab. IMAP port is 143 with STARTTLS, SMTP port is 587 with STARTTLS."
},
"password_manager": {
- "title": "Password Manager",
- "subtitle": "Base of your security. Bitwarden will help you to create, store and move passwords between devices, as well as input them, when requested using autocompletion.",
- "login_info": "You will have to create an account on the website.",
- "bottom_sheet": {
- "1": "You can connect to the service and create a user via this link:"
- }
+ "title": "Password Manager",
+ "subtitle": "Base of your security. Bitwarden will help you to create, store and move passwords between devices, as well as input them, when requested using autocompletion.",
+ "login_info": "You will have to create an account on the website."
},
"video": {
- "title": "Videomeet",
- "subtitle": "Zoom and Google Meet are good, but Jitsi Meet is a worth alternative that also gives you confidence that you're not being listened.",
- "login_info": "No account needed.",
- "bottom_sheet": {
- "1": "Using Jitsi as simple as just visiting this link:"
- }
+ "title": "Videomeet",
+ "subtitle": "Zoom and Google Meet are good, but Jitsi Meet is a worth alternative that also gives you confidence that you're not being listened.",
+ "login_info": "No account needed."
},
"cloud": {
- "title": "Cloud Storage",
- "subtitle": "Do not allow cloud services to read your data by using NextCloud.",
- "login_info": "Login is admin, password is the same as with your main user. Create new accounts in Nextcloud interface.",
- "bottom_sheet": {
- "1": "You can connect and create a new user here:"
- }
+ "title": "Cloud Storage",
+ "subtitle": "Do not allow cloud services to read your data by using NextCloud.",
+ "login_info": "Login is admin, password is the same as with your main user. Create new accounts in Nextcloud interface."
},
"social_network": {
- "title": "Social Network",
- "subtitle": "It's hard to believe, but it became possible to create your own social network, with your own rules and target audience.",
- "login_info": "You will have to create an account on the website.",
- "bottom_sheet": {
- "1": "You can connect and create new social user here:"
- }
+ "title": "Social Network",
+ "subtitle": "It's hard to believe, but it became possible to create your own social network, with your own rules and target audience.",
+ "login_info": "You will have to create an account on the website."
},
"git": {
- "title": "Git Server",
- "subtitle": "Private alternative to the Github, that belongs to you, but not a Microsoft.",
- "login_info": "You will have to create an account on the website. First user will become an admin.",
- "bottom_sheet": {
- "1": "You can connect and create a new user here:"
- }
+ "title": "Git Server",
+ "subtitle": "Private alternative to the Github, that belongs to you, but not a Microsoft.",
+ "login_info": "You will have to create an account on the website. First user will become an admin."
},
"vpn": {
- "title": "VPN Server",
- "subtitle": "Private VPN server",
- "bottom_sheet": {
- "1": "Openconnect VPN Server. Engine for secure and scalable VPN infrastructure"
- }
- }
- },
- "users": {
- "_comment": "'Users' tab",
- "add_new_user": "Add a first user",
- "new_user": "New user",
- "not_ready": "Please connect server, domain and DNS in the Providers tab, to be able to add a first user",
- "nobody_here": "Nobody here",
- "login": "Login",
- "onboarding": "Onboarding",
- "console": "Console",
- "new_user_info_note": "New user will automatically be granted an access to all of the services",
- "delete_confirm_question": "Are you sure?",
- "reset_password": "Reset password",
- "account": "Account",
- "send_registration_data": "Share login credentials"
- },
- "initializing": {
- "_comment": "initializing page",
- "1": "Connect a server",
- "2": "A place where your data and SelfPrivacy services will reside:",
- "how": "How to obtain API token",
- "3": "Connect CloudFlare",
- "4": "To manage your domain's DNS",
- "5": "CloudFlare API Token",
- "6": "Connect Backblaze storage",
- "7": "No connected domains at the moment",
- "8": "Loading domains list",
- "9": "Found more than one domain. For your own security, please be asked to delete unnecessary domains",
- "10": "Save domain",
- "final": "Final step",
- "11": "Create server",
- "what": "What does it mean?",
- "13": "Server rebooted. Waiting for the last verification...",
- "14": "Server started. It will be validated and rebooted now...",
- "15": "Server created. DNS checks and server boot in progress...",
- "16": "Until the next check: ",
- "17": "Check",
- "19": "1 Go via this link ",
- "20": "\n",
- "21": "One more restart to apply your security certificates.",
- "22": "Create master account",
- "23": "Enter a nickname and strong password",
- "finish": "Everything is initialized",
- "checks": "Checks have been completed \n{} ouf of {}"
- },
- "recovering": {
- "recovery_main_header": "Connect to an existing server",
- "domain_recovery_description": "Enter a server domain you want to get access for:",
- "domain_recover_placeholder": "Your domain",
- "domain_recover_error": "Server with such domain was not found",
- "method_select_description": "Select a recovery method:",
- "method_select_other_device": "I have access on another device",
- "method_select_recovery_key": "I have a recovery key",
- "method_select_nothing": "I don't have any of that",
- "method_device_description": "Open the application on another device, then go to the devices page. Press \"Add device\" to receive your token.",
- "method_device_button": "I have received my token",
- "method_device_input_description": "Enter your authorization token",
- "method_device_input_placeholder": "Token",
- "method_recovery_input_description": "Enter your recovery key",
- "fallback_select_description": "What exactly do you have? Pick the first available option:",
- "fallback_select_token_copy": "Copy of auth token from other version of the application.",
- "fallback_select_root_ssh": "Root SSH access to the server.",
- "fallback_select_provider_console": "Access to the server console of my prodiver.",
- "authorization_failed": "Couldn't log in with this key",
- "fallback_select_provider_console_hint": "For example: Hetzner.",
- "hetzner_connected": "Connect to Hetzner",
- "hetzner_connected_description": "Communication established. Enter Hetzner token with access to {}:",
- "hetzner_connected_placeholder": "Hetzner token",
- "confirm_server": "Confirm server",
- "confirm_server_description": "Found your server! Confirm it is correct.",
- "confirm_server_accept": "Yes! That's it",
- "confirm_server_decline": "Choose a different server",
- "choose_server": "Choose your server",
- "choose_server_description": "We couldn't figure out which server your are trying to connect to.",
- "no_servers": "There is no available servers on your account.",
- "domain_not_available_on_token": "Selected domain is not available on this token.",
- "modal_confirmation_title": "Is it really your server?",
- "modal_confirmation_description": "If you connect to a wrong server you may lose all your data.",
- "modal_confirmation_dns_valid": "Reverse DNS is valid",
- "modal_confirmation_dns_invalid": "Reverse DNS points to another domain",
- "modal_confirmation_ip_valid": "IP is the same as in DNS record",
- "modal_confirmation_ip_invalid": "IP is not the same as in DNS record",
- "confirm_cloudflare": "Connect to CloudFlare",
- "confirm_cloudflare_description": "Enter a Cloudflare token with access to {}:",
- "confirm_backblaze": "Connect to Backblaze",
- "confirm_backblaze_description": "Enter a Backblaze token with access to backup storage:"
- },
- "devices": {
- "main_screen": {
- "header": "Devices",
- "description": "These devices have full access to the server via SelfPrivacy app.",
- "this_device": "This device",
- "other_devices": "Other devices",
- "authorize_new_device": "Authorize new device",
- "access_granted_on" : "Access granted on {}",
- "tip": "Press on the device to revoke access."
+ "title": "VPN Server",
+ "subtitle": "Private VPN server"
},
- "add_new_device_screen": {
- "header": "Authorizing new device",
- "description": "Enter the key on the device you want to authorize:",
- "please_wait": "Please wait",
- "tip": "The key is valid for 10 minutes.",
- "expired": "The key has expired.",
- "get_new_key": "Get new key"
+ "users": {
+ "details_title": "User details",
+ "add_new_user": "Add a first user",
+ "new_user": "New user",
+ "delete_user": "Delete user",
+ "nobody_here": "Nobody here",
+ "login": "Login",
+ "new_user_info_note": "New user will automatically be granted an access to all of the services",
+ "delete_confirm_question": "Are you sure?",
+ "reset_password": "Reset password",
+ "account": "Account",
+ "send_registration_data": "Share login credentials",
+ "could_not_fetch_users": "Couldn't fetch users list",
+ "could_not_fetch_description": "Please check your internet connection and try again",
+ "refresh_users": "Refresh users list",
+ "could_not_create_user": "Couldn't create user",
+ "could_not_delete_user": "Couldn't delete user",
+ "could_not_add_ssh_key": "Couldn't add SSH key",
+ "username_rule": "Username must contain only lowercase latin letters, digits and underscores, should not start with a digit",
+ "email_login": "Email login",
+ "no_ssh_notice": "Only email and SSH accounts are created for this user. Single Sign On for all services is coming soon."
},
- "revoke_device_alert": {
- "header": "Revoke access?",
- "description": "The device {} will no longer have access to the server.",
- "yes": "Revoke",
- "no": "Cancel"
+ "initializing": {
+ "server_provider_description": "A place where your data and SelfPrivacy services will reside:",
+ "dns_provider_description": "A service which lets your IP point towards domain names:",
+ "connect_to_server": "Let's start with a server.",
+ "select_provider": "Pick any provider from the following list, they all support SelfPrivacy",
+ "select_provider_notice": "By 'Relatively small' we mean a machine with 2 cores of CPU and 2 gigabytes of RAM.",
+ "select_provider_countries_title": "Available countries",
+ "select_provider_countries_text_hetzner": "Germany, Finland, USA",
+ "select_provider_countries_text_do": "USA, Netherlands, Singapore, UK, Germany, Canada, India, Australia",
+ "select_provider_price_title": "Average price",
+ "select_provider_price_free": "Free",
+ "select_provider_price_text_hetzner": "€8 per month for a relatively small server and 50GB of disk storage",
+ "select_provider_price_text_do": "$17 per month for a relatively small server and 50GB of disk storage",
+ "select_provider_payment_title": "Payment methods",
+ "select_provider_payment_text_hetzner": "Credit cards, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_do": "Credit cards, Google Pay, PayPal",
+ "select_provider_payment_text_cloudflare": "Credit cards",
+ "select_provider_email_notice": "E-mail hosting won't be available for new clients. Nevertheless it will be unlocked as soon as you complete your first payment.",
+ "select_provider_site_button": "Visit site",
+ "connect_to_server_provider": "Now log in ",
+ "connect_to_server_provider_text": "With API token SelfPrivacy will be able to rent a machine and setup your server on it",
+ "how": "How to obtain API token",
+ "provider_bad_key_error": "Provider API key is invalid",
+ "could_not_connect": "Counldn't connect to the provider.",
+ "choose_location_type": "Where do you want to order your server?",
+ "choose_location_type_text": "Different locations provide different server configurations, prices and connection speed.",
+ "locations_not_found": "Oops!",
+ "locations_not_found_text": "There are no available servers to rent",
+ "back_to_locations": "Select something else",
+ "no_locations_found": "No available locations found, make sure your account is accessible",
+ "choose_server_type": "What type of server do you need?",
+ "choose_server_type_text": "Different resource capabilities support different services. Don't worry, you can expand your server anytime",
+ "choose_server_type_notice": "The important things to look at are the CPU and RAM. The data of your services will be stored on a mounted volume which is easily expandable and gets paid for separately.",
+ "choose_server_type_ram": "{} GB of RAM",
+ "choose_server_type_storage": "{} GB of system storage",
+ "choose_server_type_payment_per_month": "{} per month",
+ "choose_server_type_payment_server": "{} for the server",
+ "choose_server_type_payment_storage": "{} for additional storage",
+ "choose_server_type_payment_ip": "{} for the public IPv4 address",
+ "no_server_types_found": "No available server types found. Make sure your account is accessible and try to change your server location.",
+ "dns_provider_bad_key_error": "API key is invalid",
+ "backblaze_bad_key_error": "Backblaze storage information is invalid",
+ "connect_to_dns": "Connect the DNS provider",
+ "connect_to_dns_provider_text": "With API token SelfPrivacy will manage all DNS entries",
+ "select_dns": "Now let's select a DNS provider",
+ "manage_domain_dns": "To manage your domain's DNS",
+ "use_this_domain": "Use this domain?",
+ "use_this_domain_text": "The token you provided gives access to the following domain",
+ "multiple_domains_found": "Multiple domains found",
+ "multiple_domains_found_text": "The token you provided gives access to the following domains. Please select the one you want to use. For the security of your other domains, you should restrict this token's access to only the domain you want to use with SelfPrivacy.",
+ "connect_backblaze_storage": "Connect Backblaze storage",
+ "no_connected_domains": "No connected domains at the moment",
+ "loading_domain_list": "Loading domain list",
+ "found_more_domains": "Found more than one domain. For your own security, please be asked to delete unnecessary domains",
+ "save_domain": "Save domain",
+ "final": "Final step",
+ "create_server": "Create server",
+ "what": "What does it mean?",
+ "server_rebooted": "Server rebooted. Waiting for the last verification…",
+ "server_started": "Server started. It will be validated and rebooted now…",
+ "server_created": "Server created. DNS checks and server boot in progress…",
+ "until_the_next_check": "Until the next check: ",
+ "check": "Check",
+ "one_more_restart": "One more restart to apply your security certificates.",
+ "create_master_account": "Create master account",
+ "enter_username_and_password": "Enter username and strong password",
+ "finish": "Everything is initialized",
+ "checks": "Checks have been completed \n{} out of {}",
+ "steps": {
+ "hosting": "Hosting",
+ "server_type": "Server type",
+ "dns_provider": "DNS provider",
+ "backups_provider": "Backups",
+ "domain": "Domain",
+ "master_account": "Master account",
+ "server": "Server",
+ "dns_setup": "DNS setup",
+ "nixos_installation": "NixOS installation",
+ "server_reboot": "Server reboot",
+ "final_checks": "Final checks"
+ }
+ },
+ "recovering": {
+ "generic_error": "Operation failed, please try again.",
+ "recovery_main_header": "Connect to an existing server",
+ "domain_recovery_description": "Enter a server domain you want to get access for:",
+ "domain_recover_placeholder": "Your domain",
+ "domain_recover_error": "Server with such domain was not found",
+ "method_select_description": "Select a recovery method:",
+ "method_select_other_device": "I have access on another device",
+ "method_select_recovery_key": "I have a recovery key",
+ "method_select_nothing": "I don't have any of that",
+ "method_device_description": "Open the application on another device, then go to the devices page. Press \"Add device\" to receive your token.",
+ "method_device_button": "I have received my token",
+ "method_device_input_description": "Enter your authorization token",
+ "method_device_input_placeholder": "Token",
+ "method_recovery_input_description": "Enter your recovery key",
+ "fallback_select_description": "What exactly do you have? Pick the first available option:",
+ "fallback_select_token_copy": "Copy of auth token from other version of the application.",
+ "fallback_select_root_ssh": "Root SSH access to the server.",
+ "fallback_select_provider_console": "Access to the server console of my provider.",
+ "authorization_failed": "Couldn't log in with this key",
+ "fallback_select_provider_console_hint": "For example: Hetzner.",
+ "provider_connected": "Connect to {}",
+ "provider_connected_description": "Enter your token with access to {}:",
+ "provider_connected_placeholder": "{} token",
+ "confirm_server": "Confirm server",
+ "confirm_server_description": "Found your server! Confirm it is the right one:",
+ "confirm_server_accept": "Yes! That's it",
+ "confirm_server_decline": "Choose a different server",
+ "choose_server": "Choose your server",
+ "choose_server_description": "We couldn't figure out which server your are trying to connect to.",
+ "no_servers": "There is no available servers on your account.",
+ "domain_not_available_on_token": "Selected domain is not available on this token.",
+ "modal_confirmation_title": "Is it really your server?",
+ "modal_confirmation_description": "If you connect to a wrong server you may lose all your data.",
+ "modal_confirmation_dns_valid": "Reverse DNS is valid",
+ "modal_confirmation_dns_invalid": "Reverse DNS points to another domain",
+ "modal_confirmation_ip_valid": "IP is the same as in DNS record",
+ "modal_confirmation_ip_invalid": "IP is not the same as in DNS record"
+ },
+ "devices": {
+ "main_screen": {
+ "header": "Devices",
+ "description": "These devices have full access to the server via SelfPrivacy app.",
+ "this_device": "This device",
+ "other_devices": "Other devices",
+ "authorize_new_device": "Authorize new device",
+ "access_granted_on": "Access granted on {}",
+ "tip": "Press on the device to revoke access."
+ },
+ "add_new_device_screen": {
+ "header": "Authorizing new device",
+ "description": "Enter the key on the device you want to authorize:",
+ "please_wait": "Please wait",
+ "tip": "The key is valid for 10 minutes.",
+ "expired": "The key has expired.",
+ "get_new_key": "Get new key"
+ },
+ "revoke_device_alert": {
+ "header": "Revoke access?",
+ "description": "The device {} will no longer have access to the server.",
+ "yes": "Revoke",
+ "no": "Cancel"
+ }
+ },
+ "recovery_key": {
+ "key_connection_error": "Couldn't connect to the server.",
+ "key_synchronizing": "Synchronizing…",
+ "key_main_header": "Recovery key",
+ "key_main_description": "Is needed for SelfPrivacy authorization when all your other authorized devices aren't available.",
+ "key_amount_toggle": "Limit by number of uses",
+ "key_amount_field_title": "Max number of uses",
+ "key_duedate_toggle": "Limit by time",
+ "key_duedate_field_title": "Due date of expiration",
+ "key_receive_button": "Receive key",
+ "key_valid": "Your key is valid",
+ "key_invalid": "Your key is no longer valid",
+ "key_valid_until": "Valid until {}",
+ "key_valid_for": "Valid for {} uses",
+ "key_creation_date": "Created on {}",
+ "key_replace_button": "Generate new key",
+ "key_receiving_description": "Write down this key and put to a safe place. It is used to restore full access to your server:",
+ "key_receiving_info": "The key will never ever be shown again, but you will be able to replace it with another one.",
+ "key_receiving_done": "Done!",
+ "generation_error": "Couldn't generate a recovery key. {}"
+ },
+ "modals": {
+ "dns_removal_error": "Couldn't remove DNS records.",
+ "server_deletion_error": "Couldn't delete active server.",
+ "volume_creation_error": "Couldn't create volume.",
+ "server_validators_error": "Couldn't fetch available servers.",
+ "already_exists": "Such server already exists.",
+ "unexpected_error": "Unexpected error during placement from the provider side.",
+ "destroy_server": "Destroy the server and create a new one?",
+ "try_again": "Try again?",
+ "are_you_sure": "Are you sure?",
+ "purge_all_keys": "Purge all authentication keys?",
+ "purge_all_keys_confirm": "Yes, purge all my tokens",
+ "delete_server_volume": "Delete the server and volume?",
+ "reboot": "Reboot",
+ "you_cant_use_this_api": "You cannot use this API for domains with such TLD.",
+ "yes": "Yes",
+ "no": "No"
+ },
+ "timer": {
+ "sec": "{} sec"
+ },
+ "jobs": {
+ "title": "Jobs list",
+ "start": "Start",
+ "empty": "No jobs",
+ "create_user": "Create user",
+ "delete_user": "Delete user",
+ "service_turn_off": "Turn off",
+ "service_turn_on": "Turn on",
+ "job_added": "Job added",
+ "run_jobs": "Run jobs",
+ "reboot_success": "Server is rebooting",
+ "reboot_failed": "Couldn't reboot the server. Check the app logs.",
+ "config_pull_failed": "Failed to pull configuration upgrade. Started software upgrade anyways.",
+ "upgrade_success": "Server upgrade started",
+ "upgrade_failed": "Failed to upgrade server",
+ "upgrade_server": "Upgrade server",
+ "reboot_server": "Reboot server",
+ "create_ssh_key": "Create SSH key for {}",
+ "delete_ssh_key": "Delete SSH key for {}",
+ "server_jobs": "Jobs on the server",
+ "reset_user_password": "Reset password of user",
+ "generic_error": "Couldn't connect to the server!"
+ },
+ "validations": {
+ "required": "Required",
+ "already_exist": "Already exists",
+ "invalid_format": "Invalid format",
+ "invalid_format_password": "Password must not contain spaces",
+ "invalid_format_ssh": "Must follow the SSH key format",
+ "root_name": "Cannot be 'root'",
+ "length_not_equal": "Length is [], should be {}",
+ "length_longer": "Length is [], should be shorter than or equal to {}"
+ },
+ "support": {
+ "title": "SelfPrivacy Support"
+ },
+ "developer_settings": {
+ "title": "Developer settings",
+ "subtitle": "These settings are for debugging only. Don't change them unless you know what you're doing.",
+ "server_setup": "Server setup",
+ "use_staging_acme": "Use staging ACME server",
+ "use_staging_acme_description": "Applies when setting up a new server.",
+ "ignore_tls": "Do not verify TLS certificates",
+ "ignore_tls_description": "App will not verify TLS certificates when connecting to the server.",
+ "routing": "App routing",
+ "reset_onboarding": "Reset onboarding switch",
+ "reset_onboarding_description": "Reset onboarding switch to show onboarding screen again",
+ "cubit_statuses": "Cubit loading statuses"
}
- },
- "recovery_key": {
- "key_connection_error": "Couldn't connect to the server.",
- "key_synchronizing": "Synchronizing...",
- "key_main_header": "Recovery key",
- "key_main_description": "Is needed for SelfPrivacy authorization when all your other authorized devices aren't available.",
- "key_amount_toggle": "Limit by number of uses",
- "key_amount_field_title": "Max number of uses",
- "key_duedate_toggle": "Limit by time",
- "key_duedate_field_title": "Due date of expiration",
- "key_receive_button": "Receive key",
- "key_valid": "Your key is valid",
- "key_invalid": "Your key is no longer valid",
- "key_valid_until": "Valid until {}",
- "key_valid_for": "Valid for {} uses",
- "key_creation_date": "Created on {}",
- "key_replace_button": "Generate new key",
- "key_receiving_description": "Write down this key and put to a safe place. It is used to restore full access to your server:",
- "key_receiving_info": "The key will never ever be shown again, but you will be able to replace it with another one.",
- "key_receiving_done": "Done!",
- "generation_error": "Couldn't generate a recovery key. {}"
- },
- "modals": {
- "_comment": "messages in modals",
- "1": "Server with such name, already exist",
- "2": "Destroy server and create a new one?",
- "3": "Are you sure?",
- "4": "Purge all authentication keys?",
- "5": "Yes, purge all my tokens",
- "6": "Delete the server and volume?",
- "7": "Yes",
- "8": "Remove task",
- "9": "Reboot",
- "10": "You cannot use this API for domains with such TLD.",
- "yes": "Yes",
- "no": "No"
- },
- "timer": {
- "sec": "{} sec"
- },
- "jobs": {
- "_comment": "Jobs list",
- "title": "Jobs list",
- "start": "Start",
- "empty": "No jobs",
- "createUser": "Create user",
- "deleteUser": "Delete user",
- "serviceTurnOff": "Turn off",
- "serviceTurnOn": "Turn on",
- "jobAdded": "Job added",
- "runJobs": "Run jobs",
- "rebootSuccess": "Server is rebooting",
- "rebootFailed": "Couldn't reboot the server. Check the app logs.",
- "configPullFailed": "Failed to pull configuration upgrade. Started software upgrade anyways.",
- "upgradeSuccess": "Server upgrade started",
- "upgradeFailed": "Failed to upgrade server",
- "upgradeServer": "Upgrade server",
- "rebootServer": "Reboot server",
- "create_ssh_key": "Create SSH key for {}",
- "delete_ssh_key": "Delete SSH key for {}"
- },
- "validations": {
- "required": "Required.",
- "invalid_format": "Invalid format.",
- "root_name": "User name cannot be 'root'.",
- "key_format": "Invalid key format.",
- "length_not_equal": "Length is []. Should be {}.",
- "length_longer": "Length is []. Should be shorter than or equal to {}.",
- "user_already_exist": "This user already exists.",
- "key_already_exists": "This key already exists."
- }
-}
+}
\ No newline at end of file
diff --git a/assets/translations/es.json b/assets/translations/es.json
new file mode 100644
index 00000000..2c240edd
--- /dev/null
+++ b/assets/translations/es.json
@@ -0,0 +1,92 @@
+{
+ "basis": {
+ "providers_title": "Su Centro de Datos",
+ "select": "Seleccione",
+ "services": "Servicios",
+ "providers": "Proveedores",
+ "users": "Usuarios",
+ "more": "Más",
+ "next": "Próximo",
+ "got_it": "Entendido",
+ "settings": "Ajustes",
+ "password": "Contraseña",
+ "create": "Añadir nuevo",
+ "confirmation": "Confirmación",
+ "cancel": "Anular",
+ "delete": "Eliminar",
+ "services_title": "Tus servicios personales, privados e independientes.",
+ "connect": "Conecte",
+ "saving": "Ahorrar…",
+ "username": "Nombre de usuario",
+ "loading": "Cargando…",
+ "later": "Saltar a la configuración posterior",
+ "reset": "Restablecer",
+ "details": "Detalles",
+ "no_data": "Sin datos",
+ "wait": "Espere",
+ "alert": "Alerta",
+ "continue": "Continuar",
+ "close": "Cerrar",
+ "domain": "Dominio",
+ "remove": "Eliminar",
+ "apply": "Solicitar",
+ "done": "Hecho",
+ "connect_to_existing": "Conectarse a un servidor existente"
+ },
+ "test": "es-test",
+ "locale": "es",
+ "application_settings": {
+ "reset_config_title": "Restablecer la configuración de la aplicación",
+ "dark_theme_description": "Cambia el tema de tu aplicación",
+ "reset_config_description": "Restablecer claves API y usuario root.",
+ "delete_server_title": "Eliminar servidor",
+ "delete_server_description": "Esto elimina su servidor. Ya no será accesible.",
+ "title": "Ajustes de la aplicación",
+ "dark_theme_title": "Tema oscuro"
+ },
+ "ssh": {
+ "delete_confirm_question": "¿Está seguro de que desea eliminar la clave SSH?",
+ "root_subtitle": "Los propietarios de estas claves tienen acceso total al servidor y pueden hacer cualquier cosa en él. Añade sólo tus propias claves al servidor.",
+ "title": "SSH Claves",
+ "create": "Crear clave SSH",
+ "delete": "Eliminar clave SSH",
+ "subtitle_with_keys": "{} claves",
+ "subtitle_without_keys": "Sin llaves",
+ "no_key_name": "Clave sin nombre",
+ "root_title": "Estas son las claves de superusuario",
+ "input_label": "Clave pública ED25519 o RSA"
+ },
+ "about_application_page": {
+ "application_version_text": "Versión de la aplicación v.{}",
+ "title": "Sobre",
+ "api_version_text": "Versión API del servidor v.{}",
+ "privacy_policy": "Política de privacidad"
+ },
+ "onboarding": {
+ "page2_text": "SelfPrivacy sólo trabaja con los proveedores que usted elija. Si no tiene cuentas obligatorias en ellos, le ayudaremos a crearlas.",
+ "page1_title": "La independencia digital, al alcance de todos",
+ "page1_text": "Correo, VPN, Messenger, red social y mucho más en tu servidor privado, bajo tu control.",
+ "page2_title": "SelfPrivacy no es una nube, es tu centro de datos personal",
+ "page2_server_provider_title": "Servidor proveedor",
+ "page2_server_provider_text": "Un proveedor de servidores mantiene su servidor en su propio centro de datos. SelfPrivacy se conectará automáticamente al proveedor y configurará todo lo necesario.",
+ "page2_dns_provider_title": "Proveedor de DNS",
+ "page2_backup_provider_title": "Proveedor de copias de seguridad",
+ "page2_dns_provider_text": "Necesitas un dominio para tener un lugar en Internet. Y también necesitas un proveedor de DNS fiable para que el dominio apunte a tu servidor. Le sugeriremos que elija un proveedor de DNS compatible para configurar automáticamente la red."
+ },
+ "more_page": {
+ "configuration_wizard": "Asistente de configuración",
+ "about_project": "Sobre nosotros",
+ "about_application": "Sobre",
+ "onboarding": "Incorporación",
+ "create_ssh_key": "Claves SSH de superusuario",
+ "console": "Consola",
+ "application_settings": "Ajustes de la aplicación"
+ },
+ "console_page": {
+ "title": "Consola",
+ "waiting": "Esperando la inicialización…"
+ },
+ "about_us_page": {
+ "title": "Sobre nosotros"
+ }
+}
\ No newline at end of file
diff --git a/assets/translations/fr.json b/assets/translations/fr.json
new file mode 100644
index 00000000..5fa6d1cc
--- /dev/null
+++ b/assets/translations/fr.json
@@ -0,0 +1,288 @@
+{
+ "test": "fr-test",
+ "locale": "fr",
+ "basis": {
+ "providers": "Fournisseurs",
+ "providers_title": "Ton Centre de Données",
+ "select": "Sélectionner",
+ "services": "Services",
+ "services_title": "Tes services personnels, privés et indépendants.",
+ "users": "Utilisateurs",
+ "more": "Plus",
+ "next": "Suivant",
+ "got_it": "Compris",
+ "settings": "Paramètres",
+ "password": "Mot de passe",
+ "create": "Ajouter nouveau",
+ "confirmation": "Confirmation",
+ "cancel": "Annuler",
+ "delete": "Supprimer",
+ "close": "Fermer",
+ "connect": "Connecter",
+ "domain": "Domaine",
+ "saving": "Enregistrement…",
+ "username": "Nom d'utilisateur",
+ "loading": "Chargement…",
+ "later": "Passer à la configuration plus tard",
+ "connect_to_existing": "Se connecter à un server existant",
+ "reset": "Réinitialiser",
+ "details": "Détails",
+ "no_data": "Pas de données",
+ "wait": "Attendez",
+ "remove": "Supprimer",
+ "alert": "Alerte",
+ "continue": "Continuer",
+ "apply": "Appliquer",
+ "done": "Effectué",
+ "app_name": "SelfPrivacy"
+ },
+ "more_page": {
+ "about_application": "À propos",
+ "create_ssh_key": "Clés SSH du super utilisateur",
+ "console": "Console",
+ "application_settings": "Paramètres de l'application",
+ "configuration_wizard": "Assistant de configuration",
+ "about_project": "À propos de nous",
+ "onboarding": "Embarquement"
+ },
+ "console_page": {
+ "title": "Console",
+ "waiting": "En attente de l'initialisation…"
+ },
+ "about_us_page": {
+ "title": "À propos de nous"
+ },
+ "about_application_page": {
+ "title": "À propos",
+ "privacy_policy": "Politique de confidentialité",
+ "application_version_text": "Version de l'application {}"
+ },
+ "application_settings": {
+ "title": "Paramètres de l'application",
+ "dark_theme_description": "Changer le thème de l'application",
+ "reset_config_title": "Réinitialiser la configuration de l'application",
+ "delete_server_title": "Supprimer le serveur",
+ "delete_server_description": "Cela va supprimer votre serveur. Celui-ci ne sera plus accessible.",
+ "dark_theme_title": "Thème sombre",
+ "reset_config_description": "Réinitialiser les clés API et l'utilisateur root."
+ },
+ "ssh": {
+ "title": "Clés SSH",
+ "create": "Créer une clé SSH",
+ "delete": "Supprimer une clé SSH",
+ "delete_confirm_question": "Êtes-vous sûr de vouloir supprimer la clé SSH ?",
+ "subtitle_with_keys": "{} clés",
+ "subtitle_without_keys": "Pas de clés SSH",
+ "no_key_name": "Clé sans nom",
+ "input_label": "Clé RSA ou ED25519 publique",
+ "root_title": "Ce sont les clés SSH du superutilisateur",
+ "root_subtitle": "Les possesseurs de ses clés SSH obtiennent le contrôle total sur le serveur et peuvent faire ce qu'ils veulent dessus. Il suffit d'ajouter vos clés SSH sur ce serveur."
+ },
+ "onboarding": {
+ "page1_title": "Indépendance numérique, accessible à nous tous",
+ "page1_text": "Mail, VPN, messagerie, réseau social et bien plus sur votre serveur privé, sous votre contrôle.",
+ "page2_title": "SelfPrivacy n'est pas un cloud, c'est votre centre de données personnel",
+ "page2_server_provider_title": "Hébergeur",
+ "page2_server_provider_text": "Un hébergeur maintient votre serveur dans son propre datacenter. SelfPrivacy va automatiquement se connecter à votre fournisseur et installer tout le nécessaire.",
+ "page2_dns_provider_title": "Fournisseur de DNS",
+ "page2_backup_provider_title": "Fournisseur de sauvegarde",
+ "page2_text": "SelfPrivacy fonctionne uniquement avec les fournisseurs que vous choisissez. Si vous n'avez pas de compte sur ceux-ci, nous allons vous aider à en créer.",
+ "page2_dns_provider_text": "Vous avez besoin d'un domaine pour avoir un espace sur l'Internet. Il est également nécessaire de disposer d'un fournisseur de DNS fiable pour que votre domaine pointe sur votre serveur. Nous allons vous suggérer de choisir des fournisseurs DNS supportés pour automatiquement configurer le réseau."
+ },
+ "resource_chart": {
+ "month": "Mois",
+ "day": "Jour",
+ "hour": "Heure",
+ "cpu_title": "Utilisation du CPU",
+ "network_title": "Utilisation du réseau"
+ },
+ "server": {
+ "card_title": "Serveur",
+ "general_information": "Informations générales",
+ "resource_usage": "Utilisation des ressources",
+ "allow_autoupgrade": "Permettre la mise à jour automatique",
+ "allow_autoupgrade_hint": "Permettre la mise à jour des paquets automatiquement sur le serveur",
+ "reboot_after_upgrade": "Redémarrer après mise à jour",
+ "reboot_after_upgrade_hint": "Redémarrer sans demander après application des changements sur le serveur",
+ "server_id": "ID du serveur",
+ "status": "Statut",
+ "cpu": "Processeur",
+ "ram": "Mémoire",
+ "disk": "Disque local",
+ "monthly_cost": "Coût mensuel",
+ "location": "Localisation",
+ "core_count": {
+ "one": "{} cœur",
+ "two": "{} cœurs",
+ "many": "{} cœurs",
+ "other": "{} cœurs",
+ "few": "{} cœurs"
+ },
+ "server_timezone": "Fuseau horaire du serveur",
+ "select_timezone": "Sélectionner le fuseau horaire"
+ },
+ "record": {
+ "root": "Domaine racine",
+ "api": "API de SelfPrivacy",
+ "git": "Serveur Git",
+ "meet": "Conférence vidéo",
+ "social": "Réseau social",
+ "password": "Gestionnaire de mot de passe",
+ "vpn": "VPN",
+ "dmarc": "Enregistrement DMARC",
+ "spf": "Enregistrement SPF",
+ "dkim": "Clé DKIM",
+ "mx": "Enregistrement MX"
+ },
+ "domain": {
+ "card_title": "Domaine",
+ "screen_title": "Domaines et DNS",
+ "error": "Problèmes détectés",
+ "error_subtitle": "Clique ici pour les fixer",
+ "refreshing": "Rafraîchissement du statut…",
+ "services_title": "Services",
+ "services_subtitle": "Enregistrement de type \"A\" requis pour chaque service.",
+ "email_title": "Email",
+ "email_subtitle": "Enregistrements nécessaires pour l'échange sécurisé d'email.",
+ "update_list": "Liste mise à jour",
+ "ok": "Les enregistrements DNS sont OK",
+ "uninitialized": "Les données n'ont pas encore été récupérées"
+ },
+ "backup": {
+ "card_title": "Sauvegarde",
+ "reuploaded_key": "Clés republiées",
+ "initialize": "Initialise",
+ "waiting_for_rebuild": "Vous serez capable de créer votre première sauvegarde dans quelques instants.",
+ "restore": "Restaurer depuis la sauvegarde",
+ "create_new": "Créer une nouvelle sauvegarde",
+ "creating": "Création d'une nouvelle sauvegarde: {}%",
+ "restoring": "Restauration depuis la sauvegarde",
+ "restore_alert": "Vous allez restaurer depuis la sauvegarde créée le {}. Toutes les données existantes vont être perdues. Êtes-vous sûr ?",
+ "refresh": "Statut d'avancement",
+ "refetching_list": "Dans quelques minutes, la liste sera mise à jour",
+ "reupload_key": "Forcer la republication de la clé",
+ "no_backups": "Il n'y a pour l'instant aucune sauvegarde",
+ "error_pending": "Le serveur a retourné une erreur, vérifier plus bas",
+ "refetch_backups": "Récupérer la liste des mise à jour"
+ },
+ "storage": {
+ "card_title": "Stockage du serveur",
+ "status_ok": "L'utilisation du disque est OK",
+ "status_error": "Faible espace disque",
+ "disk_usage": "{} utilisé",
+ "disk_total": "{} total · {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "extending_volume_title": "Extension du volume",
+ "extending_volume_price_info": "Les prix incluent la TVA et sont estimés par les données commerciales fournies par Hetzner.\nLe serveur va redémarrer après redimensionnement.",
+ "extending_volume_error": "Pas possible d'initialiser l'extension du volume.",
+ "size": "Taille",
+ "data_migration_title": "Migration de données",
+ "data_migration_notice": "Durant la migration, tous les services ne seront plus accessibles.",
+ "start_migration_button": "Démarrer la migration",
+ "migration_process": "Migration en cours…",
+ "migration_done": "Terminé",
+ "extend_volume_button": "Étendre le volume",
+ "extending_volume_description": "Redimensionner le volume va vous permettre de stocker davantage de données sur votre serveur sans étendre le serveur lui-même. Les volumes ne peuvent être qu'étendus, le shrinking n'est pas possible."
+ },
+ "service_page": {
+ "open_in_browser": "Ouvrir dans le navigateur",
+ "restart": "Redémarrer le service",
+ "status": {
+ "active": "Démarré et opérationnel",
+ "inactive": "Arrêté",
+ "failed": "Démarrage en échec",
+ "off": "Désactivé",
+ "activating": "Activation",
+ "deactivating": "Désactivation",
+ "reloading": "Redémarrage"
+ },
+ "disable": "Désactiver le service",
+ "enable": "Activer le service",
+ "move": "Déplacer sur un autre volume",
+ "uses": "Utilise {usage} du {volume}"
+ },
+ "mail": {
+ "title": "E-Mail",
+ "login_info": "Utiliser l'identifiant et le mot de passe de l'onglets utilisateurs. Le port IMAP est 143 avec STARTTLS, le port SMTP est 587 avec STARTTLS.",
+ "subtitle": "E-Mail pour des entreprises et la famille."
+ },
+ "not_ready_card": {
+ "in_menu": "Le serveur n'est pas encore configuré. Veuillez finir le paramétrage en utilisant l'assistant d'installation pour aller plus loin."
+ },
+ "validations": {
+ "invalid_format_password": "Ne doit pas contenir d'espace",
+ "invalid_format": "Format invalide",
+ "already_exist": "Existe déjà",
+ "required": "Requis",
+ "invalid_format_ssh": "Doit correspondre au format de clé SSH",
+ "root_name": "Ne peut être 'root'"
+ },
+ "jobs": {
+ "create_ssh_key": "Créer une clé SSH pour {}",
+ "reboot_failed": "Impossible de redémarrer le serveur. Veuillez vérifier les logs applicatifs.",
+ "delete_user": "Supprimer utilisateur",
+ "generic_error": "Impossible de se connecter au serveur!",
+ "delete_ssh_key": "Supprimer la clé SSH pour {}",
+ "reboot_server": "Redémarrer le serveur",
+ "upgrade_server": "Mise à jour du serveur",
+ "upgrade_failed": "Impossible de mettre à jour le serveur",
+ "upgrade_success": "Mise à jour du serveur démarrée",
+ "reboot_success": "Le serveur redémarre",
+ "run_jobs": "Lancer des jobs",
+ "job_added": "Job ajouté",
+ "service_turn_on": "Lancer",
+ "reset_user_password": "Réinitialiser le mot de passe de l'utilisateur",
+ "service_turn_off": "Arrêter",
+ "create_user": "Créer utilisateur",
+ "empty": "Pas de jobs",
+ "server_jobs": "Jobs sur le serveur",
+ "start": "Démarrer",
+ "title": "Liste des jobs"
+ },
+ "modals": {
+ "you_cant_use_this_api": "Vous ne pouvez pas utiliser cette API pour un domaine avec cette extension.",
+ "destroy_server": "Effacer le serveur et en créer un nouveau?",
+ "no": "Non",
+ "yes": "Oui",
+ "reboot": "Redémarrer",
+ "delete_server_volume": "Supprimer le serveur et le volume?",
+ "purge_all_keys_confirm": "Oui, purger tous mes tokens",
+ "purge_all_keys": "Purger toutes les clés d'authentification?",
+ "are_you_sure": "Êtes-vous sûr?",
+ "try_again": "Essayer à nouveau?"
+ },
+ "password_manager": {
+ "title": "Gestionnaire de mot de passe",
+ "subtitle": "La base de votre sécurité. Bitwarden vous aidera à créer, stocker et déplacer les mots de passe entre appareils, ainsi qu'à les saisir, lorsque cela est demandé, en utilisant l'autocomplétion.",
+ "login_info": "Vous devrez créer un compte sur le site web."
+ },
+ "timer": {
+ "sec": "{} secondes"
+ },
+ "cloud": {
+ "title": "Stockage cloud",
+ "subtitle": "Ne permettez pas aux services cloud de lire vos données en utilisant NextCloud.",
+ "login_info": "Le login est admin, le mot de passe est le même que votre utilisateur principal. Créer de nouveaux comptes via l'interface Nextcloud."
+ },
+ "video": {
+ "title": "Vidéoconférence",
+ "subtitle": "Zoom et Google Meet sont biens, mais Jitsi Meet est une alternative valable qui vous donne également l'assurance que vous n'êtes pas écouter.",
+ "login_info": "Pas de compte nécessaire."
+ },
+ "social_network": {
+ "title": "Réseaux sociaux",
+ "subtitle": "C'est difficile à croire mais il devient possible de créer votre propre réseau social, avec vos propres règles et votre propre public cible.",
+ "login_info": "Vous devrez créer un compte sur le site web."
+ },
+ "git": {
+ "title": "Serveur Git",
+ "subtitle": "Une alternative privée à Github, qui vous appartient et qui n'appartient pas à Microsoft.",
+ "login_info": "Vous devrez créer un compte sur le site web. Le premier utilisateur deviendra admin."
+ },
+ "vpn": {
+ "title": "Serveur VPN",
+ "subtitle": "Serveur VPN privé"
+ }
+}
diff --git a/assets/translations/id.json b/assets/translations/id.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/assets/translations/id.json
@@ -0,0 +1 @@
+{}
diff --git a/assets/translations/it.json b/assets/translations/it.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/assets/translations/it.json
@@ -0,0 +1 @@
+{}
diff --git a/assets/translations/ja.json b/assets/translations/ja.json
new file mode 100644
index 00000000..07e84b75
--- /dev/null
+++ b/assets/translations/ja.json
@@ -0,0 +1,4 @@
+{
+ "test": "jp-test",
+ "locale": "jp"
+}
diff --git a/assets/translations/ka.json b/assets/translations/ka.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/assets/translations/ka.json
@@ -0,0 +1 @@
+{}
diff --git a/assets/translations/kk.json b/assets/translations/kk.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/assets/translations/kk.json
@@ -0,0 +1 @@
+{}
diff --git a/assets/translations/lv.json b/assets/translations/lv.json
new file mode 100644
index 00000000..bac9a852
--- /dev/null
+++ b/assets/translations/lv.json
@@ -0,0 +1,217 @@
+{
+ "test": "lv-test",
+ "basis": {
+ "app_name": "SelfPrivacy",
+ "providers_title": "Tavs Datu Centrs",
+ "select": "Izvēlies",
+ "services": "Servisi",
+ "services_title": "Tavi personīgie, privātie un neatkarīgie servisi.",
+ "users": "Lietotāji",
+ "more": "Vairāk",
+ "next": "Nākamais",
+ "got_it": "Sapratu",
+ "password": "Parole",
+ "create": "Pievienot jaunu",
+ "confirmation": "Apstiprinājums",
+ "cancel": "Atcelt",
+ "delete": "Izdzēst",
+ "close": "Aizvērt",
+ "connect": "Savienoties",
+ "domain": "Domēna",
+ "saving": "Saglabā…",
+ "username": "Lietotājvārds",
+ "later": "Izlaist un iestatīt vēlāk",
+ "connect_to_existing": "Savienoties ar esošu serveri",
+ "reset": "Atiestatīt",
+ "details": "Detaļas",
+ "no_data": "Nav dati",
+ "wait": "Uzgaidiet",
+ "remove": "Noņemt",
+ "apply": "Pieteikties",
+ "done": "Pabeigts",
+ "alert": "Brīdinājums",
+ "providers": "Sniedzēji",
+ "settings": "Iestatījumi",
+ "loading": "Lādē…",
+ "continue": "Turpināt"
+ },
+ "more_page": {
+ "configuration_wizard": "Iestatīšanas vednis",
+ "about_project": "Par mums",
+ "about_application": "Par",
+ "onboarding": "Pievienošanās",
+ "console": "Konsole",
+ "application_settings": "Aplikācijas iestatījumi",
+ "create_ssh_key": "Superlietotāja SSH atslēgas"
+ },
+ "console_page": {
+ "title": "Konsole",
+ "copy": "Kopēt",
+ "waiting": "Gaida inicializatīnu…"
+ },
+ "about_us_page": {
+ "title": "Par mums"
+ },
+ "about_application_page": {
+ "title": "Par",
+ "application_version_text": "Aplikācijas versija {}",
+ "api_version_text": "Servera API versija {}",
+ "privacy_policy": "Privātuma politika"
+ },
+ "application_settings": {
+ "system_dark_theme_title": "Sistēmas noklusējuma dizains",
+ "dark_theme_title": "Tumšs dizains",
+ "title": "Aplikācijas iestatījumi",
+ "system_dark_theme_description": "Izmantojiet gaišu vai tumšu dizainu atkarībā no sistēmas iestatījumiem",
+ "dark_theme_description": "Lietojumprogrammas dizaina pārslēgšana",
+ "dangerous_settings": "Bīstamie iestatījumi",
+ "reset_config_title": "Atiestatīt lietojumprogrammas konfigurāciju",
+ "reset_config_description": "Atiestatīt API atslēgas un saknes lietotāju.",
+ "delete_server_title": "Izdzēst serveri",
+ "delete_server_description": "Šis izdzēš jūsu serveri. Tas vairs nebūs pieejams."
+ },
+ "locale": "lv",
+ "ssh": {
+ "title": "SSH atslēgas",
+ "create": "Izveidot SSH atslēgu",
+ "delete": "Izdzēst SSH atslēgu",
+ "subtitle_with_keys": "{} atslēgas",
+ "subtitle_without_keys": "Nav atslēgu",
+ "no_key_name": "Nenosaukta atslēga",
+ "root_title": "Šīs ir superlietotāja atslēgas",
+ "input_label": "Publiska ED25519 vai RSA atslēga",
+ "delete_confirm_question": "Vai jūs esat pārliecināti, ka vēlaties izdzēst SSH atslēgu?",
+ "root_subtitle": "Šo atslēgu īpašnieki saņem pilnu piekļuvi serverim un var ar to kaut ko darīt. Pievienojiet serverim tikai savas atslēgas."
+ },
+ "onboarding": {
+ "page1_title": "Digitālā neatkarība, kas pieejama mums visiem",
+ "page1_text": "Pasts, VPN, Ziņnesis, sociālie tīkli un daudz cits uz tava privātā servera, zem tavas kontroles.",
+ "page2_title": "SelfPrivacy nav mākonis, tas ir tavs personīgais datu centrs",
+ "page2_server_provider_title": "Servera sniedzējs",
+ "page2_server_provider_text": "Servera sniedzējs uztur tavu serveri savā datu centrā. SelfPrivacy automātiksi savienosies ar sniedzēju un uzstādīs visas vajadzīgās lietas.",
+ "page2_dns_provider_title": "DNS sniedzējs",
+ "page2_backup_provider_title": "Dublēšanas pakalpojumu sniedzējs",
+ "page2_backup_provider_text": "Ko darīt, ja kaut kas notiek ar jūsu serveri? Iedomājieties hakeru uzbrukumu, nejaušu datu dzēšanu vai pakalpojuma atteikumu? Jūsu dati tiks glabāti drošībā pie dublējumu nodrošinātāja. Tie būs droši šifrēti un jebkurā laikā pieejami, lai atjaunotu jūsu serveri ar.",
+ "page2_text": "SelfPrivacy tikai darbojas ar tiem sniedzējiem, ko tu izvēlies. Ja tev nav nepieciešamie konti tajos, mēs tev palīdzēsim tos uztaisīt.",
+ "page2_dns_provider_text": "Jums ir nepieciešams domēns, lai būtu vieta internetā. Un jums ir nepieciešams arī uzticams DNS nodrošinātājs, lai domēns būtu vērsts uz jūsu serveri. Mēs iesakām izvēlēties atbalstītu DNS nodrošinātāju, lai automātiski iestatītu tīklošanu."
+ },
+ "resource_chart": {
+ "month": "Mēnesis",
+ "day": "Diena",
+ "hour": "Stunda",
+ "cpu_title": "CPU izmantošana",
+ "network_title": "Tīkla lietojums",
+ "in": "Iekšā",
+ "out": "Ārā"
+ },
+ "server": {
+ "card_title": "Serveris",
+ "description": "Visi tavi serveri dzīvo šeit",
+ "general_information": "Vispārīga informācija",
+ "resource_usage": "Resursu izmantošana",
+ "allow_autoupgrade": "Atļaut automātisko jaunināšanu",
+ "allow_autoupgrade_hint": "Automātisko pakotņu jaunināšanas atļaušana serverī",
+ "reboot_after_upgrade": "Atsāknēšana pēc jaunināšanas",
+ "reboot_after_upgrade_hint": "Atsāknēšana bez tūlītējas pēc izmaiņu piemērošanas serverī",
+ "select_timezone": "Laika joslas atlasīšana",
+ "timezone_search_bar": "Laika joslas nosaukums vai laika nobīdes vērtība",
+ "server_id": "Servera ID",
+ "status": "Status",
+ "cpu": "CPU",
+ "disk": "Disks lokāls",
+ "monthly_cost": "Mēneša maksa",
+ "location": "Vieta",
+ "core_count": {
+ "one": "{} kodols",
+ "two": "{} kodoli",
+ "few": "{} kodoli",
+ "many": "{} kodoli",
+ "other": "{} kodoli"
+ },
+ "server_timezone": "Servera laika josla",
+ "ram": "Atmiņa"
+ },
+ "record": {
+ "root": "Saknes domēns",
+ "api": "SelfPrivacy API",
+ "cloud": "Failu mākonis",
+ "git": "Git serveris",
+ "meet": "Video konference",
+ "social": "Sociālais tīkls",
+ "password": "Paroļu pārvaldnieks",
+ "vpn": "VPN",
+ "mx": "MX ieraksts",
+ "spf": "SPF ieraksts",
+ "dkim": "DKIM atslēga",
+ "dmarc": "DMARC ieraksts"
+ },
+ "domain": {
+ "card_title": "Domēns",
+ "screen_title": "Domēns un DNS",
+ "ok": "Ieraksti ir kārtībā",
+ "error": "Atrastas problēmas",
+ "refreshing": "Notiek statusa atsvaidzināšana…",
+ "uninitialized": "Dati vēl nav izgūti",
+ "services_title": "Pakalpojumi",
+ "email_title": "E-pasts",
+ "email_subtitle": "Ieraksti nepieciešami drošai e-pasta apmaiņai.",
+ "update_list": "Atjaunināt sarakstu",
+ "error_subtitle": "Pieskarieties šeit, lai tos labotu",
+ "services_subtitle": "Tips \"A\" ieraksti nepieciešami katram pakalpojumam."
+ },
+ "backup": {
+ "card_title": "Rezerves",
+ "description": "Izglābs jūsu dienu incidenta gadījumā: hakeru uzbrukums, servera dzēšana utt.",
+ "reupload_key": "Piespiedu atkārtotas augšupielādes atslēga",
+ "initialize": "Inicializēt",
+ "restore": "Atjaunono dublējuma",
+ "no_backups": "Vēl nav dublējumu",
+ "create_new": "Jauna dublējuma izveide",
+ "creating": "Veido jaunu dublējumu: {}%",
+ "error_pending": "Servera atgrieztā kļūda, pārbaudiet to zemāk",
+ "refresh": "Atsvaidzināšanas statuss",
+ "reuploaded_key": "Atslēga atkārtoti ielādēta",
+ "waiting_for_rebuild": "Pirmo dublējumu varēsit izveidot dažu minūšu laikā.",
+ "restore_alert": "Jūs gatavojaties atjaunot no dublējuma, kas izveidots {}. Visi pašreizējie dati tiks zaudēti. Vai esi pārliecināts?",
+ "restoring": "Atjaunošana no dublējuma",
+ "refetch_backups": "Atkārtoti ielādēt dublējumkopiju sarakstu",
+ "refetching_list": "Pēc dažām minūtēm saraksts tiks atjaunināts"
+ },
+ "service_page": {
+ "uses": "Izmanto {usage} uz {volume}",
+ "open_in_browser": "Atvērt pārlūkprogrammā",
+ "restart": "Restartējiet pakalpojumu",
+ "disable": "Atspējot pakalpojumu",
+ "enable": "Iespējot pakalpojumu",
+ "move": "Pāriet uz citu sējumu",
+ "status": {
+ "active": "Darbojas",
+ "inactive": "Apstājies"
+ }
+ },
+ "storage": {
+ "start_migration_button": "Sāciet migrāciju",
+ "card_title": "Servera krātuve",
+ "status_ok": "Diska lietojums ir kārtībā",
+ "status_error": "Maz vietas diskā",
+ "disk_usage": "{} izmantots",
+ "disk_total": "{} Kopā · {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "Baiti",
+ "extend_volume_button": "Pagarināt skaļumu",
+ "extending_volume_title": "Skaļuma paplašināšana",
+ "extending_volume_description": "Skaļuma lieluma maiņa ļaus serverī saglabāt vairāk datu, nepagarinot pašu serveri. Skaļumu var tikai palielināt: sarukt nav iespējams.",
+ "extending_volume_price_info": "Cenā ir iekļauts PVN, un tā ir aprēķināta no Hetzner sniegtajiem cenu datiem. Pēc izmēra maiņas serveris tiks restartēts.",
+ "extending_volume_error": "Nevarēja inicializēt skaļuma palielināšanu.",
+ "size": "Lielums",
+ "data_migration_title": "Datu migrācija",
+ "data_migration_notice": "Migrācijas laikā visi pakalpojumi tiks izslēgti.",
+ "migration_process": "Notiek migrēšana…",
+ "migration_done": "Pabeigt"
+ },
+ "not_ready_card": {
+ "in_menu": "Serveris vēl nav iestatīts. Lūdzu, pabeidziet iestatīšanu, izmantojot iestatīšanas vedni, lai turpinātu darbu."
+ }
+}
\ No newline at end of file
diff --git a/assets/translations/mk.json b/assets/translations/mk.json
new file mode 100644
index 00000000..0e655d5a
--- /dev/null
+++ b/assets/translations/mk.json
@@ -0,0 +1,9 @@
+{
+ "test": "mk-test",
+ "basis": {
+ "providers": "Провајдери",
+ "providers_title": "Вашиот центар за податоци",
+ "select": "Изберите"
+ },
+ "locale": "mk"
+}
diff --git a/assets/translations/nl.json b/assets/translations/nl.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/assets/translations/nl.json
@@ -0,0 +1 @@
+{}
diff --git a/assets/translations/pl.json b/assets/translations/pl.json
new file mode 100644
index 00000000..ce1158ed
--- /dev/null
+++ b/assets/translations/pl.json
@@ -0,0 +1,510 @@
+{
+ "basis": {
+ "services_title": "Twoje osobiste, prywatne i niezależne usługi.",
+ "cancel": "Anuluj",
+ "providers": "Dostawca usług internetowych",
+ "providers_title": "Twoje centrum danych",
+ "select": "Wybierz to",
+ "services": "Usługi",
+ "users": "Użytkownicy",
+ "more": "Jeszcze więcej",
+ "next": "Dalej",
+ "got_it": "Zrozumiałem",
+ "settings": "Ustawienia",
+ "password": "Hasło",
+ "create": "Utwórz nowy",
+ "confirmation": "Potwierdzenie",
+ "later": "Pomiń i dostosuj później",
+ "delete": "Usunąć",
+ "close": "Zamknij to",
+ "connect": "Podłączyć",
+ "domain": "Domena",
+ "saving": "Zapisywanie…",
+ "username": "Nazwa użytkownika",
+ "loading": "Ładowanie…",
+ "connect_to_existing": "Podłącz do istniejącego serwera",
+ "reset": "Zresetuj to",
+ "details": "Dokładna informacja",
+ "no_data": "Brak danych",
+ "wait": "Ładowanie",
+ "remove": "Usunąć",
+ "apply": "Zastosuj to",
+ "done": "Gotowe",
+ "continue": "Kontynuować",
+ "alert": "Powiadomienie",
+ "app_name": "SelfPrivacy"
+ },
+ "test": "pl-test",
+ "locale": "pl",
+ "more_page": {
+ "about_project": "O projekcie \"SelfPrivacy\"",
+ "about_application": "O aplikacji",
+ "create_ssh_key": "SSH klucze administratora",
+ "console": "Konsola",
+ "configuration_wizard": "Kreator konfiguracji",
+ "application_settings": "Ustawienia aplikacji",
+ "onboarding": "Witamy"
+ },
+ "console_page": {
+ "title": "Konsola",
+ "waiting": "Oczekiwanie na inicjalizację…",
+ "copy": "Kopia"
+ },
+ "about_us_page": {
+ "title": "O projekcie \"SelfPrivacy\""
+ },
+ "about_application_page": {
+ "title": "O aplikacji",
+ "application_version_text": "Wersja aplikacji {}",
+ "api_version_text": "Wersja API serwera {}",
+ "privacy_policy": "Polityka prywatności"
+ },
+ "application_settings": {
+ "title": "Ustawienia aplikacji",
+ "dark_theme_title": "Ciemny motyw aplikacji",
+ "dark_theme_description": "Zmień kolor motywu aplikacji",
+ "reset_config_title": "Resetowanie",
+ "reset_config_description": "Zresetuj klucze API i użytkownika root.",
+ "delete_server_title": "Usuń serwer",
+ "delete_server_description": "Ta czynność usunie serwer. Po tym będzie niedostępny.",
+ "system_dark_theme_description": "Użyj jasnego lub ciemnego motywu w zależności od ustawień systemu",
+ "system_dark_theme_title": "Domyślny motyw systemowy",
+ "dangerous_settings": "Niebezpieczne ustawienia"
+ },
+ "ssh": {
+ "title": "klucze SSH",
+ "delete": "Usuń klucz SSH",
+ "subtitle_with_keys": "Klucze: {}",
+ "subtitle_without_keys": "Brak kluczy",
+ "no_key_name": "Bezimienny klucz",
+ "root_title": "To są klucze superużytkownika",
+ "input_label": "Publiczny klucz ED25519 lub RSA",
+ "create": "Dodaj klucz SSH",
+ "delete_confirm_question": "Czy na pewno chcesz usunąć następny klucz?",
+ "root_subtitle": "Właściciele określonych tutaj kluczy uzyskują pełny dostęp do danych i ustawień serwera. Dodaj tylko swoje klucze."
+ },
+ "onboarding": {
+ "page1_title": "Cyfrowa niezależność jest dostępna dla każdego",
+ "page1_text": "Poczta, VPN, Messenger, sieć społecznościowa i wiele więcej na Twoim osobistym serwerze, pod Twoją pełną kontrolą.",
+ "page2_title": "SelfPrivacy — to nie przechowywanie w chmurze, a tylko Twój osobisty centrum danych",
+ "page2_server_provider_title": "Dostawca-serwer",
+ "page2_server_provider_text": "Dostawca-serwer będzie obsługiwał Twój serwer w swoim centrum danych. SelfPrivacy automatycznie połączy się z nim i skonfiguruje dla Ciebie serwer.",
+ "page2_dns_provider_title": "Dostawca DNS",
+ "page2_backup_provider_title": "Dostawca kopii zapasowych",
+ "page2_text": "SelfPrivacy współpracuje tylko z wybranymi przez Ciebie dostawcami usług. Jeśli nie masz kont, pomożemy Ci ich założyć.",
+ "page2_dns_provider_text": "Aby być w Internecie, potrzebujesz domeny. Aby domena wskazywała na Twój serwer, potrzebujesz niezawodnego serwera DNS. Poprosimy Cię o wybranie jednego z obsługiwanych serwerów DNS i automatyczne skonfigurowanie wszystkich rekordów. Chcesz skonfigurować je ręcznie? To też jest możliwe.",
+ "page2_backup_provider_text": "A co jeśli coś się stanie z serwerem? Atak hakerski, odmowa usługi, a może po prostu przypadkowe usunięcie danych? Twoje dane będą bezpieczne gdzie indziej, u dostawcy magazynu kopii zapasowych. Wszystkie są bezpiecznie zaszyfrowane i możesz przywrócić swój serwer."
+ },
+ "resource_chart": {
+ "month": "Miesiąc",
+ "day": "Dzień",
+ "hour": "Godzina",
+ "cpu_title": "Wykorzystanie procesora",
+ "network_title": "Wykorzystanie sieci",
+ "in": "Odebrane",
+ "out": "Wysłano"
+ },
+ "server": {
+ "card_title": "Serwer",
+ "description": "To wirtualny komputer, na którym działają wszystkie Twoje usługi",
+ "resource_usage": "Zużycie środków",
+ "allow_autoupgrade_hint": "Zezwól na automatyczną instalację aktualizacji na serwerze",
+ "reboot_after_upgrade": "Uruchom ponownie po aktualizacjach",
+ "server_timezone": "Strefa czasowa serwera",
+ "server_id": "ID serwera",
+ "status": "Status",
+ "cpu": "procesor",
+ "ram": "Pamięć RAM",
+ "disk": "Dysk lokalny",
+ "monthly_cost": "Koszt miesięczny",
+ "location": "Lokalizacja danych",
+ "core_count": {
+ "one": "{} jądro",
+ "two": "{} jądra",
+ "many": "{} rdzeni",
+ "few": "{} jądra",
+ "other": "{} rdzeni"
+ },
+ "general_information": "Ogólna informacja",
+ "allow_autoupgrade": "Zezwalaj na automatyczne aktualizacje",
+ "reboot_after_upgrade_hint": "Automatycznie uruchom ponownie serwer po zastosowaniu aktualizacji",
+ "select_timezone": "Wybierz swoją strefę czasową",
+ "timezone_search_bar": "Nazwa strefy czasowej lub znaczenie przesunięcia czasowego"
+ },
+ "record": {
+ "root": "Domena główna",
+ "cloud": "Chmura plików",
+ "git": "Git serwer",
+ "meet": "Wideokonferencje",
+ "social": "Serwis społecznościowy",
+ "password": "Menedżer haseł",
+ "vpn": "VPN",
+ "dmarc": "Zapisywanie rekord",
+ "spf": "Zapisywanie SPF",
+ "dkim": "DKIM klucz",
+ "api": "SelfPrivacy API",
+ "mx": "Zapisywanie MX"
+ },
+ "domain": {
+ "card_title": "Domena",
+ "screen_title": "Domena i DNS",
+ "error": "Znaleziono problemy",
+ "refreshing": "Aktualizowanie danych…",
+ "uninitialized": "Dane jeszcze nie otrzymane",
+ "services_title": "Usługi",
+ "services_subtitle": "Rekordy „A” są wymagane do działania usług.",
+ "email_title": "Email",
+ "update_list": "Zaktualizuj listę",
+ "ok": "Zapisy są w porządku",
+ "error_subtitle": "Kliknij tutaj, aby naprawić",
+ "email_subtitle": "Zapisy wymagane do bezpiecznej wymiany poczty elektronicznej."
+ },
+ "backup": {
+ "card_title": "Utworzyć kopię zapasową",
+ "description": "Pomoże Ci w każdej sytuacji: atak hakerski, usunięcie serwera, itp.",
+ "reupload_key": "Wymuś aktualizację klucza",
+ "reuploaded_key": "Klucz na serwerze został zaktualizowany",
+ "initialize": "Nastawić",
+ "restore": "Przywróć z kopii",
+ "no_backups": "Nie ma jeszcze żadnych kopii zapasowych",
+ "create_new": "Utwórz nową kopię",
+ "creating": "Tworzenie kopii: {}%",
+ "restoring": "Przywracanie z kopii",
+ "waiting_for_rebuild": "Po kilku minutach będziesz mógł utworzyć pierwszą kopię.",
+ "error_pending": "Serwer zwrócił błąd, sprawdź go poniżej",
+ "refresh": "Odśwież status",
+ "refetch_backups": "Ponownie pobierz listę kopii zapasowych",
+ "refetching_list": "Za kilka minut lista zostanie zaktualizowana",
+ "restore_alert": "Za chwilę przywrócisz z kopii utworzonej przez {}. Wszystkie bieżące dane zostaną utracone. Jesteś pewny?"
+ },
+ "storage": {
+ "card_title": "Pamięć serwera",
+ "status_ok": "Użycie dysku jest OK",
+ "status_error": "Mało miejsca na dysku",
+ "disk_usage": "{} użyte",
+ "disk_total": "{} całkowity · {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "Bajt",
+ "extend_volume_button": "Rozwiń pamięć",
+ "extending_volume_title": "Rozszerzenie pamięci",
+ "extending_volume_price_info": "Cena zawiera podatek VAT i jest oparta na danych cenowych dostarczonych przez firmę Hetzner. Serwer zostanie zrestartowany w trakcie procesu.",
+ "extending_volume_error": "Nie można rozpocząć rozszerzenia repozytorium.",
+ "size": "Rozmiar",
+ "data_migration_title": "Migracja danych",
+ "data_migration_notice": "Na czas migracji danych wszystkie usługi zostaną wyłączone.",
+ "start_migration_button": "Rozpocznij migrację",
+ "migration_process": "Migracja…",
+ "migration_done": "Zakończyć",
+ "extending_volume_description": "Zmiana rozmiaru pamięci masowej pozwoli na przechowywanie większej ilości danych na serwerze bez rozszerzenia serwera. Objętość można tylko zwiększyć, nie można jej zmniejszyć."
+ },
+ "service_page": {
+ "open_in_browser": "Otwórz w przeglądarce",
+ "status": {
+ "activating": "Włącza się",
+ "deactivating": "Wyłącza się",
+ "reloading": "Uruchamia się ponownie",
+ "off": "Wyłączone",
+ "inactive": "Zatrzymany",
+ "active": "Włączone i działa",
+ "failed": "Nie udało sie uruchomić"
+ },
+ "move": "Przeniesienie do innego woluminu",
+ "enable": "Włącz usługę",
+ "restart": "Uruchom ponownie usługę",
+ "disable": "Wyłącz usługę",
+ "uses": "Używa {usage} na {volume}"
+ },
+ "mail": {
+ "title": "E-mail",
+ "subtitle": "E-Mail dla firmy i rodziny.",
+ "login_info": "Użyj nazwy użytkownika i hasła z listy użytkowników. Port IMAP: 143, STARTTLS. Port SMTP: 587, STARTTLS."
+ },
+ "password_manager": {
+ "title": "Menedżer haseł",
+ "subtitle": "To podstawa Twojego bezpieczeństwa. Bitwarden pomoże Ci tworzyć, przechowywać, kopiować hasła między urządzeniami i umieszczać je w formularzach.",
+ "login_info": "Konto należy założyć na stronie internetowej."
+ },
+ "video": {
+ "title": "Wideokonferencja",
+ "subtitle": "Zoom i Google Meet są świetne, ale Jitsi Meet to dobra alternatywa, która daje pewność, że nie jesteś słuchany.",
+ "login_info": "Konto nie jest potrzebne."
+ },
+ "cloud": {
+ "title": "Przechowywanie w chmurze",
+ "subtitle": "Nie zezwalaj usługom w chmurze na odczyt twoich danych, dla tego korzystaj z NextCloud.",
+ "login_info": "Login jest admin, hasło jest takie samo jak w przypadku głównego użytkownika. Utwórz nowe konta w interfejsie Nextcloud."
+ },
+ "social_network": {
+ "title": "Serwis społecznościowy",
+ "subtitle": "Trudno w to uwierzyć, ale stało możliwe stworzenie własnego serwisu społecznościowego, z własnymi zasadami i publicznością.",
+ "login_info": "Konto należy założyć na stronie."
+ },
+ "git": {
+ "login_info": "Konto należy założyć na stronie. Pierwszy zarejestrowany użytkownik zostaje administratorem.",
+ "title": "Git Serwer",
+ "subtitle": "Prywatna alternatywa dla Githuba, która należy do Ciebie, ale nie do Microsoftu."
+ },
+ "vpn": {
+ "title": "VPN Serwer",
+ "subtitle": "Prywatny serwer VPN"
+ },
+ "users": {
+ "add_new_user": "Dodaj pierwszego użytkownika",
+ "new_user": "Nowy użytkownik",
+ "delete_user": "Usuń użytkownika",
+ "not_ready": "Połącz serwer, domenę I DNS w zakładce dostawcy, aby mieć możliwość dodać pierwszego użytkownika",
+ "nobody_here": "Tu będą pojawią się użytkownicy",
+ "login": "Login",
+ "new_user_info_note": "Nowy użytkownik automatycznie otrzyma dostęp do wszystkich serwisów",
+ "delete_confirm_question": "Czy naprawdę chcesz usunąć konto?",
+ "reset_password": "Zresetuj hasło",
+ "account": "Konto",
+ "send_registration_data": "Udostępnij dane logowania",
+ "could_not_fetch_users": "Nie udało się uzyskać użytkowników",
+ "could_not_fetch_description": "Sprawdź połączenie internetowe i spróbuj ponownie",
+ "refresh_users": "Odśwież listę użytkowników",
+ "could_not_create_user": "Nie udało się utworzyć użytkownika",
+ "could_not_delete_user": "Nie udało się usunąć użytkownika",
+ "could_not_add_ssh_key": "Nie udało się utworzyć SSH klucz",
+ "username_rule": "Nazwa użytkownika może zawierać tylko małe litery alfabetu łacińskiego, cyfry i podkreślenia, nie może zaczynać się od cyfry",
+ "email_login": "Logowanie e-mailem",
+ "no_ssh_notice": "Dla tego użytkownika tworzone są tylko konta e-mail i SSH. Jednokrotne logowanie do wszystkich usług będzie dostępne wkrótce.",
+ "details_title": "Dane użytkownika"
+ },
+ "validations": {
+ "length_longer": "Długość ciągu znaków [] musi być mniejsza lub równa {}",
+ "length_not_equal": "Długość jest [], ależ powinna być {}",
+ "already_exist": "Już jest",
+ "invalid_format": "Nieprwidłowy format",
+ "required": "Potrzebien",
+ "root_name": "Nie może być 'root'",
+ "invalid_format_ssh": "Potrzebien format klucza SSH",
+ "invalid_format_password": "Hasło nie może zawierać spacji"
+ },
+ "not_ready_card": {
+ "in_menu": "Serwer jeszcze nie jest skonfigurowany, użyj kreatora połączeń."
+ },
+ "initializing": {
+ "connect_to_server": "Zacznijmy od serwera.",
+ "select_provider": "Wybierz dowolnego dostawcę z poniższej listy, wszyscy obsługują SelfPrivacy",
+ "select_provider_notice": "Przez \"stosunkowo małą\" rozumiemy maszynę z 2 rdzeniami procesora i 2 gigabajtami pamięci RAM.",
+ "select_provider_countries_title": "Dostępne kraje",
+ "select_provider_countries_text_hetzner": "Niemcy, Finlandia, USA",
+ "select_provider_countries_text_do": "USA, Holandia, Singapur, Wielka Brytania, Niemcy, Kanada, Indie, Australia",
+ "select_provider_payment_text_do": "Karty kredytowe, Google Pay, PayPal",
+ "select_provider_email_notice": "Hosting poczty e-mail nie będzie dostępny dla nowych klientów. Niemniej jednak zostanie odblokowany, gdy tylko dokonasz pierwszej płatności.",
+ "select_provider_site_button": "Odwiedź storonkę",
+ "select_provider_price_title": "Średnia cena",
+ "select_provider_price_text_hetzner": "€8 miesięcznie za stosunkowo mały serwer i 50GB miejsca na dysku",
+ "select_provider_price_text_do": "$17 miesięcznie za stosunkowo mały serwer i 50GB miejsca na dysku",
+ "select_provider_payment_title": "Metody płatności",
+ "select_provider_payment_text_hetzner": "Karty kredytowe, SWIFT, SEPA, PayPal",
+ "connect_to_server_provider": "Teraz zaloguj się przez ",
+ "no_locations_found": "Nie znaleziono lokalizacji, upewnij się, że Twoje konto jest dostępne",
+ "choose_server_type": "Jaki typ serwera powinienem wybrać?",
+ "choose_server_type_ram": "{} GB pamięci RAM",
+ "choose_server_type_text": "Od zasobów serwera zależeć będzie, jakie usługi będą mogły być uruchomione. W każdej chwili możliwa będzie rozbudowa serwera",
+ "choose_server_type_notice": "Główne rzeczy, na które należy zwrócić uwagę, to liczba wątków procesora i ilość pamięci RAM. Dane serwisowe zostaną umieszczone na osobnym dysku, który jest osobno płatny i łatwo rozszerzalny.",
+ "connect_to_server_provider_text": "Dzięki tokenowi API SelfPrivacy będzie mógł wynająć maszynę i postawić na niej swój serwer",
+ "how": "Jak uzyskać token API",
+ "provider_bad_key_error": "Klucz API dostawcy jest nieprawidłowy",
+ "could_not_connect": "Nie można połączyć się z dostawcą.",
+ "choose_location_type": "Gdzie chcesz zamówić swój serwer?",
+ "locations_not_found": "Ups!",
+ "locations_not_found_text": "W tej lokalizacji nie było dostępnych serwerów do wynajęcia",
+ "back_to_locations": "Wybierzmy inny",
+ "choose_location_type_text": "Wybór lokalizacji będzie determinował dostępne konfiguracje, ceny i prędkość połączenia z serwerem.",
+ "choose_server_type_storage": "{} GB pamięci na diskie",
+ "choose_server_type_payment_per_month": "{} miesięcznie",
+ "no_server_types_found": "Nie znaleziono dostępnych typów serwerów! Proszę upewnić się, że masz dostęp do dostawcy serwera...",
+ "use_this_domain": "Kto używa ten domen?",
+ "connect_backblaze_storage": "Dodajcie Blackblaze",
+ "no_connected_domains": "Niema podłączonych domenów",
+ "what": "Co to znaczy?",
+ "backblaze_bad_key_error": "Informacja o Blackbaze nieprawidłowa",
+ "select_dns": "Teraz wybierz provajdera DNS",
+ "manage_domain_dns": "Aby zarządzać DNS domeny",
+ "create_master_account": "Dodać konto administratora",
+ "use_this_domain_text": "Podany token zapewnia kontrolę nad tą domeną",
+ "loading_domain_list": "Ładowanie listy domen",
+ "found_more_domains": "Znaleziono więcej niż jedną domenę, dla własnego bezpieczeństwa usuń niepotrzebne domeny",
+ "save_domain": "Zapisz domenę",
+ "final": "Ostatni krok",
+ "create_server": "Utwórz serwer",
+ "server_rebooted": "Serwer zrestartowany. Czekam na ostatnią weryfikację…",
+ "server_started": "Serwer działa. Teraz zostanie sprawdzony i zrestartowany…",
+ "server_created": "Serwer został utworzony. Sprawdzane są adresy DNS i serwer uruchamia się…",
+ "until_the_next_check": "Do następnej inspekcji: ",
+ "check": "Sprawdź",
+ "one_more_restart": "Teraz nastąpi dodatkowe ponowne uruchomienie komputera w celu aktywacji certyfikatów bezpieczeństwa.",
+ "enter_username_and_password": "Wprowadź nazwę użytkownika i złożone hasło",
+ "finish": "Wszystko jest inicjalizowane",
+ "checks": "Kontrole wykonane:\n{} / {}",
+ "steps": {
+ "hosting": "Hosting",
+ "nixos_installation": "Instalacja NixOS",
+ "server_type": "Typ serwera",
+ "dns_provider": "Dostawca DNS",
+ "backups_provider": "Kopie zapasowe",
+ "domain": "Domena",
+ "master_account": "Rachunek główny",
+ "server": "Serwer",
+ "dns_setup": "Instalacja DNS",
+ "server_reboot": "Restart serwera",
+ "final_checks": "Kontrole końcowe"
+ },
+ "dns_provider_bad_key_error": "Klucz API jest nieprawidłowy",
+ "connect_to_dns_provider_text": "Za pomocą interfejsu API tokena aplikacja SelfPrivacy skonfiguruje rekordy DNS",
+ "server_provider_description": "Lokalizacja, w której będą znajdować się Twoje dane i usługi SelfPrivacy:",
+ "dns_provider_description": "Spowoduje to połączenie Twojej domeny z adresem IP:",
+ "select_provider_price_free": "Za darmo",
+ "select_provider_payment_text_cloudflare": "Karty bankowe",
+ "connect_to_dns": "Połącz dostawcę DNS"
+ },
+ "jobs": {
+ "delete_ssh_key": "Wydalić SSH-klucz dla {}",
+ "create_user": "Dodać korzystalnika",
+ "delete_user": "Wydalić korzystalnika",
+ "reboot_failed": "Nie otrzyma się zrestartować. Przeprowadzicie logi.",
+ "service_turn_off": "Wyłączyć",
+ "service_turn_on": "Włączyć",
+ "create_ssh_key": "Dodać SSH-klucz dla {}",
+ "generic_error": "Nie otrzyma się podłoczyć k serweru!",
+ "title": "Zadania",
+ "start": "Rozpocząć wykonywanie",
+ "empty": "Nie ma zadań",
+ "job_added": "Zadanie dodane",
+ "run_jobs": "Uruchom zadania",
+ "reboot_success": "Serwer uruchamia się ponownie",
+ "config_pull_failed": "Aktualizacja konfiguracji serwera nie powiodła się. Rozpoczęto aktualizację oprogramowania.",
+ "upgrade_success": "Uruchomiono aktualizację serwera",
+ "upgrade_failed": "Aktualizacja serwera nie działa",
+ "upgrade_server": "Aktualizacja serwera",
+ "reboot_server": "Ponowne uruchomienie serwera",
+ "server_jobs": "Zadania na serwerze",
+ "reset_user_password": "Zresetuj hasło użytkownika"
+ },
+ "modals": {
+ "purge_all_keys": "Wydalić wszystkie kluczy autentyfikacji?",
+ "are_you_sure": "Wpełnieny?",
+ "dns_removal_error": "Nie otrzyma się wydalić zapis DNS.",
+ "yes": "Tak",
+ "no": "Nie",
+ "reboot": "Restart",
+ "server_deletion_error": "Nie można usunąć serwera.",
+ "server_validators_error": "Nie udało się uzyskać listy serwerów.",
+ "already_exists": "Taki serwer już istnieje.",
+ "unexpected_error": "Nieprzewidywalny błąd po stronie świadczeniodawcy.",
+ "destroy_server": "Zniszczyć serwer i stworzyć nowy?",
+ "try_again": "Mam spróbować jeszcze raz?",
+ "purge_all_keys_confirm": "Tak, wymazać wszystkie klucze",
+ "delete_server_volume": "Usunąć serwer i pamięć masową?",
+ "you_cant_use_this_api": "Nie możesz użyć tego API dla domeny z podobnym TLD.",
+ "volume_creation_error": "Nie udało się utworzyć woluminu."
+ },
+ "recovery_key": {
+ "key_main_header": "Klucz odzyskania",
+ "key_synchronizing": "Synchronizacja…",
+ "key_receiving_done": "Zrobiono!",
+ "key_replace_button": "Wytworzyć nowy klucz",
+ "generation_error": "Nie otrzyma się zrobić klucz odzyskania. {}",
+ "key_connection_error": "Nie udało się połączyć z serwerem.",
+ "key_main_description": "Wymagane dla autoryzacji SelfPrivacy, gdy autoryzowane urządzenia są niedostępne.",
+ "key_amount_toggle": "Ograniczenie stosowania",
+ "key_amount_field_title": "Maks. liczba zastosowań",
+ "key_duedate_toggle": "Ograniczenie okresu użytkowania",
+ "key_duedate_field_title": "Data ważności",
+ "key_receive_button": "Zdobądź klucz",
+ "key_valid": "Twój klucz jest ważny",
+ "key_invalid": "Twój klucz jest już nieważny",
+ "key_valid_until": "Ważny do {}",
+ "key_valid_for": "Możesz użyć {} więcej razy",
+ "key_creation_date": "Utworzony {}",
+ "key_receiving_description": "Zapisz ten klucz w bezpiecznym miejscu. Dzięki niemu masz pełny dostęp do swojego serwera:",
+ "key_receiving_info": "Ten klucz nie będzie już pokazywany, ale możesz go zastąpić nowym."
+ },
+ "timer": {
+ "sec": "{} s"
+ },
+ "recovering": {
+ "confirm_server_decline": "Wybierz inny serwer",
+ "domain_not_available_on_token": "Wprowadzony token nie ma dostępu do żądanej domeny.",
+ "method_recovery_input_description": "Wprowadź swój token odzyskiwania",
+ "fallback_select_provider_console": "Dostęp do konsoli serwera mojego dostawcy.",
+ "confirm_server_description": "Znalazłem twój serwer! Potwierdź, że jest to właściwe:",
+ "confirm_server": "Potwierdzić serwer",
+ "modal_confirmation_title": "Czy to naprawdę twój serwer?",
+ "modal_confirmation_description": "Podłączenie się do niewłaściwego serwera może prowadzić do destrukcyjnych konsekwencji.",
+ "generic_error": "Błąd operacji, spróbuj ponownie.",
+ "recovery_main_header": "Podłączenie do istniejącego serwera",
+ "domain_recovery_description": "Wprowadź domenę, pod którą chcesz uzyskać dostęp do serwera:",
+ "domain_recover_placeholder": "Domena",
+ "domain_recover_error": "Nie można znaleźć serwera z tą domeną",
+ "method_device_description": "Otwórz aplikację na innym urządzeniu i otwórz ekran zarządzania urządzeniami. Naciśnij \"Dodaj urządzenie\", aby otrzymać token autoryzacji.",
+ "method_select_description": "Wybierz metodę wprowadzania danych:",
+ "method_select_other_device": "Mam dostęp na innym urządzeniu",
+ "method_select_recovery_key": "Mam klucz odzyskiwania",
+ "method_select_nothing": "Nie mam żadnego z nich",
+ "method_device_button": "Otrzymałem symbol",
+ "method_device_input_description": "Wprowadź swój token autoryzacyjny",
+ "method_device_input_placeholder": "Token",
+ "confirm_server_accept": "Tak, to on",
+ "choose_server": "Wybierz serwer",
+ "choose_server_description": "Nie można określić, z którym serwerem się komunikujesz.",
+ "no_servers": "Na Twoim koncie nie ma dostępnych serwerów.",
+ "modal_confirmation_dns_valid": "Odwrócony DNS jest prawidłowy",
+ "modal_confirmation_dns_invalid": "Odwrócony DNS wskazuje na inną domenę",
+ "modal_confirmation_ip_valid": "IP jest takie samo jak w rekordzie DNS",
+ "modal_confirmation_ip_invalid": "IP nie jest zgodne z tym w rekordzie DNS",
+ "fallback_select_description": "Które z nich posiadasz? Wybierz pierwszą, która pasuje:",
+ "fallback_select_token_copy": "Kopia tokena autoryzacyjnego z innej wersji aplikacji.",
+ "fallback_select_root_ssh": "Dostęp Root do serwera poprzez SSH.",
+ "authorization_failed": "Nie udało się zalogować za pomocą tego klucza",
+ "fallback_select_provider_console_hint": "Na przykład: Hetzner.",
+ "provider_connected": "Połączenie z dostawcą {}",
+ "provider_connected_description": "Połączenie ustanowione. Podaj swój token z dostępem do {}:",
+ "provider_connected_placeholder": "{} Token "
+ },
+ "devices": {
+ "main_screen": {
+ "description": "Urządzenia te mają pełny dostęp do zarządzania serwerem poprzez aplikację SelfPrivacy.",
+ "header": "Urządzenia",
+ "this_device": "To urządzenie",
+ "other_devices": "Inne urządzenia",
+ "authorize_new_device": "Autoryzacja nowego urządzenia",
+ "access_granted_on": "Dostęp przyznany {}",
+ "tip": "Naciśnij na urządzenie, aby cofnąć dostęp."
+ },
+ "revoke_device_alert": {
+ "header": "Cofnąć dostęp?",
+ "description": "Urządzenie {} nie będzie już mogło kontrolować serwera.",
+ "yes": "Wycofaj się",
+ "no": "Anulować"
+ },
+ "add_new_device_screen": {
+ "header": "Autoryzacja nowego urządzenia",
+ "description": "Wprowadź ten klucz na nowym urządzeniu:",
+ "please_wait": "Proszę czekać",
+ "tip": "Klucz jest ważny przez 10 minut.",
+ "expired": "Klucz stracił ważność.",
+ "get_new_key": "Uzyskaj nowy klucz"
+ }
+ },
+ "support": {
+ "title": "Wsparcie SelfPrivacy"
+ },
+ "developer_settings": {
+ "subtitle": "Te ustawienia służą wyłącznie do celów debugowania. Nie zmieniaj ich, jeśli nie wiesz, co robisz.",
+ "title": "Ustawienia dewelopera",
+ "server_setup": "Kreator instalacji serwera",
+ "use_staging_acme": "Korzystanie z serwera testów ACME",
+ "use_staging_acme_description": "Używane podczas konfigurowania nowego serwera.",
+ "routing": "Trasowanie aplikacji",
+ "reset_onboarding": "Wyzerowanie flagi powitalnej dla wizyty",
+ "reset_onboarding_description": "Resetowanie przełącznika zasilania w celu ponownego wyświetlenia ekranu włączania zasilania",
+ "cubit_statuses": "Aktualny stan qubitów ładujących",
+ "ignore_tls": "Używane podczas konfigurowania nowego serwera."
+ }
+}
diff --git a/assets/translations/ru.json b/assets/translations/ru.json
index 68665e26..2371da85 100644
--- a/assets/translations/ru.json
+++ b/assets/translations/ru.json
@@ -1,122 +1,141 @@
{
- "test": "ru-test",
- "locale": "ru",
- "basis": {
- "_comment": "базовые элементы интерфейса",
- "providers": "Провайдеры",
- "services": "Сервисы",
- "users": "Пользователи",
- "more": "Ещё",
- "next": "Далее",
- "got_it": "Понял",
- "settings": "Настройки",
- "password": "Пароль",
- "create": "Создать",
- "confirmation": "Подтверждение",
- "cancel": "Отменить",
- "delete": "Удалить",
- "close": "Закрыть",
- "connect": "Подключить",
- "domain": "Домен",
- "saving": "Сохранение…",
- "nickname": "Никнейм",
- "loading": "Загрузка",
- "later": "Пропустить и настроить потом",
- "connect_to_existing": "Подключиться к существующему серверу",
- "reset": "Сбросить",
- "details": "Детальная информация",
- "no_data": "Нет данных",
- "wait": "Загрузка",
- "remove": "Удалить",
- "apply": "Подать",
- "done": "Готово"
- },
- "more": {
- "_comment": "вкладка ещё",
- "configuration_wizard": "Мастер Подключения",
- "about_project": "О проекте SelfPrivacy",
- "about_app": "О приложении",
- "onboarding": "Приветствие",
- "console": "Консоль",
- "create_ssh_key": "Создать ssh ключ",
- "generate_key": "Сгенерировать ключ",
- "generate_key_text": "Вы сможете сгенерировать ключ",
- "remove": "Отключить",
- "enable": "Включить",
- "ok": "ok",
- "continue": "Продолжить",
- "ssh_key_exist_text": "У Вас уже есть сгенерированный ssh ключ",
- "yes_delete": "Да, удалить",
- "share": "Поделиться",
- "copy_buffer": "Копировать в буфер",
- "copied_ssh": "SSH ключ cкопирован в буфер",
- "delete_ssh_text": "Удалить SSH ключ?",
- "about_app_page": {
- "text": "Версия приложения: v.{}"
+ "test": "ru-test",
+ "locale": "ru",
+ "basis": {
+ "providers": "Провайдеры",
+ "select": "Выбрать",
+ "providers_title": "Ваш Дата Центр",
+ "services": "Сервисы",
+ "services_title": "Ваши личные, приватные и независимые сервисы.",
+ "users": "Пользователи",
+ "more": "Ещё",
+ "next": "Далее",
+ "got_it": "Понял",
+ "settings": "Настройки",
+ "password": "Пароль",
+ "create": "Создать",
+ "confirmation": "Подтверждение",
+ "cancel": "Отменить",
+ "delete": "Удалить",
+ "close": "Закрыть",
+ "connect": "Подключить",
+ "domain": "Домен",
+ "saving": "Сохранение…",
+ "username": "Имя пользователя",
+ "loading": "Загрузка…",
+ "later": "Пропустить и настроить потом",
+ "connect_to_existing": "Подключиться к существующему серверу",
+ "reset": "Сбросить",
+ "details": "Детальная информация",
+ "no_data": "Нет данных",
+ "wait": "Загрузка",
+ "remove": "Удалить",
+ "apply": "Применить",
+ "done": "Готово",
+ "continue": "Продолжить",
+ "alert": "Уведомление",
+ "copied_to_clipboard": "Скопировано в буфер обмена!",
+ "app_name": "SelfPrivacy"
},
- "settings": {
- "title": "Настройки приложения",
- "1": "Тёмная тема",
- "2": "Сменить цветовую тему.",
- "3": "Сброс настроек",
- "4": "Сбросить API ключи а также root пользвателя.",
- "5": "Удалить сервер",
- "6": "Действие приведет к удалению сервера. После этого он будет недоступен."
- }
- },
- "ssh": {
- "title": "SSH ключи",
- "create": "Добавить SSH ключ",
- "delete": "Удалить SSH ключ",
- "delete_confirm_question": "Вы уверены что хотите удалить следующий ключ?",
- "subtitle_with_keys": "Ключей: {}",
- "subtitle_without_keys": "Ключей нет",
- "no_key_name": "Безымянный ключ",
- "root": {
- "title": "Это ключи суперпользователя",
- "subtitle": "Владельцы указанных здесь ключей получают полный доступ к данным и настройкам сервера. Добавляйте исключительно свои ключи."
+ "more_page": {
+ "configuration_wizard": "Мастер настройки",
+ "about_project": "О проекте SelfPrivacy",
+ "about_application": "О приложении",
+ "onboarding": "Приветствие",
+ "console": "Консоль",
+ "create_ssh_key": "SSH ключи администратора",
+ "application_settings": "Настройки приложения"
},
- "input_label": "Публичный ED25519 или RSA ключ"
- },
- "onboarding": {
- "_comment": "страницы онбординга",
- "page1_title": "Цифровая независимость доступна каждому",
- "page1_text": "Почта, VPN, Мессенджер, социальная сеть и многое другое на Вашем личном сервере, под Вашим полным контролем.",
- "page2_title": "SelfPrivacy — это не облако, а Ваш личный дата-центр",
- "page2_text": "SelfPrivacy работает только с вашими сервис-провайдерами: Hetzner, Cloudflare, Backblaze. Если у Вас нет учётных записей, мы поможем их создать."
- },
- "providers": {
- "_comment": "вкладка провайдеры",
- "page_title": "Ваш Дата-центр",
- "server": {
- "card_title": "Сервер",
- "status": "Статус — в норме",
- "bottom_sheet": {
- "1": "Это виртуальный компьютер на котором работают все Ваши сервисы.",
- "2": "Общая информация",
- "3": "Размещение"
- },
- "chart": {
+ "console_page": {
+ "title": "Консоль",
+ "waiting": "Ждём инициализации…",
+ "copy": "Копировать"
+ },
+ "about_us_page": {
+ "title": "О проекте SelfPrivacy"
+ },
+ "about_application_page": {
+ "title": "О приложении",
+ "application_version_text": "Версия приложения {}",
+ "api_version_text": "Версия API сервера {}",
+ "privacy_policy": "Политика конфиденциальности"
+ },
+ "application_settings": {
+ "title": "Настройки приложения",
+ "dark_theme_title": "Тёмная тема",
+ "dark_theme_description": "Сменить цветовую тему",
+ "reset_config_title": "Сброс настроек",
+ "reset_config_description": "Сбросить API ключи и root пользователя.",
+ "delete_server_title": "Удалить сервер",
+ "delete_server_description": "Действие приведёт к удалению сервера. После этого он будет недоступен.",
+ "system_dark_theme_title": "Системная тема",
+ "system_dark_theme_description": "Будет использована светлая или тёмная тема в зависимости от системных настроек",
+ "dangerous_settings": "Опасные настройки"
+ },
+ "ssh": {
+ "title": "SSH ключи",
+ "create": "Добавить SSH ключ",
+ "delete": "Удалить SSH ключ",
+ "delete_confirm_question": "Вы уверены, что хотите удалить следующий ключ?",
+ "subtitle_with_keys": "Ключей: {}",
+ "subtitle_without_keys": "Ключей нет",
+ "no_key_name": "Безымянный ключ",
+ "root_title": "Это ключи суперпользователя",
+ "root_subtitle": "Владельцы указанных здесь ключей получают полный доступ к данным и настройкам сервера. Добавляйте исключительно свои ключи.",
+ "input_label": "Публичный ED25519 или RSA ключ"
+ },
+ "onboarding": {
+ "page1_title": "Цифровая независимость доступна каждому",
+ "page1_text": "Почта, VPN, Мессенджер, социальная сеть и многое другое на Вашем личном сервере, под Вашим полным контролем.",
+ "page2_title": "SelfPrivacy — это не облако, а ваш личный дата-центр",
+ "page2_text": "SelfPrivacy работает только с сервис-провайдерами на ваш выбор. Если у Вас нет учётных записей, мы поможем их создать.",
+ "page2_server_provider_title": "Сервер-провайдер",
+ "page2_server_provider_text": "Сервер-провайдер будет обслуживать ваш сервер в своём дата-центре. SelfPrivacy автоматически подключится к нему и настроит вам сервер.",
+ "page2_dns_provider_title": "DNS-провайдер",
+ "page2_dns_provider_text": "Чтобы быть в интернете, нужен домен. Чтобы домен указывал на ваш сервер, нужен надёжный DNS сервер. Мы предложим вам выбрать один из поддерживаемых DNS серверов автоматически настроим все записи. Хотите настроить их вручную? Так тоже можно.",
+ "page2_backup_provider_title": "Бэкап-провайдер",
+ "page2_backup_provider_text": "Что если с сервером что-то случится? Хакерская атака, отказ в обслуживании или просто случайное удаление данных? Ваши данные будут в сохранности в другом месте, у провайдера хранилища ваших резервных копий. Все они надёжно шифруются, и вы сможете восстановить свой сервер."
+ },
+ "resource_chart": {
"month": "Месяц",
"day": "День",
- "hour": "Час"
- }
+ "hour": "Час",
+ "cpu_title": "Использование процессора",
+ "network_title": "Использование сети",
+ "in": "Получено",
+ "out": "Отправлено"
},
- "domain": {
- "card_title": "Домен",
- "status": "Статус — в норме",
- "bottom_sheet": {
- "1": "Это ваш личный адрес в интернете, который будет указывать на сервер и другие ваши сервисы."
- },
- "screen_title": "Домен и DNS",
- "states": {
- "ok": "Записи в норме",
- "error": "Обнаружены проблемы",
- "error_subtitle": "Нажмите здесь, чтобы исправить",
- "refreshing": "Обновление данных...",
- "uninitialized": "Данные ещё не получены"
- },
- "record_description": {
+ "server": {
+ "card_title": "Сервер",
+ "description": "Это виртуальный компьютер на котором работают все ваши сервисы",
+ "general_information": "Общая информация",
+ "resource_usage": "Потребление ресурсов",
+ "allow_autoupgrade": "Разрешить авто-обновления",
+ "allow_autoupgrade_hint": "Разрешить автоматическую установку обновлений на сервер",
+ "reboot_after_upgrade": "Перезагружать после обновлений",
+ "reboot_after_upgrade_hint": "Автоматически перезагружать сервер после применения обновлений",
+ "server_timezone": "Часовой пояс сервера",
+ "select_timezone": "Выберите часовой пояс",
+ "timezone_search_bar": "Имя часового пояса или значение временного сдвига",
+ "server_id": "ID сервера",
+ "status": "Статус",
+ "cpu": "Процессор",
+ "ram": "Оперативная память",
+ "disk": "Диск",
+ "monthly_cost": "Ежемесячная стоимость",
+ "location": "Размещение",
+ "pricing_error": "Не удалось получить цены провайдера",
+ "core_count": {
+ "one": "{} ядро",
+ "two": "{} ядра",
+ "few": "{} ядра",
+ "many": "{} ядер",
+ "other": "{} ядер"
+ },
+ "server_provider": "Провайдер сервера",
+ "dns_provider": "Провайдер DNS"
+ },
+ "record": {
"root": "Корневой домен",
"api": "SelfPrivacy API",
"cloud": "Файловое облако",
@@ -129,293 +148,481 @@
"dmarc": "DMARC запись",
"spf": "SPF запись",
"dkim": "DKIM ключ"
- },
- "cards": {
- "services": {
- "title": "Сервисы",
- "subtitle": "Записи типа “A” необходимые для работы сервисов."
- },
- "email": {
- "title": "Электронная почта",
- "subtitle": "Записи необходимые для безопасного обмена электронной почтой."
- }
- }
+ },
+ "domain": {
+ "card_title": "Домен",
+ "screen_title": "Домен и DNS",
+ "ok": "Записи в норме",
+ "error": "Обнаружены проблемы",
+ "error_subtitle": "Нажмите здесь, чтобы исправить. Это также удалит все сторонние записи.",
+ "refreshing": "Обновление данных…",
+ "uninitialized": "Данные ещё не получены",
+ "services_title": "Сервисы",
+ "services_subtitle": "Записи типа “A” необходимые для работы сервисов.",
+ "email_title": "Электронная почта",
+ "email_subtitle": "Записи необходимые для безопасного обмена электронной почтой.",
+ "update_list": "Обновить список"
},
"backup": {
- "card_title": "Резервное копирование",
- "status": "Статус — в норме",
- "bottom_sheet": {
- "1": "Выручит Вас в любой ситуации: хакерская атака, удаление сервера и т.д.",
- "2": "Использовано 3Gb из бесплатых 10Gb. Последнее копирование была сделано вчера в {}."
- },
- "reuploadKey": "Принудительно обновить ключ",
- "reuploadedKey": "Ключ на сервере обновлён",
- "initialize": "Настроить",
- "waitingForRebuild": "Через несколько минут можно будет создать первую копию.",
- "restore": "Восстановить из копии",
- "no_backups": "Резервных копий пока нет",
- "create_new": "Создать новую копию",
- "creating": "Создание копии: {}%",
- "restoring": "Восстановление из копии",
- "error_pending": "Сервер вернул ошибку: проверьте её ниже.",
- "restore_alert": "Вы собираетесь восстановить из копии созданной {}. Все текущие данные будут потеряны. Вы уверены?",
- "refresh": "Обновить статус",
- "refetchBackups": "Обновить список копий",
- "refetchingList": "Через несколько минут список будет обновлён"
-
- }
- },
- "not_ready_card": {
- "_comment": "Карточка показывающая когда человек скипнул настройку, на карте текст из 3 блоков, средний содержит ссыку на мастер подключения",
- "1": "Завершите настройку приложения используя ",
- "2": "@:more.configuration_wizard",
- "3": " для продолжения работы",
- "in_menu": "Сервер ещё не настроен, воспользуйтесь мастером подключения."
- },
- "services": {
- "_comment": "Вкладка сервисы",
- "title": "Ваши личные, приватные и независимые сервисы:",
- "mail": {
- "title": "Почта",
- "subtitle": "Электронная почта для семьи или компании.",
- "login_info": "Используйте логин и пароль из вкладки пользователей. IMAP порт: 143, STARTTLS. SMTP порт: 587, STARTTLS.",
- "bottom_sheet": {
- "1": "Для подключения почтового ящика используйте {} и профиль, который Вы создали. Так же приглашайте",
- "2": "новых пользователей."
- }
+ "card_title": "Резервное копирование",
+ "description": "Выручит Вас в любой ситуации: хакерская атака, удаление сервера и т.д.",
+ "reupload_key": "Принудительно обновить ключ",
+ "reuploaded_key": "Ключ на сервере обновлён",
+ "initialize": "Настроить",
+ "waiting_for_rebuild": "Через несколько минут можно будет создать первую копию.",
+ "restore": "Восстановить из копии",
+ "no_backups": "Резервных копий пока нет",
+ "create_new": "Создать новую копию",
+ "creating": "Создание копии: {}%",
+ "restoring": "Восстановление из копии",
+ "error_pending": "Сервер вернул ошибку: проверьте её ниже",
+ "restore_alert": "Вы собираетесь восстановить из копии созданной {}. Все текущие данные будут потеряны. Вы уверены?",
+ "refresh": "Обновить статус",
+ "refetch_backups": "Обновить список копий",
+ "refetching_list": "Через несколько минут список будет обновлён",
+ "reupload_key_subtitle": "Ещё раз проинициализирует хранилище резервных копий. Используйте, если что-то сломалось.",
+ "service_busy": "Сейчас создаются другие резервные копии",
+ "autobackup_period_never": "Автоматическое копирование отключено",
+ "pending_jobs": "Активные задачи резервного копирования",
+ "card_subtitle": "Управляйте резервными копиями",
+ "refetch_backups_subtitle": "Сбросить кэш и запросить данные у провайдера. Может повлечь дополнительные расходы.",
+ "select_all": "Копировать всё",
+ "create_new_select_heading": "Выбрать сервисы для копирования",
+ "start": "Начать создание копий",
+ "latest_snapshots": "Последние снимки",
+ "latest_snapshots_subtitle": "Последние 15 снимков",
+ "show_more": "Показать ещё",
+ "autobackup_period_title": "Период автоматического копирования",
+ "autobackup_period_subtitle": "Создание копий раз в {period}",
+ "autobackup_period_every": "Раз в {period}",
+ "autobackup_period_disable": "Отключить автоматические копирование",
+ "autobackup_custom": "Другое",
+ "autobackup_custom_hint": "Введите период в минутах",
+ "autobackup_set_period": "Установить период",
+ "autobackup_period_set": "Период установлен",
+ "backups_encryption_key": "Ключ шифрования",
+ "snapshots_title": "Список снимков",
+ "forget_snapshot_error": "Не удалось забыть снимок",
+ "backups_encryption_key_not_found": "Ключ шифрования пока не найден, повторите попытку позже.",
+ "forget_snapshot_alert": "Вы уверены что хотите удалить этот снимок? Это действие обычно нельзя отменить.",
+ "snapshot_modal_select_strategy": "Выберите стратегию восстановления",
+ "snapshot_modal_download_verify_option_description": "Меньше риск, но требуется больше свободного места. Загрузка всей резервной копии во временное хранилище, проверка целостности копии, и последующая замена текущих данных.",
+ "snapshot_modal_service_not_found": "Это снимок сервиса, которого больше нет на вашем сервере. Обычно этого не должно происходить, и мы не сможем выполнить автоматическое восстановление. Вы можете загрузить снимок и восстановить его вручную. Обратитесь в службу поддержки SelfPrivacy, если вам нужна помощь.",
+ "backups_encryption_key_subtitle": "Храните его в безопасном месте.",
+ "backups_encryption_key_copy": "Скопируйте ключ шифрования",
+ "backups_encryption_key_show": "Показать ключ шифрования",
+ "backups_encryption_key_description": "Этот ключ используется для шифрования резервных копий. Если вы его потеряете, то не сможете восстановить данные из резервной копии. Храните его в надежном месте. Он может пригодиться, если придётся восстанавливать данные вручную.",
+ "forget_snapshot": "Забудьте о моментальном снимке",
+ "snapshot_modal_heading": "Сведения о снимке",
+ "snapshot_service_title": "Сервис",
+ "snapshot_creation_time_title": "Время создания",
+ "snapshot_id_title": "ID снимка",
+ "snapshot_modal_download_verify_option_title": "Загрузить, проверить, и затем заменить",
+ "snapshot_modal_inplace_option_title": "Заменить на месте",
+ "snapshot_modal_inplace_option_description": "Требуется меньше свободного места, но выше риск. При загрузке данных из резервной копии заменяют текущие данные сразу.",
+ "restore_started": "Восстановление началось, проверьте текущий статус в списке заданий",
+ "quota_subtitles": {
+ "no_effect": "Это правило не имеет эффекта, так ак перекрыто другим правилом",
+ "last": {
+ "two": "Последние {} снимка будут сохраняться вне зависимости от даты создания",
+ "many": "Последние {} снимков будут сохраняться вне зависимости от даты создания",
+ "other": "Последние {} снимков будут сохраняться вне зависимости от даты создания",
+ "zero": "Правило отключено",
+ "one": "Последний {} снимок будет сохраняться вне зависимости от даты создания",
+ "few": "Последние {} снимка будут сохраняться вне зависимости от даты создания"
+ },
+ "daily": {
+ "two": "Последние {} ежедневных снимка будут сохраняться",
+ "other": "Последние {} ежедневных снимков будут сохраняться",
+ "zero": "Правило отключено",
+ "one": "Последний {} ежедневный снимок будет сохраняться",
+ "few": "Последние {} ежедневных снимка будут сохраняться",
+ "many": "Последние {} ежедневных снимков будут сохраняться"
+ },
+ "weekly": {
+ "two": "Последние {} еженедельных снимка будут сохраняться",
+ "other": "Последние {} еженедельных снимков будут сохраняться",
+ "zero": "Правило отключено",
+ "one": "Последний {} еженедельный снимок будет сохраняться",
+ "few": "Последние {} еженедельных снимка будут сохраняться",
+ "many": "Последние {} еженедельных снимков будут сохраняться"
+ },
+ "monthly": {
+ "two": "Последние {} ежемесячных снимка будут сохраняться",
+ "other": "Последние {} ежемесячных снимков будут сохраняться",
+ "zero": "Правило отключено",
+ "one": "Последний {} ежемесячный снимок будет сохраняться",
+ "few": "Последние {} ежемесячных снимка будут сохраняться",
+ "many": "Последние {} ежемесячных снимков будут сохраняться"
+ },
+ "yearly": {
+ "two": "Последние {} ежегодных снимка будут сохраняться",
+ "many": "Последние {} ежегодных снимков будут сохраняться",
+ "zero": "Правило отключено",
+ "one": "Последний {} ежегодный снимок будет сохраняться",
+ "few": "Последние {} ежегодных снимка будут сохраняться",
+ "other": "Последние {} ежегодных снимков будут сохраняться"
+ },
+ "last_infinite": "Все снимки будут сохранены",
+ "daily_infinite": "Все ежедневные снимки будут сохраняться",
+ "weekly_infinite": "Все еженедельные снимки будут сохраняться",
+ "monthly_infinite": "Все ежемесячные снимки будут сохраняться",
+ "yearly_infinite": "Все ежегодные снимки будут сохраняться"
+ },
+ "snapshot_reason_title": "Причина создания",
+ "snapshot_reasons": {
+ "auto": "Создано автоматически",
+ "explicit": "Создано по вашему явному запросу",
+ "pre_restore": "Создано в качестве меры предосторожности перед рискованным восстановлением",
+ "unknown": "Неизвестно"
+ },
+ "rotation_quotas_title": "Настройки ротации снимков",
+ "set_rotation_quotas": "Задать новые квоты ротации",
+ "quotas_set": "Новые квоты ротации резервных копий заданы",
+ "quota_titles": {
+ "last": "Сколько последних снимков сохранять",
+ "daily": "Сколько ежедневных снимков сохранять",
+ "weekly": "Сколько еженедельных снимков сохранять",
+ "monthly": "Сколько ежемесячных снимков сохранять",
+ "yearly": "Сколько ежегодных снимков сохранять"
+ },
+ "quotas_only_applied_to_autobackups": "Эти настройки применяются только к резервным копиям, созданным автоматически. Созданные вручную резервные копии не будут удалены этими правилами."
},
- "messenger": {
- "title": "Мессенджер",
- "subtitle": "Telegram и Signal не так приватны, как Delta.Chat — он использует Ваш личный сервер.",
- "login_info": "Используйте те же логин и пароль, что и для почты.",
- "bottom_sheet": {
- "1": "Для подключения используйте {} и логин пароль, который Вы создали."
- }
+ "storage": {
+ "card_title": "Хранилище",
+ "status_ok": "Проблем на диске не обнаружено",
+ "status_error": "Заканчивается место на диске",
+ "disk_usage": "{} использовано",
+ "disk_total": "{} всего · {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "Байт",
+ "extend_volume_button": "Расширить хранилище",
+ "extending_volume_title": "Расширение хранилища",
+ "extending_volume_description": "Изменение размера хранилища позволит вам держать больше данных на вашем сервере без расширения самого сервера. Объем можно только увеличить: уменьшить нельзя.",
+ "extending_volume_price_info": "Цена включает НДС и рассчитана на основе данных о ценах, предоставленных вашим провайдером. Сервер будет перезагружен во время процесса.",
+ "extending_volume_error": "Не удалось начать расширение хранилища.",
+ "size": "Размер",
+ "data_migration_title": "Миграция данных",
+ "data_migration_notice": "На время миграции данных все сервисы будут выключены.",
+ "start_migration_button": "Начать миграцию",
+ "migration_process": "Мигрируем…",
+ "migration_done": "Завершить"
+ },
+ "not_ready_card": {
+ "in_menu": "Сервер ещё не настроен, воспользуйтесь мастером подключения."
+ },
+ "service_page": {
+ "open_in_browser": "Открыть в браузере",
+ "restart": "Перезапустить сервис",
+ "disable": "Выключить сервис",
+ "enable": "Включить сервис",
+ "move": "Переместить на другой диск",
+ "uses": "Использует {usage} на {volume}",
+ "status": {
+ "active": "Включено и работает",
+ "inactive": "Остановлено",
+ "failed": "Не удалось запустить",
+ "off": "Отключено",
+ "activating": "Включается",
+ "deactivating": "Выключается",
+ "reloading": "Перезапускается"
+ },
+ "snapshots": "Снимки резервных копий"
+ },
+ "mail": {
+ "title": "Почта",
+ "subtitle": "Электронная почта для семьи или компании.",
+ "login_info": "Используйте логин и пароль из вкладки пользователей. IMAP порт: 143, STARTTLS. SMTP порт: 587, STARTTLS."
},
"password_manager": {
- "title": "Менеджер паролей",
- "subtitle": "Это фундамент Вашей безопасности. Создавать, хранить, копировать пароли между устройствами и вбивать их в формы поможет Bitwarden.",
- "login_info": "Аккаунт нужно создать на сайте.",
- "bottom_sheet": {
- "1": "Подключиться к серверу и создать пользователя можно по адресу:."
- }
+ "title": "Менеджер паролей",
+ "subtitle": "Это фундамент Вашей безопасности. Создавать, хранить, копировать пароли между устройствами и вбивать их в формы поможет Bitwarden.",
+ "login_info": "Аккаунт нужно создать на сайте."
},
"video": {
- "title": "Видеоконференция",
- "subtitle": "Jitsi meet — отличный аналог Zoom и Google meet который помимо удобства ещё и гарантирует Вам защищённые высококачественные видеоконференции.",
- "login_info": "Аккаунт не требуется.",
- "bottom_sheet": {
- "1": "Для использования просто перейдите по ссылке:."
- }
+ "title": "Видеоконференция",
+ "subtitle": "Jitsi meet — отличный аналог Zoom и Google meet который помимо удобства ещё и гарантирует Вам защищённые высококачественные видеоконференции.",
+ "login_info": "Аккаунт не требуется."
},
"cloud": {
- "title": "Файловое облако",
- "subtitle": "Не позволяйте облачным сервисам просматривать ваши данные. Используйте NextCloud — надёжный дом для всех Ваших данных.",
- "login_info": "Логин администратора: admin, пароль такой же как у основного пользователя. Создавайте новых пользователей в интерфейсе администратора NextCloud.",
- "bottom_sheet": {
- "1": "Подключиться к серверу и создать пользователя можно по адресу:."
- }
+ "title": "Файловое облако",
+ "subtitle": "Не позволяйте облачным сервисам просматривать ваши данные. Используйте NextCloud — надёжный дом для всех Ваших данных.",
+ "login_info": "Логин администратора: admin, пароль такой же как у основного пользователя. Создавайте новых пользователей в интерфейсе администратора NextCloud."
},
"social_network": {
- "title": "Социальная сеть",
- "subtitle": "Сложно поверить, но стало возможным создать свою собственную социальную сеть, со своими правилами и аудиторией.",
- "login_info": "Аккаунт нужно создать на сайте.",
- "bottom_sheet": {
- "1": "Подключиться к серверу и создать пользователя можно по адресу:."
- }
+ "title": "Социальная сеть",
+ "subtitle": "Сложно поверить, но стало возможным создать свою собственную социальную сеть, со своими правилами и аудиторией.",
+ "login_info": "Аккаунт нужно создать на сайте."
},
"git": {
- "title": "Git-сервер",
- "subtitle": "Приватная альтернатива Github, которая принадлежит вам, а не Microsoft.",
- "login_info": "Аккаунт нужно создать на сайте. Первый зарегистрированный пользователь становится администратором.",
- "bottom_sheet": {
- "1": "Подключиться к серверу и создать пользователя можно по адресу:."
- }
+ "title": "Git-сервер",
+ "subtitle": "Приватная альтернатива Github, которая принадлежит вам, а не Microsoft.",
+ "login_info": "Аккаунт нужно создать на сайте. Первый зарегистрированный пользователь становится администратором."
},
"vpn": {
- "title": "VPN сервер",
- "subtitle": "Закрытый VPN сервер",
- "bottom_sheet": {
- "1": "Создать подключиться к VPN-серверу. Движок для безопасной и масштабируемой инфраструктуры VPN"
- }
- }
- },
- "users": {
- "_comment": "'Users' tab",
- "add_new_user": "Добавьте первого пользователя.",
- "new_user": "Новый пользователь",
- "not_ready": "Подключите сервер, домен и DNS в разделе Провайдеры чтобы добавить первого пользователя",
- "nobody_here": "Здесь будут отображаться пользователи.",
- "login": "Логин",
- "onboarding": "Приветствие",
- "console": "Консоль разработчика",
- "new_user_info_note": "Новый пользователь автоматически получит доступ ко всем сервисам.",
- "delete_confirm_question": "Вы действительно хотите удалить учетную запись?",
- "reset_password": "Сбросить пароль",
- "account": "Учетная запись",
- "send_registration_data": "Поделиться реквизитами"
- },
- "initializing": {
- "_comment": "initializing page",
- "1": "Подключите сервер",
- "2": "Здесь будут жить наши данные и SelfPrivacy-сервисы",
- "how": "Как получить API Token",
- "3": "Подключите CloudFlare",
- "4": "Для управления DNS вашего домена",
- "5": "CloudFlare API Token",
- "6": "Подключите облачное хранилище Backblaze",
- "7": "На данный момент подлюченных доменов нет",
- "8": "Загружаем список доменов",
- "9": "Найдено больше одного домена, для вашей безопастности, просим Вам удалить не нужные домены",
- "10": "Сохранить домен",
- "final": "Последний шаг",
- "11": "Создать сервер",
- "what": "Что это значит?",
- "13": "Сервер презагружен, ждем последнюю проверку.",
- "14": "Cервер запущен, сейчас он будет проверен и перезагружен.",
- "15": "Cервер создан, идет проверка ДНС адресов и запуск сервера.",
- "16": "До следующей проверки: ",
- "17": "Проверка",
- "18": "Как получить Hetzner API Token:'",
- "19": "1 Переходим по ссылке ",
- "20": "\n2 Заходим в созданный нами проект. Если такового нет - значит создаём.\n3 Наводим мышкой на боковую панель. Она должна раскрыться, показав нам пункты меню. Нас интересует последний — Security (с иконкой ключика).\n4 Далее, в верхней части интерфейса видим примерно такой список: SSH Keys, API Tokens, Certificates, Members. Нам нужен API Tokens. Переходим по нему.\n5 В правой части интерфейса, нас будет ожидать кнопка Generate API token. Если же Вы используете мобильную версию сайта - в нижнем правом углу Вы увидите красный плюсик. Нажимаем на эту кнопку.\n6 В поле Description даём нашему токену название (это может быть любое название, которое Вам нравиться, сути оно не меняет.",
- "21": "Сейчас будет дополнительная перезагрузка для активации сертификатов безопастности",
- "22": "Создайте главную учетную запись",
- "23": "Введите никнейм и сложный пароль",
- "finish": "Всё инициализировано.",
- "checks": "Проверок выполнено: \n{} / {}"
- },
- "recovering": {
- "recovery_main_header": "Подключиться к существующему серверу",
- "domain_recovery_description": "Введите домен, по которому вы хотите получить доступ к серверу:",
- "domain_recover_placeholder": "Домен",
- "domain_recover_error": "Не удалось найти сервер с таким доменом",
- "method_select_description": "Выберите способ входа:",
- "method_select_other_device": "У меня есть доступ на другом устройстве",
- "method_select_recovery_key": "У меня есть ключ восстановления",
- "method_select_nothing": "У меня ничего из этого нет",
- "method_device_description": "Откройте приложение на другом устройстве и откройте экран управления устройствами. Нажмите \"Добавить устройство\" чтобы получить токен для авторизации.",
- "method_device_button": "Я получил токен",
- "method_device_input_description": "Введите ваш токен авторизации",
- "method_device_input_placeholder": "Токен",
- "method_recovery_input_description": "Введите ваш токен восстановления",
- "fallback_select_description": "Что у вас из этого есть? Выберите первое, что подходит:",
- "fallback_select_token_copy": "Копия токена авторизации из другой версии приложения.",
- "fallback_select_root_ssh": "Root доступ к серверу по SSH.",
- "fallback_select_provider_console": "Доступ к консоли хостинга.",
- "authorization_failed": "Не удалось войти с этим ключом",
- "fallback_select_provider_console_hint": "Например, Hetzner.",
- "hetzner_connected": "Подключение к Hetzner",
- "hetzner_connected_description": "Связь с сервером установлена. Введите токен Hetzner с доступом к {}:",
- "hetzner_connected_placeholder": "Hetzner токен",
- "confirm_server": "Подтвердите сервер",
- "confirm_server_description": "Нашли сервер! Подтвердите, что это он:",
- "confirm_server_accept": "Да, это он",
- "confirm_server_decline": "Выбрать другой сервер",
- "choose_server": "Выберите сервер",
- "choose_server_description": "Не удалось определить, с каким сервером вы устанавливаете связь.",
- "no_servers": "На вашем аккаунте нет доступных серверов.",
- "domain_not_available_on_token": "Введённый токен не имеет доступа к нужному домену.",
- "modal_confirmation_title": "Это действительно ваш сервер?",
- "modal_confirmation_description": "Подключение к неправильному серверу может привести к деструктивным последствиям.",
- "confirm_cloudflare": "Подключение к Cloudflare",
- "confirm_cloudflare_description": "Введите токен Cloudflare, который имеет права на {}:",
- "confirm_backblze": "Подключение к Backblaze",
- "confirm_backblaze_description": "Введите токен Backblaze, который имеет права на хранилище резервных копий:"
- },
- "devices": {
- "main_screen": {
- "header": "Устройства",
- "description": "Эти устройства имеют полный доступ к управлению сервером через приложение SelfPrivacy.",
- "this_device": "Это устройство",
- "other_devices": "Другие устройства",
- "authorize_new_device": "Авторизовать новое устройство",
- "access_granted_on" : "Доступ выдан {}",
- "tip": "Нажмите на устройство, чтобы отозвать доступ."
+ "title": "VPN сервер",
+ "subtitle": "Закрытый VPN сервер"
},
- "add_new_device_screen": {
- "header": "Авторизация нового устройства",
- "description": "Введите этот ключ на новом устройстве:",
- "please_wait": "Пожалуйста, подождите",
- "tip": "Ключ действителен 10 минут.",
- "expired": "Срок действия ключа истёк.",
- "get_new_key": "Получить новый ключ"
+ "users": {
+ "add_new_user": "Добавьте первого пользователя",
+ "new_user": "Новый пользователь",
+ "delete_user": "Удалить пользователя",
+ "not_ready": "Подключите сервер, домен и DNS в разделе Провайдеры чтобы добавить первого пользователя",
+ "nobody_here": "Здесь будут отображаться пользователи",
+ "login": "Логин",
+ "new_user_info_note": "Новый пользователь автоматически получит доступ ко всем сервисам",
+ "delete_confirm_question": "Вы действительно хотите удалить учетную запись?",
+ "reset_password": "Сбросить пароль",
+ "account": "Учетная запись",
+ "send_registration_data": "Поделиться реквизитами",
+ "could_not_fetch_users": "Не удалось получить пользователей",
+ "could_not_fetch_description": "Проверьте интернет соединение и попробуйте снова",
+ "refresh_users": "Обновить список пользователей",
+ "could_not_create_user": "Не удалось создать пользователя",
+ "could_not_delete_user": "Не удалось стереть пользователя",
+ "could_not_add_ssh_key": "Не удалось создать SSH ключ",
+ "username_rule": "Имя может содержать только маленькие латинские буквы, цифры, подчёркивания, не может начинаться с цифр",
+ "email_login": "Авторизация по Email",
+ "no_ssh_notice": "Для этого пользователя созданы только SSH и Email аккаунт. Единая авторизация для всех сервисов ещё не реализована.",
+ "details_title": "Пользователь"
},
- "revoke_device_alert": {
- "header": "Отозвать доступ?",
- "description": "Устройство {} больше не сможет управлять сервером.",
- "yes": "Отозвать",
- "no": "Отмена"
+ "initializing": {
+ "dns_provider_description": "Это позволит связать ваш домен с IP адресом:",
+ "connect_to_server": "Начнём с сервера.",
+ "select_provider": "Ниже подборка провайдеров, которых поддерживает SelfPrivacy",
+ "select_provider_notice": "Под 'Небольшим сервером' имеется ввиду сервер с двумя потоками процессора и двумя гигабайтами оперативной памяти.",
+ "select_provider_countries_title": "Доступные страны",
+ "select_provider_countries_text_hetzner": "Германия, Финляндия, США",
+ "select_provider_countries_text_do": "США, Нидерланды, Сингапур, Великобритания, Германия, Канада, Индия, Австралия",
+ "select_provider_price_title": "Средняя цена",
+ "select_provider_price_free": "Бесплатно",
+ "select_provider_price_text_hetzner": "€8 в месяц за небольшой сервер и 50GB места на диске",
+ "select_provider_price_text_do": "$17 в месяц за небольшой сервер и 50GB места на диске",
+ "select_provider_payment_title": "Методы оплаты",
+ "select_provider_payment_text_hetzner": "Банковские карты, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_cloudflare": "Банковские карты",
+ "select_provider_payment_text_do": "Банковские карты, Google Pay, PayPal",
+ "select_provider_email_notice": "Хостинг электронной почты недоступен для новых клиентов. Разблокировать можно будет после первой оплаты.",
+ "select_provider_site_button": "Посетить сайт",
+ "connect_to_server_provider": "Авторизоваться в ",
+ "connect_to_server_provider_text": "С помощью API токена приложение SelfPrivacy сможет от вашего имени заказать и настроить сервер",
+ "how": "Как получить API Token",
+ "provider_bad_key_error": "API ключ провайдера неверен",
+ "could_not_connect": "Не удалось соединиться с провайдером.",
+ "choose_location_type": "Где заказать сервер?",
+ "choose_location_type_text": "От выбора локации будут зависеть доступные конфигурации, цены и скорость вашего соединения с сервером.",
+ "locations_not_found": "Упс!",
+ "locations_not_found_text": "В этом месте не оказалось доступных серверов для аренды",
+ "back_to_locations": "Выберем другой",
+ "no_locations_found": "Не найдено локаций, убедитесь, что ваш аккаунт доступен",
+ "choose_server_type": "Какой выбрать тип сервера?",
+ "choose_server_type_text": "От ресурсов сервера зависит, какие сервисы смогут запуститься. Расширить сервер можно будет в любое время",
+ "choose_server_type_notice": "Главное, на что стоит обратить внимание — количество потоков процессора и объём оперативной памяти. Данные сервисов будут размещены на отдельном диске, который оплачивается отдельно и легко расширяем.",
+ "choose_server_type_ram": "{} GB у RAM",
+ "choose_server_type_storage": "{} GB системного хранилища",
+ "choose_server_type_payment_per_month": "{} в месяц",
+ "choose_server_type_payment_server": "{} за сам сервер",
+ "choose_server_type_payment_storage": "{} за расширяемое хранилище",
+ "choose_server_type_payment_ip": "{} за публичный IPv4",
+ "no_server_types_found": "Не найдено доступных типов сервера! Пожалуйста, убедитесь, что у вас есть доступ к провайдеру сервера...",
+ "dns_provider_bad_key_error": "API ключ неверен",
+ "backblaze_bad_key_error": "Информация о Backblaze хранилище неверна",
+ "connect_to_dns": "Подключите DNS провайдера",
+ "connect_to_dns_provider_text": "С помощью API токена приложение SelfPrivacy настроит DNS записи",
+ "manage_domain_dns": "Для управления DNS вашего домена",
+ "use_this_domain": "Используем этот домен?",
+ "use_this_domain_text": "Указанный вами токен даёт контроль над этим доменом",
+ "connect_backblaze_storage": "Подключите облачное хранилище Backblaze",
+ "no_connected_domains": "На данный момент подлюченных доменов нет",
+ "loading_domain_list": "Загружаем список доменов",
+ "found_more_domains": "Найдено больше одного домена, для вашей безопасности, просим Вам удалить ненужные домены",
+ "save_domain": "Сохранить домен",
+ "final": "Последний шаг",
+ "create_server": "Создать сервер",
+ "what": "Что это значит?",
+ "server_rebooted": "Сервер перезагружен, ждём последнюю проверку…",
+ "server_started": "Сервер запущен. Сейчас он будет проверен и перезагружен…",
+ "server_created": "Сервер создан. Идёт проверка DNS адресов и запуск сервера…",
+ "until_the_next_check": "До следующей проверки: ",
+ "check": "Проверка",
+ "one_more_restart": "Сейчас будет дополнительная перезагрузка для активации сертификатов безопасности.",
+ "create_master_account": "Создайте главную учетную запись",
+ "enter_username_and_password": "Введите имя пользователя и сложный пароль",
+ "finish": "Всё инициализировано",
+ "checks": "Проверок выполнено: \n{} / {}",
+ "select_dns": "Сейчас выберите DNS провайдера",
+ "steps": {
+ "hosting": "Хостинг",
+ "server_type": "Тип сервера",
+ "nixos_installation": "Установка NixOS",
+ "dns_provider": "DNS провайдер",
+ "backups_provider": "Резервное копирование",
+ "domain": "Домен",
+ "master_account": "Главная учетная запись",
+ "server": "Сервер",
+ "dns_setup": "Установка DNS",
+ "server_reboot": "Перезагрузка сервера",
+ "final_checks": "Финальные проверки"
+ },
+ "server_provider_description": "Место, где будут находиться ваши данные и сервисы SelfPrivacy:",
+ "multiple_domains_found": "Найдено несколько доменов",
+ "multiple_domains_found_text": "Предоставленный токен дает доступ к следующим доменам. Пожалуйста, выберите тот, который вы хотите использовать. Для обеспечения безопасности других доменов следует ограничить доступ этого токена только тем доменом, который вы хотите использовать с SelfPrivacy."
+ },
+ "recovering": {
+ "generic_error": "Ошибка проведения операции, попробуйте ещё раз.",
+ "recovery_main_header": "Подключиться к существующему серверу",
+ "domain_recovery_description": "Введите домен, по которому вы хотите получить доступ к серверу:",
+ "domain_recover_placeholder": "Домен",
+ "domain_recover_error": "Не удалось найти сервер с таким доменом",
+ "method_select_description": "Выберите способ входа:",
+ "method_select_other_device": "У меня есть доступ на другом устройстве",
+ "method_select_recovery_key": "У меня есть ключ восстановления",
+ "method_select_nothing": "У меня ничего из этого нет",
+ "method_device_description": "Откройте приложение на другом устройстве и откройте экран управления устройствами. Нажмите \"Добавить устройство\" чтобы получить токен для авторизации.",
+ "method_device_button": "Я получил токен",
+ "method_device_input_description": "Введите ваш токен авторизации",
+ "method_device_input_placeholder": "Токен",
+ "method_recovery_input_description": "Введите ваш токен восстановления",
+ "fallback_select_description": "Что у вас из этого есть? Выберите первое, что подходит:",
+ "fallback_select_token_copy": "Копия токена авторизации из другой версии приложения.",
+ "fallback_select_root_ssh": "Root доступ к серверу по SSH.",
+ "fallback_select_provider_console": "Доступ к консоли хостинга.",
+ "authorization_failed": "Не удалось войти с этим ключом",
+ "fallback_select_provider_console_hint": "Например, Hetzner.",
+ "confirm_server": "Подтвердите сервер",
+ "confirm_server_description": "Нашли сервер! Подтвердите, что это он:",
+ "confirm_server_accept": "Да, это он",
+ "confirm_server_decline": "Выбрать другой сервер",
+ "choose_server": "Выберите сервер",
+ "choose_server_description": "Не удалось определить, с каким сервером вы устанавливаете связь.",
+ "no_servers": "На вашем аккаунте нет доступных серверов.",
+ "domain_not_available_on_token": "Введённый токен не имеет доступа к нужному домену.",
+ "modal_confirmation_title": "Это действительно ваш сервер?",
+ "modal_confirmation_description": "Подключение к неправильному серверу может привести к деструктивным последствиям.",
+ "modal_confirmation_dns_valid": "Обратный DNS корректен",
+ "modal_confirmation_dns_invalid": "Обратный DNS указывает на другой домен",
+ "modal_confirmation_ip_valid": "IP совпадает с указанным в DNS записи",
+ "modal_confirmation_ip_invalid": "IP не совпадает с указанным в DNS записи",
+ "provider_connected": "Подключение к вашему {}",
+ "provider_connected_description": "Связь установлена. Введите свой токен с доступом к {}:",
+ "provider_connected_placeholder": "{} Токен"
+ },
+ "devices": {
+ "main_screen": {
+ "header": "Устройства",
+ "description": "Эти устройства имеют полный доступ к управлению сервером через приложение SelfPrivacy.",
+ "this_device": "Это устройство",
+ "other_devices": "Другие устройства",
+ "authorize_new_device": "Авторизовать новое устройство",
+ "access_granted_on": "Доступ выдан {}",
+ "tip": "Нажмите на устройство, чтобы отозвать доступ."
+ },
+ "add_new_device_screen": {
+ "header": "Авторизация нового устройства",
+ "description": "Введите этот ключ на новом устройстве:",
+ "please_wait": "Пожалуйста, подождите",
+ "tip": "Ключ действителен 10 минут.",
+ "expired": "Срок действия ключа истёк.",
+ "get_new_key": "Получить новый ключ"
+ },
+ "revoke_device_alert": {
+ "header": "Отозвать доступ?",
+ "description": "Устройство {} больше не сможет управлять сервером.",
+ "yes": "Отозвать",
+ "no": "Отмена"
+ }
+ },
+ "recovery_key": {
+ "key_connection_error": "Не удалось соединиться с сервером.",
+ "key_synchronizing": "Синхронизация…",
+ "key_main_header": "Ключ восстановления",
+ "key_main_description": "Требуется для авторизации SelfPrivacy, когда авторизованные устройства недоступны.",
+ "key_amount_toggle": "Ограничить использования",
+ "key_amount_field_title": "Макс. кол-во использований",
+ "key_duedate_toggle": "Ограничить срок использования",
+ "key_duedate_field_title": "Дата окончания срока",
+ "key_receive_button": "Получить ключ",
+ "key_valid": "Ваш ключ действителен",
+ "key_invalid": "Ваш ключ больше не действителен",
+ "key_valid_until": "Действителен до {}",
+ "key_valid_for": "Можно использовать ещё {} раз",
+ "key_creation_date": "Создан {}",
+ "key_replace_button": "Сгенерировать новый ключ",
+ "key_receiving_description": "Запишите этот ключ в безопасном месте. Он предоставляет полный доступ к вашему серверу:",
+ "key_receiving_info": "Этот ключ больше не будет показан, но вы сможете заменить его новым.",
+ "key_receiving_done": "Готово!",
+ "generation_error": "Не удалось сгенерировать ключ. {}"
+ },
+ "modals": {
+ "dns_removal_error": "Невозможно удалить DNS записи.",
+ "server_deletion_error": "Невозможно удалить сервер.",
+ "server_validators_error": "Не удалось получить список серверов.",
+ "already_exists": "Такой сервер уже существует.",
+ "unexpected_error": "Непредвиденная ошибка со стороны провайдера.",
+ "destroy_server": "Уничтожить сервер и создать новый?",
+ "try_again": "Попробовать ещё раз?",
+ "are_you_sure": "Вы уверены?",
+ "purge_all_keys": "Стереть все ключи авторизации?",
+ "purge_all_keys_confirm": "Да, стереть все ключи",
+ "delete_server_volume": "Удалить сервер и хранилище?",
+ "reboot": "Перезагрузить",
+ "you_cant_use_this_api": "Нельзя использовать этот API для доменом с подобным TLD.",
+ "yes": "Да",
+ "no": "Нет",
+ "volume_creation_error": "Не удалось создать хранилище."
+ },
+ "timer": {
+ "sec": "{} сек"
+ },
+ "jobs": {
+ "title": "Задачи",
+ "start": "Начать выполнение",
+ "empty": "Задач нет",
+ "create_user": "Создать пользователя",
+ "delete_user": "Удалить пользователя",
+ "service_turn_off": "Остановить",
+ "service_turn_on": "Запустить",
+ "job_added": "Задача добавлена",
+ "run_jobs": "Запустите задачи",
+ "reboot_success": "Сервер перезагружается",
+ "reboot_failed": "Не удалось перезагрузить сервер, проверьте логи.",
+ "config_pull_failed": "Не удалось обновить конфигурацию сервера. Обновление ПО запущено.",
+ "upgrade_success": "Запущено обновление сервера",
+ "upgrade_failed": "Обновить сервер не вышло",
+ "upgrade_server": "Обновить сервер",
+ "reboot_server": "Перезагрузить сервер",
+ "create_ssh_key": "Создать SSH ключ для {}",
+ "delete_ssh_key": "Удалить SSH ключ для {}",
+ "server_jobs": "Задачи на сервере",
+ "reset_user_password": "Сбросить пароль пользователя",
+ "generic_error": "Не удалось подключиться к серверу!"
+ },
+ "validations": {
+ "required": "Обязательное поле",
+ "already_exist": "Уже существует",
+ "invalid_format": "Неверный формат",
+ "invalid_format_password": "Пароль не должен содержать пробелы",
+ "invalid_format_ssh": "Должен следовать формату SSH ключей",
+ "root_name": "Имя пользователя не может быть 'root'",
+ "length_not_equal": "Длина строки [], должна быть равна {}",
+ "length_longer": "Длина строки [], должна быть меньше либо равна {}"
+ },
+ "support": {
+ "title": "Поддержка SelfPrivacy"
+ },
+ "developer_settings": {
+ "title": "Настройки разработчика",
+ "subtitle": "Эти настройки предназначены только для отладки. Не изменяйте их, если не знаете, что делаете.",
+ "server_setup": "Мастер установки сервера",
+ "use_staging_acme": "Использование тестового ACME сервера",
+ "use_staging_acme_description": "Применяется при настройке нового сервера.",
+ "routing": "Роутинг приложения",
+ "reset_onboarding": "Сбросить флаг посещения приветствия",
+ "cubit_statuses": "Текущий статут кубитов загрузки",
+ "reset_onboarding_description": "Принудить показ приветственного экрана",
+ "ignore_tls_description": "Приложение не будет проверять сертификаты TLS при подключении к серверу.",
+ "ignore_tls": "Не проверять сертификаты TLS"
}
- },
- "recovery_key": {
- "key_connection_error": "Не удалось соединиться с сервером",
- "key_synchronizing": "Синхронизация...",
- "key_main_header": "Ключ восстановления",
- "key_main_description": "Требуется для авторизации SelfPrivacy, когда авторизованные устройства недоступны.",
- "key_amount_toggle": "Ограничить использования",
- "key_amount_field_title": "Макс. кол-во использований",
- "key_duedate_toggle": "Ограничить срок использования",
- "key_duedate_field_title": "Дата окончания срока",
- "key_receive_button": "Получить ключ",
- "key_valid": "Ваш ключ действителен",
- "key_invalid": "Ваш ключ больше не действителен",
- "key_valid_until": "Действителен до {}",
- "key_valid_for": "Можно использовать ещё {} раз",
- "key_creation_date": "Создан {}",
- "key_replace_button": "Сгенерировать новый ключ",
- "key_receiving_description": "Запишите этот ключ в безопасном месте. Он предоставляет полный доступ к вашему серверу:",
- "key_receiving_info": "Этот ключ больше не будет показан, но вы сможете заменить его новым.",
- "key_receiving_done": "Готово!",
- "generation_error": "Не удалось сгенерировать ключ. {}"
- },
- "modals": {
- "_comment": "messages in modals",
- "1": "Сервер с таким именем уже существует",
- "2": "Уничтожить сервер и создать новый?",
- "3": "Подтвердите",
- "4": "Сбросить все ключи?",
- "5": "Да, сбросить",
- "6": "Удалить сервер и диск?",
- "7": "Да, удалить",
- "8": "Удалить задачу",
- "9": "Перезагрузить",
- "10": "API не поддерживает домены с таким TLD.",
- "yes": "Да",
- "no": "Нет"
- },
- "timer": {
- "sec": "{} сек"
- },
- "jobs": {
- "_comment": "Jobs list",
- "title": "Задачи",
- "start": "Начать выполенение",
- "empty": "Пусто.",
- "createUser": "Создать пользователя",
- "deleteUser": "Удалить пользователя",
- "serviceTurnOff": "Остановить",
- "serviceTurnOn": "Запустить",
- "jobAdded": "Задача добавленна",
- "runJobs": "Запустите задачи",
- "rebootSuccess": "Сервер перезагружается",
- "rebootFailed": "Не удалось перезагрузить сервер, проверьте логи",
- "configPullFailed": "Не удалось обновить конфигурацию сервера. Обновление ПО запущено.",
- "upgradeSuccess": "Запущено обновление сервера",
- "upgradeFailed": "Обновить сервер не вышло",
- "upgradeServer": "Обновить сервер",
- "rebootServer": "Перезагрузить сервер",
- "create_ssh_key": "Создать SSH ключ для {}",
- "delete_ssh_key": "Удалить SSH ключ для {}"
- },
- "validations": {
- "required": "Обязательное поле.",
- "invalid_format": "Неверный формат.",
- "root_name": "Имя пользователя не может быть 'root'.",
- "key_format": "Неверный формат.",
- "length_not_equal": "Длина строки []. Должно быть равно {}.",
- "length_longer": "Длина строки []. Должно быть меньше либо равно {}.",
- "user_already_exist": "Имя уже используется.",
- "key_already_exists": "Этот ключ уже добавлен."
- }
}
diff --git a/assets/translations/sk.json b/assets/translations/sk.json
new file mode 100644
index 00000000..514b47eb
--- /dev/null
+++ b/assets/translations/sk.json
@@ -0,0 +1,501 @@
+{
+ "validations": {
+ "length_longer": "Dĺžka je [], mala by byť kratšia alebo rovná {}",
+ "required": "Požadované pole",
+ "already_exist": "Už existuje",
+ "invalid_format": "Nesprávny formát",
+ "invalid_format_ssh": "Musí dodržiavať formát kľúča SSH",
+ "root_name": "Používateľské meno nemôže byť 'root'",
+ "length_not_equal": "Dĺžka je [], mala by byť {}",
+ "invalid_format_password": "Nesmie obsahovať prázdne znaky"
+ },
+ "modals": {
+ "no": "Nie",
+ "are_you_sure": "Ste si istý?",
+ "you_cant_use_this_api": "Toto API nemôžete použiť pre doménu s podobnou TLD.",
+ "yes": "Áno",
+ "dns_removal_error": "Nie je možné odstrániť zápisy DNS.",
+ "server_deletion_error": "Server nie je možné vymazať.",
+ "server_validators_error": "Nepodarilo sa získať zoznam serverov.",
+ "already_exists": "Takýto server už existuje.",
+ "unexpected_error": "Neočakávaná chyba na strane poskytovateľa.",
+ "destroy_server": "Zničiť server a vytvoriť nový?",
+ "try_again": "Skúsiť ešte raz?",
+ "purge_all_keys": "Vymazať všetky autorizačné kľúče?",
+ "purge_all_keys_confirm": "Áno, vyčistiť všetky moje tokeny",
+ "delete_server_volume": "Odstrániť server a úložisko?",
+ "reboot": "Reštartovať"
+ },
+ "jobs": {
+ "title": "Úlohy",
+ "start": "Štart",
+ "empty": "Žiadne úlohy",
+ "create_user": "Vytvoriť používateľa",
+ "delete_user": "Vymazať používateľa",
+ "reboot_success": "Server sa reštartuje",
+ "config_pull_failed": "Nepodarilo sa stiahnuť aktualizáciu konfigurácie. Aj tak sa začala aktualizácia softvéru.",
+ "service_turn_off": "Vypnúť",
+ "service_turn_on": "Zapnúť",
+ "job_added": "Úloha bola pridaná",
+ "run_jobs": "Spustiť úlohy",
+ "reboot_failed": "Server sa nepodarilo reštartovať, skontrolujte protokoly.",
+ "upgrade_success": "Spustila sa aktualizácia servera",
+ "upgrade_failed": "Aktualizácia servera zlyhala",
+ "upgrade_server": "Aktualizovať server",
+ "reboot_server": "Reštartovať server",
+ "create_ssh_key": "Vytvoriť kľúč SSH pre {}",
+ "delete_ssh_key": "Odstrániť kľúč SSH pre {}",
+ "server_jobs": "Úlohy na serveri",
+ "reset_user_password": "Obnoviť heslo používateľa",
+ "generic_error": "Nepodarilo sa pripojiť k serveru!"
+ },
+ "test": "sk-test",
+ "locale": "sk",
+ "basis": {
+ "providers": "Poskytovatelia",
+ "providers_title": "Vaše dátové centrum",
+ "select": "Vybrať",
+ "services": "Služby",
+ "users": "Užívatelia",
+ "more": "Viac",
+ "next": "Ďalší",
+ "got_it": "Dobre",
+ "settings": "Nastavenia",
+ "password": "Heslo",
+ "create": "Pridať nový",
+ "confirmation": "Potvrdenie",
+ "cancel": "Zrušiť",
+ "delete": "Vymazať",
+ "close": "Zavrieť",
+ "connect": "Pripojiť",
+ "domain": "Doména",
+ "saving": "Ukladanie…",
+ "username": "Užívateľské meno",
+ "later": "Preskočiť a nastaviť neskôr",
+ "connect_to_existing": "Pripojiť sa k existujúcemu serveru",
+ "reset": "Resetovať",
+ "details": "Podrobnosti",
+ "no_data": "Žiadne dáta",
+ "wait": "Počkajte",
+ "remove": "Vymazať",
+ "done": "Hotovo",
+ "continue": "Pokračovať",
+ "alert": "Upozornenie",
+ "services_title": "Vaše osobné, súkromné a nezávislé služby.",
+ "loading": "Načítanie…",
+ "apply": "Uplatniť",
+ "app_name": "SelfPrivacy"
+ },
+ "more_page": {
+ "configuration_wizard": "Sprievodca nastavením",
+ "about_project": "O nás",
+ "about_application": "O apke",
+ "console": "Konzola",
+ "application_settings": "Nastavenia aplikácie",
+ "onboarding": "Vitajte",
+ "create_ssh_key": "SSH kľúče superužívateľa"
+ },
+ "console_page": {
+ "title": "Konzola",
+ "waiting": "Čakáme na inicializáciu…",
+ "copy": "Kopírovať"
+ },
+ "about_us_page": {
+ "title": "O nás"
+ },
+ "about_application_page": {
+ "title": "O apke",
+ "application_version_text": "Verzia aplikácie {}",
+ "api_version_text": "Verzia servera {}",
+ "privacy_policy": "Zásady ochrany osobných údajov"
+ },
+ "application_settings": {
+ "title": "Nastavenia aplikácie",
+ "dark_theme_title": "Temná téma",
+ "dark_theme_description": "Zmeniť tému aplikácie",
+ "reset_config_title": "Resetovať nastavenia aplikácie",
+ "reset_config_description": "Resetovať kľúče API a užívateľa root.",
+ "delete_server_title": "Zmazať server",
+ "delete_server_description": "Tým sa odstráni váš server. Už nebude prístupným.",
+ "system_dark_theme_description": "Použitie svetlej alebo tmavej témy v závislosti od nastavení systému",
+ "system_dark_theme_title": "Systémová predvolená téma",
+ "dangerous_settings": "Nebezpečné nastavenia"
+ },
+ "ssh": {
+ "title": "Kľúče SSH",
+ "create": "Vytvoriť kľúč SSH",
+ "delete": "Zmazať kľúč SSH",
+ "delete_confirm_question": "Ste si istí že chcete vymazať kľúč SSH?",
+ "subtitle_with_keys": "{} kľúče",
+ "subtitle_without_keys": "Žiadne kľúče",
+ "no_key_name": "Kľúč bez mena",
+ "root_title": "Toto sú kľúče superužívateľa",
+ "input_label": "Verejný kľúč ED25519 alebo RSA",
+ "root_subtitle": "Majitelia týchto kľúčov získajú plný prístup na server a môžu na ňom robiť čokoľvek. Pridávajte do servera iba svoje vlastné kľúče."
+ },
+ "onboarding": {
+ "page1_title": "Digitálna nezávislosť, dostupná každému z nás",
+ "page1_text": "Email, VPN, Messenger, sociálna sieť a o veľa viac na vašom privátnom servere, pod vašim kontrolom.",
+ "page2_text": "SelfPrivacy pracuje iba s poskytovateľmi, ktoré si vyberiete. Ak v nich nemáte požadované účty, pomôžeme vám ich vytvoriť.",
+ "page2_server_provider_title": "Poskytovateľ servera",
+ "page2_backup_provider_title": "Poskytovateľ zálohovania",
+ "page2_title": "SelfPrivacy nie je oblak, toto je váš personálny datacentrum",
+ "page2_server_provider_text": "Poskytovateľ servera udržiava váš server vo svojom vlastnom dátovom centre. SelfPrivacy sa automaticky pripojí k poskytovateľovi a nastaví všetky potrebné veci.",
+ "page2_dns_provider_title": "Poskytovateľ DNS",
+ "page2_dns_provider_text": "Potrebujete doménu, aby ste mali miesto na internete. A tiež potrebujete spoľahlivého poskytovateľa DNS, aby bola doména nasmerovaná na váš server. Navrhujeme, aby ste si vybrali podporovaného poskytovateľa DNS na automatické nastavenie sietí.",
+ "page2_backup_provider_text": "Čo ak sa niečo stane na vašom serveri? Predstavte si hackerský útok, náhodné vymazanie údajov alebo odmietnutie služby? Vaše údaje budú udržiavané v bezpečí vášho poskytovateľa záloh. Budú bezpečne šifrovaní a kedykoľvek sú prístupní na obnovenie servera."
+ },
+ "resource_chart": {
+ "month": "Mesiac",
+ "day": "Deň",
+ "hour": "Hodina",
+ "cpu_title": "Využitie procesora",
+ "network_title": "Využitie siete",
+ "out": "Von",
+ "in": "Dnu"
+ },
+ "server": {
+ "card_title": "Server",
+ "description": "Všetky vaši servery bývajú tu",
+ "general_information": "Všeobecné informácie",
+ "resource_usage": "Využitie zdrojov",
+ "allow_autoupgrade": "Povoliť automatické aktualizácie",
+ "allow_autoupgrade_hint": "Povoliť automatické aktualizácie balíkov na serveri",
+ "reboot_after_upgrade": "Reštartovať po aktualizácie",
+ "reboot_after_upgrade_hint": "Reštartovať server po aktualizácii bez výzvy",
+ "server_timezone": "Časový pás servera",
+ "select_timezone": "Vyberte časový pás",
+ "timezone_search_bar": "Názov časového pásma alebo veľkosť časového posunu",
+ "server_id": "ID servera",
+ "status": "Stav",
+ "cpu": "Procesor",
+ "ram": "Pamäť",
+ "disk": "Lokálny disk",
+ "monthly_cost": "Mesačná cena",
+ "location": "Lokalita",
+ "core_count": {
+ "one": "{} jadro",
+ "two": "{} jadrá",
+ "few": "{} jadier",
+ "many": "{} jadier",
+ "other": "{} jadier"
+ }
+ },
+ "record": {
+ "root": "Koreňová doména",
+ "api": "SelfPrivacy API",
+ "cloud": "Súborový cloud",
+ "git": "Git server",
+ "meet": "Video konferencie",
+ "social": "Sociálna sieť",
+ "password": "Správca hesiel",
+ "vpn": "VPN",
+ "mx": "Zápis MX",
+ "dmarc": "Zápis DMARC",
+ "spf": "Zápis SPF",
+ "dkim": "Kľúč DKIM"
+ },
+ "domain": {
+ "screen_title": "Doména a DNS",
+ "ok": "Zápise sú v poriadku",
+ "error": "Nájdené problémy",
+ "error_subtitle": "Klepnutím sem ich opravíte",
+ "uninitialized": "Údaje ešte nie sú načítané",
+ "services_title": "Služby",
+ "services_subtitle": "Zápisy typu “A” nutne pre každú službu.",
+ "email_title": "Email",
+ "update_list": "Obnoviť zoznam",
+ "card_title": "Doména",
+ "refreshing": "Obnovovanie stavu…",
+ "email_subtitle": "Zápisy nutne pre bezpečnú prácu s emailami."
+ },
+ "service_page": {
+ "open_in_browser": "Otvoriť v prehliadači",
+ "restart": "Reštartovať službu",
+ "disable": "Vypnúť službu",
+ "uses": "Využíva {usage} na {volume}",
+ "enable": "Zapnúť službu",
+ "move": "Presunúť na iný disk",
+ "status": {
+ "active": "Zapnuté a funguje",
+ "inactive": "Vypnuté",
+ "failed": "Chyba pri štarte",
+ "off": "Vypnuté",
+ "activating": "Zapína sa",
+ "deactivating": "Vypína sa",
+ "reloading": "Reštartuje sa"
+ }
+ },
+ "backup": {
+ "card_title": "Záloha",
+ "description": "Ušetrí vám nervy v prípade incidentu: útok hackerov, vymazanie servera atď.",
+ "reupload_key": "Násilne aktualizovať kľúč",
+ "reuploaded_key": "Kľúč je aktualizovaný",
+ "initialize": "Nastaviť",
+ "restore": "Obnoviť zo zálohy",
+ "no_backups": "Zatiaľ nemáte žiadne záložné kópie",
+ "create_new": "Vytvoriť novú zálohu",
+ "creating": "Vytvorenie zálohy: {}%",
+ "restoring": "Obnovenie zo zálohy",
+ "error_pending": "Server vrátil chybu, pozrite ju nižšie",
+ "refresh": "Obnoviť stav",
+ "refetch_backups": "Obnoviť zoznam záloh",
+ "refetching_list": "O pár minút zoznam bude aktualizovaný",
+ "waiting_for_rebuild": "O pár minút budete môcť vytvoriť svoju prvú zálohu.",
+ "restore_alert": "Chystáte sa obnoviť zo zálohy vytvorenej {}. Všetky aktuálne údaje sa stratia. Ste si istý?"
+ },
+ "storage": {
+ "card_title": "Skladovací priestor",
+ "status_ok": "Disk je v poriadku",
+ "status_error": "Málo miesta na disku",
+ "disk_usage": "Využité {}",
+ "disk_total": "{} celkove · {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "Bajtov",
+ "extend_volume_button": "Rozšíriť úložisko",
+ "extending_volume_price_info": "Cena je vrátane DPH a vychádza z cenových údajov poskytnutých spoločnosťou Hetzner. Server sa počas procesu reštartuje.",
+ "extending_volume_error": "Nepodarilo sa spustiť rozšírenie úložiska.",
+ "size": "Veľkosť",
+ "data_migration_title": "Migrácia údajov",
+ "data_migration_notice": "V čase migrácie údajov sa všetky služby vypnú.",
+ "start_migration_button": "Spustiť migráciu",
+ "migration_process": "Migruje sa…",
+ "migration_done": "Dokončiť",
+ "extending_volume_title": "Rozšírenie úložiska",
+ "extending_volume_description": "Zmena veľkosti úložiska vám umožní uchovávať viac údajov na serveri bez rozšírenia samotného servera. Objem sa dá len zvýšiť: nemôžete znížiť."
+ },
+ "not_ready_card": {
+ "in_menu": "Server ešte nie je nakonfigurovaný, použite sprievodcu nastavením."
+ },
+ "initializing": {
+ "choose_server_type_notice": "Dôležité veci, na ktoré sa treba pozrieť, sú CPU a RAM. Dáta vašich služieb budú uložené na pripojenom disku, ktorý sa dá ľahko rozšíriť a platí sa zaň samostatne.",
+ "select_provider": "Vyberte si ktoréhokoľvek poskytovateľa z nasledujúceho zoznamu, všetci podporujú SelfPrivacy",
+ "select_provider_countries_text_do": "USA, Holandsko, Singapur, Spojené kráľovstvo, Nemecko, Kanada, India, Austrália",
+ "select_provider_email_notice": "E-mailový hosting nie je dostupný pre nových zákazníkov. Odomknutie bude možné po prvej platbe.",
+ "choose_location_type_text": "Rôzne miesta poskytujú rôzne konfigurácie serverov, ceny a rýchlosť pripojenia.",
+ "choose_server_type_text": "Rôzne možnosti zdrojov podporujú rôzne služby. Nebojte sa, svoj server môžete kedykoľvek rozšíriť",
+ "enter_username_and_password": "Zadajte používateľské meno a zložité heslo",
+ "finish": "Všetko je inicializované",
+ "use_this_domain_text": "Token, ktorý ste poskytli, poskytuje prístup k nasledujúcej doméne",
+ "connect_backblaze_storage": "Pripojte svoje cloudové úložisko Backblaze",
+ "no_connected_domains": "Momentálne nie sú pripojené žiadne domény",
+ "loading_domain_list": "Načítava sa zoznam domén",
+ "found_more_domains": "Našlo sa viac ako jedna doména. Pre vašu vlastnú bezpečnosť vás požiadame o odstránenie nepotrebných domén",
+ "save_domain": "Uložiť doménu",
+ "final": "Posledný krok",
+ "create_server": "Vytvoriť server",
+ "what": "Čo to znamená?",
+ "server_rebooted": "Server bol reštartovaný. Čaká sa na posledné overenie…",
+ "server_started": "Server spustený. Teraz bude overený a reštartovaný…",
+ "server_created": "Server bol vytvorený. Prebieha kontrola DNS a spúšťanie servera…",
+ "until_the_next_check": "Do nasledujúcej kontroly: ",
+ "check": "Kontrola",
+ "one_more_restart": "Teraz dôjde k ďalšiemu reštartu na aktiváciu bezpečnostných certifikátov.",
+ "connect_to_server": "Začnime so serverom.",
+ "select_provider_notice": "Pod pojmom „malý server“ rozumieme server s dvoma procesorovými vláknami a dvoma gigabajtmi pamäte RAM.",
+ "select_provider_countries_title": "Dostupné krajiny",
+ "select_provider_countries_text_hetzner": "Nemecko, Fínsko, USA",
+ "select_provider_price_title": "Priemerná cena",
+ "select_provider_price_text_hetzner": "8€ mesačne za malý server a 50 GB miesta na disku",
+ "select_provider_price_text_do": "$17 mesačne za malý server a 50 GB miesta na disku",
+ "select_provider_payment_title": "Spôsoby platby",
+ "select_provider_payment_text_hetzner": "Bankové karty, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_do": "Bankové karty, Google Pay, PayPal",
+ "select_provider_site_button": "Navštíviť stránku",
+ "connect_to_server_provider": "Prihlásiť sa v ",
+ "connect_to_server_provider_text": "S API tokenom si SelfPrivacy bude môcť prenajať stroj a nastaviť na ňom váš server",
+ "how": "Ako získať token API",
+ "provider_bad_key_error": "Kľúč API poskytovateľa je neplatný",
+ "could_not_connect": "Nepodarilo sa pripojiť k poskytovateľovi.",
+ "choose_location_type": "Kde objednať server?",
+ "locations_not_found": "Ojoj!",
+ "locations_not_found_text": "Nie sú k dispozícii žiadne servery na prenájom",
+ "back_to_locations": "Vybrať niečo iné",
+ "no_locations_found": "Nenašli sa žiadne dostupné miesta, skontrolujte, či je váš účet prístupný",
+ "choose_server_type": "Aký typ servera potrebujete?",
+ "choose_server_type_ram": "{} GB RAM",
+ "choose_server_type_storage": "{} GB systémového úložiska",
+ "choose_server_type_payment_per_month": "{} mesačne",
+ "no_server_types_found": "Nenašli sa žiadne dostupné typy serverov. Uistite sa, že je váš účet prístupný a skúste zmeniť umiestnenie servera.",
+ "backblaze_bad_key_error": "Informácie o úložisku Backblaze sú neplatné",
+ "select_dns": "Teraz vyberme poskytovateľa DNS",
+ "manage_domain_dns": "Na správu DNS vašej domény",
+ "use_this_domain": "Chcete použiť túto doménu?",
+ "create_master_account": "Vytvorte hlavný účet",
+ "checks": "Kontroly boli ukončené\n{} z {}",
+ "steps": {
+ "nixos_installation": "Inštalácia NixOS",
+ "hosting": "Hosting",
+ "server_type": "Typ servera",
+ "dns_provider": "Poskytovateľ DNS",
+ "backups_provider": "Záložné kópie",
+ "domain": "Doména",
+ "master_account": "Hlavný účet",
+ "server": "Server",
+ "dns_setup": "Nastavenie DNS",
+ "server_reboot": "Reštartovanie servera",
+ "final_checks": "Záverečné previerky"
+ }
+ },
+ "mail": {
+ "subtitle": "Email pre rodinu alebo spoločnosť.",
+ "title": "Email",
+ "login_info": "Užívateľské meno a heslo z tabu používateľov. IMAP port je 143 so STARTTLS, SMTP port je 587 so STARTTLS."
+ },
+ "password_manager": {
+ "subtitle": "Toto je základ vašej bezpečnosti. Bitwarden vám pomôže vytvárať, ukladať, kopírovať heslá medzi zariadeniami a vkladať ich do formulárov.",
+ "title": "Správca hesiel",
+ "login_info": "Musíte vytvoriť účet na webovej stránke."
+ },
+ "cloud": {
+ "subtitle": "Zabráňte cloudovým službám v prezeraní vašich údajov. Použite NextCloud – bezpečný domov pre všetky vaše dáta.",
+ "title": "Súborový cloud",
+ "login_info": "Prihlásenie správcu: admin, heslo je rovnaké ako pre hlavného používateľa. Vytvorte nových používateľov v správcovskom rozhraní NextCloud."
+ },
+ "social_network": {
+ "subtitle": "Je ťažké tomu uveriť, ale bolo možné vytvoriť si vlastnú sociálnu sieť s vlastnými pravidlami a publikom.",
+ "title": "Sociálna sieť",
+ "login_info": "Musíte vytvoriť účet na webovej stránke."
+ },
+ "users": {
+ "not_ready": "Pripojte server, doménu a DNS v sekcii Poskytovatelia a pridajte prvého používateľa",
+ "could_not_fetch_users": "Nepodarilo sa načítať používateľov",
+ "could_not_delete_user": "Nepodarilo sa vymazať účet",
+ "could_not_add_ssh_key": "Nepodarilo sa pridať kľúč SSH",
+ "username_rule": "Meno môže obsahovať len malé latinské písmená, čísla, podčiarkovníky, nemôže začínať číslicami",
+ "add_new_user": "Pridajte prvého používateľa",
+ "new_user": "Nový používateľ",
+ "delete_user": "Vymazať používateľa",
+ "nobody_here": "Tu sa zobrazia používatelia",
+ "login": "Užívateľské meno",
+ "new_user_info_note": "Nový používateľ bude mať automaticky prístup ku všetkým službám",
+ "delete_confirm_question": "Naozaj chcete odstrániť ten účet?",
+ "reset_password": "Resetovať heslo",
+ "account": "Účet",
+ "send_registration_data": "Zdieľať údaje účtu",
+ "could_not_fetch_description": "Skontrolujte internetové pripojenie a skúste to znova",
+ "refresh_users": "Aktualizovať zoznam používateľov",
+ "could_not_create_user": "Nepodarilo sa vytvoriť účet",
+ "email_login": "Emailová autorizácia",
+ "no_ssh_notice": "Pre tohto používateľa sú vytvorené iba e-mailové účty a účty SSH. Čoskoro bude k dispozícii jednotné prihlásenie pre všetky služby.",
+ "details_title": "Detaily používateľa"
+ },
+ "recovering": {
+ "recovery_main_header": "Pripojiť sa k existujúcemu serveru",
+ "method_select_other_device": "Mám prístup na inom zariadení",
+ "method_device_description": "Otvorte aplikáciu na inom zariadení a otvorte obrazovku správy zariadenia. Kliknutím na „Pridať zariadenie“ získate autorizačný token.",
+ "provider_connected": "Pripojiť sa k poskytovateľovi {}",
+ "choose_server": "Vyberte si svoj server",
+ "domain_not_available_on_token": "Vybraná doména nie je na tomto tokene dostupná.",
+ "modal_confirmation_ip_valid": "IP je rovnaká ako v DNS zázname",
+ "generic_error": "Operácia zlyhala, skúste to znova.",
+ "domain_recovery_description": "Zadajte doménu servera, pre ktorú chcete získať prístup:",
+ "domain_recover_placeholder": "Vaša doména",
+ "domain_recover_error": "Server s takouto doménou sa nenašiel",
+ "method_select_description": "Vyberte spôsob obnovenia:",
+ "method_select_recovery_key": "Mám kľúč na obnovenie",
+ "method_select_nothing": "Nič z toho nemám",
+ "method_device_button": "Dostal som token",
+ "method_device_input_description": "Zadajte svoj autorizačný token",
+ "method_device_input_placeholder": "Token",
+ "method_recovery_input_description": "Zadajte svoj token na obnovenie",
+ "fallback_select_description": "Čo z toho máte? Vyberte prvý, ktorý vyhovuje:",
+ "fallback_select_token_copy": "Kópia autorizačného tokenu z inej verzie aplikácie.",
+ "fallback_select_root_ssh": "Rootový prístup k serveru cez SSH.",
+ "fallback_select_provider_console": "Prístup ku konzole servera môjho poskytovateľa.",
+ "authorization_failed": "Pomocou tohto kľúča sa nepodarilo prihlásiť",
+ "fallback_select_provider_console_hint": "Napríklad Hetzner.",
+ "provider_connected_description": "Spojenie bolo nadviazané. Zadajte svoj token s prístupom k {}:",
+ "provider_connected_placeholder": "{} Token",
+ "confirm_server": "Potvrďte server",
+ "confirm_server_description": "Našiel sa server! Potvrďte, že je to on:",
+ "confirm_server_accept": "Áno, to je on",
+ "confirm_server_decline": "Vybrať iný server",
+ "choose_server_description": "Nepodarilo sa nám zistiť, ku ktorému serveru sa pokúšate pripojiť.",
+ "no_servers": "Vo vašom účte nie sú dostupné žiadne servery.",
+ "modal_confirmation_title": "Je to naozaj váš server?",
+ "modal_confirmation_description": "Ak sa pripojíte k nesprávnemu serveru, môžete stratiť všetky svoje údaje.",
+ "modal_confirmation_dns_valid": "Reverzný DNS je platný",
+ "modal_confirmation_dns_invalid": "Reverzné DNS ukazuje na inú doménu",
+ "modal_confirmation_ip_invalid": "IP nie je rovnaká ako v DNS zázname"
+ },
+ "devices": {
+ "add_new_device_screen": {
+ "get_new_key": "Získať nový kľúč",
+ "header": "Autorizácia nového zariadenia",
+ "description": "Zadajte kľúč na zariadení, ktoré chcete autorizovať:",
+ "please_wait": "Prosím počkajte",
+ "tip": "Platnosť kľúča je 10 minút.",
+ "expired": "Platnosť kľúča vypršala."
+ },
+ "main_screen": {
+ "description": "Tieto zariadenia majú plný prístup k serveru prostredníctvom aplikácie SelfPrivacy.",
+ "tip": "Stlačením na zariadení zrušíte prístup.",
+ "header": "Zariadenia",
+ "this_device": "Toto zariadenie",
+ "other_devices": "Iné zariadenia",
+ "authorize_new_device": "Autorizovať nové zariadenie",
+ "access_granted_on": "Prístup poskytnutý {}"
+ },
+ "revoke_device_alert": {
+ "header": "Odobrať prístup?",
+ "description": "Zariadenie {} už nebude mať prístup k serveru.",
+ "yes": "Odobrať",
+ "no": "Zrušiť"
+ }
+ },
+ "recovery_key": {
+ "key_main_description": "Vyžaduje sa pre autorizáciu SelfPrivacy, keď autorizované zariadenia nie sú dostupné.",
+ "key_valid_for": "Môžete použiť ešte {} krát",
+ "key_receiving_description": "Zapíšte si tento kľúč na bezpečnom mieste. Poskytuje plný prístup k vášmu serveru:",
+ "key_connection_error": "Nepodarilo sa pripojiť k serveru.",
+ "key_synchronizing": "Synchronizácia…",
+ "key_main_header": "Kľúč na obnovenie",
+ "key_amount_toggle": "Obmedziť používanie",
+ "key_amount_field_title": "Maximálny počet použití",
+ "key_duedate_toggle": "Obmedziť časom",
+ "key_duedate_field_title": "Dátum splatnosti",
+ "key_receive_button": "Získať kľúč",
+ "key_valid": "Váš kľúč je platný",
+ "key_invalid": "Váš kľúč už nie je platný",
+ "key_valid_until": "Platný do {}",
+ "key_creation_date": "Vytvorený {}",
+ "key_replace_button": "Vygenerovať nový kľúč",
+ "key_receiving_info": "Tento kľúč sa už nebude zobrazovať, ale môžete ho nahradiť novým.",
+ "key_receiving_done": "Hotovo!",
+ "generation_error": "Nepodarilo sa vygenerovať kľúč. {}"
+ },
+ "timer": {
+ "sec": "{} sek"
+ },
+ "video": {
+ "title": "Video konferencia",
+ "subtitle": "Jitsi meet je výborný analog Zoom a Google meet, ktorý vám okrem pohodlia zaručí aj bezpečné videokonferencie vo vysokej kvalite.",
+ "login_info": "Účet sa nevyžaduje."
+ },
+ "git": {
+ "title": "Git server",
+ "subtitle": "Súkromná alternatíva Github, ktorá patrí vám, nie spoločnosti Microsoft.",
+ "login_info": "Na stránke musí byť vytvorený účet. Prvý registrovaný užívateľ sa stáva administrátorom."
+ },
+ "vpn": {
+ "title": "Server VPN",
+ "subtitle": "Súkromný server VPN"
+ },
+ "support": {
+ "title": "Podpora SelfPrivacy"
+ },
+ "developer_settings": {
+ "subtitle": "Tieto nastavenia slúžia len na ladenie. Nemeňte ich, ak neviete, čo robíte.",
+ "reset_onboarding": "Obnovenie uvítacej vlajky pre návštevu",
+ "title": "Nastavenia vývojára",
+ "server_setup": "Nastavenie servera",
+ "use_staging_acme": "Používanie testovacieho servera ACME",
+ "use_staging_acme_description": "Ak chcete túto hodnotu zmeniť, prekompilujte aplikáciu.",
+ "routing": "Smerovanie aplikácie",
+ "reset_onboarding_description": "Resetovanie vypínača na opätovné zobrazenie obrazovky zapnutia",
+ "cubit_statuses": "Aktuálny stav načítavania qubitov"
+ }
+}
diff --git a/assets/translations/sl.json b/assets/translations/sl.json
new file mode 100644
index 00000000..f8250745
--- /dev/null
+++ b/assets/translations/sl.json
@@ -0,0 +1,255 @@
+{
+ "test": "sl-test",
+ "locale": "sl",
+ "basis": {
+ "providers_title": "Vaš podatkovni center",
+ "select": "Izberite",
+ "services": "Storitve",
+ "users": "Uporabniki",
+ "more": "Več",
+ "next": "Naslednji",
+ "got_it": "Imam ga",
+ "settings": "Nastavitve",
+ "password": "Geslo",
+ "create": "Dodajte novo",
+ "confirmation": "Potrditev",
+ "cancel": "Prekliči",
+ "providers": "Ponudniki",
+ "services_title": "Vaše osebne, zasebne in neodvisne storitve.",
+ "app_name": "SelfPrivacy",
+ "delete": "Izbriši",
+ "close": "Zapri",
+ "connect": "Povežite",
+ "domain": "Domena",
+ "saving": "Varčevanje…",
+ "username": "Uporabniško ime",
+ "loading": "Nalaganje…",
+ "later": "Preskočite in prilagodite pozneje",
+ "connect_to_existing": "Preskočite in prilagodite pozneje",
+ "reset": "Ponastavitev",
+ "details": "Podrobne informacije",
+ "no_data": "Ni podatkov",
+ "wait": "Prenesi",
+ "remove": "Izbriši",
+ "apply": "Uporabi",
+ "done": "Končano",
+ "continue": "Nadaljuj",
+ "alert": "Opozorilo"
+ },
+ "more_page": {
+ "about_application": "O prilogi",
+ "about_project": "O storitvi SelfPrivacy",
+ "onboarding": "Pozdravi",
+ "console": "Konzola",
+ "application_settings": "Nastavitve aplikacije",
+ "create_ssh_key": "Superuporabniški ključi SSH",
+ "configuration_wizard": "Pomočnik za nastavitev"
+ },
+ "console_page": {
+ "title": "Konzole",
+ "waiting": "Čakanje na inicializacijo…",
+ "copy": "Kopiraj"
+ },
+ "about_us_page": {
+ "title": "O storitvi SelfPrivacy"
+ },
+ "about_application_page": {
+ "title": "O dodatku",
+ "api_version_text": "Različica API strežnika {}",
+ "privacy_policy": "Pravilnik o zasebnosti",
+ "application_version_text": "Različica aplikacije {}"
+ },
+ "application_settings": {
+ "dark_theme_title": "Temna tema",
+ "title": "Nastavitve aplikacije",
+ "system_dark_theme_title": "Privzeta tema sistema",
+ "system_dark_theme_description": "Uporaba svetle ali temne teme glede na sistemske nastavitve",
+ "dark_theme_description": "Spreminjanje barvne teme",
+ "dangerous_settings": "Nevarne nastavitve",
+ "reset_config_title": "Ponastavitev konfiguracije aplikacije",
+ "delete_server_title": "Brisanje strežnika",
+ "delete_server_description": "To dejanje povzroči izbris strežnika. Nato bo nedosegljiv."
+ },
+ "onboarding": {
+ "page1_title": "Digitalna neodvisnost je na voljo vsem",
+ "page1_text": "Pošta, VPN, messenger, družabna omrežja in še veliko več na lastnem zasebnem strežniku pod vašim popolnim nadzorom.",
+ "page2_title": "SelfPrivacy ni oblak, temveč vaš osebni podatkovni center",
+ "page2_text": "Storitev SelfPrivacy sodeluje le s ponudnikom storitev po vaši izbiri. Če nimate računov, vam jih lahko pomagamo ustvariti.",
+ "page2_server_provider_title": "Ponudnik strežnika",
+ "page2_server_provider_text": "Ponudnik strežnika bo vaš strežnik vzdrževal v svojem podatkovnem centru. SelfPrivacy se bo samodejno povezal z njim in nastavil vaš strežnik.",
+ "page2_dns_provider_title": "Ponudnik storitev DNS",
+ "page2_dns_provider_text": "To be on the Internet, you need a domain. To have a domain point to your server, you need a reliable DNS server. We will offer you to choose one of the supported DNS servers and automatically configure all entries. Want to configure them manually? You can do that too.",
+ "page2_backup_provider_title": "Ponudnik varnostnih kopij",
+ "page2_backup_provider_text": "Kaj če se kaj zgodi z vašim strežnikom? Predstavljajte si hekerski napad, nenamerno brisanje podatkov ali zavrnitev storitve? Vaši podatki bodo na varnem pri ponudniku varnostnih kopij. Te bodo varno šifrirane in kadar koli dostopne za obnovitev strežnika."
+ },
+ "resource_chart": {
+ "month": "Mesec",
+ "day": "Dan",
+ "hour": "Ura",
+ "cpu_title": "Poraba CPU",
+ "out": "Poslano",
+ "network_title": "Uporaba omrežja",
+ "in": "Pridobljeno iz"
+ },
+ "server": {
+ "card_title": "Server",
+ "description": "Vse vaše storitve so na voljo tukaj",
+ "general_information": "Splošne informacije",
+ "resource_usage": "Uporaba virov",
+ "allow_autoupgrade": "Dovolite samodejno nadgradnjo",
+ "allow_autoupgrade_hint": "Omogočite samodejne nadgradnje paketov na strežniku",
+ "reboot_after_upgrade": "Ponovni zagon po nadgradnji",
+ "core_count": {
+ "two": "{} jedra",
+ "few": "{} jedra",
+ "one": "{} jedro",
+ "many": "{} jedra",
+ "other": "{} jeder"
+ },
+ "reboot_after_upgrade_hint": "Ponovni zagon brez poziva po uporabi sprememb v strežniku",
+ "server_timezone": "Časovni pas strežnika",
+ "select_timezone": "Izberite časovni pas",
+ "timezone_search_bar": "Ime časovnega pasu ali vrednost časovnega zamika",
+ "server_id": "ID strežnika",
+ "status": "Status",
+ "cpu": "CPU",
+ "ram": "Glavni pomnilnik",
+ "disk": "Lokalni disk",
+ "monthly_cost": "Mesečni stroški",
+ "location": "Lokacija"
+ },
+ "ssh": {
+ "root_subtitle": "Lastniki tukaj navedenih ključev imajo popoln dostop do podatkov in nastavitev strežnika. Dodajte samo svoje ključe.",
+ "title": "Ključi SSH",
+ "create": "Dodajanje ključa SSH",
+ "delete": "Odstranitev ključa SSH",
+ "delete_confirm_question": "Ali ste prepričani, da želite izbrisati naslednjo tipko?",
+ "subtitle_with_keys": "Ključi: {}",
+ "subtitle_without_keys": "Brez ključev",
+ "no_key_name": "Ključ brez imena",
+ "root_title": "To so ključi superuporabnika",
+ "input_label": "Javni ključ ED25519 ali RSA"
+ },
+ "record": {
+ "cloud": "Oblak datotek",
+ "root": "Korenska domena",
+ "api": "SelfPrivacy API",
+ "git": "Git Strežnik",
+ "meet": "Videokonferenca",
+ "social": "Družabno omrežje",
+ "password": "Upravitelj gesel",
+ "vpn": "VPN",
+ "mx": "Zapis MX",
+ "dmarc": "DMARC zapis",
+ "spf": "SPF zapis",
+ "dkim": "DKIM ključ"
+ },
+ "domain": {
+ "screen_title": "Domena in DNS",
+ "card_title": "Domena",
+ "ok": "Zapisi so v redu",
+ "error": "Ugotovljene težave",
+ "error_subtitle": "Kliknite tukaj za popravek",
+ "refreshing": "Posodobitev podatkov…",
+ "uninitialized": "Podatki še niso na voljo",
+ "services_title": "Storitve",
+ "services_subtitle": "Za vsako storitev so potrebni zapisi tipa \"A\".",
+ "email_title": "E-pošta",
+ "email_subtitle": "Zapisi, potrebni za varno izmenjavo e-pošte.",
+ "update_list": "Seznam posodobitev"
+ },
+ "backup": {
+ "restore": "Obnovitev iz varnostne kopije",
+ "no_backups": "Varnostnih kopij še ni",
+ "card_title": "Varnostna kopija",
+ "description": "V primeru incidenta: napada hekerjev, izbrisa strežnika itd.",
+ "reupload_key": "Prisilna posodobitev ključa",
+ "reuploaded_key": "Ključ v strežniku je bil posodobljen",
+ "initialize": "Inicializacija",
+ "waiting_for_rebuild": "Prvo varnostno kopijo boste lahko ustvarili v nekaj minutah.",
+ "create_new": "Ustvarite novo varnostno kopijo",
+ "creating": "Ustvarjanje nove varnostne kopije: {}%",
+ "restoring": "Obnovitev iz varnostne kopije",
+ "error_pending": "Strežnik je vrnil napako, preverite spodaj",
+ "restore_alert": "Obnavljate iz varnostne kopije, ustvarjene dne {}. Vsi trenutni podatki bodo izgubljeni. Ste prepričani?",
+ "refresh": "Osvežitev stanja",
+ "refetch_backups": "Ponovno pridobivanje seznama varnostnih kopij",
+ "refetching_list": "V nekaj minutah bo seznam posodobljen"
+ },
+ "mail": {
+ "login_info": "Uporabite uporabniško ime in geslo iz zavihka uporabniki. Vrata IMAP: 143, STARTTLS. Vrata SMTP: 587, STARTTLS.",
+ "title": "E-naslov",
+ "subtitle": "E-pošta za družbo in družino."
+ },
+ "password_manager": {
+ "title": "Upravitelj gesel",
+ "subtitle": "Osnova vaše varnosti. Bitwarden vam bo pomagal ustvarjati, shranjevati in prenašati gesla med napravami ter jih na zahtevo vnašati z uporabo samodejnega dopolnjevanja.",
+ "login_info": "Na spletnem mestu boste morali ustvariti račun."
+ },
+ "video": {
+ "title": "Videokonferenca",
+ "subtitle": "Zoom in Google Meet sta dobra, vendar je Jitsi Meet vredna alternativa, ki vam daje tudi zagotovilo, da vam nihče ne prisluškuje.",
+ "login_info": "Račun ni potreben."
+ },
+ "storage": {
+ "extending_volume_price_info": "Cena vključuje DDV in je izračunana na podlagi podatkov o cenah, ki jih je posredoval Hetzner. Strežnik se med postopkom ponovno zažene.",
+ "data_migration_notice": "Med migracijo bodo vse storitve izklopljene.",
+ "card_title": "Shranjevanje podatkov v strežniku",
+ "status_ok": "Uporaba diska je v redu",
+ "status_error": "Malo prostora na disku",
+ "disk_usage": "{} uporablja se",
+ "disk_total": "{} skupaj - {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "Bajti",
+ "extend_volume_button": "Podaljšanje glasnosti",
+ "extending_volume_title": "Razširitev prostora za shranjevanje",
+ "extending_volume_description": "Če spremenite velikost shrambe, lahko v strežniku shranite več podatkov, ne da bi pri tem povečali sam strežnik. Obseg je mogoče samo povečati: ni ga mogoče zmanjšati.",
+ "extending_volume_error": "Ni uspelo zagnati razširitve shrambe.",
+ "size": "Velikost",
+ "data_migration_title": "Migracija podatkov",
+ "start_migration_button": "Začetek migracije",
+ "migration_process": "Selitev…",
+ "migration_done": "Zaključek"
+ },
+ "service_page": {
+ "uses": "Uporablja {usage} na {volume}",
+ "status": {
+ "reloading": "Ponovni zagon spletne strani",
+ "active": "Vzpostavitev in delovanje",
+ "inactive": "Ustavljeno",
+ "failed": "Ni se uspelo zagnati",
+ "off": "Invalidi",
+ "activating": "Aktivacija spletne strani",
+ "deactivating": "Deaktiviranje spletne strani"
+ },
+ "open_in_browser": "Odprite v brskalniku",
+ "restart": "Ponovni zagon storitve",
+ "disable": "Onemogočite storitev",
+ "enable": "Omogočite storitev",
+ "move": "Premik na drug zvezek"
+ },
+ "social_network": {
+ "subtitle": "Težko je verjeti, vendar je mogoče ustvariti lastno družbeno omrežje z lastnimi pravili in občinstvom.",
+ "title": "Družbeno omrežje",
+ "login_info": "Na spletišču morate ustvariti račun."
+ },
+ "not_ready_card": {
+ "in_menu": "Strežnik še ni bil nastavljen, uporabite čarovnika za povezavo."
+ },
+ "cloud": {
+ "title": "Shranjevanje v oblaku",
+ "subtitle": "Storitvam v oblaku ne dovolite vpogleda v svoje podatke. Uporabite NextCloud - varen dom za vse svoje podatke.",
+ "login_info": "Prijava skrbnika: admin, geslo je enako geslu glavnega uporabnika. Ustvarite nove uporabnike v skrbniškem vmesniku NextCloud."
+ },
+ "git": {
+ "title": "Git Strežnik",
+ "subtitle": "Zasebna alternativa Githubu, ki pripada vam, ne pa Microsoftu.",
+ "login_info": "Na spletnem mestu morate ustvariti račun. Prvi uporabnik bo postal administrator."
+ },
+ "vpn": {
+ "title": "VPN Strežnik",
+ "subtitle": "Zasebni strežnik VPN"
+ }
+}
\ No newline at end of file
diff --git a/assets/translations/th.json b/assets/translations/th.json
new file mode 100644
index 00000000..de7c5082
--- /dev/null
+++ b/assets/translations/th.json
@@ -0,0 +1,295 @@
+{
+ "test": "th-test",
+ "locale": "th",
+ "basis": {
+ "later": "ข้ามไปที่การติดตั้งทีหลัง",
+ "no_data": "ไม่พบข้อมูล",
+ "providers_title": "ศูนย์กลางข้อมูล",
+ "select": "เลือก",
+ "services": "บริการ",
+ "users": "ผู้ใช้บริการ",
+ "more": "มาก",
+ "next": "ถัดไป",
+ "got_it": "ได้มา",
+ "settings": "ตั้งค่า",
+ "password": "รหัสผ่าน",
+ "create": "เพิ่มใหม่",
+ "confirmation": "การยืนยัน",
+ "cancel": "ยกเลิก",
+ "delete": "ลบ",
+ "close": "ปิด",
+ "domain": "โดเมน",
+ "saving": "กำลังบันทึก…",
+ "username": "ชื่อผู้ใช้",
+ "loading": "กำลังโหลด…",
+ "connect_to_existing": "เชื่อมต่อไปยังเซริฟเวอร์ที่มีอยู่แล้ว",
+ "reset": "รีเซ็ต",
+ "details": "รายละเอียด",
+ "wait": "รอ",
+ "remove": "ลบ",
+ "apply": "นำมาใช้",
+ "done": "เสร็จสิ้น",
+ "continue": "ต่อไป",
+ "alert": "แจ้งเตือน",
+ "providers": "ผู้ให้บริการ",
+ "services_title": "ความเป็นส่วนตัวของคุณและอิสระ",
+ "connect": "เชื่อมต่อ"
+ },
+ "more_page": {
+ "configuration_wizard": "การติดตั้งอย่างง่าย",
+ "create_ssh_key": "กุญแจ SSH ของผู้ใช้ระดับสูงสุด",
+ "about_project": "เกี่ยวกับพวกเรา",
+ "about_application": "เกี่ยวกับ",
+ "onboarding": "ออนบอร์ด",
+ "console": "คอนโซล",
+ "application_settings": "การตั้งค่าของแอพลิเคชั่น"
+ },
+ "about_us_page": {
+ "title": "เกี่ยวกับพวกเรา"
+ },
+ "about_application_page": {
+ "api_version_text": "API เซิฟเวอร์เวอร์ชั้น {}",
+ "title": "เกี่ยวกับ",
+ "application_version_text": "แอปพลิเคชั่น เวอร์ชั่น {}",
+ "privacy_policy": "นโยบายความเป็นส่วนตัว"
+ },
+ "application_settings": {
+ "dark_theme_description": "สลับธีมแอปพลิเคชั่นของคุณ",
+ "delete_server_description": "การกระทำนี้จะลบเซิฟเวอร์ของคุณทิ้งและคุณจะไม่สามารถเข้าถึงมันได้อีก",
+ "title": "การตั้งค่าแอปพลิเคชัน",
+ "dark_theme_title": "ธีมมืด",
+ "reset_config_title": "รีเซ็ตค่าดั้งเดิมการตั้งค่าของแอปพลิเคชั่น",
+ "reset_config_description": "รีเซ็ต API key และผู้ใช้งาน root",
+ "delete_server_title": "ลบเซิฟเวอร์"
+ },
+ "ssh": {
+ "create": "สร้างกุญแจ SSH",
+ "delete_confirm_question": "คุณแน่ใจนะว่าจะลบกุญแจ SSH นี้?",
+ "root_subtitle": "เจ้าของกุญแจเหล่านี้จะสามารถเข้าถึงเซิฟเวอร์และทำอะไรกับเซิฟเวอร์ก็ได้. โปรดเพิ่มกุญแจนี้ไปที่เซิฟเวอร์ของคุณเท่านั้น",
+ "title": "กุญแจ SSH",
+ "delete": "ลบกุญแจ SSH",
+ "subtitle_with_keys": "{} กุญแจ",
+ "subtitle_without_keys": "ไม่มีกุญแจ",
+ "no_key_name": "กุญแจไม่มีชื่อ",
+ "root_title": "นี่คือกุญแจของผู้ใช้สูงสุด",
+ "input_label": "กุญแจสาธารณะของ ED25519 หรือ RSA"
+ },
+ "console_page": {
+ "title": "คอนโซล",
+ "waiting": "กำลังรอการเริ่มตั้น…"
+ },
+ "domain": {
+ "services_subtitle": "ระเบียน A จำเป็นสำหรับแต่ละเซิร์ฟเวอร์",
+ "email_subtitle": "ระเบียนนั้นจำเป็นสำหรับการเปลี่ยนอีเมลอย่างปลอดภัย",
+ "card_title": "โดเมน",
+ "screen_title": "โดเมนและDNS",
+ "ok": "ระเบียนถูกต้อง",
+ "error": "พบเจอปัญหา",
+ "refreshing": "สถานะการรีเฟรช…",
+ "uninitialized": "ยังไม่ได้รับข้อมูล",
+ "services_title": "บริการ",
+ "email_title": "อีเมล",
+ "update_list": "รายการอัปเดต",
+ "error_subtitle": "กดตรงนี้เพื่อแก้ไขปัญหา"
+ },
+ "backup": {
+ "reuploaded_key": "กุญแจถูกอัปโหลดอีกครั้งเรียบร้อย",
+ "waiting_for_rebuild": "คุณจะสามารถสร้างข้อมูลสำรองของคุณได้ในไม่กี่นาที",
+ "restoring": "การกู้คืนจากการสำรองข้อมูง",
+ "restore_alert": "คุณกำลังที่จะคืนค่าจากข้อมูลสำรองที่สร้างใน {}. ข้อมูลทั้งหมดตอนนี้จะหายไป คุณแน่ใจไหม?",
+ "refetching_list": "ในไม่กี่นาทีรายการจะอัปเดต",
+ "card_title": "สำรอง",
+ "description": "นี่จะช่วยคุณในวันที่เซิร์ฟเวอร์ของคุณถูกโจมตีด้วยวิธีต่างๆ",
+ "reupload_key": "บังคับการอัปโหลดอีกครั้งของกุญแจ",
+ "initialize": "เริ่มตั้น",
+ "restore": "คืนค่าจากการสำรอง",
+ "no_backups": "ยังไม่มีการสำรองข้อมูลในตอนนี้",
+ "create_new": "สร้างข้อมูลสำรองใหม่",
+ "creating": "กำลังสร้างข้อมูลสำรอง: {}%",
+ "error_pending": "เซิร์ฟเวอร์ส่งคืนข้อผิดพลาดตรวจสอบด้านล่าง",
+ "refresh": "สถานะการรีเฟรช",
+ "refetch_backups": "ดึงข้อมูลรายการสํารองข้อมูลอีกครั้ง"
+ },
+ "onboarding": {
+ "page2_backup_provider_text": "เกิดอะไรขึ้นถ้ามีอะไรเกิดขึ้นกับเซิร์ฟเวอร์ของคุณ? ลองนึกภาพการโจมตีของแฮ็กเกอร์การลบข้อมูลโดยไม่ตั้งใจหรือการปฏิเสธการให้บริการ? แต่ไม่ต้องห่วง ข้อมูลของคุณจะถูกเก็บไว้อย่างปลอดภัยในผู้ให้บริการสํารองข้อมูลของคุณ พวกเขาจะถูกเข้ารหัสอย่างปลอดภัยและสามารถเข้าถึงได้ตลอดเวลาเพื่อกู้คืนเซิร์ฟเวอร์ของคุณด้วย",
+ "page1_title": "ความเป็นอิสระทางดิจิทัลมีให้สําหรับเราทุกคน",
+ "page1_text": "อีเมล,วีพีเอ็น(vpn),การส่งข้อความ,โซเชียลเน็ตเวิร์กและอื่นๆอีกมากมาย ซึ่งอยู่ภายใต้การควบคุมของคุณ",
+ "page2_title": "SelfPrivacy นั้นไม่ใช่คลาวด์, แต่เป็นศูนย์ข้อมูลส่วนบุคคลของคุณเท่านั้น",
+ "page2_server_provider_title": "ผู้ให้บริการเซิร์ฟเวอร์",
+ "page2_dns_provider_title": "ผู้ให้บริการ DNS",
+ "page2_backup_provider_title": "ผู้ให้บริการการกู้คืนระบบ",
+ "page2_text": "SelfPrivacy นั้นจะทำงานกับผู้ให้บริการที่คุณเลือกเท่านั้นและหากคุณไม่มีผู้ใช้งานของผู้ให้บริการนั้นๆ, เราจะช่วยคุณสร้างมันขึ้นมาเอง",
+ "page2_server_provider_text": "ผู้ให้บริการจะดูแลเซิร์ฟเวอร์ของคุณและ SelfPrivacy จะช่วยเชื่อมต่อและติดตั้งสิ่งจำเป็นกับผู้ให้บริการของคุณแบบอัตโนมัติ",
+ "page2_dns_provider_text": "คุณต้องมีโดเมนเพื่อให้มีสถานที่ของคุณในอินเทอร์เน็ต และคุณต้องมีผู้ให้บริการ DNS ที่เชื่อถือได้เพื่อให้โดเมนชี้ไปที่เซิร์ฟเวอร์ของคุณ เราขอแนะนําให้คุณเลือกผู้ให้บริการ DNS ที่รองรับเพื่อตั้งค่าเครือข่ายโดยอัตโนมัติ"
+ },
+ "resource_chart": {
+ "month": "เดือน",
+ "day": "วัน",
+ "hour": "ชั่วโมง",
+ "cpu_title": "ค่าการใช้งานของ CPU",
+ "network_title": "ค่าการใช้งานของระบบเครือข่าย",
+ "in": "ใน",
+ "out": "ออก"
+ },
+ "server": {
+ "card_title": "เซิร์ฟเวอร์",
+ "description": "บริการของคุณทั้งหมดจะแสดงอยู่ตรงนี้",
+ "general_information": "ข้อมูลทั่วไป",
+ "resource_usage": "การใช้ว่าทรัพยากร",
+ "reboot_after_upgrade": "รีบูตหลังจากอัพเกรด",
+ "allow_autoupgrade": "ให้อนุญาตการอัพเกรดแบบอัตโนมัติ",
+ "allow_autoupgrade_hint": "อนุญาตให้มีการอัพเกรดแพคเกจต่างๆบนเซิร์ฟเวอร์",
+ "reboot_after_upgrade_hint": "รีบูตโดยไม่ต้องขออนุญาตหลังจากเสร็จสิ้นการเปลี่ยนแปลงบนเซิร์ฟเวอร์",
+ "server_timezone": "เขตเวลาของเซิร์ฟเวอร์",
+ "select_timezone": "เลือกเขตเวลา",
+ "timezone_search_bar": "ชื่อเขตเวลาหรือค่ากะเวลา",
+ "server_id": "ไอดีของเซิร์ฟเวอร์",
+ "status": "สถานะ",
+ "cpu": "CPU",
+ "ram": "หน่วยความจำ",
+ "monthly_cost": "รายจ่ายต่อเดือน",
+ "location": "สถานที่",
+ "core_count": {
+ "one": "{} core",
+ "two": "{} จำนวนคอร์",
+ "many": "{} จำนวนคอร์",
+ "other": "{} จำนวนคอร์",
+ "few": "{} จำนวนคอร์"
+ },
+ "disk": "ดิสก์ภายในเครื่อง"
+ },
+ "record": {
+ "api": "API ของ SelfPrivacy",
+ "cloud": "ไฟล์คลาวด์",
+ "git": "Git server",
+ "meet": "การประชุมแบบใช้วิดีโอ",
+ "password": "จัดการกับรหัสผ่าน",
+ "vpn": "VPN",
+ "mx": "ระเบียน MX",
+ "dmarc": "ระเบียน DMARC",
+ "spf": "ระเบียน SPF",
+ "root": "โดเมนหลัก",
+ "social": "เครือข่ายสังคมออนไลน์",
+ "dkim": "กุญแจ DKIM"
+ },
+ "storage": {
+ "card_title": "พื้นที่ของเซิฟร์เวอร์",
+ "status_ok": "การใช้งานดิสก์ปกติ",
+ "status_error": "พื้นที่ว่างดิสก์ต่ำ",
+ "disk_usage": "{} ใช้แล้ว",
+ "extending_volume_title": "กำลังขยายความจุ",
+ "disk_total": "{} ทั้งหมด {}",
+ "gb": "{} GB",
+ "mb": "{} MB",
+ "kb": "{} KB",
+ "bytes": "ไบต์",
+ "extend_volume_button": "ขยายความจุ",
+ "extending_volume_description": "การเปลี่ยนความจุนั้นจะทำให้คุณสามารถเก็บข้อมูลบนเซิร์ฟเวอร์ของคุณได้มากขึ้นโดยที่ไม่ต้องเพิ่มความเร็วเซิร์ฟเวอร์แต่ถว่าความจุนั้นสามารถเพิ่มได้อย่างเดียว ไม่สามารถลดขนาดได้",
+ "extending_volume_price_info": "ราคารวมภาษีมูลค่าเพิ่มและประมาณการจากข้อมูลราคาที่จัดทำโดย Hetzner เซิร์ฟเวอร์จะรีบูตหลังจากปรับความจุ",
+ "extending_volume_error": "ไม่สามารถเริ่มต้นการขยายความจุได้",
+ "size": "ขนาด",
+ "data_migration_title": "การโยกย้ายข้อมูล",
+ "data_migration_notice": "ระหว่างการย้ายข้อมูล ทุกเซิร์ฟเวอร์จะถูกปิด",
+ "start_migration_button": "เริ่มการย้ายข้อมูล",
+ "migration_process": "กำลังย้ายข้อมูล…",
+ "migration_done": "เสร็จสิ้น"
+ },
+ "not_ready_card": {
+ "in_menu": "เซิร์ฟเวอร์ยังไม่ถูกติดตั้งในตอนนี้. โปรดใช้การติดตั้งอย่างง่ายในการติดตั้ง"
+ },
+ "service_page": {
+ "open_in_browser": "เปิดในบราวเซอร์",
+ "restart": "รีสตาร์ทบริการ",
+ "disable": "ปิดบริการ",
+ "enable": "เปิดใช้บริการ",
+ "move": "ย้ายไปยังไดรฟ์ข้อมูลอื่น",
+ "uses": "ใช้ {usage} บน {volume}",
+ "status": {
+ "active": "เสร็จสิ้นและกำลังทำงาน",
+ "inactive": "หยุดแล้ว",
+ "failed": "การเริ่มต้นผิดพลาด",
+ "off": "ปิดการใช้แล้ว",
+ "activating": "กำลังเปิดใช้งาน",
+ "deactivating": "กำลังปิดใช้งาน",
+ "reloading": "กำลังรีสตาร์ท"
+ }
+ },
+ "users": {
+ "login": "เข้าสู่ระบบ",
+ "add_new_user": "เพิ่มผู้ใช้แรก",
+ "not_ready": "โปรดเชื่อมต่อเซิร์ฟเวอร์ โดเมน และ DNS ในแท็บผู้ให้บริการ เพื่อให้สามารถเพิ่มผู้ใช้รายแรกได้",
+ "delete_confirm_question": "คุณแน่ใจใช่ไหม?",
+ "could_not_fetch_users": "ไม่สามารถดึงรายชื่อผู้ใช้",
+ "refresh_users": "รีเฟรชรายชื่อผู้ใช้",
+ "username_rule": "ชื่อผู้ใช้ต้องประกอบด้วยตัวอักษรละตินตัวพิมพ์เล็กตัวเลขและขีดล่างเท่านั้นไม่ควรขึ้นต้นด้วยตัวเลข",
+ "no_ssh_notice": "เฉพาะอีเมลและบัญชี SSH เท่านั้นที่ถูกสร้างขึ้นสําหรับผู้ใช้รายนี้ การลงชื่อเข้าระบบครั้งเดียวสําหรับบริการทั้งหมดกําลังจะมาในเร็วๆ นี้",
+ "new_user": "ผู้ใช้ใหม่",
+ "delete_user": "ลบผู้ใช้",
+ "nobody_here": "ไม่มีใครอยู่ในนี้",
+ "new_user_info_note": "ผู้ใช้ใหม่จะได้รับสิทธิ์เข้าถึงบริการทั้งหมดโดยอัตโนมัติ",
+ "reset_password": "รีเซ็ตรหัสผ่าน",
+ "account": "บัญชี",
+ "send_registration_data": "แบ่งปันข้อมูลรับรองการเข้าสู่ระบบ",
+ "could_not_fetch_description": "โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณแล้วลองอีกครั้ง",
+ "could_not_create_user": "สร้างผู้ใช้ไม่ได้",
+ "could_not_delete_user": "ลบผู้ใช้ไม่ได้",
+ "could_not_add_ssh_key": "เพิ่มกุญแจ SSH ไม่ได้",
+ "email_login": "เข้าสู่ระบบอีเมล"
+ },
+ "social_network": {
+ "subtitle": "มันยากที่จะเชื่อ แต่มันก็เป็นไปได้ที่จะสร้างโซเชียลเน็ตเวิร์กของคุณเอง โดยมีกฎและกลุ่มเป้าหมายของคุณเอง",
+ "title": "เครือข่ายสังคม",
+ "login_info": "คุณจะต้องสร้างบัญชีบนเว็บไซต์"
+ },
+ "git": {
+ "subtitle": "ทางเลือกส่วนตัวสำหรับ Github ที่เป็นของคุณ แต่ไม่ใช่ของ Microsoft",
+ "title": "Git Server",
+ "login_info": "คุณจะต้องสร้างบัญชีบนเว็บไซต์ ผู้ใช้คนแรกจะกลายเป็นผู้ดูแลระบบ"
+ },
+ "initializing": {
+ "select_provider_notice": "โดย 'ค่อนข้างเล็ก' เราหมายถึงเครื่องที่มีซีพียู 2 คอร์และแรม 2 กิกะไบต์",
+ "select_provider_countries_text_do": "สหรัฐอเมริกา, เนเธอร์แลนด์, สิงคโปร์, สหราชอาณาจักร, เยอรมนี, แคนาดา, อินเดีย, ออสเตรเลีย",
+ "select_provider_price_text_do": "$ 17 ต่อเดือนสําหรับเซิร์ฟเวอร์ที่ค่อนข้างเล็กและพื้นที่เก็บข้อมูล 50GB",
+ "select_provider_email_notice": "การโฮสต์อีเมลจะไม่พร้อมใช้งานสําหรับลูกค้าใหม่ อย่างไรก็ตามมันจะถูกปลดล็อคทันทีที่คุณชําระเงินครั้งแรกเสร็จสิ้น",
+ "could_not_connect": "ไม่สามารถเชื่อมต่อกับผู้ให้บริการ",
+ "choose_location_type": "คุณต้องการสั่งซื้อเซิร์ฟเวอร์ของคุณที่ไหน?",
+ "connect_to_server": "เริ่มจากเซิร์ฟเวอร์กันก่อน",
+ "select_provider": "เลือกผู้ให้บริการรายใดก็ได้จากรายการต่อไปนี้พวกเขาทั้งหมดสนับสนุน SelfPrivacy",
+ "select_provider_countries_title": "ประเทศที่ใช้ได้",
+ "select_provider_countries_text_hetzner": "เยอรมนี, ฟินแลนด์, สหรัฐอเมริกา",
+ "select_provider_price_title": "ราคาเฉลี่ย",
+ "select_provider_price_text_hetzner": "€ 8 ต่อเดือนสําหรับเซิร์ฟเวอร์ที่ค่อนข้างเล็กและพื้นที่เก็บข้อมูล 50GB",
+ "select_provider_payment_title": "ช่องทางการจ่ายเงิน",
+ "select_provider_payment_text_hetzner": "บัตรเครดิต, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_do": "บัตรเครดิต, Google Pay PayPal",
+ "select_provider_site_button": "เยี่ยมชมเว็บไซต์",
+ "connect_to_server_provider": "เข้าสู่ระบบใน ",
+ "connect_to_server_provider_text": "ด้วยโทเค็น API SelfPrivacy จะสามารถเช่าเครื่องและตั้งค่าเซิร์ฟเวอร์ของคุณได้",
+ "how": "วิธีรับโทเค็น API",
+ "provider_bad_key_error": "คีย์ API ของผู้ให้บริการไม่ถูกต้อง"
+ },
+ "mail": {
+ "title": "อีเมล",
+ "subtitle": "อีเมลสำหรับบริษัทและครอบครัว",
+ "login_info": "ใช้ชื่อผู้ใช้และรหัสผ่านจากแท็บผู้ใช้ พอร์ต IMAP คือ 143 พร้อม STARTTLS, พอร์ต SMTP คือ 587 พร้อม STARTTLS."
+ },
+ "password_manager": {
+ "title": "การจัดการรหัสผ่าน",
+ "subtitle": "ฐานความปลอดภัยของคุณ Bitwarden จะช่วยคุณสร้าง จัดเก็บ และย้ายรหัสผ่านระหว่างอุปกรณ์ ตลอดจนป้อนรหัสผ่าน เมื่อมีการร้องขอโดยใช้การเติมข้อความอัตโนมัติ",
+ "login_info": "คุณจะต้องสร้างบัญชีบนเว็บไซต์"
+ },
+ "video": {
+ "title": "การประชุมแบบวิดีโอ",
+ "subtitle": "Zoom และ Google Meet นั้นดี แต่ Jitsi Meet เป็นทางเลือกที่คุ้มค่าซึ่งยังช่วยให้คุณมั่นใจได้ว่าไม่มีใครฟังคุณ",
+ "login_info": "ไม่จะเป็นต้องใช้บัญชี"
+ },
+ "cloud": {
+ "title": "การจัดเก็บบนคลาวด์",
+ "subtitle": "ไม่อนุญาตให้บริการคลาวด์อ่านข้อมูลของคุณโดยใช้ NextCloud",
+ "login_info": "การเข้าสู่ระบบคือผู้ดูแลระบบ รหัสผ่านเหมือนกับผู้ใช้หลักของคุณ สร้างบัญชีใหม่ในอินเทอร์เฟซ Nextcloud"
+ },
+ "vpn": {
+ "title": "เซิฟเวอร์ VPN",
+ "subtitle": "เซิฟเวอร์ VPN ส่วนตัว"
+ }
+}
diff --git a/assets/translations/uk.json b/assets/translations/uk.json
new file mode 100644
index 00000000..4ddfe3ff
--- /dev/null
+++ b/assets/translations/uk.json
@@ -0,0 +1,498 @@
+{
+ "test": "ua-test",
+ "basis": {
+ "services_title": "Ваші особисті, приватні та незалежні послуги.",
+ "providers_title": "Ваш дата центр",
+ "select": "Обрати",
+ "services": "Сервіси",
+ "users": "Користувачі",
+ "providers": "Провайдери",
+ "domain": "Домен",
+ "saving": "Збереження…",
+ "username": "І'мя користовача",
+ "loading": "Завантаження…",
+ "later": "Перейти до налаштувати пізніше",
+ "connect_to_existing": "Підключитись до існуючого серверу",
+ "reset": "Скинути",
+ "details": "Подробиці",
+ "no_data": "Немає данних",
+ "wait": "Зачекайте",
+ "remove": "Видалити",
+ "apply": "Застосувати",
+ "done": "Готово",
+ "continue": "Продовжити",
+ "alert": "Оповіщення",
+ "more": "Більше",
+ "next": "Наступний",
+ "got_it": "Зрозумів",
+ "settings": "Налаштування",
+ "password": "Пароль",
+ "create": "Додати новий",
+ "confirmation": "Підтвердження",
+ "cancel": "Відмінити",
+ "delete": "Видалити",
+ "close": "Закрити",
+ "connect": "Підключіться",
+ "app_name": "SelfPrivacy",
+ "copied_to_clipboard": "Скопійовано в буфер обміну!"
+ },
+ "locale": "ua",
+ "application_settings": {
+ "title": "Налаштування додатка",
+ "reset_config_title": "Скинути налаштування",
+ "dark_theme_title": "Темна тема",
+ "dark_theme_description": "Змінити тему додатка",
+ "reset_config_description": "Скинути API ключі та root користувача.",
+ "delete_server_title": "Видалити сервер",
+ "delete_server_description": "Це видалить ваш сервер. Він більше не буде доступний.",
+ "system_dark_theme_title": "Системна тема за замовчуванням",
+ "system_dark_theme_description": "Використовуйте світлу або темну теми залежно від системних налаштувань",
+ "dangerous_settings": "Небезпечні налаштування"
+ },
+ "ssh": {
+ "delete_confirm_question": "Ви впевнені, що хочете видалити SSH-ключ?",
+ "root_subtitle": "Власники цих ключів отримують повний доступ до сервера та даних. Додавайте лише свої ключі.",
+ "title": "SSH-ключі",
+ "create": "Створити SSH-ключ",
+ "delete": "Видалити SSH-ключ",
+ "subtitle_with_keys": "{} ключів",
+ "subtitle_without_keys": "Ключів немає",
+ "no_key_name": "Безіменний ключ",
+ "root_title": "Це ключі суперкористувача",
+ "input_label": "Публічний ED25519 або RSA ключ"
+ },
+ "more_page": {
+ "about_project": "Про нас",
+ "create_ssh_key": "SSH-ключі суперкористовача",
+ "console": "Консоль",
+ "application_settings": "Налаштування додатка",
+ "configuration_wizard": "Майстер установки",
+ "about_application": "Про нас",
+ "onboarding": "Адаптація"
+ },
+ "console_page": {
+ "title": "Консоль",
+ "waiting": "Очікування ініціалізації…",
+ "copy": "Copie"
+ },
+ "about_us_page": {
+ "title": "Про нас"
+ },
+ "about_application_page": {
+ "application_version_text": "Версія додатку {}",
+ "api_version_text": "Версія API сервера {}",
+ "privacy_policy": "Політика конфіденційності",
+ "title": "Про нас"
+ },
+ "onboarding": {
+ "page1_title": "Цифрова незалежність, доступна кожному",
+ "page2_server_provider_title": "Сервер-провайдер",
+ "page2_title": "Політика конфіденційності-це не хмара, це твій персональний центр обробки даних",
+ "page1_text": "Пошта, ВПН, Месенджер, соціальна мережа і багато іншого на твоєму приватному сервері, під твоїм контролем.",
+ "page2_dns_provider_title": "DNS-провайдер",
+ "page2_dns_provider_text": "Тобі потрібен домен, щоб мати місце в інтернеті. Вам також потрібен надійний DNS-провайдер, щоб вказати домен вашого серверу. Ми запромпонуємо вам вибрати підтримуваного DNS-провайдера для автоматичного налаштування мережі.",
+ "page2_backup_provider_title": "Backup-провайдер",
+ "page2_server_provider_text": "Сервер-провайдер обслуговує ваш сервер у власному Data-центрі. Політика конфіденційності буде автоматично зв'язана з провайдером і налаштує все необхідне.",
+ "page2_text": "Політика конфіденційності працює лише з тим провайдром, якого ви вибрали. Якщо ви не маєте потрібних облікових записів, ми допоможемо їх вам створити.",
+ "page2_backup_provider_text": "Що якщо з вашим сервером щось трапиться? Уявіть собі атаку хакерів, випадкове видалення даних або відмову в обслуговуванні? Ваші дані будуть у безпеці у резервних копіях вашого провайдера. Вони будуть надійно зашифровані та у будь-який час доступні для відновлення вашого сервера."
+ },
+ "initializing": {
+ "select_provider_notice": "За 'Відносно невеликим' ми маємо на увазі машину з 2 ядрами CPU і 2 гігабайтами оперативної пам'яті.",
+ "select_provider_price_text_do": "$ 17 на місяць для порівняно невеликого сервера і 50Гб дискового сховища",
+ "select_provider_email_notice": "Хостинг електронної пошти не буде доступний для нових клієнтів. Проте, вона буде розблокована, як тільки ви зробите вашу першу оплату.",
+ "choose_server_type_notice": "Важливими речами, на які слід дивитися, є процесор і оперативна пам'ять. Дані ваших послуг буде збережено.",
+ "use_this_domain_text": "Токен, який ви надали, надає доступ до наступного домену",
+ "loading_domain_list": "Завантаження списку доменів",
+ "found_more_domains": "Знайдено більше одного домену. Для власної безпеки просимо видалити непотрібні домени",
+ "server_created": "Сервер створений. DNS перевірений і завантаження серверу у прогресі…",
+ "enter_username_and_password": "Введіть ім’ я користувача і надійний пароль",
+ "connect_to_server": "Почнемо з сервера.",
+ "select_provider": "Оберіть будь-якого провайдера з наведеного нижче списку, всі вони підтримують політику конфіденційності",
+ "select_provider_countries_title": "Доступні країни",
+ "select_provider_countries_text_hetzner": "Німеччина, Фінляндія, США",
+ "select_provider_countries_text_do": "США, Нідерланди, Сінгапур, Велика Британія, НІмеччина, Канада, Індія, Австралія",
+ "select_provider_price_title": "Середня ціна",
+ "select_provider_price_text_hetzner": "€ 8 на місяць за відносно невеликий сервер і 50 Гб дискового сховища",
+ "select_provider_payment_title": "Способи оплати",
+ "select_provider_payment_text_hetzner": "Картка, SWIFT, SEPA, PayPal",
+ "select_provider_payment_text_do": "Картка, Google Pay, PayPal",
+ "select_provider_site_button": "Відвідати сайт",
+ "connect_to_server_provider": "Авторизуйтеся зараз ",
+ "locations_not_found_text": "Немає доступних серверів для оренди",
+ "connect_to_server_provider_text": "З токеном API SelfPrivacy зможе орендувати техніку і налаштувати на неї ваш сервер",
+ "how": "Як отримати токен API",
+ "provider_bad_key_error": "Некоректний ключ API провайдера",
+ "could_not_connect": "Не зміг підключитися до провайдера.",
+ "choose_location_type": "Де ви хочете забронювати свій сервер?",
+ "choose_location_type_text": "Різні локації забезпечують різні конфігурації серверів, ціни і швидкість з'єднання.",
+ "locations_not_found": "Упс!",
+ "back_to_locations": "Оберіть щось інше",
+ "no_locations_found": "Не знайдено доступних місць, перевірте, чи ваш обліковий запис доступний",
+ "choose_server_type": "Який тип сервера вам потрібен?",
+ "choose_server_type_text": "Різні ресурсні можливості підтримують різні сервіси. Не хвилюйся, ти можеш розширити свій сервер коли завгодно",
+ "choose_server_type_ram": "{} ГБ ОЗУ",
+ "choose_server_type_storage": "{} ГБ системного сховища",
+ "choose_server_type_payment_per_month": "{} щомісячно",
+ "no_server_types_found": "Не знайдено доступних типів серверів. Переконайтеся, що ваш обліковий запис доступний і спробуйте змінити розташування вашого сервера.",
+ "backblaze_bad_key_error": "Інформація про зберігання Backblaze є недійсною",
+ "select_dns": "Тепер давайте оберемо DNS-провайдера",
+ "manage_domain_dns": "Для управління DNS домену",
+ "use_this_domain": "Скористатися цим доменом?",
+ "connect_backblaze_storage": "Підключити Backblaze сховище",
+ "no_connected_domains": "Наразі немає пов'язаних доменів",
+ "save_domain": "Зберегти домен",
+ "final": "Останній крок",
+ "create_server": "Створити сервер",
+ "what": "Що це значить?",
+ "server_rebooted": "Сервер перезавантажено. Чекаю останньої перевірки…",
+ "server_started": "Сервер запущено. Його буде перевірено і перезавантажено…",
+ "until_the_next_check": "До наступної перевірки: ",
+ "check": "Перевірка",
+ "one_more_restart": "Ще один перезапуск, щоб застосувати сертифікати безпеки.",
+ "create_master_account": "Створити внутрішній рахунок",
+ "finish": "Усе ініціалізовано",
+ "checks": "Перевірка була завершена\n{} з {}"
+ },
+ "recovering": {
+ "recovery_main_header": "З’ єднатися з існуючим сервером",
+ "generic_error": "Операція зазнала невдачі, будь ласка, спробуйте ще раз.",
+ "domain_recovery_description": "Введіть домен сервера, до якого ви бажаєте отримати доступ:",
+ "domain_recover_placeholder": "Ваш домен",
+ "domain_recover_error": "Сервера з таким доменом не знайдено",
+ "method_select_description": "Виберіть спосіб відновлення:",
+ "method_select_other_device": "У мене є доступ до іншого пристрою",
+ "method_select_recovery_key": "Я маю ключ відновлення",
+ "method_select_nothing": "Я не маю нічого з цього",
+ "method_device_description": "Відкрийте програму на іншому пристрої та перейдіть на сторінку пристроїв. Натисніть \"Додати пристрій\", щоб отримати свій токен.",
+ "method_device_button": "Я отримав свій токен",
+ "method_device_input_description": "Введіть токен авторизації",
+ "method_device_input_placeholder": "Токен",
+ "method_recovery_input_description": "Введіть ключ відновлення",
+ "fallback_select_description": "Що у вас є? Виберіть перший доступний варіант:",
+ "fallback_select_token_copy": "Копія токена автентифікації з іншої версії застосунку.",
+ "fallback_select_root_ssh": "Root SSH доступ до сервера.",
+ "fallback_select_provider_console": "Доступ до серверної консолі мого продiвера.",
+ "authorization_failed": "Не можу авторизуватись за цим ключем",
+ "fallback_select_provider_console_hint": "Наприклад: Hetzner.",
+ "provider_connected": "Підключіться до {}",
+ "provider_connected_description": "Зв'язок встановлений. Введіть свій токен з доступом до {}:",
+ "provider_connected_placeholder": "{} Токен",
+ "confirm_server": "Підтвердити сервер",
+ "confirm_server_description": "Знайдено ваш сервер! Підтвердіть, що він правильний:",
+ "confirm_server_accept": "Так! Це воно",
+ "confirm_server_decline": "Вибрати інший сервер",
+ "choose_server": "Виберіть ваш сервер",
+ "no_servers": "На вашому обліковому записі немає доступних серверів.",
+ "choose_server_description": "Ми не змогли з'ясувати, до якого сервера ви намагаєтесь підключитися.",
+ "domain_not_available_on_token": "Вибраний домен недоступний на цьому токені.",
+ "modal_confirmation_title": "Це насправді ваш сервер?",
+ "modal_confirmation_description": "Якщо ви підключаєтеся до невірного сервера, ви можете втратити всі ваші дані.",
+ "modal_confirmation_dns_valid": "Зворотна DNS дійсна",
+ "modal_confirmation_dns_invalid": "Зворотна DNS вказує на інший домен",
+ "modal_confirmation_ip_valid": "IP той же, що і в записі DNS",
+ "modal_confirmation_ip_invalid": "IP не такий, як в DNS-записі"
+ },
+ "resource_chart": {
+ "month": "Місяць",
+ "day": "День",
+ "hour": "Година",
+ "cpu_title": "Використання CPU",
+ "network_title": "Використання мережі",
+ "in": "В",
+ "out": "Вийти"
+ },
+ "server": {
+ "card_title": "Сервер",
+ "description": "Усі твої сервіси тут",
+ "general_information": "Загальна інформація",
+ "resource_usage": "Використання ресурсів",
+ "allow_autoupgrade": "Дозволити авто-оновлення",
+ "allow_autoupgrade_hint": "Дозволити автоматичне покращення пакетів на сервері",
+ "select_timezone": "Вибрати часовий пояс",
+ "status": "Статус",
+ "server_id": "Сервер ID",
+ "cpu": "Процессор",
+ "ram": "Пам'ять",
+ "core_count": {
+ "one": "{} ядро",
+ "few": "{} ядра",
+ "many": "{} ядер",
+ "other": "{} ядра",
+ "two": "{} ядра"
+ },
+ "disk": "Локальний диск",
+ "reboot_after_upgrade": "Перезавантаження після оновлення",
+ "reboot_after_upgrade_hint": "Перезавантаження без запиту після застосування змін на сервері",
+ "server_timezone": "Часовий пояс сервера",
+ "timezone_search_bar": "Ім'я часового поясу або значення зсуву часу",
+ "monthly_cost": "Щомісячна вартість",
+ "location": "Місцезнаходження",
+ "server_provider": "Провайдер сервера",
+ "dns_provider": "Провайдер DNS"
+ },
+ "record": {
+ "api": "SelfPrivacy API",
+ "cloud": "Файлове сховище",
+ "git": "Git-сервер",
+ "social": "Соціальна мережа",
+ "password": "Менеджер паролів",
+ "vpn": "VPN",
+ "mx": "MX-запис",
+ "dmarc": "DMARC-запис",
+ "spf": "SPF-запис",
+ "meet": "Відео конференція",
+ "dkim": "DKIM ключі",
+ "root": "Кореневий домен"
+ },
+ "domain": {
+ "card_title": "Домен",
+ "screen_title": "Домен та DNS",
+ "ok": "Записи в порядку",
+ "error": "Знайдені проблеми",
+ "refreshing": "Статус оновлення…",
+ "uninitialized": "Дані ще не відновлено",
+ "services_title": "Сервіси",
+ "email_title": "Електронна пошта",
+ "email_subtitle": "Записи, необхідні для безпечного обміну електронною поштою.",
+ "update_list": "Лист оновлень",
+ "error_subtitle": "Натисніть тут, щоб виправити їх. При цьому також буде видалено користувацькі записи.",
+ "services_subtitle": "Введіть \"А\" записи, необхідні для кожної служби."
+ },
+ "backup": {
+ "card_title": "Резервне копіювання",
+ "reupload_key": "Примусове повторне завантаження ключа",
+ "reuploaded_key": "Ключ повторно завантажений",
+ "initialize": "Ініціалізація",
+ "restore": "Відновити з резервної копії",
+ "no_backups": "Ще немає резервних копій",
+ "create_new": "Створити нову резервну копію",
+ "creating": "Створення нової резервної копії: {}%",
+ "error_pending": "Помилка відновлення сервера, перевірте це нижче",
+ "refresh": "Оновити статус",
+ "refetch_backups": "Повторно отримати список резервних копій",
+ "refetching_list": "За кілька хвилин список буде оновлений",
+ "description": "Врятує ваш день у разі аварії: хакерська атака, видаленя серверу, тощо.",
+ "waiting_for_rebuild": "Ви зможете створити свою першу резервну копію через кілька хвилин.",
+ "restoring": "Відновлення з резервної копії",
+ "restore_alert": "Ви збираєтеся відновити з резервної копії. створеної на {}. Усі поточні дані будуть втрачені. Ви згодні?",
+ "refetch_backups_subtitle": "Скинути кеш і запросити дані у провайдера. Може спричинити додаткові витрати.",
+ "reupload_key_subtitle": "Ще раз проініціалізує сховище резервних копій. Використовуйте, якщо щось зламалося.",
+ "create_new_select_heading": "Вибрати сервіси для копіювання",
+ "start": "Почати створення копій",
+ "service_busy": "Зараз створюються інші резервні копії",
+ "latest_snapshots": "Останні знімки",
+ "latest_snapshots_subtitle": "Останні 15 знімків",
+ "show_more": "Показати ще",
+ "autobackup_period_title": "Період автоматичного копіювання",
+ "autobackup_period_subtitle": "Створення копій раз на {period}",
+ "autobackup_period_never": "Автоматичне копіювання вимкнено",
+ "autobackup_period_every": "Раз у {period}",
+ "autobackup_period_disable": "Вимкнути автоматичні копіювання",
+ "autobackup_custom": "Інше",
+ "autobackup_custom_hint": "Введіть період у хвилинах",
+ "autobackup_set_period": "Встановити період",
+ "autobackup_period_set": "Період встановлено",
+ "backups_encryption_key": "Ключ шифрування",
+ "backups_encryption_key_subtitle": "Зберігайте його в безпечному місці.",
+ "backups_encryption_key_copy": "Скопіюйте ключ шифрування",
+ "card_subtitle": "Керуйте резервними копіями",
+ "select_all": "Копіювати все"
+ },
+ "storage": {
+ "card_title": "Серверне сховище",
+ "status_error": "Мало місця на диску",
+ "disk_usage": "{} використано",
+ "disk_total": "{} всього · {}",
+ "gb": "{} ГБ",
+ "mb": "{} МБ",
+ "kb": "{} КБ",
+ "bytes": "Байти",
+ "extend_volume_button": "Збільшити обсяг",
+ "extending_volume_price_info": "Ціна включає ПДВ і оцінюється з даних ціноутворення, наданих Hetzner. Сервер буде перезавантажений після зміни розміру.",
+ "extending_volume_error": "Не вдалося ініціалізувати розширення обсягу.",
+ "size": "Розмір",
+ "data_migration_title": "Перенесення даних",
+ "start_migration_button": "Почати перенос",
+ "migration_process": "Перенос…",
+ "migration_done": "Закінчити",
+ "status_ok": "Використання диска нормальне",
+ "extending_volume_title": "Збільшення обсягу",
+ "extending_volume_description": "Зміна обсягу дозволить зберігати більше даних на вашому сервері без розширення сервера. Обсяг може бути тільки збільшеним: зменшення неможливе.",
+ "data_migration_notice": "Під час переносу всі послуги будуть вимкнені."
+ },
+ "not_ready_card": {
+ "in_menu": "Сервер ще не налаштовано. Будь ласка, завершіть налаштування за допомогою майстра налаштування для подальшої роботи."
+ },
+ "service_page": {
+ "open_in_browser": "Відкрити у браузері",
+ "restart": "Перезавантажити сервіс",
+ "disable": "Викнути сервіс",
+ "enable": "Увімкнути сервіс",
+ "move": "Перейти до іншого об'єму",
+ "status": {
+ "active": "Створювати і запускати",
+ "inactive": "Зупинено",
+ "failed": "Не вдалося запустити",
+ "off": "Вимкнено",
+ "activating": "Активація",
+ "deactivating": "Деактивація",
+ "reloading": "Перезапуск"
+ },
+ "uses": "Використовує {usage} на {volume}"
+ },
+ "mail": {
+ "subtitle": "E-Mail для компанії та сім'ї.",
+ "title": "E-Mail",
+ "login_info": "Використовувати ім’ я користувача і пароль з вкладки « користувач ». Порт IMAP — 143 з STARTTLS, порт SMTP — 587."
+ },
+ "password_manager": {
+ "title": "Менеджер паролів",
+ "login_info": "Вам доведеться створити обліковий запис на веб-сайті.",
+ "subtitle": "Основа вашої безпеки. Bitwarden допоможе вам створювати, зберігати і переміщати паролі між пристроями, а також вводити їх за запитом за допомогою автозаповнення."
+ },
+ "video": {
+ "title": "Відеозустріч",
+ "subtitle": "Zoom і Google Meet хороші, але Jitsi meet є вартою альтернативи, яка також дає вам впевненість, що вас не слухають.",
+ "login_info": "Обліковий запис не потрібен."
+ },
+ "cloud": {
+ "title": "Хмарне сховище",
+ "subtitle": "Не дозволяйте хмарним службам читати ваші дані, за допомогою NextCloud.",
+ "login_info": "Вхід адміністратора, пароль такий самий, як і у вашого головного користувача. Створити нові аккаунти у Nextcloud."
+ },
+ "social_network": {
+ "title": "Соціальна мережа",
+ "login_info": "Вам доведеться створити обліковий запис на веб-сайті.",
+ "subtitle": "Важко повірити, але стало можливим створити власну соціальну мережу, з твоїми власними правилами та цільовою аудиторією."
+ },
+ "git": {
+ "title": "Git-сервер",
+ "subtitle": "Приватна альтернатива Github, яка належить вам, а не Microsoft.",
+ "login_info": "Вам доведеться створити обліковий запис на веб-сайті. Першим користувачем стане адміністратор."
+ },
+ "vpn": {
+ "title": "VPN-сервер",
+ "subtitle": "Приватний VPN-сервер"
+ },
+ "users": {
+ "add_new_user": "Додати першого користувача",
+ "new_user": "Новий користувач",
+ "delete_user": "Видалити користувача",
+ "nobody_here": "Нікого немає",
+ "login": "Логін",
+ "new_user_info_note": "Новий користувач автоматично отримає доступ до всіх послуг",
+ "delete_confirm_question": "Ви згодні?",
+ "reset_password": "Скинути пароль",
+ "account": "Аккаунт",
+ "send_registration_data": "Поділитися реєстраційними даними",
+ "could_not_fetch_users": "Не вдалося отримати список користувачів",
+ "refresh_users": "Оновити список користувачів",
+ "could_not_create_user": "Не зміг створити користувача",
+ "could_not_delete_user": "Не зміг видалити користувача",
+ "could_not_add_ssh_key": "Не зміг додати SSH-ключ",
+ "email_login": "Увійти через Email",
+ "not_ready": "Будь ласка, підключіть сервер, домен і DNS на вкладці \"Сервери\", щоб мати можливість додати першого користувача",
+ "could_not_fetch_description": "Перевірте підключення до Інтернету і спробуйте ще раз",
+ "username_rule": "Ім'я користувача має містити лише малі латинські літери, цифри і підкреслення, не слід починати з цифри",
+ "no_ssh_notice": "Для цього користувача створюються тільки поштові та SSH-акаунти. Єдина реєстрація для всіх сервісів незабаром."
+ },
+ "devices": {
+ "main_screen": {
+ "header": "Пристрої",
+ "description": "Ці пристрої мають повний доступ до сервера через додаток SelfPrivacy.",
+ "this_device": "Цей пристрій",
+ "other_devices": "Інші пристрої",
+ "authorize_new_device": "Авторизація нового пристрою",
+ "access_granted_on": "Доступ надано на {}",
+ "tip": "Натисніть на пристрої, щоб скасувати доступ."
+ },
+ "add_new_device_screen": {
+ "header": "Авторизація нового пристрою",
+ "description": "Введіть ключ пристрою, який ви бажаєте авторизувати:",
+ "please_wait": "Будь ласка зачекайте",
+ "tip": "Ключ дійсний протягом 10 хвилин.",
+ "expired": "Термін дії ключа минув.",
+ "get_new_key": "Отримати новий ключ"
+ },
+ "revoke_device_alert": {
+ "header": "Відкликати доступ?",
+ "description": "Пристрій {} більше не матиме доступу до сервера.",
+ "yes": "Відкликати",
+ "no": "Скасувати"
+ }
+ },
+ "recovery_key": {
+ "key_connection_error": "Не вдалося підключитися до сервера.",
+ "key_synchronizing": "Синхронізація…",
+ "key_main_header": "Ключ відновлення",
+ "key_main_description": "Необхідно авторизувати SelfPrivacy, коли всі інші авторизовані пристрої недоступні.",
+ "key_amount_toggle": "Обмеження за кількістю використань",
+ "key_amount_field_title": "Максимальна кількість використань",
+ "key_duedate_toggle": "Обмеження за часом",
+ "key_duedate_field_title": "Дата закінчення терміну дії",
+ "key_receive_button": "Ключ прийому",
+ "key_valid": "Ваш ключ дійсний",
+ "key_invalid": "Ваш ключ більше не дійсний",
+ "key_valid_until": "Діє до {}",
+ "key_valid_for": "Дійсний для використання {}",
+ "key_creation_date": "Створено на {}",
+ "key_replace_button": "Сгенерувати новий ключ",
+ "key_receiving_description": "Запишіть цей ключ і сховайте у безпечне місце. Використовується для відновлення повного доступу до вашого сервера:",
+ "key_receiving_info": "Ключ ніколи більше не відображатиметься, але ви зможете замінити його іншим.",
+ "key_receiving_done": "Готово!",
+ "generation_error": "Не вдалося створити ключ відновлення. {}"
+ },
+ "modals": {
+ "dns_removal_error": "Не вдалося видалити DNS-записи.",
+ "server_deletion_error": "Не вдалося видалити активний сервер.",
+ "server_validators_error": "Не вдалося отримати доступні сервери.",
+ "already_exists": "Такий сервер вже існує.",
+ "unexpected_error": "Неочікувана помилка під час розміщення з боку провайдера.",
+ "destroy_server": "Знищити сервер і створити новий?",
+ "try_again": "Спробувати ще раз?",
+ "are_you_sure": "Ви впевнені?",
+ "purge_all_keys": "Очистити всі ключі автентифікації?",
+ "purge_all_keys_confirm": "Так, очистити всі мої токени",
+ "delete_server_volume": "Видалити сервер і сховище?",
+ "reboot": "Перезавантажити",
+ "you_cant_use_this_api": "Не можна використовувати цей API для доменів з таким TLD.",
+ "yes": "Так",
+ "no": "Ні"
+ },
+ "timer": {
+ "sec": "{} сек"
+ },
+ "jobs": {
+ "title": "Задачі",
+ "start": "Початок",
+ "empty": "Задач немає",
+ "create_user": "Створити користувача",
+ "delete_user": "Видалити користувача",
+ "service_turn_off": "Вимкнути",
+ "service_turn_on": "Увімкнути",
+ "job_added": "Завдання додано",
+ "run_jobs": "Запустіть завдання",
+ "reboot_success": "Сервер перезавантажується",
+ "reboot_failed": "Не зміг перезавантажити сервер. Перевірте журнали додатків.",
+ "config_pull_failed": "Не вдалося виконати оновлення налаштувань. Запустили оновлення програмного забезпечення в будь-якому випадку.",
+ "upgrade_success": "Почалося оновлення сервера",
+ "upgrade_failed": "Не вдалося оновити сервер",
+ "upgrade_server": "Покращити сервер",
+ "reboot_server": "Перезавантажити сервер",
+ "create_ssh_key": "Створити SSH-ключ для {}",
+ "delete_ssh_key": "Видалити SSH-ключ для {}",
+ "server_jobs": "Задачі на сервері",
+ "reset_user_password": "Скинути пароль користувача",
+ "generic_error": "Не вдалося підключитись до сервера!"
+ },
+ "validations": {
+ "required": "Потрібно",
+ "already_exist": "Вже існує",
+ "invalid_format": "Неприпустимий формат",
+ "invalid_format_password": "Не повинен містити порожніх символів",
+ "length_longer": "Довжина [] повинна бути коротшою або дорівнює {}",
+ "invalid_format_ssh": "Повинен відповідати формату ключа SSH",
+ "root_name": "Не може бути 'root'",
+ "length_not_equal": "Довжина [], має бути {}"
+ }
+}
diff --git a/assets/translations/uz.json b/assets/translations/uz.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/assets/translations/uz.json
@@ -0,0 +1 @@
+{}
diff --git a/build.yaml b/build.yaml
index 709b623e..993e8dd4 100644
--- a/build.yaml
+++ b/build.yaml
@@ -1,7 +1,17 @@
targets:
$default:
builders:
+ graphql_codegen:
+ options:
+ scalars:
+ DateTime:
+ type: DateTime
+ fromJsonFunctionName: dateTimeFromJson
+ toJsonFunctionName: dateTimeToJson
+ import: package:selfprivacy/utils/scalars.dart
+ clients:
+ - graphql
json_serializable:
options:
create_factory: true
- create_to_json: false
\ No newline at end of file
+ create_to_json: true
diff --git a/ci.py b/ci.py
new file mode 100755
index 00000000..b2403bfe
--- /dev/null
+++ b/ci.py
@@ -0,0 +1,249 @@
+#!/usr/bin/env python3
+
+import os
+import subprocess
+import requests
+import yaml
+import argparse
+
+CONTAINER_IMAGE = "registry.selfprivacy.org:5001/flutter-build-env"
+HOST_HOME = "/var/lib/drone-runner-exec"
+CONTAINER_HOME = "/tmp/builder"
+HOST_MOUNTED_VOLUME = f"{HOST_HOME}/.local/share/containers/storage/volumes/release/_data"
+
+APP_NAME = "org.selfprivacy.app"
+APP_NAME_NIGHTLY = "org.selfprivacy.app.nightly"
+APP_VERSION_FULL = yaml.safe_load(open("pubspec.yaml", "r"))['version']
+APP_SEMVER = APP_VERSION_FULL[:APP_VERSION_FULL.find("+")]
+APP_BUILD_ID = APP_VERSION_FULL[APP_VERSION_FULL.find("+"):][1::]
+APP_BUILD_ID_NIGHTLY = subprocess.run(["git", "rev-list", "--first-parent", "--count", "HEAD"], check=True, stdout=subprocess.PIPE).stdout.decode().strip()
+
+GITEA_HOST_URL = "https://git.selfprivacy.org"
+GITEA_REPO_FULL = os.environ.get("DRONE_REPO") or "kherel/selfprivacy.org.app"
+GITEA_REPO_OWNER = os.environ.get("DRONE_REPO_OWNER") or "kherel"
+GITEA_REPO_NAME = os.environ.get("DRONE_REPO_NAME") or "selfprivacy.org.app"
+
+# Environments
+
+def podman_offline(dir, *args):
+ subprocess.run(["podman", "run", "--rm", "--network=none", "--cap-add=CHOWN", f"--workdir={dir}",
+ "-v", os.getcwd() + f":{CONTAINER_HOME}/src",
+ "-v", f"{HOST_HOME}/fdroid:{CONTAINER_HOME}/fdroid",
+ "-v", f"{HOST_HOME}/fdroid-keystore:{CONTAINER_HOME}/fdroid-keystore",
+ "-v", f"{HOST_HOME}/standalone-keystore:{CONTAINER_HOME}/standalone-keystore",
+ "-v", f"{HOST_HOME}/google-keystore:{CONTAINER_HOME}/google-keystore",
+ "--env", "FDROID_KEYSTORE_PASS=" + os.environ.get("FDROID_KEYSTORE_PASS"),
+ "--env", "STANDALONE_KEYSTORE_PASS=" + os.environ.get("STANDALONE_KEYSTORE_PASS"),
+ "--env", "GOOGLE_KEYSTORE_PASS=" + os.environ.get("GOOGLE_KEYSTORE_PASS"),
+ "--user", os.getuid().__str__() + ":" + os.getgid().__str__(), "--userns=keep-id",
+ "--ulimit", "nofile=102400:102400", CONTAINER_IMAGE, "bash", "-c", ' '.join(args)
+ ], check=True)
+
+def podman_online(dir, *args):
+ subprocess.run(["podman", "run", "--rm", "--cap-add=CHOWN", f"--workdir={dir}",
+ "-v", os.getcwd() + f":{CONTAINER_HOME}/src",
+ "--user", os.getuid().__str__() + ":" + os.getgid().__str__(), "--userns=keep-id",
+ "--ulimit", "nofile=102400:102400",CONTAINER_IMAGE, "bash", "-c", ' '.join(args)
+ ], check=True)
+
+# Utilities
+
+def gitea_create_release():
+ url = f"{GITEA_HOST_URL}/api/v1/repos/{GITEA_REPO_FULL}/releases"
+ token = os.environ.get("GITEA_RELEASE_TOKEN")
+ params = {"access_token": f"{token}"}
+ json = {"tag_name": f"{os.environ.get('DRONE_SEMVER') or APP_SEMVER}", "name": f"{os.environ.get('DRONE_SEMVER' or APP_SEMVER)}", "prerelease": True}
+
+ request = requests.post(url, params=params, json=json)
+
+ try:
+ request.raise_for_status()
+ except requests.exceptions.HTTPError as error:
+ print(error)
+ return error
+
+def gitea_get_release_id():
+ url = f"{GITEA_HOST_URL}/api/v1/repos/{GITEA_REPO_FULL}/releases/tags/{os.environ.get('DRONE_SEMVER') or APP_SEMVER}"
+
+ request = requests.get(url)
+
+ try:
+ request.raise_for_status()
+ except requests.exceptions.HTTPError as error:
+ print(error)
+ return error
+
+ return request.json()['id']
+
+def gitea_upload_attachment(file):
+ id = gitea_get_release_id()
+ url = f"{GITEA_HOST_URL}/api/v1/repos/{GITEA_REPO_FULL}/releases/{id}/assets"
+ token = os.environ.get("GITEA_RELEASE_TOKEN")
+ params = {"access_token": f"{token}", "name": f"{os.path.basename(file)}"}
+ files = {"attachment": open(f"{file}", "br")}
+
+ request = requests.post(url, params=params, files=files)
+
+ try:
+ request.raise_for_status()
+ except requests.exceptions.HTTPError as error:
+ print(error)
+ return error
+
+# Targets
+
+def build_linux():
+ podman_online(f"{CONTAINER_HOME}/src", "chown -R $(id -u):$(id -g) /tmp/flutter_pub_cache",
+ "&& flutter pub get --offline",
+ "&& flutter build linux")
+
+def build_apk():
+ podman_online(f"{CONTAINER_HOME}/src", "chown -R $(id -u):$(id -g) /tmp/gradle /tmp/flutter_pub_cache",
+ "&& flutter pub get",
+ "&& flutter build apk --flavor production")
+def build_bundle():
+ podman_online(f"{CONTAINER_HOME}/src", "chown -R $(id -u):$(id -g) /tmp/gradle /tmp/flutter_pub_cache",
+ "&& flutter pub get",
+ "&& flutter build appbundle --flavor production")
+
+def sign_apk_standalone():
+ podman_offline(f"{CONTAINER_HOME}/src",
+ "zipalign -f -v 4 build/app/outputs/flutter-apk/app-production-release.apk",
+ f"standalone_{APP_NAME}-{APP_SEMVER}.apk")
+ podman_offline(f"{CONTAINER_HOME}/src",
+ f"apksigner sign --ks {CONTAINER_HOME}/standalone-keystore --ks-key-alias standalone --ks-pass",
+ f"env:STANDALONE_KEYSTORE_PASS standalone_{APP_NAME}-{APP_SEMVER}.apk")
+
+def sign_apk_fdroid():
+ podman_offline(f"{CONTAINER_HOME}/fdroid", f"rm -rf {CONTAINER_HOME}/fdroid/unsigned/*")
+ podman_offline(f"{CONTAINER_HOME}/fdroid",
+ f"test ! -f {CONTAINER_HOME}/fdroid/repo/{APP_NAME}_{APP_BUILD_ID}.apk",
+ "&& cp ../src/build/app/outputs/flutter-apk/app-production-release.apk",
+ f"unsigned/{APP_NAME}_{APP_BUILD_ID}.apk || echo exist")
+ podman_offline(f"{CONTAINER_HOME}/fdroid", "fdroid publish")
+ podman_offline(f"{CONTAINER_HOME}/fdroid", "fdroid update")
+
+def sign_apk_fdroid_nightly():
+ podman_offline(f"{CONTAINER_HOME}/fdroid", f"rm -rf {CONTAINER_HOME}/fdroid/unsigned/*")
+ podman_offline(f"{CONTAINER_HOME}/fdroid",
+ f"test ! -f {CONTAINER_HOME}/fdroid/repo/{APP_NAME_NIGHTLY}_{APP_BUILD_ID_NIGHTLY}.apk",
+ "&& cp ../src/build/app/outputs/flutter-apk/app-nightly-release.apk",
+ f"unsigned/{APP_NAME_NIGHTLY}_{APP_BUILD_ID_NIGHTLY}.apk || echo exist")
+ podman_offline(f"{CONTAINER_HOME}/fdroid", "fdroid publish")
+ podman_offline(f"{CONTAINER_HOME}/fdroid", "fdroid update")
+
+def sign_bundle():
+ podman_offline(f"{CONTAINER_HOME}/src",
+ f"jarsigner -sigalg SHA256withRSA -digestalg SHA-256 -keystore {CONTAINER_HOME}/google-keystore -signedjar {APP_NAME}-{APP_SEMVER}.aab -storepass:env GOOGLE_KEYSTORE_PASS build/app/outputs/bundle/productionRelease/app-production-release.aab google")
+
+def package_linux_appimage():
+ podman_online(f"{CONTAINER_HOME}/src", "appimage-builder --recipe appimage.yml")
+
+def package_linux_flatpak():
+ subprocess.run(["flatpak-builder", "--force-clean", "--repo=flatpak-repo", "flatpak-build", "flatpak.yml"], check=True)
+ subprocess.run(["flatpak", "build-bundle", "flatpak-repo", f"{APP_NAME}-{APP_SEMVER}.flatpak", f"{APP_NAME}"], check=True)
+
+def package_linux_archive():
+ podman_online(f"{CONTAINER_HOME}/src", f"tar -C build/linux/x64/release/bundle -vacf {APP_NAME}-{APP_SEMVER}.tar.zstd .")
+
+def deploy_gitea_release():
+ gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/standalone_{APP_NAME}-{APP_SEMVER}.apk")
+ gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/standalone_{APP_NAME}-{APP_SEMVER}.apk.idsig")
+ gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/{APP_NAME}-{APP_SEMVER}.aab")
+ gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/SelfPrivacy-{APP_SEMVER}-x86_64.AppImage")
+ gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/SelfPrivacy-{APP_SEMVER}-x86_64.AppImage.zsync")
+ gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/{APP_NAME}-{APP_SEMVER}.flatpak")
+ gitea_upload_attachment(f"{HOST_MOUNTED_VOLUME}/{APP_NAME}-{APP_SEMVER}.tar.zstd")
+
+def package_windows_archive():
+ import shutil
+ shutil.make_archive(f"selfprivacy-{APP_SEMVER}-win32", 'zip', "build/windows/runner/Release")
+
+def deploy_windows_archive():
+ gitea_upload_attachment(f"selfprivacy-{APP_SEMVER}-win32.zip")
+
+def deploy_fdroid_repo():
+ subprocess.run([f"""eval $(ssh-agent -s) &&
+ echo \"$SSH_PRIVATE_KEY\" | tr -d '\r' | ssh-add - &&
+ scp -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -r {HOST_HOME}/fdroid/repo/* deployer@selfprivacy.org:/var/www/fdroid.selfprivacy.org
+ """], shell=True, check=True)
+
+def ci_build_linux():
+ podman_online(f"{CONTAINER_HOME}/src", "chown -R $(id -u):$(id -g) /tmp/flutter_pub_cache",
+ "&& flutter pub get",
+ "&& flutter build linux --debug")
+
+def ci_build_apk():
+ podman_online(f"{CONTAINER_HOME}/src", "chown -R $(id -u):$(id -g) /tmp/gradle /tmp/flutter_pub_cache",
+ "&& flutter pub get",
+ "&& flutter build apk --flavor nightly")
+
+def ci_run_tests():
+ podman_online(f"{CONTAINER_HOME}/src", "flutter test",
+ "&& flutter test --machine --coverage > tests.output")
+
+# Arguments
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ group = parser.add_mutually_exclusive_group()
+ group.add_argument("--build-linux", action="store_true")
+ group.add_argument("--build-apk", action="store_true")
+ group.add_argument("--build-bundle", action="store_true")
+ group.add_argument("--sign-apk-standalone", action="store_true", help="depends on $STANDALONE_KEYSTORE_PASS")
+ group.add_argument("--sign-apk-fdroid", action="store_true", help="depends on $FDROID_KEYSTORE_PASS")
+ group.add_argument("--sign-apk-fdroid-nightly", action="store_true", help="depends on $FDROID_KEYSTORE_PASS")
+ group.add_argument("--sign-bundle", action="store_true", help="depends on $GOOGLE_KEYSTORE_PASS")
+ group.add_argument("--package-linux-appimage", action="store_true")
+ group.add_argument("--package-linux-flatpak", action="store_true")
+ group.add_argument("--package-linux-archive", action="store_true")
+ group.add_argument("--package-windows-archive", action="store_true")
+ group.add_argument("--deploy-gitea-release", action="store_true", help="depends on $GITEA_RELEASE_TOKEN")
+ group.add_argument("--deploy-fdroid-repo", action="store_true", help="depends on $SSH_PRIVATE_KEY")
+ group.add_argument("--deploy-windows-archive", action="store_true")
+ group.add_argument("--ci-build-linux", action="store_true")
+ group.add_argument("--ci-build-apk", action="store_true")
+ group.add_argument("--ci-run-tests", action="store_true")
+ group.add_argument("--gitea-create-release", action="store_true")
+ group.add_argument("--gitea-upload-attachment", action="store")
+ args = parser.parse_args()
+
+if args.build_linux:
+ build_linux()
+elif args.build_apk:
+ build_apk()
+elif args.build_bundle:
+ build_bundle()
+elif args.sign_apk_standalone:
+ sign_apk_standalone()
+elif args.sign_apk_fdroid:
+ sign_apk_fdroid()
+elif args.sign_apk_fdroid_nightly:
+ sign_apk_fdroid_nightly()
+elif args.sign_bundle:
+ sign_bundle()
+elif args.package_linux_appimage:
+ package_linux_appimage()
+elif args.package_linux_flatpak:
+ package_linux_flatpak()
+elif args.package_linux_archive:
+ package_linux_archive()
+elif args.package_windows_archive:
+ package_windows_archive()
+elif args.deploy_gitea_release:
+ deploy_gitea_release()
+elif args.deploy_fdroid_repo:
+ deploy_fdroid_repo()
+elif args.deploy_windows_archive:
+ deploy_windows_archive()
+elif args.ci_build_linux:
+ ci_build_linux()
+elif args.ci_build_apk:
+ ci_build_apk()
+elif args.ci_run_tests:
+ ci_run_tests()
+elif args.gitea_create_release:
+ gitea_create_release()
+elif args.gitea_upload_attachment:
+ gitea_upload_attachment(args.gitea_upload_attachment)
+
diff --git a/fastlane/metadata/android/en-US/changelogs/0.6.1.txt b/fastlane/metadata/android/en-US/changelogs/0.6.1.txt
new file mode 100644
index 00000000..0f5c3964
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/0.6.1.txt
@@ -0,0 +1,3 @@
+- Fixed routing errors and broken "back" buttons on recovery stages
+- Fixed broken validation on api token fields
+- Minor improvements
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/0.7.0.txt b/fastlane/metadata/android/en-US/changelogs/0.7.0.txt
new file mode 100644
index 00000000..60316c0b
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/0.7.0.txt
@@ -0,0 +1,9 @@
+- Server storage management
+- New screen for service management
+- New users management screen
+- User passwords can be changed
+- Server auto upgrade settings can be changed now
+- Server timezone can be changed
+- Fixed bugs related to users list synchronization
+- UI fixes
+- Minor bug fixes
diff --git a/fastlane/metadata/android/en-US/changelogs/0.8.0.txt b/fastlane/metadata/android/en-US/changelogs/0.8.0.txt
new file mode 100644
index 00000000..b03a63d2
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/0.8.0.txt
@@ -0,0 +1,37 @@
+Server setup:
+- Added support for Digital Ocean as server provider
+- You can now choose server region
+- You can now choose server tier
+- Server installation UI has been refreshed
+- Fields now have more specific error messages
+
+Common UI:
+- New app bar used in most of the screens
+
+Services:
+- Services are now sorted by their status
+
+Server settings:
+- Timezone search screen now has a search bar
+- Fixed job creation when switching the setting multiple times
+- Server destruction now works
+
+Jobs:
+- Jobs panel now should take slightly less space
+
+Auth:
+- Recovery key page can now be reloaded by dragging down
+
+Logging:
+- Log console now has a limit of 500 lines
+- GraphQL API requests are now logged in the console
+- Networks errors are better handled
+
+For developers:
+- App now only uses GraphQL API to communicate with the server. All REST API calls have been removed.
+- Server can now be deployed with staging ACME certificates
+- Language assets have been reorganized
+
+Translations:
+- Added translation for Ukrainian
+- Also activated unfinished translations for German, French, Spanish, Czech, Polish, Thai
diff --git a/fastlane/metadata/android/en-US/changelogs/0.9.0.txt b/fastlane/metadata/android/en-US/changelogs/0.9.0.txt
new file mode 100644
index 00000000..29ac8043
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/0.9.0.txt
@@ -0,0 +1,145 @@
+### Features
+
+- New backups implementation ([#228](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/228), [#274](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/274), [#324](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/324), [#325](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/325), [#326](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/326), [#331](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/331), [#332](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/332))
+- DigitalOcean as a DNS provider ([#213](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/213))
+- DeSEC as a DNS provider ([#211](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/211))
+- Support drawer and basic support documentation logic unit ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Automatic day/night theme ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- New router and adaptive layouts ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- New Material 3 animation curves ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Jobs button to the app bar of more screens ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Refreshed UI of modal sheets ([#228](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/228))
+- Support for `XDG_DATA_HOME` storage path on Linux for app data ([#240](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/240))
+- Accept-Language header for the server API ([#243](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/243), resolves [#205](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/205))
+- Visible providers names during server recovery ([#264](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/264), resolves [#249](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/249))
+- Visible volume and IPv4 cost added to overall monthly cost of the server ([#270](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/270), resolves [#115](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/115))
+- Support for autofocus on text fields for keyboard displaying ([#294](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/294), resolves [#292](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/292))
+- New dialogue to choose a domain if user DNS token provides access to several ([#330](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/330), resolves [#328](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/328))
+
+### Bug Fixes
+
+- Fix opening URLs from the app ([#213](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/213))
+- Fix parsing of RAM size with DigitalOcean ([#200](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/200), resolves [#199](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/199))
+- Devices and Recovery Key cubits couldn't initialize right after server installation ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Fix BottomBar showing incorrect animation when navigating from sibling routes ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- PopUpDialogs couldn't find the context. ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Update recovery flow to use new support drawer ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- New app log console ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Improve installation failure dialogues ([#213](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/213))
+- Privacy policy link pointed at wrong domain ([#207](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/207))
+- Remove price lists for DNS ([#211](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/211))
+- Implement better domain id check on DNS restoration ([#211](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/211))
+- Add forced JSON content type to REST APIs ([#212](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/212))
+- Remove unneded DNS check depending on CLOUDFLARE ([#212](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/212))
+- Add background for dialogue pop ups and move them to root navigator ([#233](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/233), resolves [#231](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/231))
+- Make currency be properly shown again via shortcode ([#234](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/234), related to [#223](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/223))
+- Add proper server type value loading ([#236](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/236), resolves [#215](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/215))
+- Implement proper load functions for DNS and Server providers ([#237](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/237), resolves [#220](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/220))
+- Prevent moving a service if volume is null for some reason ([#245](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/245))
+- Replace hard reset from server provider with direct server reboot ([#269](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/269), resolves [#266](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/266))
+- Normalize Hetzner CPU usage percentage by cached amount of cores ([#272](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/272), resolves [#156](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/156))
+- Change broken validations string for superuser SSH ([#276](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/27))
+- Don't let service migration to start bif the same volume was picked ([#297](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/297), resolves [#289](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/289))
+- Wrap DNS check in catch to avoid runtime crash ([#322](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/322))
+- Implement Backblaze bucket restoration on server recovery ([#324](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/324))
+
+### Refactor
+
+- Migrate to Flutter 3.10 and Dart 3.0
+- Migrate to AutoRouter v6 ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Get rid of BrandText and restructure the buttons ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Remove brand alert dialogs and bottom sheet ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Remove unused UI components ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Remove BrandCards ([#203](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/203))
+- Allow changing values for TLS settings
+- Replace String shortcode with Currency class ([#226](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/226))
+- Rearrange Server Provider interface ([#227](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/227))
+- Remove unused service state getters ([#228](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/228))
+- Remove unused utils, add duration formatter ([#228](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/228))
+- Move rest api methods according to their business logic files positions ([#235](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/235), partially resolves [#217](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/217) and [#219](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/219))
+- Make flag getter a part of server provider location object ([#238](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/238), resolves [#222](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/222))
+
+
+### Translation contributions
+
+* Ukrainian
+
+ * FoxMeste (3)
+ * Mithras (31)
+
+* Latvian
+
+ * Not Telling Lol (183)
+
+
+* German
+
+ * Mithras (41)
+ * FoxMeste (213)
+
+
+* Thai
+
+ * FoxMeste (77)
+
+
+* Polish
+
+ * Mithras (41)
+ * Thary (43)
+ * FoxMeste (163)
+
+
+* Slovenian
+
+ * Mithras (212)
+
+
+* Czech
+
+ * NaiJi ✨ (2)
+ * Mithras (109)
+ * FoxMeste (308)
+
+
+* Russian
+
+ * FoxMeste (4)
+ * Revertron (8)
+ * NaiJi ✨ (23)
+ * Mithras (54)
+ * Inex Code (59)
+
+
+* Slovak
+
+ * Mithras (29)
+ * Revertron (396)
+
+
+* Macedonian
+
+ * FoxMeste (7)
+
+
+* Belarusian
+
+ * Thary (1)
+ * FoxMeste (3)
+ * Mithras (47)
+
+
+* French
+
+ * Côme (211)
+
+
+* Spanish
+
+ * FoxMeste (7)
+
+
+* Azerbaijani
+
+ * Mithras (28)
+ * Ortibexon (403)
diff --git a/fastlane/metadata/android/en-US/changelogs/0.9.1.txt b/fastlane/metadata/android/en-US/changelogs/0.9.1.txt
new file mode 100644
index 00000000..59b28862
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/0.9.1.txt
@@ -0,0 +1,20 @@
+### Bug Fixes
+
+- Fix volume resizing on Digital Ocean ([#368](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/368), resolves [#367](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/367))
+- Disable the storage card while volume information is being fetched ([#369](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/369), resolves [#317](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/317))
+
+
+### Features
+
+- Add copy-to-clipboard for email on user page ([#329](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/329), resolves [#287](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/287))
+- Add support for ECDSA SSH keys ([#362](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/362), resolves [#319](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/319))
+- Implement confirmation modal for the volume resize ([#372](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/372), resolves [#308](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/308))
+
+### Other changes
+
+- Move service descriptions above login info for service cards ([#342](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/342), resolves [#341](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/341))
+- Add measure units to 'Extending volume' page ([#344](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/344), resolves [#301](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/301))
+- Make users to be ordered properly on users page ([#343](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/343), resolves [#340](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/340))
+- Move service card name to its icon row ([#352](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/352), resolves [#350](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/350))
+- Reorganize placeholders for empty pages ([#359](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/359), resolves [#348](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/348))
+- Remove redundant zone id cache for Cloudflare ([#371](https://git.selfprivacy.org/SelfPrivacy/selfprivacy.org.app/issues/371))
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
index 32c7f449..f5ba9142 100644
--- a/fastlane/metadata/android/en-US/full_description.txt
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -1,15 +1,23 @@
-SelfPrivacy - is a platform on your cloud hosting, that allows to deploy your own private services and control them using mobile application.
-To use this application, you'll be required to create accounts of different service providers. Please reffer to this manual: https://selfprivacy.org/en/second.html
-Application will do the following things for you:
-1. Create your personal server
-2. Setup NixOS
-3. Bring all services to the ready-to-use state. Services include:
-* E-mail, ready to use with DeltaChat
-* NextCloud - your personal cloud storage
-* Bitwarden - secure and private password manager
-* Pleroma - your private fediverse space for blogging
-* Jitsi — awesome Zoom alternative
-* Gitea - your own Git server
-* OpenConnect - Personal VPN server
+
SelfPrivacy — is a platform on your cloud hosting, that allows to deploy your own private services and control them using mobile application.
-!!! Project is currently in open beta state. Feel free to try it. It would be much appreciated if you would provide us with some feedback.
\ No newline at end of file
+
To use this application, you'll be required to create accounts of different service providers. Please reffer to this manual: https://selfprivacy.org/en/second
+
+
Application will do the following things for you:
+
+
+
Create your personal server
+
Setup NixOS
+
Bring all services to the ready-to-use state. Services include:
+
+
+
+
E-mail, ready to use with DeltaChat
+
NextCloud — your personal cloud storage
+
Bitwarden — secure and private password manager
+
Pleroma — your private fediverse space for blogging
+
Jitsi — awesome Zoom alternative
+
Gitea — your own Git server
+
OpenConnect — Personal VPN server
+
+
+
Project is currently in open beta state. Feel free to try it. It would be much appreciated if you would provide us with some feedback.