diff --git a/desktop/.github/workflows/desktop-release.yml b/desktop/.github/workflows/desktop-release.yml index a3b8b38a13..69fd67ee96 100644 --- a/desktop/.github/workflows/desktop-release.yml +++ b/desktop/.github/workflows/desktop-release.yml @@ -44,8 +44,7 @@ jobs: # If triggered by a tag, checkout photosd-$tag from the source # repository. Otherwise checkout $source (default: "main"). repository: ente-io/ente - ref: - "${{ startsWith(github.ref, 'refs/tags/v') && + ref: "${{ startsWith(github.ref, 'refs/tags/v') && format('photosd-{0}', github.ref_name) || ( inputs.source || 'main' ) }}" @@ -110,8 +109,7 @@ jobs: env: # macOS notarization credentials key details APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_APP_SPECIFIC_PASSWORD: - ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} + APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} # Windows Azure Trusted Signing related values # https://www.electron.build/code-signing-win#using-azure-trusted-signing-beta diff --git a/desktop/.prettierrc.json b/desktop/.prettierrc.json index 5c2751a5f9..0fe565bdad 100644 --- a/desktop/.prettierrc.json +++ b/desktop/.prettierrc.json @@ -1,6 +1,5 @@ { "tabWidth": 4, - "proseWrap": "always", "objectWrap": "collapse", "plugins": [ "prettier-plugin-organize-imports", diff --git a/docs/.prettierrc.json b/docs/.prettierrc.json index 8af31cded5..0a02bcefda 100644 --- a/docs/.prettierrc.json +++ b/docs/.prettierrc.json @@ -1,4 +1,3 @@ { - "tabWidth": 4, - "proseWrap": "always" + "tabWidth": 4 } diff --git a/docs/docs/.vitepress/sidebar.ts b/docs/docs/.vitepress/sidebar.ts index 398da45df1..4cd620992e 100644 --- a/docs/docs/.vitepress/sidebar.ts +++ b/docs/docs/.vitepress/sidebar.ts @@ -342,13 +342,17 @@ export const sidebar = [ text: "General", link: "/self-hosting/troubleshooting/misc", }, + { + text: "Docker / quickstart", + link: "/self-hosting/troubleshooting/docker", + }, { text: "Uploads", link: "/self-hosting/troubleshooting/uploads", }, { - text: "Docker / quickstart", - link: "/self-hosting/troubleshooting/docker", + text: "Ente CLI", + link: "/self-hosting/troubleshooting/cli", }, ], }, diff --git a/docs/docs/auth/migration/index.md b/docs/docs/auth/migration/index.md index 24833a2cda..6622a27e25 100644 --- a/docs/docs/auth/migration/index.md +++ b/docs/docs/auth/migration/index.md @@ -1,7 +1,6 @@ --- title: Migrating to Ente Auth -description: - Guides for migrating your existing 2FA tokens into or out of Ente Auth +description: Guides for migrating your existing 2FA tokens into or out of Ente Auth --- # Migrating to/from Ente Auth diff --git a/docs/docs/photos/faq/desktop.md b/docs/docs/photos/faq/desktop.md index c0ef805584..b705bedfc4 100644 --- a/docs/docs/photos/faq/desktop.md +++ b/docs/docs/photos/faq/desktop.md @@ -1,7 +1,6 @@ --- title: Desktop app FAQ -description: - An assortment of frequently asked questions about Ente Photos desktop app +description: An assortment of frequently asked questions about Ente Photos desktop app --- # Desktop app FAQ diff --git a/docs/docs/photos/faq/general.md b/docs/docs/photos/faq/general.md index 040a7e1bfa..e03a6ebc9b 100644 --- a/docs/docs/photos/faq/general.md +++ b/docs/docs/photos/faq/general.md @@ -67,7 +67,7 @@ reliable as any one can be. If you would like to fund the development of this project, please consider [subscribing](https://ente.io/download). -## How do I pronounce ente? +## How do I pronounce Ente? It's like cafe 😊. kaf-_ay_. en-_tay_. diff --git a/docs/docs/photos/faq/security-and-privacy.md b/docs/docs/photos/faq/security-and-privacy.md index 6f40ab043f..dc8a1daac3 100644 --- a/docs/docs/photos/faq/security-and-privacy.md +++ b/docs/docs/photos/faq/security-and-privacy.md @@ -1,7 +1,6 @@ --- title: Security and Privacy FAQ -description: - Comprehensive information about security and privacy measures in Ente Photos +description: Comprehensive information about security and privacy measures in Ente Photos --- # Security and Privacy FAQ diff --git a/docs/docs/photos/features/cast/index.md b/docs/docs/photos/features/cast/index.md index 8a19090bc7..5a29e3b789 100644 --- a/docs/docs/photos/features/cast/index.md +++ b/docs/docs/photos/features/cast/index.md @@ -1,7 +1,6 @@ --- title: Cast -description: - Casting your photos on to a large screen or a TV or a Chromecast device +description: Casting your photos on to a large screen or a TV or a Chromecast device --- # Cast diff --git a/docs/docs/photos/features/family-plans.md b/docs/docs/photos/features/family-plans.md index cc5ee52aff..ff02a07aa1 100644 --- a/docs/docs/photos/features/family-plans.md +++ b/docs/docs/photos/features/family-plans.md @@ -1,7 +1,6 @@ --- title: Family plans -description: - Share your Ente Photos plan with your family members with no extra cost +description: Share your Ente Photos plan with your family members with no extra cost --- # Family plans diff --git a/docs/docs/photos/features/watch-folders.md b/docs/docs/photos/features/watch-folders.md index 7dea25e369..0b3e3310ab 100644 --- a/docs/docs/photos/features/watch-folders.md +++ b/docs/docs/photos/features/watch-folders.md @@ -1,7 +1,6 @@ --- title: Watch folder -description: - Automatic syncing of selected folders using the Ente Photos desktop app +description: Automatic syncing of selected folders using the Ente Photos desktop app --- # Watch folders diff --git a/docs/docs/photos/migration/from-local-hard-disk.md b/docs/docs/photos/migration/from-local-hard-disk.md index 91971ba198..1f42840f2e 100644 --- a/docs/docs/photos/migration/from-local-hard-disk.md +++ b/docs/docs/photos/migration/from-local-hard-disk.md @@ -1,7 +1,6 @@ --- title: Import from local hard disk -description: - Migrating to Ente Photos by importing data from your local hard disk +description: Migrating to Ente Photos by importing data from your local hard disk --- # Import photos from your local hard disk diff --git a/docs/docs/photos/troubleshooting/files-not-uploading.md b/docs/docs/photos/troubleshooting/files-not-uploading.md index b56afe57e3..331ae80e14 100644 --- a/docs/docs/photos/troubleshooting/files-not-uploading.md +++ b/docs/docs/photos/troubleshooting/files-not-uploading.md @@ -1,7 +1,6 @@ --- title: Files not uploading -description: - Troubleshooting when files are not uploading from your Ente Photos app +description: Troubleshooting when files are not uploading from your Ente Photos app --- # Files not uploading diff --git a/docs/docs/self-hosting/administration/users.md b/docs/docs/self-hosting/administration/users.md index 0e64250785..af6ca2b48c 100644 --- a/docs/docs/self-hosting/administration/users.md +++ b/docs/docs/self-hosting/administration/users.md @@ -108,24 +108,11 @@ emails having @example.com as suffix. ### Send email with verification code -You can configure SMTP for sending verification code e-mails to users, which is -efficient if you do not know mail addresses of people for who you want to -hardcode OTTs or if you are serving larger audience. +You can configure SMTP for sending verification code e-mails to users, if you do +not wish to hardcode OTTs and have larger audience. -Set the host and port accordingly with your credentials in `museum.yaml` - -```yaml -smtp: - host: - port: - # Optional username and password if using local relay server - username: - password: - # Email address used for sending emails (this mail's credentials have to be provided) - email: - # Optional name for sender - sender-name: -``` +For more information on configuring email, check out the +[email configuration](/self-hosting/installation/config#email) section. ## Disable registrations diff --git a/docs/docs/self-hosting/index.md b/docs/docs/self-hosting/index.md index a74b70882c..38ce6edeae 100644 --- a/docs/docs/self-hosting/index.md +++ b/docs/docs/self-hosting/index.md @@ -7,8 +7,8 @@ description: Getting started with self-hosting Ente If you're looking to spin up Ente on your server, you are in the right place! -Our entire source code -([including the server](https://ente.io/blog/open-sourcing-our-server/)) is open +Our entire source code, +[including the server](https://ente.io/blog/open-sourcing-our-server/) is open source. This is the same code we use on production. For a quick preview, make sure your system meets the requirements mentioned @@ -35,9 +35,12 @@ This creates a directory `my-ente` in the current working directory, prompts to start the cluster with needed containers after pulling the images required to run Ente. -::: note Make sure to modify the default values in `compose.yaml` and -`museum.yaml` if you wish to change endpoints, bucket configuration or server -configuration. ::: +::: info + +Make sure to modify the default values in `compose.yaml` and `museum.yaml` if +you wish to change endpoints, bucket configuration or server configuration. + +::: ## Try the web app diff --git a/docs/docs/self-hosting/installation/compose.md b/docs/docs/self-hosting/installation/compose.md index b1e76b22e6..fb31639ec4 100644 --- a/docs/docs/self-hosting/installation/compose.md +++ b/docs/docs/self-hosting/installation/compose.md @@ -45,6 +45,25 @@ cp example.yaml museum.yaml Change the values present in `.env` file along with `museum.yaml` file accordingly. +::: tip + +Make sure to enter the correct values for the database and object storage. + +You should consider generating values for JWT and encryption keys for emails if +you intend to use for long-term needs. + +You can do by running the following command inside `ente/server`, assuming you +cloned the repository to `ente`: + +```shell +# Change into the ente/server +cd ente/server +# Generate secrets +go run tools/gen-random-keys/main.go +``` + +::: + ## Step 3: Start the cluster Start the cluster by running the following command: diff --git a/docs/docs/self-hosting/installation/config.md b/docs/docs/self-hosting/installation/config.md index ecade6cec2..7156046c73 100644 --- a/docs/docs/self-hosting/installation/config.md +++ b/docs/docs/self-hosting/installation/config.md @@ -78,6 +78,9 @@ used for Compose and quickstart for ease of use.) ### Database +The `db` section is used for configuring database connectivity. Ensure you +provide correct credentials for proper connectivity within Museum. + | Variable | Description | Default | | ------------- | -------------------------- | ----------- | | `db.host` | DB hostname | `localhost` | @@ -94,10 +97,13 @@ The `s3` section within `museum.yaml` is by default configured to use local MinIO buckets when using `quickstart.sh` or Docker Compose. If you wish to use an external S3 provider, you can edit the configuration with -your provider's credentials, and set `are_local_buckets` to `false`. +your provider's credentials, and set `s3.are_local_buckets` to `false`. -MinIO uses the port `3200` for API Endpoints. Web Console can be accessed at -http://localhost:3201 by enabling port `3201` in the Compose file. +If you are using default MinIO, it is accessible at port `3200`. Web Console can +be accessed by enabling port `3201` in the Compose file. + +For more information on object storage configuration, check our +[documentation](/self-hosting/administration/object-storage). If you face any issues related to uploads then check out [CORS](/self-hosting/administration/object-storage#cors-cross-origin-resource-sharing) @@ -146,6 +152,27 @@ go run tools/gen-random-keys/main.go ### Email +You may wish to send emails for verification codes instead of +[hardcoding them](/self-hosting/administration/users#use-hardcoded-otts). In +such cases, you can configure SMTP (or Zoho Transmail, for bulk emails). + +Set the host and port accordingly with your credentials in `museum.yaml` + +You may skip the username and password if using a local relay server. + +```yaml +smtp: + host: + port: + # Optional username and password if using local relay server + username: + password: + # Email address used for sending emails (this mail's credentials have to be provided) + email: + # Optional name for sender + sender-name: +``` + | Variable | Description | Default | | ------------------ | ---------------------------- | ------- | | `smtp.host` | SMTP server host | | diff --git a/docs/docs/self-hosting/installation/manual.md b/docs/docs/self-hosting/installation/manual.md index eead12222e..b174feab69 100644 --- a/docs/docs/self-hosting/installation/manual.md +++ b/docs/docs/self-hosting/installation/manual.md @@ -92,9 +92,9 @@ git clone https://github.com/ente-io/ente 2. Build the server. The server binary should be available as `./main` relative to `server` directory - ``` shell - go build cmd/museum/main.go - ``` + ```shell + go build cmd/museum/main.go + ``` 3. Create `museum.yaml` file inside `server` for configuring the needed variables. You can copy the templated configuration file for editing with @@ -104,6 +104,25 @@ git clone https://github.com/ente-io/ente cp config/example.yaml ./museum.yaml ``` + ::: tip + + Make sure to enter the correct values for the database and object storage. + + You should consider generating values for JWT and encryption keys for emails + if you intend to use for long-term needs. + + You can do by running the following command inside `ente/server`, assuming + you cloned the repository to `ente`: + + ```shell + # Change into the ente/server + cd ente/server + # Generate secrets + go run tools/gen-random-keys/main.go + ``` + + ::: + 4. Run the server ```shell diff --git a/docs/docs/self-hosting/installation/post-install/index.md b/docs/docs/self-hosting/installation/post-install/index.md index cfd8f6db09..9de972602b 100644 --- a/docs/docs/self-hosting/installation/post-install/index.md +++ b/docs/docs/self-hosting/installation/post-install/index.md @@ -159,7 +159,7 @@ apps](web-dev-settings.png){width=400px} ## Step 7: Configure Ente CLI You can download Ente CLI from -[here](https://github.com/ente-io/ente/releases?q=tag%3Acli) +[here](https://github.com/ente-io/ente/releases?q=tag%3Acli). Check our [documentation](/self-hosting/administration/cli) on how to use Ente CLI for managing self-hosted instances. diff --git a/docs/docs/self-hosting/troubleshooting/cli.md b/docs/docs/self-hosting/troubleshooting/cli.md new file mode 100644 index 0000000000..424addaabe --- /dev/null +++ b/docs/docs/self-hosting/troubleshooting/cli.md @@ -0,0 +1,52 @@ +--- +title: Ente CLI - Self-hosting +description: A quick hotfix for keyring errors while running Ente CLI. +--- + +# Ente CLI + +## Secrets + +Ente CLI makes use of your system keyring for storing sensitive information such +as passwords. + +There are 2 ways to address keyring-related error: + +### Install system keyring + +This is the recommended method as it is considerably secure than the latter. + +If you are using Linux for accessing Ente CLI with, you can install a system +keyring manager such as `gnome-keyring`, `kwallet`, etc. via your distribution's +package manager. + +For Ubuntu/Debian based distributions, you can install `gnome-keyring` via `apt` + +```shell +sudo apt install gnome-keyring +``` + +Now you can use Ente CLI for adding account, which will trigger your system's +keyring. + +### Configure secrets path + +In case of using Ente CLI on server environment, you may not be able to install +system keyring. In such cases, you can configure Ente CLI to use a text file for +saving the secrets. + +Set `ENTE_CLI_SECRETS_PATH` environment variable in your shell's configuration +file (`~/.bashrc`, `~/.zshrc`, or other corresponding file) + +```shell +# Replace ./secrets.txt with the path to secrets file +# that you are using for saving. +# IMPORTANT: Make sure it is stored in a secure place. +export ENTE_CLI_SECRETS_PATH=./secrets.txt +``` + +When you run Ente CLI, and if the file doesn't exist, Ente CLI will create it +and fill it with a random 32 character encryption key. + +If you create the file, please fill it with a cryptographically generated 32 +byte string. diff --git a/docs/docs/self-hosting/troubleshooting/docker.md b/docs/docs/self-hosting/troubleshooting/docker.md index 079b59f71a..030037abdd 100644 --- a/docs/docs/self-hosting/troubleshooting/docker.md +++ b/docs/docs/self-hosting/troubleshooting/docker.md @@ -17,19 +17,20 @@ description: Fixing Docker-related errors when trying to self-host Ente ## post_start -The `server/compose.yaml` Docker compose file uses the "post_start" lifecycle -hook to provision the MinIO instance. +The Docker compose file used if relying on quickstart script or installation +using Docker Compose uses the "post_start" lifecycle hook to provision the MinIO +instance. The lifecycle hook **requires Docker Compose version 2.30.0+**, and if you're -using an older version of docker compose you will see an error like this: +using an older version of Docker Compose you will see an error like this: ``` validating compose.yaml: services.minio Additional property post_start is not allowed ``` -The easiest way to resolve this is to upgrade your Docker compose. +The easiest way to resolve this is to upgrade your Docker Compose. -If you cannot update your Docker compose version, then alternatively you can +If you cannot update your Docker Compose version, then alternatively you can perform the same configuration by removing the "post_start" hook, and adding a new service definition: @@ -70,11 +71,11 @@ supports the `start_interval` property on the health check. ## Postgres authentication failed -If you're getting Postgres password authentication failures when starting your +If you are getting Postgres password authentication failures when starting your cluster, then you might be using a stale Docker volume. -In more detail, if you're getting an error of the following form (pasting a full -example for easier greppability): +If you are getting an error of the following form (pasting a full example for +easier greppability): ``` museum-1 | panic: pq: password authentication failed for user "pguser" @@ -92,9 +93,13 @@ is expecting. There are 2 possibilities: -1. When you have created a cluster in `my-ente` directory on running - `quickstart.sh` and later deleted it, only to create another cluster with - same `my-ente` directory. +1. If you are using Docker Compose for running Ente from source, you might not + have set the same credentials in `.env` and `museum.yaml` inside + `server/config` directory. Edit the values to make sure the correct + credentials are being used. +2. When you have created a cluster in `my-ente` directory on running + `quickstart.sh` and later deleted it, only to create another cluster with + same `my-ente` directory. However, by deleting the directory, the Docker volumes are not deleted. @@ -129,10 +134,6 @@ There are 2 possibilities: ## MinIO provisioning error -MinIO has deprecated the `mc config` command in favor of `mc alias set` -resulting in failure in execution of the command for creating bucket using -`post_start` hook. - You may encounter similar logs while trying to start the cluster if you are using the older command (provided by default in `quickstart.sh`): @@ -142,9 +143,8 @@ my-ente-minio-1 -> | Waiting for minio... my-ente-minio-1 -> | Waiting for minio... ``` -This can be resolved by changing -`mc config host h0 add http://minio:3200 $minio_user $minio_pass` to -`mc alias set h0 http://minio:3200 $minio_user $minio_pass` +This could be due to usage of deprecated MinIO `mc config` command. Changing +`mc config host h0 add` to `mc alias set h0` resolves this. Thus the updated `post_start` will look as follows for `minio` service: @@ -156,13 +156,6 @@ Thus the updated `post_start` will look as follows for `minio` service: sh -c ' #!/bin/sh while ! mc alias set h0 http://minio:3200 your_minio_user your_minio_pass 2>/dev/null - do - echo "Waiting for minio..." - sleep 0.5 - done - cd /data - mc mb -p b2-eu-cen - mc mb -p wasabi-eu-central-2-v3 - mc mb -p scw-eu-fr-v3 + ... ' ``` diff --git a/docs/docs/self-hosting/troubleshooting/keyring.md b/docs/docs/self-hosting/troubleshooting/keyring.md deleted file mode 100644 index 40d6e4521f..0000000000 --- a/docs/docs/self-hosting/troubleshooting/keyring.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Ente CLI Secrets - Self-hosting -description: A quick hotfix for keyring errors while running Ente CLI. ---- - -# Ente CLI Secrets - -Ente CLI makes use of system keyring for storing sensitive information like your -passwords. And running the CLI straight out of the box might give you some -errors related to keyrings in some case. - -Follow the below steps to run Ente CLI and also avoid keyrings errors. - -Run: - -```shell -# export the secrets path -export ENTE_CLI_SECRETS_PATH=./ - -./ente-cli -``` - -You can also add the above line to your shell's rc file, to prevent the need to -export manually every time. - -Then one of the following: - -1. If the file doesn't exist, Ente CLI will create it and fill it with a random - 32 character encryption key. -2. If you do create the file, please fill it with a cryptographically generated - 32 byte string. - -And you are good to go. - -## References - -- [Ente CLI Secrets Path](https://www.reddit.com/r/selfhosted/comments/1gc09il/comment/lu2hox2/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button) -- [Keyrings](https://man7.org/linux/man-pages/man7/keyrings.7.html) diff --git a/infra/staff/.prettierrc.json b/infra/staff/.prettierrc.json index 7cf8c86c77..8b06525972 100644 --- a/infra/staff/.prettierrc.json +++ b/infra/staff/.prettierrc.json @@ -1,6 +1,5 @@ { "tabWidth": 4, - "proseWrap": "always", "plugins": [ "prettier-plugin-organize-imports", "prettier-plugin-packagejson" diff --git a/infra/workers/.prettierrc.json b/infra/workers/.prettierrc.json index 8af31cded5..0a02bcefda 100644 --- a/infra/workers/.prettierrc.json +++ b/infra/workers/.prettierrc.json @@ -1,4 +1,3 @@ { - "tabWidth": 4, - "proseWrap": "always" + "tabWidth": 4 } diff --git a/mobile/apps/auth/lib/l10n/arb/app_ar.arb b/mobile/apps/auth/lib/l10n/arb/app_ar.arb index 7872963dd8..3a0e7b5b61 100644 --- a/mobile/apps/auth/lib/l10n/arb/app_ar.arb +++ b/mobile/apps/auth/lib/l10n/arb/app_ar.arb @@ -1,6 +1,6 @@ { "account": "الحساب", - "unlock": "فتح القُفْل", + "unlock": "فتح القفل", "recoveryKey": "مفتاح الاسترداد", "counterAppBarTitle": "العداد", "@counterAppBarTitle": { @@ -9,8 +9,8 @@ "onBoardingBody": "النسخ الاحتياطي لشيفرات الاستيثاق ذي العاملين", "onBoardingGetStarted": "ابدأ الآن", "setupFirstAccount": "إعداد الحساب الأول الخاص بك", - "importScanQrCode": "مسح شيفرة الاستجابة السريعة", - "qrCode": "شيفرة الاستجابة السريعة", + "importScanQrCode": "مسح رمز QR", + "qrCode": "رمز QR", "importEnterSetupKey": "أدخِل مفتاح الإعداد", "importAccountPageTitle": "أدخل تفاصيل الحساب", "secretCanNotBeEmpty": "لا يمكن أن يكون رمز السر فارغ", @@ -36,7 +36,7 @@ "codeAccountHint": "الحساب (you@domain.com)", "codeTagHint": "وسم", "accountKeyType": "نوع المفتاح", - "sessionExpired": "انتهت صَلاحِيَة الجِلسة", + "sessionExpired": "انتهت صلاحية الجلسة", "@sessionExpired": { "description": "Title of the dialog when the users current session is invalid/expired" }, @@ -106,7 +106,7 @@ "importSelectJsonFile": "انتقِ ملف JSON", "importSelectAppExport": "حدد ملف التصدير الخاص بـ{appName}", "importEnteEncGuide": "اختر ملف JSON المشفر المصدَّر من Ente", - "importRaivoGuide": "استخدم خيار \"صدر كلمات المرور لمرة واحدة إلى أرشيف Zip\" في إعدادات Raivo.\n\nاستخرج ملف الـzip واسترد ملف الـJSON.", + "importRaivoGuide": "استخدم خيار تصدير OTP إلى أرشيف Zip في إعدادات Raivo.\n\nاستخرج ملف zip واسترد ملف JSON.", "importBitwardenGuide": "استخدم خيار \"تصدير خزانة\" داخل أدوات Bitwarden واستيراد ملف JSON غير مشفر.", "importAegisGuide": "استخدم خيار \"Export the vault\" في إعدادات Aegis.\n\nإذا كان المخزن الخاص بك مشفرًا، فستحتاج إلى إدخال كلمة مرور المخزن لفك تشفير المخزن.", "import2FasGuide": "استخدم خيار \"الإعدادات -> النسخ الاحتياطي - التصدير\" في 2FAS.\n\nإذا تم تشفير النسخة الاحتياطية، سوف تحتاج إلى إدخال كلمة المرور لفك تشفير النسخة الاحتياطية", diff --git a/mobile/apps/auth/lib/l10n/arb/app_be.arb b/mobile/apps/auth/lib/l10n/arb/app_be.arb index d1719f4549..8681fde972 100644 --- a/mobile/apps/auth/lib/l10n/arb/app_be.arb +++ b/mobile/apps/auth/lib/l10n/arb/app_be.arb @@ -52,6 +52,7 @@ "trashCodeMessage": "Вы сапраўды хочаце выдаліць код для {account}?", "trash": "Сметніца", "viewLogsAction": "Паглядзець журналы", + "sendLogsDescription": "Гэта абагуліць вашы журналы з намі і дапаможа адладзіць вашу праблему. Хоць мы і прымаем захады, каб канфідэнцыяльныя звесткі не рэгістраваліся, але рэкамендуецца прагледзець гэтыя журналы перад адпраўкай.", "preparingLogsTitle": "Падрыхтоўка журналаў...", "emailLogsTitle": "Адправіць журнал па электроннай пошце", "emailLogsMessage": "Адпраўце журналы на {email}", @@ -83,12 +84,15 @@ "pleaseWait": "Пачакайце...", "generatingEncryptionKeysTitle": "Генерацыя ключоў шыфравання...", "recreatePassword": "Стварыць пароль паўторна", + "recreatePasswordMessage": "У бягучай прылады недастаткова вылічальнай здольнасці для праверкі вашага паролю, таму неабходна регенерыраваць яго адзін раз такім чынам, каб гэта працавала з усімі прыладамі.\n\nУвайдзіце, выкарыстоўваючы свой ключа аднаўлення і регенерыруйце свой пароль (калі хочаце, то можаце выбраць папярэдні пароль).", "useRecoveryKey": "Выкарыстоўваць ключ аднаўлення", "incorrectPasswordTitle": "Няправільны пароль", "welcomeBack": "З вяртаннем!", "emailAlreadyRegistered": "Электронная пошта ўжо зарэгістравана.", "emailNotRegistered": "Электронная пошта не зарэгістравана.", "madeWithLoveAtPrefix": "зроблена з ❤️ у ", + "supportDevs": "Падпішыцеся на ente, каб падтрымаць нас", + "supportDiscount": "Выкарыстоўвайце купон з кодам «AUTH», каб атрымаць скідку ў памеры 10% за першы год", "changeEmail": "Змяніць адрас электроннай пошты", "changePassword": "Змяніць пароль", "data": "Даныя", @@ -98,13 +102,29 @@ "passwordForDecryptingExport": "Пароль для дэшыфроўкі экспартавання", "passwordEmptyError": "Пароль не можа быць пустым", "importFromApp": "Імпартаваць коды з {appName}", + "importGoogleAuthGuide": "Экспартуйце свае ўліковыя запісы з Google Authenticator у QR-код з дапамогай параметра «Перанесці ўліковыя запісы». Потым скарыстайцеся іншай прыладай, якая можа адсканіраваць QR-код.\n\nПарада: вы можаце скарыстацца вэб-камерай свайго ноўтбука, каб сфатаграфаваць QR-код.", "importSelectJsonFile": "Выбраць файл JSON", "importSelectAppExport": "Выберыце файл экспартавання {appName}", + "importEnteEncGuide": "Выберыце зашыфраваны файл JSON, які экспартаваны з Ente", + "importRaivoGuide": "Скарыстайцеся параметрам «Экспартаваць OTP у архіў ZIP» у наладах Raivo.\n\nВыньце файл ZIP і імпартуйце файл JSON.", + "importBitwardenGuide": "Скарыстайцеся параметрам «Экспартаваць сховішча» ў Bitwarden Tools і імпартуйце файл JSON.", + "importAegisGuide": "Скарыстайцеся параметрам «Экспартаваць сховішча» ў наладах Aegis.\n\nВам спатрэбіцца ўвесці пароль ад сховішча, каб дэшыфраваць яго (у выпадку, калі яно было зашыфравана раней).", + "import2FasGuide": "Скарыстайцеся параметрам «Налады -> Рэзервовае капіяванне -Экспартаванне» ў наладах 2FAS.\n\nВам спатрэбіцца ўвесці пароль, каб дэшыфраваць рэзервовую копію (у выпадку, калі яна была зашыфравана раней)", + "importLastpassGuide": "Скарыстайцеся параметрам «Перанесці ўліковыя запісы» ў налады Lastpass Authenticator і націсніце «Экспартаваць уліковыя запісы ў файл».", "exportCodes": "Экспартаваць коды", "importLabel": "Імпарт", + "importInstruction": "Выберыце файл, які змяшчае спіс вашых кодаў у наступным фармаце", + "importCodeDelimiterInfo": "Коды могуць быць адасоблены коскамі або новым радком", "selectFile": "Выбраць файл", "emailVerificationToggle": "Праверка эл. пошты", + "emailVerificationEnableWarning": "Пераканайцеся, што ў вас захавана копія 2ФА ад вашай электроннай пошты па-за межамі праграмы Ente Auth перад тым, як уключаць праверку электроннай пошты. Гэта дазволіць пазбегнуць блакіроўкі вашага ўліковага запісу.", + "authToChangeEmailVerificationSetting": "Прайдзіце аўтэнтыфікацыю, каб змяніць праверку адраса электроннай пошты", "authenticateGeneric": "Прайдзіце аўтэнтыфікацыю", + "authToViewYourRecoveryKey": "Прайдзіце аўтэнтыфікацыю для прагляду свайго ключа аднаўлення", + "authToChangeYourEmail": "Прайдзіце аўтэнтыфікацыю, каб змяніць сваю электронную пошту", + "authToChangeYourPassword": "Прайдзіце аўтэнтыфікацыю, каб змяніць свой пароль", + "authToViewSecrets": "Прайдзіце аўтэнтыфікацыю для прагляду сваіх сакрэтаў", + "authToInitiateSignIn": "Прайдзіце аўтэнтыфікацыю, каб пачаць уваход для рэзервовай копіі.", "ok": "OK", "cancel": "Скасаваць", "yes": "Так", @@ -123,12 +143,17 @@ "oops": "Вой", "suggestFeatures": "Прапанаваць функцыю", "faq": "Частыя пытанні", + "somethingWentWrongMessage": "Нешта пайшло не так. Паспрабуйце яшчэ раз", "leaveFamily": "Пакінуць сямейны план", + "leaveFamilyMessage": "Вы ўпэўнены, што хочаце выйсці з сямейнага плана?", "inFamilyPlanMessage": "Вы ўдзельнік сямейнага плана!", + "hintForMobile": "Доўгі націск на код для рэдагавання або выдалення.", + "hintForDesktop": "Правы націск на код для рэдагавання або выдалення.", "scan": "Сканіраваць", "scanACode": "Сканіраваць код", "verify": "Праверыць", "verifyEmail": "Праверыць электронную пошту", + "enterCodeHint": "Увядзіце шасцізначны код з\nвашай праграмы аўтэнтыфікацыі", "lostDeviceTitle": "Згубілі прыладу?", "twoFactorAuthTitle": "Двухфактарная аўтэнтыфікацыя", "passkeyAuthTitle": "Праверка ключа доступу", @@ -137,14 +162,25 @@ "recoverAccount": "Аднавіць уліковы запіс", "enterRecoveryKeyHint": "Увядзіце свой ключ аднаўлення", "recover": "Аднавіць", + "contactSupportViaEmailMessage": "Адпраўце ліст на {email} з вашага зарэгістраванага адраса электроннай пошты", + "@contactSupportViaEmailMessage": { + "placeholders": { + "email": { + "type": "String" + } + } + }, "invalidQRCode": "Памылковы QR-код", "noRecoveryKeyTitle": "Няма ключа аднаўлення?", "enterEmailHint": "Увядзіце свой адрас электроннай пошты", "enterNewEmailHint": "Увядзіце свой новы адрас электроннай пошты", "invalidEmailTitle": "Памылковы адрас электроннай пошты", + "invalidEmailMessage": "Увядзіце сапраўдны адрас электронная пошты.", "deleteAccount": "Выдаліць уліковы запіс", + "deleteAccountQuery": "Вельмі шкада, што вы пакідаеце нас. Вы сутыкнуліся з нейкай праблемай?", "yesSendFeedbackAction": "Так. Адправіць водгук", "noDeleteAccountAction": "Не, выдаліць уліковы запіс", + "initiateAccountDeleteTitle": "Прайдзіце аўтэнтыфікацыю, каб пачаць выдаленне ўліковага запісу", "sendEmail": "Адправіць ліст", "createNewAccount": "Стварыць новы ўліковы запіс", "weakStrength": "Ненадзейны", @@ -158,9 +194,13 @@ "social": "Сацыяльныя сеткі", "security": "Бяспека", "lockscreen": "Экран блакіроўкі", + "authToChangeLockscreenSetting": "Прайдзіце аўтэнтыфікацыю, каб змяніць налады блакіроўкі экрана", + "deviceLockEnablePreSteps": "Наладзьце код доступу да прылады або блакіроўку экрана ў наладах вашай сістэме, каб уключыць блакіроўку прылады.", "viewActiveSessions": "Паглядзець актыўныя сеансы", + "authToViewYourActiveSessions": "Прайдзіце аўтэнтыфікацыю для прагляду сваіх актыўных сеансаў", "searchHint": "Пошук...", "search": "Пошук", + "sorryUnableToGenCode": "Немагчыма згенерыраваць код з {issuerName}", "noResult": "Няма вынікаў", "addCode": "Дадаць код", "scanAQrCode": "Сканіраваць QR-код", @@ -168,18 +208,36 @@ "edit": "Рэдагаваць", "share": "Абагуліць", "shareCodes": "Абагуліць коды", + "shareCodesDuration": "Выберыце працягласць, на якую вы хочаце абагуліць коды.", "restore": "Аднавіць", "copiedToClipboard": "Скапіявана ў буфер абмену", "copiedNextToClipboard": "Скапіяваць наступны код у буфер абмену", "error": "Памылка", "recoveryKeyCopiedToClipboard": "Ключ аднаўлення скапіяваны ў буфер абмену", + "recoveryKeyOnForgotPassword": "Адзіным спосабам аднавіць вашы даныя з'яўляецца гэты ключ, калі вы забылі свой пароль.", + "recoveryKeySaveDescription": "Захавайце гэты ключ, які складаецца з 24 слоў, у наедзеным месцы. Ён не захоўваецца на нашым серверы.", "doThisLater": "Зрабіць гэта пазней", "saveKey": "Захаваць ключ", "save": "Захаваць", "send": "Адправіць", + "saveOrSendDescription": "Вы сапраўды хочаце захаваць гэта ў сваім сховішчы (прадвызначана папка са спампоўваннямі) або адправіць у іншыя праграмы?", + "saveOnlyDescription": "Вы сапраўды хочаце захаваць гэта ў сваім сховішчы (прадвызначана папка са спампоўваннямі)?", "back": "Назад", "createAccount": "Стварыць уліковы запіс", + "passwordStrength": "Надзейнасць пароля: {passwordStrengthValue}", + "@passwordStrength": { + "description": "Text to indicate the password strength", + "placeholders": { + "passwordStrengthValue": { + "description": "The strength of the password as a string", + "type": "String", + "example": "Weak or Moderate or Strong" + } + }, + "message": "Password Strength: {passwordStrengthText}" + }, "password": "Пароль", + "signUpTerms": "Я пагаджаюся з умовамі абслугоўвання і палітыкай прыватнасці", "privacyPolicyTitle": "Палітыка прыватнасці", "termsOfServicesTitle": "Умовы", "encryption": "Шыфраванне", @@ -187,11 +245,17 @@ "changePasswordTitle": "Змяніць пароль", "resetPasswordTitle": "Скінуць пароль", "encryptionKeys": "Ключы шыфравання", + "passwordWarning": "Мы не захоўваем гэты пароль і мы не зможам расшыфраваць вашы даныя, калі вы забудзеце яго", + "enterPasswordToEncrypt": "Увядзіце пароль, каб была магчымасць выкарыстаць яго для расшыфроўкі вашых даных", + "enterNewPasswordToEncrypt": "Увядзіце новы пароль, каб мы маглі выкарыстаць яго для расшыфроўкі вашых даных", "passwordChangedSuccessfully": "Пароль паспяхова зменены", "generatingEncryptionKeys": "Генерацыя ключоў шыфравання...", "continueLabel": "Працягнуць", "insecureDevice": "Небяспечная прылада", + "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Немагчыма згенерыраваць ключы бяспекі на гэтай прыладзе.\n\nЗарэгіструйцеся з іншай прылады.", "howItWorks": "Як гэта працуе", + "ackPasswordLostWarning": "Я ўсведамляю, што калі я страчу свой пароль, то я магу згубіць свае даныя, бо мае даныя абаронены скразным шыфраваннем.", + "loginTerms": "Націскаючы ўвайсці, я згаджаюся з умовамі абслугоўвання і палітыкай прыватнасці", "logInLabel": "Увайсці", "logout": "Выйсці", "areYouSureYouWantToLogout": "Вы сапраўды хочаце выйсці?", @@ -203,6 +267,7 @@ "systemTheme": "Сістэманая", "verifyingRecoveryKey": "Праверка ключа аднаўлення...", "recoveryKeyVerified": "Ключ аднаўлення правераны", + "recoveryKeySuccessBody": "Усё ў парадку! Вашы ключ аднаўлення з'яўляецца сапраўдным.\n\nНе забывайце захоўваць ваш ключ аднаўлення ў надзейным месцы.", "recreatePasswordTitle": "Стварыць пароль паўторна", "invalidKey": "Памылковы ключ", "tryAgain": "Паспрабуйце яшчэ раз", @@ -254,20 +319,40 @@ "checkInboxAndSpamFolder": "Праверце свае ўваходныя лісты (і спам) для завяршэння праверкі", "tapToEnterCode": "Націсніце, каб увесці код", "resendEmail": "Адправіць ліст яшчэ раз", + "weHaveSendEmailTo": "Ліст адпраўлены на электронную пошту {email}", + "@weHaveSendEmailTo": { + "description": "Text to indicate that we have sent a mail to the user", + "placeholders": { + "email": { + "description": "The email address of the user", + "type": "String", + "example": "example@ente.io" + } + } + }, "manualSort": "Карыстальніцкая", "editOrder": "Рэдагаваць заказ", "mostFrequentlyUsed": "Часта выкарыстоўваюцца", "mostRecentlyUsed": "Нядаўна выкарыстаныя", "activeSessions": "Актыўныя сеансы", + "somethingWentWrongPleaseTryAgain": "Нешта пайшло не так. Паспрабуйце яшчэ раз", + "thisWillLogYouOutOfThisDevice": "Гэта дзеянне завершыць сеанс на вашай прыладзе!", + "thisWillLogYouOutOfTheFollowingDevice": "Гэта дзеянне завершыць сеанс наступнай прылады:", "terminateSession": "Перарваць сеанс?", "terminate": "Перарваць", "thisDevice": "Гэта прылада", + "toResetVerifyEmail": "Спачатку праверце электронную пошту, каб скінуць свой пароль.", "thisEmailIsAlreadyInUse": "Гэта электронная пошта ўжо выкарыстоўваецца", + "verificationFailedPleaseTryAgain": "Збой праверкі. Паспрабуйце яшчэ раз", "yourVerificationCodeHasExpired": "Ваш праверачны код пратэрмінаваны", "incorrectCode": "Няправільны код", + "sorryTheCodeYouveEnteredIsIncorrect": "Уведзены вамі код з'яўляецца няправільным", "emailChangedTo": "Электронная пошта зменена на {newEmail}", + "authenticationFailedPleaseTryAgain": "Збой аўтэнтыфікацыі. Паспрабуйце яшчэ раз", "authenticationSuccessful": "Аўтэнтыфікацыя паспяхова пройдзена!", + "twofactorAuthenticationSuccessfullyReset": "Двухфактарная аўтэнтыфікацыя паспяхова скінута", "incorrectRecoveryKey": "Няправільны ключ аднаўлення", + "theRecoveryKeyYouEnteredIsIncorrect": "Вы ўвялі памылковы ключ аднаўлення", "enterPassword": "Увядзіце пароль", "selectExportFormat": "Выберыце фармат экспартавання", "exportDialogDesc": "Зашыфраванае экспартаванне будзе абаронена паролем, які вы выберыце.", @@ -332,14 +417,19 @@ "description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters." }, "noInternetConnection": "Адсутнічае падключэнне да інтэрнэту", + "pleaseCheckYourInternetConnectionAndTryAgain": "Праверце злучэнне з інтэрнэтам і паспрабуйце яшчэ раз.", "signOutFromOtherDevices": "Выйсці з іншых прылад", "signOutOtherDevices": "Выйсці на іншых прыладах", "doNotSignOut": "Не выходзіць", + "hearUsWhereTitle": "Адкуль вы пачулі пра Ente? (неабавязкова)", + "recoveryKeySaved": "Ключ аднаўлення захаваны ў папцы «Спампоўкі»!", "waitingForBrowserRequest": "Чаканне запыту браўзера...", "waitingForVerification": "Чаканне праверкі...", "passkey": "Ключ доступу", "passKeyPendingVerification": "Праверка пакуль яшчэ не завершана", "loginSessionExpired": "Сеанс завяршыўся", + "loginSessionExpiredDetails": "Ваш сеанс завяршыўся. Увайдзіце яшчэ раз.", + "developerSettingsWarning": "Вы ўпэўнены, што хочаце змяніць налады распрацоўшчыка?", "developerSettings": "Налады распрацоўшчыка", "serverEndpoint": "Канцавы пункт сервера", "invalidEndpoint": "Памылковы канцавы пункт", @@ -356,6 +446,7 @@ "create": "Стварыць", "editTag": "Рэдагаванне тэг", "deleteTagTitle": "Выдаліць тэг?", + "somethingWentWrongParsingCode": "Немагчыма прааналізаваць коды (колькасць: {x}).", "updateNotAvailable": "Абнаўленне недаступна", "viewRawCodes": "Паглядзець неапрацаваныя коды", "rawCodes": "Неапрацаваныя коды", @@ -372,12 +463,17 @@ "setNewPassword": "Задаць новы пароль", "deviceLock": "Блакіроўка прылады", "hideContent": "Схаваць змест", + "hideContentDescriptioniOS": "Хаваць змесціва праграмы ў пераключальніку праграм", "pinLock": "Блакіроўка PIN'ам", "enterPin": "Увядзіце PIN-код", "setNewPin": "Задаць новы PIN", + "importFailureDescNew": "Не ўдалося прааналізаваць выбраны файл.", "appLockNotEnabled": "Блакіроўка праграмы не ўключана", + "appLockNotEnabledDescription": "Уключыце блакіроўку праграмы ў раздзеле «Бяспека» -> «Блакіроўка праграмы»", + "authToViewPasskey": "Прайдзіце аўтэнтыфікацыю, каб паглядзець ключ доступу", "duplicateCodes": "Дублікаты кадоў", "noDuplicates": "✨ Няма дублікатаў", + "youveNoDuplicateCodesThatCanBeCleared": "У вас адсутнічаць дубліраваныя коды, які можна ачысціць", "deduplicateCodes": "Дубліраваныя кады", "deselectAll": "Зняць выбар з усіх", "selectAll": "Выбраць усе", @@ -386,8 +482,12 @@ "tellUsWhatYouThink": "Раскажыце, што вы думаеце", "dropReviewiOS": "Пакіньце водгук у App Store", "dropReviewAndroid": "Пакіньце водгук у Play Store", + "supportEnte": "Падтрымка ente", "giveUsAStarOnGithub": "Адзначце нас зоркай на Github", + "free5GB": "Бясплатна 5 ГБ на ente Photos", "loginWithAuthAccount": "Увайдзіце з дапамогай уліковага запісу Auth", + "freeStorageOffer": "Скідка ў памеры 10% на ente Photos", + "freeStorageOfferDescription": "Выкарыстоўвайце код «AUTH», каб атрымаць скідку ў памеры 10% за першы год", "advanced": "Пашыраныя", "algorithm": "Алгарытм", "type": "Тып", diff --git a/mobile/apps/auth/lib/l10n/arb/app_fr.arb b/mobile/apps/auth/lib/l10n/arb/app_fr.arb index 4d0b461bed..d402d56f9e 100644 --- a/mobile/apps/auth/lib/l10n/arb/app_fr.arb +++ b/mobile/apps/auth/lib/l10n/arb/app_fr.arb @@ -347,14 +347,14 @@ "terminate": "Quitter", "thisDevice": "Cet appareil", "toResetVerifyEmail": "Pour réinitialiser votre mot de passe, veuillez d'abord vérifier votre e-mail.", - "thisEmailIsAlreadyInUse": "Cette adresse mail est déjà utilisé", + "thisEmailIsAlreadyInUse": "Cette adresse mail est déjà utilisée", "verificationFailedPleaseTryAgain": "La vérification a échouée, veuillez réessayer", "yourVerificationCodeHasExpired": "Votre code de vérification a expiré", "incorrectCode": "Code non valide", "sorryTheCodeYouveEnteredIsIncorrect": "Le code que vous avez saisi est incorrect", "emailChangedTo": "L'e-mail a été changé en {newEmail}", "authenticationFailedPleaseTryAgain": "L'authentification a échouée, veuillez réessayer", - "authenticationSuccessful": "Authentification réussie!", + "authenticationSuccessful": "Authentification réussie !", "twofactorAuthenticationSuccessfullyReset": "L'authentification à deux facteurs a été réinitialisée avec succès ", "incorrectRecoveryKey": "Clé de récupération non valide", "theRecoveryKeyYouEnteredIsIncorrect": "La clé de récupération que vous avez entrée est incorrecte", diff --git a/mobile/apps/auth/lib/l10n/arb/app_lt.arb b/mobile/apps/auth/lib/l10n/arb/app_lt.arb index cd39c8b60f..3b3c0523e4 100644 --- a/mobile/apps/auth/lib/l10n/arb/app_lt.arb +++ b/mobile/apps/auth/lib/l10n/arb/app_lt.arb @@ -173,6 +173,7 @@ "invalidQRCode": "Netinkamas QR kodas.", "noRecoveryKeyTitle": "Neturite atkūrimo rakto?", "enterEmailHint": "Įveskite savo el. pašto adresą", + "enterNewEmailHint": "Įveskite savo naują el. pašto adresą", "invalidEmailTitle": "Netinkamas el. pašto adresas", "invalidEmailMessage": "Įveskite tinkamą el. pašto adresą.", "deleteAccount": "Ištrinti paskyrą", diff --git a/mobile/apps/auth/lib/l10n/arb/app_vi.arb b/mobile/apps/auth/lib/l10n/arb/app_vi.arb index 361f40f3d4..99909658ca 100644 --- a/mobile/apps/auth/lib/l10n/arb/app_vi.arb +++ b/mobile/apps/auth/lib/l10n/arb/app_vi.arb @@ -91,7 +91,7 @@ "emailAlreadyRegistered": "Email đã được đăng ký.", "emailNotRegistered": "Email chưa được đăng ký.", "madeWithLoveAtPrefix": "lập trình bằng ❤️ bởi ", - "supportDevs": "Đăng ký ente để hỗ trợ dự án này.", + "supportDevs": "Đăng ký ente để hỗ trợ chúng tôi", "supportDiscount": "Dùng mã \"AUTH\" để được giảm 10% trong năm đầu tiên", "changeEmail": "Đổi email", "changePassword": "Đổi mật khẩu", @@ -513,8 +513,8 @@ "giveUsAStarOnGithub": "Tặng sao trên GitHub", "free5GB": "Miễn phí 5GB cho ente Photos", "loginWithAuthAccount": "Đăng nhập bằng tài khoản Ente Auth", - "freeStorageOffer": "Giảm giá 10% cho ente Photos", - "freeStorageOfferDescription": "Dùng mã \"AUTH\" để được giảm 10% trong năm đầu tiên", + "freeStorageOffer": "Giảm 10% ente Photos", + "freeStorageOfferDescription": "Dùng mã \"AUTH\" để giảm 10% năm đầu tiên", "advanced": "Nâng cao", "algorithm": "Thuật toán", "type": "Loại", diff --git a/mobile/apps/photos/lib/l10n/intl_lt.arb b/mobile/apps/photos/lib/l10n/intl_lt.arb index 704c8bc261..86b591e3ab 100644 --- a/mobile/apps/photos/lib/l10n/intl_lt.arb +++ b/mobile/apps/photos/lib/l10n/intl_lt.arb @@ -484,7 +484,7 @@ "backupOverMobileData": "Kurti atsargines kopijas per mobiliuosius duomenis", "backupVideos": "Kurti atsargines vaizdo įrašų kopijas", "disableAutoLock": "Išjungti automatinį užraktą", - "deviceLockExplanation": "Išjunkite įrenginio ekrano užraktą, kai „Ente“ yra priekiniame fone ir kuriama atsarginės kopijos. Paprastai to nereikia, bet tai gali padėti greičiau užbaigti didelius įkėlimus ir pradinį didelių bibliotekų importą.", + "deviceLockExplanation": "Išjunkite įrenginio ekrano užraktą, kai „Ente“ yra priekiniame fone ir kuriama atsarginės kopijos. Paprastai to nereikia, bet tai gali padėti sparčiau užbaigti didelius įkėlimus ir pradinį didelių bibliotekų importą.", "about": "Apie", "weAreOpenSource": "Esame atviro kodo!", "privacy": "Privatumas", @@ -1049,7 +1049,7 @@ "searchPeopleEmptySection": "Pakvieskite asmenis ir čia matysite visas jų bendrinamas nuotraukas.", "searchAlbumsEmptySection": "Albumai", "searchFileTypesAndNamesEmptySection": "Failų tipai ir pavadinimai", - "searchCaptionEmptySection": "Pridėkite aprašymus, pavyzdžiui, „#kelionė“, į nuotraukos informaciją, kad greičiau jas čia rastumėte.", + "searchCaptionEmptySection": "Pridėkite aprašus, pavyzdžiui, „#kelionė“, į nuotraukos informaciją, kad sparčiau jas čia rastumėte.", "language": "Kalba", "selectLanguage": "Pasirinkite kalbą", "locationName": "Vietovės pavadinimas", @@ -1264,11 +1264,11 @@ "joinDiscord": "Jungtis prie „Discord“", "locations": "Vietovės", "addAName": "Pridėti vardą", - "findThemQuickly": "Raskite juos greitai", + "findThemQuickly": "Raskite juos sparčiai", "@findThemQuickly": { "description": "Subtitle to indicate that the user can find people quickly by name" }, - "findPeopleByName": "Greitai suraskite žmones pagal vardą", + "findPeopleByName": "Sparčiai suraskite asmenis pagal vardą", "addViewers": "{count, plural, =0 {Pridėti žiūrėtojų} =1 {Pridėti žiūrėtoją} other {Pridėti žiūrėtojų}}", "addCollaborators": "{count, plural, =0 {Pridėti bendradarbių} =1 {Pridėti bendradarbį} other {Pridėti bendradarbių}}", "longPressAnEmailToVerifyEndToEndEncryption": "Ilgai paspauskite el. paštą, kad patvirtintumėte visapusį šifravimą.", @@ -1755,5 +1755,40 @@ "receiveRemindersOnBirthdays": "Gaukite priminimus, kai yra kažkieno gimtadienis. Paliesdami pranešimą, pateksite į gimtadienio šventės asmens nuotraukas.", "happyBirthday": "Su gimtadieniu! 🥳", "birthdays": "Gimtadieniai", - "wishThemAHappyBirthday": "Palinkėkite {name} su gimtadieniu! 🎉" + "wishThemAHappyBirthday": "Palinkėkite {name} su gimtadieniu! 🎉", + "areYouSureRemoveThisFaceFromPerson": "Ar tikrai norite pašalinti šį veidą iš šio asmens?", + "otherDetectedFaces": "Kiti aptikti veidai", + "areThey": "Ar jie ", + "questionmark": "?", + "saveAsAnotherPerson": "Išsaugoti kaip kitą asmenį", + "showLessFaces": "Rodyti mažiau veidų", + "showMoreFaces": "Rodyti daugiau veidų", + "ignore": "Ignoruoti", + "merge": "Sujungti", + "reset": "Atkurti", + "areYouSureYouWantToIgnoreThisPerson": "Ar tikrai norite ignoruoti šį asmenį?", + "areYouSureYouWantToIgnoreThesePersons": "Ar tikrai norite ignoruoti šiuos asmenis?", + "thePersonGroupsWillNotBeDisplayed": "Asmenų grupės nebebus rodomos asmenų sekcijoje. Nuotraukos liks nepakitusios.", + "thePersonWillNotBeDisplayed": "Asmuo nebebus rodomas asmenų sekcijoje. Nuotraukos liks nepakitusios.", + "areYouSureYouWantToMergeThem": "Ar tikrai norite juos sujungti?", + "allUnnamedGroupsWillBeMergedIntoTheSelectedPerson": "Visos nepavadintos grupės bus sujungtos su pasirinktu asmeniu. Tai vis dar galima atšaukti iš asmens pasiūlymų istorijos apžvalgos.", + "yesIgnore": "Taip, ignoruoti", + "same": "Tas pats", + "different": "Skirtingas", + "sameperson": "Tas pats asmuo?", + "cLTitle1": "Įkeliami dideli vaizdo įrašų failai", + "cLDesc1": "Po vaizdo įrašų srauto perdavimo beta versijos ir darbo prie tęsiamų įkėlimų ir atsisiuntimų, dabar padidinome failų įkėlimo ribą iki 10 GB. Tai dabar pasiekiama tiek kompiuterinėse, tiek mobiliosiose programėlėse.", + "cLTitle2": "Fono įkėlimas", + "cLDesc2": "Fono įkėlimai dabar palaikomi ir sistemoje „iOS“ bei „Android“ įrenginiuose. Nebereikia atverti programėlės, kad būtų galima sukurti naujausių nuotraukų ir vaizdo įrašų atsarginę kopiją.", + "cLTitle3": "Automatiniai peržiūros prisiminimai", + "cLDesc3": "Mes žymiai patobulinome prisiminimų patirtį, įskaitant automatinį peržiūrėjimą, braukimą į kitą prisiminimą ir daug daugiau.", + "cLTitle4": "Patobulintas veido atpažinimas", + "cLDesc4": "Kartu su daugybe vidinių patobulinimų, dabar daug lengviau matyti visus aptiktus veidus, pateikti atsiliepimus apie panašius veidus ir pridėti / pašalinti veidus iš vienos nuotraukos.", + "cLTitle5": "Gimtadienio pranešimai", + "cLDesc5": "Dabar gausite pranešimą apie galimybę atsisakyti visų gimtadienių, kuriuos išsaugojote platformoje „Ente“, kartu su geriausių jų nuotraukų rinkiniu.", + "cLTitle6": "Tęsiami įkėlimai ir atsisiuntimai", + "cLDesc6": "Nebereikia laukti įkėlimų / atsisiuntimų užbaigti, kad užvertumėte programėlę. Dabar visus įkėlimus ir atsisiuntimus galima pristabdyti ir tęsti nuo tos vietos, kurioje sustojote.", + "indexingPausedStatusDescription": "Indeksavimas pristabdytas. Jis bus automatiškai tęsiamas, kai įrenginys bus parengtas. Įrenginys laikomas parengtu, kai jo akumuliatoriaus įkrovos lygis, akumuliatoriaus būklė ir terminė būklė yra normos ribose.", + "faceThumbnailGenerationFailed": "Nepavyksta sugeneruoti veido miniatiūrų.", + "fileAnalysisFailed": "Nepavyksta išanalizuoti failo." } \ No newline at end of file diff --git a/mobile/apps/photos/lib/l10n/intl_vi.arb b/mobile/apps/photos/lib/l10n/intl_vi.arb index 952bff39bb..ff819b9fa8 100644 --- a/mobile/apps/photos/lib/l10n/intl_vi.arb +++ b/mobile/apps/photos/lib/l10n/intl_vi.arb @@ -870,9 +870,9 @@ "youCanTrySearchingForADifferentQuery": "Bạn có thể thử tìm kiếm một truy vấn khác.", "noResultsFound": "Không tìm thấy kết quả", "addedBy": "Được thêm bởi {emailOrName}", - "loadingExifData": "Đang tải thông số Exif...", + "loadingExifData": "Đang lấy thông số Exif...", "viewAllExifData": "Xem thông số Exif", - "noExifData": "Không có thông số Exif", + "noExifData": "Không có Exif", "thisImageHasNoExifData": "Ảnh này không có thông số Exif", "exif": "Exif", "noResults": "Không có kết quả", @@ -1217,7 +1217,7 @@ "searchHint4": "Vị trí", "searchHint5": "Sắp ra mắt: Nhận diện khuôn mặt & tìm kiếm vi diệu ✨", "addYourPhotosNow": "Thêm ảnh của bạn ngay bây giờ", - "searchResultCount": "{count, plural, other{{count} kết quả được tìm thấy}}", + "searchResultCount": "{count, plural, other{{count} kết quả đã tìm thấy}}", "@searchResultCount": { "description": "Text to tell user how many results were found for their search query", "placeholders": { diff --git a/mobile/apps/photos/lib/ui/settings/gallery_settings_screen.dart b/mobile/apps/photos/lib/ui/settings/gallery_settings_screen.dart index cb2fdf0ca9..e14e50c605 100644 --- a/mobile/apps/photos/lib/ui/settings/gallery_settings_screen.dart +++ b/mobile/apps/photos/lib/ui/settings/gallery_settings_screen.dart @@ -1,19 +1,12 @@ -import "dart:async"; - import "package:flutter/material.dart"; -import "package:photos/core/event_bus.dart"; -import "package:photos/events/hide_shared_items_from_home_gallery_event.dart"; -import "package:photos/events/memories_changed_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/service_locator.dart"; -import "package:photos/services/memory_home_widget_service.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/buttons/icon_button_widget.dart"; import "package:photos/ui/components/captioned_text_widget.dart"; import "package:photos/ui/components/menu_item_widget/menu_item_widget.dart"; import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/components/title_bar_widget.dart"; -import "package:photos/ui/components/toggle_switch_widget.dart"; import "package:photos/ui/viewer/gallery/component/group/type.dart"; import "package:photos/ui/viewer/gallery/gallery_group_type_picker_page.dart"; import "package:photos/ui/viewer/gallery/photo_grid_size_picker_page.dart"; @@ -130,82 +123,6 @@ class _GallerySettingsScreenState extends State { isGestureDetectorDisabled: true, ), ), - const SizedBox( - height: 24, - ), - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).showMemories, - ), - menuItemColor: colorScheme.fillFaint, - singleBorderRadius: 8, - alignCaptionedTextToLeft: true, - trailingWidget: ToggleSwitchWidget( - value: () => memoriesCacheService.showAnyMemories, - onChanged: () async { - await memoriesCacheService.setShowAnyMemories( - !memoriesCacheService.showAnyMemories, - ); - if (!memoriesCacheService.showAnyMemories) { - unawaited( - MemoryHomeWidgetService.instance.clearWidget(), - ); - } - setState(() {}); - }, - ), - ), - const SizedBox( - height: 24, - ), - memoriesCacheService.curatedMemoriesOption - ? MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).curatedMemories, - ), - menuItemColor: colorScheme.fillFaint, - singleBorderRadius: 8, - alignCaptionedTextToLeft: true, - trailingWidget: ToggleSwitchWidget( - value: () => - localSettings.isSmartMemoriesEnabled, - onChanged: () async { - unawaited(_toggleUpdateMemories()); - }, - ), - ) - : const SizedBox(), - memoriesCacheService.curatedMemoriesOption - ? const SizedBox( - height: 24, - ) - : const SizedBox(), - MenuItemWidget( - captionedTextWidget: CaptionedTextWidget( - title: S.of(context).hideSharedItemsFromHomeGallery, - ), - menuItemColor: colorScheme.fillFaint, - singleBorderRadius: 8, - alignCaptionedTextToLeft: true, - trailingWidget: ToggleSwitchWidget( - value: () => - localSettings.hideSharedItemsFromHomeGallery, - onChanged: () async { - final prevSetting = - localSettings.hideSharedItemsFromHomeGallery; - await localSettings - .setHideSharedItemsFromHomeGallery( - !prevSetting, - ); - - Bus.instance.fire( - HideSharedItemsFromHomeGalleryEvent( - !prevSetting, - ), - ); - }, - ), - ), ], ), ); @@ -218,14 +135,3 @@ class _GallerySettingsScreenState extends State { ); } } - -Future _toggleUpdateMemories() async { - await localSettings.setSmartMemories( - !localSettings.isSmartMemoriesEnabled, - ); - await memoriesCacheService.clearMemoriesCache( - fromDisk: false, - ); - await memoriesCacheService.getMemories(); - Bus.instance.fire(MemoriesChangedEvent()); -} diff --git a/mobile/apps/photos/lib/ui/settings/general_section_widget.dart b/mobile/apps/photos/lib/ui/settings/general_section_widget.dart index a1c71dbca5..1f7c5fdefd 100644 --- a/mobile/apps/photos/lib/ui/settings/general_section_widget.dart +++ b/mobile/apps/photos/lib/ui/settings/general_section_widget.dart @@ -15,6 +15,7 @@ import 'package:photos/ui/settings/advanced_settings_screen.dart'; import 'package:photos/ui/settings/common_settings.dart'; import "package:photos/ui/settings/gallery_settings_screen.dart"; import "package:photos/ui/settings/language_picker.dart"; +import "package:photos/ui/settings/memories_settings_screen.dart"; import "package:photos/ui/settings/notification_settings_screen.dart"; import "package:photos/ui/settings/widget_settings_screen.dart"; import 'package:photos/utils/navigation_util.dart'; @@ -47,6 +48,18 @@ class GeneralSectionWidget extends StatelessWidget { }, ), sectionOptionSpacing, + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).memories, + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + onTap: () async { + _onMemoriesSettingsTapped(context); + }, + ), + sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: S.of(context).referrals, @@ -175,4 +188,11 @@ class GeneralSectionWidget extends StatelessWidget { ), ); } + + void _onMemoriesSettingsTapped(BuildContext context) { + routeToPage( + context, + const MemoriesSettingsScreen(), + ); + } } diff --git a/mobile/apps/photos/lib/ui/settings/memories_settings_screen.dart b/mobile/apps/photos/lib/ui/settings/memories_settings_screen.dart new file mode 100644 index 0000000000..2cddd5485b --- /dev/null +++ b/mobile/apps/photos/lib/ui/settings/memories_settings_screen.dart @@ -0,0 +1,154 @@ +import "dart:async"; + +import "package:flutter/material.dart"; +import "package:photos/core/event_bus.dart"; +import "package:photos/events/hide_shared_items_from_home_gallery_event.dart"; +import "package:photos/events/memories_changed_event.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/service_locator.dart"; +import "package:photos/services/memory_home_widget_service.dart"; +import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/components/buttons/icon_button_widget.dart"; +import "package:photos/ui/components/captioned_text_widget.dart"; +import "package:photos/ui/components/menu_item_widget/menu_item_widget.dart"; +import "package:photos/ui/components/title_bar_title_widget.dart"; +import "package:photos/ui/components/title_bar_widget.dart"; +import "package:photos/ui/components/toggle_switch_widget.dart"; + +class MemoriesSettingsScreen extends StatefulWidget { + const MemoriesSettingsScreen({ + super.key, + }); + + @override + State createState() => _MemoriesSettingsScreenState(); +} + +class _MemoriesSettingsScreenState extends State { + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + return Scaffold( + body: CustomScrollView( + primary: false, + slivers: [ + TitleBarWidget( + flexibleSpaceTitle: TitleBarTitleWidget( + title: S.of(context).memories, + ), + actionIcons: [ + IconButtonWidget( + icon: Icons.close_outlined, + iconButtonType: IconButtonType.secondary, + onTap: () { + Navigator.pop(context); + Navigator.pop(context); + }, + ), + ], + ), + SliverList( + delegate: SliverChildBuilderDelegate( + (delegateBuildContext, index) { + return Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).showMemories, + ), + menuItemColor: colorScheme.fillFaint, + singleBorderRadius: 8, + alignCaptionedTextToLeft: true, + trailingWidget: ToggleSwitchWidget( + value: () => memoriesCacheService.showAnyMemories, + onChanged: () async { + await memoriesCacheService.setShowAnyMemories( + !memoriesCacheService.showAnyMemories, + ); + if (!memoriesCacheService.showAnyMemories) { + unawaited( + MemoryHomeWidgetService.instance.clearWidget(), + ); + } + setState(() {}); + }, + ), + ), + const SizedBox( + height: 24, + ), + memoriesCacheService.curatedMemoriesOption + ? MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).curatedMemories, + ), + menuItemColor: colorScheme.fillFaint, + singleBorderRadius: 8, + alignCaptionedTextToLeft: true, + trailingWidget: ToggleSwitchWidget( + value: () => + localSettings.isSmartMemoriesEnabled, + onChanged: () async { + unawaited(_toggleUpdateMemories()); + }, + ), + ) + : const SizedBox(), + memoriesCacheService.curatedMemoriesOption + ? const SizedBox( + height: 24, + ) + : const SizedBox(), + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).hideSharedItemsFromHomeGallery, + ), + menuItemColor: colorScheme.fillFaint, + singleBorderRadius: 8, + alignCaptionedTextToLeft: true, + trailingWidget: ToggleSwitchWidget( + value: () => + localSettings.hideSharedItemsFromHomeGallery, + onChanged: () async { + final prevSetting = + localSettings.hideSharedItemsFromHomeGallery; + await localSettings + .setHideSharedItemsFromHomeGallery( + !prevSetting, + ); + + Bus.instance.fire( + HideSharedItemsFromHomeGalleryEvent( + !prevSetting, + ), + ); + }, + ), + ), + ], + ), + ); + }, + childCount: 1, + ), + ), + ], + ), + ); + } +} + +Future _toggleUpdateMemories() async { + await localSettings.setSmartMemories( + !localSettings.isSmartMemoriesEnabled, + ); + await memoriesCacheService.clearMemoriesCache( + fromDisk: false, + ); + await memoriesCacheService.getMemories(); + Bus.instance.fire(MemoriesChangedEvent()); +} diff --git a/web/.prettierrc.json b/web/.prettierrc.json index 61cbc54727..bac8f0c074 100644 --- a/web/.prettierrc.json +++ b/web/.prettierrc.json @@ -1,6 +1,5 @@ { "tabWidth": 4, - "proseWrap": "always", "objectWrap": "collapse", "plugins": [ "prettier-plugin-organize-imports", diff --git a/web/packages/base/locales/lt-LT/translation.json b/web/packages/base/locales/lt-LT/translation.json index 63c2068b73..b26aebb96d 100644 --- a/web/packages/base/locales/lt-LT/translation.json +++ b/web/packages/base/locales/lt-LT/translation.json @@ -162,7 +162,7 @@ "ok": "Gerai", "success": "Pavyko", "error": "Klaida", - "note": "", + "note": "Pastaba", "offline_message": "Esate neprisijungę. Rodomi prisiminimai iš podėlio.", "install": "Diegti", "install_mobile_app": "Įdiekite mūsų „Android“ arba „iOS“ programą, kad automatiškai sukurtumėte atsargines visų nuotraukų kopijas", @@ -685,5 +685,5 @@ "person_favorites": "{{name}} mėgstami", "shared_favorites": "Bendrinami mėgstami", "added_by_name": "Įtraukė {{name}}", - "unowned_files_not_processed": "" + "unowned_files_not_processed": "Kiti naudotojai pridėti failai nebuvo apdoroti" } diff --git a/web/packages/base/locales/vi-VN/translation.json b/web/packages/base/locales/vi-VN/translation.json index d4a6197a5a..f3dec27f76 100644 --- a/web/packages/base/locales/vi-VN/translation.json +++ b/web/packages/base/locales/vi-VN/translation.json @@ -283,7 +283,7 @@ "disable_maps_confirm_message": "

Ảnh của bạn sẽ thôi hiển thị trên bản đồ thế giới.

Bạn có thể bật tính năng này bất cứ lúc nào từ Cài đặt.

", "details": "Chi tiết", "view_exif": "Xem thông số Exif", - "no_exif": "No Exif data", + "no_exif": "Không có Exif", "exif": "Exif", "two_factor": "Xác thực 2 bước", "two_factor_authentication": "Xác thực 2 bước",