Merge branch 'main' into advance_image_editor

This commit is contained in:
ashilkn
2025-07-29 19:54:07 +05:30
25 changed files with 180 additions and 54 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

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

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

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

@@ -53,18 +53,22 @@ Future<DecodedImage> decodeImageFromPath(
final Map<String, IfdTag> exifData = await readExifFromBytes(imageData);
final int orientation =
exifData['Image Orientation']?.values.firstAsInt() ?? 1;
final format = imagePath.split('.').last.toLowerCase();
if (orientation > 1 && includeRgbaBytes) {
_logger.severe("Image EXIF orientation $orientation is not supported");
throw Exception(
'UnhandledExifOrientation: exif orientation $orientation',
);
if (format == 'heic' || format == 'heif') {
_logger
.info("Decoding HEIC/HEIF image with EXIF orientation $orientation");
} else {
_logger.warning(
"Decoding image with EXIF orientation $orientation, for format $format",
);
}
}
late Image image;
try {
image = await decodeImageFromData(imageData);
} catch (e, s) {
final format = imagePath.split('.').last;
_logger.info(
'Cannot decode $format on ${Platform.isAndroid ? "Android" : "iOS"}, converting to jpeg',
);

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

View File

@@ -1,4 +1,5 @@
import { decryptMetadataJSON, encryptMetadataJSON } from "ente-base/crypto";
import { nullishToZero } from "ente-utils/transform";
import { z } from "zod/v4";
/**
@@ -10,7 +11,7 @@ import { z } from "zod/v4";
*/
export const RemoteMagicMetadata = z.object({
version: z.number(),
count: z.number(),
count: z.number().nullish().transform(nullishToZero),
data: z.string(),
header: z.string(),
});