Merge gallery_rewrite

This commit is contained in:
ashilkn
2025-07-28 19:51:31 +05:30
37 changed files with 505 additions and 238 deletions

View File

@@ -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

View File

@@ -1,6 +1,5 @@
{
"tabWidth": 4,
"proseWrap": "always",
"objectWrap": "collapse",
"plugins": [
"prettier-plugin-organize-imports",

View File

@@ -1,4 +1,3 @@
{
"tabWidth": 4,
"proseWrap": "always"
"tabWidth": 4
}

View File

@@ -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",
},
],
},

View File

@@ -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

View File

@@ -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

View File

@@ -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_.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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 | |

View File

@@ -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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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
...
'
```

View File

@@ -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=./<path-to-secrets.txt>
./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)

View File

@@ -1,6 +1,5 @@
{
"tabWidth": 4,
"proseWrap": "always",
"plugins": [
"prettier-plugin-organize-imports",
"prettier-plugin-packagejson"

View File

@@ -1,4 +1,3 @@
{
"tabWidth": 4,
"proseWrap": "always"
"tabWidth": 4
}

View File

@@ -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إذا تم تشفير النسخة الاحتياطية، سوف تحتاج إلى إدخال كلمة المرور لفك تشفير النسخة الاحتياطية",

View File

@@ -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": "Падпішыцеся на <bold-green>ente</bold-green>, каб падтрымаць нас",
"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": "Я пагаджаюся з <u-terms>умовамі абслугоўвання</u-terms> і <u-policy>палітыкай прыватнасці</u-policy>",
"privacyPolicyTitle": "Палітыка прыватнасці",
"termsOfServicesTitle": "Умовы",
"encryption": "Шыфраванне",
@@ -187,11 +245,17 @@
"changePasswordTitle": "Змяніць пароль",
"resetPasswordTitle": "Скінуць пароль",
"encryptionKeys": "Ключы шыфравання",
"passwordWarning": "Мы не захоўваем гэты пароль і <underline>мы не зможам расшыфраваць вашы даныя</underline>, калі вы забудзеце яго",
"enterPasswordToEncrypt": "Увядзіце пароль, каб была магчымасць выкарыстаць яго для расшыфроўкі вашых даных",
"enterNewPasswordToEncrypt": "Увядзіце новы пароль, каб мы маглі выкарыстаць яго для расшыфроўкі вашых даных",
"passwordChangedSuccessfully": "Пароль паспяхова зменены",
"generatingEncryptionKeys": "Генерацыя ключоў шыфравання...",
"continueLabel": "Працягнуць",
"insecureDevice": "Небяспечная прылада",
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Немагчыма згенерыраваць ключы бяспекі на гэтай прыладзе.\n\nЗарэгіструйцеся з іншай прылады.",
"howItWorks": "Як гэта працуе",
"ackPasswordLostWarning": "Я ўсведамляю, што калі я страчу свой пароль, то я магу згубіць свае даныя, бо мае даныя абаронены <underline>скразным шыфраваннем</underline>.",
"loginTerms": "Націскаючы ўвайсці, я згаджаюся з <u-terms>умовамі абслугоўвання</u-terms> і <u-policy>палітыкай прыватнасці</u-policy>",
"logInLabel": "Увайсці",
"logout": "Выйсці",
"areYouSureYouWantToLogout": "Вы сапраўды хочаце выйсці?",
@@ -203,6 +267,7 @@
"systemTheme": "Сістэманая",
"verifyingRecoveryKey": "Праверка ключа аднаўлення...",
"recoveryKeyVerified": "Ключ аднаўлення правераны",
"recoveryKeySuccessBody": "Усё ў парадку! Вашы ключ аднаўлення з'яўляецца сапраўдным.\n\nНе забывайце захоўваць ваш ключ аднаўлення ў надзейным месцы.",
"recreatePasswordTitle": "Стварыць пароль паўторна",
"invalidKey": "Памылковы ключ",
"tryAgain": "Паспрабуйце яшчэ раз",
@@ -254,20 +319,40 @@
"checkInboxAndSpamFolder": "Праверце свае ўваходныя лісты (і спам) для завяршэння праверкі",
"tapToEnterCode": "Націсніце, каб увесці код",
"resendEmail": "Адправіць ліст яшчэ раз",
"weHaveSendEmailTo": "Ліст адпраўлены на электронную пошту <green>{email}</green>",
"@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": "Падтрымка <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Адзначце нас зоркай на Github",
"free5GB": "Бясплатна 5 ГБ на <bold-green>ente</bold-green> Photos",
"loginWithAuthAccount": "Увайдзіце з дапамогай уліковага запісу Auth",
"freeStorageOffer": "Скідка ў памеры 10% на <bold-green>ente</bold-green> Photos",
"freeStorageOfferDescription": "Выкарыстоўвайце код «AUTH», каб атрымаць скідку ў памеры 10% за першы год",
"advanced": "Пашыраныя",
"algorithm": "Алгарытм",
"type": "Тып",

View File

@@ -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",

View File

@@ -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ą",

View File

@@ -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ý <bold-green>ente</bold-green> để hỗ trợ dự án này.",
"supportDevs": "Đăng ký <bold-green>ente</bold-green> để 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 <bold-green>ente</bold-green> Photos",
"loginWithAuthAccount": "Đăng nhập bằng tài khoản Ente Auth",
"freeStorageOffer": "Giảm giá 10% cho <bold-green>ente</bold-green> Photos",
"freeStorageOfferDescription": "Dùng mã \"AUTH\" để được giảm 10% trong năm đầu tiên",
"freeStorageOffer": "Giảm 10% <bold-green>ente</bold-green> 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",

View File

@@ -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."
}

View File

@@ -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": {

View File

@@ -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<GallerySettingsScreen> {
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<GallerySettingsScreen> {
);
}
}
Future<void> _toggleUpdateMemories() async {
await localSettings.setSmartMemories(
!localSettings.isSmartMemoriesEnabled,
);
await memoriesCacheService.clearMemoriesCache(
fromDisk: false,
);
await memoriesCacheService.getMemories();
Bus.instance.fire(MemoriesChangedEvent());
}

View File

@@ -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(),
);
}
}

View File

@@ -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<MemoriesSettingsScreen> createState() => _MemoriesSettingsScreenState();
}
class _MemoriesSettingsScreenState extends State<MemoriesSettingsScreen> {
@override
Widget build(BuildContext context) {
final colorScheme = getEnteColorScheme(context);
return Scaffold(
body: CustomScrollView(
primary: false,
slivers: <Widget>[
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<void> _toggleUpdateMemories() async {
await localSettings.setSmartMemories(
!localSettings.isSmartMemoriesEnabled,
);
await memoriesCacheService.clearMemoriesCache(
fromDisk: false,
);
await memoriesCacheService.getMemories();
Bus.instance.fire(MemoriesChangedEvent());
}

View File

@@ -1,6 +1,5 @@
{
"tabWidth": 4,
"proseWrap": "always",
"objectWrap": "collapse",
"plugins": [
"prettier-plugin-organize-imports",

View File

@@ -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ų <a>„Android“</a> arba <b>„iOS“</b> 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"
}

View File

@@ -283,7 +283,7 @@
"disable_maps_confirm_message": "<p>Ảnh của bạn sẽ thôi hiển thị trên bản đồ thế giới.</p><p>Bạn có thể bật tính năng này bất cứ lúc nào từ Cài đặt.</p>",
"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",