diff --git a/.config/devenv.yml b/.config/devenv.yml new file mode 100644 index 000000000..6c60f338a --- /dev/null +++ b/.config/devenv.yml @@ -0,0 +1,38 @@ +url: http://localhost:3000 +port: 3000 + +db: + host: 127.0.0.1 + port: 5432 + + db: calckey + + user: calckey + pass: calckey + +redis: + host: localhost + port: 6379 + family: 4 +#sonic: +# host: localhost +# port: 1491 +# auth: SecretPassword +# collection: notes +# bucket: default + +#elasticsearch: +# host: localhost +# port: 9200 +# ssl: false +# user: +# pass: + +id: 'aid' + +reservedUsernames: + - root + - admin + - administrator + - me + - system diff --git a/.config/example.yml b/.config/example.yml index 9d20e44a0..e37d53504 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -110,12 +110,13 @@ id: 'aid' #maxCaptionLength: 1500 # Reserved usernames that only the administrator can register with -reservedUsernames: - - root - - admin - - administrator - - me - - system +reservedUsernames: [ + 'root', + 'admin', + 'administrator', + 'me', + 'system' +] # Whether disable HSTS #disableHsts: true diff --git a/.config/helm_values_example.yml b/.config/helm_values_example.yml new file mode 100644 index 000000000..b600eb8aa --- /dev/null +++ b/.config/helm_values_example.yml @@ -0,0 +1,82 @@ +replicaCount: 1 + +resources: + requests: + cpu: 0.5 + memory: 512Mi + limits: + cpu: 1 + memory: 1Gi + +calckey: + domain: example.tld + smtp: + from_address: noreply@example.tld + port: 587 + server: smtp.gmail.com + useImplicitSslTls: false + login: me@example.tld + password: CHANGEME + objectStorage: + baseUrl: https://example-bucket.nyc3.cdn.digitaloceanspaces.com + access_key: CHANGEME + access_secret: CHANGEME + bucket: example-bucket + endpoint: nyc3.digitaloceanspaces.com:443 + region: nyc3 + allowedPrivateNetworks: [] + +ingress: + enabled: true + annotations: + cert-manager.io/cluster-issuer: letsencrypt + hosts: + - host: example.tld + paths: + - path: / + pathType: ImplementationSpecific + tls: + - secretName: example-tld-certificate + hosts: + - example.tld + +elasticsearch: + enabled: false + +postgresql: + auth: + password: CHANGEME + postgresPassword: CHANGEME + primary: + persistence: + enabled: true + storageClass: vultr-block-storage + size: 25Gi + resources: + requests: + cpu: 0.25 + memory: 256Mi + limits: + cpu: 0.5 + memory: 512Mi + metrics: + enabled: true + +redis: + auth: + password: CHANGEME + master: + resources: + requests: + cpu: 0.25 + memory: 256Mi + limits: + cpu: 0.5 + memory: 256Mi + persistence: + storageclass: vultr-block-storage + size: 10Gi + replica: + replicaCount: 0 + metrics: + enabled: true diff --git a/.envrc b/.envrc new file mode 100644 index 000000000..0dcc9e739 --- /dev/null +++ b/.envrc @@ -0,0 +1,4 @@ +if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs=" +fi +use flake . --impure diff --git a/.gitignore b/.gitignore index 5e1d4a26d..63ee4f35f 100644 --- a/.gitignore +++ b/.gitignore @@ -22,7 +22,9 @@ coverage # config /.config/* !/.config/example.yml +!/.config/devenv.yml !/.config/docker_example.env +!/.config/helm_values_example.yml #docker dev config /dev/docker-compose.yml @@ -56,3 +58,7 @@ packages/backend/assets/sounds/None.mp3 # old yarn .yarn yarn* + +# Nix Development shell items +.devenv +.direnv diff --git a/.woodpecker/dockerHubReleaseCandidate.yml b/.woodpecker/dockerHubReleaseCandidate.yml index 9b1a84316..48bd39525 100644 --- a/.woodpecker/dockerHubReleaseCandidate.yml +++ b/.woodpecker/dockerHubReleaseCandidate.yml @@ -11,5 +11,4 @@ pipeline: password: # Secret 'docker_password' needs to be set in the CI settings from_secret: docker_password - branches: beta diff --git a/.woodpecker/dockerHubTag.yml b/.woodpecker/dockerHubTag.yml index fdead7a97..5543ae234 100644 --- a/.woodpecker/dockerHubTag.yml +++ b/.woodpecker/dockerHubTag.yml @@ -16,4 +16,3 @@ pipeline: # Push new version when version tag is created event: tag tag: v* - diff --git a/CALCKEY.md b/CALCKEY.md index 923cbe680..55d37a56e 100644 --- a/CALCKEY.md +++ b/CALCKEY.md @@ -19,7 +19,6 @@ - MFM button - Personal notes for all accounts - Fully revamp non-logged-in screen - - Classic mode make instance icon bring up new context menu - Lookup/details for post/file/instance - [Rat mode?](https://stop.voring.me/notes/933fx97bmd) @@ -118,6 +117,13 @@ - Sonic search - Popular color schemes, including Nord, Gruvbox, and Catppuccin - Non-nyaify cat mode +- Post imports from other Calckey/Misskey/Mastodon/Pleroma/Akkoma instances +- Improve Classic mode +- Proper Helm/Kubernetes config +- Multiple boost visibilities +- Improve system emails +- Mod mail +- Focus trapping and button labels ## Implemented (remote) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 44e1e220c..143c63d29 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -62,7 +62,7 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at @thatonecalculator on Codeberg, -`@thatonecalculator@stop.voring.me` or `@t1c@i.calckey.cloud` on the Fediverse, +`@kainoa@calckey.social` on the Fediverse, or kainoa@t1c.dev via email. All complaints will be reviewed and investigated promptly and fairly. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a1fdee31..b75dc9f35 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,8 +1,8 @@ # Contribution guide We're glad you're interested in contributing Calckey! In this document you will find the information you need to contribute to the project. -## Localization (l10n) -Calckey uses [Weblate](hhttps://hosted.weblate.org/engage/calckey/) for localization management. +## Translation (i18n) +Calckey uses [Weblate](hhttps://hosted.weblate.org/engage/calckey/) for translation and internationalization management. If your language is not listed in Weblate, please open an issue. diff --git a/Dockerfile b/Dockerfile index bdf11a9df..c378444f7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,7 +35,7 @@ FROM node:19-alpine WORKDIR /calckey # Install runtime dependencies -RUN apk add --no-cache --no-progress tini ffmpeg vips-dev +RUN apk add --no-cache --no-progress tini ffmpeg vips-dev zip unzip COPY . ./ diff --git a/README.md b/README.md index abcb29afd..79bd8f86c 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ [![no github badge](https://nogithub.codeberg.page/badge.svg)](https://nogithub.codeberg.page/) [![status badge](https://ci.codeberg.org/api/badges/calckey/calckey/status.svg)](https://ci.codeberg.org/calckey/calckey) +[![opencollective badge](https://opencollective.com/calckey/tiers/badge.svg)](https://opencollective.com/Calckey) [![liberapay badge](https://img.shields.io/liberapay/receives/ThatOneCalculator?logo=liberapay)](https://liberapay.com/ThatOneCalculator) [![translate-badge](https://hosted.weblate.org/widgets/calckey/-/svg-badge.svg)](https://hosted.weblate.org/engage/calckey/) [![docker badge](https://img.shields.io/docker/pulls/thatonecalculator/calckey?logo=docker)](https://hub.docker.com/r/thatonecalculator/calckey) @@ -46,6 +47,7 @@ # ๐Ÿฅ‚ Links +- ๐Ÿ’ธ OpenCollective: - ๐Ÿ’ธ Liberapay: - Donate publicly to get your name on the Patron list! - ๐Ÿšข Flagship instance: @@ -67,9 +69,10 @@ If you have access to a server that supports one of the sources below, I recomme [![Install on Ubuntu](https://pool.jortage.com/voringme/misskey/3b62a443-1b44-45cf-8f9e-f1c588f803ed.png)](https://codeberg.org/calckey/ubuntu-bash-install)ใ€€ใ€€[![Install on the Arch User Repository](https://pool.jortage.com/voringme/misskey/ba2a5c07-f078-43f1-8483-2e01acca9c40.png)](https://aur.archlinux.org/packages/calckey)ใ€€ใ€€[![Install Calckey with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=calckey) -### ๐Ÿ‹ Docker +## ๐Ÿ›ณ๏ธ Containerization -[How to run Calckey with Docker](./docs/docker.md). +- [๐Ÿณ How to run Calckey with Docker](https://codeberg.org/calckey/calckey/src/branch/develop/docs/docker.md) +- [๐Ÿ›ž How to run Calckey with Kubernetes/Helm](https://codeberg.org/calckey/calckey/src/branch/develop/docs/kubernetes.md) ## ๐Ÿง‘โ€๐Ÿ’ป Dependencies @@ -77,17 +80,17 @@ If you have access to a server that supports one of the sources below, I recomme - Install with [nvm](https://github.com/nvm-sh/nvm) - ๐Ÿ˜ At least [PostgreSQL](https://www.postgresql.org/) v12 - ๐Ÿฑ At least [Redis](https://redis.io/) v6 (v7 recommend) +- Web Proxy (one of the following) + - ๐Ÿ€ Nginx (recommended) + - ๐Ÿชถ Apache + - ๐Ÿฆฆ Caddy ### ๐Ÿ˜— Optional dependencies - [FFmpeg](https://ffmpeg.org/) for video transcoding -- Full text search (choost one of the following) - - ๐Ÿฆ” [Sonic](https://crates.io/crates/sonic-server) (highly recommended!) +- Full text search (one of the following) + - ๐Ÿฆ” [Sonic](https://crates.io/crates/sonic-server) (recommended) - [ElasticSearch](https://www.elastic.co/elasticsearch/) -- Management (choose one of the following) - - ๐Ÿ›ฐ๏ธ [pm2](https://pm2.io/) - - ๐Ÿณ [Docker](https://docker.com) - - Service manager (systemd, openrc, etc) ### ๐Ÿ—๏ธ Build dependencies @@ -116,6 +119,17 @@ corepack prepare pnpm@latest --activate pnpm i # --no-optional ``` +### pm2 + +To install pm2 run: + +``` +npm i -g pm2 +pm2 install pm2-logrotate +``` + +[`pm2-logrotate`](https://github.com/keymetrics/pm2-logrotate/blob/master/README.md) ensures that log files don't infinitely gather size, as Calckey produces a lot of logs. + ## ๐Ÿ˜ Create database Assuming you set up PostgreSQL correctly, all you have to run is: @@ -152,16 +166,33 @@ In Calckey's directory, fill out the `sonic` section of `.config/default.yml` wi ## ๐Ÿšš Migrating from Misskey to Calckey -For migrating from Misskey v13, Misskey v12, and Foundkey, read [this document](./docs/migrate.md). +For migrating from Misskey v13, Misskey v12, and Foundkey, read [this document](https://codeberg.org/calckey/calckey/src/branch/develop/docs/migrate.md). -## ๐Ÿ€ NGINX +## ๐ŸŒ Web proxy + +### ๐Ÿ€ Nginx (recommended) - Run `sudo cp ./calckey.nginx.conf /etc/nginx/sites-available/ && cd /etc/nginx/sites-available/` - Edit `calckey.nginx.conf` to reflect your instance properly -- Run `sudo cp ./calckey.nginx.conf ../sites-enabled/` +- Run `sudo ln -s ./calckey.nginx.conf ../sites-enabled/calckey.nginx.conf` - Run `sudo nginx -t` to validate that the config is valid, then restart the NGINX service. - +### ๐Ÿชถ Apache + +- Run `sudo cp ./calckey.apache.conf /etc/apache2/sites-available/ && cd /etc/apache2/sites-available/` +- Edit `calckey.apache.conf` to reflect your instance properly +- Run `sudo a2ensite calckey.apache` to enable the site +- Run `sudo service apache2 restart` to reload apache2 configuration + +### ๐Ÿฆฆ Caddy + +- Add the following block to your `Caddyfile`, replacing `example.tld` with your own domain: +```caddy +example.tld { + reverse_proxy http://127.0.0.1:3000 +} +``` +- Reload your caddy configuration ## ๐Ÿš€ Build and launch! @@ -180,7 +211,7 @@ pm2 start "NODE_ENV=production pnpm run start" --name Calckey - When editing the config file, please don't fill out the settings at the bottom. They're designed *only* for managed hosting, not self hosting. Those settings are much better off being set in Calckey's control panel. - Port 3000 (used in the default config) might be already used on your server for something else. To find an open port for Calckey, run `for p in {3000..4000}; do ss -tlnH | tr -s ' ' | cut -d" " -sf4 | grep -q "${p}$" || echo "${p}"; done | head -n 1`. Replace 3000 with the minimum port and 4000 with the maximum port if you need it. -- I'd recommend you use a S3 Bucket/CDN for Object Storage, especially if you use Docker. +- I'd recommend you use a S3 Bucket/CDN for Object Storage, especially if you use Docker. - I'd ***strongly*** recommend against using CloudFlare, but if you do, make sure to turn code minification off. - For push notifications, run `npx web-push generate-vapid-keys`, then put the public and private keys into Control Panel > General > ServiceWorker. - For translations, make a [DeepL](https://deepl.com) account and generate an API key, then put it into Control Panel > General > DeepL Translation. diff --git a/calckey.apache.conf b/calckey.apache.conf new file mode 100644 index 000000000..b0c69d51d --- /dev/null +++ b/calckey.apache.conf @@ -0,0 +1,13 @@ +# Replace example.tld with your domain + + + ServerName example.tld + # For WebSocket + ProxyPass "/streaming" "ws://127.0.0.1:3000/streaming/" + # Proxy to Node + ProxyPass "/" "http://127.0.0.1:3000/" + ProxyPassReverse "/" "http://127.0.0.1:3000/" + ProxyPreserveHost On + # For files proxy + AllowEncodedSlashes On + \ No newline at end of file diff --git a/chart/.helmignore b/chart/.helmignore new file mode 100644 index 000000000..0e8a0eb36 --- /dev/null +++ b/chart/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/chart/Chart.yaml b/chart/Chart.yaml index 8f31cf7fb..dfd476dad 100644 --- a/chart/Chart.yaml +++ b/chart/Chart.yaml @@ -1,3 +1,38 @@ apiVersion: v2 -name: misskey -version: 0.0.0 +name: calckey +description: A fun, new, open way to experience social media https://calckey.org + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "rc" + +dependencies: + - name: elasticsearch + version: 19.0.1 + repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami + condition: elasticsearch.enabled + - name: postgresql + version: 11.1.3 + repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami + condition: postgresql.enabled + - name: redis + version: 16.13.2 + repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami + condition: redis.enabled diff --git a/chart/README.md b/chart/README.md new file mode 100644 index 000000000..a04b3d29a --- /dev/null +++ b/chart/README.md @@ -0,0 +1,83 @@ +# calckey + +![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: rc](https://img.shields.io/badge/AppVersion-rc-informational?style=flat-square) + +A fun, new, open way to experience social media https://calckey.org + +## Requirements + +| Repository | Name | Version | +|------------|------|---------| +| https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami | elasticsearch | 19.0.1 | +| https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami | postgresql | 11.1.3 | +| https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami | redis | 16.13.2 | + +## Values + +| Key | Type | Default | Description | +|-----|------|---------|-------------| +| affinity | object | `{}` | | +| autoscaling.enabled | bool | `false` | | +| autoscaling.maxReplicas | int | `100` | | +| autoscaling.minReplicas | int | `1` | | +| autoscaling.targetCPUUtilizationPercentage | int | `80` | | +| calckey.allowedPrivateNetworks | list | `[]` | If you want to allow calckey to connect to private ips, enter the cidrs here. | +| calckey.domain | string | `"calckey.local"` | | +| calckey.isManagedHosting | bool | `true` | | +| calckey.objectStorage.access_key | string | `""` | | +| calckey.objectStorage.access_secret | string | `""` | | +| calckey.objectStorage.baseUrl | string | `""` | | +| calckey.objectStorage.bucket | string | `""` | | +| calckey.objectStorage.endpoint | string | `""` | | +| calckey.objectStorage.managed | bool | `true` | | +| calckey.objectStorage.prefix | string | `"files"` | | +| calckey.objectStorage.region | string | `""` | | +| calckey.reservedUsernames[0] | string | `"root"` | | +| calckey.reservedUsernames[1] | string | `"admin"` | | +| calckey.reservedUsernames[2] | string | `"administrator"` | | +| calckey.reservedUsernames[3] | string | `"me"` | | +| calckey.reservedUsernames[4] | string | `"system"` | | +| calckey.smtp.from_address | string | `"notifications@example.com"` | | +| calckey.smtp.login | string | `""` | | +| calckey.smtp.managed | bool | `true` | | +| calckey.smtp.password | string | `""` | | +| calckey.smtp.port | int | `587` | | +| calckey.smtp.server | string | `"smtp.mailgun.org"` | | +| calckey.smtp.useImplicitSslTls | bool | `false` | | +| elasticsearch | object | `{"auth":null,"enabled":false,"hostname":"","port":9200,"ssl":false}` | https://github.com/bitnami/charts/tree/master/bitnami/elasticsearch#parameters | +| fullnameOverride | string | `""` | | +| image.pullPolicy | string | `"IfNotPresent"` | | +| image.repository | string | `"docker.io/thatonecalculator/calckey"` | | +| image.tag | string | `""` | | +| imagePullSecrets | list | `[]` | | +| ingress.annotations | object | `{}` | | +| ingress.className | string | `""` | | +| ingress.enabled | bool | `false` | | +| ingress.hosts[0].host | string | `"chart-example.local"` | | +| ingress.hosts[0].paths[0].path | string | `"/"` | | +| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` | | +| ingress.tls | list | `[]` | | +| nameOverride | string | `""` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podSecurityContext | object | `{}` | | +| postgresql.auth.database | string | `"calckey_production"` | | +| postgresql.auth.password | string | `""` | | +| postgresql.auth.username | string | `"calckey"` | | +| postgresql.enabled | bool | `true` | disable if you want to use an existing db; in which case the values below must match those of that external postgres instance | +| redis.auth.password | string | `""` | you must set a password; the password generated by the redis chart will be rotated on each upgrade: | +| redis.enabled | bool | `true` | | +| redis.hostname | string | `""` | | +| redis.port | int | `6379` | | +| replicaCount | int | `1` | | +| resources | object | `{}` | | +| securityContext | object | `{}` | | +| service.port | int | `80` | | +| service.type | string | `"ClusterIP"` | | +| serviceAccount.annotations | object | `{}` | | +| serviceAccount.create | bool | `true` | | +| serviceAccount.name | string | `""` | | +| tolerations | list | `[]` | | + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.11.0](https://github.com/norwoodj/helm-docs/releases/v1.11.0) diff --git a/chart/files/default.yml b/chart/files/default.yml deleted file mode 100644 index 91a947f26..000000000 --- a/chart/files/default.yml +++ /dev/null @@ -1,162 +0,0 @@ -#โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” -# Misskey configuration -#โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” - -# โ”Œโ”€โ”€โ”€โ”€โ”€โ” -#โ”€โ”€โ”€โ”˜ URL โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ - -# Final accessible URL seen by a user. -# url: https://example.tld/ - -# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE -# URL SETTINGS AFTER THAT! - -# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -#โ”€โ”€โ”€โ”˜ Port and TLS settings โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ - -# -# Misskey supports two deployment options for public. -# - -# Option 1: With Reverse Proxy -# -# +----- https://example.tld/ ------------+ -# +------+ |+-------------+ +----------------+| -# | User | ---> || Proxy (443) | ---> | Misskey (3000) || -# +------+ |+-------------+ +----------------+| -# +---------------------------------------+ -# -# You need to setup reverse proxy. (eg. nginx) -# You do not define 'https' section. - -# Option 2: Standalone -# -# +- https://example.tld/ -+ -# +------+ | +---------------+ | -# | User | ---> | | Misskey (443) | | -# +------+ | +---------------+ | -# +------------------------+ -# -# You need to run Misskey as root. -# You need to set Certificate in 'https' section. - -# To use option 1, uncomment below line. -port: 3000 # A port that your Misskey server should listen. - -# To use option 2, uncomment below lines. -#port: 443 - -#https: -# # path for certification -# key: /etc/letsencrypt/live/example.tld/privkey.pem -# cert: /etc/letsencrypt/live/example.tld/fullchain.pem - -# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -#โ”€โ”€โ”€โ”˜ PostgreSQL configuration โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ - -db: - host: localhost - port: 5432 - - # Database name - db: misskey - - # Auth - user: example-misskey-user - pass: example-misskey-pass - - # Whether disable Caching queries - #disableCache: true - - # Extra Connection options - #extra: - # ssl: true - -# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -#โ”€โ”€โ”€โ”˜ Redis configuration โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ - -redis: - host: localhost - port: 6379 - #pass: example-pass - #prefix: example-prefix - #db: 1 - -# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -#โ”€โ”€โ”€โ”˜ Elasticsearch configuration โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ - -#elasticsearch: -# host: localhost -# port: 9200 -# ssl: false -# user: -# pass: - -# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -#โ”€โ”€โ”€โ”˜ ID generation โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ - -# You can select the ID generation method. -# You don't usually need to change this setting, but you can -# change it according to your preferences. - -# Available methods: -# aid ... Short, Millisecond accuracy -# meid ... Similar to ObjectID, Millisecond accuracy -# ulid ... Millisecond accuracy -# objectid ... This is left for backward compatibility - -# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE -# ID SETTINGS AFTER THAT! - -id: "aid" -# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -#โ”€โ”€โ”€โ”˜ Other configuration โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ - -# Whether disable HSTS -#disableHsts: true - -# Number of worker processes -#clusterLimit: 1 - -# Job concurrency per worker -# deliverJobConcurrency: 128 -# inboxJobConcurrency: 16 - -# Job rate limiter -# deliverJobPerSec: 128 -# inboxJobPerSec: 16 - -# Job attempts -# deliverJobMaxAttempts: 12 -# inboxJobMaxAttempts: 8 - -# IP address family used for outgoing request (ipv4, ipv6 or dual) -#outgoingAddressFamily: ipv4 - -# Syslog option -#syslog: -# host: localhost -# port: 514 - -# Proxy for HTTP/HTTPS -#proxy: http://127.0.0.1:3128 - -#proxyBypassHosts: [ -# 'example.com', -# '192.0.2.8' -#] - -# Proxy for SMTP/SMTPS -#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT -#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4 -#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5 - -# Media Proxy -#mediaProxy: https://example.com/proxy - -#allowedPrivateNetworks: [ -# '127.0.0.1/32' -#] - -# Upload or download file size limits (bytes) -#maxFileSize: 262144000 diff --git a/chart/templates/ConfigMap.yml b/chart/templates/ConfigMap.yml deleted file mode 100644 index 37c25e086..000000000 --- a/chart/templates/ConfigMap.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ include "misskey.fullname" . }}-configuration -data: - default.yml: |- - {{ .Files.Get "files/default.yml"|nindent 4 }} - url: {{ .Values.url }} diff --git a/chart/templates/Deployment.yml b/chart/templates/Deployment.yml deleted file mode 100644 index d16aece91..000000000 --- a/chart/templates/Deployment.yml +++ /dev/null @@ -1,47 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "misskey.fullname" . }} - labels: - {{- include "misskey.labels" . | nindent 4 }} -spec: - selector: - matchLabels: - {{- include "misskey.selectorLabels" . | nindent 6 }} - replicas: 1 - template: - metadata: - labels: - {{- include "misskey.selectorLabels" . | nindent 8 }} - spec: - containers: - - name: misskey - image: {{ .Values.image }} - env: - - name: NODE_ENV - value: {{ .Values.environment }} - volumeMounts: - - name: {{ include "misskey.fullname" . }}-configuration - mountPath: /misskey/.config - readOnly: true - ports: - - containerPort: 3000 - - name: postgres - image: postgres:14-alpine - env: - - name: POSTGRES_USER - value: "example-misskey-user" - - name: POSTGRES_PASSWORD - value: "example-misskey-pass" - - name: POSTGRES_DB - value: "misskey" - ports: - - containerPort: 5432 - - name: redis - image: redis:alpine - ports: - - containerPort: 6379 - volumes: - - name: {{ include "misskey.fullname" . }}-configuration - configMap: - name: {{ include "misskey.fullname" . }}-configuration diff --git a/chart/templates/NOTES.txt b/chart/templates/NOTES.txt new file mode 100644 index 000000000..d3e4f2f20 --- /dev/null +++ b/chart/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "calckey.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "calckey.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "calckey.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "calckey.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/chart/templates/Service.yml b/chart/templates/Service.yml deleted file mode 100644 index 320958129..000000000 --- a/chart/templates/Service.yml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "misskey.fullname" . }} - annotations: - dev.okteto.com/auto-ingress: "true" -spec: - type: ClusterIP - ports: - - port: 3000 - protocol: TCP - name: http - selector: - {{- include "misskey.selectorLabels" . | nindent 4 }} diff --git a/chart/templates/_helpers.tpl b/chart/templates/_helpers.tpl index a5a2499f3..00702ec34 100644 --- a/chart/templates/_helpers.tpl +++ b/chart/templates/_helpers.tpl @@ -1,7 +1,7 @@ {{/* Expand the name of the chart. */}} -{{- define "misskey.name" -}} +{{- define "calckey.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} {{- end }} @@ -10,7 +10,7 @@ Create a default fully qualified app name. We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). If release name contains chart name it will be used as a full name. */}} -{{- define "misskey.fullname" -}} +{{- define "calckey.fullname" -}} {{- if .Values.fullnameOverride }} {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} {{- else }} @@ -26,16 +26,16 @@ If release name contains chart name it will be used as a full name. {{/* Create chart name and version as used by the chart label. */}} -{{- define "misskey.chart" -}} +{{- define "calckey.chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} {{- end }} {{/* Common labels */}} -{{- define "misskey.labels" -}} -helm.sh/chart: {{ include "misskey.chart" . }} -{{ include "misskey.selectorLabels" . }} +{{- define "calckey.labels" -}} +helm.sh/chart: {{ include "calckey.chart" . }} +{{ include "calckey.selectorLabels" . }} {{- if .Chart.AppVersion }} app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} {{- end }} @@ -45,18 +45,274 @@ app.kubernetes.io/managed-by: {{ .Release.Service }} {{/* Selector labels */}} -{{- define "misskey.selectorLabels" -}} -app.kubernetes.io/name: {{ include "misskey.name" . }} +{{- define "calckey.selectorLabels" -}} +app.kubernetes.io/name: {{ include "calckey.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} {{- end }} {{/* Create the name of the service account to use */}} -{{- define "misskey.serviceAccountName" -}} +{{- define "calckey.serviceAccountName" -}} {{- if .Values.serviceAccount.create }} -{{- default (include "misskey.fullname" .) .Values.serviceAccount.name }} +{{- default (include "calckey.fullname" .) .Values.serviceAccount.name }} {{- else }} {{- default "default" .Values.serviceAccount.name }} {{- end }} {{- end }} + +{{/* +Create a default fully qualified name for dependent services. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "calckey.elasticsearch.fullname" -}} +{{- printf "%s-%s" .Release.Name "elasticsearch" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "calckey.redis.fullname" -}} +{{- printf "%s-%s" .Release.Name "redis" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "calckey.postgresql.fullname" -}} +{{- printf "%s-%s" .Release.Name "postgresql" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +config/default.yml content +*/}} +{{- define "calckey.configDir.default.yml" -}} +#โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” +# Calckey configuration +#โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” + +# โ”Œโ”€โ”€โ”€โ”€โ”€โ” +#โ”€โ”€โ”€โ”˜ URL โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +# Final accessible URL seen by a user. +url: "https://{{ .Values.calckey.domain }}/" + +# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE +# URL SETTINGS AFTER THAT! + +# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +#โ”€โ”€โ”€โ”˜ Port and TLS settings โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +# +# Misskey requires a reverse proxy to support HTTPS connections. +# +# +----- https://example.tld/ ------------+ +# +------+ |+-------------+ +----------------+| +# | User | ---> || Proxy (443) | ---> | Misskey (3000) || +# +------+ |+-------------+ +----------------+| +# +---------------------------------------+ +# +# You need to set up a reverse proxy. (e.g. nginx) +# An encrypted connection with HTTPS is highly recommended +# because tokens may be transferred in GET requests. + +# The port that your Misskey server should listen on. +port: 3000 + +# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +#โ”€โ”€โ”€โ”˜ PostgreSQL configuration โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +db: + {{- if .Values.postgresql.enabled }} + host: {{ template "calckey.postgresql.fullname" . }} + port: '5432' + {{- else }} + host: {{ .Values.postgresql.postgresqlHostname }} + port: {{ .Values.postgresql.postgresqlPort | default "5432" | quote }} + {{- end }} + + # Database name + db: {{ .Values.postgresql.auth.database }} + + # Auth + user: {{ .Values.postgresql.auth.username }} + pass: "{{ .Values.postgresql.auth.password }}" + + # Whether disable Caching queries + #disableCache: true + + # Extra Connection options + #extra: + # ssl: true + +# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +#โ”€โ”€โ”€โ”˜ Redis configuration โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +redis: + {{- if .Values.redis.enabled }} + host: {{ template "calckey.redis.fullname" . }}-master + {{- else }} + host: {{ required "When the redis chart is disabled .Values.redis.hostname is required" .Values.redis.hostname }} + {{- end }} + port: {{ .Values.redis.port | default "6379" | quote }} + #family: 0 # 0=Both, 4=IPv4, 6=IPv6 + pass: {{ .Values.redis.auth.password | quote }} + #prefix: example-prefix + #db: 1 + +# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +#โ”€โ”€โ”€โ”˜ Sonic configuration โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +#sonic: +# host: localhost +# port: 1491 +# auth: SecretPassword +# collection: notes +# bucket: default + +# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +#โ”€โ”€โ”€โ”˜ Elasticsearch configuration โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +{{- if .Values.elasticsearch.enabled }} +elasticsearch: + host: {{ template "mastodon.elasticsearch.fullname" . }}-master-hl + port: 9200 + ssl: false +{{- else if .Values.elasticsearch.hostname }} +elasticsearch: + host: {{ .Values.elasticsearch.hostname | quote }} + port: {{ .Values.elasticsearch.port }} + ssl: {{ .Values.elasticsearch.ssl }} + {{- if .Values.elasticsearch.auth }} + user: {{ .Values.elasticsearch.auth.username | quote }} + pass: {{ .Values.elasticsearch.auth.password | quote }} + {{- end }} +{{- end }} + +# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +#โ”€โ”€โ”€โ”˜ ID generation โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +# You can select the ID generation method. +# You don't usually need to change this setting, but you can +# change it according to your preferences. + +# Available methods: +# aid ... Short, Millisecond accuracy +# meid ... Similar to ObjectID, Millisecond accuracy +# ulid ... Millisecond accuracy +# objectid ... This is left for backward compatibility + +# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE +# ID SETTINGS AFTER THAT! + +id: 'aid' + +# โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +#โ”€โ”€โ”€โ”˜ Other configuration โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +# Max note length, should be < 8000. +#maxNoteLength: 3000 + +# Maximum lenght of an image caption or file comment (default 1500, max 8192) +#maxCaptionLength: 1500 + +# Reserved usernames that only the administrator can register with +reservedUsernames: +{{ .Values.calckey.reservedUsernames | toYaml }} + +# Whether disable HSTS +#disableHsts: true + +# Number of worker processes +#clusterLimit: 1 + +# Job concurrency per worker +# deliverJobConcurrency: 128 +# inboxJobConcurrency: 16 + +# Job rate limiter +# deliverJobPerSec: 128 +# inboxJobPerSec: 16 + +# Job attempts +# deliverJobMaxAttempts: 12 +# inboxJobMaxAttempts: 8 + +# IP address family used for outgoing request (ipv4, ipv6 or dual) +#outgoingAddressFamily: ipv4 + +# Syslog option +#syslog: +# host: localhost +# port: 514 + +# Proxy for HTTP/HTTPS +#proxy: http://127.0.0.1:3128 + +#proxyBypassHosts: [ +# 'example.com', +# '192.0.2.8' +#] + +# Proxy for SMTP/SMTPS +#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT +#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4 +#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5 + +# Media Proxy +#mediaProxy: https://example.com/proxy + +# Proxy remote files (default: false) +#proxyRemoteFiles: true + +allowedPrivateNetworks: +{{ .Values.calckey.allowedPrivateNetworks | toYaml }} + +# TWA +#twa: +# nameSpace: android_app +# packageName: tld.domain.twa +# sha256CertFingerprints: ['AB:CD:EF'] + +# Upload or download file size limits (bytes) +#maxFileSize: 262144000 + +# Managed hosting settings +# !!!!!!!!!! +# >>>>>> NORMAL SELF-HOSTERS, STAY AWAY! <<<<<< +# >>>>>> YOU DON'T NEED THIS! <<<<<< +# !!!!!!!!!! +# Each category is optional, but if each item in each category is mandatory! +# If you mess this up, that's on you, you've been warned... + +#maxUserSignups: 100 +isManagedHosting: {{ .Values.calckey.isManagedHosting }} +deepl: + managed: false +# authKey: '' +# isPro: false +# +email: + managed: {{ .Values.calckey.smtp.managed }} + address: {{ .Values.calckey.smtp.from_address | quote }} + host: {{ .Values.calckey.smtp.server | quote }} + port: {{ .Values.calckey.smtp.port }} + user: {{ .Values.calckey.smtp.login | quote }} + pass: {{ .Values.calckey.smtp.password | quote }} + useImplicitSslTls: {{ .Values.calckey.smtp.useImplicitSslTls }} +objectStorage: + managed: {{ .Values.calckey.objectStorage.managed }} + baseUrl: {{ .Values.calckey.objectStorage.baseUrl | quote }} + bucket: {{ .Values.calckey.objectStorage.bucket | quote }} + prefix: {{ .Values.calckey.objectStorage.prefix | quote }} + endpoint: {{ .Values.calckey.objectStorage.endpoint | quote }} + region: {{ .Values.calckey.objectStorage.region | quote }} + accessKey: {{ .Values.calckey.objectStorage.access_key | quote }} + secretKey: {{ .Values.calckey.objectStorage.access_secret | quote }} + useSsl: true + connnectOverProxy: false + setPublicReadOnUpload: true + s3ForcePathStyle: true + +# !!!!!!!!!! +# >>>>>> AGAIN, NORMAL SELF-HOSTERS, STAY AWAY! <<<<<< +# >>>>>> YOU DON'T NEED THIS, ABOVE SETTINGS ARE FOR MANAGED HOSTING ONLY! <<<<<< +# !!!!!!!!!! + +# Seriously. Do NOT fill out the above settings if you're self-hosting. +# They're much better off being set from the control panel. +{{- end }} diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml new file mode 100644 index 000000000..5bcf8851a --- /dev/null +++ b/chart/templates/deployment.yaml @@ -0,0 +1,78 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "calckey.fullname" . }} + labels: + {{- include "calckey.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "calckey.selectorLabels" . | nindent 6 }} + template: + metadata: + annotations: + checksum/secret-config: {{ include ( print $.Template.BasePath "/secret-config.yaml" ) . | sha256sum | quote }} + {{- with .Values.podAnnotations }} + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "calckey.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "calckey.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + volumes: + - name: config-volume + secret: + secretName: {{ template "calckey.fullname" . }}-config + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: "NODE_ENV" + value: "production" + volumeMounts: + - name: config-volume + mountPath: /calckey/.config + ports: + - name: http + containerPort: 3000 + protocol: TCP + startupProbe: + httpGet: + path: / + port: http + failureThreshold: 30 + periodSeconds: 10 + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/chart/templates/hpa.yaml b/chart/templates/hpa.yaml new file mode 100644 index 000000000..4cdd2b625 --- /dev/null +++ b/chart/templates/hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "calckey.fullname" . }} + labels: + {{- include "calckey.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "calckey.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/chart/templates/ingress.yaml b/chart/templates/ingress.yaml new file mode 100644 index 000000000..212c40e4b --- /dev/null +++ b/chart/templates/ingress.yaml @@ -0,0 +1,61 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "calckey.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "calckey.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/chart/templates/secret-config.yaml b/chart/templates/secret-config.yaml new file mode 100644 index 000000000..2dad134c5 --- /dev/null +++ b/chart/templates/secret-config.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ template "calckey.fullname" . }}-config + labels: + {{- include "calckey.labels" . | nindent 4 }} +type: Opaque +data: + default.yml: {{ include "calckey.configDir.default.yml" . | b64enc }} diff --git a/chart/templates/service.yaml b/chart/templates/service.yaml new file mode 100644 index 000000000..d46067a40 --- /dev/null +++ b/chart/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "calckey.fullname" . }} + labels: + {{- include "calckey.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "calckey.selectorLabels" . | nindent 4 }} diff --git a/chart/templates/serviceaccount.yaml b/chart/templates/serviceaccount.yaml new file mode 100644 index 000000000..f269ad028 --- /dev/null +++ b/chart/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "calckey.serviceAccountName" . }} + labels: + {{- include "calckey.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/chart/templates/tests/test-connection.yaml b/chart/templates/tests/test-connection.yaml new file mode 100644 index 000000000..b8db3d9a1 --- /dev/null +++ b/chart/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "calckey.fullname" . }}-test-connection" + labels: + {{- include "calckey.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "calckey.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/chart/values.yaml b/chart/values.yaml new file mode 100644 index 000000000..1f8f8c8f7 --- /dev/null +++ b/chart/values.yaml @@ -0,0 +1,158 @@ +# Default values for calckey. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: docker.io/thatonecalculator/calckey + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "" + +calckey: + isManagedHosting: true + domain: calckey.local + + smtp: + managed: true + from_address: notifications@example.com + port: 587 + server: smtp.mailgun.org + useImplicitSslTls: false + login: "" + password: "" + + objectStorage: + managed: true + access_key: "" + access_secret: "" + baseUrl: "" # e.g. "https://my-bucket.nyc3.cdn.digitaloceanspaces.com" + bucket: "" # e.g. "my-bucket" + prefix: files + endpoint: "" # e.g. "nyc3.digitaloceanspaces.com:443" + region: "" # e.g. "nyc3" + + # -- If you want to allow calckey to connect to private ips, enter the cidrs here. + allowedPrivateNetworks: [] + # - "10.0.0.0/8" + + reservedUsernames: + - root + - admin + - administrator + - me + - system + +# https://github.com/bitnami/charts/tree/master/bitnami/postgresql#parameters +postgresql: + # -- disable if you want to use an existing db; in which case the values below + # must match those of that external postgres instance + enabled: true + # postgresqlHostname: preexisting-postgresql + # postgresqlPort: 5432 + auth: + database: calckey_production + username: calckey + # you must set a password; the password generated by the postgresql chart will + # be rotated on each upgrade: + # https://github.com/bitnami/charts/tree/master/bitnami/postgresql#upgrade + password: "" + +# https://github.com/bitnami/charts/tree/master/bitnami/redis#parameters +redis: + # disable if you want to use an existing redis instance; in which case the + # values below must match those of that external redis instance + enabled: true + hostname: "" + port: 6379 + auth: + # -- you must set a password; the password generated by the redis chart will be + # rotated on each upgrade: + password: "" + +# -- https://github.com/bitnami/charts/tree/master/bitnami/elasticsearch#parameters +elasticsearch: + # disable if you want to use an existing redis instance; in which case the + # values below must match those of that external elasticsearch instance + enabled: false + hostname: "" + port: 9200 + ssl: false + auth: {} + # username: "" + # password: "" + # @ignored + image: + tag: 7 + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/chart/values.yml b/chart/values.yml deleted file mode 100644 index a7031538a..000000000 --- a/chart/values.yml +++ /dev/null @@ -1,3 +0,0 @@ -url: https://example.tld/ -image: okteto.dev/misskey -environment: production diff --git a/cypress/e2e/widgets.cy.js b/cypress/e2e/widgets.cy.js index db35a60b5..9eea010bd 100644 --- a/cypress/e2e/widgets.cy.js +++ b/cypress/e2e/widgets.cy.js @@ -2,7 +2,6 @@ describe('After user signed in', () => { beforeEach(() => { cy.resetState(); cy.viewport('macbook-16'); - // ใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นๅˆๆœŸใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ— cy.registerUser('admin', 'pass', true); diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 000000000..41d1b3469 --- /dev/null +++ b/docs/development.md @@ -0,0 +1,22 @@ +# ๐ŸŒŽ Calckey Developer Docs + +## Nix Dev Environment +The Calckey repo comes with a Nix-based shell environment to help make development as easy as possible! + +Please note, however, that this environment will not work on Windows outside of a WSL2 environment. + +### Prerequisites + +- Installed the [Nix Package Manager](https://nixos.org/download.html) +- Installed [direnv](https://direnv.net/docs/installation.html) and added its hook to your shell. + +Once the repo is cloned to your computer, follow these next few steps inside the Calckey folder: + +- Run `direnv allow`. This will build the environment and install all needed tools. +- Run `install-deps`, then `prepare-config`, to install the node dependencies and prepare the needed config files. +- In a second terminal, run `devenv up`. This will spawn a **Redis** server, a **Postgres** server, and the **Calckey** server in dev mode. +- Once you see the Calckey banner printed in your second terminal, run `migrate` in the first. +- Once migrations finish, open http://localhost:3000 in your web browser. +- You should now see the admin user creation screen! + +Note: When you want to restart a dev server, all you need to do is run `devenv up`, no other steps are necessary. diff --git a/docs/kubernetes.md b/docs/kubernetes.md new file mode 100644 index 000000000..710d0dee0 --- /dev/null +++ b/docs/kubernetes.md @@ -0,0 +1,45 @@ +# Running a Calckey instance with Kubernetes and Helm + +This is a [Helm](https://helm.sh/) chart directory in the root of the project +that you can use to deploy calckey to a Kubernetes cluster + +## Deployment + +1. Copy the example helm values and make your changes: +```shell +cp .config/helm_values_example.yml .config/helm_values.yml +``` + +2. Update helm dependencies: +```shell +cd chart +helm dependency list $dir 2> /dev/null | tail +2 | head -n -1 | awk '{ print "helm repo add " $1 " " $3 }' | while read cmd; do $cmd; done; +cd ../ +``` + +3. Create the calckey helm release (also used to update existing deployment): +```shell +helm upgrade \ + --install \ + --namespace calckey \ + --create-namespace \ + calckey chart/ \ + -f .config/helm_values.yml +``` + +4. Watch your calckey instance spin up: +```shell +kubectl -n calckey get po -w +``` + +5. Initial the admin user and managed config: +```shell +export CALCKEY_USERNAME="my_desired_admin_handle" && \ +export CALCKEY_PASSWORD="myDesiredInitialPassword" && \ +export CALCKEY_HOST="calckey.example.com" && \ +export CALCKEY_TOKEN=$(curl -X POST https://$CALCKEY_HOST/api/admin/accounts/create -H "Content-Type: application/json" -d "{ \"username\":\"$CALCKEY_USERNAME\", \"password\":\"$CALCKEY_PASSWORD\" }" | jq -r '.token') && \ +echo "Save this token: ${CALCKEY_TOKEN}" && \ +curl -X POST -H "Authorization: Bearer $CALCKEY_TOKEN" https://$CALCKEY_HOST/api/admin/accounts/hosted +``` + +6. Enjoy! diff --git a/flake.lock b/flake.lock new file mode 100644 index 000000000..c07493140 --- /dev/null +++ b/flake.lock @@ -0,0 +1,294 @@ +{ + "nodes": { + "devenv": { + "inputs": { + "flake-compat": "flake-compat", + "nix": "nix", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1682953188, + "narHash": "sha256-MFH6yK7QnEV6+T96Pt++lH8ozDn4YqzaOXAS6u5h3mM=", + "owner": "cachix", + "repo": "devenv", + "rev": "c388b8c57116a71174d26b09c0c38b4b6b5bac3a", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "fenix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "rust-analyzer-src": "rust-analyzer-src" + }, + "locked": { + "lastModified": 1682922129, + "narHash": "sha256-qnhkfksuuSLbN5UJM+KSCMSRC13bXosr6Ed3NwerRno=", + "owner": "nix-community", + "repo": "fenix", + "rev": "c1f90f80ba4d60bea60685dd4515fb22d53279cc", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "fenix", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1680392223, + "narHash": "sha256-n3g7QFr85lDODKt250rkZj2IFS3i4/8HBU2yKHO3tqw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "dcc36e45d054d7bb554c9cdab69093debd91a0b5", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "lowdown-src": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "nix": { + "inputs": { + "lowdown-src": "lowdown-src", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression" + }, + "locked": { + "lastModified": 1676545802, + "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "owner": "domenkozar", + "repo": "nix", + "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "relaxed-flakes", + "repo": "nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1677534593, + "narHash": "sha256-PuZSAHeq4/9pP/uYH1FcagQ3nLm/DrDrvKi/xC9glvw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ad64d9e2d5bf80c877286102355b1625891ae9a", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1680213900, + "narHash": "sha256-cIDr5WZIj3EkKyCgj/6j3HBH4Jj1W296z7HTcWj1aMA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e3652e0735fbec227f342712f180f4f21f0594f2", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-regression": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1673800717, + "narHash": "sha256-SFHraUqLSu5cC6IxTprex/nTsI81ZQAtDvlBvGDWfnA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2f9fd351ec37f5d479556cd48be4ca340da59b8f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-22.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1682929865, + "narHash": "sha256-jxVrgnf5QNjO+XoxDxUWtN2G5xyJSGZ5SWDQFxMuHxc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "f2e9a130461950270f87630b11132323706b4d91", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "flake-utils": "flake-utils", + "gitignore": "gitignore", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1677160285, + "narHash": "sha256-tBzpCjMP+P3Y3nKLYvdBkXBg3KvTMo3gvi8tLQaqXVY=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "2bd861ab81469428d9c823ef72c4bb08372dd2c4", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "fenix": "fenix", + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs_2" + } + }, + "rust-analyzer-src": { + "flake": false, + "locked": { + "lastModified": 1682886915, + "narHash": "sha256-FPQKPvlHIU2DsDF6GMoRtrZhil0vHi6MFd8vpKEx/n8=", + "owner": "rust-lang", + "repo": "rust-analyzer", + "rev": "3a27518fee5a723005299cf49e2d58a842a261ca", + "type": "github" + }, + "original": { + "owner": "rust-lang", + "ref": "nightly", + "repo": "rust-analyzer", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 000000000..73d8fe02f --- /dev/null +++ b/flake.nix @@ -0,0 +1,86 @@ +{ + description = "Calckey development flake"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + # Flake Parts framework(https://flake.parts) + flake-parts.url = "github:hercules-ci/flake-parts"; + # Devenv for better devShells(https://devenv.sh) + devenv.url = "github:cachix/devenv"; + # Fenix for rust development + fenix.url = "github:nix-community/fenix"; + fenix.inputs.nixpkgs.follows = "nixpkgs"; + }; + outputs = inputs@{ flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + inputs.devenv.flakeModule + ]; + + # Define the systems that this works on. Only tested with x66_64-linux, add more if you test and it works. + systems = [ + "x86_64-linux" + ]; + # Expose these attributes for every system defined above. + perSystem = { config, pkgs, ... }: { + # Devenv shells + devenv = { + shells = { + # The default shell, used by nix-direnv + default = { + name = "calckey-dev-shell"; + # Add additional packages to our environment + packages = [ + pkgs.nodePackages.pnpm + + pkgs.python3 + ]; + # No need to warn on a new version, we'll update as needed. + devenv.warnOnNewVersion = false; + # Enable typescript support + languages.typescript.enable = true; + # Enable javascript for NPM and PNPM + languages.javascript.enable = true; + languages.javascript.package = pkgs.nodejs_19; + # Enable stable Rust for the backend + languages.rust.enable = true; + languages.rust.version = "stable"; + processes = { + dev-server.exec = "pnpm run dev"; + }; + scripts = { + build.exec = "pnpm run build"; + clean.exec = "pnpm run clean"; + clear-state.exec = "rm -rf .devenv/state/redis .devenv/state/postgres"; + format.exec = "pnpm run format"; + install-deps.exec = "pnpm install"; + migrate.exec = "pnpm run migrate"; + prepare-config.exec = "cp .config/devenv.yml .config/default.yml"; + }; + services = { + postgres = { + enable = true; + package = pkgs.postgresql_12; + initialDatabases = [{ + name = "calckey"; + }]; + initialScript = '' + CREATE USER calckey WITH PASSWORD 'calckey'; + ALTER USER calckey WITH SUPERUSER; + GRANT ALL ON DATABASE calckey TO calckey; + ''; + listen_addresses = "127.0.0.1"; + port = 5432; + }; + redis = { + enable = true; + bind = "127.0.0.1"; + port = 6379; + }; + }; + }; + }; + }; + }; + }; +} diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index a99a77256..86d3fa992 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -1,18 +1,18 @@ _lang_: "Catalร " -headlineMisskey: "Una xarxa social de codi obert, descentralitzada i gratuita per\ - \ sempre \U0001F680" -introMisskey: "Benvinguts! Calckey es una plataforma social de codi obert, descentralitzada\ - \ i gratuita per sempre! \U0001F680" +headlineMisskey: "Una xarxa social de codi obert, descentralitzada i gratuรฏta per\ + \ a sempre! \U0001F680" +introMisskey: "Benvinguts! Calckey รฉs una plataforma social de codi obert, descentralitzada\ + \ i gratuรฏta per a sempre! \U0001F680" monthAndDay: "{day}/{month}" -search: "Cercar" +search: "Cerca" notifications: "Notificacions" username: "Nom d'usuari" password: "Contrasenya" forgotPassword: "Contrasenya oblidada" fetchingAsApObject: "Cercant en el Fediverse" -ok: "OK" +ok: "D'acord" gotIt: "Ho he entรจs!" -cancel: "Cancelยทlar" +cancel: "Cancelยทla" enterUsername: "Introdueix el teu nom d'usuari" renotedBy: "Impulsat per {user}" noNotes: "Cap publicaciรณ" @@ -21,69 +21,69 @@ instance: "Instร ncia" settings: "Preferรจncies" basicSettings: "Configuraciรณ bร sica" otherSettings: "Altres opcions" -openInWindow: "Obrir en una finestra nova" +openInWindow: "Obre en una finestra nova" profile: "Perfil" timeline: "Lรญnia de temps" noAccountDescription: "Aquest usuari encara no ha escrit la seva biografia." -login: "Iniciar sessiรณ" +login: "Inicia sessiรณ" loggingIn: "Iniciant sessiรณ" -logout: "Tancar sessiรณ" -signup: "Registrar-se" -uploading: "Pujant..." -save: "Desar" +logout: "Tanca la sessiรณ" +signup: "Registra'm" +uploading: "S'estร  pujantโ€ฆ" +save: "Desa" users: "Usuaris" -addUser: "Afegir un usuari" -favorite: "Afegir a favorits" -favorites: "Favorits" -unfavorite: "Eliminar de favorits" -favorited: "Afegit a favorits." -alreadyFavorited: "Ja s'ha afegit a favorits." -cantFavorite: "No s'ha pogut afegir a favorits." -pin: "Fixar al perfil" -unpin: "Deixar de fixar al perfil" -copyContent: "Cรฒpia el contingut" -copyLink: "Cรฒpia l'enllaรง" -delete: "Esborra" -deleteAndEdit: "Esborrar i edita" -deleteAndEditConfirm: "Estร s segur que vols esborrar aquesta publicaciรณ i editar-la?\ - \ Perdrร s totes les reaccions, impulsos i respostes." -addToList: "Afegir a la llista" -sendMessage: "Enviar un missatge" -copyUsername: "Cรฒpia nom d'usuari" -searchUser: "Cercar un usuari" +addUser: "Afegeix un usuari" +favorite: "Afegeix als marcadors" +favorites: "Marcadors" +unfavorite: "Elimina dels marcadors" +favorited: "S'ha afegit el marcador." +alreadyFavorited: "Ja estร  afegida als marcadors." +cantFavorite: "No s'ha pogut afegir als marcadors." +pin: "Fixa al perfil" +unpin: "Deixa de fixar al perfil" +copyContent: "Copia el contingut" +copyLink: "Copia l'enllaรง" +delete: "Elimina" +deleteAndEdit: "Elimina i edita" +deleteAndEditConfirm: "Segur que vols eliminar la publicaciรณ i editar-la? Perdrร s\ + \ totes les reaccions, impulsos i respostes." +addToList: "Afegeix a la llista" +sendMessage: "Envia un missatge" +copyUsername: "Copia el nom d'usuari" +searchUser: "Cerca un usuari" reply: "Respon" -loadMore: "Carregar mรฉs" -showMore: "Veure mรฉs" +loadMore: "Carrega'n mรฉs" +showMore: "Mostra'n mรฉs" youGotNewFollower: "t'ha seguit" receiveFollowRequest: "Solยทlicitud de seguiment rebuda" followRequestAccepted: "Solยทlicitud de seguiment acceptada" mention: "Menciรณ" mentions: "Mencions" directNotes: "Missatges directes" -importAndExport: "Importar / Exportar Dades" -import: "Importar" -export: "Exportar" +importAndExport: "Importa/exporta dades" +import: "Importa" +export: "Exporta" files: "Fitxers" -download: "Descarregar" -driveFileDeleteConfirm: "Estร s segur que vols esborrar el fitxer \"{nom}\"? S'eliminarร \ - \ de totes les notes que el continguin com a fitxer adjunt." -unfollowConfirm: "Estร s segur que vols deixar de seguir {name}?" +download: "Baixa" +driveFileDeleteConfirm: "Segur que vols eliminar el fitxer ยซ{name}ยป? S'eliminarร  de\ + \ totes les notes que el continguin com a fitxer adjunt." +unfollowConfirm: "Segur que vols deixar de seguir {name}?" exportRequested: "Has solยทlicitat una exportaciรณ. Aixรฒ pot trigar una estona. S'afegirร \ \ al teu Disc un cop completada." importRequested: "Has solยทlicitat una importaciรณ. Aixรฒ pot trigar una estona." lists: "Llistes" -noLists: "No tens cap llista" +noLists: "No teniu cap llista" note: "Publicaciรณ" -notes: "Notes" +notes: "Publicacions" following: "Seguint" followers: "Seguidors" followsYou: "Et segueix" -createList: "Crear llista" -manageLists: "Gestionar les llistes" +createList: "Crea una llista" +manageLists: "Gestiona les llistes" error: "Error" somethingHappened: "S'ha produรฏt un error" retry: "Torna-ho a intentar" -pageLoadError: "Alguna cosa a sortit malament al carregar la pร gina." +pageLoadError: "S'ha produรฏt un error en carregar la pร gina." pageLoadErrorDescription: "Aixรฒ normalment es deu a errors de xarxa o a la memรฒria\ \ cau del navegador. Prova d'esborrar la memรฒria cau i torna-ho a provar desprรฉs\ \ d'esperar una estona." @@ -94,32 +94,32 @@ enterListName: "Introdueix un nom per a la llista" privacy: "Privadesa" makeFollowManuallyApprove: "Les solยทlicituds de seguiment requereixen aprovaciรณ" defaultNoteVisibility: "Visibilitat per defecte" -follow: "Seguir" -followRequest: "Enviar solยทlicitud de seguiment" +follow: "Segueix" +followRequest: "Segueix" followRequests: "Solยทlicituds de seguiment" -unfollow: "Deixar de seguir" +unfollow: "Deixa de seguir" followRequestPending: "Solยทlicituds de seguiment pendents" -enterEmoji: "Introduir un emoji" -renote: "Impuls" -unrenote: "Anulยทlar impuls" -renoted: "Impulsat." +enterEmoji: "Introdueix un emoji" +renote: "Impulsa" +unrenote: "Anulยทla l'impuls" +renoted: "S'ha impulsat." cantRenote: "Aquesta publicaciรณ no es pot impulsar." cantReRenote: "No es pot impulsar un impuls." quote: "Cita" pinnedNote: "Publicaciรณ fixada" -pinned: "Fixar al perfil" +pinned: "Fixa al perfil" you: "Tu" -clickToShow: "Fes clic per mostrar" +clickToShow: "Fes clic per a mostrar" sensitive: "NSFW" -add: "Afegir" +add: "Afegeix" reaction: "Reaccions" reactionSetting: "Reaccions a mostrar al selector de reaccions" reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, prem\ \ \"+\" per afegir." rememberNoteVisibility: "Recorda la configuraciรณ de visibilitat de les notes" -attachCancel: "Eliminar el fitxer adjunt" -markAsSensitive: "Marcar com a NSFW" -unmarkAsSensitive: "Desmarcar com a NSFW" +attachCancel: "Elimina el fitxer adjunt" +markAsSensitive: "Marca com a NSFW" +unmarkAsSensitive: "Desmarca com a NSFW" enterFileName: "Introdueix un nom de fitxer" mute: "Silencia" unmute: "Deixa de silenciar" @@ -128,7 +128,7 @@ unblock: "Desbloqueja" suspend: "Suspรจn" unsuspend: "Treu la suspensiรณ" instances: "Instร ncies" -remove: "Eliminar" +remove: "Elimina" nsfw: "NSFW" pinnedNotes: "Publicacions fixades" userList: "Llistes" @@ -738,39 +738,39 @@ _deck: swapLeft: Canvia amb la columna de l'esquerra renameProfile: Canvia el nom de l'espai de treball nameAlreadyExists: Aquest nom d'espai de treball ja existeix. -blockConfirm: Estรกs segur que vols bloquejar aquest compte? -unsuspendConfirm: Estรกs segur que vols treure la suspensiรณ d'aquest compte? -unblockConfirm: Estรกs segur que vols treure el bloqueig d'aquest compte? -suspendConfirm: Estรกs segur que vols suspendre aquest compte? +blockConfirm: Segur que vols bloquejar aquest compte? +unsuspendConfirm: Segur que vols treure la suspensiรณ d'aquest compte? +unblockConfirm: Segur que vols treure el bloqueig d'aquest compte? +suspendConfirm: Segur que vols suspendre aquest compte? selectList: Selecciona una llista selectAntenna: Selecciona una antena selectWidget: Selecciona un giny -editWidgets: Edita ginys +editWidgets: Edita els ginys editWidgetsExit: Fet -customEmojis: Emoji personalitzat -cacheRemoteFilesDescription: Quant aquesta opciรณ es deshabilitada, els fitxers remots - es carregant directament de l'instร ncia remota. Deshabilitar aixรฒ farร  que baixi - l'รบs d'emmagatzematge, perรฒ incrementa el trร fic, perquรจ les miniatures no es generarรกn. -flagAsBot: Marca aquest compte com un bot +customEmojis: Emojis personalitzats +cacheRemoteFilesDescription: Quan aquesta opciรณ estร  desactivada, els fitxers remots + es carreguin directament de la instร ncia remota. Desactivar-la farร  que baixi l'รบs + d'emmagatzematge, perรฒ incrementa el trร fic, perquรจ les miniatures no es generaran. +flagAsBot: Marca aquest compte com a bot flagAsBotDescription: Activa aquesta opciรณ si aquest compte รฉs controlat per un programa. Si s'activa, aixรฒ actuarร  com una bandera per a altres desenvolupadors i ajuda a prevenir cadenes de interaccions infinites amb altres bots a mรฉs d'ajustar els sistemes interns de Calckey per tractar aquest compte com un bot. flagAsCat: Ets un gat? ๐Ÿฑ -flagShowTimelineReplies: Mostrar respostes a la lรญnea de temps +flagShowTimelineReplies: Mostra respostes a la lรญnia de temps flagAsCatDescription: Guanyarร s unes orelles de gat i parlares com un gat! -flagShowTimelineRepliesDescription: Mostrarรก respostes d'usuaris a notes d'altres - usuaris si s'activa. +flagShowTimelineRepliesDescription: Si s'activa, es mostraran les respostes d'usuaris + a publicacions d'altres usuaris. general: General autoAcceptFollowed: Aprova automร ticament les peticions de seguiment d'usuaris que segueixes accountMoved: "L'usuari s'ha mogut a un compte nou:" -addAccount: Afegir un compte +addAccount: Afegeix un compte loginFailed: No s'ha pogut iniciar sessiรณ -showOnRemote: Veure a l'instร ncia remota +showOnRemote: Mostra a la instร ncia remota wallpaper: Fons de pantalla setWallpaper: Estableix fons de pantalla -removeWallpaper: Esborra fons de pantalla +removeWallpaper: Elimina el fons de pantalla followConfirm: Segur que vols seguir a l'usuari {name}? proxyAccount: Compte proxy proxyAccountDescription: Un compte proxy es un compte que actua com un seguidor remot @@ -781,127 +781,127 @@ host: Amfitriรณ selectUser: Selecciona un usuari latestStatus: รšltim estat storageUsage: รšs del emmagatzematge -metadata: Metadata +metadata: Metadades withNFiles: '{n} fitxer(s)' monitor: Seguiment software: Programari version: Versiรณ -jobQueue: Cua de Feina -cpuAndMemory: CPU i Memรฒria +jobQueue: Cua de feina +cpuAndMemory: CPU i memรฒria network: Xarxa disk: Disc -instanceInfo: Informaciรณ de l'instร ncia +instanceInfo: Informaciรณ de la instร ncia statistics: Estadรญstiques -clearCachedFiles: Neteja la memรฒria cau +clearCachedFiles: Esborra la memรฒria cau clearQueueConfirmText: Qualsevol publicaciรณ que continuรฏ a la cua sense entregar no serรก federada. Normalment aquesta operaciรณ no es necessร ria. clearCachedFilesConfirm: Segur que vols esborrar els fitxers remots de la memรฒria cau? blockedUsers: Usuaris blocats -noUsers: No hi han usuaris -editProfile: Editar perfil -noteDeleteConfirm: Segur que vols esborrar aquesta publicaciรณ? +noUsers: No hi ha cap usuari +editProfile: Edita el perfil +noteDeleteConfirm: Segur que vols eliminar la publicaciรณ? pinLimitExceeded: No pots fixar mรฉs notes -muteAndBlock: Silenciats i Bloquejats +muteAndBlock: Silenciats i blocats mutedUsers: Usuaris silenciats done: Fet preview: Vista prรจvia default: Per defecte -intro: La instalaciรณ de Calckey a acabat! Si us plau crea un compte d'usuari. -processing: Processant... -noCustomEmojis: No hi ha emoji -noJobs: No hi han feines +intro: La instalยทlaciรณ de Calckey ha acabat! Crea un compte d'usuari d'administraciรณ. +processing: S'estร  processantโ€ฆ +noCustomEmojis: No hi ha cap emoji +noJobs: No hi ha cap feina federating: Federant blocked: Bloquejat subscribing: Subscrivint publishing: Publicant notResponding: Sense resposta instanceUsers: Usuaris d'aquesta instร ncia -instanceFollowing: Seguint a l'instร ncia +instanceFollowing: Seguint a la instร ncia instanceFollowers: Seguidors de l'instร ncia security: Seguretat newPasswordRetype: Torna a entrar la nova contrasenya more: Mรฉs! featured: Destacat -usernameOrUserId: Nom d'usuari o id d'usuari +usernameOrUserId: Nom o ID d'usuari noSuchUser: No s'ha trobat l'usuari -lookup: Cercar -attachFile: Afegeix un arxiu +lookup: Cerca +attachFile: Afegeix un fitxer currentPassword: Contrasenya actual newPassword: Nova contrasenya announcements: Anuncis imageUrl: URL de la imatge -removed: S'ha esborrat correctament -removeAreYouSure: Segur que vols esborrar "{x}"? -deleteAreYouSure: Segur que vols esborrar "{x}"? -resetAreYouSure: Restablir? Segur? -fromUrl: Des de URL -saved: Desat +removed: S'ha eliminat correctament +removeAreYouSure: Segur que vols eliminar ยซ{x}ยป? +deleteAreYouSure: Segur que vols eliminar ยซ{x}ยป? +resetAreYouSure: Segur que vols restablir? +fromUrl: Des d'una URL +saved: S'ha desat messaging: Xat -upload: Pujar -keepOriginalUploading: Desa imatge original +upload: Puja +keepOriginalUploading: Desa la imatge original keepOriginalUploadingDescription: Desa la imatge original pujada tal com es. Si es desactiva, es generarร  una versiรณ per mostrar en la web al pujar. -fromDrive: Des de Drive -uploadFromUrl: Puja des de una adreรงa URL +fromDrive: Des del Disc +uploadFromUrl: Puja des d'una adreรงa URL uploadFromUrlDescription: Adreรงa URL del fitxer que vols pujar uploadFromUrlRequested: Pujada demanada -noMoreHistory: S'ha acabat la historia -tos: Termes d'us -start: Comenรงar -startMessaging: Comenรงa un nou xat +noMoreHistory: No hi ha mรฉs historial +tos: Condicions d'รบs +start: Comenรงa +startMessaging: Comenรงa una conversa manageGroups: Gestiona els grups nUsersRead: llegit per {n} agreeTo: Estic d'acord amb {0} activity: Activitat home: Inici -remoteUserCaution: L'informaciรณ d'usuaris remots pot estar incompleta. +remoteUserCaution: La informaciรณ dels usuaris remots pot estar incompleta. themeForDarkMode: Tema a fer servir en mode fosc light: Clar registeredDate: Data de registre dark: Fosc lightThemes: Temes clars -location: Lloc +location: Ubicaciรณ theme: Temes themeForLightMode: Tema a fer servir en mode clar drive: Disc selectFile: Tria un fitxer selectFiles: Tria fitxers darkThemes: Temes foscos -syncDeviceDarkMode: Sincronitza el Mode Fosc amb la configuraciรณ del teu dispositiu +syncDeviceDarkMode: Sincronitza el mode fosc amb la configuraciรณ del teu dispositiu fileName: Nom del fitxer createFolder: Crea una carpeta -renameFolder: Posa un nom nou a aquesta carpeta -deleteFolder: Esborra aquesta carpeta +renameFolder: Canvia-li el nom a la carpeta +deleteFolder: Elimina la carpeta selectFolder: Tria una carpeta selectFolders: Tria carpetes renameFile: Canvia el nom del fitxer folderName: Nom de la carpeta -inputNewFolderName: Escriu un nou nom per la carpeta +inputNewFolderName: Escriu un nom de carpeta nou addFile: Afegeix un fitxer emptyDrive: El teu Disc รฉs buit emptyFolder: Aquesta carpeta รฉs buida -unableToDelete: No es pot esborrar +unableToDelete: No es pot eliminar inputNewFileName: Escriu un nou nom per al fitxer -inputNewDescription: Escriu una nova descripciรณ -circularReferenceFolder: La carpeta de destรญ es una subcarpeta de la carpeta que vols +inputNewDescription: Escriu una descripciรณ nova +circularReferenceFolder: La carpeta de destรญ รฉs una subcarpeta de la carpeta que vols moure. -hasChildFilesOrFolders: Degut a que aquesta carpeta no es buida, no es pot esborrar. +hasChildFilesOrFolders: Aquesta carpeta no es pot eliminar perquรจ no รฉs buida. whenServerDisconnected: Quant es perd la conexiรณ amb el servidor disconnectedFromServer: S'ha perdut la conexiรณ al servidor reload: Torna a carregar avatar: Avatar -banner: Banner +banner: Bร ner doNothing: Ignora reloadConfirm: Vols tornar a carregar la lรญnea temporal? watch: Veure maintainerName: Administrador maintainerEmail: Correu electrรฒnic de l'administrador -instanceName: Nom de l'instร ncia -instanceDescription: Descripciรณ de l'instร ncia +instanceName: Nom de la instร ncia +instanceDescription: Descripciรณ de la instร ncia today: Avui dayX: '{day}' -tosUrl: Adreรงa URL dels terminis d'รบs +tosUrl: URL de les Condicions d'รบs thisYear: Any thisMonth: Mes integration: Integracions @@ -928,37 +928,37 @@ enableGlobalTimeline: Activa la lรญnia de temps global disablingTimelinesInfo: Els Administradors i Moderadors sempre tenen accรฉs a totes les lรญneas temporals, inclรฒs si hi sรณn desactivades. showLess: Tanca -clearQueue: Neteja la cua +clearQueue: Esborra la cua uploadFromUrlMayTakeTime: Pot trigar un temps fins que la pujada es completi. noThankYou: No, grร cies -addInstance: Afegir una instร ncia -emoji: Emoji -emojis: Emoji +addInstance: Afegeix una instร ncia +emoji: Emojis +emojis: Emojis emojiName: Nom del emoji -emojiUrl: URL del emoji -addEmoji: Afegir +emojiUrl: URL de l'emoji +addEmoji: Afegeix settingGuide: Configuraciรณ recomenada -searchWith: 'Cercar: {q}' +searchWith: 'Cerca: {q}' youHaveNoLists: No tens cap llista flagSpeakAsCat: Parla com un gat selectInstance: Selecciona una instร ncia -flagSpeakAsCatDescription: Les teves notes es transformaran en miols quant estiguis +flagSpeakAsCatDescription: Les teves publicacions es transformaran en miols quan estiguis en mode gat recipient: Destinatari(s) annotation: Comentaris -blockedInstances: Instร ncies Bloquejades +blockedInstances: Instร ncies bloquejades blockedInstancesDescription: Llista les adreces de les instร ncies que vols bloquejar. Les instร ncies de la llista no podrรกn comunicarse amb aquesta instร ncia. -hiddenTags: Etiquetes Ocultes +hiddenTags: Etiquetes amagades hiddenTagsDescription: 'Enumereu les etiquetes (sense el #) que voleu ocultar de tendรจncies i explorar. Les etiquetes ocultes encara es poden descobrir per altres mitjans. Les instร ncies bloquejades no es veuen afectades encara que s''enumerin aquรญ.' -noInstances: No hi han instร ncies +noInstances: No hi ha cap instร ncia defaultValueIs: 'Per defecte: {value}' suspended: Suspรจs all: Tot changePassword: Canvia la contrasenya -clearQueueConfirmTitle: Segur que vols netejar la cua? +clearQueueConfirmTitle: Segur que vols esborrar la cua? retypedNotMatch: Els camps no coincideixen. normal: Normal monthX: '{month}' @@ -975,25 +975,25 @@ registration: Registre showEmojisInReactionNotifications: Mostra els emojis a les notificacions de les reaccions renoteMute: Silencia els impulsos renoteUnmute: Treu el silenci als impulsos -cacheRemoteFiles: Fitxers remots a la memoria cau +cacheRemoteFiles: Fitxers remots a la memรฒria cau federation: Federaciรณ registeredAt: Registrat a latestRequestSentAt: รšltima peticiรณ enviada latestRequestReceivedAt: รšltima peticiรณ rebuda charts: Grร fics -perHour: Per Hora -perDay: Per Dia +perHour: Per hora +perDay: Per dia stopActivityDelivery: Para d'enviar activitats operations: Operacions -explore: Explorar -messageRead: Llegir +explore: Explora +messageRead: Llegit images: Imatges birthday: Aniversari yearsOld: '{age} anys' -copyUrl: Copiar l'adreรงa URL +copyUrl: Copia l'adreรงa URL rename: Renombrar unwatch: Deixa de veure -accept: Acceptar +accept: Accepta reject: Rebutja yearX: '{year}' pages: Pร gines @@ -1511,7 +1511,7 @@ seperateRenoteQuote: Botons d'impuls i de citaciรณ separats searchResult: Resultats de la cerca hashtags: Etiquetes troubleshooting: Resoluciรณ de problemes -learnMore: Aprรจn mรฉs +learnMore: Mรฉs informaciรณ misskeyUpdated: Calckey s'ha actualitzat! translate: Tradueix translatedFrom: Traduรฏt per {x} @@ -1599,7 +1599,7 @@ squareAvatars: Mostra avatars quadrats secureModeInfo: Quan es faci una solicitut d'altres instร ncies no contestar sense una prova. privateModeInfo: Quan estร  activat, nomรฉs les instร ncies de la llista blanca es poden - federar amb les vostres instร ncies. Totes les notes s'amagaran al pรบblic. + federar amb la vostra instร ncia. Totes les publicacions s'amagaran al pรบblic. useBlurEffect: Utilitzeu efectes de desenfocament a la interfรญcie d'usuari accountDeletionInProgress: La supressiรณ del compte estร  en curs unmuteThread: Desfรฉs el silenci al fil @@ -1815,6 +1815,8 @@ _channel: usersCount: '{n} Participants' following: Seguit notesCount: '{n} Notes' + nameAndDescription: Nom i descripciรณ + nameOnly: Nomรฉs nom _instanceMute: instanceMuteDescription: Aixรฒ silenciarร  les notes o els impulsos de les instร ncies indicades, incloses les dels usuaris que responguin a un usuari des d'una instร ncia @@ -2020,24 +2022,7 @@ _relayStatus: requesting: Pendent accepted: Acceptat rejected: Rebutjat -_apps: - crossPlatform: Multiplataforma - mobile: Mรฒbil - firstParty: Primer partit - secondClass: Segona classe - thirdClass: Tercera classe - pwa: Instalยทlar PWA - kaiteki: Kaiteki - milktea: Milktea - missLi: MissLi - mona: Mona - lesskey: Lesskey - firstClass: Primera classe - free: Gratuรฏt - paid: Pagament - theDesk: TheDesk - apps: Aplicacions -deleted: Esborrat +deleted: Eliminat editNote: Edita la nota edited: Editat findOtherInstance: Cercar un altre servidor @@ -2047,3 +2032,10 @@ signupsDisabled: Actualment, les inscripcions en aquest servidor estan desactiva userSaysSomethingReasonQuote: '{name} ha citat una publicaciรณ que contรฉ {reason}' userSaysSomethingReasonReply: '{name} ha respost a una publicaciรณ que contรฉ {reason}' userSaysSomethingReasonRenote: '{name} ha impulsat una publicaciรณ que contรฉ {reason}' +highlightCw: Ressalta el contingut de les publicacions advertides +apps: Aplicacions +sendModMail: Envia avรญs de moderaciรณ +preventAiLearning: Evita l'indexaciรณ dels bots +preventAiLearningDescription: Solยทliciteu que els models de llenguatge d'IA de tercers + no estudiรฏn el contingut que pengeu, com ara publicacions i imatges. +pwa: Instalยทlar PWA diff --git a/locales/cs-CZ.yml b/locales/cs-CZ.yml index cb2f0a1df..70a4ca05a 100644 --- a/locales/cs-CZ.yml +++ b/locales/cs-CZ.yml @@ -1,7 +1,9 @@ ---- _lang_: "ฤŒeลกtina" headlineMisskey: "Sรญลฅ propojenรก poznรกmkami" -introMisskey: "Vรญtejte! Misskey je otevล™enรฝ a decentralizovanรฝ microblogovรฝ servis.\n\"Poznรกmkami\" mลฏลพete sdรญlet co se zrovna dฤ›je se vลกemi ve Vaลกem okolรญ. ๐Ÿ“ก\nPomocรญ \"reakcรญ\" mลฏลพete sdรญlet svรฉ nรกzory a pocity na ostatnรญ poznรกmky. ๐Ÿ‘\nPojฤte objevovat novรฝ svฤ›t! ๐Ÿš€" +introMisskey: "Vรญtejte! Misskey je otevล™enรฝ a decentralizovanรฝ microblogovรฝ servis.\n\ + \"Poznรกmkami\" mลฏลพete sdรญlet co se zrovna dฤ›je se vลกemi ve Vaลกem okolรญ. \U0001F4E1\ + \nPomocรญ \"reakcรญ\" mลฏลพete sdรญlet svรฉ nรกzory a pocity na ostatnรญ poznรกmky. \U0001F44D\ + \nPojฤte objevovat novรฝ svฤ›t! \U0001F680" monthAndDay: "{day}. {month}." search: "Vyhledรกvรกnรญ" notifications: "Oznรกmenรญ" @@ -44,7 +46,8 @@ copyContent: "Zkopรญrovat obsah" copyLink: "Kopรญrovat odkaz" delete: "Smazat" deleteAndEdit: "Smazat a upravit" -deleteAndEditConfirm: "Jste si jistรญ ลพe chcete smazat tuto poznรกmku a editovat ji? Ztratรญte tรญm vลกechny reakce, sdรญlenรญ a odpovฤ›di na ni." +deleteAndEditConfirm: "Jste si jistรญ ลพe chcete smazat tuto poznรกmku a editovat ji?\ + \ Ztratรญte tรญm vลกechny reakce, sdรญlenรญ a odpovฤ›di na ni." addToList: "Pล™idat do seznamu" sendMessage: "Odeslat zprรกvu" copyUsername: "Kopรญrovat uลพivatelskรฉ jmรฉno" @@ -63,9 +66,11 @@ import: "Importovat" export: "Exportovat" files: "Soubor(ลฏ)" download: "Stรกhnout" -driveFileDeleteConfirm: "Opravdu chcete smazat soubor \"{name}\"? Poznรกmky, ke kterรฝm je tento soubor pล™ipojen, budou takรฉ smazรกny." +driveFileDeleteConfirm: "Opravdu chcete smazat soubor \"{name}\"? Soubor bude odstranฤ›n\ + \ ze vลกech pล™รญspฤ›vkลฏ, kterรฉ ji obsahujรญ jako pล™รญlohu." unfollowConfirm: "Jste si jisti ลพe uลพ nechcete sledovat {name}?" -exportRequested: "Poลพรกdali jste o export. To mลฏลพe chvรญli trvat. Pล™idรกme ho na vรกลก Disk aลพ bude dokonฤen." +exportRequested: "Poลพรกdali jste o export. To mลฏลพe chvรญli trvat. Pล™idรกme ho na vรกลก\ + \ Disk aลพ bude dokonฤen." importRequested: "Poลพรกdali jste o export. To mลฏลพe chvilku trvat." lists: "Seznamy" noLists: "Nemรกte ลพรกdnรฉ seznamy" @@ -81,7 +86,8 @@ somethingHappened: "Jejda. Nฤ›co se nepovedlo." retry: "Opakovat" pageLoadError: "Nepodaล™ilo se naฤรญst strรกnku" serverIsDead: "Server neodpovรญdรก. Poฤkejte chvรญli a zkuste to znovu." -youShouldUpgradeClient: "Pro zobrazenรญ tรฉto strรกnky obnovte strรกnku pro aktualizaci klienta." +youShouldUpgradeClient: "Pro zobrazenรญ tรฉto strรกnky obnovte strรกnku pro aktualizaci\ + \ klienta." enterListName: "Jmรฉno seznamu" privacy: "Soukromรญ" makeFollowManuallyApprove: "ลฝรกdosti o sledovรกnรญ vyลพadujรญ potvrzenรญ" @@ -105,7 +111,8 @@ clickToShow: "Kliknฤ›te pro zobrazenรญ" sensitive: "NSFW" add: "Pล™idat" reaction: "Reakce" -reactionSettingDescription2: "Pล™etaลพenรญm zmฤ›nรญte poล™adรญ, kliknutรญm smaลพete, zmรกฤknฤ›te \"+\" k pล™idรกnรญ" +reactionSettingDescription2: "Pล™etaลพenรญm zmฤ›nรญte poล™adรญ, kliknutรญm smaลพete, zmรกฤknฤ›te\ + \ \"+\" k pล™idรกnรญ" rememberNoteVisibility: "Zapamatovat nastavenรญ zobrazenรญ poznรกmky" attachCancel: "Odstranit pล™รญlohu" markAsSensitive: "Oznaฤit jako NSFW" @@ -134,13 +141,18 @@ emojiUrl: "URL obrรกzku" addEmoji: "Pล™idat emoji" settingGuide: "Doporuฤenรฉ nastavenรญ" cacheRemoteFiles: "Uklรกdรกnรญ vzdรกlenรฝch souborลฏ do mezipamฤ›ti" -cacheRemoteFilesDescription: "Zakรกzรกnรญ tohoto nastavenรญ zpลฏsobรญ, ลพe vzdรกlenรฉ soubory budou odkazovรกny pล™รญmo, mรญsto aby byly uklรกdรกny do mezipamฤ›ti. Tรญm se uลกetล™รญ รบloลพiลกtฤ› na serveru, ale zvรฝลกรญ se provoz, protoลพe se negenerujรญ miniatury." +cacheRemoteFilesDescription: "Zakรกzรกnรญ tohoto nastavenรญ zpลฏsobรญ, ลพe vzdรกlenรฉ soubory\ + \ budou odkazovรกny pล™รญmo, mรญsto aby byly uklรกdรกny do mezipamฤ›ti. Tรญm se uลกetล™รญ รบloลพiลกtฤ›\ + \ na serveru, ale zvรฝลกรญ se provoz, protoลพe se negenerujรญ miniatury." flagAsBot: "Tento รบฤet je bot" -flagAsBotDescription: "Pokud je tento รบฤet kontrolovรกn programem zaลกkrtnฤ›te tuto moลพnost. To oznaฤรญ tento รบฤet jako bot pro ostatnรญ vรฝvojรกล™e a zabrรกnรญ tak nekoneฤnรฝm interakcรญm s ostatnรญmi boty a upravรญ Misskey systรฉm aby se choval k tomuhle รบฤtu jako bot." +flagAsBotDescription: "Pokud je tento รบฤet kontrolovรกn programem zaลกkrtnฤ›te tuto moลพnost.\ + \ To oznaฤรญ tento รบฤet jako bot pro ostatnรญ vรฝvojรกล™e a zabrรกnรญ tak nekoneฤnรฝm interakcรญm\ + \ s ostatnรญmi boty a upravรญ Misskey systรฉm aby se choval k tomuhle รบฤtu jako bot." flagAsCat: "Tenhle รบฤet je koฤka" flagAsCatDescription: "Vyberte tuto moลพnost aby tento รบฤet byl oznaฤen jako koฤka." flagShowTimelineReplies: "Zobrazovat odpovฤ›di na ฤasovรฉ ose" -flagShowTimelineRepliesDescription: "Je-li zapnuto, zobrazรญ odpovฤ›di uลพivatelลฏ na poznรกmky jinรฝch uลพivatelลฏ na vaลกรญ ฤasovรฉ ose." +flagShowTimelineRepliesDescription: "Je-li zapnuto, zobrazรญ odpovฤ›di uลพivatelลฏ na\ + \ poznรกmky jinรฝch uลพivatelลฏ na vaลกรญ ฤasovรฉ ose." autoAcceptFollowed: "Automaticky akceptovat nรกsledovรกnรญ od รบฤtลฏ kterรฉ sledujete" addAccount: "Pล™idat รบฤet" loginFailed: "Pล™ihlรกลกenรญ se nezdaล™ilo." @@ -153,7 +165,10 @@ searchWith: "Hledat: {q}" youHaveNoLists: "Nemรกte ลพรกdnรฉ seznamy" followConfirm: "Jste si jisti, ลพe chcete sledovat {name}?" proxyAccount: "Proxy รบฤet" -proxyAccountDescription: "Proxy รบฤet je รบฤet, kterรฝ za urฤitรฝch podmรญnek sleduje uลพivatele na dรกlku vaลกรญm jmรฉnem. Napล™รญklad kdyลพ uลพivatel zaล™adรญ vzdรกlenรฉho uลพivatele do seznamu, pokud nikdo nesleduje uลพivatele na seznamu, aktivita nebude doruฤena instanci, takลพe mรญsto toho bude uลพivatele sledovat รบฤet proxy." +proxyAccountDescription: "Proxy รบฤet je รบฤet, kterรฝ za urฤitรฝch podmรญnek sleduje uลพivatele\ + \ na dรกlku vaลกรญm jmรฉnem. Napล™รญklad kdyลพ uลพivatel zaล™adรญ vzdรกlenรฉho uลพivatele do\ + \ seznamu, pokud nikdo nesleduje uลพivatele na seznamu, aktivita nebude doruฤena\ + \ instanci, takลพe mรญsto toho bude uลพivatele sledovat รบฤet proxy." host: "Hostitel" selectUser: "Vyberte uลพivatele" recipient: "Pro" @@ -239,7 +254,8 @@ agreeTo: "Souhlasรญm s {0}" tos: "Podmรญnky uลพรญvรกnรญ" start: "Zaฤรญt" home: "Domลฏ" -remoteUserCaution: "Tyto informace nemusรญ bรฝt aktuรกlnรญ jelikoลพ uลพivatel je ze vzdรกlenรฉ instance." +remoteUserCaution: "Tyto informace nemusรญ bรฝt aktuรกlnรญ jelikoลพ uลพivatel je ze vzdรกlenรฉ\ + \ instance." activity: "Aktivita" images: "Obrรกzky" birthday: "Datum narozenรญ" @@ -548,7 +564,8 @@ info: "Informace" unknown: "Neznรกmรฝ" onlineStatus: "Online status" hideOnlineStatus: "Skrรฝt Vรกลก online status" -hideOnlineStatusDescription: "Skrytรญ vaลกeho online stavu mลฏลพe snรญลพit funkcionalitu nฤ›kterรฝch funkcรญ, napล™รญklad vyhledรกvรกnรญ." +hideOnlineStatusDescription: "Skrytรญ vaลกeho online stavu mลฏลพe snรญลพit funkcionalitu\ + \ nฤ›kterรฝch funkcรญ, napล™รญklad vyhledรกvรกnรญ." online: "Online" active: "Aktivnรญ" offline: "Offline" @@ -928,3 +945,66 @@ _deck: antenna: "Antรฉny" list: "Seznamy" mentions: "Zmรญnฤ›nรญ" +noteDeleteConfirm: Chcete opravdu smazat tento pล™รญspฤ›vek? +defaultValueIs: 'Vรฝchozรญ: {value}' +lookup: Hledat +keepOriginalUploading: Ponechat originรกlnรญ obrรกzek +uploadFromUrlRequested: Vyลพรกdรกno nahrรกnรญ souboru +manageGroups: Spravovat skupiny +reloadConfirm: Znovu naฤรญst ฤasovou osu? +driveCapacityPerRemoteAccount: Mรญsto na disku pro vzdรกlenรฉ uลพivatele +silenceThisInstance: Ztlumit tuto instance +silencedInstances: Ztlumenรฉ instance +blockedInstancesDescription: Zadejte seznam domรฉn instancรญ, jeลพ chcete blokovat. Uvedenรฉ + instance nebudou moci s touto instancรญ komunikovat. +hiddenTags: Skrytรฉ hashtagy +noInstances: Nejsou zde ลพรกdnรฉ instance +silenced: Ztlumenรฉ +disablingTimelinesInfo: Administrรกtoล™i a moderรกtoล™i budou vลพdy mรญt pล™รญstup ke vลกem + ฤasovรฝm osรกm, i pokud jsou vypnutรฉ. +deleted: Vymazรกno +editNote: Upravit poznรกmku +edited: Upraveno +silencedInstancesDescription: Vypiลกte hostnames instancรญ, kterรฉ chcete ztlumit. รšฤty + v uvedenรฝch instancรญch jsou povaลพovรกny za "ztlumenรฉ", mohou pouze zadรกvat poลพadavky + na sledovรกnรญ a nemohou zmiลˆovat mรญstnรญ รบฤty, pokud nejsou sledovรกny. Na blokovanรฉ + instance toto nebude mรญt vliv. +hiddenTagsDescription: 'Vypiลกte hashtagy (bez #), kterรฉ chcete skrรฝt pล™ed trendy a + prozkoumat. Skrytรฉ hashtagy jsou stรกle zjistitelnรฉ jinรฝmi zpลฏsoby. Blokovanรฉ pล™รญpady + nejsou ovlivnฤ›ny, i kdyลพ jsou zde uvedeny.' +circularReferenceFolder: Cรญlovรก sloลพka je podsloลพka pล™esouvanรฉ sloลพky. +whenServerDisconnected: Pล™i ztrรกtฤ› spojenรญ se serverem +pinnedUsersDescription: Uveฤte uลพivatelskรก jmรฉna uลพivatelลฏ pล™ipnutรฝch na strรกnce "Prochรกzet", + jedno na ล™รกdek. +pinnedPagesDescription: Zadejte cesty ke strรกnkรกm, kterรฉ chcete pล™ipnout na hornรญ + strรกnku tรฉto instance, oddฤ›lenรฉ zlomy ล™รกdkลฏ. +pageLoadErrorDescription: Toto je obvykle zpลฏsobeno chybami sรญtฤ› nebo mezipamฤ›ti prohlรญลพeฤe. + Zkuste vymazat mezipamฤ›ลฅ a po chvรญli ฤekรกnรญ to zkuste znovu. +emptyDrive: Vรกลก disk je prรกzdnรฝ +inputNewDescription: Zadejte novรฝ popisek +hasChildFilesOrFolders: Sloลพka nemลฏลพe bรฝt smazรกna, protoลพe nenรญ prรกzdnรก. +noThankYou: Ne, dฤ›kuji +addInstance: Pล™idat instance +selectInstance: Vybrat si instance +blockedUsers: Zablokovanรญ uลพivatelรฉ +muteAndBlock: Ztlumenรญ a blokace +noJobs: ลฝรกdnรฉ รบlohy +federating: Federace +clearQueueConfirmText: Nedoruฤenรฉ pล™รญspฤ›vky, kterรฉ zลฏstanou ve frontฤ›, nebudou federovรกny. + Obvykle tato operace nenรญ potล™eba. +clearCachedFilesConfirm: Chcete opravdu vymazat mezipamฤ›ลฅ vลกech vzdรกlenรฝch souborลฏ? +accountMoved: 'Uลพivatel/ka se pล™esunul/a na novรฝ รบฤet:' +keepOriginalUploadingDescription: Ponechรก originรกlnฤ› nahranรฝ obrรกzek tak, jak je. + Pokud vypnuto, verze pro zobrazenรญ na webu bude vygenerovรกna pล™i nahrรกnรญ. +mutedUsers: Ztlumenรญ uลพivatelรฉ +enableRecommendedTimeline: Povolit doporuฤenou ฤasovou osu +driveCapacityPerLocalAccount: Mรญsto na disku pro mรญstnรญ uลพivatele +pinnedPages: Pล™ipnutรฉ Strรกnky +directNotes: Pล™รญmรฉ zprรกvy +enableEmojiReactions: Povolit reakce pomocรญ emoji +showEmojisInReactionNotifications: Zobrazit emotikony v oznรกmenรญch o reakcรญch +reactionSetting: Reakce, kterรฉ se majรญ zobrazit v seznamu reakcรญ +renoteMute: Ztlumit pล™eposรญlรกnรญ +renoteUnmute: Zruลกit ztlumenรญ pล™eposรญlรกnรญ +flagSpeakAsCat: Mluvit jako koฤka +flagSpeakAsCatDescription: Vaลกe pล™รญspฤ›vky budou v koฤiฤรญm reลพimu nyanifikovรกny. diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 9c4ceae33..619dd66b0 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -17,13 +17,13 @@ enterUsername: "Nutzername eingeben" renotedBy: "Geteilt von {user}" noNotes: "Keine Beitrรคge" noNotifications: "Keine Benachrichtigungen" -instance: "Instanz" +instance: "Server" settings: "Einstellungen" basicSettings: "Grundeinstellungen" otherSettings: "Weitere Einstellungen" openInWindow: "In einem Fenster รถffnen" profile: "Profil" -timeline: "Timeline" +timeline: "Timelines" noAccountDescription: "Dieser Nutzer hat seine Profilbeschreibung noch nicht ausgefรผllt." login: "Anmelden" loggingIn: "Du wirst angemeldet" @@ -86,73 +86,73 @@ error: "Fehler" somethingHappened: "Ein Fehler ist aufgetreten" retry: "Wiederholen" pageLoadError: "Beim Laden der Seite ist ein Fehler aufgetreten." -pageLoadErrorDescription: "Dies wird in der Regel verursacht durch einen Netzwerkfehler\ - \ oder den Browser-Cache.\nVersuchen sie den Browser-Cache zu leeren, nachdem Sie\ - \ eine Weile gewartet haben, versuchen Sie es erneut." +pageLoadErrorDescription: "Dies wird in der Regel durch Netzwerkfehler oder den Cache\ + \ des Browsers verursacht. Versuchen Sie, den Cache zu leeren, und versuchen Sie\ + \ es dann erneut, nachdem Sie eine Weile gewartet haben." serverIsDead: "Der Server antwortet nicht. Bitte warte einen Moment und versuche es\ \ dann erneut." youShouldUpgradeClient: "Bitte aktualisiere diese Seite, um eine neuere Version deines\ \ Clients zu verwenden." enterListName: "Gib einen Namen fรผr die Liste ein" privacy: "Privatsphรคre" -makeFollowManuallyApprove: "Follow-Anfragen erfordern eine Genehmigung" -defaultNoteVisibility: "Standardsichtbarkeit" +makeFollowManuallyApprove: "Folgeanfragen bedรผrfen der Genehmigung" +defaultNoteVisibility: "Standard-Sichtbarkeit" follow: "Folge ich" followRequest: "Follow anfragen" followRequests: "Follow-Anfragen" -unfollow: "Entfolgen" -followRequestPending: "Follow-Anfrage ausstehend" -enterEmoji: "Gib ein Emoji ein" -renote: "Teilen" -unrenote: "Teilen widerrufen" -renoted: "Geteilt" -cantRenote: "Teilen dieses Beitrages nicht mรถglich." -cantReRenote: "Das Teilen einer bereits geteilten Beitrages ist nicht mรถglich." +unfollow: "Nicht mehr folgen" +followRequestPending: "Follow-up-Anfrage ausstehend" +enterEmoji: "Ein Emoji eingeben" +renote: "Boost" +unrenote: "Boost zurรผcknehmen" +renoted: "Geboostet" +cantRenote: "Dieser Beitrag kann nicht geboostet werden." +cantReRenote: "Ein Boost kann nicht geboostet werden." quote: "Zitieren" -pinnedNote: "Angehefteter Beitrag" +pinnedNote: "Angepinnter Beitrag" pinned: "An das Profil anheften" you: "Du" clickToShow: "Zum Anzeigen anklicken" sensitive: "NSFW" add: "Hinzufรผgen" -reaction: "Rรผckmeldungen" -reactionSetting: "Rรผckmeldungen die im Rรผckmeldungsfeld angezeigt werden sollen." -reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu lรถschen, drรผcke โ€ž+โ€œ\ - \ um hinzuzufรผgen." +reaction: "Reaktionen" +reactionSetting: "Reaktionen, die in der Reaktionsauswahl angezeigt werden sollen" +reactionSettingDescription2: "Ziehen Sie, um neu zu ordnen,\nklicken Sie, um zu lรถschen,\n\ + drรผcken Sie \"+\", um hinzuzufรผgen." rememberNoteVisibility: "Einstellungen fรผr die Sichtbarkeit von Beitrรคgen speichern" attachCancel: "Anhang entfernen" markAsSensitive: "Als NSFW kennzeichnen" -accountMoved: "Der Nutzer ist zu einer neuen Instanz umgezogen:" +accountMoved: "Der Nutzer ist zu einem neuen Konto umgezogen:" unmarkAsSensitive: "NSFW Kennzeichnung aufheben" -enterFileName: "Dateinamen eingeben" +enterFileName: "Dateiname eingeben" mute: "Stummschalten" unmute: "Stummschaltung aufheben" block: "Blockieren" unblock: "Blockierung aufheben" -suspend: "Sperren" -unsuspend: "Sperrung aufheben" -blockConfirm: "Mรถchtest du diesen Nutzer wirklich blockieren?" -unblockConfirm: "Mรถchtest du diese Blockierung wirklich aufheben?" -suspendConfirm: "Mรถchtest du diesen Nutzer wirklich sperren?" -unsuspendConfirm: "Mรถchtest du diesen Nutzer wirklich entsperren?" -selectList: "Liste auswรคhlen" -selectAntenna: "Antenne auswรคhlen" -selectWidget: "Widget auswรคhlen" +suspend: "Suspendieren" +unsuspend: "Suspendierung aufheben" +blockConfirm: "Sind Sie sicher, dass Sie dieses Konto sperren wollen?" +unblockConfirm: "Sind Sie sicher, dass Sie die Sperrung dieses Kontos aufheben wollen?" +suspendConfirm: "Sind Sie sicher, dass Sie dieses Konto sperren wollen?" +unsuspendConfirm: "Sind Sie sicher, dass Sie dieses Konto entsperren wollen?" +selectList: "Wรคhlen Sie eine Liste aus" +selectAntenna: "News-Picker auswรคhlen" +selectWidget: "Ein Widget auswรคhlen" editWidgets: "Widgets bearbeiten" -editWidgetsExit: "Fertig" -customEmojis: "Benutzerdefinierte Emojis" +editWidgetsExit: "Erledigt" +customEmojis: "Benutzerdefinierte Emoji" emoji: "Emoji" -emojis: "Emojis" +emojis: "Emoji" emojiName: "Emoji-Name" emojiUrl: "Emoji-URL" addEmoji: "Emoji hinzufรผgen" settingGuide: "Empfohlene Einstellungen" -cacheRemoteFiles: "Dateien von fremden Instanzen im Cache speichern" +cacheRemoteFiles: "Cache fรผr entfernte Dateien" cacheRemoteFilesDescription: "Ist diese Einstellung deaktiviert, so werden Dateien\ - \ fremder Instanzen direkt von dort geladen. Hierdurch wird Speicherplatz auf diesem\ - \ Server gespart, aber durch fehlende Generierung von Vorschaubildern mehr Bandbreite\ - \ verwendet." -flagAsBot: "Nutzerkonto als Bot kennzeichnen" + \ von anderen Servern direkt von dort geladen. Hierdurch wird Speicherplatz auf\ + \ diesem Server eingespart, aber durch die fehlende Generierung von Vorschaubildern\ + \ mehr Bandbreite benรถtigt." +flagAsBot: "Dieses Nutzerkonto als Bot kennzeichnen" flagAsBotDescription: "Aktiviere diese Option, falls dieses Nutzerkonto durch ein\ \ Programm gesteuert wird. Falls aktiviert, agiert es als Flag fรผr andere Entwickler\ \ zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lรคsst Calckeys\ @@ -161,139 +161,141 @@ flagAsCat: "Bist du eine Katze? \U0001F63A" flagAsCatDescription: "Du bekommst Katzenohren und sprichst wie eine Katze!" flagShowTimelineReplies: "Antworten in der Timeline anzeigen" flagShowTimelineRepliesDescription: "Zeigt Antworten von Nutzern auf Beitrรคge anderer\ - \ Nutzer in der Timeline an, wenn diese Option aktiviert ist." -autoAcceptFollowed: "Genehmigen Sie automatisch Follow-Anfragen von Nutzern, denen\ + \ Nutzer in der Timeline an, wenn diese Funktion aktiviert ist." +autoAcceptFollowed: "Automatisches Genehmigen von Folgeanfragen von Benutzern, denen\ \ Sie folgen" addAccount: "Nutzerkonto hinzufรผgen" loginFailed: "Anmeldung fehlgeschlagen" -showOnRemote: "Auf Ursprungsinstanz ansehen" +showOnRemote: "Ansicht auf dem Herkunftsserver" general: "Allgemein" -wallpaper: "Hintergrund" -setWallpaper: "Hintergrund festlegen" -removeWallpaper: "Hintergrund lรถschen" +wallpaper: "Hintergrundbild" +setWallpaper: "Hintergrundbild festlegen" +removeWallpaper: "Hintergrundbild entfernen" searchWith: "Suchen: {q}" -youHaveNoLists: "Du hast keine Listen angelegt" -followConfirm: "Mรถchtest du {name} wirklich folgen?" +youHaveNoLists: "Sie haben keine Listen" +followConfirm: "Sind Sie sicher, dass Sie {name} folgen mรถchten?" proxyAccount: "Proxy-Konto" -proxyAccountDescription: "Ein Proxy-Nutzerkonto ist ein Nutzerkonto, das sich fรผr\ - \ Nutzer unter bestimmten Konditionen wie ein Follower aus einer fremden Instanz\ - \ verhรคlt. Zum Beispiel wird die Aktivitรคt eines Nutzers aus einer fremden Instanz\ - \ nicht an diese Instanz รผbermittelt, falls es keinen Nutzer dieser Instanz gibt,\ - \ der diesem Nutzer aus fremder Instanz folgt. In diesem Fall folgt stattdessen\ +proxyAccountDescription: "Ein Proxy-Konto ist ein Nutzerkonto, das sich fรผr Nutzer\ + \ unter bestimmten Konditionen wie ein Follower von einem anderen Server verhรคlt.\ + \ Zum Beispiel wird die Aktivitรคt eines Nutzers von einem anderen Server nicht an\ + \ diesen Server รผbermittelt, falls es keinen Nutzer von diesem Server gibt, der\ + \ diesem Nutzer von einem anderen Server folgt. In diesem Fall folgt stattdessen\ \ das Proxy-Nutzerkonto." -host: "Hostname" -selectUser: "Nutzer auswรคhlen" +host: "Host" +selectUser: "Wรคhlen Sie einen Nutzer" recipient: "Empfรคnger" annotation: "Anmerkungen" federation: "Fรถderation" -instances: "Instanzen" -registeredAt: "Registriert am" +instances: "Server" +registeredAt: "Registriert unter" latestRequestSentAt: "Letzte Anfrage gesendet" -latestRequestReceivedAt: "Letzte Anfrage erhalten" -latestStatus: "Aktueller Status" -storageUsage: "Speichernutzung" +latestRequestReceivedAt: "Letzte erhaltene Anfrage" +latestStatus: "Aktueller Stand" +storageUsage: "Nutzung des Speichers" charts: "Diagramme" perHour: "Pro Stunde" perDay: "Pro Tag" -stopActivityDelivery: "Beenden Sie das Senden von Aktivitรคten" -blockThisInstance: "Diese Instanz blockieren" +stopActivityDelivery: "Sendeaktivitรคten einstellen" +blockThisInstance: "Diesen Server blockieren" operations: "Tรคtigkeiten" software: "Software" version: "Version" metadata: "Metadaten" withNFiles: "{n} Datei(en)" -monitor: "Beobachten" +monitor: "รœberwachung" jobQueue: "Auftragswarteschlange" -cpuAndMemory: "CPU und Arbeitsspeicher" +cpuAndMemory: "CPU und Speicher" network: "Netzwerk" disk: "Festplatte" -instanceInfo: "Instanzinformationen" +instanceInfo: "Serverinformationen" statistics: "Statistiken" -clearQueue: "Warteschlange leeren" -clearQueueConfirmTitle: "Mรถchtest du die Warteschlange wirklich leeren?" -clearQueueConfirmText: "Alle noch nicht gesendete Beitrรคge in der Warteschlange werden\ - \ nicht verรถffentlicht. Normalerweise ist dieser Vorgang nicht erforderlich." +clearQueue: "Warteschlange lรถschen" +clearQueueConfirmTitle: "Sind Sie sicher, dass Sie die Warteschlange lรถschen wollen?" +clearQueueConfirmText: "Nicht zugestellte Beitrรคge, die in der Warteschlange verbleiben,\ + \ werden nicht fรถderiert. Normalerweise ist dieser Vorgang nicht erforderlich." clearCachedFiles: "Cache leeren" -clearCachedFilesConfirm: "Sollen alle im Cache gespeicherten Dateien von anderen Instanzen\ - \ wirklich gelรถscht werden?" -blockedInstances: "Blockierte Instanzen" -blockedInstancesDescription: "Gib die Hostnamen der Instanzen, welche blockiert werden\ - \ sollen, durch Zeilenumbrรผche getrennt an. Blockierte Instanzen kรถnnen mit dieser\ - \ instanz nicht mehr kommunizieren." +clearCachedFilesConfirm: "Sind Sie sicher, dass Sie alle im Cache zwischengespeicherten\ + \ Dateien lรถschen wollen?" +blockedInstances: "Blockierte Server" +blockedInstancesDescription: "Geben Sie die Hostnamen der Server, getrennt durch einen\ + \ Zeilenumbruch, an, die Sie blockieren mรถchten. Aufgelistete (blockierte) Server\ + \ kรถnnen nicht mehr mit diesem Server kommunizieren." muteAndBlock: "Stummschaltungen und Blockierungen" mutedUsers: "Stummgeschaltete Nutzer" blockedUsers: "Blockierte Nutzer" -noUsers: "Keine Nutzer gefunden" +noUsers: "Es sind keine Nutzer vorhanden" editProfile: "Profil bearbeiten" -noteDeleteConfirm: "Mรถchtest du diesen Beitrag wirklich lรถschen?" -pinLimitExceeded: "Du kannst keine weiteren Beitrรคge mehr anheften" -intro: "Calckey ist installiert! Lass uns nun ein Administratorkonto einrichten." -done: "Fertig" +noteDeleteConfirm: "Sind Sie sicher, dass Sie diesen Beitrag lรถschen wollen?" +pinLimitExceeded: "Sie kรถnnen keine weiteren Beitrรคge anpinnen" +intro: "Die Installation von Calckey ist abgeschlossen! Bitte erstellen Sie einen\ + \ Admin-Benutzer." +done: "Erledigt" processing: "In Bearbeitung โ€ฆ" preview: "Vorschau" default: "Standard" -defaultValueIs: "Standardwert: {value}" -noCustomEmojis: "Keine benutzerdefinierten Emojis gefunden" +defaultValueIs: "Der Standardwert ist: {value}" +noCustomEmojis: "Es gibt keine benutzerdefinierten Emoji" noJobs: "Keine Jobs vorhanden" federating: "Wird fรถderiert" blocked: "Blockiert" -suspended: "Gesperrt" +suspended: "suspendiert" all: "Alles" -subscribing: "Wird abonniert" -publishing: "Wird verรถffentlicht" +subscribing: "Registrieren" +publishing: "Verรถffentlichen" notResponding: "Antwortet nicht" -instanceFollowing: "Gefolgt auf der Instanz" -instanceFollowers: "Follower der Instanz" -instanceUsers: "Nutzer der Instanz" +instanceFollowing: "Auf dem Server folgen" +instanceFollowers: "Follower des Servers" +instanceUsers: "Nutzer dieses Servers" changePassword: "Passwort รคndern" security: "Sicherheit" retypedNotMatch: "Die Eingaben stimmen nicht รผberein." currentPassword: "Aktuelles Passwort" newPassword: "Neues Passwort" newPasswordRetype: "Neues Passwort bestรคtigen" -attachFile: "Datei anhรคngen" +attachFile: "Dateien anhรคngen" more: "Mehr!" -featured: "Beliebt" +featured: "Ausgewรคhlt" usernameOrUserId: "Nutzername oder Nutzer-ID" noSuchUser: "Nutzer nicht gefunden" -lookup: "Anfragen" -announcements: "Ankรผndigungen" +lookup: "Suche nach" +announcements: "Bekanntmachungen" imageUrl: "Bild-URL" remove: "Lรถschen" removed: "Erfolgreich gelรถscht" -removeAreYouSure: "Mรถchtest du โ€ž{x}โ€œ wirklich entfernen?" -deleteAreYouSure: "Mรถchtest du โ€ž{x}โ€œ wirklich lรถschen?" +removeAreYouSure: "Sind Sie sicher, dass Sie \"{x}\" entfernen wollen?" +deleteAreYouSure: "Sind Sie sicher, dass Sie \"{x}\" lรถschen wollen?" resetAreYouSure: "Wirklich zurรผcksetzen?" -saved: "Erfolgreich gespeichert" +saved: "Gespeichert" messaging: "Chat" upload: "Hochladen" -keepOriginalUploading: "Originalbild speichern" -keepOriginalUploadingDescription: "Speichert das Originalbild so, wie es ist. Ist\ - \ dies deaktiviert, wird eine Version zum Anzeigen im Internet generiert." -fromDrive: "Aus Drive" +keepOriginalUploading: "Originalbild behalten" +keepOriginalUploadingDescription: "Speichert das ursprรผnglich hochgeladene Bild so,\ + \ wie es ist. Wenn diese Option deaktiviert ist, wird beim Hochladen eine Version\ + \ fรผr die Anzeige im Web erstellt." +fromDrive: "Vom Laufwerk" fromUrl: "Von einer URL" uploadFromUrl: "Von einer URL hochladen" -uploadFromUrlDescription: "URL der hochzuladenden Datei" +uploadFromUrlDescription: "URL der Datei, die Sie hochladen wollen" uploadFromUrlRequested: "Upload angefordert" -uploadFromUrlMayTakeTime: "Es kann eine Weile dauern, bis das Hochladen abgeschlossen\ +uploadFromUrlMayTakeTime: "Es kann einige Zeit dauern, bis das Hochladen abgeschlossen\ \ ist." explore: "Erkunden" messageRead: "Gelesen" -noMoreHistory: "Kein weiterer Verlauf vorhanden" -startMessaging: "Neuen Chat erstellen" -nUsersRead: "Von {n} Nutzern gelesen" +noMoreHistory: "Es gibt keine weitere Historie" +startMessaging: "Einen neuen Chat beginnen" +nUsersRead: "Gelesen von {n}" agreeTo: "Ich stimme {0} zu" tos: "Nutzungsbedingungen" -start: "Anfangen" -home: "Startseite" -remoteUserCaution: "Informationen von fremden Instanzen sind mรถglicherweise unvollstรคndig." +start: "Beginnen Sie" +home: "Home" +remoteUserCaution: "Informationen von Remote-Nutzern kรถnnen unvollstรคndig sein." activity: "Aktivitรคt" images: "Bilder" birthday: "Geburtstag" yearsOld: "{age} Jahre alt" -registeredDate: "Registrationsdatum" +registeredDate: "Registriert am" location: "Ort" -theme: "Farbschema" +theme: "Themen" themeForLightMode: "Helles Farbschema" themeForDarkMode: "Dunkles Farbschema" light: "Hell" @@ -301,7 +303,7 @@ dark: "Dunkel" lightThemes: "Helle Farbschemata" darkThemes: "Dunkle Farbschemata" syncDeviceDarkMode: "Einstellung deines Gerรคts รผbernehmen" -drive: "Drive" +drive: "Cloud-Drive" fileName: "Dateiname" selectFile: "Datei auswรคhlen" selectFiles: "Dateien auswรคhlen" @@ -313,7 +315,7 @@ createFolder: "Ordner erstellen" renameFolder: "Ordner umbenennen" deleteFolder: "Ordner lรถschen" addFile: "Datei hinzufรผgen" -emptyDrive: "Deine Drive ist leer" +emptyDrive: "Deine Cloud-Drive ist leer" emptyFolder: "Dieser Ordner ist leer" unableToDelete: "Nicht lรถschbar" inputNewFileName: "Gib einen neuen Dateinamen ein" @@ -338,8 +340,8 @@ unwatch: "Nicht mehr beobachten" accept: "Akzeptieren" reject: "Ablehnen" normal: "Normal" -instanceName: "Name der Instanz" -instanceDescription: "Beschreibung der Instanz" +instanceName: "Name des Servers" +instanceDescription: "Beschreibung des Servers" maintainerName: "Betreiber" maintainerEmail: "Betreiber-Email" tosUrl: "URL der Nutzungsbedingungen" @@ -349,19 +351,19 @@ today: "Heute" dayX: "{day}" monthX: "{month}" yearX: "{year}" -pages: "Seiten" +pages: "Nutzer-Seiten" integration: "Integration" connectService: "Verbinden" disconnectService: "Trennen" -enableLocalTimeline: "Lokale Timeline aktivieren" -enableGlobalTimeline: "Globale Timeline aktivieren" +enableLocalTimeline: "Local-Timeline aktivieren" +enableGlobalTimeline: "Global-Timeline aktivieren" disablingTimelinesInfo: "Administratoren und Moderatoren haben immer Zugriff auf alle\ \ Timelines, auch wenn diese deaktiviert sind." registration: "Registrieren" enableRegistration: "Registration neuer Nutzer erlauben" invite: "Einladen" -driveCapacityPerLocalAccount: "Drive-Kapazitรคt pro lokalem Nutzerkonto" -driveCapacityPerRemoteAccount: "Drive-Kapazitรคt pro Nutzer fremder Instanzen" +driveCapacityPerLocalAccount: "Cloud-Drive-Kapazitรคt pro lokalem Nutzerkonto" +driveCapacityPerRemoteAccount: "Laufwerkskapazitรคt pro Remote-Nutzer" inMb: "In Megabytes" iconUrl: "Icon-URL (favicon etc)" bannerUrl: "Banner-URL" @@ -370,9 +372,9 @@ basicInfo: "Grundlegende Informationen" pinnedUsers: "Angeheftete Nutzer" pinnedUsersDescription: "Gib durch Leerzeichen getrennte Nutzer an, die an die \"\ Erkunden\"-Seite angeheftet werden sollen." -pinnedPages: "Angeheftete Seiten" -pinnedPagesDescription: "Gib durch Leerzeilen getrennte Pfรคde zu Seiten an, die an\ - \ die Startseite dieser Instanz angeheftet werden sollen." +pinnedPages: "Angeheftete Nutzer-Seiten" +pinnedPagesDescription: "Geben Sie die Pfade der Nutzer-Seiten, getrennt durch Zeilenumbrรผche,\ + \ ein, die Sie an die oberste Startseite dieses Servers anheften mรถchten." pinnedClipId: "ID des anzuheftenden Clips" pinnedNotes: "Angeheftete Beitrรคge" hcaptcha: "hCaptcha" @@ -386,10 +388,10 @@ recaptchaSecretKey: "Secret key" avoidMultiCaptchaConfirm: "Das Verwenden von mehreren Captcha-Systemen kann zu Stรถrungen\ \ fรผhren. Sollen die anderen Systeme deaktiviert werden? Durch Abbrechen kรถnnen\ \ mehrere Systeme aktiviert bleiben." -antennas: "Antennen" -manageAntennas: "Antennen verwalten" +antennas: "News-Picker" +manageAntennas: "News-Picker verwalten" name: "Name" -antennaSource: "Antennenquelle" +antennaSource: "Quellen der News-Picker" antennaKeywords: "Zu beobachtende Schlรผsselwรถrter" antennaExcludeKeywords: "Zu ignorierende Schlรผsselwรถrter" antennaKeywordsDescription: "Zum Nutzen einer \"UND\"-Verknรผpfung Eintrรคge mit Leerzeichen\ @@ -404,11 +406,11 @@ withReplies: "Antworten beinhalten" connectedTo: "Mit folgenden Nutzerkonten verknรผpft" notesAndReplies: "Beitrรคge und Antworten" withFiles: "Beitrรคge mit Dateien" -silence: "Instanzweit stummschalten" -silenceConfirm: "Mรถchtest du diesen Nutzer wirklich instanzweit stummschalten?" -unsilence: "Instanzweite Stummschaltung aufheben" -unsilenceConfirm: "Mรถchtest du die instanzweite Stummschaltung dieses Nutzers wirklich\ - \ aufheben?" +silence: "stummschalten" +silenceConfirm: "Sind Sie sicher, dass Sie diesen Benutzer Stummschalten mรถchten?" +unsilence: "Stummschaltung aufheben" +unsilenceConfirm: "Sind Sie sicher, dass Sie die Stummschaltung dieses Benutzers rรผckgรคngig\ + \ machen wollen?" popularUsers: "Beliebte Nutzer" recentlyUpdatedUsers: "Vor kurzem aktive Nutzer" recentlyRegisteredUsers: "Vor kurzem registrierte Nutzer" @@ -517,23 +519,23 @@ dayOverDayChanges: "Verรคnderung zu Gestern" appearance: "Aussehen" clientSettings: "Client-Einstellungen" accountSettings: "Nutzerkonto-Einstellungen" -promotion: "Werbung" -promote: "Werbung schalten" +promotion: "geworben" +promote: "Werben" numberOfDays: "Anzahl der Tage" hideThisNote: "Diesen Beitrag verstecken" showFeaturedNotesInTimeline: "Beliebte Beitrรคge in der Timeline anzeigen" -objectStorage: "Object Storage" +objectStorage: "Objektspeicher" useObjectStorage: "Object Storage verwenden" objectStorageBaseUrl: "Basis-URL" objectStorageBaseUrlDesc: "Die als Referenz verwendete URL. Verwendest du einen CDN\ \ oder Proxy, gib dessen URL an. \nFรผr S3 verwende 'https://.s3.amazonaws.com'.\ \ Fรผr GCS o.รค. verwende 'https://storage.googleapis.com/'." -objectStorageBucket: "Bucket" +objectStorageBucket: "Eimer" objectStorageBucketDesc: "Bitte gib den Namen des Buckets an, der bei deinem Anbieter\ \ verwendet wird." objectStoragePrefix: "Prefix" objectStoragePrefixDesc: "Dateien werden in Ordnern unter diesem Prefix gespeichert." -objectStorageEndpoint: "Endpoint" +objectStorageEndpoint: "Limit" objectStorageEndpointDesc: "Im Falle von S3 leerlassen, fรผr andere Anbieter den relevanten\ \ Endpoint im Format โ€žโ€œ oder โ€ž:โ€œ angeben." objectStorageRegion: "Region" @@ -583,8 +585,8 @@ updateRemoteUser: "Nutzerinformationen aktualisieren" deleteAllFiles: "Alle Dateien lรถschen" deleteAllFilesConfirm: "Mรถchtest du wirklich alle Dateien lรถschen?" removeAllFollowing: "Allen gefolgten Nutzern entfolgen" -removeAllFollowingDescription: "Dies entfolgt allen Nutzerkonten von {host}. Bitte\ - \ fรผhre dies durch, falls diese Instanz z.B. nicht mehr existiert." +removeAllFollowingDescription: "Wenn Sie dies ausfรผhren, werden alle Konten von {host}\ + \ entfolgt. Bitte fรผhren Sie dies aus, wenn der Server z.B. nicht mehr existiert." userSuspended: "Dieser Nutzer wurde gesperrt." userSilenced: "Dieser Nutzer wurde instanzweit stummgeschaltet." yourAccountSuspendedTitle: "Dieses Nutzerkonto ist gesperrt" @@ -655,7 +657,7 @@ wordMute: "Wortfilter" regexpError: "Fehler in einem regulรคren Ausdruck" regexpErrorDescription: "Im regulรคren Ausdruck deines {tab}en Wortfilters ist ein\ \ Fehler aufgetreten:" -instanceMute: "Instanzstummschaltungen" +instanceMute: "Server-Stummschaltungen" userSaysSomething: "{name} hat etwas gesagt" makeActive: "Aktivieren" display: "Anzeigeart" @@ -665,7 +667,7 @@ overview: "รœbersicht" logs: "Logs" delayed: "Verzรถgert" database: "Datenbank" -channel: "Kanรคle" +channel: "Channels" create: "Erstellen" notificationSetting: "Benachrichtigungseinstellungen" notificationSettingDesc: "Wรคhle die Art der anzuzeigenden Benachrichtigungen." @@ -692,9 +694,9 @@ abuseReported: "Deine Meldung wurde versendet. Vielen Dank." reporter: "Melder" reporteeOrigin: "Herkunft des Gemeldeten" reporterOrigin: "Herkunft des Meldenden" -forwardReport: "Meldung an fremde Instanz weiterleiten" -forwardReportIsAnonymous: "Anstatt deines Nutzerkontos wird bei der fremden Instanz\ - \ ein anonymes Systemkonto als Melder angezeigt." +forwardReport: "Einen Bericht auch an den beteiligten anderen Server weiterleiten" +forwardReportIsAnonymous: "Anstelle Ihres Nutzerkontos wird ein anonymes Systemkonto\ + \ als Berichterstatter auf dem beteiligten anderen Server angezeigt." send: "Senden" abuseMarkAsResolved: "Meldung als gelรถst markieren" openInNewTab: "In neuem Tab รถffnen" @@ -702,7 +704,7 @@ openInSideView: "In Seitenansicht รถffnen" defaultNavigationBehaviour: "Standardnavigationsverhalten" editTheseSettingsMayBreakAccount: "Bei Bearbeitung dieser Einstellungen besteht die\ \ Gefahr, dein Nutzerkonto zu beschรคdigen." -instanceTicker: "Instanz-Informationen zu Beitrรคgen" +instanceTicker: "Serveranzeige zu Beitrรคgen" waitingFor: "Warte auf {x}" random: "Zufรคllig" system: "System" @@ -710,7 +712,7 @@ switchUi: "Layout" desktop: "Desktop" clip: "Clip erstellen" createNew: "Neu erstellen" -optional: "Optional" +optional: "optional" createNewClip: "Neuen Clip erstellen" unclip: "Aus Clip entfernen" confirmToUnclipAlreadyClippedNote: "Dieser Beitrag ist bereits im \"{name}\" Clip\ @@ -733,10 +735,10 @@ pollVotesCount: "Anzahl gesendeter Antworten auf Umfragen" pollVotedCount: "Anzahl erhaltener Antworten auf Umfragen" yes: "Ja" no: "Nein" -driveFilesCount: "Anzahl der Dateien in Drive" -driveUsage: "Drive-Auslastung" +driveFilesCount: "Anzahl der Dateien in Cloud-Drive" +driveUsage: "Cloud-Drive-Auslastung" noCrawle: "Crawler-Indexierung ablehnen" -noCrawleDescription: "Suchmaschinen bitten, die eigene Profilseite, Beitrรคge, Seiten\ +noCrawleDescription: "Suchmaschinen bitten, die eigene Profilseite, Beitrรคge, Nutzer-Seiten\ \ usw. nicht zu indexieren." lockedAccountInfo: "Auch wenn du Follow-Anfragen auf manuelle Bestรคtigung setzt, wird\ \ jeder deiner Posts รถffentlich sichtbar sein, sofern du ihre Sichtbarkeit nicht\ @@ -749,8 +751,8 @@ verificationEmailSent: "Eine Bestรคtigungsmail wurde an deine Email-Adresse vers notSet: "Nicht konfiguriert" emailVerified: "Email-Adresse bestรคtigt" noteFavoritesCount: "Anzahl der favorisierten Beitrรคge" -pageLikesCount: "Anzahl an als \"Gefรคllt mir\" markierter Seiten" -pageLikedCount: "Anzahl erhaltener \"Gefรคllt mir\" auf Seiten" +pageLikesCount: "Anzahl an als \"Gefรคllt mir\" markierter Nutzer-Seiten" +pageLikedCount: "Anzahl erhaltener \"Gefรคllt mir\" auf Nutzer-Seiten" contact: "Kontakt" useSystemFont: "Standardschriftart des Systems verwenden" clips: "Clips" @@ -803,7 +805,7 @@ capacity: "Kapazitรคt" inUse: "Verwendet" editCode: "Code bearbeiten" apply: "Anwenden" -receiveAnnouncementFromInstance: "Benachrichtigungen von dieser Instanz empfangen" +receiveAnnouncementFromInstance: "Benachrichtigungen von diesem Server empfangen" emailNotification: "Email-Benachrichtigungen" publish: "Verรถffentlichen" inChannelSearch: "In Kanal suchen" @@ -834,7 +836,7 @@ active: "Aktiv" offline: "Offline" notRecommended: "Nicht empfohlen" botProtection: "Schutz vor Bots" -instanceBlocking: "Instanz Sperren/Stummschalten" +instanceBlocking: "Fรถderierte Blockieren/Stummschalten" selectAccount: "Nutzerkonto auswรคhlen" switchAccount: "Konto wechseln" enabled: "Aktiviert" @@ -847,12 +849,12 @@ switch: "Wechseln" noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert." noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert." configure: "Konfigurieren" -postToGallery: "Neuen Galeriebeitrag erstellen" -gallery: "Galerie" +postToGallery: "Erstelle einen neuen Beitrag zur Bilder-Galerie" +gallery: "Bilder-Galerie" recentPosts: "Neue Beitrรคge" popularPosts: "Beliebte Beitrรคge" shareWithNote: "Mit Beitrag teilen" -ads: "Werbung" +ads: "Werbeanzeigen" expiration: "Frist" memo: "Merkzettel" priority: "Prioritรคt" @@ -921,12 +923,12 @@ overridedDeviceKind: "Gerรคtetyp" smartphone: "Smartphone" tablet: "Tablet" auto: "Automatisch" -themeColor: "Farbe des Instanz-Tickers" +themeColor: "Farbe der Laufschrift (Ticker)" size: "GrรถรŸe" numberOfColumn: "Spaltenanzahl" searchByGoogle: "Suchen" -instanceDefaultLightTheme: "Instanzweites Standardfarbschema (Hell)" -instanceDefaultDarkTheme: "Instanzweites Standardfarbschema (Dunkel)" +instanceDefaultLightTheme: "Standard-Farbschema auf diesem Server: \"Hell\"" +instanceDefaultDarkTheme: "Standard-Farbschema auf diesem Server: \"Dunkel\"" instanceDefaultThemeDescription: "Gib den Farbschemencode im Objektformat ein." mutePeriod: "Dauer der Stummschaltung" indefinitely: "Dauerhaft" @@ -946,8 +948,8 @@ recentNDays: "Die letzten {n} Tage" noEmailServerWarning: "Es ist kein Email-Server konfiguriert." thereIsUnresolvedAbuseReportWarning: "Es liegen ungelรถste Meldungen vor." recommended: "Empfehlung" -check: "Check" -driveCapOverrideLabel: "Die Drive-Kapazitรคt dieses Nutzers verรคndern" +check: "Kontrolle" +driveCapOverrideLabel: "Die Cloud-Drive-Kapazitรคt dieses Nutzers verรคndern" driveCapOverrideCaption: "Gib einen Wert von 0 oder weniger ein, um die Kapazitรคt\ \ auf den Standard zurรผckzusetzen." requireAdminForView: "Melde dich mit einem Administratorkonto an, um dies einzusehen." @@ -973,18 +975,17 @@ slow: "Langsam" fast: "Schnell" sensitiveMediaDetection: "Erkennung von NSFW-Medien" localOnly: "Nur Lokal" -remoteOnly: "Nur fรผr fremde Instanzen" +remoteOnly: "Nur fรผr andere/fremde Server" failedToUpload: "Hochladen fehlgeschlagen" cannotUploadBecauseInappropriate: "Diese Datei kann nicht hochgeladen werden, da Anteile\ \ der Datei als mรถglicherweise NSFW festgestellt wurden." cannotUploadBecauseNoFreeSpace: "Die Datei konnte nicht hochgeladen werden, da dein\ - \ Drive-Speicherplatz aufgebraucht ist." + \ Cloud-Drive-Speicherplatz aufgebraucht ist." beta: "Beta" enableAutoSensitive: "NSFW-Automarkierung" -enableAutoSensitiveDescription: "Setzt soweit mรถglich durch Verwendung von Machine\ - \ Learning automatisch NSFW-Markierungen fรผr Medien, die NSFW-Anteile beinhalten.\ - \ Auch wenn du diese Option deaktiviert hast, ist sie mรถglicherweise auf Instanzebene\ - \ aktiviert." +enableAutoSensitiveDescription: "Erlaubt, wo mรถglich, die automatische Erkennung und\ + \ Kennzeichnung von NSFW-Medien durch maschinelles Lernen. Auch wenn diese Option\ + \ deaktiviert ist, kann sie รผber den Server aktiviert sein." activeEmailValidationDescription: "Aktivert strengere รœberprรผfung von E-Mail-Adressen,\ \ d.h. Testen auf Wegwerfadressen und darauf, ob mit der Adresse tatsรคchlich kommuniziert\ \ werden kann. Ist dies deaktiviert, so wird nur das Format der E-Mail รผberprรผft." @@ -1035,16 +1036,17 @@ _accountDelete: inProgress: "Lรถschung in Bearbeitung" _ad: back: "Zurรผck" - reduceFrequencyOfThisAd: "Diese Werbung weniger anzeigen" + reduceFrequencyOfThisAd: "Diese Werbeanzeige weniger anzeigen" _forgotPassword: enterEmail: "Gib die Email-Adresse ein, mit der du dich registriert hast. An diese\ \ wird ein Link gesendet, mit dem du dein Passwort zurรผcksetzen kannst." ifNoEmail: "Solltest du bei der Registrierung keine Email-Adresse angegeben haben,\ \ wende dich bitte an den Administrator." - contactAdmin: "Diese Instanz unterstรผtzt die Verwendung von Email-Adressen nicht.\ - \ Wende dich an den Administrator, um dein Passwort zurรผckzusetzen." + contactAdmin: "Dieser Server unterstรผtzt die Verwendung von Email-Adressen nicht.\ + \ Kontaktiere bitte den Server-Administrator, um dein Passwort zurรผcksetzen zu\ + \ lassen." _gallery: - my: "Meine Galerie" + my: "Meine Bilder-Galerie" liked: "Mit \"Gefรคllt mir\" markierte Beitrรคge" like: "Gefรคllt mir" unlike: "\"Gefรคllt mir\" entfernen" @@ -1101,9 +1103,9 @@ _nsfw: force: "Alle Medien verbergen" _mfm: cheatSheet: "MFM Spickzettel" - intro: "MFM ist eine Misskey-exklusive Markup-Sprache, die in Misskey an vielen\ - \ Stellen verwendet werden kann. Hier kannst du eine Liste von verfรผgbarer MFM-Syntax\ - \ einsehen." + intro: "MFM ist eine Markup-Sprache, die in Misskey, Calckey, Akkoma und anderen\ + \ Programmen verwendet wird und an vielen Stellen eingesetzt werden kann. Hier\ + \ kรถnnen Sie eine Liste aller verfรผgbaren MFM-Syntaxe einsehen." dummy: "Calckey erweitert die Welt des Fediverse" mention: "Erwรคhnung" mentionDescription: "Mit At-Zeichen und Nutzername kann ein individueller Nutzer\ @@ -1174,14 +1176,21 @@ _mfm: \ befindet." foreground: Vordergrundfarbe background: Hintergrundfarbe + positionDescription: Inhalt um einen bestimmten Betrag verschieben. + position: Position + scale: MaรŸstab + scaleDescription: Skaliere den Inhalt um einen bestimmten Betrag. + foregroundDescription: ร„ndern der Vordergrundfarbe von Text. + backgroundDescription: ร„ndern der Hintergrundfarbe von Text _instanceTicker: none: "Nie anzeigen" - remote: "Fรผr Nutzer fremder Instanzen anzeigen" + remote: "Fรผr Nutzer eines anderen Servers anzeigen" always: "Immer anzeigen" _serverDisconnectedBehavior: reload: "Automatisch aktualisieren" dialog: "Warnungsfenster zeigen" quiet: "Unaufdringlich warnen" + nothing: Nichts รคndern _channel: create: "Kanal erstellen" edit: "Kanal bearbeiten" @@ -1192,6 +1201,8 @@ _channel: following: "Gefolgt" usersCount: "{n} Teilnehmer" notesCount: "{n} Beitrรคge" + nameAndDescription: Name und Beschreibung + nameOnly: Nur den Namen _menuDisplay: sideFull: "Seitlich" sideIcon: "Seitlich (Icons)" @@ -1214,11 +1225,11 @@ _wordMute: mutedNotes: "Stummgeschaltete Beitrรคge" _instanceMute: instanceMuteDescription: "Schaltet alle Beitrรคge/boosts stumm, die von den gelisteten\ - \ Instanzen stammen, inklusive Antworten von Nutzern an einen Nutzer einer stummgeschalteten\ - \ Instanz." - instanceMuteDescription2: "Instanzen getrennt durch Zeilenumbrรผchen angeben" - title: "Blendet Beitrรคge von stummgeschalteten Instanzen aus." - heading: "Liste der stummzuschaltenden Instanzen" + \ Servern stammen, inklusive Antworten von Nutzern an einen Nutzer eines stummgeschalteten\ + \ Servers." + instanceMuteDescription2: "Mit Zeilenumbrรผchen trennen" + title: "Blendet Beitrรคge von aufgelisteten Servern aus." + heading: "Liste der stummzuschaltenden Server" _theme: explore: "Farbschemata erforschen" install: "Farbschemata installieren" @@ -1286,7 +1297,7 @@ _theme: buttonHoverBg: "Hintergrund von Schaltflรคchen (Mouseover)" inputBorder: "Rahmen von Eingabefeldern" listItemHoverBg: "Hintergrund von Listeneintrรคgen (Mouseover)" - driveFolderBg: "Hintergrund von Drive-Ordnern" + driveFolderBg: "Hintergrund von Cloud-Drive-Ordnern" wallpaperOverlay: "Hintergrundbild-Overlay" badge: "Wappen" messageBg: "Hintergrund von Chats" @@ -1299,18 +1310,18 @@ _sfx: notification: "Benachrichtigungen" chat: "Chat" chatBg: "Chat (Hintergrund)" - antenna: "Antennen" + antenna: "News-Picker" channel: "Kanalbenachrichtigung" _ago: future: "Zukunft" justNow: "Gerade eben" - secondsAgo: "vor {n} Sekunde(n)" - minutesAgo: "vor {n} Minute(n)" - hoursAgo: "vor {n} Stunde(n)" - daysAgo: "vor {n} Tag(en)" - weeksAgo: "vor {n} Woche(n)" - monthsAgo: "vor {n} Monat(en)" - yearsAgo: "vor {n} Jahr(en)" + secondsAgo: "vor {n} s" + minutesAgo: "vor {n} min" + hoursAgo: "vor {n} h" + daysAgo: "vor {n} T" + weeksAgo: "vor {n} W" + monthsAgo: "vor {n} M" + yearsAgo: "vor {n} J" _time: second: "Sekunde(n)" minute: "Minute(n)" @@ -1323,36 +1334,36 @@ _tutorial: step2_1: "Bitte fรผllen Sie zuerst Ihr Profil aus." step2_2: "Wenn du ein paar Angaben zu deiner Person machst, kรถnnen andere leichter\ \ erkennen, ob sie deine Beitrรคge sehen oder dir folgen wollen." - step3_1: "Jetzt ist es Zeit, einigen Leuten zu folgen!" + step3_1: "Jetzt ist es an der Zeit, einigen Leuten zu folgen!" step3_2: "Deine Home- und Social-Timeline basiert darauf, wem du folgst, also folge\ - \ fรผr den Anfang ein paar Accounts.\nKlicke das Plus Symbol oben links in einem\ - \ Profil um es zu folgen." + \ fรผr den Anfang ein paar Nutzerkonten.\nKlicke das Plus Symbol oben links in\ + \ einem Profil um ihm zu folgen." step4_1: "Wir bringen dich nach drauรŸen." - step4_2: "Fรผr deinen ersten Beitrag machen manche Leute gerne einen {introduction}\ - \ Beitrag oder ein einfaches \"Hallo Welt!\"" + step4_2: "Fรผr Ihren ersten Beitrag machen einige Leute gerne einen {introduction}-Beitrag\ + \ oder ein einfaches \"Hallo Welt!\"" step5_1: "Timelines, Timelines รผberall!" - step5_2: "Deine Instanz hat {Zeitleisten} verschiedene Zeitleisten aktiviert." - step5_3: "Die Zeitleiste Home {icon} ist die Zeitleiste, in der du die Beitrรคge\ - \ der Accounts sehen kannst, denen du folgst und von jedem anderen auf dieser\ - \ Instanz. Solltest du bevorzugen, dass deine Home Zeitleiste nur Beitrรคge von\ - \ den Accounts enthรคlt, denen du folgst, kannst du das ganz einfach in den Einstellungen\ + step5_2: "Dein Server hat {timelines} verschiedene Timelines aktiviert." + step5_3: "Die {icon} Home-Timeline ist die Timeline, in der du die Beitrรคge der\ + \ Nutzerkonten sehen kannst, denen du folgst und von jedem anderen auf diesem\ + \ Server. Solltest du bevorzugen, dass deine Home-Timeline nur Beitrรคge von den\ + \ Nutzerkonten enthรคlt, denen du folgst, kannst du das ganz einfach in den Einstellungen\ \ รคndern!" - step5_4: "In der lokalen {Icon} Zeitleiste kannst du die Beitrรคge aller anderen\ - \ Mitglieder dieser Instanz sehen." - step5_5: "In der Zeitleiste Empfohlen {icon} kannst du Beitrรคge von Instanzen sehen,\ - \ die von den Administratoren empfohlen werden." - step5_6: "In der sozialen {icon} Zeitleiste kannst du Beitrรคge von Freunden deiner\ - \ Follower sehen." - step5_7: "In der globalen {icon} Zeitleiste kannst du Beitrรคge von allen anderen\ - \ verbundenen Instanzen sehen." + step5_4: "In der {Icon} Local-Timeline kannst du die Beitrรคge aller anderen Mitglieder\ + \ dieses Servers sehen." + step5_5: "Die {icon} Social-Timeline zeigt dir ausschlieรŸlich Beitrรคge von Nutzerkonten\ + \ denen Du folgst." + step5_6: "In der {icon} Empfehlungen-Timeline kannst du Beitrรคge von Servern sehen,\ + \ die dir von den Server-Administratoren empfohlen/vorgeschlagen werden." + step5_7: "In der {icon} Global-Timeline kรถnnen Sie Beitrรคge von jedem anderen verbundenen\ + \ Server im fediverse sehen." step6_1: "Also, was ist das hier?" - step6_2: "Nun, du bist nicht nur Calckey beigetreten. Du bist einem Portal zum Fediversum\ - \ beigetreten, einem zusammenhรคngenden Netzwerk von Tausenden von Servern, genannt\ - \ \"Instanzen\"." - step6_3: "Jeder Server funktioniert auf unterschiedliche Weise, und nicht auf allen\ - \ Servern lรคuft Calckey. Dieser hier aber schon! Es ist ein bisschen kompliziert,\ - \ aber du wirst den Dreh schnell raus haben." - step6_4: "Jetzt geh, erkunde und hab SpaรŸ!" + step6_2: "Schรถn, mit Deiner Anmeldung zu Calckey bist Du gleichzeitig einem Portal\ + \ zum Fediverse beigetreten, einem Netzwerk mit Tausenden von verbundenen Servern\ + \ (hรคufig noch als \"Instanzen\" bezeichnet)." + step6_3: "Jeder der Server funktioniert auf unterschiedliche Weise, und nicht alle\ + \ Server fรผhren Calckey aus. Dieser jedoch schon! Es ist zu Beginn vielleicht\ + \ ein wenig kompliziert, aber Sie werden in kรผrzester Zeit den Dreh raus haben." + step6_4: "Jetzt bist Du startbereit, entdecke die Mรถglichkeiten und hab SpaรŸ dabei!" _2fa: alreadyRegistered: "Du hast bereits ein Gerรคt fรผr Zwei-Faktor-Authentifizierung\ \ registriert." @@ -1373,8 +1384,8 @@ _permissions: "write:account": "Deine Nutzerkontoinformationen bearbeiten" "read:blocks": "Die Liste deiner blockierten Nutzer lesen" "write:blocks": "Die Liste deiner blockierten Nutzer bearbeiten" - "read:drive": "Deine Drive-Dateien und Ordner lesen" - "write:drive": "Deine Drive-Dateien und Ordner bearbeiten oder lรถschen" + "read:drive": "Deine Cloud-Drive-Dateien und Ordner lesen" + "write:drive": "Deine Cloud-Drive-Dateien und Ordner bearbeiten oder lรถschen" "read:favorites": "Deine Lesezeichen-Liste lesen" "write:favorites": "Deine Lesezeichen-Liste bearbeiten" "read:following": "Die Liste der Nutzer, denen du folgst, lesen" @@ -1389,19 +1400,19 @@ _permissions: "read:reactions": "Reaktionen lesen" "write:reactions": "Reaktionen bedienen" "write:votes": "Umfragen bedienen" - "read:pages": "Deine Seiten lesen" - "write:pages": "Deine Seiten bearbeiten oder lรถschen" - "read:page-likes": "Liste der Seiten, die mir gefallen, lesen" - "write:page-likes": "Liste der Seiten, die mir gefallen, bearbeiten" + "read:pages": "Deine Nutzer-Seiten lesen" + "write:pages": "Deine Nutzer-Seiten bearbeiten oder lรถschen" + "read:page-likes": "Liste der Nutzer-Seiten, die mir gefallen, lesen" + "write:page-likes": "Liste der Nutzer-Seiten, die mir gefallen, bearbeiten" "read:user-groups": "Nutzergruppen lesen" "write:user-groups": "Nutzergruppen bearbeiten oder lรถschen" - "read:channels": "Kanรคle lesen" - "write:channels": "Kanรคle bedienen" - "read:gallery": "Beitrรคge deiner Galerie lesen" - "write:gallery": "Deine Galerie bearbeiten" - "read:gallery-likes": "Liste deiner mit \"Gefรคllt mir\" markierten Galerie-Beitrรคge\ + "read:channels": "Channels lesen" + "write:channels": "Channels bedienen" + "read:gallery": "Beitrรคge deiner Bilder-Galerie lesen" + "write:gallery": "Deine Bilder-Galerie bearbeiten" + "read:gallery-likes": "Liste deiner mit \"Gefรคllt mir\" markierten Bilder-Galerie-Beitrรคge\ \ lesen" - "write:gallery-likes": "Liste deiner mit \"Gefรคllt mir\" markierten Galerie-Beitrรคge\ + "write:gallery-likes": "Liste deiner mit \"Gefรคllt mir\" markierten Bilder-Galerie-Beitrรคge\ \ bearbeiten" _auth: shareAccess: "Mรถchtest du โ€ž{name}โ€œ authorisieren, auf dieses Nutzerkonto zugreifen\ @@ -1419,7 +1430,7 @@ _antennaSources: users: "Beitrรคge von einem oder mehreren angegebenen Nutzern" userList: "Beitrรคge von allen Nutzern einer Liste" userGroup: "Beitrรคge von allen Nutzern einer Gruppe" - instances: Beitrรคge von allen Nutzern auf einer Instanz + instances: Beitrรคge von allen Nutzern auf einem Server _weekday: sunday: "Sonntag" monday: "Montag" @@ -1436,13 +1447,13 @@ _widgets: trends: "Trends" clock: "Uhr" rss: "RSS-Reader" - rssTicker: "RSS-Ticker" + rssTicker: "RSS-Laufschrift (Ticker)" activity: "Aktivitรคt" photos: "Fotos" digitalClock: "Digitaluhr" unixClock: "UNIX-Uhr" federation: "Fรถderation" - instanceCloud: "Instanzwolke" + instanceCloud: "Server-Cloud" postForm: "Beitragsfeld" slideshow: "Diashow" button: "Knopf" @@ -1484,14 +1495,14 @@ _poll: _visibility: public: "ร–ffentlich" publicDescription: "Dein Beitrag wird global fรผr alle Nutzer sichtbar sein" - home: "Startseite" - homeDescription: "Beitrag nur auf der Startseite anzeigen" + home: "nicht aufgelistet" + homeDescription: "Beitrag nur auf der Home-Timeline anzeigen" followers: "Follower" followersDescription: "Nur fรผr Follower sichtbar" specified: "Direkt" specifiedDescription: "Nur fรผr bestimmte Nutzer sichtbar" localOnly: "Nur Lokal" - localOnlyDescription: "Unsichtbar fรผr Nutzer anderer Instanzen" + localOnlyDescription: "Unsichtbar fรผr Nutzer anderer Server" _postForm: replyPlaceholder: "Diesem Beitrag antworten โ€ฆ" quotePlaceholder: "Diesen Beitrag zitieren โ€ฆ" @@ -1516,6 +1527,8 @@ _profile: metadataContent: "Inhalt" changeAvatar: "Profilbild รคndern" changeBanner: "Banner รคndern" + locationDescription: Wenn Sie Ihren Ort zuerst eingeben, wird fรผr andere Benutzer + die Ortszeit angezeigt. _exportOrImport: allNotes: "Alle Beitrรคge" followingList: "Gefolgte Nutzer" @@ -1532,7 +1545,7 @@ _charts: activeUsers: "Aktive Nutzer" notesIncDec: "Unterschied bei der Anzahl an Beitrรคgen" localNotesIncDec: "Unterschied bei der Anzahl an lokalen Beitrรคgen" - remoteNotesIncDec: "Unterschied bei der Anzahl an Beitrรคgen von fremden Instanzen" + remoteNotesIncDec: "Differenz zur Anzahl von Beitrรคgen von anderen Servern." notesTotal: "Anzahl aller Beitrรคge" filesIncDec: "Unterschied in der Anzahl an Dateien" filesTotal: "Anzahl aller Dateien" @@ -1551,10 +1564,10 @@ _instanceCharts: files: "Unterschied in der Anzahl an Dateien" filesTotal: "Gesamtanzahl an Dateien" _timelines: - home: "Startseite" - local: "Lokal" - social: "Sozial" - global: "Global" + home: "Home-TL" + local: "Local-TL" + social: "Social-TL" + global: "Global-TL" recommended: Empfehlungen _pages: newPage: "Seite erstellen" @@ -1572,21 +1585,21 @@ _pages: viewPage: "Seite anschauen" like: "Gefรคllt mir" unlike: "\"Gefรคllt mir\" entfernen" - my: "Meine Seiten" - liked: "Seiten, die mir gefallen" + my: "Meine Nutzer-Seiten" + liked: "Nutzer-Seiten, die mir gefallen" featured: "Beliebt" inspector: "Inspektor" contents: "Inhalte" content: "Seitenblock" variables: "Variablen" title: "Titel" - url: "Seiten-URL" + url: "Nutzer-Seiten-URL" summary: "Zusammenfassung" alignCenter: "Zentrieren" - hideTitleWhenPinned: "Seitentitel wenn angeheftet ausblenden" + hideTitleWhenPinned: "Nutzer-Seitentitel wenn angeheftet ausblenden" font: "Schriftart" fontSerif: "Serif" - fontSansSerif: "Sans Serif" + fontSansSerif: "sans-serif" eyeCatchingImageSet: "Vorschaubild festlegen" eyeCatchingImageRemove: "Vorschaubild entfernen" chooseBlock: "Block hinzufรผgen" @@ -1896,9 +1909,9 @@ _deck: swapDown: "Mit unterer Spalte tauschen" stackLeft: "Auf linke Spalte stapeln" popRight: "Nach rechts vom Stapel nehmen" - profile: "Profil" - newProfile: "Neues Profil" - deleteProfile: "Profil lรถschen" + profile: "Arbeitsbereich" + newProfile: "Neuer Arbeitsbereich" + deleteProfile: "Arbeitsbereich lรถschen" introduction: "Erstelle eine auf dich zugeschneiderte Benutzeroberflรคche durch das\ \ Aneinanderreihen von Spalten!" introduction2: "Klicke auf das + rechts um wann immer du mรถchtest neue Spalten hinzuzufรผgen." @@ -1909,67 +1922,61 @@ _deck: widgets: "Widgets" notifications: "Benachrichtigungen" tl: "Timeline" - antenna: "Antennen" + antenna: "News-Picker" list: "Listen" mentions: "Erwรคhnungen" direct: "Direktnachrichten" + renameProfile: Arbeitsbereich umbenennen + nameAlreadyExists: Der Name fรผr den Arbeitsbereich ist bereits vorhanden. enableRecommendedTimeline: Empfohlenen Zeitplan aktivieren secureMode: Sicherer Modus (Autorisierter Abruf) -instanceSecurity: Instanzsicherheit +instanceSecurity: Serversicherheit manageGroups: Gruppen verwalten noThankYou: Nein, danke privateMode: Privater Modus -enableEmojiReactions: Emoji-Rรผckmeldungen aktivieren +enableEmojiReactions: Emoji-Reaktionen aktivieren flagSpeakAsCat: Wie eine Katze sprechen -showEmojisInReactionNotifications: Emojis in Rรผckmeldungen anzeigen +showEmojisInReactionNotifications: Emojis in Reaktionsbenachrichtigungen anzeigen userSaysSomethingReason: '{name} sagte {reason}' hiddenTagsDescription: 'Liste die Hashtags (ohne #) welche du von Trending und Explore verstecken mรถchtest. Versteckte Hashtags sind durch andere Wege weiterhin auffindbar. - Blockierte Instanzen sind nicht betroffen, auch wenn sie hier aufgefรผhrt sind.' -addInstance: Instanz hinzufรผgen -flagSpeakAsCatDescription: Deine Posts werden im Katzenmodus "nya-ifiziert" + Blockierte Server sind nicht betroffen, auch wenn sie hier aufgefรผhrt sind.' +addInstance: Server hinzufรผgen +flagSpeakAsCatDescription: Deine Beitrรคge werden im Katzenmodus nyanisiert hiddenTags: Versteckte Hashtags -antennaInstancesDescription: Nenne einen Instanzen-Host pro Zeile -secureModeInfo: Bei Anfragen an andere Instanzen nicht ohne Nachweis zurรผcksenden. +antennaInstancesDescription: Nenne einen Servernamen pro Zeile +secureModeInfo: Bei Anfragen an andere Server nicht ohne Nachweis zurรผcksenden. renoteMute: Boosts stummschalten renoteUnmute: Stummschaltung von Boosts aufheben -noInstances: Es gibt keine Instanzen -privateModeInfo: Wenn diese Option aktiviert ist, kรถnnen nur Instanzen auf der Whitelist - mit Deinen Instanzen fรถderieren. Alle Beitrรคge werden fรผr die ร–ffentlichkeit verborgen. -allowedInstances: Instanzen auf der Whitelist -selectInstance: Wรคhle eine Instanz -silencedInstancesDescription: Liste die Hostnamen der Instanzen auf, die du stummschalten - mรถchtest. Konten in den aufgelisteten Instanzen werden als "Stumm" behandelt, kรถnnen - nur Follow-Anfragen stellen und kรถnnen keine lokalen Konten erwรคhnen, wenn sie nicht - gefolgt werden. Dies wirkt sich nicht auf die blockierten Instanzen aus. +noInstances: Es gibt keine Server +privateModeInfo: Wenn diese Option aktiviert ist, kรถnnen nur als vertrauenswรผrdig + eingestufte Server mit deinem Server fรถderieren. Alle Beitrรคge werden fรผr die ร–ffentlichkeit + verborgen. +allowedInstances: Vertrauenswรผrdige Server +selectInstance: Wรคhle einen Server +silencedInstancesDescription: Liste die Hostnamen der Server auf, die du stummschalten + mรถchtest. Nutzerkonten in den aufgelisteten Servern werden als "Stumm" behandelt, + kรถnnen nur Follow-Anfragen stellen und kรถnnen keine lokalen Nutzerkonten erwรคhnen, + wenn sie nicht gefolgt werden. Dies wirkt sich nicht auf die blockierten Server + aus. editNote: Beitrag bearbeiten edited: Bearbeitet -silenceThisInstance: Diese Instanz stummschalten -silencedInstances: Stummgeschaltete Instanzen +silenceThisInstance: Diesen Server stummschalten +silencedInstances: Stummgeschaltete Server silenced: Stummgeschaltet deleted: Gelรถscht breakFollowConfirm: Sind sie sicher, dass sie eine(n) Follower entfernen mรถchten? unsubscribePushNotification: Push-Benachrichtigungen deaktivieren pushNotificationAlreadySubscribed: Push-Benachrichtigungen sind bereits aktiviert -pushNotificationNotSupported: Dein Browser oder die Instanz unterstรผtzt keine Push-Benachrichtigungen +pushNotificationNotSupported: Dein Browser oder der Server unterstรผtzt keine Push-Benachrichtigungen pushNotification: Push-Benachrichtigungen subscribePushNotification: Push-Benachrichtigungen aktivieren showLocalPosts: 'Zeige lokale Beitrรคge in:' -homeTimeline: Startseite +homeTimeline: Home-Timeline cannotUploadBecauseExceedsFileSizeLimit: Die Datei konnte nicht hochgeladen werden, - da sie die maximal zulรคssige GrรถรŸe รผberschreitet + da sie die maximal zulรคssige GrรถรŸe รผberschreitet. moveFromLabel: 'Nutzerkonto von dem Sie umziehen:' moveAccount: Nutzerkonto umziehen! -_apps: - mona: Mona - missLi: MissLi - thirdClass: Drittrangig - milktea: Milktea - theDesk: TheDesk - lesskey: Lesskey - mobile: Mobilgerรคte - paid: Zahlungspflichtige - free: Kostenlose defaultReaction: Standard-Emoji-Reaktion fรผr ausgehende und eingehende Beitrรคge moveTo: Umzug des Nutzerkontos zu einem neuen Nutzerkonto moveToLabel: 'Nutzerkonto zu dem sie umziehen:' @@ -1980,20 +1987,70 @@ moveAccountDescription: 'Dieser Vorgang kann nicht rรผckgรคngig gemacht werden! findOtherInstance: Einen anderen Server finden sendPushNotificationReadMessage: Lรถschung der Push-Benachrichtigungen sobald die entsprechenden Benachrichtigungen oder Beitrรคge gelesen wurden. -signupsDisabled: Anmeldungen auf diesem Server sind momentan nicht mรถglich, sie kรถnnen - sich jedoch jederzeit auf einem anderen Server anmelden! Wenn Sie einen Einladungscode - fรผr diesen Server haben, geben Sie ihn bitte unten ein +signupsDisabled: Derzeit sind keine Anmeldungen auf diesem Server mรถglich! Anmeldungen + auf anderen Servern sind jedoch mรถglich! Wenn Sie einen Einladungscode fรผr diesen + Server haben, geben Sie ihn bitte unten ein. swipeOnDesktop: Am Desktop PC das Wischen wie bei mobilen Gerรคten zulassen enterSendsMessage: Drรผcken sie zum Senden des Beitrages die Eingabetaste (Strg-Taste ausgeschaltet) -showUpdates: Zeigt ein Popup an, wenn Calckey aktualisiert wird. -socialTimeline: Soziale Zeitleiste +showUpdates: Zeigt ein Popup-Fenster an, wenn Calckey aktualisiert wird. +socialTimeline: Social-Timeline moveFrom: Bisheriges Nutzerkonto zu diesem Nutzerkonto umziehen _messaging: groups: Gruppen -recommendedInstances: Empfohlene Instanzen + dms: Persรถnlich +recommendedInstances: Empfohlene Server logoImageUrl: URL des Logo-Bildes userSaysSomethingReasonReply: '{name} hat auf einen Beitrag geantwortet der {reason} beinhaltet' userSaysSomethingReasonRenote: '{name} hat einen Beitrag geteilt der {reason} beinhaltet' userSaysSomethingReasonQuote: '{name} hat einen Beitrag zitiert der {reason} beinhaltet' +seperateRenoteQuote: Getrennte Boost- und Zitat-Schaltflรคchen +showAds: Anzeigen anzeigen +splash: BegrรผรŸungsbildschirm +customSplashIconsDescription: URLs fรผr benutzerdefinierte Splash-Screen-Symbole, die + durch Zeilenumbrรผche getrennt sind und nach dem Zufallsprinzip jedes Mal angezeigt + werden, wenn ein Benutzer die Seite lรคdt/neu lรคdt. Bitte stelle sicher, dass die + Bilder unter einer statischen URL stehen, vorzugsweise alle in der GrรถรŸe 192x192. +sendPushNotificationReadMessageCaption: Eine Benachrichtigung mit dem Text "{emptyPushNotificationMessage}" + wird fรผr kurze Zeit angezeigt. Dies kann ggf. den Akkuverbrauch Ihres Gerรคts erhรถhen. +customSplashIcons: Benutzerdefinierte BegrรผรŸungsbildschirmsymbole (URLs) +adminCustomCssWarn: Diese Einstellung sollte nur verwendet werden, wenn Sie wissen, + was sie tut. Die Eingabe falscher Werte kann dazu fรผhren, dass ALLE Clients nicht + mehr normal funktionieren. Bitte stellen Sie sicher, dass Ihr CSS ordnungsgemรครŸ + funktioniert, indem Sie es in Ihren Benutzereinstellungen testen. +customMOTD: Benutzerdefinierte Meldung des Tages (BegrรผรŸungsbildschirmmeldungen) +allowedInstancesDescription: Hosts von Instanzen, die fรผr den Verbund auf die Whitelist + gesetzt werden sollen, jeweils durch eine neue Zeile getrennt (gilt nur im privaten + Modus). +migration: Migration +updateAvailable: Es kรถnnte eine Aktualisierung verfรผgbar sein! +showAdminUpdates: Anzeigen, dass eine neue Calckey-Version verfรผgbar ist (nur Administrator) +customMOTDDescription: Benutzerdefinierte Meldungen fรผr die Meldung des Tages (BegrรผรŸungsbildschirm), + die durch Zeilenumbrรผche getrennt sind und nach dem Zufallsprinzip jedes Mal angezeigt + werden, wenn ein Benutzer die Seite (neu) lรคdt. +recommendedInstancesDescription: Empfohlene Instanzen, die durch Zeilenumbrรผche getrennt + sind, werden in der empfohlenen Zeitachse angezeigt. Fรผgen Sie NICHT "https://" + hinzu, sondern NUR die Domain. +sendModMail: Moderationshinweis senden +moveFromDescription: 'Dadurch wird ein Alias Ihres alten Nutzerkontos festgelegt, + sodass Sie von ihrem bisherigen Konto zu diesem Nutzerkonto wechseln kรถnnen. Tun + Sie dies, BEVOR Sie von Ihrem bisherigen Nutzerkonto hierhin wechseln. Bitte geben + Sie den Namen des Nutzerkontos wie folgt ein: person@server.xyz' +preventAiLearning: KI gestรผtztes bot-scraping unterdrรผcken +preventAiLearningDescription: Fordern Sie KI-Sprachmodelle von Drittanbietern auf, + die von Ihnen hochgeladenen Inhalte, wie z. B. Beitrรคge und Bilder, nicht zu untersuchen. +license: Genehmigung +indexPosts: Gelistete Beitrรคge +migrationConfirm: "Sind Sie absolut sicher, dass Sie Ihr Nutzerkonto zu diesem {account}\ + \ umziehen mรถchten? Sobald Sie dies bestรคtigt haben, kann dies nicht mehr rรผckgรคngig\ + \ gemacht werden und Ihr Nutzerkonto kann nicht mehr von ihnen genutzt werden.\n\ + Stellen Sie auรŸerdem sicher, dass Sie dieses Nutzerkonto als das Konto festgelegt\ + \ haben, von dem Sie umziehen." +noteId: Beitrags-ID +customKaTeXMacro: Individuelle KaTeX Makros +enableCustomKaTeXMacro: Individuelle KaTeX-Makros aktivieren +replayTutorial: Wiederhole die Benutzeranleitung +apps: Apps +caption: Automatische Untertitelung +pwa: PWA installieren diff --git a/locales/en-US.yml b/locales/en-US.yml index f34855fcd..9cb58e6ef 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -874,7 +874,7 @@ instanceSecurity: "Instance Security" secureModeInfo: "When requesting from other instances, do not send back without proof." privateMode: "Private Mode" privateModeInfo: "When enabled, only whitelisted instances can federate with your\ - \ instances. All posts will be hidden from the public." + \ instance. All posts will be hidden from the public." allowedInstances: "Whitelisted Instances" allowedInstancesDescription: "Hosts of instances to be whitelisted for federation,\ \ each separated by a new line (only applies in private mode)." @@ -886,7 +886,6 @@ global: "Global" recommended: "Recommended" squareAvatars: "Display squared avatars" seperateRenoteQuote: "Separate boost and quote buttons" -highlightCw: "Highlight content warned posts" sent: "Sent" received: "Received" searchResult: "Search results" @@ -1078,8 +1077,15 @@ customKaTeXMacroDescription: "Set up macros to write mathematical expressions ea \ supported; advanced syntax, such as conditional branching, cannot be used here." enableCustomKaTeXMacro: "Enable custom KaTeX macros" noteId: "Post ID" -signupsDisabled: "Signups on this server are currently disabled, but you can always sign up at another server! If you have an invitation code for this server, please enter it below." +signupsDisabled: "Signups on this server are currently disabled, but you can always\ + \ sign up at another server! If you have an invitation code for this server, please\ + \ enter it below." findOtherInstance: "Find another server" +apps: "Apps" +sendModMail: "Send Moderation Notice" +preventAiLearning: "Prevent AI bot scraping" +preventAiLearningDescription: "Request third-party AI language models not to study content you upload, such as posts and images." + _sensitiveMediaDetection: description: "Reduces the effort of server moderation through automatically recognizing\ @@ -1187,6 +1193,10 @@ _nsfw: ignore: "Don't hide NSFW media" force: "Hide all media" _mfm: + play: "Play MFM" + stop: "Stop MFM" + warn: "MFM may contain rapidly moving or flashy animations" + alwaysPlay: "Always autoplay all animated MFM" cheatSheet: "MFM Cheatsheet" intro: "MFM is a markup language used on Misskey, Calckey, Akkoma, and more that\ \ can be used in many places. Here you can view a list of all available MFM syntax." @@ -1998,20 +2008,3 @@ _deck: list: "List" mentions: "Mentions" direct: "Direct messages" -_apps: - apps: "Apps" - crossPlatform: "Cross platform" - mobile: "Mobile" - firstParty: "First party" - firstClass: "First class" - secondClass: "Second class" - thirdClass: "Third class" - free: "Free" - paid: "Paid" - pwa: "Install PWA" - kaiteki: "Kaiteki" - milktea: "Milktea" - missLi: "MissLi" - mona: "Mona" - theDesk: "TheDesk" - lesskey: "Lesskey" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index c9811e3c0..45d467d0a 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -14,7 +14,7 @@ ok: "OK" gotIt: "ยกLo tengo!" cancel: "Cancelar" enterUsername: "Introduce el nombre de usuario" -renotedBy: "Reposteado por {user}" +renotedBy: "Impulsado por {user}" noNotes: "No hay publicaciones" noNotifications: "No hay notificaciones" instance: "Instancia" @@ -46,7 +46,7 @@ copyLink: "Copiar enlace" delete: "Borrar" deleteAndEdit: "Borrar y editar" deleteAndEditConfirm: "ยฟEstรกs seguro de que quieres borrar esta publicaciรณn y editarla?\ - \ Perderรกs todas las reacciones, impulsados y respuestas." + \ Perderรกs todas las reacciones, impulsos y respuestas." addToList: "Agregar a lista" sendMessage: "Enviar un mensaje" copyUsername: "Copiar nombre de usuario" @@ -342,7 +342,7 @@ dayX: "Dรญa {day}" monthX: "Mes {month}" yearX: "Aรฑo {year}" pages: "Pรกginas" -integration: "Integraciรณn" +integration: "Integraciones" connectService: "Conectar" disconnectService: "Desconectar" enableLocalTimeline: "Habilitar linea de tiempo local" @@ -366,7 +366,7 @@ pinnedPages: "Pรกginas fijadas" pinnedPagesDescription: "Describa las rutas de las pรกginas que desea fijar a la pรกgina\ \ principal de la instancia, separadas por lineas nuevas" pinnedClipId: "Id del clip fijado" -pinnedNotes: "Nota fijada" +pinnedNotes: "Publicaciรณn fijada" hcaptcha: "hCaptcha" enableHcaptcha: "Habilitar hCaptcha" hcaptchaSiteKey: "Clave del sitio" @@ -386,14 +386,14 @@ antennaKeywords: "Palabras clave para recibir" antennaExcludeKeywords: "Palabras clave para excluir" antennaKeywordsDescription: "Separar con espacios es una declaraciรณn AND, separar\ \ con una linea nueva es una declaraciรณn OR" -notifyAntenna: "Notificar nueva nota" -withFileAntenna: "Sรณlo notas con archivos adjuntados" +notifyAntenna: "Notificar nueva publicaciรณn" +withFileAntenna: "Sรณlo publicaciones con archivos adjuntados" enableServiceworker: "Activar ServiceWorker" antennaUsersDescription: "Elegir nombres de usuarios separados por una linea nueva" caseSensitive: "Distinguir mayรบsculas de minรบsculas" withReplies: "Incluir respuestas" connectedTo: "Estas cuentas estรกn conectadas" -notesAndReplies: "Notas y respuestas" +notesAndReplies: "Publicaciones y respuestas" withFiles: "Adjuntos" silence: "Silenciar" silenceConfirm: "ยฟDesea silenciar al usuario?" @@ -430,7 +430,7 @@ notFoundDescription: "No se encontrรณ la pรกgina correspondiente a la URL elegid uploadFolder: "Carpeta de subidas por defecto" cacheClear: "Borrar cachรฉ" markAsReadAllNotifications: "Marcar todas las notificaciones como leรญdas" -markAsReadAllUnreadNotes: "Marcar todas las notas como leรญdas" +markAsReadAllUnreadNotes: "Marcar todas las publicaciones como leรญdas" markAsReadAllTalkMessages: "Marcar todos los chats como leรญdos" help: "Ayuda" inputMessageHere: "Escribe el mensaje aquรญ" @@ -451,7 +451,7 @@ text: "Texto" enable: "Activar" next: "Siguiente" retype: "Intentar de nuevo" -noteOf: "Notas de {user}" +noteOf: "Publicaciones de {user}" inviteToGroup: "Invitar al grupo" quoteAttached: "Cita aรฑadida" quoteQuestion: "ยฟQuiere aรฑadir una cita?" @@ -511,8 +511,8 @@ accountSettings: "Ajustes de cuenta" promotion: "Promovido" promote: "Promover" numberOfDays: "Cantidad de dias" -hideThisNote: "Ocultar esta nota" -showFeaturedNotesInTimeline: "Mostrar notas destacadas en la lรญnea de tiempo" +hideThisNote: "Ocultar esta publicaciรณn" +showFeaturedNotesInTimeline: "Mostrar publicaciones destacadas en la lรญnea de tiempo" objectStorage: "Almacenamiento de objetos" useObjectStorage: "Usar almacenamiento de objetos" objectStorageBaseUrl: "Base URL" @@ -542,7 +542,7 @@ objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir " serverLogs: "Registros del servidor" deleteAll: "Eliminar todos" showFixedPostForm: "Mostrar el formulario de las entradas encima de la lรญnea de tiempo" -newNoteRecived: "Tienes una nota nuevo" +newNoteRecived: "Tienes unas publicaciones nuevas" sounds: "Sonidos" listen: "Escuchar" none: "Ninguna" @@ -575,7 +575,7 @@ deleteAllFiles: "Borrar todos los archivos" deleteAllFilesConfirm: "ยฟDesea borrar todos los archivos?" removeAllFollowing: "Retener todos los siguientes" removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}.\ - \ Ejecutar en caso de que esta instancia haya dejado de existir" + \ Ejecutar en caso de que esta instancia haya dejado de existir." userSuspended: "Este usuario ha sido suspendido." userSilenced: "Este usuario ha sido silenciado." yourAccountSuspendedTitle: "Esta cuenta ha sido suspendida" @@ -590,8 +590,8 @@ addRelay: "Agregar relรฉ" inboxUrl: "Inbox URL" addedRelays: "Relรฉs aรฑadidos" serviceworkerInfo: "Se necesita activar para usar las notificaciones push" -deletedNote: "Nota eliminada" -invisibleNote: "Nota oculta" +deletedNote: "Publicaciรณn eliminada" +invisibleNote: "Publicaciรณn oculta" enableInfiniteScroll: "Activar scroll infinito" visibility: "Visibilidad" poll: "Encuesta" @@ -1154,6 +1154,7 @@ _mfm: plain: "Plano" plainDescription: "Desactiva los efectos de todo el contenido MFM con este efecto\ \ MFM." + position: Posiciรณn _instanceTicker: none: "No mostrar" remote: "Mostrar a usuarios remotos" @@ -1173,6 +1174,8 @@ _channel: following: "Siguiendo" usersCount: "{n} participantes" notesCount: "{n} notas" + nameOnly: Nombre solamente + nameAndDescription: Nombre y descripciรณn _menuDisplay: sideFull: "Horizontal" sideIcon: "Horizontal (รญcono)" @@ -1900,18 +1903,6 @@ moveFrom: Mueve a esta cuenta de una cuenta antigua moveFromLabel: 'La cuenta que estรกs moviendo de:' moveAccountDescription: '' license: Licencia -_apps: - apps: Aplicaciones - crossPlatform: Plataforma Cruzada - mobile: Telรฉfono mรณvil - secondClass: Segunda clase - lesskey: '' - firstClass: Primera clase - thirdClass: Tercera clase - theDesk: '' - pwa: Instalar PWA - free: Gratis - paid: Pagado noThankYou: No gracias userSaysSomethingReason: '{name} dijo {reason}' hiddenTags: Etiquetas Ocultas @@ -1928,3 +1919,12 @@ _messaging: groups: Grupos dms: Privado pushNotification: Notificaciones +apps: Aplicaciones +migration: Migraciรณn +silenced: Silenciado +deleted: Eliminado +edited: Editado +editNote: Editar nota +silenceThisInstance: Silenciar esta instancia +findOtherInstance: Buscar otro servidor +userSaysSomethingReasonRenote: '{name} impulsรณ una publicaciรณn que contiene {reason]' diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 8c7bf8025..0037c90bb 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -70,7 +70,7 @@ export: "Exporter" files: "Fichiers" download: "Tรฉlรฉcharger" driveFileDeleteConfirm: "รŠtes-vous sรปrยทe de vouloir supprimer le fichier \"{name}\"\ - \ ? Les notes liรฉes ร  ce fichier seront aussi supprimรฉes." + \ ? Il sera retirรฉ de toutes ses notes liรฉes." unfollowConfirm: "Dรฉsirez-vous vous dรฉsabonner de {name} ?" exportRequested: "Vous avez demandรฉ une exportation. Lโ€™opรฉration pourrait prendre\ \ un peu de temps. Une terminรฉe, le fichier rรฉsultant sera ajoutรฉ au Drive." @@ -1931,7 +1931,8 @@ flagSpeakAsCatDescription: Vos messages seront nyanifiรฉs en mode chat hiddenTags: Hashtags cachรฉs hiddenTagsDescription: "Lister les hashtags (sans le #) que vous souhaitez cacher\ \ de tendances et explorer. Les hashtags cachรฉs sont toujours dรฉcouvrables par d'autres\ - \ moyens." + \ moyens. Les instances bloquรฉs ne sont pas ne sont pas affectรฉs, mรชme si ils sont\ + \ prรฉsent dans cette liste." antennaInstancesDescription: Lister un hรดte d'instance par ligne userSaysSomethingReason: '{name} a dit {reason}' breakFollowConfirm: รŠtes vous sur de vouloir retirer l'abonnรฉ ? @@ -2000,3 +2001,12 @@ customKaTeXMacroDescription: "Dรฉfinissez des macros pour รฉcrire des expression \ Seulement de simples fonctions de substitution de chaines sont supportรฉes; la\ \ syntaxe avancรฉe, telle que la ramification conditionnelle, ne peut pas รชtre utilisรฉe\ \ ici." +enableRecommendedTimeline: Activer la chronologie recommandรฉe +silenceThisInstance: Ne plus montrer cet instance +silencedInstances: Instances silencieuses +silenced: Silencieux +deleted: Effacรฉ +editNote: Modifier note +edited: Modifiรฉ +flagShowTimelineRepliesDescription: Si activรฉ, affiche dans le fil les rรฉponses des + personnes aux publications des autres. diff --git a/locales/id-ID.yml b/locales/id-ID.yml index bb3904e2e..68d459836 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -1,7 +1,9 @@ ---- _lang_: "Bahasa Indonesia" headlineMisskey: "Jaringan terhubung melalui catatan" -introMisskey: "Selamat datang! Misskey adalah perangkat mikroblog tercatu bersifat sumber terbuka.\nMulailah menuliskan catatan, bagikan peristiwa terkini, serta ceritakan segala tentangmu.๐Ÿ“ก\nTunjukkan juga reaksimu pada catatan pengguna lain.๐Ÿ‘\nMari jelajahi dunia baru๐Ÿš€" +introMisskey: "Selamat datang! Misskey adalah perangkat mikroblog tercatu bersifat\ + \ sumber terbuka.\nMulailah menuliskan catatan, bagikan peristiwa terkini, serta\ + \ ceritakan segala tentangmu.\U0001F4E1\nTunjukkan juga reaksimu pada catatan pengguna\ + \ lain.\U0001F44D\nMari jelajahi dunia baru\U0001F680" monthAndDay: "{day} {month}" search: "Penelusuran" notifications: "Pemberitahuan" @@ -44,7 +46,8 @@ copyContent: "Salin konten" copyLink: "Salin tautan" delete: "Hapus" deleteAndEdit: "Hapus dan sunting" -deleteAndEditConfirm: "Apakah kamu yakin ingin menghapus note ini dan menyuntingnya? Kamu akan kehilangan semua reaksi, renote dan balasan di note ini." +deleteAndEditConfirm: "Apakah kamu yakin ingin menghapus note ini dan menyuntingnya?\ + \ Kamu akan kehilangan semua reaksi, renote dan balasan di note ini." addToList: "Tambahkan ke daftar" sendMessage: "Kirim pesan" copyUsername: "Salin nama pengguna" @@ -66,7 +69,8 @@ files: "Berkas" download: "Unduh" driveFileDeleteConfirm: "Hapus {name}? Catatan dengan berkas terkait juga akan terhapus." unfollowConfirm: "Berhenti mengikuti {name}?" -exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Setelah ekspor selesai, berkas yang dihasilkan akan ditambahkan ke Drive" +exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Setelah\ + \ ekspor selesai, berkas yang dihasilkan akan ditambahkan ke Drive" importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat." lists: "Daftar" noLists: "Kamu tidak memiliki daftar apapun" @@ -81,9 +85,12 @@ error: "Galat" somethingHappened: "Terjadi kesalahan" retry: "Coba lagi" pageLoadError: "Gagal memuat halaman." -pageLoadErrorDescription: "Umumnya disebabkan jaringan atau tembolok perambah. Cobalah bersihkan tembolok peramban lalu tunggu sesaat sebelum mencoba kembali." -serverIsDead: "Tidak ada respon dari peladen. Mohon tunggu dan coba beberapa saat lagi." -youShouldUpgradeClient: "Untuk melihat halaman ini, mohon muat ulang untuk memutakhirkan klienmu." +pageLoadErrorDescription: "Umumnya disebabkan jaringan atau tembolok perambah. Cobalah\ + \ bersihkan tembolok peramban lalu tunggu sesaat sebelum mencoba kembali." +serverIsDead: "Tidak ada respon dari peladen. Mohon tunggu dan coba beberapa saat\ + \ lagi." +youShouldUpgradeClient: "Untuk melihat halaman ini, mohon muat ulang untuk memutakhirkan\ + \ klienmu." enterListName: "Masukkan nama daftar" privacy: "Privasi" makeFollowManuallyApprove: "Permintaan mengikuti membutuhkan persetujuan" @@ -108,7 +115,8 @@ sensitive: "Konten sensitif" add: "Tambahkan" reaction: "Reaksi" reactionSetting: "Reaksi untuk dimunculkan di bilah reaksi" -reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus, tekan \"+\" untuk menambahkan" +reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus,\ + \ tekan \"+\" untuk menambahkan" rememberNoteVisibility: "Ingat pengaturan visibilitas catatan" attachCancel: "Hapus lampiran" markAsSensitive: "Tandai sebagai konten sensitif" @@ -137,14 +145,22 @@ emojiUrl: "URL Emoji" addEmoji: "Tambahkan emoji" settingGuide: "Pengaturan rekomendasi" cacheRemoteFiles: "Tembolokkan berkas remote" -cacheRemoteFilesDescription: "Ketika pengaturan ini dinonaktifkan, berkas luar akan dimuat langsung dari instansi luar. Menonaktifkan ini akan mengurangi penggunaan penyimpanan, namun dapat menyebabkan meningkatkan lalu lintas bandwidth, karena thumbnail tidak dihasilkan." +cacheRemoteFilesDescription: "Ketika pengaturan ini dinonaktifkan, berkas luar akan\ + \ dimuat langsung dari instansi luar. Menonaktifkan ini akan mengurangi penggunaan\ + \ penyimpanan, namun dapat menyebabkan meningkatkan lalu lintas bandwidth, karena\ + \ thumbnail tidak dihasilkan." flagAsBot: "Atur akun ini sebagai Bot" -flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini. Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah interaksi berantai dengan bot lain dan menyesuaikan sistem internal Misskey untuk memperlakukan akun ini sebagai bot." +flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini.\ + \ Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah\ + \ interaksi berantai dengan bot lain dan menyesuaikan sistem internal Misskey untuk\ + \ memperlakukan akun ini sebagai bot." flagAsCat: "Atur akun ini sebagai kucing" flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing." flagShowTimelineReplies: "Tampilkan balasan di linimasa" -flagShowTimelineRepliesDescription: "Menampilkan balasan pengguna dari note pengguna lain di linimasa apabila dinyalakan." -autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang kamu ikuti" +flagShowTimelineRepliesDescription: "Menampilkan balasan pengguna dari note pengguna\ + \ lain di linimasa apabila dinyalakan." +autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang kamu\ + \ ikuti" addAccount: "Tambahkan akun" loginFailed: "Gagal untuk masuk" showOnRemote: "Lihat profil asli" @@ -156,7 +172,11 @@ searchWith: "Cari: {q}" youHaveNoLists: "Kamu tidak memiliki daftar apapun" followConfirm: "Apakah kamu yakin ingin mengikuti {name}?" proxyAccount: "Akun proksi" -proxyAccountDescription: "Akun proksi merupakan sebuah akun yang bertindak sebagai pengikut luar untuk pengguna dalam kondisi tertentu. Sebagai contoh, ketika pengguna menambahkan seorang pengguna luar ke dalam daftar, aktivitas dari pengguna luar tidak akan disampaikan ke instansi apabila tidak ada pengguna lokal yang mengikuti pengguna tersebut, dengan begitu akun proksilah yang akan mengikutinya." +proxyAccountDescription: "Akun proksi merupakan sebuah akun yang bertindak sebagai\ + \ pengikut luar untuk pengguna dalam kondisi tertentu. Sebagai contoh, ketika pengguna\ + \ menambahkan seorang pengguna luar ke dalam daftar, aktivitas dari pengguna luar\ + \ tidak akan disampaikan ke instansi apabila tidak ada pengguna lokal yang mengikuti\ + \ pengguna tersebut, dengan begitu akun proksilah yang akan mengikutinya." host: "Host" selectUser: "Pilih pengguna" recipient: "Penerima" @@ -187,11 +207,15 @@ instanceInfo: "Informasi Instansi" statistics: "Statistik" clearQueue: "Bersihkan antrian" clearQueueConfirmTitle: "Apakah kamu yakin ingin membersihkan antrian?" -clearQueueConfirmText: "Seluruh sisa catatan yang tidak tersampaikan di dalam antrian tidak akan difederasi. Biasanya operasi ini TIDAK dibutuhkan." +clearQueueConfirmText: "Seluruh sisa catatan yang tidak tersampaikan di dalam antrian\ + \ tidak akan difederasi. Biasanya operasi ini TIDAK dibutuhkan." clearCachedFiles: "Hapus tembolok" -clearCachedFilesConfirm: "Apakah kamu yakin ingin menghapus seluruh tembolok berkas remote?" +clearCachedFilesConfirm: "Apakah kamu yakin ingin menghapus seluruh tembolok berkas\ + \ remote?" blockedInstances: "Instansi terblokir" -blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi ini." +blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk\ + \ diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi\ + \ ini." muteAndBlock: "Bisukan / Blokir" mutedUsers: "Pengguna yang dibisukan" blockedUsers: "Pengguna yang diblokir" @@ -239,7 +263,8 @@ saved: "Telah disimpan" messaging: "Pesan" upload: "Unggah" keepOriginalUploading: "Simpan gambar asli" -keepOriginalUploadingDescription: "Simpan gambar yang diunggah sebagaimana gambar aslinya. Bila dimatikan, versi tampilan web akan dihasilkan pada saat diunggah." +keepOriginalUploadingDescription: "Simpan gambar yang diunggah sebagaimana gambar\ + \ aslinya. Bila dimatikan, versi tampilan web akan dihasilkan pada saat diunggah." fromDrive: "Dari Drive" fromUrl: "Dari URL" uploadFromUrl: "Unggah dari URL" @@ -255,7 +280,8 @@ agreeTo: "Saya setuju kepada {0}" tos: "Syarat dan ketentuan" start: "Mulai" home: "Beranda" -remoteUserCaution: "Informasi ini mungkin tidak mutakhir, karena pengguna ini berasal dari instansi luar." +remoteUserCaution: "Informasi ini mungkin tidak mutakhir, karena pengguna ini berasal\ + \ dari instansi luar." activity: "Aktivitas" images: "Gambar" birthday: "Tanggal lahir" @@ -288,7 +314,8 @@ unableToDelete: "Tidak dapat menghapus" inputNewFileName: "Masukkan nama berkas yang baru" inputNewDescription: "Masukkan keterangan disini" inputNewFolderName: "Masukkan nama folder yang baru" -circularReferenceFolder: "Folder tujuan adalah subfolder dari folder yang ingin kamu pindahkan." +circularReferenceFolder: "Folder tujuan adalah subfolder dari folder yang ingin kamu\ + \ pindahkan." hasChildFilesOrFolders: "Karena folder ini tidak kosong, maka tidak dapat dihapus." copyUrl: "Salin tautan" rename: "Ubah nama" @@ -322,7 +349,8 @@ connectService: "Sambungkan" disconnectService: "Putuskan" enableLocalTimeline: "Nyalakan linimasa lokal" enableGlobalTimeline: "Nyalakan linimasa global" -disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua linimasa meskipun linimasa tersebut tidak diaktifkan." +disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua linimasa\ + \ meskipun linimasa tersebut tidak diaktifkan." registration: "Pendaftaran" enableRegistration: "Nyalakan pendaftaran pengguna baru" invite: "Undang" @@ -334,9 +362,11 @@ bannerUrl: "URL Banner" backgroundImageUrl: "URL Gambar latar" basicInfo: "Informasi Umum" pinnedUsers: "Pengguna yang disematkan" -pinnedUsersDescription: "Tuliskan satu nama pengguna dalam satu baris. Pengguna yang dituliskan disini akan disematkan dalam bilah \"Jelajahi\"." +pinnedUsersDescription: "Tuliskan satu nama pengguna dalam satu baris. Pengguna yang\ + \ dituliskan disini akan disematkan dalam bilah \"Jelajahi\"." pinnedPages: "Halaman yang disematkan" -pinnedPagesDescription: "Masukkan tautan dari halaman yang kamu ingin sematkan ke halaman utama dari instansi ini, dipisah dengan membuat baris baru." +pinnedPagesDescription: "Masukkan tautan dari halaman yang kamu ingin sematkan ke\ + \ halaman utama dari instansi ini, dipisah dengan membuat baris baru." pinnedClipId: "ID dari klip yang disematkan" pinnedNotes: "Catatan yang disematkan" hcaptcha: "hCaptcha" @@ -347,14 +377,17 @@ recaptcha: "reCAPTCHA" enableRecaptcha: "Nyalakan reCAPTCHA" recaptchaSiteKey: "Site key" recaptchaSecretKey: "Secret Key" -avoidMultiCaptchaConfirm: "Menggunakan banyak Captcha dapat menyebabkan gangguan. Apakah kamu ingin untuk menonaktifkan Captcha yang lain? Kamu dapat membiarkan fitur ini tetap aktif dengan menekan tombol batal." +avoidMultiCaptchaConfirm: "Menggunakan banyak Captcha dapat menyebabkan gangguan.\ + \ Apakah kamu ingin untuk menonaktifkan Captcha yang lain? Kamu dapat membiarkan\ + \ fitur ini tetap aktif dengan menekan tombol batal." antennas: "Antena" manageAntennas: "Pengelola Antena" name: "Nama" antennaSource: "Sumber Antenna" antennaKeywords: "Kata kunci yang diterima" antennaExcludeKeywords: "Kata kunci yang dikecualikan" -antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR." +antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan\ + \ baris baru untuk kondisi OR." notifyAntenna: "Beritahu untuk catatan baru" withFileAntenna: "Hanya tampilkan catatan dengan berkas yang dilampirkan" enableServiceworker: "Aktifkan ServiceWorker" @@ -441,7 +474,8 @@ strongPassword: "Kata sandi kuat" passwordMatched: "Kata sandi sama" passwordNotMatched: "Kata sandi tidak sama" signinWith: "Masuk dengan {x}" -signinFailed: "Tidak dapat masuk. Nama pengguna atau kata sandi yang kamu masukkan salah." +signinFailed: "Tidak dapat masuk. Nama pengguna atau kata sandi yang kamu masukkan\ + \ salah." tapSecurityKey: "Ketuk kunci keamanan kamu" or: "atau" language: "Bahasa" @@ -482,19 +516,29 @@ showFeaturedNotesInTimeline: "Tampilkan catatan yang diunggulkan di linimasa" objectStorage: "Object Storage" useObjectStorage: "Gunakan object storage" objectStorageBaseUrl: "Base URL" -objectStorageBaseUrlDesc: "Prefix URL digunakan untuk mengkonstruksi URL ke object (media) referencing. Tentukan URL jika kamu menggunakan CDN atau Proxy, jika tidak tentukan alamat yang dapat diakses secara publik sesuai dengan panduan dari layanan yang akan kamu gunakan, contohnya. 'https://.s3.amazonaws.com' untuk AWS S3, dan 'https://storage.googleapis.com/' untuk GCS." +objectStorageBaseUrlDesc: "Prefix URL digunakan untuk mengkonstruksi URL ke object\ + \ (media) referencing. Tentukan URL jika kamu menggunakan CDN atau Proxy, jika tidak\ + \ tentukan alamat yang dapat diakses secara publik sesuai dengan panduan dari layanan\ + \ yang akan kamu gunakan, contohnya. 'https://.s3.amazonaws.com' untuk AWS\ + \ S3, dan 'https://storage.googleapis.com/' untuk GCS." objectStorageBucket: "Bucket" -objectStorageBucketDesc: "Mohon tentukan nama bucket yang digunakan pada layanan yang telah dikonfigurasi." +objectStorageBucketDesc: "Mohon tentukan nama bucket yang digunakan pada layanan yang\ + \ telah dikonfigurasi." objectStoragePrefix: "Prefix" objectStoragePrefixDesc: "Berkas tidak akan disimpan dalam direktori dari prefix ini." objectStorageEndpoint: "Endpoint" -objectStorageEndpointDesc: "Kosongkan bagian ini jika kamu menggunakan AWS S3, jika tidak tentukan endpoint sebagai '' atau ':' sesuai dengan panduan dari layanan yang akan kamu gunakan." +objectStorageEndpointDesc: "Kosongkan bagian ini jika kamu menggunakan AWS S3, jika\ + \ tidak tentukan endpoint sebagai '' atau ':' sesuai dengan panduan\ + \ dari layanan yang akan kamu gunakan." objectStorageRegion: "Region" -objectStorageRegionDesc: "Tentukan region seperti 'xx-east-1'. Jika layanan kamu tidak memiliki perbedaan mengenai region, kosongkan saja atau isi dengan 'us-east-1'." +objectStorageRegionDesc: "Tentukan region seperti 'xx-east-1'. Jika layanan kamu tidak\ + \ memiliki perbedaan mengenai region, kosongkan saja atau isi dengan 'us-east-1'." objectStorageUseSSL: "Gunakan SSL" -objectStorageUseSSLDesc: "Matikan ini jika kamu tidak akan menggunakan HTTPS untuk koneksi API" +objectStorageUseSSLDesc: "Matikan ini jika kamu tidak akan menggunakan HTTPS untuk\ + \ koneksi API" objectStorageUseProxy: "Hubungkan melalui Proxy" -objectStorageUseProxyDesc: "Matikan ini jika kamu tidak akan menggunakan Proxy untuk koneksi ObjectStorage" +objectStorageUseProxyDesc: "Matikan ini jika kamu tidak akan menggunakan Proxy untuk\ + \ koneksi ObjectStorage" objectStorageSetPublicRead: "Setel \"public-read\" disaat mengunggah" serverLogs: "Log Peladen" deleteAll: "Hapus semua" @@ -522,7 +566,9 @@ sort: "Urutkan" ascendingOrder: "Urutkan naik" descendingOrder: "Urutkan menurun" scratchpad: "Scratchpad" -scratchpadDescription: "Scratchpad menyediakan lingkungan eksperimen untuk AiScript. Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan Misskey." +scratchpadDescription: "Scratchpad menyediakan lingkungan eksperimen untuk AiScript.\ + \ Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan\ + \ Misskey." output: "Keluaran" script: "Script" disablePagesScript: "Nonaktifkan script pada halaman" @@ -530,11 +576,14 @@ updateRemoteUser: "Perbaharui informasi pengguna luar" deleteAllFiles: "Hapus semua berkas" deleteAllFilesConfirm: "Apakah kamu yakin ingin menghapus semua berkas?" removeAllFollowing: "Tahan semua mengikuti" -removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan ini ketika instansi sudah tidak ada lagi." +removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan\ + \ ini ketika instansi sudah tidak ada lagi." userSuspended: "Pengguna ini telah dibekukan." userSilenced: "Pengguna ini telah dibungkam." yourAccountSuspendedTitle: "Akun ini dibekukan" -yourAccountSuspendedDescription: "Akun ini dibekukan karena melanggar ketentuan penggunaan layanan peladen atau semacamnya. Hubungi admin apabila ingin tahu alasan lebih lanjut. Mohon untuk tidak membuat akun baru." +yourAccountSuspendedDescription: "Akun ini dibekukan karena melanggar ketentuan penggunaan\ + \ layanan peladen atau semacamnya. Hubungi admin apabila ingin tahu alasan lebih\ + \ lanjut. Mohon untuk tidak membuat akun baru." menu: "Menu" divider: "Pembagi" addItem: "Tambahkan item" @@ -579,7 +628,8 @@ notificationType: "Jenis pemberitahuan" edit: "Sunting" emailServer: "Peladen surel" enableEmail: "Nyalakan distribusi surel" -emailConfigInfo: "Digunakan untuk mengonfirmasi surel kamu disaat mendaftar dan lupa kata sandi" +emailConfigInfo: "Digunakan untuk mengonfirmasi surel kamu disaat mendaftar dan lupa\ + \ kata sandi" email: "Surel" emailAddress: "Alamat surel" smtpConfig: "Konfigurasi peladen SMTP" @@ -587,13 +637,15 @@ smtpHost: "Host" smtpPort: "Port" smtpUser: "Nama Pengguna" smtpPass: "Kata sandi" -emptyToDisableSmtpAuth: "Kosongkan nama pengguna dan kata sandi untuk menonaktifkan verifikasi SMTP" +emptyToDisableSmtpAuth: "Kosongkan nama pengguna dan kata sandi untuk menonaktifkan\ + \ verifikasi SMTP" smtpSecure: "Gunakan SSL/TLS implisit untuk koneksi SMTP" smtpSecureInfo: "Matikan ini ketika menggunakan STARTTLS" testEmail: "Tes pengiriman surel" wordMute: "Bisukan kata" regexpError: "Kesalahan ekspresi reguler" -regexpErrorDescription: "Galat terjadi pada baris {line} ekspresi reguler dari {tab} kata yang dibisukan:" +regexpErrorDescription: "Galat terjadi pada baris {line} ekspresi reguler dari {tab}\ + \ kata yang dibisukan:" instanceMute: "Bisuka instansi" userSaysSomething: "{name} mengatakan sesuatu" makeActive: "Aktifkan" @@ -609,30 +661,37 @@ create: "Buat" notificationSetting: "Pengaturan Pemberitahuan" notificationSettingDesc: "Pilih tipe pemberitahuan untuk ditampilkan" useGlobalSetting: "Gunakan setelan global" -useGlobalSettingDesc: "Jika dinyalakan, setelan pemberitahuan akun kamu akan digunakan. Jika dimatikan, konfigurasi secara individu dapat dibuat." +useGlobalSettingDesc: "Jika dinyalakan, setelan pemberitahuan akun kamu akan digunakan.\ + \ Jika dimatikan, konfigurasi secara individu dapat dibuat." other: "Lainnya" regenerateLoginToken: "Perbarui token login" -regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout." -setMultipleBySeparatingWithSpace: "Kamu dapat menyetel banyak dengan memisahkannya menggunakan spasi." +regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat\ + \ login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan\ + \ dilogout." +setMultipleBySeparatingWithSpace: "Kamu dapat menyetel banyak dengan memisahkannya\ + \ menggunakan spasi." fileIdOrUrl: "File-ID atau URL" behavior: "Perilaku" sample: "Contoh" abuseReports: "Laporkan" reportAbuse: "Laporkan" reportAbuseOf: "Laporkan {name}" -fillAbuseReportDescription: "Mohon isi rincian laporan. Jika laporan ini mengenai catatan yang spesifik, mohon lampirkan serta URL catatan tersebut." +fillAbuseReportDescription: "Mohon isi rincian laporan. Jika laporan ini mengenai\ + \ catatan yang spesifik, mohon lampirkan serta URL catatan tersebut." abuseReported: "Laporan kamu telah dikirimkan. Terima kasih." reporter: "Pelapor" reporteeOrigin: "Yang dilaporkan" reporterOrigin: "Pelapor" forwardReport: "Teruskan laporan ke instansi luar" -forwardReportIsAnonymous: "Untuk melindungi privasi akun kamu, akun anonim dari sistem akan digunakan sebagai pelapor pada instansi luar." +forwardReportIsAnonymous: "Untuk melindungi privasi akun kamu, akun anonim dari sistem\ + \ akan digunakan sebagai pelapor pada instansi luar." send: "Kirim" abuseMarkAsResolved: "Tandai laporan sebagai selesai" openInNewTab: "Buka di tab baru" openInSideView: "Buka di tampilan samping" defaultNavigationBehaviour: "Navigasi bawaan" -editTheseSettingsMayBreakAccount: "Menyunting pengaturan ini memiliki kemungkinan untuk merusak akun kamu." +editTheseSettingsMayBreakAccount: "Menyunting pengaturan ini memiliki kemungkinan\ + \ untuk merusak akun kamu." instanceTicker: "Informasi pengguna pada instansi" waitingFor: "Menunggu untuk {x}" random: "Acak" @@ -644,9 +703,11 @@ createNew: "Buat baru" optional: "Opsional" createNewClip: "Buat klip baru" unclip: "Batalkan klip" -confirmToUnclipAlreadyClippedNote: "Catatan ini sudah disertakan di klip \"{name}\". Yakin ingin membatalkan catatan dari klip ini?" +confirmToUnclipAlreadyClippedNote: "Catatan ini sudah disertakan di klip \"{name}\"\ + . Yakin ingin membatalkan catatan dari klip ini?" public: "Publik" -i18nInfo: "Calckey diterjemahkan ke dalam banyak bahasa oleh sukarelawan. Kamu dapat ikut membantu di {link}." +i18nInfo: "Calckey diterjemahkan ke dalam banyak bahasa oleh sukarelawan. Kamu dapat\ + \ ikut membantu di {link}." manageAccessTokens: "Kelola access token" accountInfo: "Informasi akun" notesCount: "Jumlah catatan" @@ -665,12 +726,16 @@ no: "Tidak" driveFilesCount: "Jumlah berkas drive" driveUsage: "Penggunaan ruang penyimpanan drive" noCrawle: "Tolak pengindeksan crawler" -noCrawleDescription: "Meminta mesin pencari untuk tidak mengindeks halaman profil kamu, catatan, Halaman, dll." -lockedAccountInfo: "Kecuali kamu menyetel visibilitas catatan milikmu ke \"Hanya pengikut\", catatan milikmu akan dapat dilihat oleh siapa saja, bahkan jika kamu memerlukan pengikut untuk disetujui secara manual." +noCrawleDescription: "Meminta mesin pencari untuk tidak mengindeks halaman profil\ + \ kamu, catatan, Halaman, dll." +lockedAccountInfo: "Kecuali kamu menyetel visibilitas catatan milikmu ke \"Hanya pengikut\"\ + , catatan milikmu akan dapat dilihat oleh siapa saja, bahkan jika kamu memerlukan\ + \ pengikut untuk disetujui secara manual." alwaysMarkSensitive: "Tandai media dalam catatan sebagai media sensitif" loadRawImages: "Tampilkan lampiran gambar secara penuh daripada thumbnail" disableShowingAnimatedImages: "Jangan mainkan gambar bergerak" -verificationEmailSent: "Surel verifikasi telah dikirimkan. Mohon akses tautan yang telah disertakan untuk menyelesaikan verifikasi." +verificationEmailSent: "Surel verifikasi telah dikirimkan. Mohon akses tautan yang\ + \ telah disertakan untuk menyelesaikan verifikasi." notSet: "Tidak disetel" emailVerified: "Surel telah diverifikasi" noteFavoritesCount: "Jumlah catatan yang difavoritkan" @@ -682,14 +747,16 @@ clips: "Klip" experimentalFeatures: "Fitur eksperimental" developer: "Pengembang" makeExplorable: "Buat akun tampil di \"Jelajahi\"" -makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di bagian \"Jelajahi:" +makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di\ + \ bagian \"Jelajahi:" showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada linimasa" duplicate: "Duplikat" left: "Kiri" center: "Tengah" wide: "Lebar" narrow: "Sempit" -reloadToApplySetting: "Pengaturan ini akan diterapkan saat memuat halaman kembali. Apakah kamu ingin memuat halaman kembali sekarang?" +reloadToApplySetting: "Pengaturan ini akan diterapkan saat memuat halaman kembali.\ + \ Apakah kamu ingin memuat halaman kembali sekarang?" needReloadToApply: "Pengaturan ini hanya akan diterapkan setelah memuat ulang halaman." showTitlebar: "Tampilkan bilah judul" clearCache: "Hapus tembolok" @@ -697,7 +764,10 @@ onlineUsersCount: "{n} orang sedang daring" nUsers: "{n} Pengguna" nNotes: "{n} Catatan" sendErrorReports: "Kirim laporan kesalahan" -sendErrorReportsDescription: "Ketika dinyalakan, informasi kesalahan rinci akan dibagikan dengan Misskey ketika masalah terjadi, hal ini untuk membantu kualitas Misskey. Fitur ini memungkinkan memuat informasi seperti sistem operasi yang kamu gunakan dan versinya, aplikasi peramban yang kamu gunakan, riwayat aktivitas kamu, dll." +sendErrorReportsDescription: "Ketika dinyalakan, informasi kesalahan rinci akan dibagikan\ + \ dengan Misskey ketika masalah terjadi, hal ini untuk membantu kualitas Misskey.\ + \ Fitur ini memungkinkan memuat informasi seperti sistem operasi yang kamu gunakan\ + \ dan versinya, aplikasi peramban yang kamu gunakan, riwayat aktivitas kamu, dll." myTheme: "Tema saya" backgroundColor: "Latar Belakang" accentColor: "Aksen" @@ -736,14 +806,17 @@ unlikeConfirm: "Yakin ingin hapus sukamu?" fullView: "Tampilan penuh" quitFullView: "Keluar tampilan penuh" addDescription: "Tambahkan deskripsi" -userPagePinTip: "Kamu dapat membuat catatan untuk ditampilkan disini dengan memilih \"Sematkan ke profil\" dari menu pada catatan individu." -notSpecifiedMentionWarning: "Catatan ini mengandung sebutan dari pengguna yang tidak dimuat sebagai penerima" +userPagePinTip: "Kamu dapat membuat catatan untuk ditampilkan disini dengan memilih\ + \ \"Sematkan ke profil\" dari menu pada catatan individu." +notSpecifiedMentionWarning: "Catatan ini mengandung sebutan dari pengguna yang tidak\ + \ dimuat sebagai penerima" info: "Informasi" userInfo: "Informasi pengguna" unknown: "Tidak diketahui" onlineStatus: "Status daring" hideOnlineStatus: "Sembunyikan status daring" -hideOnlineStatusDescription: "Menyembunyikan status daring kamu umengurangi kenyamanan untuk beberapa fungsi seperti contohnya pencarian." +hideOnlineStatusDescription: "Menyembunyikan status daring kamu umengurangi kenyamanan\ + \ untuk beberapa fungsi seperti contohnya pencarian." online: "Daring" active: "Aktif" offline: "Luring" @@ -778,7 +851,8 @@ emailNotConfiguredWarning: "Alamat surel tidak disetel." ratio: "Rasio" previewNoteText: "Tampilkan pratinjau" customCss: "Custom CSS" -customCssWarn: "Pengaturan ini seharusnya digunakan jika kamu tahu cara kerjanya. Memasukkan nilai yang tidak tepat dapat menyebabkan klien tidak berfungsi semestinya." +customCssWarn: "Pengaturan ini seharusnya digunakan jika kamu tahu cara kerjanya.\ + \ Memasukkan nilai yang tidak tepat dapat menyebabkan klien tidak berfungsi semestinya." global: "Global" squareAvatars: "Tampilkan avatar sebagai persegi" sent: "Kirim" @@ -793,7 +867,9 @@ whatIsNew: "Lihat perubahan pemutakhiran" translate: "Terjemahkan" translatedFrom: "Terjemahkan dari {x}" accountDeletionInProgress: "Penghapusan akun sedang dalam proses" -usernameInfo: "Nama yang mengidentifikasikan akun kamu dari yang lain pada peladen ini. Kamu dapat menggunakan alfabet (a~z, A~Z), digit (0~9) atau garis bawah (_). Username tidak dapat diubah setelahnya." +usernameInfo: "Nama yang mengidentifikasikan akun kamu dari yang lain pada peladen\ + \ ini. Kamu dapat menggunakan alfabet (a~z, A~Z), digit (0~9) atau garis bawah (_).\ + \ Username tidak dapat diubah setelahnya." aiChanMode: "Mode Ai" keepCw: "Biarkan Peringatan Konten" pubSub: "Akun Pub/Sub" @@ -809,12 +885,14 @@ filter: "Saring" controlPanel: "Panel kendali" manageAccounts: "Kelola Akun" makeReactionsPublic: "Tampilkan riwayat reaksi ke publik" -makeReactionsPublicDescription: "Pengaturan ini akan membuat daftar dari semua reaksi masa lalu kamu ditampilkan secara publik." +makeReactionsPublicDescription: "Pengaturan ini akan membuat daftar dari semua reaksi\ + \ masa lalu kamu ditampilkan secara publik." classic: "Klasik" muteThread: "Bisukan thread" unmuteThread: "Suarakan thread" ffVisibility: "Visibilitas Mengikuti/Pengikut" -ffVisibilityDescription: "Mengatur siapa yang dapat melihat pengikutmu dan yang kamu ikuti." +ffVisibilityDescription: "Mengatur siapa yang dapat melihat pengikutmu dan yang kamu\ + \ ikuti." continueThread: "Lihat lanjutan thread" deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?" incorrectPassword: "Kata sandi salah." @@ -824,7 +902,8 @@ leaveGroup: "Keluar grup" leaveGroupConfirm: "Apakah kamu yakin untuk keluar dari \"{name}\"?" useDrawerReactionPickerForMobile: "Tampilkan bilah reaksi sebagai laci di ponsel" welcomeBackWithName: "Selamat datang kembali, {name}." -clickToFinishEmailVerification: "Mohon klik [{ok}] untuk menyelesaikan verifikasi email." +clickToFinishEmailVerification: "Mohon klik [{ok}] untuk menyelesaikan verifikasi\ + \ email." overridedDeviceKind: "Tipe perangkat" smartphone: "Ponsel" tablet: "Tablet" @@ -866,11 +945,16 @@ _ffVisibility: _signup: almostThere: "Hampir selesai" emailAddressInfo: "Mohon masukkan alamat surel kamu." - emailSent: "Konfirmasi surel telah dikirimkan ke alamat surel kamu ({email}). Mohon klik tautan yang tercantum di dalamnya untuk menyelesaikan pembuatan akun." + emailSent: "Konfirmasi surel telah dikirimkan ke alamat surel kamu ({email}). Mohon\ + \ klik tautan yang tercantum di dalamnya untuk menyelesaikan pembuatan akun." _accountDelete: accountDelete: "Hapus akun" - mayTakeTime: "Karena penghapusan akun merupakan proses yang berat dan intensif, kemungkinan dapat membutuhkan waktu untuk menyelesaikan tergantung daripada berapa banyak konten yang kamu buat dan berapa banyak berkas yang telah kamu unggah." - sendEmail: "Setelah penghapusan akun selesai, pemberitahuan akan dikirimkan ke alamat surel yang terdaftarkan pada akun ini." + mayTakeTime: "Karena penghapusan akun merupakan proses yang berat dan intensif,\ + \ kemungkinan dapat membutuhkan waktu untuk menyelesaikan tergantung daripada\ + \ berapa banyak konten yang kamu buat dan berapa banyak berkas yang telah kamu\ + \ unggah." + sendEmail: "Setelah penghapusan akun selesai, pemberitahuan akan dikirimkan ke alamat\ + \ surel yang terdaftarkan pada akun ini." requestAccountDelete: "Minta penghapusan akun" started: "Penghapusan telah dimulai" inProgress: "Penghapusan sedang dalam proses" @@ -878,9 +962,13 @@ _ad: back: "Kembali" reduceFrequencyOfThisAd: "Tampilkan iklan ini lebih sedikit" _forgotPassword: - enterEmail: "Masukkan alamat surel yang kamu gunakan pada saat mendaftar. Sebuah tautan untuk mengatur ulang kata sandi kamu akan dikirimkan ke alamat surel tersebut." - ifNoEmail: "Apabila kamu tidak menggunakan surel pada saat pendaftaran, mohon hubungi admin segera." - contactAdmin: "Instansi ini tidak mendukung menggunakan alamat surel, mohon kontak admin untuk mengatur ulang password kamu." + enterEmail: "Masukkan alamat surel yang kamu gunakan pada saat mendaftar. Sebuah\ + \ tautan untuk mengatur ulang kata sandi kamu akan dikirimkan ke alamat surel\ + \ tersebut." + ifNoEmail: "Apabila kamu tidak menggunakan surel pada saat pendaftaran, mohon hubungi\ + \ admin segera." + contactAdmin: "Instansi ini tidak mendukung menggunakan alamat surel, mohon kontak\ + \ admin untuk mengatur ulang password kamu." _gallery: my: "Postingan saya" liked: "Postingan yang disukai" @@ -902,13 +990,15 @@ _registry: domain: "Domain" createKey: "Buat kunci" _aboutMisskey: - about: "Misskey adalah perangkat lunak sumber terbuka yang sedang dikembangkan oleh syuilo sejak 2014." + about: "Misskey adalah perangkat lunak sumber terbuka yang sedang dikembangkan oleh\ + \ syuilo sejak 2014." contributors: "Kontributor utama" allContributors: "Seluruh kontributor" source: "Sumber kode" translation: "Terjemahkan Misskey" donate: "Donasi ke Misskey" - morePatrons: "Kami sangat mengapresiasi dukungan dari banyak penolong lain yang tidak tercantum disini. Terima kasih! ๐Ÿฅฐ" + morePatrons: "Kami sangat mengapresiasi dukungan dari banyak penolong lain yang\ + \ tidak tercantum disini. Terima kasih! \U0001F970" patrons: "Pendukung" _nsfw: respect: "Sembunyikan media NSFW" @@ -916,10 +1006,12 @@ _nsfw: force: "Sembunyikan semua media" _mfm: cheatSheet: "Contekan MFM" - intro: "MFM adalah Misskey-exclusive Markup Language yang dapat digunakan di banyak tempat. Berikut kamu bisa melihat daftar dari syntax MFM yang ada." + intro: "MFM adalah Misskey-exclusive Markup Language yang dapat digunakan di banyak\ + \ tempat. Berikut kamu bisa melihat daftar dari syntax MFM yang ada." dummy: "Misskey membentangkan dunia Fediverse" mention: "Sebut" - mentionDescription: "Kamu dapat menentukan pengguna tertentu dengan menggunakan simbol-At dan nama engguna mereka." + mentionDescription: "Kamu dapat menentukan pengguna tertentu dengan menggunakan\ + \ simbol-At dan nama engguna mereka." hashtag: "Tagar" hashtagDescription: "Kamu dapat menentukan tagar dengan menggunakan angka dan teks." url: "URL" @@ -935,15 +1027,18 @@ _mfm: inlineCode: "Kode (Dalam baris)" inlineCodeDescription: "Menampilkan sorotan sintaks dalam baris untuk kode(program-)." blockCode: "Kode (Blok)" - blockCodeDescription: "Menampilkan sorotan sintaks untuk kode(program-) multi baris dalam sebuah blok." + blockCodeDescription: "Menampilkan sorotan sintaks untuk kode(program-) multi baris\ + \ dalam sebuah blok." inlineMath: "Matematika (Dalam baris)" inlineMathDescription: "Menampilkan formula matematika (KaTeX) dalam baris." blockMath: "Matematika (Blok)" - blockMathDescription: "Menampilkan formula matematika (KaTeX) multibaris dalam sebuah blok." + blockMathDescription: "Menampilkan formula matematika (KaTeX) multibaris dalam sebuah\ + \ blok." quote: "Kutip" quoteDescription: "Menampilkan konten sebagai kutipan." emoji: "Emoji kustom" - emojiDescription: "Emoji kustom dapat ditampilkan dengan mengurung nama emoji kustom menggunakan tanda titik dua." + emojiDescription: "Emoji kustom dapat ditampilkan dengan mengurung nama emoji kustom\ + \ menggunakan tanda titik dua." search: "Penelusuran" searchDescription: "Menampilkan kotak pencarian dengan teks yang sudah dimasukkan." flip: "Balik" @@ -969,7 +1064,8 @@ _mfm: x4: "Sangat besar" x4Description: "Tampilka konten menjadi sangat besar." blur: "Buram" - blurDescription: "Konten dapat diburamkan dengan efek ini. Konten dapat ditampilkan dengan jelas dengan melayangkan kursor tetikus di atasnya." + blurDescription: "Konten dapat diburamkan dengan efek ini. Konten dapat ditampilkan\ + \ dengan jelas dengan melayangkan kursor tetikus di atasnya." font: "Font" fontDescription: "Setel font yang ditampilkan untuk konten." rainbow: "Pelangi" @@ -1003,15 +1099,21 @@ _menuDisplay: hide: "Sembunyikan" _wordMute: muteWords: "Kata yang dibisukan" - muteWordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR." - muteWordsDescription2: "Kurung kata kunci dengan garis miring untuk menggunakan regular expressions." + muteWordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan\ + \ baris baru untuk kondisi OR." + muteWordsDescription2: "Kurung kata kunci dengan garis miring untuk menggunakan\ + \ regular expressions." softDescription: "Sembunyikan catatan yang memenuhi aturan kondisi dari linimasa." - hardDescription: "Cegah catatan memenuhi aturan kondisi dari ditambahkan ke linimasa. Dengan tambahan, catatan berikut tidak akan ditambahkan ke linimasa meskipun jika kondisi tersebut diubah." + hardDescription: "Cegah catatan memenuhi aturan kondisi dari ditambahkan ke linimasa.\ + \ Dengan tambahan, catatan berikut tidak akan ditambahkan ke linimasa meskipun\ + \ jika kondisi tersebut diubah." soft: "Lembut" hard: "Keras" mutedNotes: "Catatan yang dibisukan" _instanceMute: - instanceMuteDescription: "Pengaturan ini akan membisukan note/renote apa saja dari instansi yang terdaftar, termasuk pengguna yang membalas pengguna lain dalam instansi yang dibisukan." + instanceMuteDescription: "Pengaturan ini akan membisukan note/renote apa saja dari\ + \ instansi yang terdaftar, termasuk pengguna yang membalas pengguna lain dalam\ + \ instansi yang dibisukan." instanceMuteDescription2: "Pisah dengan baris baru" title: "Sembunyikan note dari instansi terdaftar." heading: "Daftar instansi yang akan dibisukan" @@ -1043,7 +1145,8 @@ _theme: darken: "Mengelamkan" lighten: "Menerangkan" inputConstantName: "Masukkan nama untuk konstanta" - importInfo: "Jika kamu memasukkan kode tema disini, kamu dapat mengimpornya ke penyunting tema" + importInfo: "Jika kamu memasukkan kode tema disini, kamu dapat mengimpornya ke penyunting\ + \ tema" deleteConstantConfirm: "apakah kamu ingin menghapus konstanta {const}?" keys: accent: "Aksen" @@ -1115,36 +1218,56 @@ _time: _tutorial: title: "Cara menggunakan Misskey" step1_1: "Selamat datang!" - step1_2: "Halaman ini disebut \"linimasa\". Halaman ini menampilkan \"catatan\" yang diurutkan secara kronologis dari orang-orang yang kamu \"ikuti\"." - step1_3: "Linimasa kamu kosong, karena kamu belum mencatat catatan apapun atau mengikuti siapapun." - step2_1: "Selesaikan menyetel profilmu sebelum menulis sebuah catatan atau mengikuti seseorang." - step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuat orang lain mudah untuk mengikutimu kembali." - step3_1: "Selesai menyetel profil kamu?" - step3_2: "Langkah selanjutnya adalah membuat catatan. Kamu bisa lakukan ini dengan mengklik ikon pensil pada layar kamu." - step3_3: "Isilah di dalam modal dan tekan tombol pada atas kanan untuk memcatat catatan kamu." - step3_4: "Bingung tidak berpikiran untuk mengatakan sesuatu? Coba saja \"baru aja ikutan bikin akun misskey punyaku\"!" + step1_2: "Halaman ini disebut \"linimasa\". Halaman ini menampilkan \"catatan\"\ + \ yang diurutkan secara kronologis dari orang-orang yang kamu \"ikuti\"." + step1_3: "Linimasa kamu kosong, karena kamu belum mencatat catatan apapun atau mengikuti\ + \ siapapun." + step2_1: "Selesaikan menyetel profilmu sebelum menulis sebuah catatan atau mengikuti\ + \ seseorang." + step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuat orang lain\ + \ mudah untuk mengikutimu kembali." + step3_1: "Sekarang saatnya mengikuti beberapa orang!" + step3_2: "Langkah selanjutnya adalah membuat catatan. Kamu bisa lakukan ini dengan\ + \ mengklik ikon pensil pada layar kamu." + step3_3: "Isilah di dalam modal dan tekan tombol pada atas kanan untuk memcatat\ + \ catatan kamu." + step3_4: "Bingung tidak berpikiran untuk mengatakan sesuatu? Coba saja \"baru aja\ + \ ikutan bikin akun misskey punyaku\"!" step4_1: "Selesai mencatat catatan pertamamu?" step4_2: "Horee! Sekarang catatan pertamamu sudah ditampilkan di linimasa milikmu." - step5_1: "Sekarang, mari mencoba untuk membuat linimasamu lebih hidup dengan mengikuti orang lain." - step5_2: "{featured} akan memperlihatkan catatan yang sedang tren saat ini untuk kamu. {explore} akan membantumu untuk mencari pengguna yang sedang tren juga saat ini. Coba ikuti seseorang yang kamu suka!" - step5_3: "Untuk mengikuti pengguna lain, klik pada ikon mereka dan tekan tombol follow pada profil mereka." - step5_4: "Jika pengguna lain memiliki ikon gembok di sebelah nama mereka, maka pengguna rersebut harus menyetujui permintaan mengikuti dari kamu secara manual." + step5_1: "Sekarang, mari mencoba untuk membuat linimasamu lebih hidup dengan mengikuti\ + \ orang lain." + step5_2: "{featured} akan memperlihatkan catatan yang sedang tren saat ini untuk\ + \ kamu. {explore} akan membantumu untuk mencari pengguna yang sedang tren juga\ + \ saat ini. Coba ikuti seseorang yang kamu suka!" + step5_3: "Untuk mengikuti pengguna lain, klik pada ikon mereka dan tekan tombol\ + \ follow pada profil mereka." + step5_4: "Jika pengguna lain memiliki ikon gembok di sebelah nama mereka, maka pengguna\ + \ rersebut harus menyetujui permintaan mengikuti dari kamu secara manual." step6_1: "Sekarang kamu dapat melihat catatan pengguna lain pada linimasamu." - step6_2: "Kamu juga bisa memberikan \"reaksi\" ke catatan orang lain untuk merespon dengan cepat." - step6_3: "Untuk memberikan \"reaksi\", tekan tanda \"+\" pada catatan pengguna lain dan pilih emoji yang kamu suka untuk memberikan reaksimu kepada mereka." + step6_2: "Kamu juga bisa memberikan \"reaksi\" ke catatan orang lain untuk merespon\ + \ dengan cepat." + step6_3: "Untuk memberikan \"reaksi\", tekan tanda \"+\" pada catatan pengguna lain\ + \ dan pilih emoji yang kamu suka untuk memberikan reaksimu kepada mereka." step7_1: "Yay, Selamat! Kamu sudah menyelesaikan tutorial dasar Misskey." - step7_2: "Jika kamu ingin mempelajari lebih lanjut tentang Misskey, cobalah berkunjung ke bagian {help}." - step7_3: "Semoga berhasil dan bersenang-senanglah! ๐Ÿš€" + step7_2: "Jika kamu ingin mempelajari lebih lanjut tentang Misskey, cobalah berkunjung\ + \ ke bagian {help}." + step7_3: "Semoga berhasil dan bersenang-senanglah! \U0001F680" _2fa: alreadyRegistered: "Kamu telah mendaftarkan perangkat otentikasi dua faktor." registerDevice: "Daftarkan perangkat baru" registerKey: "Daftarkan kunci keamanan baru" - step1: "Pertama, pasang aplikasi otentikasi (seperti {a} atau {b}) di perangkat kamu." + step1: "Pertama, pasang aplikasi otentikasi (seperti {a} atau {b}) di perangkat\ + \ kamu." step2: "Lalu, pindai kode QR yang ada di layar." step2Url: "Di aplikasi desktop, masukkan URL berikut:" - step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan pemasangan." - step4: "Mulai sekarang, upaya login apapun akan meminta token login dari aplikasi otentikasi kamu." - securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu." + step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan\ + \ pemasangan." + step4: "Mulai sekarang, upaya login apapun akan meminta token login dari aplikasi\ + \ otentikasi kamu." + securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses\ + \ login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung\ + \ FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu." _permissions: "read:account": "Lihat informasi akun" "write:account": "Sunting informasi akun" @@ -1180,7 +1303,8 @@ _permissions: "write:gallery-likes": "Sunting daftar postingan galeri yang disukai" _auth: shareAccess: "Apakah kamu ingin mengijinkan \"{name}\" untuk mengakses akun ini?" - shareAccessAsk: "Apakah kamu ingin mengijinkan aplikasi ini untuk mengakses akun kamu?" + shareAccessAsk: "Apakah kamu ingin mengijinkan aplikasi ini untuk mengakses akun\ + \ kamu?" permissionAsk: "Aplikasi ini membutuhkan beberapa ijin, yaitu:" pleaseGoBack: "Mohon kembali ke aplikasi kamu" callback: "Mengembalikan kamu ke aplikasi" @@ -1275,7 +1399,8 @@ _profile: youCanIncludeHashtags: "Kamu juga dapat menambahkan tagar ke dalam bio." metadata: "Informasi tambahan" metadataEdit: "Sunting informasi tambahan" - metadataDescription: "Kamu dapat menampilkan hingga 4 bagian informasi tambahan ke dalam profilmu." + metadataDescription: "Kamu dapat menampilkan hingga 4 bagian informasi tambahan\ + \ ke dalam profilmu." metadataLabel: "Label" metadataContent: "Isi" changeAvatar: "Ubah avatar" @@ -1596,7 +1721,8 @@ _pages: _for: arg1: "Jumlah angka untuk diulangi" arg2: "Aksi" - typeError: "Slot {slot} menerima tipe \"{expect}\", sayangnya nilai yang disediakan adalah \"{actual}\"!" + typeError: "Slot {slot} menerima tipe \"{expect}\", sayangnya nilai yang disediakan\ + \ adalah \"{actual}\"!" thereIsEmptySlot: "Slot {slot} kosong!" types: string: "Teks" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 0eb17e5af..4fc2f42d7 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -973,6 +973,8 @@ customKaTeXMacroDescription: "ๆ•ฐๅผๅ…ฅๅŠ›ใ‚’ๆฅฝใซใ™ใ‚‹ใŸใ‚ใฎใƒžใ‚ฏใƒญใ‚’ name}{content} ใพใŸใฏ \\newcommand{\\add}[2]{#1 + #2} ใฎใ‚ˆใ†ใซ่จ˜่ฟฐใ—ใพใ™ใ€‚ๅพŒ่€…ใฎไพ‹ใงใฏ \\add{3}{foo}\ \ ใŒ 3 + foo ใซๅฑ•้–‹ใ•ใ‚Œใพใ™ใ€‚ใพใŸใ€ใƒžใ‚ฏใƒญใฎๅๅ‰ใ‚’ๅ›ฒใ‚€ๆณขๆ‹ฌๅผงใ‚’ไธธๆ‹ฌๅผง () ใŠใ‚ˆใณ่ง’ๆ‹ฌๅผง [] ใซๅค‰ๆ›ดใ—ใŸๅ ดๅˆใ€ใƒžใ‚ฏใƒญใฎๅผ•ๆ•ฐใซไฝฟ็”จใ™ใ‚‹ๆ‹ฌๅผงใŒๅค‰ๆ›ดใ•ใ‚Œใพใ™ใ€‚ใƒžใ‚ฏใƒญใฎๅฎš็พฉใฏไธ€่กŒใซไธ€ใคใฎใฟใงใ€้€”ไธญใงๆ”น่กŒใฏใงใใพใ›ใ‚“ใ€‚ใƒžใ‚ฏใƒญใฎๅฎš็พฉใŒ็„กๅŠนใช่กŒใฏ็„ก่ฆ–ใ•ใ‚Œใพใ™ใ€‚ๆ–‡ๅญ—ๅˆ—ใ‚’ๅ˜็ด”ใซ็ฝฎๆ›ใ™ใ‚‹ๆฉŸ่ƒฝใฎใฟใซๅฏพๅฟœใ—ใฆใ„ใฆใ€ๆกไปถๅˆ†ๅฒใชใฉใฎ้ซ˜ๅบฆใชๆง‹ๆ–‡ใฏไฝฟ็”จใงใใพใ›ใ‚“ใ€‚" enableCustomKaTeXMacro: "ใ‚ซใ‚นใ‚ฟใƒ KaTeXใƒžใ‚ฏใƒญใ‚’ๆœ‰ๅŠนใซใ™ใ‚‹" +preventAiLearning: "AIใซใ‚ˆใ‚‹ๅญฆ็ฟ’ใ‚’้˜ฒๆญข" +preventAiLearningDescription: "ๆŠ•็จฟใ—ใŸใƒŽใƒผใƒˆใ€ๆทปไป˜ใ—ใŸ็”ปๅƒใชใฉใฎใ‚ณใƒณใƒ†ใƒณใƒ„ใ‚’ๅญฆ็ฟ’ใฎๅฏพ่ฑกใซใ—ใชใ„ใ‚ˆใ†AIใซ่ฆๆฑ‚ใ—ใพใ™ใ€‚ใ“ใ‚Œใฏnoaiใƒ•ใƒฉใ‚ฐใ‚’HTMLใƒฌใ‚นใƒใƒณใ‚นใซๅซใ‚ใ‚‹ใ“ใจใซใ‚ˆใฃใฆๅฎŸ็พใ•ใ‚Œใพใ™ใ€‚" _sensitiveMediaDetection: description: "ๆฉŸๆขฐๅญฆ็ฟ’ใ‚’ไฝฟใฃใฆ่‡ชๅ‹•ใงใ‚ปใƒณใ‚ทใƒ†ใ‚ฃใƒ–ใชใƒกใƒ‡ใ‚ฃใ‚ขใ‚’ๆคœๅ‡บใ—ใ€ใƒขใƒ‡ใƒฌใƒผใ‚ทใƒงใƒณใซๅฝน็ซ‹ใฆใ‚‰ใ‚Œใพใ™ใ€‚ใ‚ตใƒผใƒใƒผใฎ่ฒ ่ทใŒๅฐ‘ใ—ๅข—ใˆใพใ™ใ€‚" @@ -1837,23 +1839,7 @@ _deck: list: "ใƒชใ‚นใƒˆ" mentions: "ใ‚ใชใŸๅฎ›ใฆ" direct: "ใƒ€ใ‚คใƒฌใ‚ฏใƒˆ" -_apps: - apps: "ใ‚ขใƒ—ใƒช" - crossPlatform: "ใ‚ฏใƒญใ‚นใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ " - mobile: "ใƒขใƒใ‚คใƒซ" - firstParty: "ใƒ•ใ‚กใƒผใ‚นใƒˆใƒ‘ใƒผใƒ†ใ‚ฃ" - firstClass: "ๅฏพๅฟœๅบฆโ—Ž" - secondClass: "ๅฏพๅฟœๅบฆโ—‹" - thirdClass: "ๅฏพๅฟœๅบฆโ–ณ" - free: "็„กๆ–™" - paid: "ๆœ‰ๆ–™" - pwa: "PWAใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซ" - kaiteki: "Kaiteki" - milktea: "Milktea" - missLi: "MissLi" - mona: "Mona" - theDesk: "TheDesk" - lesskey: "Lesskey" noteId: ๆŠ•็จฟใฎID hiddenTagsDescription: 'ใƒˆใƒฌใƒณใƒ‰ใจใ€Œใฟใคใ‘ใ‚‹ใ€ใ‹ใ‚‰้™คๅค–ใ—ใŸใ„ใƒใƒƒใ‚ทใƒฅใ‚ฟใ‚ฐใ‚’๏ผˆๅ…ˆ้ ญใฎ # ใ‚’้™คใ„ใฆ๏ผ‰ๆ”น่กŒๅŒบๅˆ‡ใ‚Šใงๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚ใ“ใฎ่จญๅฎšใฏใƒˆใƒฌใƒณใƒ‰ใจใ€Œใฟใคใ‘ใ‚‹ใ€ไปฅๅค–ใซใฏๅฝฑ้Ÿฟใ—ใพใ›ใ‚“ใ€‚' hiddenTags: ้ž่กจ็คบใซใ™ใ‚‹ใƒใƒƒใ‚ทใƒฅใ‚ฟใ‚ฐ +apps: "ใ‚ขใƒ—ใƒช" diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml index 1c7b675c5..5c7f9fbbb 100644 --- a/locales/pl-PL.yml +++ b/locales/pl-PL.yml @@ -66,8 +66,8 @@ import: "Importuj" export: "Eksportuj" files: "Pliki" download: "Pobierz" -driveFileDeleteConfirm: "Czy chcesz usunฤ…ฤ‡ plik \"{name}\"? Zniknie rรณwnieลผ wpis,\ - \ do ktรณrej doล‚ฤ…czony jest ten plik." +driveFileDeleteConfirm: "Czy chcesz usunฤ…ฤ‡ plik \"{name}\"? Wszystkie wpisy zawierajฤ…ce\ + \ ten plik rรณwnieลผ zostanฤ… usuniฤ™te." unfollowConfirm: "Czy na pewno chcesz przestaฤ‡ obserwowaฤ‡ {name}?" exportRequested: "Zaลผฤ…daล‚eล› eksportu. Moลผe to zajฤ…ฤ‡ chwilฤ™. Po zakoล„czeniu eksportu\ \ zostanie on dodany do Twojego dysku." @@ -787,7 +787,7 @@ active: "Aktywny" offline: "Offline" notRecommended: "Nie zalecane" botProtection: "Zabezpieczenie przed botami" -instanceBlocking: "Zablokowane instancje" +instanceBlocking: "Zablokowane/wyciszone instancje" selectAccount: "Wybierz konto" switchAccount: "Przeล‚ฤ…cz konto" enabled: "Wล‚aczono" @@ -1075,6 +1075,14 @@ _mfm: inlineMath: Matematyka (Inline) inlineMathDescription: Pokaลผ formuล‚y matematyczne (KaTeX) w linii blockMathDescription: Pokaลผ wieloliniowe formuล‚y matematyczne (KaTeX) w bloku + background: Kolor tล‚a + backgroundDescription: Zmieล„ kolor tล‚a tekstu. + foregroundDescription: Zmieล„ kolor pierwszoplanowy tekstu. + positionDescription: Przesuล„ treล›ฤ‡ o okreล›lonฤ… odlegล‚oล›ฤ‡. + position: Pozycjonuj + foreground: Kolor pierwszoplanowy + scaleDescription: Skaluj treล›ฤ‡ o okreล›lonฤ… wielkoล›ฤ‡. + scale: Skaluj _instanceTicker: none: "Nigdy nie pokazuj" remote: "Pokaลผ dla zdalnych uลผytkownikรณw" @@ -1094,6 +1102,8 @@ _channel: following: "ลšledzeni" usersCount: "{n} uczestnicy" notesCount: "{n} wpisy" + nameAndDescription: Nazwa i opis + nameOnly: Tylko nazwa _menuDisplay: top: "Gรณra" hide: "Ukryj" @@ -1222,13 +1232,13 @@ _tutorial: step2_1: "Najpierw, proszฤ™ wypeล‚nij swรณj profil." step2_2: "Podanie kilku informacji o tym, kim jesteล›, uล‚atwi innym stwierdzenie,\ \ czy chcฤ… zobaczyฤ‡ Twoje wpisy lub ล›ledziฤ‡ Ciฤ™." - step3_1: "Teraz czas na ล›ledzenie niektรณrych osรณb!" + step3_1: "Pora znaleลบฤ‡ osoby do ล›ledzenia!" step3_2: "Twoje domowe i spoล‚eczne linie czasu opierajฤ… siฤ™ na tym, kogo ล›ledzisz,\ \ wiฤ™c sprรณbuj ล›ledziฤ‡ kilka kont, aby zaczฤ…ฤ‡.\nKliknij kรณล‚ko z plusem w prawym\ \ gรณrnym rogu profilu, aby go ล›ledziฤ‡." step4_1: "Pozwรณl, ลผe zabierzemy Ciฤ™ tam." - step4_2: "Dla twojego pierwszego postu, niektรณrzy ludzie lubiฤ… zrobiฤ‡ {introduction}\ - \ post lub prosty \"Hello world!\"" + step4_2: "W pierwszym wpisie moลผesz siฤ™ przedstawiฤ‡ lub wysล‚aฤ‡ powitanie - \"Witaj,\ + \ ล›wiecie!\"" step5_1: "Osie czasu, wszฤ™dzie widzฤ™ osie czasu!" step5_2: "Twoja instancja ma wล‚ฤ…czone {timelines} rรณลผne osie czasu." step5_3: "Gล‚รณwna {icon} oล› czasu to miejsce, w ktรณrym moลผesz zobaczyฤ‡ posty od uลผytkownikรณw\ @@ -1811,8 +1821,8 @@ privateMode: Tryb prywatny allowedInstances: Dopuszczone instancje recommended: Polecane allowedInstancesDescription: Hosty instancji ktรณre majฤ… byฤ‡ dopuszczone do federacji, - kaลผda separowana nowฤ… liniฤ… (dotyczy tylko trybu prywatnego). -seperateRenoteQuote: Oddziel przyciski podbicia i cytatรณw + kaลผdy separowany nowฤ… liniฤ… (dotyczy tylko trybu prywatnego). +seperateRenoteQuote: Oddziel przyciski podbicia i cytowania refreshInterval: 'Czฤ™stotliwoล›ฤ‡ aktualizacji ' slow: Wolna _messaging: @@ -1845,10 +1855,10 @@ swipeOnDesktop: Zezwรณl na przeciฤ…ganie w stylu mobilnym na desktopie moveFromDescription: To utworzy alias twojego starego konta, w celu umoลผliwienia migracji z tamtego konta na to. Zrรณb to ZANIM rozpoczniesz przenoszenie siฤ™ z tamtego konta. Proszฤ™ wpisz tag konta w formacie @person@instance.com -migrationConfirm: "Czy jesteล› na 200% pewn* tego, ลผe chcesz przenieล›ฤ‡ swoje konto\ - \ na {account}? Gdy to zrobisz, odwrรณcenie tego bฤ™dzie nie moลผliwe, i nie bฤ™dziesz\ - \ w stanie ponownie uลผywaฤ‡ normalnie z tego konta.\nUpewnij siฤ™, ลผe to konto zostaล‚o\ - \ ustawione jako konto z ktรณrego siฤ™ przenosisz." +migrationConfirm: "Czy jesteล› absolutnie pewn* tego, ลผe chcesz przenieล›ฤ‡ swoje konto\ + \ na {account}? Tego dziaล‚ania nie moลผna odwrรณciฤ‡. Nieodwracalnie stracisz moลผliwoล›ฤ‡\ + \ normalnego korzystania z konta.\nUpewnij siฤ™, ลผe to konto zostaล‚o ustawione jako\ + \ konto z ktรณrego siฤ™ przenosisz." noThankYou: Nie, dziฤ™kujฤ™ addInstance: Dodaj instancjฤ™ renoteMute: Wycisz podbicia @@ -1894,25 +1904,9 @@ indexNotice: Indeksujฤ™. Zapewne zajmie to chwilฤ™, nie restartuj serwera przez customKaTeXMacro: Niestandardowe makra KaTeX enableCustomKaTeXMacro: Wล‚ฤ…cz niestandardowe makra KaTeX noteId: ID wpisu -_apps: - apps: Aplikacje - crossPlatform: Wieloplatformowe - mobile: Mobilne - firstParty: Oficjalne - firstClass: Pierwszej klasy - secondClass: Drugiej klasy - thirdClass: Trzeciej klasy - free: Darmowe - paid: Pล‚atne - pwa: Zainstaluj PWA - kaiteki: Kaiteki - milktea: Milktea - missLi: MissLi - mona: Mona - theDesk: TheDesk - lesskey: Lesskey hiddenTagsDescription: 'Wypisz tagi (bez #) hashtagรณw ktรณre masz zamiar ukryฤ‡ z "Na - czasie" i "Eksploruj". Na ukryte hashtagi moลผna dalej wejล›ฤ‡ innymi sposobami.' + czasie" i "Eksploruj". Na ukryte hashtagi moลผna dalej wejล›ฤ‡ innymi sposobami. Ta + lista nie ma wpล‚ywu na zablokowane instancje.' proxyAccountDescription: Konto proxy jest kontem ktรณre w okreล›lonych sytuacjach zachowuje siฤ™ jak zdalny obserwujฤ…cy. Na przykล‚ad, kiedy uลผytkownik dodaje zdalnego uลผytkownika do listy, oraz ลผaden lokalny uลผytkownik nie obserwuje tego konta, aktywnoล›ฤ‡ owego @@ -1927,7 +1921,7 @@ sendErrorReportsDescription: "Gdy ta opcja jest wล‚ฤ…czona, szczegรณล‚owe inform \ Calckey.\nZawrze to informacje takie jak wersja twojego systemu operacyjnego,\ \ przeglฤ…darki, Twoja aktywnoล›ฤ‡ na Calckey itd." privateModeInfo: Jeล›li wล‚ฤ…czone, tylko dopuszczone instancje bฤ™dฤ… mogล‚y federowaฤ‡ - z Twojฤ… instancjฤ…. Wszystkie posty bฤ™dฤ… ukryte przed publikฤ…. + z Twojฤ… instancjฤ…. Wszystkie posty bฤ™dฤ… jedynie widoczne na Twojej instancji. oneHour: Godzina oneDay: Dzieล„ oneWeek: Tydzieล„ @@ -1999,3 +1993,23 @@ themeColor: Kolor znacznika instancji instanceDefaultLightTheme: Domyล›lny jasny motyw instancji enableEmojiReactions: Wล‚ฤ…cz reakcje emoji showEmojisInReactionNotifications: Pokazuj emoji w powiadomieniach reakcyjnych +apps: Aplikacje +silenceThisInstance: Wycisz tฤ™ instancjฤ™ +silencedInstances: Wyciszone instancje +deleted: Usuniฤ™te +editNote: Edytuj wpis +edited: Edytowany +silenced: Wyciszony +findOtherInstance: Znajdลบ inny serwer +userSaysSomethingReasonReply: '{name} odpowiedziaล‚ na wpis zawierajฤ…cy {reason}' +userSaysSomethingReasonRenote: '{name} podbiล‚ post zawierajฤ…cy {reason}' +signupsDisabled: Rejestracja na tym serwerze jest obecnie zamkniฤ™ta, ale zawsze moลผesz + siฤ™ zapisaฤ‡ na innym! Jeล›li masz kod zaproszeniowy na ten serwer, wpisz go poniลผej. +userSaysSomethingReasonQuote: '{name} zacytowaล‚ wpis zawierajฤ…cy {reason}' +silencedInstancesDescription: Wymieล„ nazwy domenowe instancji, ktรณre chcesz wyciszyฤ‡. + Profile w wyciszonych instancjach sฤ… traktowane jako "Wyciszony", mogฤ… jedynie wysyล‚aฤ‡ + proล›by obserwacji, i nie mogฤ… oznaczaฤ‡ w wzmiankach profili lokalnych jeล›li nie + sฤ… obserwowane. To nie bฤ™dzie miaล‚o wpล‚ywu na zablokowane instancje. +cannotUploadBecauseExceedsFileSizeLimit: Ten plik nie mรณgล‚ byฤ‡ przesล‚any, poniewaลผ + jego wielkoล›ฤ‡ przekracza dozwolony limit. +sendModMail: Wyล›lij Powiadomienie Moderacyjne diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index 91d96fcc5..b022c75ea 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -1937,23 +1937,6 @@ _preferencesBackups: cannotLoad: ะ—ะฐะณั€ัƒะทะบะฐ ะฝะต ัƒะดะฐะปะฐััŒ invalidFile: ะะตะฟั€ะฐะฒะธะปัŒะฝั‹ะน ั„ะพั€ะผะฐั‚ ั„ะฐะนะปะฐ enableEmojiReactions: ะ’ะบะปัŽั‡ะธั‚ัŒ ัะผะพะดะทะธ ั€ะตะฐะบั†ะธะธ -_apps: - paid: ะŸะปะฐั‚ะฝั‹ะต - lesskey: Lesskey - pwa: ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ PWA - free: ะ‘ะตัะฟะปะฐั‚ะฝั‹ะต - apps: ะŸั€ะธะปะพะถะตะฝะธั - crossPlatform: ะšั€ะพััะฟะปะฐั‚ั„ะพั€ะผะตะฝะฝั‹ะต - mobile: ะœะพะฑะธะปัŒะฝั‹ะต - firstParty: ะžั‚ ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะพะฒ - firstClass: ะŸะตั€ะฒั‹ะน ะบะปะฐัั - thirdClass: ะขั€ะตั‚ะธะน ะบะปะฐัั - kaiteki: Kaiteki - milktea: Milktea - missLi: MissLi - mona: Mona - theDesk: TheDesk - secondClass: ะ’ั‚ะพั€ะพะน ะบะปะฐัั migrationConfirm: "ะ’ั‹ ะฐะฑัะพะปัŽั‚ะฝะพ ัƒะฒะตั€ะตะฝั‹ ั‡ั‚ะพ ั…ะพั‚ะธั‚ะต ะผะธะณั€ะธั€ะพะฒะฐั‚ัŒ ะฒะฐัˆ ะฐะบะบะฐัƒะฝั‚ ะฝะฐ {account}?\ \ ะšะฐะบ ั‚ะพะปัŒะบะพ ะฒั‹ ัะดะตะปะฐะตั‚ะต, ะฒั‹ ะฝะต ัะผะพะถะตั‚ะต ะพั‚ะผะตะฝะธั‚ัŒ ัั‚ะพ ะธ ะฝะต ัะผะพะถะตั‚ะต ะฝะพั€ะผะฐะปัŒะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ\ \ ะฐะบะบะฐัƒะฝั‚ ัะฝะพะฒะฐ.\nะขะฐะบะถะต, ะฟะพะถะฐะปัƒะนัั‚ะฐ, ัƒะฑะตะดะธั‚ะตััŒ, ั‡ั‚ะพ ะฒั‹ ัƒัั‚ะฐะฝะพะฒะธะปะธ ัั‚ัƒ ั‚ะตะบัƒั‰ัƒัŽ ัƒั‡ะตั‚ะฝัƒัŽ\ @@ -2000,3 +1983,4 @@ customKaTeXMacroDescription: 'ะะฐัั‚ั€ะพะนั‚ะต ะผะฐะบั€ะพัั‹ ั‡ั‚ะพะฑั‹ ะปะต ะฒะตั‚ะฒะปะตะฝะธะต, ะทะดะตััŒ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒัั ะฝะต ะผะพะถะตั‚.' cannotUploadBecauseExceedsFileSizeLimit: ะญั‚ะพั‚ ั„ะฐะนะป ะฝะต ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะทะฐะณั€ัƒะถะตะฝ ั‚ะฐะบ ะบะฐะบ ะพะฝ ะฟั€ะตะฒั‹ัˆะฐะตั‚ ะผะฐะบัะธะผะฐะปัŒะฝะพ ั€ะฐะทั€ะตัˆั‘ะฝะฝั‹ะน ั€ะฐะทะผะตั€. +apps: ะŸั€ะธะปะพะถะตะฝะธั diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 42fec8279..093dbd994 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -1790,10 +1790,6 @@ moveAccountDescription: '้€™ๅ€‹้Ž็จ‹ๆ˜ฏไธๅฏ้€†็š„ใ€‚ ๅœจ้ท็งปๅ‰๏ผŒ่ซ‹็ขบไฟ moveFrom: ็”ฑ่ˆŠๅธณๆˆถ็งป่‡ณๆญคๅธณๆˆถ moveFromDescription: '้€™ๅฐ‡็‚บไฝ ็š„่ˆŠๅธณๆˆถ่จญ็ฝฎไธ€ๅ€‹ๅˆฅๅ(Alias)๏ผŒไปฅไพฟไฝ ๅฏไปฅๅพž่ฉฒๅธณๆˆถ่ฝ‰็งปๅˆฐ็•ถๅ‰ๅธณๆˆถใ€‚ ๅœจไฝ ็š„่ˆŠๅธณๆˆถ็งปๅ‹•ไน‹ๅ‰่ซ‹ๅŸท่กŒๆญคๆ“ไฝœใ€‚ ่ซ‹่ผธๅ…ฅๅธณๆˆถๆจ™็ฑค (ๆ ผๅผ: @person@instance.com)' -_apps: - crossPlatform: ่ทจๅนณๅฐ - free: ๅ…่ฒป - paid: ไป˜่ฒป enableEmojiReactions: ๅ•Ÿ็”จ่กจๆƒ…็ฌฆ่™Ÿๅๆ‡‰ breakFollowConfirm: ๆ‚จ็ขบๅฎš่ฆ็งป้™ค่ฉฒ้—œๆณจ่€…ๅ—Ž๏ผŸ socialTimeline: ็คพไบคๆ™‚้–“่ปธ diff --git a/package.json b/package.json index 54dd460b4..9d29a8c67 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "calckey", - "version": "14.0.0-dev3", + "version": "14.0.0-dev10", "codename": "aqua", "repository": { "type": "git", "url": "https://codeberg.org/calckey/calckey.git" }, - "packageManager": "pnpm@8.3.1", + "packageManager": "pnpm@8.5.0", "private": true, "scripts": { "rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp", diff --git a/packages/backend/assets/redoc.html b/packages/backend/assets/redoc.html index 4013abe31..6f48c1766 100644 --- a/packages/backend/assets/redoc.html +++ b/packages/backend/assets/redoc.html @@ -5,7 +5,6 @@ - + + + {{ i18n.ts.reduceUiAnimation }} + + +

- -
+
{{ i18n.ts.next }} -
-
+

-
-
+
-
-
+
-
+
@@ -189,7 +200,7 @@ @@ -29,6 +29,7 @@ > .label { font-weight: bold; margin: 1.5em 0 16px 0; + font-size: 1em; &:empty { display: none; diff --git a/packages/client/src/components/global/MkPageHeader.vue b/packages/client/src/components/global/MkPageHeader.vue index c78ef0c10..b288fcaa0 100644 --- a/packages/client/src/components/global/MkPageHeader.vue +++ b/packages/client/src/components/global/MkPageHeader.vue @@ -1,5 +1,5 @@
- + diff --git a/packages/client/src/pages/channels.vue b/packages/client/src/pages/channels.vue index 705b99671..61a647d97 100644 --- a/packages/client/src/pages/channels.vue +++ b/packages/client/src/pages/channels.vue @@ -46,15 +46,9 @@ {{ i18n.ts._channel.nameOnly }} - {{ i18n.ts.search }} + {{ + i18n.ts.search + }} - + (); let tabs = ["overview"]; -if (iAmModerator) tabs.push("chart", "users", "raw"); +if (iAmAdmin) tabs.push("chart", "users", "raw"); let tab = $ref(tabs[0]); watch($$(tab), () => syncSlide(tabs.indexOf(tab))); @@ -387,7 +387,7 @@ let isSilenced = $ref(false); let faviconUrl = $ref(null); const usersPagination = { - endpoint: iAmModerator ? "admin/show-users" : ("users" as const), + endpoint: iAmAdmin ? "admin/show-users" : ("users" as const), limit: 10, params: { sort: "+updatedAt", @@ -398,7 +398,8 @@ const usersPagination = { }; async function fetch() { - meta = (await os.api("admin/meta")) as AugmentedInstanceMetadata; + if (iAmAdmin) + meta = (await os.api("admin/meta")) as AugmentedInstanceMetadata; instance = (await os.api("federation/show-instance", { host: props.host, })) as AugmentedInstance; @@ -478,7 +479,7 @@ let theTabs = [ }, ]; -if (iAmModerator) { +if (iAmAdmin) { theTabs.push( { key: "chart", diff --git a/packages/client/src/pages/mfm-cheat-sheet.vue b/packages/client/src/pages/mfm-cheat-sheet.vue index 754f19e93..20f69a6ce 100644 --- a/packages/client/src/pages/mfm-cheat-sheet.vue +++ b/packages/client/src/pages/mfm-cheat-sheet.vue @@ -427,7 +427,7 @@ import { instance } from "@/instance"; let preview_mention = $ref("@example"); let preview_hashtag = $ref("#test"); -let preview_link = $ref(`[${i18n.ts._mfm.dummy}](https://example.com)`); +let preview_link = $ref(`[${i18n.ts._mfm.dummy}](https://calckey.org)`); let preview_emoji = $ref( instance.emojis.length ? `:${instance.emojis[0].name}:` : ":emojiname:" ); diff --git a/packages/client/src/pages/note.vue b/packages/client/src/pages/note.vue index 29c18c12e..dbc2f2aa9 100644 --- a/packages/client/src/pages/note.vue +++ b/packages/client/src/pages/note.vue @@ -218,7 +218,9 @@ definePageMetadata( } .fcuexfpr { - background: var(--bg); + #calckey_app > :not(.wallpaper) & { + background: var(--bg); + } > .note { > .main { diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue index 587cf94a9..fdee4a210 100644 --- a/packages/client/src/pages/settings/general.vue +++ b/packages/client/src/pages/settings/general.vue @@ -92,9 +92,16 @@ {{ i18n.ts.showAds }} - {{ - i18n.ts.disableAnimatedMfm - }} + + {{ i18n.ts._mfm.alwaysPlay }} + + {{ i18n.ts.reduceUiAnimation }} @@ -123,9 +130,6 @@ {{ i18n.ts.seperateRenoteQuote }} - {{ - i18n.ts.highlightCw - }} {{ i18n.ts.useSystemFont }} @@ -264,7 +268,7 @@ const showGapBetweenNotesInTimeline = computed( defaultStore.makeGetterSetter("showGapBetweenNotesInTimeline") ); const showAds = computed(defaultStore.makeGetterSetter("showAds")); -const disableAnimatedMfm = computed( +const autoplayMfm = computed( defaultStore.makeGetterSetter( "animatedMfm", (v) => !v, @@ -305,7 +309,6 @@ const useReactionPickerForContextMenu = computed( const seperateRenoteQuote = computed( defaultStore.makeGetterSetter("seperateRenoteQuote") ); -const highlightCw = computed(defaultStore.makeGetterSetter("highlightCw")); const squareAvatars = computed(defaultStore.makeGetterSetter("squareAvatars")); const showUpdates = computed(defaultStore.makeGetterSetter("showUpdates")); const swipeOnDesktop = computed( diff --git a/packages/client/src/pages/settings/import-export.vue b/packages/client/src/pages/settings/import-export.vue index 40bb8708d..b2ac12cad 100644 --- a/packages/client/src/pages/settings/import-export.vue +++ b/packages/client/src/pages/settings/import-export.vue @@ -23,11 +23,10 @@ > - - - diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue index a3c748271..0ff824bb4 100644 --- a/packages/client/src/pages/settings/index.vue +++ b/packages/client/src/pages/settings/index.vue @@ -26,14 +26,14 @@ > -
-
+ diff --git a/packages/client/src/pages/settings/privacy.vue b/packages/client/src/pages/settings/privacy.vue index c3ab41a64..07ae24e59 100644 --- a/packages/client/src/pages/settings/privacy.vue +++ b/packages/client/src/pages/settings/privacy.vue @@ -60,6 +60,13 @@ {{ i18n.ts.noCrawle }}
+ + {{ i18n.ts.preventAiLearning + }}{{ i18n.ts.beta }} + + .toggleWrapper { display: inline-block; text-align: left; - overflow: clip; padding: 0 100px; vertical-align: bottom; @@ -304,6 +303,10 @@ definePageMetadata({ position: absolute; left: -99em; } + + &:focus-within > .toggle { + outline: auto; + } } .toggle { @@ -506,7 +509,6 @@ definePageMetadata({ } } } - > .sync { padding: 14px 16px; border-top: solid 0.5px var(--divider); diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue index e3f8a0083..6ab0fdda4 100644 --- a/packages/client/src/pages/timeline.vue +++ b/packages/client/src/pages/timeline.vue @@ -391,7 +391,7 @@ onMounted(() => { } > .tl { - background: var(--bg); + background: none; border-radius: var(--radius); overflow: clip; } diff --git a/packages/client/src/pages/user-info.vue b/packages/client/src/pages/user-info.vue index 12321c2ba..0edb85ba9 100644 --- a/packages/client/src/pages/user-info.vue +++ b/packages/client/src/pages/user-info.vue @@ -205,17 +205,24 @@ {{ i18n.ts.resetPassword }} + + {{ i18n.ts.sendModMail }} {{ i18n.ts.deleteAccount }} + {{ i18n.ts.deleteAccount }} .tl { - background: var(--bg); + background: none; border-radius: var(--radius); overflow: clip; } diff --git a/packages/client/src/router.ts b/packages/client/src/router.ts index 16a056de9..7f03279dd 100644 --- a/packages/client/src/router.ts +++ b/packages/client/src/router.ts @@ -195,11 +195,6 @@ export const routes = [ name: "api", component: page(() => import("./pages/settings/api.vue")), }, - { - path: "/apps", - name: "api", - component: page(() => import("./pages/settings/apps.vue")), - }, { path: "/webhook/edit/:webhookId", name: "webhook", @@ -300,10 +295,6 @@ export const routes = [ path: "/about-calckey", component: page(() => import("./pages/about-calckey.vue")), }, - { - path: "/apps", - component: page(() => import("./pages/apps.vue")), - }, { path: "/theme-editor", component: page(() => import("./pages/theme-editor.vue")), diff --git a/packages/client/src/scripts/extract-mfm.ts b/packages/client/src/scripts/extract-mfm.ts new file mode 100644 index 000000000..c70d1e7b8 --- /dev/null +++ b/packages/client/src/scripts/extract-mfm.ts @@ -0,0 +1,21 @@ +import * as mfm from "mfm-js"; + +const animatedMfm = [ + "tada", + "jelly", + "twitch", + "shake", + "spin", + "jump", + "bounce", + "rainbow", +]; + +export function extractMfmWithAnimation(nodes: mfm.MfmNode[]): string[] { + const mfmNodes = mfm.extract(nodes, (node) => { + return node.type === "fn" && animatedMfm.indexOf(node.props.name) > -1; + }); + const mfms = mfmNodes.map((x) => x.props.fn); + + return mfms; +} diff --git a/packages/client/src/scripts/helpMenu.ts b/packages/client/src/scripts/helpMenu.ts index aca9d6e70..81e0a08ec 100644 --- a/packages/client/src/scripts/helpMenu.ts +++ b/packages/client/src/scripts/helpMenu.ts @@ -25,10 +25,12 @@ export function openHelpMenu_(ev: MouseEvent) { to: "/about-calckey", }, { - type: "link", - text: i18n.ts._apps.apps, + type: "button", + text: i18n.ts.apps, icon: "ph-device-mobile ph-bold ph-lg", - to: "/apps", + action: () => { + window.open("https://calckey.org/apps", "_blank"); + }, }, { type: "button", diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts index f7f9a4586..adebb1c49 100644 --- a/packages/client/src/store.ts +++ b/packages/client/src/store.ts @@ -146,10 +146,6 @@ export const defaultStore = markRaw( where: "device", default: true, }, - highlightCw: { - where: "device", - default: false, - }, nsfw: { where: "device", default: "respect" as "respect" | "force" | "ignore", @@ -162,6 +158,10 @@ export const defaultStore = markRaw( where: "device", default: true, }, + animatedMfmWarnShown: { + where: "device", + default: false, + }, loadRawImages: { where: "device", default: false, diff --git a/packages/client/src/style.scss b/packages/client/src/style.scss index 52c7b62f4..37cb76f02 100644 --- a/packages/client/src/style.scss +++ b/packages/client/src/style.scss @@ -40,7 +40,6 @@ html { touch-action: manipulation; - background-color: var(--bg); background-attachment: fixed; background-size: cover; background-position: center; diff --git a/packages/client/src/types/menu.ts b/packages/client/src/types/menu.ts index dcb680366..5e7f2f07a 100644 --- a/packages/client/src/types/menu.ts +++ b/packages/client/src/types/menu.ts @@ -1,26 +1,16 @@ import * as Misskey from "calckey-js"; -import { ComputedRef, Ref } from "vue"; - -export type MenuClasses = - | Array - | Ref> - | ComputedRef>; -export type MenuBase = { - classes?: MenuClasses; - hidden?: boolean | Ref; - visible?: boolean | Ref; -}; +import { Ref } from "vue"; export type MenuAction = (ev: MouseEvent) => void; export type MenuDivider = null; export type MenuNull = undefined; -export type MenuLabel = MenuBase & { +export type MenuLabel = { type: "label"; text: string; textStyle?: string; }; -export type MenuLink = MenuBase & { +export type MenuLink = { type: "link"; to: string; text: string; @@ -29,7 +19,7 @@ export type MenuLink = MenuBase & { indicate?: boolean; avatar?: Misskey.entities.User; }; -export type MenuA = MenuBase & { +export type MenuA = { type: "a"; href: string; target?: string; @@ -39,21 +29,22 @@ export type MenuA = MenuBase & { icon?: string; indicate?: boolean; }; -export type MenuUser = MenuBase & { +export type MenuUser = { type: "user"; user: Misskey.entities.User; active?: boolean; indicate?: boolean; + hidden?: boolean; action: MenuAction; }; -export type MenuSwitch = MenuBase & { +export type MenuSwitch = { type: "switch"; ref: Ref; text: string; textStyle?: string; disabled?: boolean; }; -export type MenuButton = MenuBase & { +export type MenuButton = { type?: "button"; text: string; textStyle?: string; @@ -61,28 +52,11 @@ export type MenuButton = MenuBase & { indicate?: boolean; danger?: boolean; active?: boolean; + hidden?: boolean; avatar?: Misskey.entities.User; action: MenuAction; }; -export type MenuButtonMultipleIcons = MenuBase & { - type?: "button"; - text: string; - textStyle?: string; - icons: string[]; - indicate?: boolean; - danger?: boolean; - active?: boolean; - avatar?: Misskey.entities.User; - action: MenuAction; -}; -export type MenuInput = MenuBase & { - type: "input"; - ref: Ref; - placeholder: string; - disabled?: boolean; - required?: boolean | Ref; -}; -export type MenuParent = MenuBase & { +export type MenuParent = { type: "parent"; text: string; textStyle?: string; @@ -90,9 +64,7 @@ export type MenuParent = MenuBase & { children: OuterMenuItem[]; }; -export type MenuPending = MenuBase & { - type: "pending"; -}; +export type MenuPending = { type: "pending" }; type OuterMenuItem = | MenuDivider @@ -103,19 +75,9 @@ type OuterMenuItem = | MenuUser | MenuSwitch | MenuButton - | MenuButtonMultipleIcons - | MenuInput | MenuParent; type OuterPromiseMenuItem = Promise< - | MenuLabel - | MenuLink - | MenuA - | MenuUser - | MenuSwitch - | MenuButton - | MenuButtonMultipleIcons - | MenuInput - | MenuParent + MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton | MenuParent >; export type MenuItem = OuterMenuItem | OuterPromiseMenuItem; export type InnerMenuItem = @@ -127,6 +89,4 @@ export type InnerMenuItem = | MenuUser | MenuSwitch | MenuButton - | MenuButtonMultipleIcons - | MenuInput | MenuParent; diff --git a/packages/client/src/ui/_common_/navbar.vue b/packages/client/src/ui/_common_/navbar.vue index 14e1f1cd1..a51ff5e7d 100644 --- a/packages/client/src/ui/_common_/navbar.vue +++ b/packages/client/src/ui/_common_/navbar.vue @@ -1,5 +1,5 @@ - - diff --git a/packages/client/src/ui/classic.vue b/packages/client/src/ui/classic.vue index 266effd9a..4ee25a0fe 100644 --- a/packages/client/src/ui/classic.vue +++ b/packages/client/src/ui/classic.vue @@ -13,9 +13,7 @@ class="columns" :class="{ fullView, withGlobalHeader: showMenuOnTop }" > - +
import { defineAsyncComponent, markRaw, ref, onMounted, provide } from "vue"; -import XSidebar from "./classic.sidebar.vue"; +import XSidebar from "./_common_/navbar.vue"; import XCommon from "./_common_/common.vue"; import type { ComputedRef } from "vue"; import type { PageMetadata } from "@/scripts/page-metadata"; @@ -72,7 +70,7 @@ import { import { defaultStore } from "@/store"; import { i18n } from "@/i18n"; const XHeaderMenu = defineAsyncComponent(() => import("./classic.header.vue")); -const XWidgets = defineAsyncComponent(() => import("./classic.widgets.vue")); +const XWidgets = defineAsyncComponent(() => import("./universal.widgets.vue")); const DESKTOP_THRESHOLD = 1100; @@ -101,7 +99,7 @@ provide("shouldSpacerMin", true); function attachSticky(el) { const sticky = new StickySidebar( el, - defaultStore.state.menuDisplay === "top" ? 0 : 16, + defaultStore.state.menuDisplay === 0, defaultStore.state.menuDisplay === "top" ? 60 : 0 ); // TODO: ใƒ˜ใƒƒใƒ€ใƒผใฎ้ซ˜ใ•ใ‚’60pxใจๆฑบใ‚ๆ‰“ใกใ—ใฆใ„ใ‚‹ใฎใ‚’็›ดใ™ window.addEventListener( @@ -236,9 +234,19 @@ onMounted(() => { min-height: calc(var(--vh, 1vh) * 100); box-sizing: border-box; + --navBg: transparent; + --X14: var(--acrylicBg); + &.wallpaper { background: var(--wallpaperOverlay); - //backdrop-filter: var(--blur, blur(4px)); + :deep(main) { + background: var(--acrylicBg) !important; + backdrop-filter: blur(12px); + } + :deep(.tl), + :deep(.notes) { + background: none !important; + } } > .columns { @@ -250,7 +258,7 @@ onMounted(() => { &.fullView { margin: 0; - > .sidebar { + > :deep(.sidebar) { display: none; } @@ -266,6 +274,56 @@ onMounted(() => { } } + > :deep(.sidebar) { + margin-left: -200px; + padding-left: 200px; + box-sizing: content-box; + .banner { + pointer-events: none; + mask: radial-gradient( + farthest-side at top, + hsl(0, 0%, 0%) 0%, + hsla(0, 0%, 0%, 0.987) 0.3%, + hsla(0, 0%, 0%, 0.951) 1.4%, + hsla(0, 0%, 0%, 0.896) 3.2%, + hsla(0, 0%, 0%, 0.825) 5.8%, + hsla(0, 0%, 0%, 0.741) 9.3%, + hsla(0, 0%, 0%, 0.648) 13.6%, + hsla(0, 0%, 0%, 0.55) 18.9%, + hsla(0, 0%, 0%, 0.45) 25.1%, + hsla(0, 0%, 0%, 0.352) 32.4%, + hsla(0, 0%, 0%, 0.259) 40.7%, + hsla(0, 0%, 0%, 0.175) 50.2%, + hsla(0, 0%, 0%, 0.104) 60.8%, + hsla(0, 0%, 0%, 0.049) 72.6%, + hsla(0, 0%, 0%, 0.013) 85.7%, + hsla(0, 0%, 0%, 0) 100% + ) !important; + -webkit-mask: radial-gradient( + farthest-side at top, + hsl(0, 0%, 0%) 0%, + hsla(0, 0%, 0%, 0.987) 0.3%, + hsla(0, 0%, 0%, 0.951) 1.4%, + hsla(0, 0%, 0%, 0.896) 3.2%, + hsla(0, 0%, 0%, 0.825) 5.8%, + hsla(0, 0%, 0%, 0.741) 9.3%, + hsla(0, 0%, 0%, 0.648) 13.6%, + hsla(0, 0%, 0%, 0.55) 18.9%, + hsla(0, 0%, 0%, 0.45) 25.1%, + hsla(0, 0%, 0%, 0.352) 32.4%, + hsla(0, 0%, 0%, 0.259) 40.7%, + hsla(0, 0%, 0%, 0.175) 50.2%, + hsla(0, 0%, 0%, 0.104) 60.8%, + hsla(0, 0%, 0%, 0.049) 72.6%, + hsla(0, 0%, 0%, 0.013) 85.7%, + hsla(0, 0%, 0%, 0) 100% + ) !important; + width: 125% !important; + left: -12.5% !important; + height: 125% !important; + } + } + > .main { min-width: 0; width: 750px; @@ -282,7 +340,6 @@ onMounted(() => { > .widgets { //--panelBorder: none; width: 300px; - margin-top: 16px; @media (max-width: $widgets-hide-threshold) { display: none; @@ -293,10 +350,6 @@ onMounted(() => { } } - > .sidebar { - margin-top: 16px; - } - &.withGlobalHeader { > .main { margin-top: 0; @@ -314,7 +367,7 @@ onMounted(() => { @media (max-width: 850px) { margin: 0; - > .sidebar { + > :deep(.sidebar) { border-right: solid 0.5px var(--divider); } diff --git a/packages/client/src/ui/classic.widgets.vue b/packages/client/src/ui/classic.widgets.vue deleted file mode 100644 index 2c7f16ece..000000000 --- a/packages/client/src/ui/classic.widgets.vue +++ /dev/null @@ -1,127 +0,0 @@ - - - - - diff --git a/packages/client/src/ui/deck/column.vue b/packages/client/src/ui/deck/column.vue index 425f00293..03859abc0 100644 --- a/packages/client/src/ui/deck/column.vue +++ b/packages/client/src/ui/deck/column.vue @@ -323,6 +323,8 @@ function onDrop(ev) { overflow: hidden; contain: strict; + background: var(--bg); + &.draghover { &:after { content: ""; diff --git a/packages/client/src/ui/universal.vue b/packages/client/src/ui/universal.vue index 2fb0adb3a..f6b57c081 100644 --- a/packages/client/src/ui/universal.vue +++ b/packages/client/src/ui/universal.vue @@ -464,13 +464,11 @@ console.log(mainRouter.currentRoute.value.name); > .contents { width: 100%; min-width: 0; - background: var(--bg); } > .widgets { padding: 0 var(--margin); border-left: solid 0.5px var(--divider); - background: var(--bg); @media (max-width: $widgets-hide-threshold) { display: none; diff --git a/packages/client/src/ui/universal.widgets.vue b/packages/client/src/ui/universal.widgets.vue index 8144d3aae..d86d41ed8 100644 --- a/packages/client/src/ui/universal.widgets.vue +++ b/packages/client/src/ui/universal.widgets.vue @@ -1,5 +1,5 @@