diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..88cbf05c --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [pulsejet] diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 4309147a..187ab72d 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -118,6 +118,7 @@ jobs: ports: - 4444:5432/tcp env: + POSTGRES_DB: nextcloud POSTGRES_PASSWORD: rootpassword options: >- --health-cmd pg_isready diff --git a/.github/workflows/lint-php.yaml b/.github/workflows/lint-php.yaml index fbbda5d3..d5fdff46 100644 --- a/.github/workflows/lint-php.yaml +++ b/.github/workflows/lint-php.yaml @@ -5,18 +5,6 @@ on: - pull_request jobs: - xml-linters: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@master - - name: Download schema - run: wget https://apps.nextcloud.com/schema/apps/info.xsd - - name: Lint info.xml - uses: ChristophWurst/xmllint-action@v1 - with: - xml-file: ./appinfo/info.xml - xml-schema-file: ./info.xsd php-cs-fixer: name: PHP-CS-Fixer runs-on: ubuntu-latest diff --git a/CHANGELOG.md b/CHANGELOG.md index 12f3a078..9dea378d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,25 @@ This file is manually updated. Please file an issue if something is missing. +## v4.8.0, v3.8.0 + +- **Feature**: Timeline path now scans recursively for mounted volumes / shares inside it. +- **Feature**: Multiple timeline paths can be specified. + +## v4.7.0, v3.7.0 (2022-11-14) + +- **Note**: you must run `occ memories:index -f` to take advantage of new features. +- **Massively improved video performance** + - Memories now comes with a dedicated transcoding server with HLS support. + - Read the documentation [here](https://github.com/pulsejet/memories/wiki/Configuration#video-transcoding) carefully for more details. +- **Feature**: Show EXIF metadata in sidebar ([#68](https://github.com/pulsejet/memories/issues/68)) +- **Feature**: Multi-selection with drag (mobile) and shift+click ([#28](https://github.com/pulsejet/memories/issues/28)) +- **Feature**: Show duration on video tiles +- **Feature**: Allow editing all image formats (HEIC etc.) +- Fix stretched images in viewer ([#176](https://github.com/pulsejet/memories/issues/176)) +- Restore metadata after image edit ([#174](https://github.com/pulsejet/memories/issues/174)) +- Fix loss of resolution after image edit + ## v4.6.1, v3.6.1 (2022-11-07) - **Feature**: Native sharing from the viewer (images only) diff --git a/Makefile b/Makefile index 8df363fa..d3d9e4d4 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,8 @@ build-js-production: rm -f js/* && npm run build patch-external: - patch -p1 < patches/scroller.patch + patch -p1 < patches/scroller-perf.patch + patch -p1 < patches/scroller-sticky.patch watch-js: npm run watch diff --git a/README.md b/README.md index 97a6a986..fff9fdd0 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,9 @@ [![Demo](https://img.shields.io/badge/demo-online-blue)](https://memories-demo.radialapps.com/apps/memories/) [![Gitter](https://img.shields.io/gitter/room/pulsejet/memories)](https://gitter.im/pulsejet/memories) [![GitHub issues](https://img.shields.io/github/issues/pulsejet/memories)](https://github.com/pulsejet/memories/issues) +[![GitHub Sponsor](https://img.shields.io/github/sponsors/pulsejet?logo=GitHub)](https://github.com/sponsors/pulsejet) -Memories is a photo management app for Nextcloud with advanced features including: +Memories is a _batteries-included_ photo management solution for Nextcloud with advanced features including: - **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data. - **⏪ Rewind**: Jump to any time in the past instantly and relive your memories. @@ -18,7 +19,8 @@ Memories is a photo management app for Nextcloud with advanced features includin - **📱 Mobile Support**: Works on devices of any shape and size through the web app. - **✏️ Edit Metadata**: Edit dates on photos quickly and easily. - **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder. -- **⚡️ Performance**: Memories is extremely fast. +- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance. +- **⚡️ Performance**: In general, Memories is extremely fast. ## 🌐 Online Demo @@ -41,11 +43,20 @@ Memories is a photo management app for Nextcloud with advanced features includin 1. ✅ Enable the app through the app management of your Nextcloud. 1. ⚒️ (Strongly recommended) use VS Code and install Vetur and Prettier. -## How to support development +## Support the project -1. **🌟 Star this repository**: This is the easiest way to support the project and costs nothing. -1. **🪲 Report bugs**: If you find a bug, please report it on the issue tracker. -1. **📝 Contribute**: If you want to contribute, please read file / comment on an issue and ask for guidance. +1. **🌟 Star this repository**: This is the easiest way to support Memories and costs nothing. +1. **🪲 Report bugs**: Report any bugs you find on the issue tracker. +1. **📝 Contribute**: Read and file or comment on an issue and ask for guidance. +1. **🪙 Sponsorship**: You can support the project financially at [GitHub Sponsors](https://github.com/sponsors/pulsejet). + +A shout out to the current and past financial backers of Memories! See the sponsors page for a full list. + +[](https://github.com/mpodshivalin) + +## Changelog + +For the full changelog, see [CHANGELOG.md](CHANGELOG.md). ## Special Thanks diff --git a/appinfo/info.xml b/appinfo/info.xml index 798a7de5..9ae17a28 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -7,7 +7,7 @@ - 4.6.2 + 4.7.2 agpl Varun Patil Memories @@ -46,6 +47,7 @@ Memories is a photo management app for Nextcloud with advanced features includin OCA\Memories\Command\Index + OCA\Memories\Command\VideoSetup @@ -53,4 +55,12 @@ Memories is a photo management app for Nextcloud with advanced features includin memories.Page.main + + + OCA\Memories\Migration\Repair + + + OCA\Memories\Migration\Repair + + diff --git a/appinfo/routes.php b/appinfo/routes.php index 0f9fb213..b5d367ba 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -52,11 +52,14 @@ return [ ['name' => 'Faces#faces', 'url' => '/api/faces', 'verb' => 'GET'], ['name' => 'Faces#preview', 'url' => '/api/faces/preview/{id}', 'verb' => 'GET'], - ['name' => 'Image#info', 'url' => '/api/info/{id}', 'verb' => 'GET'], - ['name' => 'Image#edit', 'url' => '/api/edit/{id}', 'verb' => 'PATCH'], + ['name' => 'Image#info', 'url' => '/api/image/info/{id}', 'verb' => 'GET'], + ['name' => 'Image#setExif', 'url' => '/api/image/set-exif/{id}', 'verb' => 'PATCH'], + ['name' => 'Image#jpeg', 'url' => '/api/image/jpeg/{id}', 'verb' => 'GET'], ['name' => 'Archive#archive', 'url' => '/api/archive/{id}', 'verb' => 'PATCH'], + ['name' => 'Video#transcode', 'url' => '/api/video/transcode/{client}/{fileid}/{profile}', 'verb' => 'GET'], + // Config API ['name' => 'Other#setUserConfig', 'url' => '/api/config/{key}', 'verb' => 'PUT'], diff --git a/l10n/af.js b/l10n/af.js index a2e27319..1a1bb496 100644 --- a/l10n/af.js +++ b/l10n/af.js @@ -1,18 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Instellings", "Folders" : "Vouers", "Favorites" : "Gunstelinge", "Videos" : "Video's ", "Archive" : "Argief", "Tags" : "Etikette", "Maps" : "Kaarte", - "Settings" : "Instellings", + "Unsaved changes" : "Onbewaarde veranderinge", + "Edit" : "Wysig", + "Loading …" : "Laai …", "Cancel" : "Kanselleer", "Delete" : "Skrap", "Download" : "Laai af", "Favorite" : "Gunsteling", "View in folder" : "Vertoon in gids", + "Share" : "Deel", "Public link" : "Openbare skakel", "Back" : "Terug", "Save" : "Bewaar", @@ -22,7 +26,16 @@ OC.L10N.register( "Hour" : "Uur", "Name" : "Naam", "Update" : "Werk by", - "Loading …" : "Laai …", - "Refresh" : "Verfris" + "Refresh" : "Verfris", + "Remove" : "Verwyder", + "Reset" : "Herstel", + "Continue" : "Gaan voort", + "Original" : "Oorspronklik", + "Custom" : "Eie", + "Value" : "Waarde", + "Text" : "Teks", + "Size" : "Grootte", + "Position" : "Posisie", + "Quality" : "Kwaliteit" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/af.json b/l10n/af.json index 0c523a9d..9901a9c3 100644 --- a/l10n/af.json +++ b/l10n/af.json @@ -1,16 +1,20 @@ { "translations": { + "Settings" : "Instellings", "Folders" : "Vouers", "Favorites" : "Gunstelinge", "Videos" : "Video's ", "Archive" : "Argief", "Tags" : "Etikette", "Maps" : "Kaarte", - "Settings" : "Instellings", + "Unsaved changes" : "Onbewaarde veranderinge", + "Edit" : "Wysig", + "Loading …" : "Laai …", "Cancel" : "Kanselleer", "Delete" : "Skrap", "Download" : "Laai af", "Favorite" : "Gunsteling", "View in folder" : "Vertoon in gids", + "Share" : "Deel", "Public link" : "Openbare skakel", "Back" : "Terug", "Save" : "Bewaar", @@ -20,7 +24,16 @@ "Hour" : "Uur", "Name" : "Naam", "Update" : "Werk by", - "Loading …" : "Laai …", - "Refresh" : "Verfris" + "Refresh" : "Verfris", + "Remove" : "Verwyder", + "Reset" : "Herstel", + "Continue" : "Gaan voort", + "Original" : "Oorspronklik", + "Custom" : "Eie", + "Value" : "Waarde", + "Text" : "Teks", + "Size" : "Grootte", + "Position" : "Posisie", + "Quality" : "Kwaliteit" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/an.js b/l10n/an.js index 2b059400..4002b983 100644 --- a/l10n/an.js +++ b/l10n/an.js @@ -1,14 +1,17 @@ OC.L10N.register( "memories", { + "Settings" : "Configurazión", "Favorites" : "Favoritos", "Tags" : "Etiquetas", - "Settings" : "Configurazión", "Cancel" : "Canzelar", "Delete" : "Borrar", "Download" : "Escargar", "Favorite" : "Favorito", + "Share" : "Compartir", "Back" : "Ta zaga", - "Name" : "Nombre" + "Name" : "Nombre", + "Continue" : "Continar", + "Size" : "Grandaria" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/an.json b/l10n/an.json index 3f4c876c..05dfad44 100644 --- a/l10n/an.json +++ b/l10n/an.json @@ -1,12 +1,15 @@ { "translations": { + "Settings" : "Configurazión", "Favorites" : "Favoritos", "Tags" : "Etiquetas", - "Settings" : "Configurazión", "Cancel" : "Canzelar", "Delete" : "Borrar", "Download" : "Escargar", "Favorite" : "Favorito", + "Share" : "Compartir", "Back" : "Ta zaga", - "Name" : "Nombre" + "Name" : "Nombre", + "Continue" : "Continar", + "Size" : "Grandaria" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/ar.js b/l10n/ar.js index 53f180e0..1aaf5102 100644 --- a/l10n/ar.js +++ b/l10n/ar.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "الإعدادات", "Timeline" : "الجدول الزمني", "Folders" : "المجلدات", "Favorites" : "المفضلات", @@ -8,12 +9,14 @@ OC.L10N.register( "Archive" : "الأرشيف", "Tags" : "الوسوم", "Maps" : "الخرائط", - "Settings" : "الإعدادات", + "Edit" : "تعديل", + "Loading …" : "جاري التحميل …", "Cancel" : "إلغاء", "Delete" : "إزالة", "Download" : "تنزيل", "Favorite" : "المفضلة", "View in folder" : "اعرض في المجلد", + "Share" : "مشاركة", "Copy public link" : "نسخ الرابط العام", "Back" : "العودة", "Save" : "Save", @@ -23,7 +26,21 @@ OC.L10N.register( "Hour" : "الساعة", "Name" : "الاسم", "Update" : "تحديث", - "Loading …" : "جاري التحميل …", - "Refresh" : "إنعاش" + "Refresh" : "إنعاش", + "Remove" : "حذف", + "Reset" : "إعادة الضبط", + "Continue" : "متابعة", + "Undo" : "تراجع", + "Redo" : "إعادة", + "Original" : "أصلي", + "Custom" : "مخصّص", + "Value" : "القيمة", + "Line" : "خط", + "Text" : "نص", + "Size" : "الحجم", + "Position" : "الموقع", + "Name is required." : "حقل الاسم مطلوب", + "Quality" : "الجودة", + "Auto" : "تلقائي" }, "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/l10n/ar.json b/l10n/ar.json index bffbd4f8..c637ca8a 100644 --- a/l10n/ar.json +++ b/l10n/ar.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "الإعدادات", "Timeline" : "الجدول الزمني", "Folders" : "المجلدات", "Favorites" : "المفضلات", @@ -6,12 +7,14 @@ "Archive" : "الأرشيف", "Tags" : "الوسوم", "Maps" : "الخرائط", - "Settings" : "الإعدادات", + "Edit" : "تعديل", + "Loading …" : "جاري التحميل …", "Cancel" : "إلغاء", "Delete" : "إزالة", "Download" : "تنزيل", "Favorite" : "المفضلة", "View in folder" : "اعرض في المجلد", + "Share" : "مشاركة", "Copy public link" : "نسخ الرابط العام", "Back" : "العودة", "Save" : "Save", @@ -21,7 +24,21 @@ "Hour" : "الساعة", "Name" : "الاسم", "Update" : "تحديث", - "Loading …" : "جاري التحميل …", - "Refresh" : "إنعاش" + "Refresh" : "إنعاش", + "Remove" : "حذف", + "Reset" : "إعادة الضبط", + "Continue" : "متابعة", + "Undo" : "تراجع", + "Redo" : "إعادة", + "Original" : "أصلي", + "Custom" : "مخصّص", + "Value" : "القيمة", + "Line" : "خط", + "Text" : "نص", + "Size" : "الحجم", + "Position" : "الموقع", + "Name is required." : "حقل الاسم مطلوب", + "Quality" : "الجودة", + "Auto" : "تلقائي" },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" } \ No newline at end of file diff --git a/l10n/ast.js b/l10n/ast.js index daa7bf2d..109535fc 100644 --- a/l10n/ast.js +++ b/l10n/ast.js @@ -1,18 +1,21 @@ OC.L10N.register( "memories", { + "Settings" : "Settings", "Folders" : "Carpetes", "Favorites" : "Favorites", "Videos" : "Vídeos", "Archive" : "Archivu", "Tags" : "Etiquetes", "Maps" : "Mapes", - "Settings" : "Settings", + "Edit" : "Editar", + "Loading …" : "Cargando...", "Cancel" : "Encaboxar", "Delete" : "Desaniciar", "Download" : "Baxar", "Favorite" : "Marcar como favoritu", "View in folder" : "Ver na carpeta", + "Share" : "Share", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -21,7 +24,13 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nome", "Update" : "Anovar", - "Loading …" : "Cargando...", - "Refresh" : "Refrescar" + "Refresh" : "Refrescar", + "Remove" : "Desaniciar", + "Continue" : "Siguir", + "Undo" : "Desfacer", + "Custom" : "Personalizáu", + "Text" : "Testu", + "Size" : "Tamañu", + "Position" : "Posición" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/ast.json b/l10n/ast.json index 8747bff1..f3aa9e19 100644 --- a/l10n/ast.json +++ b/l10n/ast.json @@ -1,16 +1,19 @@ { "translations": { + "Settings" : "Settings", "Folders" : "Carpetes", "Favorites" : "Favorites", "Videos" : "Vídeos", "Archive" : "Archivu", "Tags" : "Etiquetes", "Maps" : "Mapes", - "Settings" : "Settings", + "Edit" : "Editar", + "Loading …" : "Cargando...", "Cancel" : "Encaboxar", "Delete" : "Desaniciar", "Download" : "Baxar", "Favorite" : "Marcar como favoritu", "View in folder" : "Ver na carpeta", + "Share" : "Share", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -19,7 +22,13 @@ "Hour" : "Hora", "Name" : "Nome", "Update" : "Anovar", - "Loading …" : "Cargando...", - "Refresh" : "Refrescar" + "Refresh" : "Refrescar", + "Remove" : "Desaniciar", + "Continue" : "Siguir", + "Undo" : "Desfacer", + "Custom" : "Personalizáu", + "Text" : "Testu", + "Size" : "Tamañu", + "Position" : "Posición" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/az.js b/l10n/az.js index 1bf5330a..bb1e996f 100644 --- a/l10n/az.js +++ b/l10n/az.js @@ -1,21 +1,26 @@ OC.L10N.register( "memories", { + "Settings" : "Quraşdırmalar", "Favorites" : "Sevimlilər", "Archive" : "Arxiv", "Tags" : "Işarələr", "Maps" : "Xəritələr", - "Settings" : "Quraşdırmalar", + "Edit" : "Dəyişiklik et", "Cancel" : "Dayandır", "Delete" : "Sil", "Download" : "Yüklə", "Favorite" : "İstəkli", + "Share" : "Paylaş", "Save" : "Saxla", "Month" : "Ay", "Day" : "Gün", "Time" : "Vaxt", "Name" : "Ad", "Update" : "Yenilənmə", - "Refresh" : "Yenilə" + "Refresh" : "Yenilə", + "Remove" : "Sil", + "Reset" : "Sıfırla", + "Size" : "Həcm" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/az.json b/l10n/az.json index a1163210..e1ff1f80 100644 --- a/l10n/az.json +++ b/l10n/az.json @@ -1,19 +1,24 @@ { "translations": { + "Settings" : "Quraşdırmalar", "Favorites" : "Sevimlilər", "Archive" : "Arxiv", "Tags" : "Işarələr", "Maps" : "Xəritələr", - "Settings" : "Quraşdırmalar", + "Edit" : "Dəyişiklik et", "Cancel" : "Dayandır", "Delete" : "Sil", "Download" : "Yüklə", "Favorite" : "İstəkli", + "Share" : "Paylaş", "Save" : "Saxla", "Month" : "Ay", "Day" : "Gün", "Time" : "Vaxt", "Name" : "Ad", "Update" : "Yenilənmə", - "Refresh" : "Yenilə" + "Refresh" : "Yenilə", + "Remove" : "Sil", + "Reset" : "Sıfırla", + "Size" : "Həcm" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/bg.js b/l10n/bg.js index 654cce3e..f84ab3c4 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Спомени", "Yet another photo management app" : "Вече е на разположение още едно приложение за управление на снимки", + "Settings" : "Настройки", "Timeline" : "Времева линия", "Folders" : "Папки", "Favorites" : "Любими", @@ -13,7 +14,7 @@ OC.L10N.register( "On this day" : "На този ден", "Tags" : "Етикети", "Maps" : "Карти", - "Settings" : "Настройки", + "EXIF" : "EXIF стандарт", "A better photos experience awaits you" : "Очаква ви по-добро изживяване при управлението на снимки", "Choose the root folder of your timeline to begin" : "Изберете основната папка на вашата времева линия /хронология/, за да започнете", "If you just installed Memories, run:" : "Ако току-що сте инсталирали приложението Спомени, стартирайте:", @@ -24,6 +25,12 @@ OC.L10N.register( "Choose the root of your timeline" : "Изберете основата /началото/ на вашата времева линия ", "The selected folder does not seem to be valid. Try again." : "Избраната папка изглежда не е валидна. Опитайте отново.", "Found {total} photos in {path}" : "Намерени са {total} снимки в {path}", + "Image saved successfully" : "Успешно запазено изображение", + "Error saving image" : "Грешка при запазване на изображение", + "Unsaved changes" : "Незаписани промени", + "Drop changes" : "Игнориране на промените", + "Edit" : "Редактиране", + "Loading …" : "Зареждане …", "Cancel" : "Отказ", "Delete" : "Изтриване", "Remove from album" : "Премахване от албума", @@ -47,7 +54,10 @@ OC.L10N.register( "Choose the root for the folders view" : "Изберете основа за изгледа на папките", "Your Timeline" : "Вашата времева линия", "Failed to load some photos" : "Неуспешно зареждане на някои снимки", + "Share" : "Споделяне", "Sidebar" : "Странична лента", + "Video sharing not supported yet" : "Видео споделянето все още не се поддържа", + "Cannot share this type of data" : "Този тип данни не може да се споделят", "Processing … {n}/{m}" : "Обработва се ... {n}/{m}", "{n} photos added to album" : "{n} снимки са добавени в албума", "Search for collaborators" : "Търсене на сътрудници", @@ -104,7 +114,6 @@ OC.L10N.register( "Rename person" : "Преименуване на лице", "Update" : "Обновяване", "Failed to rename {oldName} to {name}." : "Неуспешно преименуване от {oldName} на {name}.", - "Loading …" : "Зареждане …", "Merge {name} with person" : "Обединяване на {name} с лице", "Are you sure you want to merge {name} with {newName}?" : "Сигурни ли сте, че искате да обедините {name} с {newName}?", "Too many failures, aborting" : "Твърде много грешки от общ характер, прекъсване", @@ -112,7 +121,12 @@ OC.L10N.register( "Failed to move {name}." : "Неуспешно преместване на {name}.", "Move selected photos to person" : "Преместване на избрани снимки към лице", "Are you sure you want to move the selected photos from {name} to {newName}?" : "Сигурни ли сте, че искате да преместите избраните снимки от {name} в {newName}?", + "Share Folder" : "Споделяне на папка", + "You cannot share the root folder" : "Не можете да споделите основната папка", + "Use the sidebar to share this folder." : "Използвайне на страничната лента, за споделяне на тази папка.", + "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Ако създадете публично споделяне на връзка, щракнете върху Опресняване и съответна връзка към приложението Спомени ще бъде показана по-долу.", "Refresh" : "Опресняване", + "Remove" : "Премахване", "Share album" : "Споделяне на албум", "Delete album" : "Изтриване на албум", "Merge with different person" : "Обединяване с различно лице", @@ -120,13 +134,101 @@ OC.L10N.register( "Share folder" : "Споделяне на папка", "Move left" : "Преместване наляво", "Move right" : "Преместване надясно", + "Save as" : "Запиши като", + "Reset" : "Възстановяване", + "All changes will be lost." : "Всички промени ще бъдат загубени.", + "Are you sure you want to continue?" : "Сигурни ли сте, че искате да продължите?", + "Continue" : "Продължаване", + "Undo" : "Отмяна", + "Redo" : "Повторение", + "Show original image" : "Показване на оригиналното изображение", + "Zoom in" : "Увеличаване на мащаба", + "Zoom out" : "Намаляване на мащаба", + "Toggle zoom menu" : "Превключване на менюто за мащабиране", + "Adjust" : "Настройване", + "Fine-tune" : "Фина настройка", + "Filters" : "Филтри", + "Watermark" : "Воден знак", + "Draw" : " Рисуване /Чертане/", + "Resize" : "Преоразмеряване", + "Invalid image." : "Невалидно изображение.", + "Error while uploading the image." : "Грешка при качване на изображението.", + "are not images" : "не са изображения", + "is not an image" : "не е изображение", + "to be uploaded" : "да бъдат качени", + "Crop" : "Изрязване", + "Original" : "Оригинал", + "Custom" : "Персонализиран", + "Square" : "Квадрат", + "Landscape" : "Пейзаж", + "Portrait" : "Портрет", + "Ellipse" : "Елипса", + "Classic TV" : "Класическа ТВ", + "CinemaScope" : "КиноЕкран", + "Arrow" : "Стрелка", + "Blur" : "Замъгляване", + "Brightness" : "Яркост", + "Contrast" : "Контраст", + "Un-flip X" : "Отмяна на Х обръщане", + "Flip X" : "Х Обръщане", + "Un-flip Y" : "Отмяна на Y обръщане", + "Flip Y" : "Y Обръщане", + "HSV" : "HSV", + "Hue" : "Нюанс", + "Saturation" : "Насищане", + "Value" : "Стойност", + "Image" : "Изображение", + "Importing …" : "Импортиране.../внасяне/", + "+ Add image" : "+ Добавяне на изображение", + "Line" : "Линия", + "Pen" : "Химилка", + "Polygon" : "Многоъгълник", + "Sides" : "Страни", + "Rectangle" : "Правоъгълник", + "Corner Radius" : "Радиус на ъгъла", + "Width in pixels" : "Ширина в пиксели", + "Height in pixels" : "Височина в пиксели", + "Toggle ratio lock" : "Превключване на заключване на съотношението", + "Reset to original image size" : "Възстановяване на оригиналния размер на изображението", + "Rotate" : "Завъртане", + "Text" : "Текст", + "Text spacing" : "Разредка на текста", + "Text alignment" : "Подравняване на текст", + "Font family" : "Семейство шрифтове", + "Size" : "Размер", + "Letter spacing" : "Разстояние между буквите", + "Line height" : "Височина на линията", + "Warmth" : "Топлина", + "+ Add watermark" : "+ Добавяне на воден знак", + "Choose watermark type" : "Избор на тип воден знак", + "Upload watermark" : "Качване на воден знак", + "Add as text" : "Добавяне като текст", + "Padding" : "Уплътняване", + "Shadow" : "Сянка", + "Horizontal" : "Хоризонтално", + "Vertical" : "Вертикално", + "Opacity" : "Непрозрачност", + "Position" : "Позиция", + "Stroke" : "Щрих, линия", + "Save image as" : "Запазване на изображението като", + "Extension" : "Разширение", + "Name is required." : "Името е задължително/нужно/.", + "Quality" : "Качество ", + "Saved image size (width x height)" : "Размер на запазеното изображение (ширина x височина)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Обърнете внимание, че избраната област за изрязване е по-ниска от приложеното преоразмеряване, което може да доведе до влошаване на качеството", + "Actual size (100%)" : "Действителен размер (100%)", + "Fit size" : "Подходящ размер", + "Auto" : "Автоматично", + "Shared Folder" : "Споделена папка", "Failed to create {albumName}." : "Неуспешно създаване на {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Неуспешно преименуване от {currentAlbumName} на {newAlbumName}.", "General Failure" : "Грешка от общ характер", "Error: {msg}" : "Грешка: {msg}", "Failed to delete files." : "Неуспешно изтриване на файлове.", "Failed to delete {fileName}." : "Неуспешно изтриване на {fileName}.", + "Failed to download some files." : "Неуспешно изтегляне на някои файлове.", "Failed to favorite files." : "Неуспешно добавяне на файлове в любими.", + "Failed to favorite some files." : "Неуспешно добавяне на някой файлове в любими.", "Failed to favorite {fileName}." : "Неуспешно добавяне на {fileName} в любими." }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/bg.json b/l10n/bg.json index f962fda9..faf5df29 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Спомени", "Yet another photo management app" : "Вече е на разположение още едно приложение за управление на снимки", + "Settings" : "Настройки", "Timeline" : "Времева линия", "Folders" : "Папки", "Favorites" : "Любими", @@ -11,7 +12,7 @@ "On this day" : "На този ден", "Tags" : "Етикети", "Maps" : "Карти", - "Settings" : "Настройки", + "EXIF" : "EXIF стандарт", "A better photos experience awaits you" : "Очаква ви по-добро изживяване при управлението на снимки", "Choose the root folder of your timeline to begin" : "Изберете основната папка на вашата времева линия /хронология/, за да започнете", "If you just installed Memories, run:" : "Ако току-що сте инсталирали приложението Спомени, стартирайте:", @@ -22,6 +23,12 @@ "Choose the root of your timeline" : "Изберете основата /началото/ на вашата времева линия ", "The selected folder does not seem to be valid. Try again." : "Избраната папка изглежда не е валидна. Опитайте отново.", "Found {total} photos in {path}" : "Намерени са {total} снимки в {path}", + "Image saved successfully" : "Успешно запазено изображение", + "Error saving image" : "Грешка при запазване на изображение", + "Unsaved changes" : "Незаписани промени", + "Drop changes" : "Игнориране на промените", + "Edit" : "Редактиране", + "Loading …" : "Зареждане …", "Cancel" : "Отказ", "Delete" : "Изтриване", "Remove from album" : "Премахване от албума", @@ -45,7 +52,10 @@ "Choose the root for the folders view" : "Изберете основа за изгледа на папките", "Your Timeline" : "Вашата времева линия", "Failed to load some photos" : "Неуспешно зареждане на някои снимки", + "Share" : "Споделяне", "Sidebar" : "Странична лента", + "Video sharing not supported yet" : "Видео споделянето все още не се поддържа", + "Cannot share this type of data" : "Този тип данни не може да се споделят", "Processing … {n}/{m}" : "Обработва се ... {n}/{m}", "{n} photos added to album" : "{n} снимки са добавени в албума", "Search for collaborators" : "Търсене на сътрудници", @@ -102,7 +112,6 @@ "Rename person" : "Преименуване на лице", "Update" : "Обновяване", "Failed to rename {oldName} to {name}." : "Неуспешно преименуване от {oldName} на {name}.", - "Loading …" : "Зареждане …", "Merge {name} with person" : "Обединяване на {name} с лице", "Are you sure you want to merge {name} with {newName}?" : "Сигурни ли сте, че искате да обедините {name} с {newName}?", "Too many failures, aborting" : "Твърде много грешки от общ характер, прекъсване", @@ -110,7 +119,12 @@ "Failed to move {name}." : "Неуспешно преместване на {name}.", "Move selected photos to person" : "Преместване на избрани снимки към лице", "Are you sure you want to move the selected photos from {name} to {newName}?" : "Сигурни ли сте, че искате да преместите избраните снимки от {name} в {newName}?", + "Share Folder" : "Споделяне на папка", + "You cannot share the root folder" : "Не можете да споделите основната папка", + "Use the sidebar to share this folder." : "Използвайне на страничната лента, за споделяне на тази папка.", + "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Ако създадете публично споделяне на връзка, щракнете върху Опресняване и съответна връзка към приложението Спомени ще бъде показана по-долу.", "Refresh" : "Опресняване", + "Remove" : "Премахване", "Share album" : "Споделяне на албум", "Delete album" : "Изтриване на албум", "Merge with different person" : "Обединяване с различно лице", @@ -118,13 +132,101 @@ "Share folder" : "Споделяне на папка", "Move left" : "Преместване наляво", "Move right" : "Преместване надясно", + "Save as" : "Запиши като", + "Reset" : "Възстановяване", + "All changes will be lost." : "Всички промени ще бъдат загубени.", + "Are you sure you want to continue?" : "Сигурни ли сте, че искате да продължите?", + "Continue" : "Продължаване", + "Undo" : "Отмяна", + "Redo" : "Повторение", + "Show original image" : "Показване на оригиналното изображение", + "Zoom in" : "Увеличаване на мащаба", + "Zoom out" : "Намаляване на мащаба", + "Toggle zoom menu" : "Превключване на менюто за мащабиране", + "Adjust" : "Настройване", + "Fine-tune" : "Фина настройка", + "Filters" : "Филтри", + "Watermark" : "Воден знак", + "Draw" : " Рисуване /Чертане/", + "Resize" : "Преоразмеряване", + "Invalid image." : "Невалидно изображение.", + "Error while uploading the image." : "Грешка при качване на изображението.", + "are not images" : "не са изображения", + "is not an image" : "не е изображение", + "to be uploaded" : "да бъдат качени", + "Crop" : "Изрязване", + "Original" : "Оригинал", + "Custom" : "Персонализиран", + "Square" : "Квадрат", + "Landscape" : "Пейзаж", + "Portrait" : "Портрет", + "Ellipse" : "Елипса", + "Classic TV" : "Класическа ТВ", + "CinemaScope" : "КиноЕкран", + "Arrow" : "Стрелка", + "Blur" : "Замъгляване", + "Brightness" : "Яркост", + "Contrast" : "Контраст", + "Un-flip X" : "Отмяна на Х обръщане", + "Flip X" : "Х Обръщане", + "Un-flip Y" : "Отмяна на Y обръщане", + "Flip Y" : "Y Обръщане", + "HSV" : "HSV", + "Hue" : "Нюанс", + "Saturation" : "Насищане", + "Value" : "Стойност", + "Image" : "Изображение", + "Importing …" : "Импортиране.../внасяне/", + "+ Add image" : "+ Добавяне на изображение", + "Line" : "Линия", + "Pen" : "Химилка", + "Polygon" : "Многоъгълник", + "Sides" : "Страни", + "Rectangle" : "Правоъгълник", + "Corner Radius" : "Радиус на ъгъла", + "Width in pixels" : "Ширина в пиксели", + "Height in pixels" : "Височина в пиксели", + "Toggle ratio lock" : "Превключване на заключване на съотношението", + "Reset to original image size" : "Възстановяване на оригиналния размер на изображението", + "Rotate" : "Завъртане", + "Text" : "Текст", + "Text spacing" : "Разредка на текста", + "Text alignment" : "Подравняване на текст", + "Font family" : "Семейство шрифтове", + "Size" : "Размер", + "Letter spacing" : "Разстояние между буквите", + "Line height" : "Височина на линията", + "Warmth" : "Топлина", + "+ Add watermark" : "+ Добавяне на воден знак", + "Choose watermark type" : "Избор на тип воден знак", + "Upload watermark" : "Качване на воден знак", + "Add as text" : "Добавяне като текст", + "Padding" : "Уплътняване", + "Shadow" : "Сянка", + "Horizontal" : "Хоризонтално", + "Vertical" : "Вертикално", + "Opacity" : "Непрозрачност", + "Position" : "Позиция", + "Stroke" : "Щрих, линия", + "Save image as" : "Запазване на изображението като", + "Extension" : "Разширение", + "Name is required." : "Името е задължително/нужно/.", + "Quality" : "Качество ", + "Saved image size (width x height)" : "Размер на запазеното изображение (ширина x височина)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Обърнете внимание, че избраната област за изрязване е по-ниска от приложеното преоразмеряване, което може да доведе до влошаване на качеството", + "Actual size (100%)" : "Действителен размер (100%)", + "Fit size" : "Подходящ размер", + "Auto" : "Автоматично", + "Shared Folder" : "Споделена папка", "Failed to create {albumName}." : "Неуспешно създаване на {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Неуспешно преименуване от {currentAlbumName} на {newAlbumName}.", "General Failure" : "Грешка от общ характер", "Error: {msg}" : "Грешка: {msg}", "Failed to delete files." : "Неуспешно изтриване на файлове.", "Failed to delete {fileName}." : "Неуспешно изтриване на {fileName}.", + "Failed to download some files." : "Неуспешно изтегляне на някои файлове.", "Failed to favorite files." : "Неуспешно добавяне на файлове в любими.", + "Failed to favorite some files." : "Неуспешно добавяне на някой файлове в любими.", "Failed to favorite {fileName}." : "Неуспешно добавяне на {fileName} в любими." },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/bn_BD.js b/l10n/bn_BD.js index 0c7d7229..ef124955 100644 --- a/l10n/bn_BD.js +++ b/l10n/bn_BD.js @@ -1,14 +1,16 @@ OC.L10N.register( "memories", { + "Settings" : "সেটিংস", "Favorites" : "প্রিয়জন", "Tags" : "ট্যাগ", "Maps" : "মানচিত্র", - "Settings" : "সেটিংস", + "Edit" : "সম্পাদনা", "Cancel" : "বাতির", "Delete" : "মুছে", "Download" : "ডাউনলোড", "Favorite" : "প্রিয়জন", + "Share" : "ভাগাভাগি কর", "Back" : "পেছনে যাও", "Save" : "সংরক্ষণ", "Month" : "মাস", @@ -17,6 +19,10 @@ OC.L10N.register( "Hour" : "ঘন্টা", "Name" : "নাম", "Update" : "পরিবর্ধন", - "Refresh" : "নবোদ্যম" + "Refresh" : "নবোদ্যম", + "Remove" : "অপসারণ", + "Reset" : "পূণঃনির্ধানণ", + "Continue" : "চালিয়ে যাও", + "Size" : "আকার" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/bn_BD.json b/l10n/bn_BD.json index 7e1d0d8d..31348c2f 100644 --- a/l10n/bn_BD.json +++ b/l10n/bn_BD.json @@ -1,12 +1,14 @@ { "translations": { + "Settings" : "সেটিংস", "Favorites" : "প্রিয়জন", "Tags" : "ট্যাগ", "Maps" : "মানচিত্র", - "Settings" : "সেটিংস", + "Edit" : "সম্পাদনা", "Cancel" : "বাতির", "Delete" : "মুছে", "Download" : "ডাউনলোড", "Favorite" : "প্রিয়জন", + "Share" : "ভাগাভাগি কর", "Back" : "পেছনে যাও", "Save" : "সংরক্ষণ", "Month" : "মাস", @@ -15,6 +17,10 @@ "Hour" : "ঘন্টা", "Name" : "নাম", "Update" : "পরিবর্ধন", - "Refresh" : "নবোদ্যম" + "Refresh" : "নবোদ্যম", + "Remove" : "অপসারণ", + "Reset" : "পূণঃনির্ধানণ", + "Continue" : "চালিয়ে যাও", + "Size" : "আকার" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/br.js b/l10n/br.js index 5bb373af..2e65aef0 100644 --- a/l10n/br.js +++ b/l10n/br.js @@ -1,15 +1,19 @@ OC.L10N.register( "memories", { + "Settings" : "Arventennoù", "Favorites" : "Pennrolloù", "Videos" : "Videoioù", "Tags" : "Klavioù", - "Settings" : "Arventennoù", + "Unsaved changes" : "Kemmoù n'int ket bet enrollet", + "Edit" : "Cheñch", + "Loading …" : "O Kargañ ...", "Cancel" : "Arrest", "Delete" : "Lemel", "Download" : "Pellgargañ", "Favorite" : "Pennrollañ", "View in folder" : "Diskwel en teuliad", + "Share" : "Rannan", "Copy public link" : "Eilañ al liamm foran", "Public link" : "Liamm publik", "Back" : "Distro", @@ -18,7 +22,10 @@ OC.L10N.register( "Day" : "Deiz", "Name" : "Anv", "Update" : "Hizivaat", - "Loading …" : "O Kargañ ...", - "Refresh" : "Freskaat" + "Refresh" : "Freskaat", + "Remove" : "Lemel", + "Continue" : "Kendec'hel", + "Original" : "Orin", + "Size" : "Ment" }, "nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"); diff --git a/l10n/br.json b/l10n/br.json index f6d28c7c..838c7f72 100644 --- a/l10n/br.json +++ b/l10n/br.json @@ -1,13 +1,17 @@ { "translations": { + "Settings" : "Arventennoù", "Favorites" : "Pennrolloù", "Videos" : "Videoioù", "Tags" : "Klavioù", - "Settings" : "Arventennoù", + "Unsaved changes" : "Kemmoù n'int ket bet enrollet", + "Edit" : "Cheñch", + "Loading …" : "O Kargañ ...", "Cancel" : "Arrest", "Delete" : "Lemel", "Download" : "Pellgargañ", "Favorite" : "Pennrollañ", "View in folder" : "Diskwel en teuliad", + "Share" : "Rannan", "Copy public link" : "Eilañ al liamm foran", "Public link" : "Liamm publik", "Back" : "Distro", @@ -16,7 +20,10 @@ "Day" : "Deiz", "Name" : "Anv", "Update" : "Hizivaat", - "Loading …" : "O Kargañ ...", - "Refresh" : "Freskaat" + "Refresh" : "Freskaat", + "Remove" : "Lemel", + "Continue" : "Kendec'hel", + "Original" : "Orin", + "Size" : "Ment" },"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);" } \ No newline at end of file diff --git a/l10n/bs.js b/l10n/bs.js index 9ff64dd7..afbb0d06 100644 --- a/l10n/bs.js +++ b/l10n/bs.js @@ -1,16 +1,20 @@ OC.L10N.register( "memories", { - "Favorites" : "Favoriti", "Settings" : "Podešavanje", + "Favorites" : "Favoriti", + "Edit" : "Izmjeni", "Cancel" : "Otkaži", "Delete" : "Obriši", "Download" : "Preuzmi", "Favorite" : "Favorit", + "Share" : "Podjeli", "Save" : "Spremi", "Month" : "Mjesec", "Day" : "Dan", "Name" : "Ime", - "Update" : "Ažuriraj" + "Update" : "Ažuriraj", + "Continue" : "Nastavi", + "Size" : "Veličina" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/l10n/bs.json b/l10n/bs.json index 5bd557a0..28d02b6d 100644 --- a/l10n/bs.json +++ b/l10n/bs.json @@ -1,14 +1,18 @@ { "translations": { - "Favorites" : "Favoriti", "Settings" : "Podešavanje", + "Favorites" : "Favoriti", + "Edit" : "Izmjeni", "Cancel" : "Otkaži", "Delete" : "Obriši", "Download" : "Preuzmi", "Favorite" : "Favorit", + "Share" : "Podjeli", "Save" : "Spremi", "Month" : "Mjesec", "Day" : "Dan", "Name" : "Ime", - "Update" : "Ažuriraj" + "Update" : "Ažuriraj", + "Continue" : "Nastavi", + "Size" : "Veličina" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/l10n/ca.js b/l10n/ca.js index ca331ab8..4ab2afe6 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Paràmetres", "Timeline" : "Línia de temps", "Folders" : "Carpetes", "Favorites" : "Preferits", @@ -11,13 +12,18 @@ OC.L10N.register( "On this day" : "Aquest mateix dia", "Tags" : "Etiquetes", "Maps" : "Mapes", - "Settings" : "Paràmetres", + "Error saving image" : "S'ha produït un error en desar la imatge", + "Unsaved changes" : "Canvis sense desar", + "Drop changes" : "Elimina els canvis", + "Edit" : "Edita", + "Loading …" : "Carregant …", "Cancel" : "Cancel·la", "Delete" : "Suprimeix", "Download" : "Baixa", "Favorite" : "Preferit", "Unarchive" : "Desbloquejar", "View in folder" : "Visualitza-ho a la carpeta", + "Share" : "Compartir", "Copy public link" : "Copia l'enllaç públic", "Public link" : "Enllaç públic", "Back" : "Torna", @@ -30,8 +36,93 @@ OC.L10N.register( "Minute" : "Minut", "Name" : "Cognom", "Update" : "Actualitzar", - "Loading …" : "Carregant …", "Refresh" : "Actualitza", - "Share folder" : "Comparteix la carpeta" + "Remove" : "Elimina", + "Share folder" : "Comparteix la carpeta", + "Save as" : "Anomena i desa", + "Reset" : "Restableix", + "All changes will be lost." : "Tots els canvis es perdran.", + "Are you sure you want to continue?" : "Esteu segur que voleu continuar?", + "Continue" : "Continua", + "Undo" : "Desfés", + "Redo" : "Refer", + "Show original image" : "Mostra la imatge original", + "Zoom in" : "Ampliació", + "Zoom out" : "Allunya", + "Toggle zoom menu" : "Canvia el menú de zoom", + "Adjust" : "Ajusta", + "Fine-tune" : "Afinar", + "Filters" : "Filtres", + "Watermark" : "Marca d'aigua", + "Draw" : "Dibuixa", + "Resize" : "Redimensiona", + "Invalid image." : "Imatge no vàlida.", + "Error while uploading the image." : "S'ha produït un error en carregar la imatge.", + "are not images" : "no són imatges", + "is not an image" : "no és una imatge", + "to be uploaded" : "per ser carregat", + "Crop" : "Retalla", + "Original" : "Original", + "Custom" : "Personalitzat", + "Square" : "Quadrat", + "Landscape" : "Apaïsat", + "Portrait" : "Vertical", + "Ellipse" : "El·lipse", + "Classic TV" : "TV clàssica", + "CinemaScope" : "CinemaScope", + "Arrow" : "Fletxa", + "Blur" : "Difumina", + "Brightness" : "Brillantor", + "Contrast" : "Contrast", + "Un-flip X" : "Descapgira X", + "Flip X" : "Capgira X", + "Un-flip Y" : "Descapgira Y", + "Flip Y" : "Capgira Y", + "HSV" : "HSV", + "Hue" : "Tonalitat", + "Saturation" : "Saturació", + "Value" : "Valor", + "Image" : "Imatge", + "Importing …" : "S'està important …", + "+ Add image" : "+ Afegeix imatge", + "Line" : "Línia", + "Pen" : "Llapis", + "Polygon" : "Polígon", + "Sides" : "Cares", + "Rectangle" : "Rectangle", + "Corner Radius" : "Radi de la cantonada", + "Width in pixels" : "Amplada en píxels", + "Height in pixels" : "Alçada en píxels", + "Toggle ratio lock" : "Commuta la relació d'aspecte", + "Reset to original image size" : "Restableix la mida de la imatge original", + "Rotate" : "Gira", + "Text" : "Text", + "Text spacing" : "Espaiat del text", + "Text alignment" : "Alineació del text", + "Font family" : "Família tipogràfica", + "Size" : "Mida", + "Letter spacing" : "Espaiat de la lletra", + "Line height" : "Alçada de la línia", + "Warmth" : "Calidesa", + "+ Add watermark" : "+ Afegeix una marca d'aigua", + "Choose watermark type" : "Trieu el tipus de marca d'aigua", + "Upload watermark" : "Carregueu una marca d'aigua", + "Add as text" : "Afegeix com a text", + "Padding" : "Farciment", + "Shadow" : "Ombra", + "Horizontal" : "Horitzontal", + "Vertical" : "Vertical", + "Opacity" : "Opacitat", + "Position" : "Posició", + "Stroke" : "Traç", + "Save image as" : "Anomena i desa la imatge", + "Extension" : "Extensió", + "Name is required." : "Cal el nom.", + "Quality" : "Qualitat", + "Saved image size (width x height)" : "Mida de la imatge desada (amplada x alçada)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Tingueu en compte que l'àrea de retall seleccionada és inferior al canvi de mida aplicat, cosa que pot provocar una disminució de la qualitat", + "Actual size (100%)" : "Mida real (100%)", + "Fit size" : "Talla ajustada", + "Auto" : "Automàtic" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/ca.json b/l10n/ca.json index 4370277b..2e50b2b7 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Paràmetres", "Timeline" : "Línia de temps", "Folders" : "Carpetes", "Favorites" : "Preferits", @@ -9,13 +10,18 @@ "On this day" : "Aquest mateix dia", "Tags" : "Etiquetes", "Maps" : "Mapes", - "Settings" : "Paràmetres", + "Error saving image" : "S'ha produït un error en desar la imatge", + "Unsaved changes" : "Canvis sense desar", + "Drop changes" : "Elimina els canvis", + "Edit" : "Edita", + "Loading …" : "Carregant …", "Cancel" : "Cancel·la", "Delete" : "Suprimeix", "Download" : "Baixa", "Favorite" : "Preferit", "Unarchive" : "Desbloquejar", "View in folder" : "Visualitza-ho a la carpeta", + "Share" : "Compartir", "Copy public link" : "Copia l'enllaç públic", "Public link" : "Enllaç públic", "Back" : "Torna", @@ -28,8 +34,93 @@ "Minute" : "Minut", "Name" : "Cognom", "Update" : "Actualitzar", - "Loading …" : "Carregant …", "Refresh" : "Actualitza", - "Share folder" : "Comparteix la carpeta" + "Remove" : "Elimina", + "Share folder" : "Comparteix la carpeta", + "Save as" : "Anomena i desa", + "Reset" : "Restableix", + "All changes will be lost." : "Tots els canvis es perdran.", + "Are you sure you want to continue?" : "Esteu segur que voleu continuar?", + "Continue" : "Continua", + "Undo" : "Desfés", + "Redo" : "Refer", + "Show original image" : "Mostra la imatge original", + "Zoom in" : "Ampliació", + "Zoom out" : "Allunya", + "Toggle zoom menu" : "Canvia el menú de zoom", + "Adjust" : "Ajusta", + "Fine-tune" : "Afinar", + "Filters" : "Filtres", + "Watermark" : "Marca d'aigua", + "Draw" : "Dibuixa", + "Resize" : "Redimensiona", + "Invalid image." : "Imatge no vàlida.", + "Error while uploading the image." : "S'ha produït un error en carregar la imatge.", + "are not images" : "no són imatges", + "is not an image" : "no és una imatge", + "to be uploaded" : "per ser carregat", + "Crop" : "Retalla", + "Original" : "Original", + "Custom" : "Personalitzat", + "Square" : "Quadrat", + "Landscape" : "Apaïsat", + "Portrait" : "Vertical", + "Ellipse" : "El·lipse", + "Classic TV" : "TV clàssica", + "CinemaScope" : "CinemaScope", + "Arrow" : "Fletxa", + "Blur" : "Difumina", + "Brightness" : "Brillantor", + "Contrast" : "Contrast", + "Un-flip X" : "Descapgira X", + "Flip X" : "Capgira X", + "Un-flip Y" : "Descapgira Y", + "Flip Y" : "Capgira Y", + "HSV" : "HSV", + "Hue" : "Tonalitat", + "Saturation" : "Saturació", + "Value" : "Valor", + "Image" : "Imatge", + "Importing …" : "S'està important …", + "+ Add image" : "+ Afegeix imatge", + "Line" : "Línia", + "Pen" : "Llapis", + "Polygon" : "Polígon", + "Sides" : "Cares", + "Rectangle" : "Rectangle", + "Corner Radius" : "Radi de la cantonada", + "Width in pixels" : "Amplada en píxels", + "Height in pixels" : "Alçada en píxels", + "Toggle ratio lock" : "Commuta la relació d'aspecte", + "Reset to original image size" : "Restableix la mida de la imatge original", + "Rotate" : "Gira", + "Text" : "Text", + "Text spacing" : "Espaiat del text", + "Text alignment" : "Alineació del text", + "Font family" : "Família tipogràfica", + "Size" : "Mida", + "Letter spacing" : "Espaiat de la lletra", + "Line height" : "Alçada de la línia", + "Warmth" : "Calidesa", + "+ Add watermark" : "+ Afegeix una marca d'aigua", + "Choose watermark type" : "Trieu el tipus de marca d'aigua", + "Upload watermark" : "Carregueu una marca d'aigua", + "Add as text" : "Afegeix com a text", + "Padding" : "Farciment", + "Shadow" : "Ombra", + "Horizontal" : "Horitzontal", + "Vertical" : "Vertical", + "Opacity" : "Opacitat", + "Position" : "Posició", + "Stroke" : "Traç", + "Save image as" : "Anomena i desa la imatge", + "Extension" : "Extensió", + "Name is required." : "Cal el nom.", + "Quality" : "Qualitat", + "Saved image size (width x height)" : "Mida de la imatge desada (amplada x alçada)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Tingueu en compte que l'àrea de retall seleccionada és inferior al canvi de mida aplicat, cosa que pot provocar una disminució de la qualitat", + "Actual size (100%)" : "Mida real (100%)", + "Fit size" : "Talla ajustada", + "Auto" : "Automàtic" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/cs.js b/l10n/cs.js index 60842dbb..75e3c492 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -3,7 +3,8 @@ OC.L10N.register( { "Memories" : "Vzpomínky", "Yet another photo management app" : "Další z aplikací pro správu fotek", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Vzpomínky\n\n# Vzpomínky je aplikace pro správu fotek v rámci Nextcloud, nabízející pokročilé funkce jako jsou:\n\n- **📸 Časová osa**: Řadí fotky a videa podle data pořízení, získaného z Exif metadat.\n- **⏪ Převíjení**: Během okamžiku přeskočte na kdykoli v minulosti oživte své vzpomínky.\n- **🤖 Opatřování štítky pomocí strojového učení**: Seskupujte fotky podle lidí a objektů na nich (založeno na aplikaci [Rozpoznat](https://github.com/nextcloud/recognize).\n- **🖼️ Alba**: Vytvářejte alba a seskupujte tak fotky a videa. Pak je sdílejte s ostatními.\n- **🫱🏻🫲🏻 Externí sdílení**: Sdílejte fotky a videa s lidmi mimo vámi využívanou instanci Nextcloud.\n- **📱 Podpora mobilních platforem**: Funguje na zařízeních různých podob a velikostí prostřednictvím webové aplikace.\n- **✏️ Úprava metadat**: Pohotově a snadno upravujte data fotek.\n- **📦 Archiv**: Fotky, kterými nechcete znepřehledňovat časovou osu ukládejte do oddělené složky.\n- **⚡️ Výkon**: Aplikace vzpomínky je velmi rychlá.\n\n## 🌐 Ukázka na Internetu\n\n- Pro získání představy jak vzpomínky vypadají a jak se ovládají, podívejte se na [veřejnou ukázku](https://memories-demo.radialapps.com/apps/memories/).\n- Tato ukázka je pouze pro čtení a může být pomalá (je provozováno na virt. stroji v rámci bezplatné úrovně na službě [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Fotky pocházejí ze služby [Unsplash](https://unsplash.com/) (autorství jednotlivých snímků viz každá ze složek).\n\n## 🚀 Instalace\n\n1. Nainstalujte aplikaci z Nextcloud katalogu aplikací.\n1. Proveďte doporučené [kroky nastavení](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Spusťte příkaz `php ./occ memories:index` a vytvořte tak rejstříky metadat pro stávající fotky.\n1. Otevřete aplikaci 📷 Vzpomínky v Nextcloud a nastavte která složka obsahuje vaše fotky.", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Vzpomínky\n\n# Vzpomínky je okamžitě použitelné řešení pro správu fotek v rámci Nextcloud, nabízející pokročilé funkce jako jsou:\n\n- **📸 Časová osa**: Řadí fotky a videa podle data pořízení, získaného z Exif metadat.\n- **⏪ Převíjení**: Během okamžiku přeskočte na kdykoli v minulosti oživte své vzpomínky.\n- **🤖 Opatřování štítky pomocí strojového učení**: Seskupujte fotky podle lidí a objektů na nich (založeno na aplikaci [Rozpoznat](https://github.com/nextcloud/recognize).\n- **🖼️ Alba**: Vytvářejte alba a seskupujte tak fotky a videa. Pak je sdílejte s ostatními.\n- **🫱🏻🫲🏻 Externí sdílení**: Sdílejte fotky a videa s lidmi mimo vámi využívanou instanci Nextcloud.\n- **📱 Podpora mobilních platforem**: Funguje na zařízeních různých podob a velikostí prostřednictvím webové aplikace.\n- **✏️ Úprava metadat**: Pohotově a snadno upravujte data fotek.\n- **📦 Archiv**: Fotky, kterými nechcete znepřehledňovat časovou osu ukládejte do oddělené složky.\n-**📹 Překódovávání videa**: Vzpomínky překódovávají videa a pro dosažení nejlepšího výkonu používají HLS\n- **⚡️ Výkon**: Obecně, aplikace vzpomínky je velmi rychlá.\n\n## 🌐 Ukázka na Internetu\n\n- Pro získání představy jak vzpomínky vypadají a jak se ovládají, podívejte se na [veřejnou ukázku](https://memories-demo.radialapps.com/apps/memories/).\n- Tato ukázka je pouze pro čtení a může být pomalá (je provozováno na virt. stroji v rámci bezplatné úrovně na službě [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Fotky pocházejí ze služby [Unsplash](https://unsplash.com/) (autorství jednotlivých snímků viz každá ze složek).\n\n## 🚀 Instalace\n\n1. Nainstalujte aplikaci z Nextcloud katalogu aplikací.\n1. Proveďte doporučené [kroky nastavení](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Spusťte příkaz `php ./occ memories:index` a vytvořte tak rejstříky metadat pro stávající fotky.\n1. Otevřete aplikaci 📷 Vzpomínky v Nextcloud a nastavte která složka obsahuje vaše fotky.", + "Settings" : "Nastavení", "Timeline" : "Časová osa", "Folders" : "Složky", "Favorites" : "Oblíbené", @@ -14,7 +15,7 @@ OC.L10N.register( "On this day" : "V tento den", "Tags" : "Štítky", "Maps" : "Mapy", - "Settings" : "Nastavení", + "EXIF" : "EXIF", "A better photos experience awaits you" : "Lepší zážitek z fotek na vás čeká", "Choose the root folder of your timeline to begin" : "Začněte zvolením kořenové složky vaší časové osy", "If you just installed Memories, run:" : "Pokud jste Vzpomínky právě nainstalovali, spusťte:", @@ -25,6 +26,14 @@ OC.L10N.register( "Choose the root of your timeline" : "Zvolte kořen vaší časové osy", "The selected folder does not seem to be valid. Try again." : "Vybraná složka se nezdá být platná. Zkuste to znovu.", "Found {total} photos in {path}" : "V {path} nalezeno {total} fotek", + "Failed to get Exif data. Metadata may be lost!" : "Nepodařilo se získat Exif metadata – může dojít k jejich ztrátě!", + "No Exif data found! Continue?" : "Nenalezena žádná Exif data – pokračovat?", + "Image saved successfully" : "Obrázek úspěšně uložen", + "Error saving image" : "Chyb při ukládání obrázku", + "Unsaved changes" : "Neuložené změny", + "Drop changes" : "Zahodit změny", + "Edit" : "Upravit", + "Loading …" : "Načítání…", "Cancel" : "Storno", "Delete" : "Smazat", "Remove from album" : "Odebrat z alba", @@ -45,10 +54,14 @@ OC.L10N.register( "Folders Path" : "Popis umístění složek", "Show hidden folders" : "Zobrazit skryté složky", "Square grid mode" : "Režim se čtvercovou mřížkou", + "Choose Timeline Paths" : "Zvolte trasy časovou osou", "Choose the root for the folders view" : "Zvolte kořen pro zobrazení složek", "Your Timeline" : "Vaše časová osa", "Failed to load some photos" : "Některé fotky se nepodařilo načíst", + "Share" : "Sdílet", "Sidebar" : "Postranní panel", + "Video sharing not supported yet" : "Sdílení videí zatím není podporováno", + "Cannot share this type of data" : "Tento typ dat není možné sdílet", "Processing … {n}/{m}" : "Zpracovávání… {n}/{m}", "{n} photos added to album" : "{n} fotek přidáno do alba", "Search for collaborators" : "Vyhledat spolupracující", @@ -105,7 +118,6 @@ OC.L10N.register( "Rename person" : "Přejmenovat osobu", "Update" : "Aktualizovat", "Failed to rename {oldName} to {name}." : "Nepodařilo se přejmenovat {oldName} na {name}.", - "Loading …" : "Načítání…", "Merge {name} with person" : "Sloučit {name} s osobou", "Are you sure you want to merge {name} with {newName}?" : "Opravdu chcete sloučit {name} s {newName}?", "Too many failures, aborting" : "Příliš mnoho nezdarů – přerušuje se", @@ -118,6 +130,9 @@ OC.L10N.register( "Use the sidebar to share this folder." : "Pokud chcete tuto složku nasdílet, použijte k tomu postranní panel", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Pokud vytváříte odkaz pro veřejné sdílení, klikněte na opětovné načtení a níže se ukáže příslušný odkaz do Vzpomínek.", "Refresh" : "Znovu načíst", + "Remove" : "Odebrat", + "Add Path" : "Přidat trasu", + "Add a root to your timeline" : "Přidat do časové osy kořen", "Share album" : "Nasdílet album", "Delete album" : "Smazat album", "Merge with different person" : "Sloučit s jinou osobou", @@ -125,6 +140,92 @@ OC.L10N.register( "Share folder" : "Nasdílet složku", "Move left" : "Přesunout doleva", "Move right" : "Přesunout doprava", + "Save as" : "Uložit jako", + "Reset" : "Vrátit na výchozí hodnoty", + "All changes will be lost." : "Veškeré změny budou ztraceny.", + "Are you sure you want to continue?" : "Opravdu chcete pokračovat?", + "Continue" : "Pokračovat", + "Undo" : "Vrátit zpět", + "Redo" : "Zopakovat", + "Show original image" : "Zobrazit původní obrázek", + "Zoom in" : "Přiblížit", + "Zoom out" : "Oddálit", + "Toggle zoom menu" : "Zobraz/nezobraz. nabídku zvětšení", + "Adjust" : "Přizpůsobit", + "Fine-tune" : "Jemné doladění", + "Filters" : "Filtry", + "Watermark" : "Vodoznak", + "Draw" : "Nakreslit", + "Resize" : "Změnit rozlišení", + "Invalid image." : "Neplatný obrázek.", + "Error while uploading the image." : "Chyba při nahrávání obrázku.", + "are not images" : "nejsou obrázky", + "is not an image" : "není obrázek", + "to be uploaded" : "k nahrání", + "Crop" : "Oříznout", + "Original" : "Původní", + "Custom" : "Uživatelsky určený", + "Square" : "Čtverec", + "Landscape" : "Krajina", + "Portrait" : "Portrét", + "Ellipse" : "Elipsa", + "Classic TV" : "Klasická televize", + "CinemaScope" : "Extrémně širokoúhlé", + "Arrow" : "Šipka", + "Blur" : "Rozmazat", + "Brightness" : "Jas", + "Contrast" : "Kontrast", + "Un-flip X" : "Vzít zpět svisl. převrácení", + "Flip X" : "Převrátit svisle", + "Un-flip Y" : "Vzít zpět vodorov. převrácení", + "Flip Y" : "Převrátit vodorovně", + "HSV" : "HSV", + "Hue" : "Odstín", + "Saturation" : "Saturace", + "Value" : "Hodnota", + "Image" : "Obrázek", + "Importing …" : "Importování…", + "+ Add image" : "+ Přidat obrázek", + "Line" : "Čára", + "Pen" : "Pero", + "Polygon" : "Mnohoúhelník", + "Sides" : "Stran", + "Rectangle" : "Obdélník", + "Corner Radius" : "Zaoblení rohů (poloměr)", + "Width in pixels" : "Šířka v pixelex", + "Height in pixels" : "Výška v pixelech", + "Toggle ratio lock" : "Vyp/zap. zám. poměru stran", + "Reset to original image size" : "Vrátit k původní velikosti obrázku", + "Rotate" : "Otočit", + "Text" : "Text", + "Text spacing" : "Rozestupy textu", + "Text alignment" : "Zarovnání textu", + "Font family" : "Skupina písem", + "Size" : "Velikost", + "Letter spacing" : "Rozestupy znaků", + "Line height" : "Výška řádku", + "Warmth" : "Teplota", + "+ Add watermark" : "+ přidat vodotisk", + "Choose watermark type" : "Zvolte typ vodotisku", + "Upload watermark" : "Nahrát vodotisk", + "Add as text" : "Přidat jako text", + "Padding" : "Doplňování", + "Shadow" : "Stín", + "Horizontal" : "Vodorovné", + "Vertical" : "Svislé", + "Opacity" : "(Ne)průhlednost", + "Position" : "Pozice", + "Stroke" : "Čára", + "Save image as" : "Uložit obrázek jako", + "Extension" : "Přípona", + "Name is required." : "Jméno je povinné.", + "Quality" : "Kvalita", + "Saved image size (width x height)" : "Velikost uloženého obrázku (šířka x výška)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Pozn.: označená oblast ořezu je menší než použitá změna rozlišení, což může způsobit snížení kvality", + "Actual size (100%)" : "Skutečná velikost (100%)", + "Fit size" : "Přizpůsobit velikost", + "Transcoding failed." : "Překódování se nezdařilo.", + "Auto" : "Automaticky", "Shared Folder" : "Sdílená složka", "Failed to create {albumName}." : "Nepodařilo se vytvořit {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Nepodařilo přejmenovat {currentAlbumName} to {newAlbumName}.", diff --git a/l10n/cs.json b/l10n/cs.json index 5e8f9223..d82d6c1c 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -1,7 +1,8 @@ { "translations": { "Memories" : "Vzpomínky", "Yet another photo management app" : "Další z aplikací pro správu fotek", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Vzpomínky\n\n# Vzpomínky je aplikace pro správu fotek v rámci Nextcloud, nabízející pokročilé funkce jako jsou:\n\n- **📸 Časová osa**: Řadí fotky a videa podle data pořízení, získaného z Exif metadat.\n- **⏪ Převíjení**: Během okamžiku přeskočte na kdykoli v minulosti oživte své vzpomínky.\n- **🤖 Opatřování štítky pomocí strojového učení**: Seskupujte fotky podle lidí a objektů na nich (založeno na aplikaci [Rozpoznat](https://github.com/nextcloud/recognize).\n- **🖼️ Alba**: Vytvářejte alba a seskupujte tak fotky a videa. Pak je sdílejte s ostatními.\n- **🫱🏻🫲🏻 Externí sdílení**: Sdílejte fotky a videa s lidmi mimo vámi využívanou instanci Nextcloud.\n- **📱 Podpora mobilních platforem**: Funguje na zařízeních různých podob a velikostí prostřednictvím webové aplikace.\n- **✏️ Úprava metadat**: Pohotově a snadno upravujte data fotek.\n- **📦 Archiv**: Fotky, kterými nechcete znepřehledňovat časovou osu ukládejte do oddělené složky.\n- **⚡️ Výkon**: Aplikace vzpomínky je velmi rychlá.\n\n## 🌐 Ukázka na Internetu\n\n- Pro získání představy jak vzpomínky vypadají a jak se ovládají, podívejte se na [veřejnou ukázku](https://memories-demo.radialapps.com/apps/memories/).\n- Tato ukázka je pouze pro čtení a může být pomalá (je provozováno na virt. stroji v rámci bezplatné úrovně na službě [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Fotky pocházejí ze služby [Unsplash](https://unsplash.com/) (autorství jednotlivých snímků viz každá ze složek).\n\n## 🚀 Instalace\n\n1. Nainstalujte aplikaci z Nextcloud katalogu aplikací.\n1. Proveďte doporučené [kroky nastavení](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Spusťte příkaz `php ./occ memories:index` a vytvořte tak rejstříky metadat pro stávající fotky.\n1. Otevřete aplikaci 📷 Vzpomínky v Nextcloud a nastavte která složka obsahuje vaše fotky.", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Vzpomínky\n\n# Vzpomínky je okamžitě použitelné řešení pro správu fotek v rámci Nextcloud, nabízející pokročilé funkce jako jsou:\n\n- **📸 Časová osa**: Řadí fotky a videa podle data pořízení, získaného z Exif metadat.\n- **⏪ Převíjení**: Během okamžiku přeskočte na kdykoli v minulosti oživte své vzpomínky.\n- **🤖 Opatřování štítky pomocí strojového učení**: Seskupujte fotky podle lidí a objektů na nich (založeno na aplikaci [Rozpoznat](https://github.com/nextcloud/recognize).\n- **🖼️ Alba**: Vytvářejte alba a seskupujte tak fotky a videa. Pak je sdílejte s ostatními.\n- **🫱🏻🫲🏻 Externí sdílení**: Sdílejte fotky a videa s lidmi mimo vámi využívanou instanci Nextcloud.\n- **📱 Podpora mobilních platforem**: Funguje na zařízeních různých podob a velikostí prostřednictvím webové aplikace.\n- **✏️ Úprava metadat**: Pohotově a snadno upravujte data fotek.\n- **📦 Archiv**: Fotky, kterými nechcete znepřehledňovat časovou osu ukládejte do oddělené složky.\n-**📹 Překódovávání videa**: Vzpomínky překódovávají videa a pro dosažení nejlepšího výkonu používají HLS\n- **⚡️ Výkon**: Obecně, aplikace vzpomínky je velmi rychlá.\n\n## 🌐 Ukázka na Internetu\n\n- Pro získání představy jak vzpomínky vypadají a jak se ovládají, podívejte se na [veřejnou ukázku](https://memories-demo.radialapps.com/apps/memories/).\n- Tato ukázka je pouze pro čtení a může být pomalá (je provozováno na virt. stroji v rámci bezplatné úrovně na službě [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Fotky pocházejí ze služby [Unsplash](https://unsplash.com/) (autorství jednotlivých snímků viz každá ze složek).\n\n## 🚀 Instalace\n\n1. Nainstalujte aplikaci z Nextcloud katalogu aplikací.\n1. Proveďte doporučené [kroky nastavení](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Spusťte příkaz `php ./occ memories:index` a vytvořte tak rejstříky metadat pro stávající fotky.\n1. Otevřete aplikaci 📷 Vzpomínky v Nextcloud a nastavte která složka obsahuje vaše fotky.", + "Settings" : "Nastavení", "Timeline" : "Časová osa", "Folders" : "Složky", "Favorites" : "Oblíbené", @@ -12,7 +13,7 @@ "On this day" : "V tento den", "Tags" : "Štítky", "Maps" : "Mapy", - "Settings" : "Nastavení", + "EXIF" : "EXIF", "A better photos experience awaits you" : "Lepší zážitek z fotek na vás čeká", "Choose the root folder of your timeline to begin" : "Začněte zvolením kořenové složky vaší časové osy", "If you just installed Memories, run:" : "Pokud jste Vzpomínky právě nainstalovali, spusťte:", @@ -23,6 +24,14 @@ "Choose the root of your timeline" : "Zvolte kořen vaší časové osy", "The selected folder does not seem to be valid. Try again." : "Vybraná složka se nezdá být platná. Zkuste to znovu.", "Found {total} photos in {path}" : "V {path} nalezeno {total} fotek", + "Failed to get Exif data. Metadata may be lost!" : "Nepodařilo se získat Exif metadata – může dojít k jejich ztrátě!", + "No Exif data found! Continue?" : "Nenalezena žádná Exif data – pokračovat?", + "Image saved successfully" : "Obrázek úspěšně uložen", + "Error saving image" : "Chyb při ukládání obrázku", + "Unsaved changes" : "Neuložené změny", + "Drop changes" : "Zahodit změny", + "Edit" : "Upravit", + "Loading …" : "Načítání…", "Cancel" : "Storno", "Delete" : "Smazat", "Remove from album" : "Odebrat z alba", @@ -43,10 +52,14 @@ "Folders Path" : "Popis umístění složek", "Show hidden folders" : "Zobrazit skryté složky", "Square grid mode" : "Režim se čtvercovou mřížkou", + "Choose Timeline Paths" : "Zvolte trasy časovou osou", "Choose the root for the folders view" : "Zvolte kořen pro zobrazení složek", "Your Timeline" : "Vaše časová osa", "Failed to load some photos" : "Některé fotky se nepodařilo načíst", + "Share" : "Sdílet", "Sidebar" : "Postranní panel", + "Video sharing not supported yet" : "Sdílení videí zatím není podporováno", + "Cannot share this type of data" : "Tento typ dat není možné sdílet", "Processing … {n}/{m}" : "Zpracovávání… {n}/{m}", "{n} photos added to album" : "{n} fotek přidáno do alba", "Search for collaborators" : "Vyhledat spolupracující", @@ -103,7 +116,6 @@ "Rename person" : "Přejmenovat osobu", "Update" : "Aktualizovat", "Failed to rename {oldName} to {name}." : "Nepodařilo se přejmenovat {oldName} na {name}.", - "Loading …" : "Načítání…", "Merge {name} with person" : "Sloučit {name} s osobou", "Are you sure you want to merge {name} with {newName}?" : "Opravdu chcete sloučit {name} s {newName}?", "Too many failures, aborting" : "Příliš mnoho nezdarů – přerušuje se", @@ -116,6 +128,9 @@ "Use the sidebar to share this folder." : "Pokud chcete tuto složku nasdílet, použijte k tomu postranní panel", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Pokud vytváříte odkaz pro veřejné sdílení, klikněte na opětovné načtení a níže se ukáže příslušný odkaz do Vzpomínek.", "Refresh" : "Znovu načíst", + "Remove" : "Odebrat", + "Add Path" : "Přidat trasu", + "Add a root to your timeline" : "Přidat do časové osy kořen", "Share album" : "Nasdílet album", "Delete album" : "Smazat album", "Merge with different person" : "Sloučit s jinou osobou", @@ -123,6 +138,92 @@ "Share folder" : "Nasdílet složku", "Move left" : "Přesunout doleva", "Move right" : "Přesunout doprava", + "Save as" : "Uložit jako", + "Reset" : "Vrátit na výchozí hodnoty", + "All changes will be lost." : "Veškeré změny budou ztraceny.", + "Are you sure you want to continue?" : "Opravdu chcete pokračovat?", + "Continue" : "Pokračovat", + "Undo" : "Vrátit zpět", + "Redo" : "Zopakovat", + "Show original image" : "Zobrazit původní obrázek", + "Zoom in" : "Přiblížit", + "Zoom out" : "Oddálit", + "Toggle zoom menu" : "Zobraz/nezobraz. nabídku zvětšení", + "Adjust" : "Přizpůsobit", + "Fine-tune" : "Jemné doladění", + "Filters" : "Filtry", + "Watermark" : "Vodoznak", + "Draw" : "Nakreslit", + "Resize" : "Změnit rozlišení", + "Invalid image." : "Neplatný obrázek.", + "Error while uploading the image." : "Chyba při nahrávání obrázku.", + "are not images" : "nejsou obrázky", + "is not an image" : "není obrázek", + "to be uploaded" : "k nahrání", + "Crop" : "Oříznout", + "Original" : "Původní", + "Custom" : "Uživatelsky určený", + "Square" : "Čtverec", + "Landscape" : "Krajina", + "Portrait" : "Portrét", + "Ellipse" : "Elipsa", + "Classic TV" : "Klasická televize", + "CinemaScope" : "Extrémně širokoúhlé", + "Arrow" : "Šipka", + "Blur" : "Rozmazat", + "Brightness" : "Jas", + "Contrast" : "Kontrast", + "Un-flip X" : "Vzít zpět svisl. převrácení", + "Flip X" : "Převrátit svisle", + "Un-flip Y" : "Vzít zpět vodorov. převrácení", + "Flip Y" : "Převrátit vodorovně", + "HSV" : "HSV", + "Hue" : "Odstín", + "Saturation" : "Saturace", + "Value" : "Hodnota", + "Image" : "Obrázek", + "Importing …" : "Importování…", + "+ Add image" : "+ Přidat obrázek", + "Line" : "Čára", + "Pen" : "Pero", + "Polygon" : "Mnohoúhelník", + "Sides" : "Stran", + "Rectangle" : "Obdélník", + "Corner Radius" : "Zaoblení rohů (poloměr)", + "Width in pixels" : "Šířka v pixelex", + "Height in pixels" : "Výška v pixelech", + "Toggle ratio lock" : "Vyp/zap. zám. poměru stran", + "Reset to original image size" : "Vrátit k původní velikosti obrázku", + "Rotate" : "Otočit", + "Text" : "Text", + "Text spacing" : "Rozestupy textu", + "Text alignment" : "Zarovnání textu", + "Font family" : "Skupina písem", + "Size" : "Velikost", + "Letter spacing" : "Rozestupy znaků", + "Line height" : "Výška řádku", + "Warmth" : "Teplota", + "+ Add watermark" : "+ přidat vodotisk", + "Choose watermark type" : "Zvolte typ vodotisku", + "Upload watermark" : "Nahrát vodotisk", + "Add as text" : "Přidat jako text", + "Padding" : "Doplňování", + "Shadow" : "Stín", + "Horizontal" : "Vodorovné", + "Vertical" : "Svislé", + "Opacity" : "(Ne)průhlednost", + "Position" : "Pozice", + "Stroke" : "Čára", + "Save image as" : "Uložit obrázek jako", + "Extension" : "Přípona", + "Name is required." : "Jméno je povinné.", + "Quality" : "Kvalita", + "Saved image size (width x height)" : "Velikost uloženého obrázku (šířka x výška)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Pozn.: označená oblast ořezu je menší než použitá změna rozlišení, což může způsobit snížení kvality", + "Actual size (100%)" : "Skutečná velikost (100%)", + "Fit size" : "Přizpůsobit velikost", + "Transcoding failed." : "Překódování se nezdařilo.", + "Auto" : "Automaticky", "Shared Folder" : "Sdílená složka", "Failed to create {albumName}." : "Nepodařilo se vytvořit {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Nepodařilo přejmenovat {currentAlbumName} to {newAlbumName}.", diff --git a/l10n/cy_GB.js b/l10n/cy_GB.js index 15880cad..0d3738ec 100644 --- a/l10n/cy_GB.js +++ b/l10n/cy_GB.js @@ -1,15 +1,18 @@ OC.L10N.register( "memories", { + "Settings" : "Gosodiadau", "Favorites" : "Ffefrynnau", "Videos" : "Fideos", "Archive" : "Archif", "Tags" : "Tagiau", - "Settings" : "Gosodiadau", + "Edit" : "Golygu", + "Loading …" : "Yn llwytho …", "Cancel" : "Diddymu", "Delete" : "Dileu", "Download" : "Llwytho i lawr", "Favorite" : "Ffefryn", + "Share" : "Rhannu", "Copy public link" : "Copïo dolen gyhoeddus", "Back" : "Nôl", "Save" : "Cadw", @@ -19,7 +22,11 @@ OC.L10N.register( "Time" : "Amser", "Name" : "Enw", "Update" : "Diweddaru", - "Loading …" : "Yn llwytho …", - "Refresh" : "Ail-lwytho" + "Refresh" : "Ail-lwytho", + "Remove" : "Gwaredu", + "Undo" : "Dadwneud", + "Custom" : "Cyfaddas", + "Size" : "Maint", + "Auto" : "Awto" }, "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); diff --git a/l10n/cy_GB.json b/l10n/cy_GB.json index 6a8bc547..5d109733 100644 --- a/l10n/cy_GB.json +++ b/l10n/cy_GB.json @@ -1,13 +1,16 @@ { "translations": { + "Settings" : "Gosodiadau", "Favorites" : "Ffefrynnau", "Videos" : "Fideos", "Archive" : "Archif", "Tags" : "Tagiau", - "Settings" : "Gosodiadau", + "Edit" : "Golygu", + "Loading …" : "Yn llwytho …", "Cancel" : "Diddymu", "Delete" : "Dileu", "Download" : "Llwytho i lawr", "Favorite" : "Ffefryn", + "Share" : "Rhannu", "Copy public link" : "Copïo dolen gyhoeddus", "Back" : "Nôl", "Save" : "Cadw", @@ -17,7 +20,11 @@ "Time" : "Amser", "Name" : "Enw", "Update" : "Diweddaru", - "Loading …" : "Yn llwytho …", - "Refresh" : "Ail-lwytho" + "Refresh" : "Ail-lwytho", + "Remove" : "Gwaredu", + "Undo" : "Dadwneud", + "Custom" : "Cyfaddas", + "Size" : "Maint", + "Auto" : "Awto" },"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;" } \ No newline at end of file diff --git a/l10n/da.js b/l10n/da.js index 00c46a2a..d4136866 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Minder", "Yet another photo management app" : "Endnu en fotostyringsapp", + "Settings" : "Indstillinger", "Timeline" : "Tidslinje", "Folders" : "Mapper", "Favorites" : "Favoritter", @@ -13,7 +14,9 @@ OC.L10N.register( "On this day" : "På denne dag", "Tags" : "Mærker", "Maps" : "Kort", - "Settings" : "Indstillinger", + "Unsaved changes" : "Ikke gemte ændringer", + "Edit" : "Redigér", + "Loading …" : "Loading …", "Cancel" : "Annuller", "Delete" : "Slet", "Download" : "Download", @@ -25,6 +28,7 @@ OC.L10N.register( "Timeline Path" : "Tidslinjesti", "Show hidden folders" : "Vis skjulte mapper", "Failed to load some photos" : "Kunne ikke indlæse nogle billeder", + "Share" : "Del", "Copy public link" : "Kopier offentligt link", "Public link" : "Offentligt link", "New album" : "Nyt album", @@ -46,9 +50,24 @@ OC.L10N.register( "Hour" : "Time", "Name" : "Navn", "Update" : "Opdater", - "Loading …" : "Loading …", "Refresh" : "Opdater", + "Remove" : "Fjern", "Share folder" : "Del mappe", + "Reset" : "Nulstil", + "Continue" : "Fortsæt", + "Undo" : "Fortryd", + "Redo" : "Annullér fortryd", + "Original" : "Original", + "Custom" : "Valgfrit", + "Value" : "Værdi", + "Image" : "Billede", + "Line" : "Linje", + "Text" : "Tekst", + "Size" : "Størelse", + "Position" : "Position", + "Extension" : "Filtype", + "Name is required." : "Navn er påkrævet.", + "Auto" : "Auto", "Failed to delete files." : "Kunne ikke slette filer.", "Failed to delete {fileName}." : "Kunne ikke slette {fileName}.", "Failed to favorite files." : "Kunne ikke vælge favorit filer.", diff --git a/l10n/da.json b/l10n/da.json index 95b37483..5919cd1b 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Minder", "Yet another photo management app" : "Endnu en fotostyringsapp", + "Settings" : "Indstillinger", "Timeline" : "Tidslinje", "Folders" : "Mapper", "Favorites" : "Favoritter", @@ -11,7 +12,9 @@ "On this day" : "På denne dag", "Tags" : "Mærker", "Maps" : "Kort", - "Settings" : "Indstillinger", + "Unsaved changes" : "Ikke gemte ændringer", + "Edit" : "Redigér", + "Loading …" : "Loading …", "Cancel" : "Annuller", "Delete" : "Slet", "Download" : "Download", @@ -23,6 +26,7 @@ "Timeline Path" : "Tidslinjesti", "Show hidden folders" : "Vis skjulte mapper", "Failed to load some photos" : "Kunne ikke indlæse nogle billeder", + "Share" : "Del", "Copy public link" : "Kopier offentligt link", "Public link" : "Offentligt link", "New album" : "Nyt album", @@ -44,9 +48,24 @@ "Hour" : "Time", "Name" : "Navn", "Update" : "Opdater", - "Loading …" : "Loading …", "Refresh" : "Opdater", + "Remove" : "Fjern", "Share folder" : "Del mappe", + "Reset" : "Nulstil", + "Continue" : "Fortsæt", + "Undo" : "Fortryd", + "Redo" : "Annullér fortryd", + "Original" : "Original", + "Custom" : "Valgfrit", + "Value" : "Værdi", + "Image" : "Billede", + "Line" : "Linje", + "Text" : "Tekst", + "Size" : "Størelse", + "Position" : "Position", + "Extension" : "Filtype", + "Name is required." : "Navn er påkrævet.", + "Auto" : "Auto", "Failed to delete files." : "Kunne ikke slette filer.", "Failed to delete {fileName}." : "Kunne ikke slette {fileName}.", "Failed to favorite files." : "Kunne ikke vælge favorit filer.", diff --git a/l10n/de.js b/l10n/de.js index ca5fed81..a7f809f7 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -3,16 +3,19 @@ OC.L10N.register( { "Memories" : "Erinnerungen", "Yet another photo management app" : "Eine weitere App zur Verwaltung von Fotos", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Erinnerungen\n\nMemories ist eine Fotoverwaltungs-App für Nextcloud mit erweiterten Funktionen, darunter:\n\n- **📸 Zeitleiste**: Fotos und Videos nach Aufnahmedatum sortieren, geparst aus Exif-Daten.\n- **⏪ Zurückspulen**: Springe sofort zu einem beliebigen Zeitpunkt in der Vergangenheit und erlebe deine Erinnerungen erneut.\n- **🤖 KI-Tagging**: Gruppiere Fotos nach Personen und Objekten mithilfe von KI, unterstützt von der App [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Alben**: Erstelle Alben, um Fotos und Videos zu gruppieren. Dann teile diese Alben mit anderen.\n- **📁 Ordner**: Durchsuche deine eigenen und freigegebenen Ordner mit einer ähnlichen, effizienten Zeitleiste.\n- **🎦 Diashow**: Zeige ganz einfach Fotos aus deinerr Chronik und deinen Ordnern an.\n- **📱 Mobiler Support**: Funktioniert auf Geräten jeder Form und Größe über die Web-App.\n- **✏️ Metadaten bearbeiten**: Bearbeite Exif-Daten auf Fotos schnell und einfach.\n- **📦 Archiv**: Speichere Fotos, die du nicht in deiner Chronik sehen möchtest, in einem separaten Ordner.\n- **📹 Videotranskodierung**: Memories transkodiert Videos und verwendet HLS für maximale Leistung.\n- **📷 RAW-Unterstützung**: Zeige RAW-Fotos von deiner Kamera mit der App [Camera RAW Previews](https://apps.nextcloud.com/apps/camerarawpreviews) an.\n- **⚡️ Schnell**: Memories ist extrem schnell. Zeitraum.\n\nUm eine Vorstellung davon zu bekommen, wie Erinnerungen aussehen und sich anfühlen, sehe dir die [öffentliche Demo](https://memories-demo.radialapps.com/apps/memories/) an. Beachte, dass die Demo schreibgeschützt ist und möglicherweise langsam ist, da sie in einer von [Oracle Cloud] (https://www.oracle.com/cloud/free/) bereitgestellten Low-End-VM mit kostenlosem Kontingent ausgeführt wird. Fotonachweise gehen zu [Unsplash](https://unsplash.com/) (Einzelnachweise findest du in jedem Ordner).\n\n## 🚀 Installation\n\n1. Installiere die App aus dem Nextcloud App Store\n1. Führe `php ./occ memory:index` aus, um Metadaten-Indizes für vorhandene Fotos zu generieren.\n1. Öffne die App 📷 Erinnerungen in Nextcloud und lege das Verzeichnis mit deinen Fotos fest. Fotos aus diesem Verzeichnis werden in der Zeitleiste angezeigt, einschließlich aller Fotos in verschachtelten Unterverzeichnissen.\n1. Die Installation des [Vorschaugenerators](https://github.com/rullzer/previewgenerator) zum Vorgenerieren von Miniaturansichten wird dringend empfohlen.", + "Settings" : "Einstellungen", "Timeline" : "Verlauf", "Folders" : "Ordner", "Favorites" : "Favoriten", "Videos" : "Videos", "Albums" : "Alben", "People" : "Personen", + "Archive" : "Archiv", "On this day" : "An diesem Tag", "Tags" : "Schlagworte", "Maps" : "Karten", - "Settings" : "Einstellungen", + "EXIF" : "EXIF", "A better photos experience awaits you" : "Ein besseres Fotoerlebnis erwartet dich", "Choose the root folder of your timeline to begin" : "Wähle das Wurzelverzeichnis deiner Zeitleiste, um zu beginnen", "If you just installed Memories, run:" : "Wenn du Memorys gerade installiert hast, führe Folgendes aus:", @@ -22,10 +25,20 @@ OC.L10N.register( "You can always change this later in settings" : "Du kannst das auch noch später in den Einstellungen ändern.", "Choose the root of your timeline" : "Wähle den Start deiner Zeitleiste aus", "The selected folder does not seem to be valid. Try again." : "Der ausgewählte Ordner scheint ungültig zu sein. Versuche es nochmal.", + "Found {total} photos in {path}" : "{total} Fotos gefunden in {path}", + "Failed to get Exif data. Metadata may be lost!" : "Exif-Daten konnten nicht abgerufen werden. Metadaten können verloren gehen!", + "No Exif data found! Continue?" : "Keine Exif-Daten gefunden! Fortsetzen?", + "Image saved successfully" : "Bild erfolgreich gespeichert", + "Error saving image" : "Fehler beim Speichern des Bildes", + "Unsaved changes" : "Ungespeicherte Änderungen", + "Drop changes" : "Änderungen verwerfen", + "Edit" : "Bearbeiten", + "Loading …" : "Lade …", "Cancel" : "Abbrechen", "Delete" : "Löschen", + "Remove from album" : "Aus dem Album entfernen", "Download" : "Herunterladen", - "Favorite" : "Favorit", + "Favorite" : "Favorisieren", "Unarchive" : "Dearchivieren", "Edit Date/Time" : "Datum/Uhrzeit bearbeiten", "View in folder" : "In Ordner anzeigen", @@ -35,6 +48,7 @@ OC.L10N.register( "You are about to download a large number of files. Are you sure?" : "Du bist dabei, eine große Anzahl von Dateien herunterzuladen. Bist du dir sicher?", "You are about to delete a large number of files. Are you sure?" : "Du bist dabei, eine große Anzahl von Dateien zu löschen. Bist du dir sicher?", "You are about to touch a large number of files. Are you sure?" : "Du bist dabei, eine große Anzahl von Dateien zu ändern. Bist du dir sicher?", + "Could not remove photos from album" : "Fotos konnten nicht aus dem Album entfernt werden", "_{n} selected_::_{n} selected_" : ["{n} ausgewählt","{n} ausgewählt"], "Timeline Path" : "Pfad der Zeitlachse", "Folders Path" : "Ordnerpfad", @@ -43,8 +57,12 @@ OC.L10N.register( "Choose the root for the folders view" : "Wähle das Stammverzeichnis für die Ordneransicht", "Your Timeline" : "Deine Zeitleiste", "Failed to load some photos" : "Laden einiger Fotos fehlgeschlagen", + "Share" : "Teilen", "Sidebar" : "Seitenleiste", + "Video sharing not supported yet" : "Teilen von Videos wird bislang nicht unterstützt", + "Cannot share this type of data" : "Diese Art von Daten kann nicht geteilt werden", "Processing … {n}/{m}" : "Verarbeite … {n}/{m}", + "{n} photos added to album" : "{n} Fotos zum Album hinzugefügt", "Search for collaborators" : "Suche nach Mitbearbeitenden", "Search people or groups" : "Nach Benutzer oder Gruppen suchen", "Add {collaboratorLabel} to the collaborators list" : "{collaboratorLabel} zur Liste der Mitarbeitenden hinzufügen", @@ -63,6 +81,8 @@ OC.L10N.register( "New album" : "Neues Album", "Create new album" : "Neues Album erstellen", "Edit album details" : "Albumdetails bearbeiten", + "Could not load the selected album" : "Gewähltes Album konnte nicht geladen werden", + "Remove Album" : "Album entfernen", "Failed to delete {name}." : "{name} konnte nicht gelöscht werden.", "Name of the album" : "Name des Albums", "Location of the album" : "Ort des Albums", @@ -75,7 +95,10 @@ OC.L10N.register( "Create album" : "Album erstellen", "Add selection to album {albumName}" : "Auswahl zum Album {albumName} hinzufügen", "Create a new album." : "Ein neues Album erstellen", + "_Share with %n user_::_Share with %n users_" : ["Mit %n Benutzer teilen","Mit %n Benutzern telken"], + "_%n item_::_%n items_" : ["%n Element","%n Elemente"], "Save collaborators for this album." : "Mitbearbeitende für dieses Album speichern.", + "Share Album" : "Album teilen", "Year" : "Jahr", "Month" : "Monat", "Day" : "Tag", @@ -89,31 +112,126 @@ OC.L10N.register( "Exercise caution and make sure you have backups." : "Sei vorsichtig und stelle sicher, dass du Backups hast.", "Loading data … {n}/{m}" : "Lade … {n}/{m}", "Remove person" : "Person entfernen", + "Are you sure you want to remove {name}?" : "Soll {name} wirklich entfernt werden?", "Name" : "Name", "Rename person" : "Person umbenennen", "Update" : "Aktualisieren", "Failed to rename {oldName} to {name}." : "{oldName} konnte nicht in {name} umbenannt werden.", - "Loading …" : "Lade …", "Merge {name} with person" : "{name} mit Person zusammenführen", "Are you sure you want to merge {name} with {newName}?" : "Bist du sicher, dass du {name} mit {newName} zusammenführen möchtest?", "Too many failures, aborting" : "Zu viele Fehler, Abbruch", "Error while moving {basename}" : "Fehler beim Verschieben von {basename}", "Failed to move {name}." : "{name} konnte nicht verschoben werden.", "Move selected photos to person" : "Ausgewählte Fotos zu einer Person verschieben", + "Are you sure you want to move the selected photos from {name} to {newName}?" : "Möchtest du die ausgewählten Fotos wirklich von {name} nach {newName} verschieben?", + "Share Folder" : "Ordner teilen", + "You cannot share the root folder" : "Du kannst den Wurzelordner nicht teilen", + "Use the sidebar to share this folder." : "Verwende die Seitenleiste, um diesen Ordner zu teilen.", + "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Wenn du eine öffentliche Linkfreigabe erstellst, klicke auf Aktualisieren und ein entsprechender Link zu Memories wird unten angezeigt.", "Refresh" : "Aktualisieren", + "Share album" : "Album teilen", "Delete album" : "Album löschen", "Merge with different person" : "Mit einer anderen Person zusammenführen", "Mark person in preview" : "Person in Vorschau markieren", "Share folder" : "Ordner teilen", "Move left" : "Nach links verschieben", "Move right" : "Nach rechts verschieben", + "Save as" : "Speichern als", + "Reset" : "Zurücksetzen", + "All changes will be lost." : "Alle Änderungen gehen verloren.", + "Are you sure you want to continue?" : "Bist du dir sicher, dass du fortsetzen möchtest?", + "Continue" : "Fortsetzen", + "Undo" : "Rückgängig", + "Redo" : "Wiederherstellen", + "Show original image" : "Originalbild anzeigen", + "Zoom in" : "Hinein zoomen", + "Zoom out" : "Hinauszoomen", + "Toggle zoom menu" : "Zoom-Menü umschalten", + "Adjust" : "Anpassen", + "Fine-tune" : "Feinabstimmung", + "Filters" : "Filter", + "Watermark" : "Wasserzeichen", + "Draw" : "Zeichnen", + "Resize" : "Größe ändern", + "Invalid image." : "Ungültiges Bild", + "Error while uploading the image." : "Fehler beim Hochladen des Bildes.", + "are not images" : "Sind keine Bilder", + "is not an image" : "Ist kein Bild", + "to be uploaded" : "zum Hochladen", + "Crop" : "Zuschneiden", + "Original" : "Original", + "Custom" : "Benutzerdefiniert", + "Square" : "Quadrat", + "Landscape" : "Landschaft", + "Portrait" : "Porträt", + "Ellipse" : "Ellipse", + "Classic TV" : "Klassisches Fernsehen", + "CinemaScope" : "CinemaScope", + "Arrow" : "Pfeil", + "Blur" : "Verwischen", + "Brightness" : "Helligkeit", + "Contrast" : "Kontrast", + "Un-flip X" : "Spiegeln X rückgängig", + "Flip X" : "Spiegeln X", + "Un-flip Y" : "Spiegeln Y rückgängig", + "Flip Y" : "Spiegeln Y", + "HSV" : "HSV", + "Hue" : "Farbton", + "Saturation" : "Sättigung", + "Value" : "Wert", + "Image" : "Bild", + "Importing …" : "Importiere …", + "+ Add image" : "+ Bild hinzufügen", + "Line" : "Linie", + "Pen" : "Stift", + "Polygon" : "Polygon", + "Sides" : "Seiten", + "Rectangle" : "Rechteck", + "Corner Radius" : "Eckenradius", + "Width in pixels" : "Breite in Pixel", + "Height in pixels" : "Höhe in Pixel", + "Toggle ratio lock" : "Verhältnis-Sperre umschalten", + "Reset to original image size" : "Auf ursprüngliche Bildgröße zurücksetzen", + "Rotate" : "Rotieren", + "Text" : "Text", + "Text spacing" : "Textabstand", + "Text alignment" : "Textausrichtung", + "Font family" : "Schriftenfamilie", + "Size" : "Größe", + "Letter spacing" : "Buchstaben-Abstand", + "Line height" : "Zeilenhöhe", + "Warmth" : "Wärme", + "+ Add watermark" : "+ Wasserzeichen hinzufügen", + "Choose watermark type" : "Typ des Wasserzeichens auswählen", + "Upload watermark" : "Wasserzeichenhochladen", + "Add as text" : "AlsTexthinzufügen", + "Padding" : "Auffüllen", + "Shadow" : "Schatten", + "Horizontal" : "Horizontal", + "Vertical" : "Vertikal", + "Opacity" : "Deckkraft", + "Position" : "Position", + "Stroke" : "Strich", + "Save image as" : "Bild speichern unter", + "Extension" : "Erweiterung", + "Name is required." : "Name ist erforderlich.", + "Quality" : "Qualität", + "Saved image size (width x height)" : "Gespeicherte Bildgröße (Breite x Höhe)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Beachte, dass der ausgewählte Zuschneidebereich kleiner ist als die angewendete Größenänderung, was zu Qualitätseinbußen führen kann.", + "Actual size (100%)" : "Tatsächliche Größe (100%)", + "Fit size" : "Größe anpassen", + "Transcoding failed." : "Transkodierung fehlgeschlagen", + "Auto" : "Automatisch", + "Shared Folder" : "Geteilter Ordner", "Failed to create {albumName}." : "{albumName} konnte nicht erstellt werden.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} konnte nicht in {newAlbumName} umbenannt werden.", "General Failure" : "Allgemeiner Fehler", "Error: {msg}" : "Fehler: {msg}", "Failed to delete files." : "Löschen der Dateien fehlgeschlagen", "Failed to delete {fileName}." : "{fileName} konnte nicht gelöscht werden.", + "Failed to download some files." : "Einige Dateien konnten nicht heruntergeladen werden.", "Failed to favorite files." : "Favorisieren von Dateien fehlgeschlagen", + "Failed to favorite some files." : "Einige Dateien konnten nicht zu den Favoriten hinzugefügt werden.", "Failed to favorite {fileName}." : "{fileName} konnte nicht zu den Favoriten hinzugefügt werden." }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/de.json b/l10n/de.json index 1bb72c54..9a2a67bf 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -1,16 +1,19 @@ { "translations": { "Memories" : "Erinnerungen", "Yet another photo management app" : "Eine weitere App zur Verwaltung von Fotos", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Erinnerungen\n\nMemories ist eine Fotoverwaltungs-App für Nextcloud mit erweiterten Funktionen, darunter:\n\n- **📸 Zeitleiste**: Fotos und Videos nach Aufnahmedatum sortieren, geparst aus Exif-Daten.\n- **⏪ Zurückspulen**: Springe sofort zu einem beliebigen Zeitpunkt in der Vergangenheit und erlebe deine Erinnerungen erneut.\n- **🤖 KI-Tagging**: Gruppiere Fotos nach Personen und Objekten mithilfe von KI, unterstützt von der App [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Alben**: Erstelle Alben, um Fotos und Videos zu gruppieren. Dann teile diese Alben mit anderen.\n- **📁 Ordner**: Durchsuche deine eigenen und freigegebenen Ordner mit einer ähnlichen, effizienten Zeitleiste.\n- **🎦 Diashow**: Zeige ganz einfach Fotos aus deinerr Chronik und deinen Ordnern an.\n- **📱 Mobiler Support**: Funktioniert auf Geräten jeder Form und Größe über die Web-App.\n- **✏️ Metadaten bearbeiten**: Bearbeite Exif-Daten auf Fotos schnell und einfach.\n- **📦 Archiv**: Speichere Fotos, die du nicht in deiner Chronik sehen möchtest, in einem separaten Ordner.\n- **📹 Videotranskodierung**: Memories transkodiert Videos und verwendet HLS für maximale Leistung.\n- **📷 RAW-Unterstützung**: Zeige RAW-Fotos von deiner Kamera mit der App [Camera RAW Previews](https://apps.nextcloud.com/apps/camerarawpreviews) an.\n- **⚡️ Schnell**: Memories ist extrem schnell. Zeitraum.\n\nUm eine Vorstellung davon zu bekommen, wie Erinnerungen aussehen und sich anfühlen, sehe dir die [öffentliche Demo](https://memories-demo.radialapps.com/apps/memories/) an. Beachte, dass die Demo schreibgeschützt ist und möglicherweise langsam ist, da sie in einer von [Oracle Cloud] (https://www.oracle.com/cloud/free/) bereitgestellten Low-End-VM mit kostenlosem Kontingent ausgeführt wird. Fotonachweise gehen zu [Unsplash](https://unsplash.com/) (Einzelnachweise findest du in jedem Ordner).\n\n## 🚀 Installation\n\n1. Installiere die App aus dem Nextcloud App Store\n1. Führe `php ./occ memory:index` aus, um Metadaten-Indizes für vorhandene Fotos zu generieren.\n1. Öffne die App 📷 Erinnerungen in Nextcloud und lege das Verzeichnis mit deinen Fotos fest. Fotos aus diesem Verzeichnis werden in der Zeitleiste angezeigt, einschließlich aller Fotos in verschachtelten Unterverzeichnissen.\n1. Die Installation des [Vorschaugenerators](https://github.com/rullzer/previewgenerator) zum Vorgenerieren von Miniaturansichten wird dringend empfohlen.", + "Settings" : "Einstellungen", "Timeline" : "Verlauf", "Folders" : "Ordner", "Favorites" : "Favoriten", "Videos" : "Videos", "Albums" : "Alben", "People" : "Personen", + "Archive" : "Archiv", "On this day" : "An diesem Tag", "Tags" : "Schlagworte", "Maps" : "Karten", - "Settings" : "Einstellungen", + "EXIF" : "EXIF", "A better photos experience awaits you" : "Ein besseres Fotoerlebnis erwartet dich", "Choose the root folder of your timeline to begin" : "Wähle das Wurzelverzeichnis deiner Zeitleiste, um zu beginnen", "If you just installed Memories, run:" : "Wenn du Memorys gerade installiert hast, führe Folgendes aus:", @@ -20,10 +23,20 @@ "You can always change this later in settings" : "Du kannst das auch noch später in den Einstellungen ändern.", "Choose the root of your timeline" : "Wähle den Start deiner Zeitleiste aus", "The selected folder does not seem to be valid. Try again." : "Der ausgewählte Ordner scheint ungültig zu sein. Versuche es nochmal.", + "Found {total} photos in {path}" : "{total} Fotos gefunden in {path}", + "Failed to get Exif data. Metadata may be lost!" : "Exif-Daten konnten nicht abgerufen werden. Metadaten können verloren gehen!", + "No Exif data found! Continue?" : "Keine Exif-Daten gefunden! Fortsetzen?", + "Image saved successfully" : "Bild erfolgreich gespeichert", + "Error saving image" : "Fehler beim Speichern des Bildes", + "Unsaved changes" : "Ungespeicherte Änderungen", + "Drop changes" : "Änderungen verwerfen", + "Edit" : "Bearbeiten", + "Loading …" : "Lade …", "Cancel" : "Abbrechen", "Delete" : "Löschen", + "Remove from album" : "Aus dem Album entfernen", "Download" : "Herunterladen", - "Favorite" : "Favorit", + "Favorite" : "Favorisieren", "Unarchive" : "Dearchivieren", "Edit Date/Time" : "Datum/Uhrzeit bearbeiten", "View in folder" : "In Ordner anzeigen", @@ -33,6 +46,7 @@ "You are about to download a large number of files. Are you sure?" : "Du bist dabei, eine große Anzahl von Dateien herunterzuladen. Bist du dir sicher?", "You are about to delete a large number of files. Are you sure?" : "Du bist dabei, eine große Anzahl von Dateien zu löschen. Bist du dir sicher?", "You are about to touch a large number of files. Are you sure?" : "Du bist dabei, eine große Anzahl von Dateien zu ändern. Bist du dir sicher?", + "Could not remove photos from album" : "Fotos konnten nicht aus dem Album entfernt werden", "_{n} selected_::_{n} selected_" : ["{n} ausgewählt","{n} ausgewählt"], "Timeline Path" : "Pfad der Zeitlachse", "Folders Path" : "Ordnerpfad", @@ -41,8 +55,12 @@ "Choose the root for the folders view" : "Wähle das Stammverzeichnis für die Ordneransicht", "Your Timeline" : "Deine Zeitleiste", "Failed to load some photos" : "Laden einiger Fotos fehlgeschlagen", + "Share" : "Teilen", "Sidebar" : "Seitenleiste", + "Video sharing not supported yet" : "Teilen von Videos wird bislang nicht unterstützt", + "Cannot share this type of data" : "Diese Art von Daten kann nicht geteilt werden", "Processing … {n}/{m}" : "Verarbeite … {n}/{m}", + "{n} photos added to album" : "{n} Fotos zum Album hinzugefügt", "Search for collaborators" : "Suche nach Mitbearbeitenden", "Search people or groups" : "Nach Benutzer oder Gruppen suchen", "Add {collaboratorLabel} to the collaborators list" : "{collaboratorLabel} zur Liste der Mitarbeitenden hinzufügen", @@ -61,6 +79,8 @@ "New album" : "Neues Album", "Create new album" : "Neues Album erstellen", "Edit album details" : "Albumdetails bearbeiten", + "Could not load the selected album" : "Gewähltes Album konnte nicht geladen werden", + "Remove Album" : "Album entfernen", "Failed to delete {name}." : "{name} konnte nicht gelöscht werden.", "Name of the album" : "Name des Albums", "Location of the album" : "Ort des Albums", @@ -73,7 +93,10 @@ "Create album" : "Album erstellen", "Add selection to album {albumName}" : "Auswahl zum Album {albumName} hinzufügen", "Create a new album." : "Ein neues Album erstellen", + "_Share with %n user_::_Share with %n users_" : ["Mit %n Benutzer teilen","Mit %n Benutzern telken"], + "_%n item_::_%n items_" : ["%n Element","%n Elemente"], "Save collaborators for this album." : "Mitbearbeitende für dieses Album speichern.", + "Share Album" : "Album teilen", "Year" : "Jahr", "Month" : "Monat", "Day" : "Tag", @@ -87,31 +110,126 @@ "Exercise caution and make sure you have backups." : "Sei vorsichtig und stelle sicher, dass du Backups hast.", "Loading data … {n}/{m}" : "Lade … {n}/{m}", "Remove person" : "Person entfernen", + "Are you sure you want to remove {name}?" : "Soll {name} wirklich entfernt werden?", "Name" : "Name", "Rename person" : "Person umbenennen", "Update" : "Aktualisieren", "Failed to rename {oldName} to {name}." : "{oldName} konnte nicht in {name} umbenannt werden.", - "Loading …" : "Lade …", "Merge {name} with person" : "{name} mit Person zusammenführen", "Are you sure you want to merge {name} with {newName}?" : "Bist du sicher, dass du {name} mit {newName} zusammenführen möchtest?", "Too many failures, aborting" : "Zu viele Fehler, Abbruch", "Error while moving {basename}" : "Fehler beim Verschieben von {basename}", "Failed to move {name}." : "{name} konnte nicht verschoben werden.", "Move selected photos to person" : "Ausgewählte Fotos zu einer Person verschieben", + "Are you sure you want to move the selected photos from {name} to {newName}?" : "Möchtest du die ausgewählten Fotos wirklich von {name} nach {newName} verschieben?", + "Share Folder" : "Ordner teilen", + "You cannot share the root folder" : "Du kannst den Wurzelordner nicht teilen", + "Use the sidebar to share this folder." : "Verwende die Seitenleiste, um diesen Ordner zu teilen.", + "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Wenn du eine öffentliche Linkfreigabe erstellst, klicke auf Aktualisieren und ein entsprechender Link zu Memories wird unten angezeigt.", "Refresh" : "Aktualisieren", + "Share album" : "Album teilen", "Delete album" : "Album löschen", "Merge with different person" : "Mit einer anderen Person zusammenführen", "Mark person in preview" : "Person in Vorschau markieren", "Share folder" : "Ordner teilen", "Move left" : "Nach links verschieben", "Move right" : "Nach rechts verschieben", + "Save as" : "Speichern als", + "Reset" : "Zurücksetzen", + "All changes will be lost." : "Alle Änderungen gehen verloren.", + "Are you sure you want to continue?" : "Bist du dir sicher, dass du fortsetzen möchtest?", + "Continue" : "Fortsetzen", + "Undo" : "Rückgängig", + "Redo" : "Wiederherstellen", + "Show original image" : "Originalbild anzeigen", + "Zoom in" : "Hinein zoomen", + "Zoom out" : "Hinauszoomen", + "Toggle zoom menu" : "Zoom-Menü umschalten", + "Adjust" : "Anpassen", + "Fine-tune" : "Feinabstimmung", + "Filters" : "Filter", + "Watermark" : "Wasserzeichen", + "Draw" : "Zeichnen", + "Resize" : "Größe ändern", + "Invalid image." : "Ungültiges Bild", + "Error while uploading the image." : "Fehler beim Hochladen des Bildes.", + "are not images" : "Sind keine Bilder", + "is not an image" : "Ist kein Bild", + "to be uploaded" : "zum Hochladen", + "Crop" : "Zuschneiden", + "Original" : "Original", + "Custom" : "Benutzerdefiniert", + "Square" : "Quadrat", + "Landscape" : "Landschaft", + "Portrait" : "Porträt", + "Ellipse" : "Ellipse", + "Classic TV" : "Klassisches Fernsehen", + "CinemaScope" : "CinemaScope", + "Arrow" : "Pfeil", + "Blur" : "Verwischen", + "Brightness" : "Helligkeit", + "Contrast" : "Kontrast", + "Un-flip X" : "Spiegeln X rückgängig", + "Flip X" : "Spiegeln X", + "Un-flip Y" : "Spiegeln Y rückgängig", + "Flip Y" : "Spiegeln Y", + "HSV" : "HSV", + "Hue" : "Farbton", + "Saturation" : "Sättigung", + "Value" : "Wert", + "Image" : "Bild", + "Importing …" : "Importiere …", + "+ Add image" : "+ Bild hinzufügen", + "Line" : "Linie", + "Pen" : "Stift", + "Polygon" : "Polygon", + "Sides" : "Seiten", + "Rectangle" : "Rechteck", + "Corner Radius" : "Eckenradius", + "Width in pixels" : "Breite in Pixel", + "Height in pixels" : "Höhe in Pixel", + "Toggle ratio lock" : "Verhältnis-Sperre umschalten", + "Reset to original image size" : "Auf ursprüngliche Bildgröße zurücksetzen", + "Rotate" : "Rotieren", + "Text" : "Text", + "Text spacing" : "Textabstand", + "Text alignment" : "Textausrichtung", + "Font family" : "Schriftenfamilie", + "Size" : "Größe", + "Letter spacing" : "Buchstaben-Abstand", + "Line height" : "Zeilenhöhe", + "Warmth" : "Wärme", + "+ Add watermark" : "+ Wasserzeichen hinzufügen", + "Choose watermark type" : "Typ des Wasserzeichens auswählen", + "Upload watermark" : "Wasserzeichenhochladen", + "Add as text" : "AlsTexthinzufügen", + "Padding" : "Auffüllen", + "Shadow" : "Schatten", + "Horizontal" : "Horizontal", + "Vertical" : "Vertikal", + "Opacity" : "Deckkraft", + "Position" : "Position", + "Stroke" : "Strich", + "Save image as" : "Bild speichern unter", + "Extension" : "Erweiterung", + "Name is required." : "Name ist erforderlich.", + "Quality" : "Qualität", + "Saved image size (width x height)" : "Gespeicherte Bildgröße (Breite x Höhe)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Beachte, dass der ausgewählte Zuschneidebereich kleiner ist als die angewendete Größenänderung, was zu Qualitätseinbußen führen kann.", + "Actual size (100%)" : "Tatsächliche Größe (100%)", + "Fit size" : "Größe anpassen", + "Transcoding failed." : "Transkodierung fehlgeschlagen", + "Auto" : "Automatisch", + "Shared Folder" : "Geteilter Ordner", "Failed to create {albumName}." : "{albumName} konnte nicht erstellt werden.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} konnte nicht in {newAlbumName} umbenannt werden.", "General Failure" : "Allgemeiner Fehler", "Error: {msg}" : "Fehler: {msg}", "Failed to delete files." : "Löschen der Dateien fehlgeschlagen", "Failed to delete {fileName}." : "{fileName} konnte nicht gelöscht werden.", + "Failed to download some files." : "Einige Dateien konnten nicht heruntergeladen werden.", "Failed to favorite files." : "Favorisieren von Dateien fehlgeschlagen", + "Failed to favorite some files." : "Einige Dateien konnten nicht zu den Favoriten hinzugefügt werden.", "Failed to favorite {fileName}." : "{fileName} konnte nicht zu den Favoriten hinzugefügt werden." },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/de_DE.js b/l10n/de_DE.js index 4da2531c..ada31b8c 100644 --- a/l10n/de_DE.js +++ b/l10n/de_DE.js @@ -3,7 +3,8 @@ OC.L10N.register( { "Memories" : "Erinnerungen", "Yet another photo management app" : "Eine weitere Foto-Management-App", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Erinnerungen\n\nErinnerungen (Memories) ist eine Fotoverwaltungs-App für Nextcloud mit erweiterten Funktionen, darunter:\n\n- **📸 Zeitleiste**: Fotos und Videos nach Aufnahmedatum sortieren, ausgelesen aus Exif-Daten.\n- **⏪ Zurückspulen**: Springen Sie sofort zu einem beliebigen Zeitpunkt in der Vergangenheit und erleben Sie Ihre Erinnerungen erneut.\n- **🤖 KI-Markierung**: Gruppieren Sie Fotos nach Personen und Objekten mithilfe von KI, unterstützt von [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Alben**: Erstellen Sie Alben, um Fotos und Videos zu gruppieren. Dann teilen Sie diese Alben mit anderen.\n- **🫱🏻🫲🏻 Externes Teilen**: Teilen Sie Fotos und Videos mit Personen außerhalb Ihrer Nextcloud-Instanz.\n- **📱 Mobiler Support**: Funktioniert auf Geräten jeder Form und Größe über die Web-App.\n- **✏️ Metadaten bearbeiten**: Bearbeiten Sie Daten auf Fotos schnell und einfach.\n- **📦 Archiv**: Speichern Sie Fotos, die Sie nicht in Ihrer Chronik sehen möchten, in einem separaten Ordner.\n- **⚡️ Leistung**: Memories ist extrem schnell.\n\n## 🌐 Online-Demo\n\n- Um eine Vorstellung davon zu bekommen, wie Erinnerungen aussehen und sich anfühlen, sehen Sie sich die [öffentliche Demo] (https://memories-demo.radialapps.com/apps/memories/) an.\n- Die Demo ist schreibgeschützt und kann langsam sein (kostenlose Kontingent-VM von [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Fotonachweise gehen zu [Unsplash](https://unsplash.com/) (Einzelnachweise finden Sie in jedem Ordner).\n\n## 🚀 Installation\n\n1. Installieren Sie die App aus dem Nextcloud App Store.\n1. Führen Sie die empfohlenen [Konfigurationsschritte] durch (https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Führen Sie `php ./occ memory:index` aus, um Metadaten-Indizes für vorhandene Fotos zu generieren.\n1. Öffnen Sie die App 📷 Erinnerungen in Nextcloud und legen Sie das Verzeichnis mit Ihren Fotos fest.", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Erinnerungen\n\nMemories ist eine Fotoverwaltungs-App für Nextcloud mit erweiterten Funktionen, darunter:\n\n- **📸 Zeitleiste**: Fotos und Videos nach Aufnahmedatum sortieren, geparst aus Exif-Daten.\n- **⏪ Zurückspulen**: Springe sofort zu einem beliebigen Zeitpunkt in der Vergangenheit und erlebe deine Erinnerungen erneut.\n- **🤖 KI-Tagging**: Gruppieren Sie Fotos nach Personen und Objekten mithilfe von KI, unterstützt von der App [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Alben**: Erstellen Sie Alben, um Fotos und Videos zu gruppieren. Dann teilen Sie diese Alben mit anderen.\n- **📁 Ordner**: Durchsuchen Sie Ihre eigenen und freigegebenen Ordner mit einer ähnlichen, effizienten Zeitleiste.\n- **🎦 Diashow**: Zeigen Sie ganz einfach Fotos aus Ihrer Chronik und Ihren Ordnern an.\n- **📱 Mobiler Support**: Funktioniert auf Geräten jeder Form und Größe über die Web-App.\n- **✏️ Metadaten bearbeiten**: Bearbeiten Sie Exif-Daten auf Fotos schnell und einfach.\n- **📦 Archiv**: Speichern Sie Fotos, die Sie nicht in Ihrer Chronik sehen möchten, in einem separaten Ordner.\n- **📹 Videotranskodierung**: Memories transkodiert Videos und verwendet HLS für maximale Leistung.\n- **📷 RAW-Unterstützung**: Zeigen Sie RAW-Fotos von Ihrer Kamera mit der App [Camera RAW Previews](https://apps.nextcloud.com/apps/camerarawpreviews) an.\n- **⚡️ Schnell**: Memories ist extrem schnell. Zeitraum.\n\nUm eine Vorstellung davon zu bekommen, wie Erinnerungen aussehen und sich anfühlen, sehen Sie sich die [öffentliche Demo](https://memories-demo.radialapps.com/apps/memories/) an. Beachten Sie, dass die Demo schreibgeschützt ist und möglicherweise langsam ist, da sie in einer von [Oracle Cloud] (https://www.oracle.com/cloud/free/) bereitgestellten Low-End-VM mit kostenlosem Kontingent ausgeführt wird. Fotonachweise gehen zu [Unsplash](https://unsplash.com/) (Einzelnachweise finden Sie in jedem Ordner).\n\n## 🚀 Installation\n\n1. Installieren Sie die App aus dem Nextcloud App Store\n1. Führen Sie `php ./occ memory:index` aus, um Metadaten-Indizes für vorhandene Fotos zu generieren.\n1. Öffnen Sie die App 📷 Erinnerungen in Nextcloud und legen Sie das Verzeichnis mit Ihren Fotos fest. Fotos aus diesem Verzeichnis werden in der Zeitleiste angezeigt, einschließlich aller Fotos in verschachtelten Unterverzeichnissen.\n1. Die Installation des [Vorschaugenerators](https://github.com/rullzer/previewgenerator) zum Vorgenerieren von Miniaturansichten wird dringend empfohlen.", + "Settings" : "Einstellungen", "Timeline" : "Zeitleiste", "Folders" : "Ordner", "Favorites" : "Favoriten", @@ -14,7 +15,7 @@ OC.L10N.register( "On this day" : "An diesem Tag", "Tags" : "Schlagworte", "Maps" : "Karten", - "Settings" : "Einstellungen", + "EXIF" : "EXIF", "A better photos experience awaits you" : "Ein besseres Fotoerlebnis erwartet Sie", "Choose the root folder of your timeline to begin" : "Wählen Sie das Wurzelverzeichnis Ihrer Zeitleiste um zu beginnen", "If you just installed Memories, run:" : "Wenn Sie Memorys gerade installiert haben, führen Sie Folgendes aus:", @@ -25,6 +26,14 @@ OC.L10N.register( "Choose the root of your timeline" : "Start Ihrer Zeitleiste auswählen", "The selected folder does not seem to be valid. Try again." : "Der ausgewählte Ordner scheint ungültig zu sein. Versuchen Sie es nochmal.", "Found {total} photos in {path}" : "{total} Fotos gefunden in {path}", + "Failed to get Exif data. Metadata may be lost!" : "Exif-Daten konnten nicht abgerufen werden. Metadaten können verloren gehen!", + "No Exif data found! Continue?" : "Keine Exif-Daten gefunden! Fortsetzen?", + "Image saved successfully" : "Bild erfolgreich gespeichert", + "Error saving image" : "Fehler beim Speichern des Bildes", + "Unsaved changes" : "Ungespeicherte Änderungen", + "Drop changes" : "Änderungen verwerfen", + "Edit" : "Bearbeiten", + "Loading …" : "Lade …", "Cancel" : "Abbrechen", "Delete" : "Löschen", "Remove from album" : "Aus dem Album entfernen", @@ -45,10 +54,14 @@ OC.L10N.register( "Folders Path" : "Ordnerpfad", "Show hidden folders" : "Zeige versteckte Ordner", "Square grid mode" : "Quadratischer Gittermodus", + "Choose Timeline Paths" : "Pfade der Zeitleiste auswählen", "Choose the root for the folders view" : "Wählen Sie das Stammverzeichnis für die Ordneransicht", "Your Timeline" : "Ihre Zeitleiste", "Failed to load some photos" : "Laden einiger Fotos fehlgeschlagen", + "Share" : "Teilen", "Sidebar" : "Seitenleiste", + "Video sharing not supported yet" : "Teilen von Videos wird bislang nicht unterstützt", + "Cannot share this type of data" : "Diese Art von Daten kann nicht geteilt werden", "Processing … {n}/{m}" : "Verarbeite… {n}/{m}", "{n} photos added to album" : "{n} Fotos zum Album hinzugefügt", "Search for collaborators" : "Suche nach Mitbearbeitenden", @@ -105,7 +118,6 @@ OC.L10N.register( "Rename person" : "Person umbenennen", "Update" : "Aktualisieren", "Failed to rename {oldName} to {name}." : "Fehler beim Umbenennen von {oldName} in {name}.", - "Loading …" : "Lade …", "Merge {name} with person" : "{name} mit Person zusammenführen", "Are you sure you want to merge {name} with {newName}?" : "Sind Sie sicher, dass Sie {name} mit {newName} zusammenführen möchten?", "Too many failures, aborting" : "Zu viele Fehler, Abbruch", @@ -118,6 +130,9 @@ OC.L10N.register( "Use the sidebar to share this folder." : "Verwenden Sie die Seitenleiste, um diesen Ordner zu teilen.", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Wenn Sie eine öffentliche Linkfreigabe erstellen, klicken Sie auf Aktualisieren und ein entsprechender Link zu Memories wird unten angezeigt.", "Refresh" : "Aktualisieren", + "Remove" : "Entfernen", + "Add Path" : "Pfad hinzufügen", + "Add a root to your timeline" : "Einen Start Ihrer Zeitleiste hinzufügen", "Share album" : "Album teilen", "Delete album" : "Album löschen", "Merge with different person" : "Mit einer anderen Person zusammenführen", @@ -125,6 +140,92 @@ OC.L10N.register( "Share folder" : "Ordner teilen", "Move left" : "Nach links verschieben", "Move right" : "Nach rechts verschieben", + "Save as" : "Speichern als", + "Reset" : "Zurücksetzen", + "All changes will be lost." : "Alle Änderungen gehen verloren.", + "Are you sure you want to continue?" : "Sind Sie sich sicher, dass Sie fortsetzen wollen?", + "Continue" : "Fortsetzen", + "Undo" : "Rückgängig", + "Redo" : "Wiederherstellen", + "Show original image" : "Originalbild anzeigen", + "Zoom in" : "Hineinzoomen", + "Zoom out" : "Hinauszoomen", + "Toggle zoom menu" : "Zoom-Menü umschalten", + "Adjust" : "Anpassen", + "Fine-tune" : "Feinabstimmung", + "Filters" : "Filter", + "Watermark" : "Wasserzeichen", + "Draw" : "Zeichnen", + "Resize" : "Größe ändern", + "Invalid image." : "Ungültiges Bild.", + "Error while uploading the image." : "Fehler beim Hochladen des Bildes.", + "are not images" : "Sind keine Bilder", + "is not an image" : "Ist kein Bild", + "to be uploaded" : "zum Hochladen", + "Crop" : "Zuschneiden", + "Original" : "Original", + "Custom" : "Benutzerdefiniert", + "Square" : "Quadrat", + "Landscape" : "Querformat", + "Portrait" : "Hochformat", + "Ellipse" : "Ellipse", + "Classic TV" : "Klassisches Fernsehen", + "CinemaScope" : "CinemaScope", + "Arrow" : "Pfeil", + "Blur" : "Verwischen", + "Brightness" : "Helligkeit", + "Contrast" : "Kontrast", + "Un-flip X" : "Spiegeln X rückgängig", + "Flip X" : "Spiegeln X", + "Un-flip Y" : "Spiegeln Y rückgängig", + "Flip Y" : "Spiegeln Y", + "HSV" : "HSV", + "Hue" : "Farbton", + "Saturation" : "Sättigung", + "Value" : "Wert", + "Image" : "Bild", + "Importing …" : "Importiere…", + "+ Add image" : "+ Bild hinzufügen", + "Line" : "Linie", + "Pen" : "Stift", + "Polygon" : "Polygon", + "Sides" : "Seiten", + "Rectangle" : "Rechteck", + "Corner Radius" : "Eckenradius", + "Width in pixels" : "Breite in Pixel", + "Height in pixels" : "Höhe in Pixel", + "Toggle ratio lock" : "Verhältnis-Sperre umschalten", + "Reset to original image size" : "Auf ursprüngliche Bildgröße zurücksetzen", + "Rotate" : "Drehen", + "Text" : "Text", + "Text spacing" : "Text-Abstand", + "Text alignment" : "Textausrichtung", + "Font family" : "Schriftenfamilie", + "Size" : "Größe", + "Letter spacing" : "Buchstaben-Abstand", + "Line height" : "Zeilenhöhe", + "Warmth" : "Wärme", + "+ Add watermark" : "+ Wasserzeichen hinzufügen", + "Choose watermark type" : "Wasserzeichentyp auswählen", + "Upload watermark" : "Wasserzeichen hochladen", + "Add as text" : "Als Text hinzufügen", + "Padding" : "Auffüllen", + "Shadow" : "Schatten", + "Horizontal" : "Horizontal", + "Vertical" : "Vertikal", + "Opacity" : "Deckkraft", + "Position" : "Position", + "Stroke" : " Strich", + "Save image as" : "Bild speichern als", + "Extension" : "Erweiterung", + "Name is required." : "Name ist erforderlich.", + "Quality" : "Qualität", + "Saved image size (width x height)" : "Gespeicherte Bildgröße (Breite x Höhe)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Beachten Sie, dass der ausgewählte Zuschneidebereich kleiner ist als die angewendete Größenänderung, was zu Qualitätseinbußen führen kann", + "Actual size (100%)" : "Tatsächliche Größe (100%)", + "Fit size" : "Größe anpassen", + "Transcoding failed." : "Transkodierung fehlgeschlagen.", + "Auto" : "Automatisch", "Shared Folder" : "Geteilter Ordner", "Failed to create {albumName}." : "{albumName} konnte nicht erstellt werden.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} konnte nicht in {newAlbumName} umbenannt werden.", diff --git a/l10n/de_DE.json b/l10n/de_DE.json index c447181f..b3470d80 100644 --- a/l10n/de_DE.json +++ b/l10n/de_DE.json @@ -1,7 +1,8 @@ { "translations": { "Memories" : "Erinnerungen", "Yet another photo management app" : "Eine weitere Foto-Management-App", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Erinnerungen\n\nErinnerungen (Memories) ist eine Fotoverwaltungs-App für Nextcloud mit erweiterten Funktionen, darunter:\n\n- **📸 Zeitleiste**: Fotos und Videos nach Aufnahmedatum sortieren, ausgelesen aus Exif-Daten.\n- **⏪ Zurückspulen**: Springen Sie sofort zu einem beliebigen Zeitpunkt in der Vergangenheit und erleben Sie Ihre Erinnerungen erneut.\n- **🤖 KI-Markierung**: Gruppieren Sie Fotos nach Personen und Objekten mithilfe von KI, unterstützt von [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Alben**: Erstellen Sie Alben, um Fotos und Videos zu gruppieren. Dann teilen Sie diese Alben mit anderen.\n- **🫱🏻🫲🏻 Externes Teilen**: Teilen Sie Fotos und Videos mit Personen außerhalb Ihrer Nextcloud-Instanz.\n- **📱 Mobiler Support**: Funktioniert auf Geräten jeder Form und Größe über die Web-App.\n- **✏️ Metadaten bearbeiten**: Bearbeiten Sie Daten auf Fotos schnell und einfach.\n- **📦 Archiv**: Speichern Sie Fotos, die Sie nicht in Ihrer Chronik sehen möchten, in einem separaten Ordner.\n- **⚡️ Leistung**: Memories ist extrem schnell.\n\n## 🌐 Online-Demo\n\n- Um eine Vorstellung davon zu bekommen, wie Erinnerungen aussehen und sich anfühlen, sehen Sie sich die [öffentliche Demo] (https://memories-demo.radialapps.com/apps/memories/) an.\n- Die Demo ist schreibgeschützt und kann langsam sein (kostenlose Kontingent-VM von [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Fotonachweise gehen zu [Unsplash](https://unsplash.com/) (Einzelnachweise finden Sie in jedem Ordner).\n\n## 🚀 Installation\n\n1. Installieren Sie die App aus dem Nextcloud App Store.\n1. Führen Sie die empfohlenen [Konfigurationsschritte] durch (https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Führen Sie `php ./occ memory:index` aus, um Metadaten-Indizes für vorhandene Fotos zu generieren.\n1. Öffnen Sie die App 📷 Erinnerungen in Nextcloud und legen Sie das Verzeichnis mit Ihren Fotos fest.", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Erinnerungen\n\nMemories ist eine Fotoverwaltungs-App für Nextcloud mit erweiterten Funktionen, darunter:\n\n- **📸 Zeitleiste**: Fotos und Videos nach Aufnahmedatum sortieren, geparst aus Exif-Daten.\n- **⏪ Zurückspulen**: Springe sofort zu einem beliebigen Zeitpunkt in der Vergangenheit und erlebe deine Erinnerungen erneut.\n- **🤖 KI-Tagging**: Gruppieren Sie Fotos nach Personen und Objekten mithilfe von KI, unterstützt von der App [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Alben**: Erstellen Sie Alben, um Fotos und Videos zu gruppieren. Dann teilen Sie diese Alben mit anderen.\n- **📁 Ordner**: Durchsuchen Sie Ihre eigenen und freigegebenen Ordner mit einer ähnlichen, effizienten Zeitleiste.\n- **🎦 Diashow**: Zeigen Sie ganz einfach Fotos aus Ihrer Chronik und Ihren Ordnern an.\n- **📱 Mobiler Support**: Funktioniert auf Geräten jeder Form und Größe über die Web-App.\n- **✏️ Metadaten bearbeiten**: Bearbeiten Sie Exif-Daten auf Fotos schnell und einfach.\n- **📦 Archiv**: Speichern Sie Fotos, die Sie nicht in Ihrer Chronik sehen möchten, in einem separaten Ordner.\n- **📹 Videotranskodierung**: Memories transkodiert Videos und verwendet HLS für maximale Leistung.\n- **📷 RAW-Unterstützung**: Zeigen Sie RAW-Fotos von Ihrer Kamera mit der App [Camera RAW Previews](https://apps.nextcloud.com/apps/camerarawpreviews) an.\n- **⚡️ Schnell**: Memories ist extrem schnell. Zeitraum.\n\nUm eine Vorstellung davon zu bekommen, wie Erinnerungen aussehen und sich anfühlen, sehen Sie sich die [öffentliche Demo](https://memories-demo.radialapps.com/apps/memories/) an. Beachten Sie, dass die Demo schreibgeschützt ist und möglicherweise langsam ist, da sie in einer von [Oracle Cloud] (https://www.oracle.com/cloud/free/) bereitgestellten Low-End-VM mit kostenlosem Kontingent ausgeführt wird. Fotonachweise gehen zu [Unsplash](https://unsplash.com/) (Einzelnachweise finden Sie in jedem Ordner).\n\n## 🚀 Installation\n\n1. Installieren Sie die App aus dem Nextcloud App Store\n1. Führen Sie `php ./occ memory:index` aus, um Metadaten-Indizes für vorhandene Fotos zu generieren.\n1. Öffnen Sie die App 📷 Erinnerungen in Nextcloud und legen Sie das Verzeichnis mit Ihren Fotos fest. Fotos aus diesem Verzeichnis werden in der Zeitleiste angezeigt, einschließlich aller Fotos in verschachtelten Unterverzeichnissen.\n1. Die Installation des [Vorschaugenerators](https://github.com/rullzer/previewgenerator) zum Vorgenerieren von Miniaturansichten wird dringend empfohlen.", + "Settings" : "Einstellungen", "Timeline" : "Zeitleiste", "Folders" : "Ordner", "Favorites" : "Favoriten", @@ -12,7 +13,7 @@ "On this day" : "An diesem Tag", "Tags" : "Schlagworte", "Maps" : "Karten", - "Settings" : "Einstellungen", + "EXIF" : "EXIF", "A better photos experience awaits you" : "Ein besseres Fotoerlebnis erwartet Sie", "Choose the root folder of your timeline to begin" : "Wählen Sie das Wurzelverzeichnis Ihrer Zeitleiste um zu beginnen", "If you just installed Memories, run:" : "Wenn Sie Memorys gerade installiert haben, führen Sie Folgendes aus:", @@ -23,6 +24,14 @@ "Choose the root of your timeline" : "Start Ihrer Zeitleiste auswählen", "The selected folder does not seem to be valid. Try again." : "Der ausgewählte Ordner scheint ungültig zu sein. Versuchen Sie es nochmal.", "Found {total} photos in {path}" : "{total} Fotos gefunden in {path}", + "Failed to get Exif data. Metadata may be lost!" : "Exif-Daten konnten nicht abgerufen werden. Metadaten können verloren gehen!", + "No Exif data found! Continue?" : "Keine Exif-Daten gefunden! Fortsetzen?", + "Image saved successfully" : "Bild erfolgreich gespeichert", + "Error saving image" : "Fehler beim Speichern des Bildes", + "Unsaved changes" : "Ungespeicherte Änderungen", + "Drop changes" : "Änderungen verwerfen", + "Edit" : "Bearbeiten", + "Loading …" : "Lade …", "Cancel" : "Abbrechen", "Delete" : "Löschen", "Remove from album" : "Aus dem Album entfernen", @@ -43,10 +52,14 @@ "Folders Path" : "Ordnerpfad", "Show hidden folders" : "Zeige versteckte Ordner", "Square grid mode" : "Quadratischer Gittermodus", + "Choose Timeline Paths" : "Pfade der Zeitleiste auswählen", "Choose the root for the folders view" : "Wählen Sie das Stammverzeichnis für die Ordneransicht", "Your Timeline" : "Ihre Zeitleiste", "Failed to load some photos" : "Laden einiger Fotos fehlgeschlagen", + "Share" : "Teilen", "Sidebar" : "Seitenleiste", + "Video sharing not supported yet" : "Teilen von Videos wird bislang nicht unterstützt", + "Cannot share this type of data" : "Diese Art von Daten kann nicht geteilt werden", "Processing … {n}/{m}" : "Verarbeite… {n}/{m}", "{n} photos added to album" : "{n} Fotos zum Album hinzugefügt", "Search for collaborators" : "Suche nach Mitbearbeitenden", @@ -103,7 +116,6 @@ "Rename person" : "Person umbenennen", "Update" : "Aktualisieren", "Failed to rename {oldName} to {name}." : "Fehler beim Umbenennen von {oldName} in {name}.", - "Loading …" : "Lade …", "Merge {name} with person" : "{name} mit Person zusammenführen", "Are you sure you want to merge {name} with {newName}?" : "Sind Sie sicher, dass Sie {name} mit {newName} zusammenführen möchten?", "Too many failures, aborting" : "Zu viele Fehler, Abbruch", @@ -116,6 +128,9 @@ "Use the sidebar to share this folder." : "Verwenden Sie die Seitenleiste, um diesen Ordner zu teilen.", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Wenn Sie eine öffentliche Linkfreigabe erstellen, klicken Sie auf Aktualisieren und ein entsprechender Link zu Memories wird unten angezeigt.", "Refresh" : "Aktualisieren", + "Remove" : "Entfernen", + "Add Path" : "Pfad hinzufügen", + "Add a root to your timeline" : "Einen Start Ihrer Zeitleiste hinzufügen", "Share album" : "Album teilen", "Delete album" : "Album löschen", "Merge with different person" : "Mit einer anderen Person zusammenführen", @@ -123,6 +138,92 @@ "Share folder" : "Ordner teilen", "Move left" : "Nach links verschieben", "Move right" : "Nach rechts verschieben", + "Save as" : "Speichern als", + "Reset" : "Zurücksetzen", + "All changes will be lost." : "Alle Änderungen gehen verloren.", + "Are you sure you want to continue?" : "Sind Sie sich sicher, dass Sie fortsetzen wollen?", + "Continue" : "Fortsetzen", + "Undo" : "Rückgängig", + "Redo" : "Wiederherstellen", + "Show original image" : "Originalbild anzeigen", + "Zoom in" : "Hineinzoomen", + "Zoom out" : "Hinauszoomen", + "Toggle zoom menu" : "Zoom-Menü umschalten", + "Adjust" : "Anpassen", + "Fine-tune" : "Feinabstimmung", + "Filters" : "Filter", + "Watermark" : "Wasserzeichen", + "Draw" : "Zeichnen", + "Resize" : "Größe ändern", + "Invalid image." : "Ungültiges Bild.", + "Error while uploading the image." : "Fehler beim Hochladen des Bildes.", + "are not images" : "Sind keine Bilder", + "is not an image" : "Ist kein Bild", + "to be uploaded" : "zum Hochladen", + "Crop" : "Zuschneiden", + "Original" : "Original", + "Custom" : "Benutzerdefiniert", + "Square" : "Quadrat", + "Landscape" : "Querformat", + "Portrait" : "Hochformat", + "Ellipse" : "Ellipse", + "Classic TV" : "Klassisches Fernsehen", + "CinemaScope" : "CinemaScope", + "Arrow" : "Pfeil", + "Blur" : "Verwischen", + "Brightness" : "Helligkeit", + "Contrast" : "Kontrast", + "Un-flip X" : "Spiegeln X rückgängig", + "Flip X" : "Spiegeln X", + "Un-flip Y" : "Spiegeln Y rückgängig", + "Flip Y" : "Spiegeln Y", + "HSV" : "HSV", + "Hue" : "Farbton", + "Saturation" : "Sättigung", + "Value" : "Wert", + "Image" : "Bild", + "Importing …" : "Importiere…", + "+ Add image" : "+ Bild hinzufügen", + "Line" : "Linie", + "Pen" : "Stift", + "Polygon" : "Polygon", + "Sides" : "Seiten", + "Rectangle" : "Rechteck", + "Corner Radius" : "Eckenradius", + "Width in pixels" : "Breite in Pixel", + "Height in pixels" : "Höhe in Pixel", + "Toggle ratio lock" : "Verhältnis-Sperre umschalten", + "Reset to original image size" : "Auf ursprüngliche Bildgröße zurücksetzen", + "Rotate" : "Drehen", + "Text" : "Text", + "Text spacing" : "Text-Abstand", + "Text alignment" : "Textausrichtung", + "Font family" : "Schriftenfamilie", + "Size" : "Größe", + "Letter spacing" : "Buchstaben-Abstand", + "Line height" : "Zeilenhöhe", + "Warmth" : "Wärme", + "+ Add watermark" : "+ Wasserzeichen hinzufügen", + "Choose watermark type" : "Wasserzeichentyp auswählen", + "Upload watermark" : "Wasserzeichen hochladen", + "Add as text" : "Als Text hinzufügen", + "Padding" : "Auffüllen", + "Shadow" : "Schatten", + "Horizontal" : "Horizontal", + "Vertical" : "Vertikal", + "Opacity" : "Deckkraft", + "Position" : "Position", + "Stroke" : " Strich", + "Save image as" : "Bild speichern als", + "Extension" : "Erweiterung", + "Name is required." : "Name ist erforderlich.", + "Quality" : "Qualität", + "Saved image size (width x height)" : "Gespeicherte Bildgröße (Breite x Höhe)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Beachten Sie, dass der ausgewählte Zuschneidebereich kleiner ist als die angewendete Größenänderung, was zu Qualitätseinbußen führen kann", + "Actual size (100%)" : "Tatsächliche Größe (100%)", + "Fit size" : "Größe anpassen", + "Transcoding failed." : "Transkodierung fehlgeschlagen.", + "Auto" : "Automatisch", "Shared Folder" : "Geteilter Ordner", "Failed to create {albumName}." : "{albumName} konnte nicht erstellt werden.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} konnte nicht in {newAlbumName} umbenannt werden.", diff --git a/l10n/el.js b/l10n/el.js index 703cff72..b2cfb358 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Ρυθμίσεις", "Timeline" : "Χρονολόγιο", "Folders" : "Φάκελοι", "Favorites" : "Αγαπημένα", @@ -11,13 +12,16 @@ OC.L10N.register( "On this day" : "Αυτή τη μέρα", "Tags" : "Ετικέτες", "Maps" : "Χάρτες", - "Settings" : "Ρυθμίσεις", + "Unsaved changes" : "Μη αποθηκευμένες αλλαγές", + "Edit" : "Επεξεργασία", + "Loading …" : "Φόρτωση …", "Cancel" : "Ακύρωση", "Delete" : "Διαγραφή", "Download" : "Λήψη", "Favorite" : "Αγαπημένο", "Unarchive" : "Αναίρεση αρχειοθέτησης", "View in folder" : "Προβολή στον φάκελο", + "Share" : "Διαμοιρασμός", "Copy public link" : "Αντιγραφή δημόσιου συνδέσμου", "Public link" : "Δημόσιος σύνδεσμος", "Back" : "Πίσω", @@ -30,8 +34,24 @@ OC.L10N.register( "Minute" : "Λεπτά", "Name" : "Όνομα", "Update" : "Ενημέρωση", - "Loading …" : "Φόρτωση …", "Refresh" : "Ανανέωση", - "Share folder" : "Διαμοιρασμός φακέλου" + "Remove" : "Αφαίρεση", + "Share folder" : "Διαμοιρασμός φακέλου", + "Reset" : "Επαναφορά", + "Continue" : "Συνεχίστε", + "Undo" : "Ακύρωση ενέργειας", + "Redo" : "Ξανακάντε", + "Zoom in" : "Εστίαση", + "Original" : "Πρωτότυπο", + "Custom" : "Προσαρμοσμένο", + "Value" : "Τιμή", + "Image" : "Εικόνα", + "Text" : "Κείμενο", + "Size" : "Μέγεθος", + "Position" : "Θέση", + "Extension" : "Επέκταση", + "Name is required." : "Απαιτείται όνομα.", + "Quality" : "Ποιότητα", + "Auto" : "Αυτόματα" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/el.json b/l10n/el.json index 59bf3fa9..f41ffd76 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Ρυθμίσεις", "Timeline" : "Χρονολόγιο", "Folders" : "Φάκελοι", "Favorites" : "Αγαπημένα", @@ -9,13 +10,16 @@ "On this day" : "Αυτή τη μέρα", "Tags" : "Ετικέτες", "Maps" : "Χάρτες", - "Settings" : "Ρυθμίσεις", + "Unsaved changes" : "Μη αποθηκευμένες αλλαγές", + "Edit" : "Επεξεργασία", + "Loading …" : "Φόρτωση …", "Cancel" : "Ακύρωση", "Delete" : "Διαγραφή", "Download" : "Λήψη", "Favorite" : "Αγαπημένο", "Unarchive" : "Αναίρεση αρχειοθέτησης", "View in folder" : "Προβολή στον φάκελο", + "Share" : "Διαμοιρασμός", "Copy public link" : "Αντιγραφή δημόσιου συνδέσμου", "Public link" : "Δημόσιος σύνδεσμος", "Back" : "Πίσω", @@ -28,8 +32,24 @@ "Minute" : "Λεπτά", "Name" : "Όνομα", "Update" : "Ενημέρωση", - "Loading …" : "Φόρτωση …", "Refresh" : "Ανανέωση", - "Share folder" : "Διαμοιρασμός φακέλου" + "Remove" : "Αφαίρεση", + "Share folder" : "Διαμοιρασμός φακέλου", + "Reset" : "Επαναφορά", + "Continue" : "Συνεχίστε", + "Undo" : "Ακύρωση ενέργειας", + "Redo" : "Ξανακάντε", + "Zoom in" : "Εστίαση", + "Original" : "Πρωτότυπο", + "Custom" : "Προσαρμοσμένο", + "Value" : "Τιμή", + "Image" : "Εικόνα", + "Text" : "Κείμενο", + "Size" : "Μέγεθος", + "Position" : "Θέση", + "Extension" : "Επέκταση", + "Name is required." : "Απαιτείται όνομα.", + "Quality" : "Ποιότητα", + "Auto" : "Αυτόματα" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/en_GB.js b/l10n/en_GB.js index 1b4e9c81..55d34ef4 100644 --- a/l10n/en_GB.js +++ b/l10n/en_GB.js @@ -1,19 +1,23 @@ OC.L10N.register( "memories", { + "Settings" : "Settings", "Folders" : "Folders", "Favorites" : "Favourites", "Videos" : "Videos", "Archive" : "Archive", "Tags" : "Tags", "Maps" : "Maps", - "Settings" : "Settings", + "Unsaved changes" : "Unsaved changes", + "Edit" : "Edit", + "Loading …" : "Loading …", "Cancel" : "Cancel", "Delete" : "Delete", "Download" : "Download", "Favorite" : "Favourite", "Unarchive" : "Unarchive", "View in folder" : "View in folder", + "Share" : "Share", "Public link" : "Public link", "Back" : "Back", "Save" : "Save", @@ -23,7 +27,17 @@ OC.L10N.register( "Hour" : "Hour", "Name" : "Surname", "Update" : "Update", - "Loading …" : "Loading …", - "Refresh" : "Refresh" + "Refresh" : "Refresh", + "Remove" : "Remove", + "Reset" : "Reset", + "Continue" : "Continue", + "Undo" : "Undo", + "Original" : "Original", + "Custom" : "Custom", + "Value" : "Value", + "Image" : "Image", + "Text" : "Text", + "Size" : "Size", + "Position" : "Position" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/en_GB.json b/l10n/en_GB.json index eae72fc2..aef5ec3d 100644 --- a/l10n/en_GB.json +++ b/l10n/en_GB.json @@ -1,17 +1,21 @@ { "translations": { + "Settings" : "Settings", "Folders" : "Folders", "Favorites" : "Favourites", "Videos" : "Videos", "Archive" : "Archive", "Tags" : "Tags", "Maps" : "Maps", - "Settings" : "Settings", + "Unsaved changes" : "Unsaved changes", + "Edit" : "Edit", + "Loading …" : "Loading …", "Cancel" : "Cancel", "Delete" : "Delete", "Download" : "Download", "Favorite" : "Favourite", "Unarchive" : "Unarchive", "View in folder" : "View in folder", + "Share" : "Share", "Public link" : "Public link", "Back" : "Back", "Save" : "Save", @@ -21,7 +25,17 @@ "Hour" : "Hour", "Name" : "Surname", "Update" : "Update", - "Loading …" : "Loading …", - "Refresh" : "Refresh" + "Refresh" : "Refresh", + "Remove" : "Remove", + "Reset" : "Reset", + "Continue" : "Continue", + "Undo" : "Undo", + "Original" : "Original", + "Custom" : "Custom", + "Value" : "Value", + "Image" : "Image", + "Text" : "Text", + "Size" : "Size", + "Position" : "Position" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/eo.js b/l10n/eo.js index 24f75600..9af7ffb7 100644 --- a/l10n/eo.js +++ b/l10n/eo.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Agordoj", "Timeline" : "Kronologio", "Folders" : "Dosierujoj", "Favorites" : "Plej ŝatataj", @@ -8,12 +9,15 @@ OC.L10N.register( "Archive" : "Arĥivujo", "Tags" : "Etikedoj", "Maps" : "Mapoj", - "Settings" : "Agordoj", + "Unsaved changes" : "Nekonservitaj ŝanĝoj", + "Edit" : "Modifi", + "Loading …" : "Ŝargas …", "Cancel" : "Nuligi", "Delete" : "Forigi", "Download" : "Elŝuti", "Favorite" : "Pliŝatati", "View in folder" : "Vidi en dosierujo", + "Share" : "Kunhavigi", "Public link" : "Publika ligilo", "Back" : "Antaŭen", "Save" : "Konservi", @@ -23,7 +27,17 @@ OC.L10N.register( "Hour" : "Horo", "Name" : "Nomo", "Update" : "Ĝisdatigi", - "Loading …" : "Ŝargas …", - "Refresh" : "Aktualigi" + "Refresh" : "Aktualigi", + "Remove" : "Forigi", + "Reset" : "Restarigi", + "Continue" : "Daŭrigi", + "Undo" : "Malfari", + "Redo" : "Refari", + "Custom" : "Propra", + "Text" : "Teksto", + "Size" : "Grando", + "Position" : "Loko", + "Extension" : "Dosiersufikso", + "Auto" : "Aŭtomate" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/eo.json b/l10n/eo.json index 61518c7e..0486007c 100644 --- a/l10n/eo.json +++ b/l10n/eo.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Agordoj", "Timeline" : "Kronologio", "Folders" : "Dosierujoj", "Favorites" : "Plej ŝatataj", @@ -6,12 +7,15 @@ "Archive" : "Arĥivujo", "Tags" : "Etikedoj", "Maps" : "Mapoj", - "Settings" : "Agordoj", + "Unsaved changes" : "Nekonservitaj ŝanĝoj", + "Edit" : "Modifi", + "Loading …" : "Ŝargas …", "Cancel" : "Nuligi", "Delete" : "Forigi", "Download" : "Elŝuti", "Favorite" : "Pliŝatati", "View in folder" : "Vidi en dosierujo", + "Share" : "Kunhavigi", "Public link" : "Publika ligilo", "Back" : "Antaŭen", "Save" : "Konservi", @@ -21,7 +25,17 @@ "Hour" : "Horo", "Name" : "Nomo", "Update" : "Ĝisdatigi", - "Loading …" : "Ŝargas …", - "Refresh" : "Aktualigi" + "Refresh" : "Aktualigi", + "Remove" : "Forigi", + "Reset" : "Restarigi", + "Continue" : "Daŭrigi", + "Undo" : "Malfari", + "Redo" : "Refari", + "Custom" : "Propra", + "Text" : "Teksto", + "Size" : "Grando", + "Position" : "Loko", + "Extension" : "Dosiersufikso", + "Auto" : "Aŭtomate" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/es.js b/l10n/es.js index b21d66b6..5a61d5e9 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -3,7 +3,8 @@ OC.L10N.register( { "Memories" : "Memories", "Yet another photo management app" : "Otra aplicación de gestión de fotos mas", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Memories\n\nMemories es una aplicación de gestión de fotos para Nextcloud con algunas características avanzadas, incluyendo:\n\n- **📸 Línea de tiempo**: Organice fotos y videos por fecha, analizadas desde los datos Exif.\n- **⏪ Rebobinar**: Navegue a cualquier momento del pasado instantáneamente y reviva sus memorias.\n- **🤖 Etiquetado IA**: Agrupe fotos por persona y objetos utilizando IA, aprovechando las capacidades de la aplicación [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Álbumes**: Cree álbumes para agrupar fotos y videos en conjunto. Podrá entonces compartir estos álbumes con otros.\n **🫱🏻🫲🏻 Compartir externamente**: Comparta fotos y videos con personas fuera de su instancia Nextcloud.\n-- **📱 Soporte a Móviles**: Funciona con dispositivos de cualquier tamaño y forma a través de la aplicación web.\n- **✏️ Editar Metadatos**: Edite las fechas Exif en las fotos de forma rápida y sencilla.\n- **📦 Archivar**: Almacene las fotos que no quiere ver en su línea de tiempo en una carpeta separada.\n- **⚡️ Rápida**: Memories es extremadamente rápida.\n\n## 🌐 Demostración en línea\n\n- Para tener una idea de como se siente y se vé Memories, compruebe la [demostración pública](https://memories-demo.radialapps.com/apps/memories/). \n- Tenga en cuenta que la demostración es de sólo lectura y podría ser lenta (se ejecuta en una VM en la nube de la capa gratuita de [Oracle Cloud](https://www.oracle.com/cloud/free/)). \n- Los créditos de las fotos son para [Unsplash](https://unsplash.com/) (para créditos individuales, refiérase a cada carpeta).\n\n## 🚀 Instalación\n\n1. Instale la aplicación desde la tienda de Nextcloud.\n2. Ejecute los [pasos recomendados de configuración](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n3. Ejecute `php ./occ memories:index` para generar los índices de metadatos para las fotos existentes.\n4. Abra la aplicación 📷 Memories en Nextcloud y especifique la carpeta que contiene sus fotos.", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Memories\n\nMemories es una solución con *baterías incluídas* para gestión de fotos en Nextcloud con algunas características avanzadas, incluyendo:\n\n- **📸 Línea de tiempo**: Organice fotos y videos por fecha, analizadas desde los datos Exif.\n- **⏪ Rebobinar**: Navegue a cualquier momento del pasado instantáneamente y reviva sus memorias.\n- **🤖 Etiquetado IA**: Agrupe fotos por persona y objetos utilizando IA, aprovechando las capacidades de la aplicación [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Álbumes**: Cree álbumes para agrupar fotos y videos en conjunto. Podrá entonces compartir estos álbumes con otros.\n **🫱🏻🫲🏻 Compartir externamente**: Comparta fotos y videos con personas fuera de su instancia Nextcloud.\n-- **📱 Soporte a Móviles**: Funciona con dispositivos de cualquier tamaño y forma a través de la aplicación web.\n- **✏️ Editar Metadatos**: Edite las fechas en las fotos de forma rápida y sencilla.\n- **📦 Archivar**: Almacene las fotos que no quiere ver en su línea de tiempo en una carpeta separada.\n- **📹 Conversión de video**: Memories convierte entre formatos de video y utiliza HLS para máximo rendimiento.\n- **⚡️ Rápida**: En general, Memories es extremadamente rápida.\n\n## 🌐 Demostración en línea\n\n- Para tener una idea de como se siente y se vé Memories, compruebe la [demostración pública](https://memories-demo.radialapps.com/apps/memories/). \n- Tenga en cuenta que la demostración es de sólo lectura y podría ser lenta (se ejecuta en una VM en la nube de la capa gratuita de [Oracle Cloud](https://www.oracle.com/cloud/free/)). \n- Los créditos de las fotos son para [Unsplash](https://unsplash.com/) (para créditos individuales, refiérase a cada carpeta).\n\n## 🚀 Instalación\n\n1. Instale la aplicación desde la tienda de Nextcloud.\n2. Ejecute los [pasos recomendados de configuración](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n3. Ejecute `php ./occ memories:index` para generar los índices de metadatos para las fotos existentes.\n4. Abra la aplicación 📷 Memories en Nextcloud y especifique la carpeta que contiene sus fotos.", + "Settings" : "Ajustes", "Timeline" : "Línea de tiempo", "Folders" : "Carpetas", "Favorites" : "Favoritos", @@ -14,7 +15,7 @@ OC.L10N.register( "On this day" : "En este día", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "EXIF" : "EXIF", "A better photos experience awaits you" : "Una mejor experiencia de fotos te espera", "Choose the root folder of your timeline to begin" : "Escoja la carpeta raíz de su línea de tiempo para comenzar", "If you just installed Memories, run:" : "Si acaba de instalar Memories, ejecute:", @@ -25,6 +26,14 @@ OC.L10N.register( "Choose the root of your timeline" : "Seleccione la raíz de su línea de tiempo", "The selected folder does not seem to be valid. Try again." : "La carpeta seleccionada no parece ser válida. Intente de nuevo.", "Found {total} photos in {path}" : "Se encontraron {total} fotos en {path}", + "Failed to get Exif data. Metadata may be lost!" : "Fallo al obtener los datos Exif. ¡Podrían haberse perdido los metadatos!", + "No Exif data found! Continue?" : "¡No se encontraron datos Exif!, ¿Continuar?", + "Image saved successfully" : "La imagen se guardó exitósamente", + "Error saving image" : "Error guardando imágen", + "Unsaved changes" : "Cambios sin guardar", + "Drop changes" : "Descartar cambios", + "Edit" : "Editar", + "Loading …" : "Cargando …", "Cancel" : "Cancelar", "Delete" : "Eliminar", "Remove from album" : "Quitar del álbum", @@ -45,10 +54,14 @@ OC.L10N.register( "Folders Path" : "Ruta a las carpetas", "Show hidden folders" : "Mostrar carpetas ocultas", "Square grid mode" : "Modo de rejilla cuadrada", + "Choose Timeline Paths" : "Escoga las rutas a la línea de tiempo", "Choose the root for the folders view" : "Seleccione la raíz de la vista de carpetas", "Your Timeline" : "Su línea de tiempo", "Failed to load some photos" : "Fallo al cargar algunas fotos", + "Share" : "Compartir", "Sidebar" : "Barra lateral", + "Video sharing not supported yet" : "Compartir videos no es soportado todavía", + "Cannot share this type of data" : "No se puede compartir este tipo de datos", "Processing … {n}/{m}" : "Procesando ... {n}/{m}", "{n} photos added to album" : "Se agregaron {n} fotos al álbum", "Search for collaborators" : "Buscar colaboradores", @@ -105,7 +118,6 @@ OC.L10N.register( "Rename person" : "Renombrar persona", "Update" : "Actualizar", "Failed to rename {oldName} to {name}." : "Fallo al renombrar {oldName} a {name}", - "Loading …" : "Cargando …", "Merge {name} with person" : "Unir {name} con persona", "Are you sure you want to merge {name} with {newName}?" : "¿Está seguro de quiere unir {name} con {newName}?", "Too many failures, aborting" : "Demasiados fallos, abortando", @@ -118,6 +130,9 @@ OC.L10N.register( "Use the sidebar to share this folder." : "Utilice la barra lateral para compartir esta carpeta.", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Si crea un enlace público de compartición, haga click en refrescar y se mostrará abajo el enlace correspondiente a Memories.", "Refresh" : "Actualizar", + "Remove" : "Quitar", + "Add Path" : "Añadir ruta", + "Add a root to your timeline" : "Añadir una raíz a su línea de tiempo", "Share album" : "Compartir álbum", "Delete album" : "Eliminar álbum", "Merge with different person" : "Unir con una persona diferente", @@ -125,6 +140,92 @@ OC.L10N.register( "Share folder" : "Compartir carpeta", "Move left" : "Mover a la izquierda", "Move right" : "Mover a la derecha", + "Save as" : "Guardar como", + "Reset" : "Restablecer", + "All changes will be lost." : "Todos los cambios se perderán.", + "Are you sure you want to continue?" : "¿Está seguro que desea continuar?", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Redo" : "Rehacer", + "Show original image" : "Mostrar mensaje original", + "Zoom in" : "Acercar", + "Zoom out" : "Alejar", + "Toggle zoom menu" : "Conmutar menú de zoom", + "Adjust" : "Ajustar", + "Fine-tune" : "Entonar", + "Filters" : "Filtros", + "Watermark" : "Marca de agua", + "Draw" : "Dibujar", + "Resize" : "Redimensionar", + "Invalid image." : "Imágen inválida", + "Error while uploading the image." : "Se encontró un error al cargar la imagen.", + "are not images" : "no son imágenes", + "is not an image" : "no es una imágen", + "to be uploaded" : "a cargar", + "Crop" : "Recortar", + "Original" : "Original", + "Custom" : "Personalizado", + "Square" : "Cuadrado", + "Landscape" : "Paisaje", + "Portrait" : "Retrato", + "Ellipse" : "Elipse", + "Classic TV" : "TV clásica", + "CinemaScope" : "CinemaScope", + "Arrow" : "Flecha", + "Blur" : "Difuminar", + "Brightness" : "Brillo", + "Contrast" : "Contraste", + "Un-flip X" : "Revertir voltear X", + "Flip X" : "Voltear X", + "Un-flip Y" : "Revertir voltear Y", + "Flip Y" : "Voltear Y", + "HSV" : "HSV", + "Hue" : "Tone", + "Saturation" : "Saturación", + "Value" : "Valor", + "Image" : "Imagen", + "Importing …" : "Importando ...", + "+ Add image" : "+ Añadir imágen", + "Line" : "Línea", + "Pen" : "Pluma", + "Polygon" : "Polígono", + "Sides" : "Lados", + "Rectangle" : "Rectángulo", + "Corner Radius" : "Radio de esquina", + "Width in pixels" : "Ancho en píxeles", + "Height in pixels" : "Altura en píxeles", + "Toggle ratio lock" : "Conmutar bloqueo de proporción", + "Reset to original image size" : "Reajustar a tamaño original de la imágen", + "Rotate" : "Rotar", + "Text" : "Texto", + "Text spacing" : "Espacio del texto", + "Text alignment" : "Alineación del texto", + "Font family" : "Familia de fuente", + "Size" : "Tamaño", + "Letter spacing" : "Espacio entre letras", + "Line height" : "Altura de línea", + "Warmth" : "Calidez", + "+ Add watermark" : "+ Añadir marca de agua", + "Choose watermark type" : "Seleccione el tipo de marca de agua", + "Upload watermark" : "Cargar marca de agua", + "Add as text" : "Añadir como texto", + "Padding" : "Desplazamiento", + "Shadow" : "Sombra", + "Horizontal" : "Horizontal", + "Vertical" : "Vertical", + "Opacity" : "Opacidad", + "Position" : "Posición", + "Stroke" : "Trazo", + "Save image as" : "Guardar imagen como", + "Extension" : "Extensión", + "Name is required." : "Se requiere Nombre.", + "Quality" : "Calidad", + "Saved image size (width x height)" : "Tamaño de la imagen guardada (anchura x altura)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Tenga en cuenta que el área a recortar es menor al redimensionamiento aplicado lo que puede causar pérdida de calidad", + "Actual size (100%)" : "Tamaño actual (100%)", + "Fit size" : "Ajustar tamaño", + "Transcoding failed." : "Falló el transcoding", + "Auto" : "Auto", "Shared Folder" : "Carpeta compartida", "Failed to create {albumName}." : "Fallo al crear {albumName}", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Fallo al renombrar {currentAlbumName} a {newAlbumName}.", diff --git a/l10n/es.json b/l10n/es.json index a6ed7f4a..34202fa7 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -1,7 +1,8 @@ { "translations": { "Memories" : "Memories", "Yet another photo management app" : "Otra aplicación de gestión de fotos mas", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Memories\n\nMemories es una aplicación de gestión de fotos para Nextcloud con algunas características avanzadas, incluyendo:\n\n- **📸 Línea de tiempo**: Organice fotos y videos por fecha, analizadas desde los datos Exif.\n- **⏪ Rebobinar**: Navegue a cualquier momento del pasado instantáneamente y reviva sus memorias.\n- **🤖 Etiquetado IA**: Agrupe fotos por persona y objetos utilizando IA, aprovechando las capacidades de la aplicación [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Álbumes**: Cree álbumes para agrupar fotos y videos en conjunto. Podrá entonces compartir estos álbumes con otros.\n **🫱🏻🫲🏻 Compartir externamente**: Comparta fotos y videos con personas fuera de su instancia Nextcloud.\n-- **📱 Soporte a Móviles**: Funciona con dispositivos de cualquier tamaño y forma a través de la aplicación web.\n- **✏️ Editar Metadatos**: Edite las fechas Exif en las fotos de forma rápida y sencilla.\n- **📦 Archivar**: Almacene las fotos que no quiere ver en su línea de tiempo en una carpeta separada.\n- **⚡️ Rápida**: Memories es extremadamente rápida.\n\n## 🌐 Demostración en línea\n\n- Para tener una idea de como se siente y se vé Memories, compruebe la [demostración pública](https://memories-demo.radialapps.com/apps/memories/). \n- Tenga en cuenta que la demostración es de sólo lectura y podría ser lenta (se ejecuta en una VM en la nube de la capa gratuita de [Oracle Cloud](https://www.oracle.com/cloud/free/)). \n- Los créditos de las fotos son para [Unsplash](https://unsplash.com/) (para créditos individuales, refiérase a cada carpeta).\n\n## 🚀 Instalación\n\n1. Instale la aplicación desde la tienda de Nextcloud.\n2. Ejecute los [pasos recomendados de configuración](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n3. Ejecute `php ./occ memories:index` para generar los índices de metadatos para las fotos existentes.\n4. Abra la aplicación 📷 Memories en Nextcloud y especifique la carpeta que contiene sus fotos.", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Memories\n\nMemories es una solución con *baterías incluídas* para gestión de fotos en Nextcloud con algunas características avanzadas, incluyendo:\n\n- **📸 Línea de tiempo**: Organice fotos y videos por fecha, analizadas desde los datos Exif.\n- **⏪ Rebobinar**: Navegue a cualquier momento del pasado instantáneamente y reviva sus memorias.\n- **🤖 Etiquetado IA**: Agrupe fotos por persona y objetos utilizando IA, aprovechando las capacidades de la aplicación [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Álbumes**: Cree álbumes para agrupar fotos y videos en conjunto. Podrá entonces compartir estos álbumes con otros.\n **🫱🏻🫲🏻 Compartir externamente**: Comparta fotos y videos con personas fuera de su instancia Nextcloud.\n-- **📱 Soporte a Móviles**: Funciona con dispositivos de cualquier tamaño y forma a través de la aplicación web.\n- **✏️ Editar Metadatos**: Edite las fechas en las fotos de forma rápida y sencilla.\n- **📦 Archivar**: Almacene las fotos que no quiere ver en su línea de tiempo en una carpeta separada.\n- **📹 Conversión de video**: Memories convierte entre formatos de video y utiliza HLS para máximo rendimiento.\n- **⚡️ Rápida**: En general, Memories es extremadamente rápida.\n\n## 🌐 Demostración en línea\n\n- Para tener una idea de como se siente y se vé Memories, compruebe la [demostración pública](https://memories-demo.radialapps.com/apps/memories/). \n- Tenga en cuenta que la demostración es de sólo lectura y podría ser lenta (se ejecuta en una VM en la nube de la capa gratuita de [Oracle Cloud](https://www.oracle.com/cloud/free/)). \n- Los créditos de las fotos son para [Unsplash](https://unsplash.com/) (para créditos individuales, refiérase a cada carpeta).\n\n## 🚀 Instalación\n\n1. Instale la aplicación desde la tienda de Nextcloud.\n2. Ejecute los [pasos recomendados de configuración](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n3. Ejecute `php ./occ memories:index` para generar los índices de metadatos para las fotos existentes.\n4. Abra la aplicación 📷 Memories en Nextcloud y especifique la carpeta que contiene sus fotos.", + "Settings" : "Ajustes", "Timeline" : "Línea de tiempo", "Folders" : "Carpetas", "Favorites" : "Favoritos", @@ -12,7 +13,7 @@ "On this day" : "En este día", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "EXIF" : "EXIF", "A better photos experience awaits you" : "Una mejor experiencia de fotos te espera", "Choose the root folder of your timeline to begin" : "Escoja la carpeta raíz de su línea de tiempo para comenzar", "If you just installed Memories, run:" : "Si acaba de instalar Memories, ejecute:", @@ -23,6 +24,14 @@ "Choose the root of your timeline" : "Seleccione la raíz de su línea de tiempo", "The selected folder does not seem to be valid. Try again." : "La carpeta seleccionada no parece ser válida. Intente de nuevo.", "Found {total} photos in {path}" : "Se encontraron {total} fotos en {path}", + "Failed to get Exif data. Metadata may be lost!" : "Fallo al obtener los datos Exif. ¡Podrían haberse perdido los metadatos!", + "No Exif data found! Continue?" : "¡No se encontraron datos Exif!, ¿Continuar?", + "Image saved successfully" : "La imagen se guardó exitósamente", + "Error saving image" : "Error guardando imágen", + "Unsaved changes" : "Cambios sin guardar", + "Drop changes" : "Descartar cambios", + "Edit" : "Editar", + "Loading …" : "Cargando …", "Cancel" : "Cancelar", "Delete" : "Eliminar", "Remove from album" : "Quitar del álbum", @@ -43,10 +52,14 @@ "Folders Path" : "Ruta a las carpetas", "Show hidden folders" : "Mostrar carpetas ocultas", "Square grid mode" : "Modo de rejilla cuadrada", + "Choose Timeline Paths" : "Escoga las rutas a la línea de tiempo", "Choose the root for the folders view" : "Seleccione la raíz de la vista de carpetas", "Your Timeline" : "Su línea de tiempo", "Failed to load some photos" : "Fallo al cargar algunas fotos", + "Share" : "Compartir", "Sidebar" : "Barra lateral", + "Video sharing not supported yet" : "Compartir videos no es soportado todavía", + "Cannot share this type of data" : "No se puede compartir este tipo de datos", "Processing … {n}/{m}" : "Procesando ... {n}/{m}", "{n} photos added to album" : "Se agregaron {n} fotos al álbum", "Search for collaborators" : "Buscar colaboradores", @@ -103,7 +116,6 @@ "Rename person" : "Renombrar persona", "Update" : "Actualizar", "Failed to rename {oldName} to {name}." : "Fallo al renombrar {oldName} a {name}", - "Loading …" : "Cargando …", "Merge {name} with person" : "Unir {name} con persona", "Are you sure you want to merge {name} with {newName}?" : "¿Está seguro de quiere unir {name} con {newName}?", "Too many failures, aborting" : "Demasiados fallos, abortando", @@ -116,6 +128,9 @@ "Use the sidebar to share this folder." : "Utilice la barra lateral para compartir esta carpeta.", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Si crea un enlace público de compartición, haga click en refrescar y se mostrará abajo el enlace correspondiente a Memories.", "Refresh" : "Actualizar", + "Remove" : "Quitar", + "Add Path" : "Añadir ruta", + "Add a root to your timeline" : "Añadir una raíz a su línea de tiempo", "Share album" : "Compartir álbum", "Delete album" : "Eliminar álbum", "Merge with different person" : "Unir con una persona diferente", @@ -123,6 +138,92 @@ "Share folder" : "Compartir carpeta", "Move left" : "Mover a la izquierda", "Move right" : "Mover a la derecha", + "Save as" : "Guardar como", + "Reset" : "Restablecer", + "All changes will be lost." : "Todos los cambios se perderán.", + "Are you sure you want to continue?" : "¿Está seguro que desea continuar?", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Redo" : "Rehacer", + "Show original image" : "Mostrar mensaje original", + "Zoom in" : "Acercar", + "Zoom out" : "Alejar", + "Toggle zoom menu" : "Conmutar menú de zoom", + "Adjust" : "Ajustar", + "Fine-tune" : "Entonar", + "Filters" : "Filtros", + "Watermark" : "Marca de agua", + "Draw" : "Dibujar", + "Resize" : "Redimensionar", + "Invalid image." : "Imágen inválida", + "Error while uploading the image." : "Se encontró un error al cargar la imagen.", + "are not images" : "no son imágenes", + "is not an image" : "no es una imágen", + "to be uploaded" : "a cargar", + "Crop" : "Recortar", + "Original" : "Original", + "Custom" : "Personalizado", + "Square" : "Cuadrado", + "Landscape" : "Paisaje", + "Portrait" : "Retrato", + "Ellipse" : "Elipse", + "Classic TV" : "TV clásica", + "CinemaScope" : "CinemaScope", + "Arrow" : "Flecha", + "Blur" : "Difuminar", + "Brightness" : "Brillo", + "Contrast" : "Contraste", + "Un-flip X" : "Revertir voltear X", + "Flip X" : "Voltear X", + "Un-flip Y" : "Revertir voltear Y", + "Flip Y" : "Voltear Y", + "HSV" : "HSV", + "Hue" : "Tone", + "Saturation" : "Saturación", + "Value" : "Valor", + "Image" : "Imagen", + "Importing …" : "Importando ...", + "+ Add image" : "+ Añadir imágen", + "Line" : "Línea", + "Pen" : "Pluma", + "Polygon" : "Polígono", + "Sides" : "Lados", + "Rectangle" : "Rectángulo", + "Corner Radius" : "Radio de esquina", + "Width in pixels" : "Ancho en píxeles", + "Height in pixels" : "Altura en píxeles", + "Toggle ratio lock" : "Conmutar bloqueo de proporción", + "Reset to original image size" : "Reajustar a tamaño original de la imágen", + "Rotate" : "Rotar", + "Text" : "Texto", + "Text spacing" : "Espacio del texto", + "Text alignment" : "Alineación del texto", + "Font family" : "Familia de fuente", + "Size" : "Tamaño", + "Letter spacing" : "Espacio entre letras", + "Line height" : "Altura de línea", + "Warmth" : "Calidez", + "+ Add watermark" : "+ Añadir marca de agua", + "Choose watermark type" : "Seleccione el tipo de marca de agua", + "Upload watermark" : "Cargar marca de agua", + "Add as text" : "Añadir como texto", + "Padding" : "Desplazamiento", + "Shadow" : "Sombra", + "Horizontal" : "Horizontal", + "Vertical" : "Vertical", + "Opacity" : "Opacidad", + "Position" : "Posición", + "Stroke" : "Trazo", + "Save image as" : "Guardar imagen como", + "Extension" : "Extensión", + "Name is required." : "Se requiere Nombre.", + "Quality" : "Calidad", + "Saved image size (width x height)" : "Tamaño de la imagen guardada (anchura x altura)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Tenga en cuenta que el área a recortar es menor al redimensionamiento aplicado lo que puede causar pérdida de calidad", + "Actual size (100%)" : "Tamaño actual (100%)", + "Fit size" : "Ajustar tamaño", + "Transcoding failed." : "Falló el transcoding", + "Auto" : "Auto", "Shared Folder" : "Carpeta compartida", "Failed to create {albumName}." : "Fallo al crear {albumName}", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Fallo al renombrar {currentAlbumName} a {newAlbumName}.", diff --git a/l10n/es_419.js b/l10n/es_419.js index 4b50b7e7..ec053a73 100644 --- a/l10n/es_419.js +++ b/l10n/es_419.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -22,6 +25,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restaurar", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_419.json b/l10n/es_419.json index b5bc3af9..97fe40e3 100644 --- a/l10n/es_419.json +++ b/l10n/es_419.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -20,6 +23,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restaurar", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_AR.js b/l10n/es_AR.js index aac115e4..dcb5f0a9 100644 --- a/l10n/es_AR.js +++ b/l10n/es_AR.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", @@ -8,13 +9,15 @@ OC.L10N.register( "On this day" : "En este día", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "Edit" : "Editar", + "Loading …" : "Cargando …", "Cancel" : "Cancelar", "Delete" : "Eliminar", "Download" : "Descargar", "Favorite" : "Favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Copy public link" : "Copiar link publico", "Back" : "Atrás", "Save" : "Guardar", @@ -24,7 +27,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Loading …" : "Cargando …", - "Refresh" : "Recargar" + "Refresh" : "Recargar", + "Remove" : "Borrar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_AR.json b/l10n/es_AR.json index e9cc7aa7..dbb01598 100644 --- a/l10n/es_AR.json +++ b/l10n/es_AR.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", @@ -6,13 +7,15 @@ "On this day" : "En este día", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "Edit" : "Editar", + "Loading …" : "Cargando …", "Cancel" : "Cancelar", "Delete" : "Eliminar", "Download" : "Descargar", "Favorite" : "Favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Copy public link" : "Copiar link publico", "Back" : "Atrás", "Save" : "Guardar", @@ -22,7 +25,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Loading …" : "Cargando …", - "Refresh" : "Recargar" + "Refresh" : "Recargar", + "Remove" : "Borrar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_CL.js b/l10n/es_CL.js index a873290a..255ef414 100644 --- a/l10n/es_CL.js +++ b/l10n/es_CL.js @@ -1,19 +1,23 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", + "Loading …" : "Cargando …", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -23,7 +27,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Loading …" : "Cargando …", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_CL.json b/l10n/es_CL.json index 65431a10..3fc1c534 100644 --- a/l10n/es_CL.json +++ b/l10n/es_CL.json @@ -1,17 +1,21 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", + "Loading …" : "Cargando …", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -21,7 +25,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Loading …" : "Cargando …", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_CO.js b/l10n/es_CO.js index bab00dfe..b6978230 100644 --- a/l10n/es_CO.js +++ b/l10n/es_CO.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -23,6 +26,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Reiniciar", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_CO.json b/l10n/es_CO.json index 7beed7c8..a97d797a 100644 --- a/l10n/es_CO.json +++ b/l10n/es_CO.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -21,6 +24,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Reiniciar", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_CR.js b/l10n/es_CR.js index bab00dfe..98feb706 100644 --- a/l10n/es_CR.js +++ b/l10n/es_CR.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -23,6 +26,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_CR.json b/l10n/es_CR.json index 7beed7c8..78039437 100644 --- a/l10n/es_CR.json +++ b/l10n/es_CR.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -21,6 +24,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_DO.js b/l10n/es_DO.js index bab00dfe..98feb706 100644 --- a/l10n/es_DO.js +++ b/l10n/es_DO.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -23,6 +26,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_DO.json b/l10n/es_DO.json index 7beed7c8..78039437 100644 --- a/l10n/es_DO.json +++ b/l10n/es_DO.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -21,6 +24,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_EC.js b/l10n/es_EC.js index a1353d0f..4e7075e8 100644 --- a/l10n/es_EC.js +++ b/l10n/es_EC.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -23,6 +26,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_EC.json b/l10n/es_EC.json index 22348969..57cf5aca 100644 --- a/l10n/es_EC.json +++ b/l10n/es_EC.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -21,6 +24,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_GT.js b/l10n/es_GT.js index 32d89939..78bf6f77 100644 --- a/l10n/es_GT.js +++ b/l10n/es_GT.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -23,6 +26,16 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición", + "Auto" : "Auto" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_GT.json b/l10n/es_GT.json index a51af3cd..a195612f 100644 --- a/l10n/es_GT.json +++ b/l10n/es_GT.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -21,6 +24,16 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición", + "Auto" : "Auto" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_HN.js b/l10n/es_HN.js index bab00dfe..98feb706 100644 --- a/l10n/es_HN.js +++ b/l10n/es_HN.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -23,6 +26,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_HN.json b/l10n/es_HN.json index 7beed7c8..78039437 100644 --- a/l10n/es_HN.json +++ b/l10n/es_HN.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -21,6 +24,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_MX.js b/l10n/es_MX.js index b60dbd59..db6dc122 100644 --- a/l10n/es_MX.js +++ b/l10n/es_MX.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Eliminar", "Download" : "Descargar", "Favorite" : "Marcar como favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Copy public link" : "Copiar enlace público", "Public link" : "Liga pública", "Back" : "Atrás", @@ -24,6 +27,17 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Reiniciar", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Redo" : "Rehacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición", + "Name is required." : "Nombre es requerido." }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_MX.json b/l10n/es_MX.json index 7d438695..5cc06742 100644 --- a/l10n/es_MX.json +++ b/l10n/es_MX.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Eliminar", "Download" : "Descargar", "Favorite" : "Marcar como favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Copy public link" : "Copiar enlace público", "Public link" : "Liga pública", "Back" : "Atrás", @@ -22,6 +25,17 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Reiniciar", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Redo" : "Rehacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición", + "Name is required." : "Nombre es requerido." },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_NI.js b/l10n/es_NI.js index 34f53ff0..f12d5960 100644 --- a/l10n/es_NI.js +++ b/l10n/es_NI.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -22,6 +25,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_NI.json b/l10n/es_NI.json index cbd2d701..35337f74 100644 --- a/l10n/es_NI.json +++ b/l10n/es_NI.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -20,6 +23,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_PA.js b/l10n/es_PA.js index 34f53ff0..f12d5960 100644 --- a/l10n/es_PA.js +++ b/l10n/es_PA.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -22,6 +25,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_PA.json b/l10n/es_PA.json index cbd2d701..35337f74 100644 --- a/l10n/es_PA.json +++ b/l10n/es_PA.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -20,6 +23,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_PE.js b/l10n/es_PE.js index 4b50b7e7..d093dbf5 100644 --- a/l10n/es_PE.js +++ b/l10n/es_PE.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -22,6 +25,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_PE.json b/l10n/es_PE.json index b5bc3af9..583ca914 100644 --- a/l10n/es_PE.json +++ b/l10n/es_PE.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Ajustes", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Ajustes", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -20,6 +23,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_PR.js b/l10n/es_PR.js index 34f53ff0..f12d5960 100644 --- a/l10n/es_PR.js +++ b/l10n/es_PR.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -22,6 +25,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_PR.json b/l10n/es_PR.json index cbd2d701..35337f74 100644 --- a/l10n/es_PR.json +++ b/l10n/es_PR.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -20,6 +23,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_PY.js b/l10n/es_PY.js index 34f53ff0..f12d5960 100644 --- a/l10n/es_PY.js +++ b/l10n/es_PY.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -22,6 +25,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_PY.json b/l10n/es_PY.json index cbd2d701..35337f74 100644 --- a/l10n/es_PY.json +++ b/l10n/es_PY.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -20,6 +23,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_SV.js b/l10n/es_SV.js index bab00dfe..98feb706 100644 --- a/l10n/es_SV.js +++ b/l10n/es_SV.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -23,6 +26,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_SV.json b/l10n/es_SV.json index 7beed7c8..78039437 100644 --- a/l10n/es_SV.json +++ b/l10n/es_SV.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Public link" : "Liga pública", "Back" : "Atrás", "Save" : "Guardar", @@ -21,6 +24,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/es_UY.js b/l10n/es_UY.js index 34f53ff0..f12d5960 100644 --- a/l10n/es_UY.js +++ b/l10n/es_UY.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -22,6 +25,15 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/es_UY.json b/l10n/es_UY.json index cbd2d701..35337f74 100644 --- a/l10n/es_UY.json +++ b/l10n/es_UY.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Configuraciones ", "Folders" : "Carpetas", "Favorites" : "Favoritos", "Videos" : "Videos", "Archive" : "Archivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configuraciones ", + "Unsaved changes" : "Cambios no guardados", + "Edit" : "Editar", "Cancel" : "Cancelar", "Delete" : "Borrar", "Download" : "Descargar", "Favorite" : "Hacer favorito", "Unarchive" : "Desarchivar", "View in folder" : "Ver en la carpeta", + "Share" : "Compartir", "Back" : "Atrás", "Save" : "Guardar", "Month" : "Mes", @@ -20,6 +23,15 @@ "Hour" : "Hora", "Name" : "Nombre", "Update" : "Actualizar", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Eliminar", + "Reset" : "Restablecer", + "Continue" : "Continuar", + "Undo" : "Deshacer", + "Custom" : "Personalizado", + "Value" : "Valor", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posición" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/et_EE.js b/l10n/et_EE.js index 3ac3b3b3..83cc3814 100644 --- a/l10n/et_EE.js +++ b/l10n/et_EE.js @@ -1,18 +1,21 @@ OC.L10N.register( "memories", { + "Settings" : "Seaded", "Folders" : "Kaustad", "Favorites" : "Lemmikud", "Videos" : "Videod", "Archive" : "Arhiiv", "Tags" : "Sildid", "Maps" : "Kaardid", - "Settings" : "Seaded", + "Unsaved changes" : "Salvestamata muutused", + "Edit" : "Redigeeri", "Cancel" : "Loobu", "Delete" : "Kustuta", "Download" : "Lae alla", "Favorite" : "Lemmik", "View in folder" : "Vaata kaustas", + "Share" : "Jaga", "Copy public link" : "Kopeeri avalik link", "Public link" : "Avalik link", "Back" : "Tagasi", @@ -23,6 +26,12 @@ OC.L10N.register( "Hour" : "Tund", "Name" : "Nimi", "Update" : "Uuenda", - "Refresh" : "Värskenda" + "Refresh" : "Värskenda", + "Remove" : "Eemalda", + "Reset" : "Lähtesta", + "Continue" : "Jätka", + "Custom" : "Kohandatud", + "Size" : "Suurus", + "Position" : "Asukoht" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/et_EE.json b/l10n/et_EE.json index f6bc164a..a29dccc9 100644 --- a/l10n/et_EE.json +++ b/l10n/et_EE.json @@ -1,16 +1,19 @@ { "translations": { + "Settings" : "Seaded", "Folders" : "Kaustad", "Favorites" : "Lemmikud", "Videos" : "Videod", "Archive" : "Arhiiv", "Tags" : "Sildid", "Maps" : "Kaardid", - "Settings" : "Seaded", + "Unsaved changes" : "Salvestamata muutused", + "Edit" : "Redigeeri", "Cancel" : "Loobu", "Delete" : "Kustuta", "Download" : "Lae alla", "Favorite" : "Lemmik", "View in folder" : "Vaata kaustas", + "Share" : "Jaga", "Copy public link" : "Kopeeri avalik link", "Public link" : "Avalik link", "Back" : "Tagasi", @@ -21,6 +24,12 @@ "Hour" : "Tund", "Name" : "Nimi", "Update" : "Uuenda", - "Refresh" : "Värskenda" + "Refresh" : "Värskenda", + "Remove" : "Eemalda", + "Reset" : "Lähtesta", + "Continue" : "Jätka", + "Custom" : "Kohandatud", + "Size" : "Suurus", + "Position" : "Asukoht" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/eu.js b/l10n/eu.js index 7fa11022..ba5df9a7 100644 --- a/l10n/eu.js +++ b/l10n/eu.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Memoriak", "Yet another photo management app" : "Beste argazki kudeatze aplikazio bat", + "Settings" : "Ezarpenak", "Timeline" : "Denbora-lerroa", "Folders" : "Karpetak", "Favorites" : "Gogokoak", @@ -13,7 +14,11 @@ OC.L10N.register( "On this day" : "Egun honetan", "Tags" : "Etiketak", "Maps" : "Mapak", - "Settings" : "Ezarpenak", + "Error saving image" : "Errorea irudia gordetzean", + "Unsaved changes" : "Gorde gabeko aldaketak", + "Drop changes" : "Jaregin aldaketak", + "Edit" : "Aldatu", + "Loading …" : "Kargatzen …", "Cancel" : "Utzi", "Delete" : "Ezabatu", "Download" : "Deskargatu", @@ -31,6 +36,7 @@ OC.L10N.register( "Show hidden folders" : "Erakutsi ezkutuko karpetak", "Your Timeline" : "Zure denbora-lerroa", "Failed to load some photos" : "Argazki batzuk kargatzeak huts egin du", + "Share" : "Partekatu", "Sidebar" : "Alboko barra", "Processing … {n}/{m}" : "Prozesatzen ... {n}/{m}", "Search for collaborators" : "Bilatu kolaboratzaileak", @@ -81,12 +87,97 @@ OC.L10N.register( "Name" : "Izena", "Rename person" : "Berridatzi pertsonaren izena", "Update" : "Eguneratu", - "Loading …" : "Kargatzen …", "Failed to move {name}." : "{name} mugitzeak huts egin du.", "Refresh" : "Freskatu", + "Remove" : "Kendu", "Delete album" : "Ezabatu albuma", "Merge with different person" : "Bateratu beste pertsona batekin", "Share folder" : "Partekatu karpeta", + "Save as" : "Gorde honela", + "Reset" : "Berrezarri", + "All changes will be lost." : "Aldaketa guztiak galduko dira.", + "Are you sure you want to continue?" : "Ziur zaude jarraitu nahi duzula?", + "Continue" : "Jarraitu", + "Undo" : "Desegin", + "Redo" : "Berregin", + "Show original image" : "Erakutsi jatorrizko irudia", + "Zoom in" : "Hurbildu", + "Zoom out" : "Txikiagotu", + "Toggle zoom menu" : "Aldatu zoom menua", + "Adjust" : "Egokitu", + "Fine-tune" : "Doitu", + "Filters" : "Iragazkiak", + "Watermark" : "Ur-marka", + "Draw" : "Margotu", + "Resize" : "Tamaina aldatu", + "Invalid image." : "Irudi baliogabea.", + "Error while uploading the image." : "Errorea irudia kargatzean.", + "are not images" : "ez da irudirik", + "is not an image" : "ez da irudi bat", + "to be uploaded" : "igotzeko", + "Crop" : "Moztu", + "Original" : "Jatorrizkoa", + "Custom" : "Pertsonalizatua", + "Square" : "Karratua", + "Landscape" : "Paisaia", + "Portrait" : "Erretratua", + "Ellipse" : "Elipsea", + "Classic TV" : "Telebista klasikoa", + "CinemaScope" : "CinemaScope", + "Arrow" : "Gezia", + "Blur" : "Lausotu", + "Brightness" : "Distira", + "Contrast" : "Kontrastea", + "Un-flip X" : "Desegin X irauli", + "Flip X" : "Irauli X", + "Un-flip Y" : "Desegin Y irauli", + "Flip Y" : "Irauli Y", + "HSV" : "HSV", + "Hue" : "Ñabardura", + "Saturation" : "Saturazioa", + "Value" : "Balioa", + "Image" : "Irudia", + "Importing …" : "Inportatzen ...", + "+ Add image" : "+ Gehitu irudia", + "Line" : "Lerro", + "Pen" : "Boligrafoa", + "Polygon" : "Poligonoa", + "Sides" : "Aldeak", + "Rectangle" : "Laukizuzena", + "Corner Radius" : "Izkinako erradioa", + "Width in pixels" : "Zabalera pixeletan", + "Height in pixels" : "Altuera pixeletan", + "Toggle ratio lock" : "Etengabeko erlazioaren blokeoa", + "Reset to original image size" : "Berrezarri jatorrizko irudiaren tamainara", + "Rotate" : "Biratu", + "Text" : "Testua", + "Text spacing" : "Testu-tarteak", + "Text alignment" : "Testuaren lerrokatzea", + "Font family" : "Letra-tipoen familia", + "Size" : "Tamaina", + "Letter spacing" : "Letren tartea", + "Line height" : "Lerroaren altuera", + "Warmth" : "Epeltasuna", + "+ Add watermark" : "+ Gehitu ur-marka", + "Choose watermark type" : "Aukeratu ur-marka mota", + "Upload watermark" : "Kargatu ur-marka", + "Add as text" : "Gehitu testu gisa", + "Padding" : "Betegarria", + "Shadow" : "Itzala", + "Horizontal" : "Horizontala", + "Vertical" : "Bertikala", + "Opacity" : "Opakotasuna", + "Position" : "Kokalekua", + "Stroke" : "Trazua", + "Save image as" : "Gorde irudia honela:", + "Extension" : "Hedapena", + "Name is required." : "Izena beharrezkoa da", + "Quality" : "Kalitatea", + "Saved image size (width x height)" : "Gordetako irudiaren tamaina (zabalera x altuera)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Kontuan izan hautatutako mozte-eremua aplikatutako tamaina baino txikiagoa dela eta horrek kalitatea gutxitzea eragin dezakeela", + "Actual size (100%)" : "Benetako tamaina (% 100)", + "Fit size" : "Egokitu tamaina", + "Auto" : "Auto", "Failed to create {albumName}." : "Ezin izan da {albumName} sortu.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Ezin izan da {currentAlbumName} berrizendatu {newAlbumName} gisa.", "General Failure" : "Hutsegite orokorra", diff --git a/l10n/eu.json b/l10n/eu.json index 5ea2b3d2..c7c26795 100644 --- a/l10n/eu.json +++ b/l10n/eu.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Memoriak", "Yet another photo management app" : "Beste argazki kudeatze aplikazio bat", + "Settings" : "Ezarpenak", "Timeline" : "Denbora-lerroa", "Folders" : "Karpetak", "Favorites" : "Gogokoak", @@ -11,7 +12,11 @@ "On this day" : "Egun honetan", "Tags" : "Etiketak", "Maps" : "Mapak", - "Settings" : "Ezarpenak", + "Error saving image" : "Errorea irudia gordetzean", + "Unsaved changes" : "Gorde gabeko aldaketak", + "Drop changes" : "Jaregin aldaketak", + "Edit" : "Aldatu", + "Loading …" : "Kargatzen …", "Cancel" : "Utzi", "Delete" : "Ezabatu", "Download" : "Deskargatu", @@ -29,6 +34,7 @@ "Show hidden folders" : "Erakutsi ezkutuko karpetak", "Your Timeline" : "Zure denbora-lerroa", "Failed to load some photos" : "Argazki batzuk kargatzeak huts egin du", + "Share" : "Partekatu", "Sidebar" : "Alboko barra", "Processing … {n}/{m}" : "Prozesatzen ... {n}/{m}", "Search for collaborators" : "Bilatu kolaboratzaileak", @@ -79,12 +85,97 @@ "Name" : "Izena", "Rename person" : "Berridatzi pertsonaren izena", "Update" : "Eguneratu", - "Loading …" : "Kargatzen …", "Failed to move {name}." : "{name} mugitzeak huts egin du.", "Refresh" : "Freskatu", + "Remove" : "Kendu", "Delete album" : "Ezabatu albuma", "Merge with different person" : "Bateratu beste pertsona batekin", "Share folder" : "Partekatu karpeta", + "Save as" : "Gorde honela", + "Reset" : "Berrezarri", + "All changes will be lost." : "Aldaketa guztiak galduko dira.", + "Are you sure you want to continue?" : "Ziur zaude jarraitu nahi duzula?", + "Continue" : "Jarraitu", + "Undo" : "Desegin", + "Redo" : "Berregin", + "Show original image" : "Erakutsi jatorrizko irudia", + "Zoom in" : "Hurbildu", + "Zoom out" : "Txikiagotu", + "Toggle zoom menu" : "Aldatu zoom menua", + "Adjust" : "Egokitu", + "Fine-tune" : "Doitu", + "Filters" : "Iragazkiak", + "Watermark" : "Ur-marka", + "Draw" : "Margotu", + "Resize" : "Tamaina aldatu", + "Invalid image." : "Irudi baliogabea.", + "Error while uploading the image." : "Errorea irudia kargatzean.", + "are not images" : "ez da irudirik", + "is not an image" : "ez da irudi bat", + "to be uploaded" : "igotzeko", + "Crop" : "Moztu", + "Original" : "Jatorrizkoa", + "Custom" : "Pertsonalizatua", + "Square" : "Karratua", + "Landscape" : "Paisaia", + "Portrait" : "Erretratua", + "Ellipse" : "Elipsea", + "Classic TV" : "Telebista klasikoa", + "CinemaScope" : "CinemaScope", + "Arrow" : "Gezia", + "Blur" : "Lausotu", + "Brightness" : "Distira", + "Contrast" : "Kontrastea", + "Un-flip X" : "Desegin X irauli", + "Flip X" : "Irauli X", + "Un-flip Y" : "Desegin Y irauli", + "Flip Y" : "Irauli Y", + "HSV" : "HSV", + "Hue" : "Ñabardura", + "Saturation" : "Saturazioa", + "Value" : "Balioa", + "Image" : "Irudia", + "Importing …" : "Inportatzen ...", + "+ Add image" : "+ Gehitu irudia", + "Line" : "Lerro", + "Pen" : "Boligrafoa", + "Polygon" : "Poligonoa", + "Sides" : "Aldeak", + "Rectangle" : "Laukizuzena", + "Corner Radius" : "Izkinako erradioa", + "Width in pixels" : "Zabalera pixeletan", + "Height in pixels" : "Altuera pixeletan", + "Toggle ratio lock" : "Etengabeko erlazioaren blokeoa", + "Reset to original image size" : "Berrezarri jatorrizko irudiaren tamainara", + "Rotate" : "Biratu", + "Text" : "Testua", + "Text spacing" : "Testu-tarteak", + "Text alignment" : "Testuaren lerrokatzea", + "Font family" : "Letra-tipoen familia", + "Size" : "Tamaina", + "Letter spacing" : "Letren tartea", + "Line height" : "Lerroaren altuera", + "Warmth" : "Epeltasuna", + "+ Add watermark" : "+ Gehitu ur-marka", + "Choose watermark type" : "Aukeratu ur-marka mota", + "Upload watermark" : "Kargatu ur-marka", + "Add as text" : "Gehitu testu gisa", + "Padding" : "Betegarria", + "Shadow" : "Itzala", + "Horizontal" : "Horizontala", + "Vertical" : "Bertikala", + "Opacity" : "Opakotasuna", + "Position" : "Kokalekua", + "Stroke" : "Trazua", + "Save image as" : "Gorde irudia honela:", + "Extension" : "Hedapena", + "Name is required." : "Izena beharrezkoa da", + "Quality" : "Kalitatea", + "Saved image size (width x height)" : "Gordetako irudiaren tamaina (zabalera x altuera)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Kontuan izan hautatutako mozte-eremua aplikatutako tamaina baino txikiagoa dela eta horrek kalitatea gutxitzea eragin dezakeela", + "Actual size (100%)" : "Benetako tamaina (% 100)", + "Fit size" : "Egokitu tamaina", + "Auto" : "Auto", "Failed to create {albumName}." : "Ezin izan da {albumName} sortu.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Ezin izan da {currentAlbumName} berrizendatu {newAlbumName} gisa.", "General Failure" : "Hutsegite orokorra", diff --git a/l10n/fa.js b/l10n/fa.js index 33659f6c..a92e4e09 100644 --- a/l10n/fa.js +++ b/l10n/fa.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "تنظیمات", "Timeline" : "خط زمانی", "Folders" : "پوشه ها", "Favorites" : "مورد علاقهها", @@ -9,12 +10,14 @@ OC.L10N.register( "Archive" : "بایگانی", "Tags" : "برچسب ها", "Maps" : "نقشهها", - "Settings" : "تنظیمات", + "Edit" : "ویرایش", + "Loading …" : "بارگذاری …", "Cancel" : "لغو", "Delete" : "حذف", "Download" : "بارگیری", "Favorite" : "مورد علاقه", "View in folder" : "مشاهده در پوشه", + "Share" : "همرسانی", "Copy public link" : "پیوند عمومی را کپی کنید", "Public link" : "پیوند عمومی", "Back" : "بازگشت", @@ -25,8 +28,17 @@ OC.L10N.register( "Time" : "زمان", "Name" : "نام", "Update" : "یهروزرسانی", - "Loading …" : "بارگذاری …", "Refresh" : "تازهسازی", - "Share folder" : "اشتراکگذاری پوشه" + "Remove" : "حذف", + "Share folder" : "اشتراکگذاری پوشه", + "Reset" : "بازنشاندن", + "Continue" : "ادامه دادن", + "Undo" : "برگرداندن", + "Original" : "اصلی", + "Value" : "مقدار", + "Text" : "متن", + "Size" : "اندازه", + "Extension" : "گسترش", + "Auto" : "خودکار" }, "nplurals=2; plural=(n > 1);"); diff --git a/l10n/fa.json b/l10n/fa.json index 1001454c..daddd426 100644 --- a/l10n/fa.json +++ b/l10n/fa.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "تنظیمات", "Timeline" : "خط زمانی", "Folders" : "پوشه ها", "Favorites" : "مورد علاقهها", @@ -7,12 +8,14 @@ "Archive" : "بایگانی", "Tags" : "برچسب ها", "Maps" : "نقشهها", - "Settings" : "تنظیمات", + "Edit" : "ویرایش", + "Loading …" : "بارگذاری …", "Cancel" : "لغو", "Delete" : "حذف", "Download" : "بارگیری", "Favorite" : "مورد علاقه", "View in folder" : "مشاهده در پوشه", + "Share" : "همرسانی", "Copy public link" : "پیوند عمومی را کپی کنید", "Public link" : "پیوند عمومی", "Back" : "بازگشت", @@ -23,8 +26,17 @@ "Time" : "زمان", "Name" : "نام", "Update" : "یهروزرسانی", - "Loading …" : "بارگذاری …", "Refresh" : "تازهسازی", - "Share folder" : "اشتراکگذاری پوشه" + "Remove" : "حذف", + "Share folder" : "اشتراکگذاری پوشه", + "Reset" : "بازنشاندن", + "Continue" : "ادامه دادن", + "Undo" : "برگرداندن", + "Original" : "اصلی", + "Value" : "مقدار", + "Text" : "متن", + "Size" : "اندازه", + "Extension" : "گسترش", + "Auto" : "خودکار" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/l10n/fi.js b/l10n/fi.js index 873fcf17..8503f275 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Muistot", "Yet another photo management app" : "Vaihtoehtoinen sovellus valokuvien hallintaan", + "Settings" : "Asetukset", "Timeline" : "Aikajana", "Folders" : "Kansiot", "Favorites" : "Suosikit", @@ -13,7 +14,7 @@ OC.L10N.register( "On this day" : "Tänä päivänä", "Tags" : "Tunnisteet", "Maps" : "Kartat", - "Settings" : "Asetukset", + "A better photos experience awaits you" : "Parempi kuvakokemus odottaa sinua", "Choose the root folder of your timeline to begin" : "Valitse aikajanan juurihakemisto aloittaaksesi", "If you just installed Memories, run:" : "Jos olet juuri asentanut Muistot, suorita:", "Continue to Memories" : "Jatka Muistoihin", @@ -23,6 +24,10 @@ OC.L10N.register( "Choose the root of your timeline" : "Valitse aikajanan juurihakemisto", "The selected folder does not seem to be valid. Try again." : "Valittu hakemisto ei ole kelvollinen. Yritä uudelleen.", "Found {total} photos in {path}" : "{total} kuvaa löytyi polusta {path}", + "Error saving image" : "Virhe kuvaa tallentaessa", + "Unsaved changes" : "Tallentamattomia muutoksia", + "Edit" : "Muokkaa", + "Loading …" : "Ladataan…", "Cancel" : "Peruuta", "Delete" : "Poista", "Remove from album" : "Poista albumista", @@ -46,6 +51,7 @@ OC.L10N.register( "Choose the root for the folders view" : "Valitse kansionäkymän juurihakemisto", "Your Timeline" : "Aikajanasi", "Failed to load some photos" : "Joidenkin kuvien lataus epäonnistui", + "Share" : "Jaa", "Sidebar" : "Sivupalkki", "Processing … {n}/{m}" : "Käsitellään… {n}/{m}", "{n} photos added to album" : "{n} kuvaa lisätty albumiin", @@ -75,6 +81,7 @@ OC.L10N.register( "Create album" : "Luo albumi", "Add selection to album {albumName}" : "Lisää valinta albumiin {albumName}", "Create a new album." : "Luo uusi albumi.", + "_Share with %n user_::_Share with %n users_" : ["Jaa %n käyttäjän kanssa","Jaa %n käyttäjän kanssa"], "_%n item_::_%n items_" : ["%n kohde","%n kohdetta"], "Share Album" : "Jaa albumi", "Year" : "Vuosi", @@ -95,18 +102,64 @@ OC.L10N.register( "Rename person" : "Nimeä henkilö uudelleen", "Update" : "Päivitä", "Failed to rename {oldName} to {name}." : "Uudelleen nimeäminen nimestä {oldName} nimeen {name} epäonnistui.", - "Loading …" : "Ladataan…", "Too many failures, aborting" : "Liian monta epäonnistumista, lopetetaan", "Share Folder" : "Jaa kansio", "You cannot share the root folder" : "Et voi jakaa juurikansiota", "Use the sidebar to share this folder." : "Käytä sivupalkkia jakaaksesi tämän kansion.", "Refresh" : "Päivitä", + "Remove" : "Poista", "Share album" : "Jaa albumi", "Delete album" : "Poista albumi", "Merge with different person" : "Yhdistä toisen henkilön kanssa", "Share folder" : "Jaa kansio", "Move left" : "Siirry vasemmalle", "Move right" : "Siirry oikealle", + "Save as" : "Tallenna nimellä", + "Reset" : "Palauta", + "All changes will be lost." : "Kaikki muutokset menetetään.", + "Are you sure you want to continue?" : "Haluatko varmasti jatkaa?", + "Continue" : "Jatka", + "Undo" : "Kumoa", + "Redo" : "Tee uudelleen", + "Show original image" : "Näytä alkuperäinen kuva", + "Zoom in" : "Lähennä", + "Zoom out" : "Loitonna", + "Adjust" : "Säädä", + "Fine-tune" : "Hienosäädä", + "Filters" : "Suodattimet", + "Watermark" : "Vesileima", + "Resize" : "Muuta kokoa", + "Invalid image." : "Virheellinen kuva.", + "Crop" : "Rajaa", + "Original" : "Alkuperäinen", + "Custom" : "Omavalintainen", + "Landscape" : "Maisema", + "Portrait" : "Muotokuva", + "Blur" : "Sumennus", + "Brightness" : "Kirkkaus", + "Contrast" : "Kontrasti", + "Value" : "Arvo", + "Image" : "Kuva", + "Importing …" : "Tuodaan…", + "+ Add image" : "+ Lisää kuva", + "Line" : "Viiva", + "Width in pixels" : "Leveys kuvapisteinä", + "Height in pixels" : "Korkeus kuvapisteinä", + "Toggle ratio lock" : "Suhdelukitus päälle/pois", + "Rotate" : "Kierrä", + "Text" : "Teksti", + "Size" : "Koko", + "+ Add watermark" : "+ Lisää vesileima", + "Choose watermark type" : "Valitse vesileiman tyyppi", + "Upload watermark" : "Lähetä vesileima", + "Add as text" : "Lisää tekstinä", + "Position" : "Sijainti", + "Extension" : "Tiedostopääte", + "Name is required." : "Nimi vaaditaan.", + "Quality" : "Laatu", + "Actual size (100%)" : "Todellinen koko (100 %)", + "Fit size" : "Sovita koko", + "Auto" : "Automaattinen", "Shared Folder" : "Jaa kansio", "Failed to create {albumName}." : "Albumin {albumName} luominen epäonnistui.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Albumin {currentAlbumName} nimen muuttaminen muotoon {newAlbumName} epäonnistui.", diff --git a/l10n/fi.json b/l10n/fi.json index 9994d00d..f75d4fa7 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Muistot", "Yet another photo management app" : "Vaihtoehtoinen sovellus valokuvien hallintaan", + "Settings" : "Asetukset", "Timeline" : "Aikajana", "Folders" : "Kansiot", "Favorites" : "Suosikit", @@ -11,7 +12,7 @@ "On this day" : "Tänä päivänä", "Tags" : "Tunnisteet", "Maps" : "Kartat", - "Settings" : "Asetukset", + "A better photos experience awaits you" : "Parempi kuvakokemus odottaa sinua", "Choose the root folder of your timeline to begin" : "Valitse aikajanan juurihakemisto aloittaaksesi", "If you just installed Memories, run:" : "Jos olet juuri asentanut Muistot, suorita:", "Continue to Memories" : "Jatka Muistoihin", @@ -21,6 +22,10 @@ "Choose the root of your timeline" : "Valitse aikajanan juurihakemisto", "The selected folder does not seem to be valid. Try again." : "Valittu hakemisto ei ole kelvollinen. Yritä uudelleen.", "Found {total} photos in {path}" : "{total} kuvaa löytyi polusta {path}", + "Error saving image" : "Virhe kuvaa tallentaessa", + "Unsaved changes" : "Tallentamattomia muutoksia", + "Edit" : "Muokkaa", + "Loading …" : "Ladataan…", "Cancel" : "Peruuta", "Delete" : "Poista", "Remove from album" : "Poista albumista", @@ -44,6 +49,7 @@ "Choose the root for the folders view" : "Valitse kansionäkymän juurihakemisto", "Your Timeline" : "Aikajanasi", "Failed to load some photos" : "Joidenkin kuvien lataus epäonnistui", + "Share" : "Jaa", "Sidebar" : "Sivupalkki", "Processing … {n}/{m}" : "Käsitellään… {n}/{m}", "{n} photos added to album" : "{n} kuvaa lisätty albumiin", @@ -73,6 +79,7 @@ "Create album" : "Luo albumi", "Add selection to album {albumName}" : "Lisää valinta albumiin {albumName}", "Create a new album." : "Luo uusi albumi.", + "_Share with %n user_::_Share with %n users_" : ["Jaa %n käyttäjän kanssa","Jaa %n käyttäjän kanssa"], "_%n item_::_%n items_" : ["%n kohde","%n kohdetta"], "Share Album" : "Jaa albumi", "Year" : "Vuosi", @@ -93,18 +100,64 @@ "Rename person" : "Nimeä henkilö uudelleen", "Update" : "Päivitä", "Failed to rename {oldName} to {name}." : "Uudelleen nimeäminen nimestä {oldName} nimeen {name} epäonnistui.", - "Loading …" : "Ladataan…", "Too many failures, aborting" : "Liian monta epäonnistumista, lopetetaan", "Share Folder" : "Jaa kansio", "You cannot share the root folder" : "Et voi jakaa juurikansiota", "Use the sidebar to share this folder." : "Käytä sivupalkkia jakaaksesi tämän kansion.", "Refresh" : "Päivitä", + "Remove" : "Poista", "Share album" : "Jaa albumi", "Delete album" : "Poista albumi", "Merge with different person" : "Yhdistä toisen henkilön kanssa", "Share folder" : "Jaa kansio", "Move left" : "Siirry vasemmalle", "Move right" : "Siirry oikealle", + "Save as" : "Tallenna nimellä", + "Reset" : "Palauta", + "All changes will be lost." : "Kaikki muutokset menetetään.", + "Are you sure you want to continue?" : "Haluatko varmasti jatkaa?", + "Continue" : "Jatka", + "Undo" : "Kumoa", + "Redo" : "Tee uudelleen", + "Show original image" : "Näytä alkuperäinen kuva", + "Zoom in" : "Lähennä", + "Zoom out" : "Loitonna", + "Adjust" : "Säädä", + "Fine-tune" : "Hienosäädä", + "Filters" : "Suodattimet", + "Watermark" : "Vesileima", + "Resize" : "Muuta kokoa", + "Invalid image." : "Virheellinen kuva.", + "Crop" : "Rajaa", + "Original" : "Alkuperäinen", + "Custom" : "Omavalintainen", + "Landscape" : "Maisema", + "Portrait" : "Muotokuva", + "Blur" : "Sumennus", + "Brightness" : "Kirkkaus", + "Contrast" : "Kontrasti", + "Value" : "Arvo", + "Image" : "Kuva", + "Importing …" : "Tuodaan…", + "+ Add image" : "+ Lisää kuva", + "Line" : "Viiva", + "Width in pixels" : "Leveys kuvapisteinä", + "Height in pixels" : "Korkeus kuvapisteinä", + "Toggle ratio lock" : "Suhdelukitus päälle/pois", + "Rotate" : "Kierrä", + "Text" : "Teksti", + "Size" : "Koko", + "+ Add watermark" : "+ Lisää vesileima", + "Choose watermark type" : "Valitse vesileiman tyyppi", + "Upload watermark" : "Lähetä vesileima", + "Add as text" : "Lisää tekstinä", + "Position" : "Sijainti", + "Extension" : "Tiedostopääte", + "Name is required." : "Nimi vaaditaan.", + "Quality" : "Laatu", + "Actual size (100%)" : "Todellinen koko (100 %)", + "Fit size" : "Sovita koko", + "Auto" : "Automaattinen", "Shared Folder" : "Jaa kansio", "Failed to create {albumName}." : "Albumin {albumName} luominen epäonnistui.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Albumin {currentAlbumName} nimen muuttaminen muotoon {newAlbumName} epäonnistui.", diff --git a/l10n/fr.js b/l10n/fr.js index 73d05350..57cbb38a 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Souvenirs", "Yet another photo management app" : "Une nouvelle application de gestion des photos", + "Settings" : "Paramètres", "Timeline" : "Fil chronologique", "Folders" : "Dossiers", "Favorites" : "Favoris", @@ -13,7 +14,20 @@ OC.L10N.register( "On this day" : "Ce même jour", "Tags" : "Étiquettes", "Maps" : "Cartes", - "Settings" : "Paramètres", + "Choose the root folder of your timeline to begin" : "Choisissez le dossier racine de votre fil chronologique pour commencer", + "If you just installed Memories, run:" : "Si vous venez d'installer Souvenirs, exécuter :", + "Continue to Memories" : "Continuer vers Souvenirs", + "Choose again" : "Choisir à nouveau", + "Click here to start" : "Cliquer ici pour commencer", + "You can always change this later in settings" : "Vous pouvez toujours changer cela ultérieurement dans les paramètres", + "Choose the root of your timeline" : "Choisissez le début de votre fil chronologique", + "The selected folder does not seem to be valid. Try again." : "Le dossier sélectionné ne semble pas être valide. Essayer à nouveau.", + "Image saved successfully" : "Image enregistrée avec succès", + "Error saving image" : "Erreur lors de l'enregistrement de l'image", + "Unsaved changes" : "Modifications non enregistrées", + "Drop changes" : "Abandonner les changements", + "Edit" : "Modifier", + "Loading …" : "Chargement …", "Cancel" : "Annuler", "Delete" : "Supprimer", "Download" : "Télécharger", @@ -22,15 +36,22 @@ OC.L10N.register( "Edit Date/Time" : "Éditer la Date/Heure", "View in folder" : "Afficher dans le dossier", "Add to album" : "Ajouter à l'album", + "Move to another person" : "Déplacer vers une autre personne", "Remove from person" : "Retirer de la personne", "You are about to download a large number of files. Are you sure?" : "Vous êtes sur le point de télécharger un grand nombre de fichiers. Êtes-vous certain de vouloir le faire ?", "You are about to delete a large number of files. Are you sure?" : "Vous êtes sur le point de supprimer un grand nombre de fichiers. Êtes-vous certain⋅e de vouloir le faire ?", "You are about to touch a large number of files. Are you sure?" : "Vous êtes sur le point de modifier un grand nombre de fichiers. Êtes-vous sûr(e) ?", "_{n} selected_::_{n} selected_" : ["{n} sélectionné","{n} sélectionnés","{n} sélectionnés"], "Timeline Path" : "Emplacement du Fil chronologique", + "Folders Path" : "Chemin du dossier", "Show hidden folders" : "Afficher les dossiers cachés", + "Your Timeline" : "Votre fil chronologique", "Failed to load some photos" : "Échec du chargement de certaines photos", + "Share" : "Partage", "Sidebar" : "Panneau latéral", + "Video sharing not supported yet" : "Le partage de vidéo n'est pas encore disponible", + "Cannot share this type of data" : "Impossible de partager ce type de données", + "Processing … {n}/{m}" : "En cours de traitement … {n}/{m}", "Search for collaborators" : "Rechercher des collaborateurs", "Search people or groups" : "Recherche des personnes ou des groupes", "Add {collaboratorLabel} to the collaborators list" : "Ajouter {collaboratorLabel} à la liste des collaborateurs", @@ -75,22 +96,116 @@ OC.L10N.register( "Exercise caution and make sure you have backups." : "Faites preuve de prudence et assurez-vous que vous disposez de sauvegardes.", "Loading data … {n}/{m}" : "Chargement des données… {n}/{m}", "Remove person" : "Retirer la personne", + "Are you sure you want to remove {name}?" : "Êtes-vous sûr de vouloir retirer {name}?", "Name" : "Nom", "Rename person" : "Renommer la personne", "Update" : "Mise à jour", "Failed to rename {oldName} to {name}." : "Échec du renommage de {oldName} en {name}.", - "Loading …" : "Chargement …", + "You cannot share the root folder" : "Vous ne pouvez pas partager le dossier racine", + "Use the sidebar to share this folder." : "Utiliser la barre latérale pour partager ce dossier.", + "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Si vous créez un partage de lien public, cliquez sur rafraîchir et un lien correspondant à Souvenirs sera visible ci-dessous.", "Refresh" : "Actualiser", + "Remove" : "Retirer", "Delete album" : "Supprimer l'album", "Merge with different person" : "Fusionner avec une différente personne", "Share folder" : "Partager le dossier", + "Move left" : "Vers la gauche", + "Move right" : "Vers la droite", + "Save as" : "Enregistrer sous", + "Reset" : "Réinitialiser", + "All changes will be lost." : "Tous les changements seront perdus.", + "Are you sure you want to continue?" : "Êtes-vous sûr de vouloir continuer ?", + "Continue" : "Continuer", + "Undo" : "Annuler", + "Redo" : "Rétablir", + "Show original image" : "Afficher l'image originale", + "Zoom in" : "Zoomer", + "Zoom out" : "Dézoomer", + "Toggle zoom menu" : "Afficher/Masquer le menu de zoom", + "Adjust" : "Ajuster", + "Fine-tune" : "Réglages fins", + "Filters" : "Filtres", + "Watermark" : "Filigrane", + "Draw" : "Dessiner", + "Resize" : "Redimensionner", + "Invalid image." : "Image invalide.", + "Error while uploading the image." : "Erreur lors du téléversement de l'image", + "are not images" : "ne sont pas des images", + "is not an image" : "n'est pas une image", + "to be uploaded" : "à téléverser", + "Crop" : "Recadrer", + "Original" : "Original", + "Custom" : "Personnalisé", + "Square" : "Carré", + "Landscape" : "Paysage", + "Portrait" : "Portrait", + "Ellipse" : "Ellipse", + "Classic TV" : "Télévision Classique", + "CinemaScope" : "CinemaScope", + "Arrow" : "Flèche", + "Blur" : "Flou", + "Brightness" : "Luminosité", + "Contrast" : "Contraste", + "Un-flip X" : "Suppr. miroir horiz.", + "Flip X" : "Miroir horiz.", + "Un-flip Y" : "Suppr. miroir vertic.", + "Flip Y" : "Miroir vertic.", + "HSV" : "TSV", + "Hue" : "Teinte", + "Saturation" : "Saturation", + "Value" : "Valeur", + "Image" : "Image", + "Importing …" : "Importation...", + "+ Add image" : "+ Ajouter une image", + "Line" : "Ligne", + "Pen" : "Stylo", + "Polygon" : "Polygone", + "Sides" : "Diapositives", + "Rectangle" : "Rectangle", + "Corner Radius" : "Rayon d'angle", + "Width in pixels" : "Largeur en pixels", + "Height in pixels" : "Hauteur en pixels", + "Toggle ratio lock" : "Activer/Désactiver la conservation des proportions", + "Reset to original image size" : "Rétablir la taille originale de l'image", + "Rotate" : "Faire pivoter", + "Text" : "Texte", + "Text spacing" : "Espacement du texte", + "Text alignment" : "Alignement du texte", + "Font family" : "Police de caractère", + "Size" : "Taille", + "Letter spacing" : "Espacement des caractères", + "Line height" : "Hauteur de ligne", + "Warmth" : "Température", + "+ Add watermark" : "+ Ajouter un filigrane", + "Choose watermark type" : "Choisir un type de filigrane", + "Upload watermark" : "Téléverser un filigrane", + "Add as text" : "Ajouter comme texte", + "Padding" : "Marge interne", + "Shadow" : "Ombre", + "Horizontal" : "Horizontal", + "Vertical" : "Vertical", + "Opacity" : "Opacité", + "Position" : "Position", + "Stroke" : "Coutour", + "Save image as" : "Enregistrer l'image sous", + "Extension" : "Extension", + "Name is required." : "Le nom est obligatoire.", + "Quality" : "Qualité", + "Saved image size (width x height)" : "Taille de l'image sauvegardée (largeur x hauteur)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Notez que la zone de recadrage sélectionnée est inférieure au redimensionnement appliqué, ce qui peut entraîner une baisse de qualité.", + "Actual size (100%)" : "Taille actuelle (100%)", + "Fit size" : "Adapter à la taille", + "Transcoding failed." : "Échec du transcodage.", + "Auto" : "Auto", "Failed to create {albumName}." : "Échec de la création de {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Échec du renommage de {currentAlbumName} en {newAlbumName}.", "General Failure" : "Échec général", "Error: {msg}" : "Erreur : {msg}", "Failed to delete files." : "Échec de la suppression des fichiers.", "Failed to delete {fileName}." : "Échec de la suppression de {fileName}.", + "Failed to download some files." : "Échec du téléchargement de certains fichiers.", "Failed to favorite files." : "Échec de la mise en favoris des fichiers.", + "Failed to favorite some files." : "Échec de l'ajout en favoris de certains fichiers.", "Failed to favorite {fileName}." : "Échec de l'ajout aux favoris de {fileName}." }, "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/fr.json b/l10n/fr.json index ea27e6cd..d5827338 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Souvenirs", "Yet another photo management app" : "Une nouvelle application de gestion des photos", + "Settings" : "Paramètres", "Timeline" : "Fil chronologique", "Folders" : "Dossiers", "Favorites" : "Favoris", @@ -11,7 +12,20 @@ "On this day" : "Ce même jour", "Tags" : "Étiquettes", "Maps" : "Cartes", - "Settings" : "Paramètres", + "Choose the root folder of your timeline to begin" : "Choisissez le dossier racine de votre fil chronologique pour commencer", + "If you just installed Memories, run:" : "Si vous venez d'installer Souvenirs, exécuter :", + "Continue to Memories" : "Continuer vers Souvenirs", + "Choose again" : "Choisir à nouveau", + "Click here to start" : "Cliquer ici pour commencer", + "You can always change this later in settings" : "Vous pouvez toujours changer cela ultérieurement dans les paramètres", + "Choose the root of your timeline" : "Choisissez le début de votre fil chronologique", + "The selected folder does not seem to be valid. Try again." : "Le dossier sélectionné ne semble pas être valide. Essayer à nouveau.", + "Image saved successfully" : "Image enregistrée avec succès", + "Error saving image" : "Erreur lors de l'enregistrement de l'image", + "Unsaved changes" : "Modifications non enregistrées", + "Drop changes" : "Abandonner les changements", + "Edit" : "Modifier", + "Loading …" : "Chargement …", "Cancel" : "Annuler", "Delete" : "Supprimer", "Download" : "Télécharger", @@ -20,15 +34,22 @@ "Edit Date/Time" : "Éditer la Date/Heure", "View in folder" : "Afficher dans le dossier", "Add to album" : "Ajouter à l'album", + "Move to another person" : "Déplacer vers une autre personne", "Remove from person" : "Retirer de la personne", "You are about to download a large number of files. Are you sure?" : "Vous êtes sur le point de télécharger un grand nombre de fichiers. Êtes-vous certain de vouloir le faire ?", "You are about to delete a large number of files. Are you sure?" : "Vous êtes sur le point de supprimer un grand nombre de fichiers. Êtes-vous certain⋅e de vouloir le faire ?", "You are about to touch a large number of files. Are you sure?" : "Vous êtes sur le point de modifier un grand nombre de fichiers. Êtes-vous sûr(e) ?", "_{n} selected_::_{n} selected_" : ["{n} sélectionné","{n} sélectionnés","{n} sélectionnés"], "Timeline Path" : "Emplacement du Fil chronologique", + "Folders Path" : "Chemin du dossier", "Show hidden folders" : "Afficher les dossiers cachés", + "Your Timeline" : "Votre fil chronologique", "Failed to load some photos" : "Échec du chargement de certaines photos", + "Share" : "Partage", "Sidebar" : "Panneau latéral", + "Video sharing not supported yet" : "Le partage de vidéo n'est pas encore disponible", + "Cannot share this type of data" : "Impossible de partager ce type de données", + "Processing … {n}/{m}" : "En cours de traitement … {n}/{m}", "Search for collaborators" : "Rechercher des collaborateurs", "Search people or groups" : "Recherche des personnes ou des groupes", "Add {collaboratorLabel} to the collaborators list" : "Ajouter {collaboratorLabel} à la liste des collaborateurs", @@ -73,22 +94,116 @@ "Exercise caution and make sure you have backups." : "Faites preuve de prudence et assurez-vous que vous disposez de sauvegardes.", "Loading data … {n}/{m}" : "Chargement des données… {n}/{m}", "Remove person" : "Retirer la personne", + "Are you sure you want to remove {name}?" : "Êtes-vous sûr de vouloir retirer {name}?", "Name" : "Nom", "Rename person" : "Renommer la personne", "Update" : "Mise à jour", "Failed to rename {oldName} to {name}." : "Échec du renommage de {oldName} en {name}.", - "Loading …" : "Chargement …", + "You cannot share the root folder" : "Vous ne pouvez pas partager le dossier racine", + "Use the sidebar to share this folder." : "Utiliser la barre latérale pour partager ce dossier.", + "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Si vous créez un partage de lien public, cliquez sur rafraîchir et un lien correspondant à Souvenirs sera visible ci-dessous.", "Refresh" : "Actualiser", + "Remove" : "Retirer", "Delete album" : "Supprimer l'album", "Merge with different person" : "Fusionner avec une différente personne", "Share folder" : "Partager le dossier", + "Move left" : "Vers la gauche", + "Move right" : "Vers la droite", + "Save as" : "Enregistrer sous", + "Reset" : "Réinitialiser", + "All changes will be lost." : "Tous les changements seront perdus.", + "Are you sure you want to continue?" : "Êtes-vous sûr de vouloir continuer ?", + "Continue" : "Continuer", + "Undo" : "Annuler", + "Redo" : "Rétablir", + "Show original image" : "Afficher l'image originale", + "Zoom in" : "Zoomer", + "Zoom out" : "Dézoomer", + "Toggle zoom menu" : "Afficher/Masquer le menu de zoom", + "Adjust" : "Ajuster", + "Fine-tune" : "Réglages fins", + "Filters" : "Filtres", + "Watermark" : "Filigrane", + "Draw" : "Dessiner", + "Resize" : "Redimensionner", + "Invalid image." : "Image invalide.", + "Error while uploading the image." : "Erreur lors du téléversement de l'image", + "are not images" : "ne sont pas des images", + "is not an image" : "n'est pas une image", + "to be uploaded" : "à téléverser", + "Crop" : "Recadrer", + "Original" : "Original", + "Custom" : "Personnalisé", + "Square" : "Carré", + "Landscape" : "Paysage", + "Portrait" : "Portrait", + "Ellipse" : "Ellipse", + "Classic TV" : "Télévision Classique", + "CinemaScope" : "CinemaScope", + "Arrow" : "Flèche", + "Blur" : "Flou", + "Brightness" : "Luminosité", + "Contrast" : "Contraste", + "Un-flip X" : "Suppr. miroir horiz.", + "Flip X" : "Miroir horiz.", + "Un-flip Y" : "Suppr. miroir vertic.", + "Flip Y" : "Miroir vertic.", + "HSV" : "TSV", + "Hue" : "Teinte", + "Saturation" : "Saturation", + "Value" : "Valeur", + "Image" : "Image", + "Importing …" : "Importation...", + "+ Add image" : "+ Ajouter une image", + "Line" : "Ligne", + "Pen" : "Stylo", + "Polygon" : "Polygone", + "Sides" : "Diapositives", + "Rectangle" : "Rectangle", + "Corner Radius" : "Rayon d'angle", + "Width in pixels" : "Largeur en pixels", + "Height in pixels" : "Hauteur en pixels", + "Toggle ratio lock" : "Activer/Désactiver la conservation des proportions", + "Reset to original image size" : "Rétablir la taille originale de l'image", + "Rotate" : "Faire pivoter", + "Text" : "Texte", + "Text spacing" : "Espacement du texte", + "Text alignment" : "Alignement du texte", + "Font family" : "Police de caractère", + "Size" : "Taille", + "Letter spacing" : "Espacement des caractères", + "Line height" : "Hauteur de ligne", + "Warmth" : "Température", + "+ Add watermark" : "+ Ajouter un filigrane", + "Choose watermark type" : "Choisir un type de filigrane", + "Upload watermark" : "Téléverser un filigrane", + "Add as text" : "Ajouter comme texte", + "Padding" : "Marge interne", + "Shadow" : "Ombre", + "Horizontal" : "Horizontal", + "Vertical" : "Vertical", + "Opacity" : "Opacité", + "Position" : "Position", + "Stroke" : "Coutour", + "Save image as" : "Enregistrer l'image sous", + "Extension" : "Extension", + "Name is required." : "Le nom est obligatoire.", + "Quality" : "Qualité", + "Saved image size (width x height)" : "Taille de l'image sauvegardée (largeur x hauteur)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Notez que la zone de recadrage sélectionnée est inférieure au redimensionnement appliqué, ce qui peut entraîner une baisse de qualité.", + "Actual size (100%)" : "Taille actuelle (100%)", + "Fit size" : "Adapter à la taille", + "Transcoding failed." : "Échec du transcodage.", + "Auto" : "Auto", "Failed to create {albumName}." : "Échec de la création de {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Échec du renommage de {currentAlbumName} en {newAlbumName}.", "General Failure" : "Échec général", "Error: {msg}" : "Erreur : {msg}", "Failed to delete files." : "Échec de la suppression des fichiers.", "Failed to delete {fileName}." : "Échec de la suppression de {fileName}.", + "Failed to download some files." : "Échec du téléchargement de certains fichiers.", "Failed to favorite files." : "Échec de la mise en favoris des fichiers.", + "Failed to favorite some files." : "Échec de l'ajout en favoris de certains fichiers.", "Failed to favorite {fileName}." : "Échec de l'ajout aux favoris de {fileName}." },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/gd.js b/l10n/gd.js index 0cf47251..c0b032b3 100644 --- a/l10n/gd.js +++ b/l10n/gd.js @@ -1,17 +1,21 @@ OC.L10N.register( "memories", { + "Settings" : "Roghainnean", "Favorites" : "Annsachdan", "Videos" : "Videothan", "Tags" : "Tagaichean", - "Settings" : "Roghainnean", + "Edit" : "Deasaich", "Cancel" : "Sguir dheth", "Delete" : "Sguab às", "Download" : "Luchdaich a-nuas", "Favorite" : "Annsachd", + "Share" : "Co-roinn", "Back" : "Air ais", "Save" : "Sàbhail", "Name" : "Ainm", - "Refresh" : "Ath-nuadhaich" + "Refresh" : "Ath-nuadhaich", + "Remove" : "Thoir air falbh", + "Undo" : "Neo-dhèan" }, "nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;"); diff --git a/l10n/gd.json b/l10n/gd.json index 2bec054e..94fb6346 100644 --- a/l10n/gd.json +++ b/l10n/gd.json @@ -1,15 +1,19 @@ { "translations": { + "Settings" : "Roghainnean", "Favorites" : "Annsachdan", "Videos" : "Videothan", "Tags" : "Tagaichean", - "Settings" : "Roghainnean", + "Edit" : "Deasaich", "Cancel" : "Sguir dheth", "Delete" : "Sguab às", "Download" : "Luchdaich a-nuas", "Favorite" : "Annsachd", + "Share" : "Co-roinn", "Back" : "Air ais", "Save" : "Sàbhail", "Name" : "Ainm", - "Refresh" : "Ath-nuadhaich" + "Refresh" : "Ath-nuadhaich", + "Remove" : "Thoir air falbh", + "Undo" : "Neo-dhèan" },"pluralForm" :"nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;" } \ No newline at end of file diff --git a/l10n/gl.js b/l10n/gl.js index db62cae2..32be2af7 100644 --- a/l10n/gl.js +++ b/l10n/gl.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Axustes", "Timeline" : "Liña temporal", "Folders" : "Cartafoles", "Favorites" : "Favoritos", @@ -9,13 +10,16 @@ OC.L10N.register( "Archive" : "Aquivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Axustes", + "Unsaved changes" : "Cambios sen gardar", + "Edit" : "Editar", + "Loading …" : "Cargando…", "Cancel" : "Cancelar", "Delete" : "Eliminar", "Download" : "Descargar", "Favorite" : "Favorito", "Unarchive" : "Desarquivar", "View in folder" : "Ver no cartafol", + "Share" : "Compartir", "Copy public link" : "Copiar a ligazón pública", "Public link" : "Ligazón pública", "Back" : "Atrás", @@ -28,7 +32,24 @@ OC.L10N.register( "Minute" : "Minuto", "Name" : "Nome", "Update" : "Actualizar", - "Loading …" : "Cargando…", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Retirar", + "Reset" : "Restabelecer", + "Continue" : "Continuar", + "Undo" : "Desfacer", + "Redo" : "Refacer", + "Zoom in" : "Achegar", + "Original" : "Orixinal", + "Custom" : "Personalizado", + "Value" : "Valor", + "Image" : "Imaxe", + "Line" : "Liña", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posicion", + "Extension" : "Extensión", + "Name is required." : "É obrigatorio o nome.", + "Quality" : "Calidade", + "Auto" : "Automático" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/gl.json b/l10n/gl.json index 7a9617d1..dc1f9bf4 100644 --- a/l10n/gl.json +++ b/l10n/gl.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Axustes", "Timeline" : "Liña temporal", "Folders" : "Cartafoles", "Favorites" : "Favoritos", @@ -7,13 +8,16 @@ "Archive" : "Aquivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Axustes", + "Unsaved changes" : "Cambios sen gardar", + "Edit" : "Editar", + "Loading …" : "Cargando…", "Cancel" : "Cancelar", "Delete" : "Eliminar", "Download" : "Descargar", "Favorite" : "Favorito", "Unarchive" : "Desarquivar", "View in folder" : "Ver no cartafol", + "Share" : "Compartir", "Copy public link" : "Copiar a ligazón pública", "Public link" : "Ligazón pública", "Back" : "Atrás", @@ -26,7 +30,24 @@ "Minute" : "Minuto", "Name" : "Nome", "Update" : "Actualizar", - "Loading …" : "Cargando…", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Retirar", + "Reset" : "Restabelecer", + "Continue" : "Continuar", + "Undo" : "Desfacer", + "Redo" : "Refacer", + "Zoom in" : "Achegar", + "Original" : "Orixinal", + "Custom" : "Personalizado", + "Value" : "Valor", + "Image" : "Imaxe", + "Line" : "Liña", + "Text" : "Texto", + "Size" : "Tamaño", + "Position" : "Posicion", + "Extension" : "Extensión", + "Name is required." : "É obrigatorio o nome.", + "Quality" : "Calidade", + "Auto" : "Automático" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/he.js b/l10n/he.js index 3aff5e33..19b1e757 100644 --- a/l10n/he.js +++ b/l10n/he.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "הגדרות", "Timeline" : "ציר זמן", "Folders" : "תיקייה", "Favorites" : "מועדפים", @@ -8,13 +9,16 @@ OC.L10N.register( "Archive" : "לארכיון", "Tags" : "תגיות", "Maps" : "מפות", - "Settings" : "הגדרות", + "Unsaved changes" : "שינויים שלא נשמרו", + "Edit" : "עריכה", + "Loading …" : "בטעינה…", "Cancel" : "ביטול", "Delete" : "מחיקה", "Download" : "הורדה", "Favorite" : "סימון כמועדף", "Unarchive" : "הוצאה מהארכיון", "View in folder" : "הצג בתיקייה", + "Share" : "שתף", "Copy public link" : "העתקת הקישור הציבורי", "Public link" : "קישור ציבורי", "Back" : "חזרה", @@ -27,7 +31,22 @@ OC.L10N.register( "Minute" : "דקה", "Name" : "שם", "Update" : "עדכון", - "Loading …" : "בטעינה…", - "Refresh" : "רענון" + "Refresh" : "רענון", + "Remove" : "הסרה", + "Reset" : "איפוס", + "Continue" : "להמשך", + "Undo" : "ביטול", + "Redo" : "שחזור", + "Zoom in" : "התקרבות", + "Custom" : "מותאם אישית", + "Value" : "ערך", + "Image" : "תמונה", + "Text" : "טקסט", + "Size" : "גודל", + "Position" : "מיקום", + "Extension" : "הרחבה", + "Name is required." : "נדרש שם.", + "Quality" : "איכות", + "Auto" : "אוטומטי" }, "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"); diff --git a/l10n/he.json b/l10n/he.json index 1a0c32fb..cfae3dd0 100644 --- a/l10n/he.json +++ b/l10n/he.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "הגדרות", "Timeline" : "ציר זמן", "Folders" : "תיקייה", "Favorites" : "מועדפים", @@ -6,13 +7,16 @@ "Archive" : "לארכיון", "Tags" : "תגיות", "Maps" : "מפות", - "Settings" : "הגדרות", + "Unsaved changes" : "שינויים שלא נשמרו", + "Edit" : "עריכה", + "Loading …" : "בטעינה…", "Cancel" : "ביטול", "Delete" : "מחיקה", "Download" : "הורדה", "Favorite" : "סימון כמועדף", "Unarchive" : "הוצאה מהארכיון", "View in folder" : "הצג בתיקייה", + "Share" : "שתף", "Copy public link" : "העתקת הקישור הציבורי", "Public link" : "קישור ציבורי", "Back" : "חזרה", @@ -25,7 +29,22 @@ "Minute" : "דקה", "Name" : "שם", "Update" : "עדכון", - "Loading …" : "בטעינה…", - "Refresh" : "רענון" + "Refresh" : "רענון", + "Remove" : "הסרה", + "Reset" : "איפוס", + "Continue" : "להמשך", + "Undo" : "ביטול", + "Redo" : "שחזור", + "Zoom in" : "התקרבות", + "Custom" : "מותאם אישית", + "Value" : "ערך", + "Image" : "תמונה", + "Text" : "טקסט", + "Size" : "גודל", + "Position" : "מיקום", + "Extension" : "הרחבה", + "Name is required." : "נדרש שם.", + "Quality" : "איכות", + "Auto" : "אוטומטי" },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;" } \ No newline at end of file diff --git a/l10n/hr.js b/l10n/hr.js index fa526811..ebad7be5 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Postavke", "Timeline" : "Vremenska crta", "Folders" : "Mape", "Favorites" : "Favoriti", @@ -9,13 +10,16 @@ OC.L10N.register( "Archive" : "Arhiva", "Tags" : "Oznake", "Maps" : "Karte", - "Settings" : "Postavke", + "Unsaved changes" : "Nespremljene promjene", + "Edit" : "Uredi", + "Loading …" : "Učitavanje…", "Cancel" : "Odustani", "Delete" : "Izbriši", "Download" : "Preuzmi", "Favorite" : "Favorit", "Unarchive" : "Dearhiviraj", "View in folder" : "Prikaži u mapi", + "Share" : "Dijeli", "Copy public link" : "Kopiraj javnu poveznicu", "Public link" : "Javna poveznica", "Back" : "Natrag", @@ -28,8 +32,24 @@ OC.L10N.register( "Minute" : "Minuta", "Name" : "Naziv", "Update" : "Ažuriraj", - "Loading …" : "Učitavanje…", "Refresh" : "Osvježi", - "Share folder" : "Dijeli mapu" + "Remove" : "Ukloni", + "Share folder" : "Dijeli mapu", + "Reset" : "Resetiraj", + "Continue" : "Nastavi", + "Undo" : "Poništi", + "Redo" : "Ponovno", + "Zoom in" : "Uvećaj", + "Original" : "Izvornik", + "Custom" : "Prilagođeno", + "Value" : "Vrijednost", + "Image" : "Slika", + "Text" : "Tekst", + "Size" : "Veličina", + "Position" : "Položaj", + "Extension" : "Proširenje", + "Name is required." : "Ime je obavezno.", + "Quality" : "Kvaliteta", + "Auto" : "Auto" }, "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); diff --git a/l10n/hr.json b/l10n/hr.json index feccf68a..831150b7 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Postavke", "Timeline" : "Vremenska crta", "Folders" : "Mape", "Favorites" : "Favoriti", @@ -7,13 +8,16 @@ "Archive" : "Arhiva", "Tags" : "Oznake", "Maps" : "Karte", - "Settings" : "Postavke", + "Unsaved changes" : "Nespremljene promjene", + "Edit" : "Uredi", + "Loading …" : "Učitavanje…", "Cancel" : "Odustani", "Delete" : "Izbriši", "Download" : "Preuzmi", "Favorite" : "Favorit", "Unarchive" : "Dearhiviraj", "View in folder" : "Prikaži u mapi", + "Share" : "Dijeli", "Copy public link" : "Kopiraj javnu poveznicu", "Public link" : "Javna poveznica", "Back" : "Natrag", @@ -26,8 +30,24 @@ "Minute" : "Minuta", "Name" : "Naziv", "Update" : "Ažuriraj", - "Loading …" : "Učitavanje…", "Refresh" : "Osvježi", - "Share folder" : "Dijeli mapu" + "Remove" : "Ukloni", + "Share folder" : "Dijeli mapu", + "Reset" : "Resetiraj", + "Continue" : "Nastavi", + "Undo" : "Poništi", + "Redo" : "Ponovno", + "Zoom in" : "Uvećaj", + "Original" : "Izvornik", + "Custom" : "Prilagođeno", + "Value" : "Vrijednost", + "Image" : "Slika", + "Text" : "Tekst", + "Size" : "Veličina", + "Position" : "Položaj", + "Extension" : "Proširenje", + "Name is required." : "Ime je obavezno.", + "Quality" : "Kvaliteta", + "Auto" : "Auto" },"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/hu.js b/l10n/hu.js index 77a1c6eb..d6c229ff 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Emlékek", "Yet another photo management app" : "Még egy fényképkezelő alkalmazás", + "Settings" : "Beállítások", "Timeline" : "Idővonal", "Folders" : "Mappák", "Favorites" : "Kedvencek", @@ -13,7 +14,12 @@ OC.L10N.register( "On this day" : "A mai napon", "Tags" : "Címkék", "Maps" : "Térképek", - "Settings" : "Beállítások", + "EXIF" : "EXIF", + "Error saving image" : "Hiba a kép mentése során", + "Unsaved changes" : "Mentetlen változtatások", + "Drop changes" : "Változtatások elvetése", + "Edit" : "Szerkesztés", + "Loading …" : "Betöltés…", "Cancel" : "Mégse", "Delete" : "Törlés", "Download" : "Letöltés", @@ -32,6 +38,7 @@ OC.L10N.register( "Show hidden folders" : "Rejtett mappák megjelenítése", "Your Timeline" : "Saját idővonal", "Failed to load some photos" : "Nem sikerült betölteni néhány fényképet", + "Share" : "Megosztás", "Sidebar" : "Oldalsáv", "Processing … {n}/{m}" : "Feldolgozás… {n}/{m}", "Search for collaborators" : "Közreműködők keresése", @@ -61,6 +68,7 @@ OC.L10N.register( "Add collaborators" : "Közreműködők hozzáadása", "Save" : "Mentés", "Create album" : "Album létrehozása", + "Add selection to album {albumName}" : "Kiválasztás hozzáadása a(z) {albumName} albumhoz", "Create a new album." : "Új album létrehozása.", "Save collaborators for this album." : "Közreműködők mentése ehhez az albumhoz.", "Year" : "Év", @@ -76,11 +84,96 @@ OC.L10N.register( "Name" : "Név", "Rename person" : "Személy átnevezése", "Update" : "Frissítés", - "Loading …" : "Betöltés…", "Refresh" : "Frissítés", + "Remove" : "Eltávolítás", "Delete album" : "Album törlése", "Merge with different person" : "Összevonás egy másik személlyel", "Share folder" : "Mappa megosztása", + "Save as" : "Mentés másként", + "Reset" : "Alaphelyzetbe állítás", + "All changes will be lost." : "Az összes változtatás elvész.", + "Are you sure you want to continue?" : "Biztos, hogy folytatja?", + "Continue" : "Folytatás", + "Undo" : "Visszavonás", + "Redo" : "Újra", + "Show original image" : "Eredeti kép megjelenítése", + "Zoom in" : "Nagyítás", + "Zoom out" : "Kicsinyítés", + "Toggle zoom menu" : "Nagyítási menü be/ki", + "Adjust" : "Igazítás", + "Fine-tune" : "Finomhangolás", + "Filters" : "Szűrők", + "Watermark" : "Vízjel", + "Draw" : "Rajzolás", + "Resize" : "Átméretezés", + "Invalid image." : "Érvénytelen kép.", + "Error while uploading the image." : "Hiba történt a kép feltöltése során.", + "are not images" : "nem képek", + "is not an image" : "nem kép", + "to be uploaded" : "feltöltendő", + "Crop" : "Levágás", + "Original" : "Eredeti", + "Custom" : "Egyéni", + "Square" : "Négyzetes", + "Landscape" : "Fekvő", + "Portrait" : "Álló", + "Ellipse" : "Ellipszis", + "Classic TV" : "Klasszikus TV", + "CinemaScope" : "CinemaScope", + "Arrow" : "Nyíl", + "Blur" : "Elmosás", + "Brightness" : "Fényerő", + "Contrast" : "Kontraszt", + "Un-flip X" : "X-tengelyre tükrözés visszavonása", + "Flip X" : "X-tengelyre tükrözés", + "Un-flip Y" : "Y-tengelyre tükrözés visszavonása", + "Flip Y" : "Y-tengelyre tükrözés", + "HSV" : "HSV", + "Hue" : "Fényerő", + "Saturation" : "Telítettség", + "Value" : "Érték", + "Image" : "Kép", + "Importing …" : "Importálás…", + "+ Add image" : "+ Kép hozzáadása", + "Line" : "Vonal", + "Pen" : "Toll", + "Polygon" : "Sokszög", + "Sides" : "Oldalak", + "Rectangle" : "Téglalap", + "Corner Radius" : "Saroklekerekítés sugara", + "Width in pixels" : "Szélesség képpontokban", + "Height in pixels" : "Magasság képpontokban", + "Toggle ratio lock" : "Arányzárolás be/ki", + "Reset to original image size" : "Visszaállítás az eredeti képméretre", + "Rotate" : "Forgatás", + "Text" : "Szöveg", + "Text spacing" : "Szövegtávolság", + "Text alignment" : "Szöveg igazítása", + "Font family" : "Betűkészletcsalád", + "Size" : "Méret", + "Letter spacing" : "Betűköz", + "Line height" : "Sormagasság", + "Warmth" : "Melegség", + "+ Add watermark" : "+ Vízjel hozzáadása", + "Choose watermark type" : "Válasszon vízjeltípust", + "Upload watermark" : "Vízjel feltöltése", + "Add as text" : "Hozzáadás szövegként", + "Padding" : "Helykitöltés", + "Shadow" : "Árnyék", + "Horizontal" : "Vízszintes", + "Vertical" : "Függőleges", + "Opacity" : "Átlátszatlanság", + "Position" : "Pozíció", + "Stroke" : "Körberajzolás", + "Save image as" : "Kép mentése másként", + "Extension" : "Kiterjesztés", + "Name is required." : "A név kötelező.", + "Quality" : "Minőség", + "Saved image size (width x height)" : "Mentett kép mérete (szélesség×magasság)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Vegye figyelembe, hogy a kijelölt levágási terület kisebb mint az alkalmazott átméretezés, amely minőségcsökkenést okozhat", + "Actual size (100%)" : "Tényleges méret (100%)", + "Fit size" : "Illeszkedő méret", + "Auto" : "Automatikus", "Failed to create {albumName}." : "A(z) {albumName} létrehozása sikertelen.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "A(z) {currentAlbumName} átnevezése a következőre sikertelen: {newAlbumName}.", "Failed to delete files." : "A fájlok törlése sikertelen.", diff --git a/l10n/hu.json b/l10n/hu.json index 135d3de4..abd63e53 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Emlékek", "Yet another photo management app" : "Még egy fényképkezelő alkalmazás", + "Settings" : "Beállítások", "Timeline" : "Idővonal", "Folders" : "Mappák", "Favorites" : "Kedvencek", @@ -11,7 +12,12 @@ "On this day" : "A mai napon", "Tags" : "Címkék", "Maps" : "Térképek", - "Settings" : "Beállítások", + "EXIF" : "EXIF", + "Error saving image" : "Hiba a kép mentése során", + "Unsaved changes" : "Mentetlen változtatások", + "Drop changes" : "Változtatások elvetése", + "Edit" : "Szerkesztés", + "Loading …" : "Betöltés…", "Cancel" : "Mégse", "Delete" : "Törlés", "Download" : "Letöltés", @@ -30,6 +36,7 @@ "Show hidden folders" : "Rejtett mappák megjelenítése", "Your Timeline" : "Saját idővonal", "Failed to load some photos" : "Nem sikerült betölteni néhány fényképet", + "Share" : "Megosztás", "Sidebar" : "Oldalsáv", "Processing … {n}/{m}" : "Feldolgozás… {n}/{m}", "Search for collaborators" : "Közreműködők keresése", @@ -59,6 +66,7 @@ "Add collaborators" : "Közreműködők hozzáadása", "Save" : "Mentés", "Create album" : "Album létrehozása", + "Add selection to album {albumName}" : "Kiválasztás hozzáadása a(z) {albumName} albumhoz", "Create a new album." : "Új album létrehozása.", "Save collaborators for this album." : "Közreműködők mentése ehhez az albumhoz.", "Year" : "Év", @@ -74,11 +82,96 @@ "Name" : "Név", "Rename person" : "Személy átnevezése", "Update" : "Frissítés", - "Loading …" : "Betöltés…", "Refresh" : "Frissítés", + "Remove" : "Eltávolítás", "Delete album" : "Album törlése", "Merge with different person" : "Összevonás egy másik személlyel", "Share folder" : "Mappa megosztása", + "Save as" : "Mentés másként", + "Reset" : "Alaphelyzetbe állítás", + "All changes will be lost." : "Az összes változtatás elvész.", + "Are you sure you want to continue?" : "Biztos, hogy folytatja?", + "Continue" : "Folytatás", + "Undo" : "Visszavonás", + "Redo" : "Újra", + "Show original image" : "Eredeti kép megjelenítése", + "Zoom in" : "Nagyítás", + "Zoom out" : "Kicsinyítés", + "Toggle zoom menu" : "Nagyítási menü be/ki", + "Adjust" : "Igazítás", + "Fine-tune" : "Finomhangolás", + "Filters" : "Szűrők", + "Watermark" : "Vízjel", + "Draw" : "Rajzolás", + "Resize" : "Átméretezés", + "Invalid image." : "Érvénytelen kép.", + "Error while uploading the image." : "Hiba történt a kép feltöltése során.", + "are not images" : "nem képek", + "is not an image" : "nem kép", + "to be uploaded" : "feltöltendő", + "Crop" : "Levágás", + "Original" : "Eredeti", + "Custom" : "Egyéni", + "Square" : "Négyzetes", + "Landscape" : "Fekvő", + "Portrait" : "Álló", + "Ellipse" : "Ellipszis", + "Classic TV" : "Klasszikus TV", + "CinemaScope" : "CinemaScope", + "Arrow" : "Nyíl", + "Blur" : "Elmosás", + "Brightness" : "Fényerő", + "Contrast" : "Kontraszt", + "Un-flip X" : "X-tengelyre tükrözés visszavonása", + "Flip X" : "X-tengelyre tükrözés", + "Un-flip Y" : "Y-tengelyre tükrözés visszavonása", + "Flip Y" : "Y-tengelyre tükrözés", + "HSV" : "HSV", + "Hue" : "Fényerő", + "Saturation" : "Telítettség", + "Value" : "Érték", + "Image" : "Kép", + "Importing …" : "Importálás…", + "+ Add image" : "+ Kép hozzáadása", + "Line" : "Vonal", + "Pen" : "Toll", + "Polygon" : "Sokszög", + "Sides" : "Oldalak", + "Rectangle" : "Téglalap", + "Corner Radius" : "Saroklekerekítés sugara", + "Width in pixels" : "Szélesség képpontokban", + "Height in pixels" : "Magasság képpontokban", + "Toggle ratio lock" : "Arányzárolás be/ki", + "Reset to original image size" : "Visszaállítás az eredeti képméretre", + "Rotate" : "Forgatás", + "Text" : "Szöveg", + "Text spacing" : "Szövegtávolság", + "Text alignment" : "Szöveg igazítása", + "Font family" : "Betűkészletcsalád", + "Size" : "Méret", + "Letter spacing" : "Betűköz", + "Line height" : "Sormagasság", + "Warmth" : "Melegség", + "+ Add watermark" : "+ Vízjel hozzáadása", + "Choose watermark type" : "Válasszon vízjeltípust", + "Upload watermark" : "Vízjel feltöltése", + "Add as text" : "Hozzáadás szövegként", + "Padding" : "Helykitöltés", + "Shadow" : "Árnyék", + "Horizontal" : "Vízszintes", + "Vertical" : "Függőleges", + "Opacity" : "Átlátszatlanság", + "Position" : "Pozíció", + "Stroke" : "Körberajzolás", + "Save image as" : "Kép mentése másként", + "Extension" : "Kiterjesztés", + "Name is required." : "A név kötelező.", + "Quality" : "Minőség", + "Saved image size (width x height)" : "Mentett kép mérete (szélesség×magasság)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Vegye figyelembe, hogy a kijelölt levágási terület kisebb mint az alkalmazott átméretezés, amely minőségcsökkenést okozhat", + "Actual size (100%)" : "Tényleges méret (100%)", + "Fit size" : "Illeszkedő méret", + "Auto" : "Automatikus", "Failed to create {albumName}." : "A(z) {albumName} létrehozása sikertelen.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "A(z) {currentAlbumName} átnevezése a következőre sikertelen: {newAlbumName}.", "Failed to delete files." : "A fájlok törlése sikertelen.", diff --git a/l10n/hy.js b/l10n/hy.js index 27e841c7..296fcad8 100644 --- a/l10n/hy.js +++ b/l10n/hy.js @@ -1,17 +1,21 @@ OC.L10N.register( "memories", { - "Favorites" : "Սիրվածներ", "Settings" : "կարգավորումներ", + "Favorites" : "Սիրվածներ", + "Edit" : "մշակել", "Cancel" : "ընդհատել", "Delete" : "հեռացնել", "Download" : "Ներբեռնել", + "Share" : "Կիսվել", "Save" : "Պահպանել", "Month" : "Ամիս", "Day" : "Օր", "Time" : "Ժամ", "Name" : "Անուն", "Update" : "Թարմացնել", - "Refresh" : "Թարմացնել" + "Refresh" : "Թարմացնել", + "Continue" : "Շարունակել", + "Size" : "Չափս" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/hy.json b/l10n/hy.json index 550a252d..6169c051 100644 --- a/l10n/hy.json +++ b/l10n/hy.json @@ -1,15 +1,19 @@ { "translations": { - "Favorites" : "Սիրվածներ", "Settings" : "կարգավորումներ", + "Favorites" : "Սիրվածներ", + "Edit" : "մշակել", "Cancel" : "ընդհատել", "Delete" : "հեռացնել", "Download" : "Ներբեռնել", + "Share" : "Կիսվել", "Save" : "Պահպանել", "Month" : "Ամիս", "Day" : "Օր", "Time" : "Ժամ", "Name" : "Անուն", "Update" : "Թարմացնել", - "Refresh" : "Թարմացնել" + "Refresh" : "Թարմացնել", + "Continue" : "Շարունակել", + "Size" : "Չափս" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/ia.js b/l10n/ia.js index 08186475..446e05cf 100644 --- a/l10n/ia.js +++ b/l10n/ia.js @@ -1,15 +1,17 @@ OC.L10N.register( "memories", { + "Settings" : "Configurationes", "Favorites" : "Favoritos", "Tags" : "Etiquettas", "Maps" : "Mappas", - "Settings" : "Configurationes", + "Edit" : "Modificar", "Cancel" : "Cancellar", "Delete" : "Deler", "Download" : "Discargar", "Favorite" : "Favorite", "View in folder" : "Vider in dossier", + "Share" : "Compartir", "Back" : "Retro", "Save" : "Salveguardar", "Month" : "Mense", @@ -17,6 +19,10 @@ OC.L10N.register( "Time" : "Tempore", "Name" : "Nomine", "Update" : "Actualisation", - "Refresh" : "Refrescar" + "Refresh" : "Refrescar", + "Reset" : "Re-fixar", + "Undo" : "Disfacer", + "Custom" : "Personalisate", + "Size" : "Dimension" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/ia.json b/l10n/ia.json index 76d8e898..1189db7d 100644 --- a/l10n/ia.json +++ b/l10n/ia.json @@ -1,13 +1,15 @@ { "translations": { + "Settings" : "Configurationes", "Favorites" : "Favoritos", "Tags" : "Etiquettas", "Maps" : "Mappas", - "Settings" : "Configurationes", + "Edit" : "Modificar", "Cancel" : "Cancellar", "Delete" : "Deler", "Download" : "Discargar", "Favorite" : "Favorite", "View in folder" : "Vider in dossier", + "Share" : "Compartir", "Back" : "Retro", "Save" : "Salveguardar", "Month" : "Mense", @@ -15,6 +17,10 @@ "Time" : "Tempore", "Name" : "Nomine", "Update" : "Actualisation", - "Refresh" : "Refrescar" + "Refresh" : "Refrescar", + "Reset" : "Re-fixar", + "Undo" : "Disfacer", + "Custom" : "Personalisate", + "Size" : "Dimension" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/id.js b/l10n/id.js index adffde02..c5a77fac 100644 --- a/l10n/id.js +++ b/l10n/id.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Setelan", "Timeline" : "Linimasa", "Folders" : "Folder-folder", "Favorites" : "Disukai", @@ -8,12 +9,13 @@ OC.L10N.register( "Archive" : "Arsip", "Tags" : "Tag", "Maps" : "Peta", - "Settings" : "Setelan", + "Edit" : "Sunting", "Cancel" : "Membatalkan", "Delete" : "Hapus", "Download" : "Unduh", "Favorite" : "Favorit", "View in folder" : "Lihat dalam folder", + "Share" : "Bagikan", "Copy public link" : "Salin tautan publik", "Back" : "Kembali", "Save" : "Simpan", @@ -23,6 +25,11 @@ OC.L10N.register( "Hour" : "Jam", "Name" : "Nama", "Update" : "Perbarui", - "Refresh" : "Muat ulang" + "Refresh" : "Muat ulang", + "Remove" : "Buang", + "Reset" : "Setel ulang", + "Continue" : "Lanjutkan", + "Undo" : "Undo", + "Size" : "Ukuran" }, "nplurals=1; plural=0;"); diff --git a/l10n/id.json b/l10n/id.json index 7ac0e5f3..254827eb 100644 --- a/l10n/id.json +++ b/l10n/id.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Setelan", "Timeline" : "Linimasa", "Folders" : "Folder-folder", "Favorites" : "Disukai", @@ -6,12 +7,13 @@ "Archive" : "Arsip", "Tags" : "Tag", "Maps" : "Peta", - "Settings" : "Setelan", + "Edit" : "Sunting", "Cancel" : "Membatalkan", "Delete" : "Hapus", "Download" : "Unduh", "Favorite" : "Favorit", "View in folder" : "Lihat dalam folder", + "Share" : "Bagikan", "Copy public link" : "Salin tautan publik", "Back" : "Kembali", "Save" : "Simpan", @@ -21,6 +23,11 @@ "Hour" : "Jam", "Name" : "Nama", "Update" : "Perbarui", - "Refresh" : "Muat ulang" + "Refresh" : "Muat ulang", + "Remove" : "Buang", + "Reset" : "Setel ulang", + "Continue" : "Lanjutkan", + "Undo" : "Undo", + "Size" : "Ukuran" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/l10n/is.js b/l10n/is.js index a92a140c..3d246e28 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Stillingar", "Timeline" : "Tímalína", "Folders" : "Möppur", "Favorites" : "Eftirlæti", @@ -10,13 +11,16 @@ OC.L10N.register( "On this day" : "Á þessum degi", "Tags" : "Merki", "Maps" : "Landakort", - "Settings" : "Stillingar", + "Unsaved changes" : "Óvistaðar breytingar", + "Edit" : "Breyta", + "Loading …" : "Hleð inn …", "Cancel" : "Hætta við", "Delete" : "Eyða", "Download" : "Sækja", "Favorite" : "Eftirlæti", "Unarchive" : "Taka úr geymslu", "View in folder" : "Skoða í möppu", + "Share" : "Deila", "Copy public link" : "Afrita opinberan tengil", "Public link" : "Opinber tengill", "Back" : "Til baka", @@ -29,7 +33,23 @@ OC.L10N.register( "Minute" : "Mínúta", "Name" : "Heiti", "Update" : "Uppfæra", - "Loading …" : "Hleð inn …", - "Refresh" : "Endurnýja" + "Refresh" : "Endurnýja", + "Remove" : "Fjarlægja", + "Reset" : "Endurstilla", + "Continue" : "Halda áfram", + "Undo" : "Undo", + "Redo" : "Redo", + "Zoom in" : "Renna að", + "Original" : "Upprunalegt", + "Custom" : "Sérsniðið", + "Value" : "Gildi", + "Image" : "Mynd", + "Text" : "Texti", + "Size" : "Size", + "Position" : "Staða", + "Extension" : "Skráarending", + "Name is required." : "Nafn er nauðsynlegt.", + "Quality" : "Quality", + "Auto" : "Sjálfvirkt" }, "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/l10n/is.json b/l10n/is.json index 1c65ca76..2465dfdd 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Stillingar", "Timeline" : "Tímalína", "Folders" : "Möppur", "Favorites" : "Eftirlæti", @@ -8,13 +9,16 @@ "On this day" : "Á þessum degi", "Tags" : "Merki", "Maps" : "Landakort", - "Settings" : "Stillingar", + "Unsaved changes" : "Óvistaðar breytingar", + "Edit" : "Breyta", + "Loading …" : "Hleð inn …", "Cancel" : "Hætta við", "Delete" : "Eyða", "Download" : "Sækja", "Favorite" : "Eftirlæti", "Unarchive" : "Taka úr geymslu", "View in folder" : "Skoða í möppu", + "Share" : "Deila", "Copy public link" : "Afrita opinberan tengil", "Public link" : "Opinber tengill", "Back" : "Til baka", @@ -27,7 +31,23 @@ "Minute" : "Mínúta", "Name" : "Heiti", "Update" : "Uppfæra", - "Loading …" : "Hleð inn …", - "Refresh" : "Endurnýja" + "Refresh" : "Endurnýja", + "Remove" : "Fjarlægja", + "Reset" : "Endurstilla", + "Continue" : "Halda áfram", + "Undo" : "Undo", + "Redo" : "Redo", + "Zoom in" : "Renna að", + "Original" : "Upprunalegt", + "Custom" : "Sérsniðið", + "Value" : "Gildi", + "Image" : "Mynd", + "Text" : "Texti", + "Size" : "Size", + "Position" : "Staða", + "Extension" : "Skráarending", + "Name is required." : "Nafn er nauðsynlegt.", + "Quality" : "Quality", + "Auto" : "Sjálfvirkt" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" } \ No newline at end of file diff --git a/l10n/it.js b/l10n/it.js index e7352036..a5255172 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Impostazioni", "Timeline" : "Linea temporale", "Folders" : "Cartelle", "Favorites" : "Preferiti", @@ -11,13 +12,16 @@ OC.L10N.register( "On this day" : "In questo giorno", "Tags" : "Etichette", "Maps" : "Mappe", - "Settings" : "Impostazioni", + "Unsaved changes" : "Modifiche non salvate", + "Edit" : "Modifica", + "Loading …" : "Caricamento …", "Cancel" : "Annulla", "Delete" : "Elimina", "Download" : "Scarica", "Favorite" : "Preferito", "Unarchive" : "Togli dall'archivio", "View in folder" : "Visualizza nella cartella", + "Share" : "Condividi", "Search for collaborators" : "Cerca collaboratori", "Search people or groups" : "Cerca persone o gruppi", "No collaborators available" : "Nessun collaboratore disponibile", @@ -49,10 +53,29 @@ OC.L10N.register( "Name" : "Nome", "Rename person" : "Rinomina persona", "Update" : "Aggiorna", - "Loading …" : "Caricamento …", "Refresh" : "Aggiorna", + "Remove" : "Rimuovi", "Delete album" : "Elimina album", "Merge with different person" : "Unisci ad un'altra persona", - "Share folder" : "Condividi cartella" + "Share folder" : "Condividi cartella", + "Reset" : "Ripristina", + "Continue" : "Continua", + "Undo" : "Annulla", + "Redo" : "Rifai", + "Zoom in" : "Ingrandisci", + "Draw" : "Disegna", + "Original" : "Originale", + "Custom" : "Personalizzato", + "Landscape" : "Paesaggio", + "Value" : "Valore", + "Image" : "Immagine", + "Line" : "Linea", + "Text" : "Testo", + "Size" : "Dimensione", + "Position" : "Posizione", + "Extension" : "Estensione", + "Name is required." : "Il nome è richiesto.", + "Quality" : "Qualità", + "Auto" : "Automatico" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/l10n/it.json b/l10n/it.json index b3717be7..caacafb6 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Impostazioni", "Timeline" : "Linea temporale", "Folders" : "Cartelle", "Favorites" : "Preferiti", @@ -9,13 +10,16 @@ "On this day" : "In questo giorno", "Tags" : "Etichette", "Maps" : "Mappe", - "Settings" : "Impostazioni", + "Unsaved changes" : "Modifiche non salvate", + "Edit" : "Modifica", + "Loading …" : "Caricamento …", "Cancel" : "Annulla", "Delete" : "Elimina", "Download" : "Scarica", "Favorite" : "Preferito", "Unarchive" : "Togli dall'archivio", "View in folder" : "Visualizza nella cartella", + "Share" : "Condividi", "Search for collaborators" : "Cerca collaboratori", "Search people or groups" : "Cerca persone o gruppi", "No collaborators available" : "Nessun collaboratore disponibile", @@ -47,10 +51,29 @@ "Name" : "Nome", "Rename person" : "Rinomina persona", "Update" : "Aggiorna", - "Loading …" : "Caricamento …", "Refresh" : "Aggiorna", + "Remove" : "Rimuovi", "Delete album" : "Elimina album", "Merge with different person" : "Unisci ad un'altra persona", - "Share folder" : "Condividi cartella" + "Share folder" : "Condividi cartella", + "Reset" : "Ripristina", + "Continue" : "Continua", + "Undo" : "Annulla", + "Redo" : "Rifai", + "Zoom in" : "Ingrandisci", + "Draw" : "Disegna", + "Original" : "Originale", + "Custom" : "Personalizzato", + "Landscape" : "Paesaggio", + "Value" : "Valore", + "Image" : "Immagine", + "Line" : "Linea", + "Text" : "Testo", + "Size" : "Dimensione", + "Position" : "Posizione", + "Extension" : "Estensione", + "Name is required." : "Il nome è richiesto.", + "Quality" : "Qualità", + "Auto" : "Automatico" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" } \ No newline at end of file diff --git a/l10n/ja.js b/l10n/ja.js index 34d0e75c..c6cbf833 100644 --- a/l10n/ja.js +++ b/l10n/ja.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "設定", "Timeline" : "タイムライン", "Folders" : "フォルダー", "Favorites" : "お気に入り", @@ -10,13 +11,17 @@ OC.L10N.register( "On this day" : "この日", "Tags" : "タグ", "Maps" : "地図", - "Settings" : "設定", + "Error saving image" : "画像保存でのエラー", + "Unsaved changes" : "保存していない変更点", + "Edit" : "編集", + "Loading …" : "読み込み中…", "Cancel" : "キャンセル", "Delete" : "削除", "Download" : "ダウンロード", "Favorite" : "お気に入り", "Unarchive" : "アーカイブを解除", "View in folder" : "フォルダー内で表示", + "Share" : "共有", "Copy public link" : "公開リンクをコピー", "Public link" : "公開リンク", "Create new album" : "新しいアルバムを作成", @@ -36,8 +41,40 @@ OC.L10N.register( "Minute" : "分", "Name" : "名前", "Update" : "更新", - "Loading …" : "読み込み中…", "Refresh" : "更新", - "Share folder" : "フォルダーを共有" + "Remove" : "削除", + "Share folder" : "フォルダーを共有", + "Reset" : "リセット", + "All changes will be lost." : "全ての変更がなくなります", + "Are you sure you want to continue?" : "本当に続けてよろしいですか?", + "Continue" : "続ける", + "Undo" : "元に戻す", + "Redo" : "やり直し", + "Show original image" : "オリジナル画像を表示する", + "Zoom in" : "拡大", + "Zoom out" : "縮小", + "Filters" : "フィルター", + "Draw" : "描画", + "Resize" : "リサイズ", + "Invalid image." : "無効な画像", + "Error while uploading the image." : "画像のアップロードでのエラー", + "are not images" : "画像ではありません", + "is not an image" : "画像ではありません", + "to be uploaded" : "アップロードされる", + "Crop" : "クロップ", + "Original" : "オリジナル", + "Custom" : "カスタム", + "Landscape" : "ランドスケープ", + "Portrait" : "ポートレート", + "Value" : "値", + "Image" : "画像", + "Rotate" : "回転", + "Text" : "テキスト", + "Size" : "サイズ", + "Position" : "位置", + "Extension" : "拡張", + "Name is required." : "名前は必須です。", + "Quality" : "品質", + "Auto" : "自動" }, "nplurals=1; plural=0;"); diff --git a/l10n/ja.json b/l10n/ja.json index de442f6f..8c4d589b 100644 --- a/l10n/ja.json +++ b/l10n/ja.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "設定", "Timeline" : "タイムライン", "Folders" : "フォルダー", "Favorites" : "お気に入り", @@ -8,13 +9,17 @@ "On this day" : "この日", "Tags" : "タグ", "Maps" : "地図", - "Settings" : "設定", + "Error saving image" : "画像保存でのエラー", + "Unsaved changes" : "保存していない変更点", + "Edit" : "編集", + "Loading …" : "読み込み中…", "Cancel" : "キャンセル", "Delete" : "削除", "Download" : "ダウンロード", "Favorite" : "お気に入り", "Unarchive" : "アーカイブを解除", "View in folder" : "フォルダー内で表示", + "Share" : "共有", "Copy public link" : "公開リンクをコピー", "Public link" : "公開リンク", "Create new album" : "新しいアルバムを作成", @@ -34,8 +39,40 @@ "Minute" : "分", "Name" : "名前", "Update" : "更新", - "Loading …" : "読み込み中…", "Refresh" : "更新", - "Share folder" : "フォルダーを共有" + "Remove" : "削除", + "Share folder" : "フォルダーを共有", + "Reset" : "リセット", + "All changes will be lost." : "全ての変更がなくなります", + "Are you sure you want to continue?" : "本当に続けてよろしいですか?", + "Continue" : "続ける", + "Undo" : "元に戻す", + "Redo" : "やり直し", + "Show original image" : "オリジナル画像を表示する", + "Zoom in" : "拡大", + "Zoom out" : "縮小", + "Filters" : "フィルター", + "Draw" : "描画", + "Resize" : "リサイズ", + "Invalid image." : "無効な画像", + "Error while uploading the image." : "画像のアップロードでのエラー", + "are not images" : "画像ではありません", + "is not an image" : "画像ではありません", + "to be uploaded" : "アップロードされる", + "Crop" : "クロップ", + "Original" : "オリジナル", + "Custom" : "カスタム", + "Landscape" : "ランドスケープ", + "Portrait" : "ポートレート", + "Value" : "値", + "Image" : "画像", + "Rotate" : "回転", + "Text" : "テキスト", + "Size" : "サイズ", + "Position" : "位置", + "Extension" : "拡張", + "Name is required." : "名前は必須です。", + "Quality" : "品質", + "Auto" : "自動" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/l10n/ka_GE.js b/l10n/ka_GE.js index f8a5ba46..d6bc89a3 100644 --- a/l10n/ka_GE.js +++ b/l10n/ka_GE.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "პარამეტრები", "Folders" : "დირექტორიები", "Favorites" : "რჩეულები", "Videos" : "ვიდეოები", "Archive" : "არქივი", "Tags" : "ტეგები", "Maps" : "რუკები", - "Settings" : "პარამეტრები", + "Unsaved changes" : "შეუნახავი ცვლილებები", + "Edit" : "შეცვლა", "Cancel" : "უარყოფა", "Delete" : "წაშლა", "Download" : "ჩამოტვირთვა", "Favorite" : "რჩეული", "Unarchive" : "ამოღება", "View in folder" : "ჩვენება დირექტორიაში", + "Share" : "გაზიარება", "Back" : "უკან", "Save" : "შენახვა", "Month" : "თვე", @@ -22,6 +25,15 @@ OC.L10N.register( "Hour" : "საათი", "Name" : "სახელი", "Update" : "განახლება", - "Refresh" : "განახლება" + "Refresh" : "განახლება", + "Remove" : "წაშლა", + "Reset" : "საწყის მდოგმარეობაში დაბრუნება", + "Continue" : "გაგრძელება", + "Undo" : "დაბრუნება", + "Custom" : "ინდივიდუალური", + "Value" : "მნიშვნელობა", + "Text" : "ტექსტი", + "Size" : "ზომა", + "Position" : "პოზიცია" }, "nplurals=2; plural=(n!=1);"); diff --git a/l10n/ka_GE.json b/l10n/ka_GE.json index 261a10a2..997e5b6a 100644 --- a/l10n/ka_GE.json +++ b/l10n/ka_GE.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "პარამეტრები", "Folders" : "დირექტორიები", "Favorites" : "რჩეულები", "Videos" : "ვიდეოები", "Archive" : "არქივი", "Tags" : "ტეგები", "Maps" : "რუკები", - "Settings" : "პარამეტრები", + "Unsaved changes" : "შეუნახავი ცვლილებები", + "Edit" : "შეცვლა", "Cancel" : "უარყოფა", "Delete" : "წაშლა", "Download" : "ჩამოტვირთვა", "Favorite" : "რჩეული", "Unarchive" : "ამოღება", "View in folder" : "ჩვენება დირექტორიაში", + "Share" : "გაზიარება", "Back" : "უკან", "Save" : "შენახვა", "Month" : "თვე", @@ -20,6 +23,15 @@ "Hour" : "საათი", "Name" : "სახელი", "Update" : "განახლება", - "Refresh" : "განახლება" + "Refresh" : "განახლება", + "Remove" : "წაშლა", + "Reset" : "საწყის მდოგმარეობაში დაბრუნება", + "Continue" : "გაგრძელება", + "Undo" : "დაბრუნება", + "Custom" : "ინდივიდუალური", + "Value" : "მნიშვნელობა", + "Text" : "ტექსტი", + "Size" : "ზომა", + "Position" : "პოზიცია" },"pluralForm" :"nplurals=2; plural=(n!=1);" } \ No newline at end of file diff --git a/l10n/kab.js b/l10n/kab.js index a20a95e8..bbba92d4 100644 --- a/l10n/kab.js +++ b/l10n/kab.js @@ -1,18 +1,23 @@ OC.L10N.register( "memories", { + "Settings" : "Iɣewwaṛen", "Favorites" : "Imenyafen", "Videos" : "Tividyutin", "Tags" : "Tibzimin", - "Settings" : "Iɣewwaṛen", + "Edit" : "Ẓreg", "Cancel" : "Sefsex", "Delete" : "Kkes", "Download" : "Sider", "Favorite" : "Menyif", + "Share" : "Bḍu", "Back" : "Retour", "Save" : "Sekles", "Hour" : "Asrag", "Name" : "Nom", - "Refresh" : "Sismeḍ" + "Refresh" : "Sismeḍ", + "Remove" : "Kkes", + "Continue" : "Continuer", + "Size" : "Teɣzi" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/kab.json b/l10n/kab.json index 7f0662c1..b23f3ba7 100644 --- a/l10n/kab.json +++ b/l10n/kab.json @@ -1,16 +1,21 @@ { "translations": { + "Settings" : "Iɣewwaṛen", "Favorites" : "Imenyafen", "Videos" : "Tividyutin", "Tags" : "Tibzimin", - "Settings" : "Iɣewwaṛen", + "Edit" : "Ẓreg", "Cancel" : "Sefsex", "Delete" : "Kkes", "Download" : "Sider", "Favorite" : "Menyif", + "Share" : "Bḍu", "Back" : "Retour", "Save" : "Sekles", "Hour" : "Asrag", "Name" : "Nom", - "Refresh" : "Sismeḍ" + "Refresh" : "Sismeḍ", + "Remove" : "Kkes", + "Continue" : "Continuer", + "Size" : "Teɣzi" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/km.js b/l10n/km.js index 1862d36e..de2960b5 100644 --- a/l10n/km.js +++ b/l10n/km.js @@ -1,13 +1,15 @@ OC.L10N.register( "memories", { + "Settings" : "ការកំណត់", "Favorites" : "Favorites", "Tags" : "ស្លាក", "Maps" : "ផែនទី", - "Settings" : "ការកំណត់", + "Edit" : "កែប្រែ", "Cancel" : "បោះបង់", "Delete" : "លុប", "Download" : "ទាញយក", + "Share" : "ចែករំលែក", "Back" : "ត្រឡប់ក្រោយ", "Save" : "រក្សាទុក", "Year" : "ឆ្នាំ", @@ -15,6 +17,11 @@ OC.L10N.register( "Day" : "ថ្ងៃ", "Time" : "ម៉ោង", "Name" : "ឈ្មោះ", - "Update" : "ធ្វើបច្ចុប្បន្នភាព" + "Update" : "ធ្វើបច្ចុប្បន្នភាព", + "Remove" : "ដកចេញ", + "Continue" : "បន្ត", + "Value" : "តម្លៃ", + "Line" : "បន្ទាត់", + "Size" : "ទំហំ" }, "nplurals=1; plural=0;"); diff --git a/l10n/km.json b/l10n/km.json index 900c0635..cd73b8af 100644 --- a/l10n/km.json +++ b/l10n/km.json @@ -1,11 +1,13 @@ { "translations": { + "Settings" : "ការកំណត់", "Favorites" : "Favorites", "Tags" : "ស្លាក", "Maps" : "ផែនទី", - "Settings" : "ការកំណត់", + "Edit" : "កែប្រែ", "Cancel" : "បោះបង់", "Delete" : "លុប", "Download" : "ទាញយក", + "Share" : "ចែករំលែក", "Back" : "ត្រឡប់ក្រោយ", "Save" : "រក្សាទុក", "Year" : "ឆ្នាំ", @@ -13,6 +15,11 @@ "Day" : "ថ្ងៃ", "Time" : "ម៉ោង", "Name" : "ឈ្មោះ", - "Update" : "ធ្វើបច្ចុប្បន្នភាព" + "Update" : "ធ្វើបច្ចុប្បន្នភាព", + "Remove" : "ដកចេញ", + "Continue" : "បន្ត", + "Value" : "តម្លៃ", + "Line" : "បន្ទាត់", + "Size" : "ទំហំ" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/l10n/kn.js b/l10n/kn.js index acd90b95..01462cf5 100644 --- a/l10n/kn.js +++ b/l10n/kn.js @@ -1,15 +1,21 @@ OC.L10N.register( "memories", { + "Settings" : "ಆಯ್ಕೆ", "Favorites" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", "Maps" : "ನಕಾಶೆ", - "Settings" : "ಆಯ್ಕೆ", + "Edit" : "ಸಂಪಾದಿಸು", "Cancel" : "ರದ್ದು", "Delete" : "ಅಳಿಸಿ", "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ", "Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", + "Share" : "ಹಂಚಿಕೊಳ್ಳಿ", "Save" : "ಉಳಿಸಿ", "Time" : "ಸಮಯ", - "Name" : "ಹೆಸರು" + "Name" : "ಹೆಸರು", + "Remove" : "ತೆಗೆದುಹಾಕಿ", + "Reset" : "ಮರುಹೊಂದಿಸಿ", + "Continue" : "ಮುಂದುವರಿಸಿ", + "Size" : " ಗಾತ್ರ" }, "nplurals=2; plural=(n > 1);"); diff --git a/l10n/kn.json b/l10n/kn.json index 20f8cad7..b02bf403 100644 --- a/l10n/kn.json +++ b/l10n/kn.json @@ -1,13 +1,19 @@ { "translations": { + "Settings" : "ಆಯ್ಕೆ", "Favorites" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", "Maps" : "ನಕಾಶೆ", - "Settings" : "ಆಯ್ಕೆ", + "Edit" : "ಸಂಪಾದಿಸು", "Cancel" : "ರದ್ದು", "Delete" : "ಅಳಿಸಿ", "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ", "Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", + "Share" : "ಹಂಚಿಕೊಳ್ಳಿ", "Save" : "ಉಳಿಸಿ", "Time" : "ಸಮಯ", - "Name" : "ಹೆಸರು" + "Name" : "ಹೆಸರು", + "Remove" : "ತೆಗೆದುಹಾಕಿ", + "Reset" : "ಮರುಹೊಂದಿಸಿ", + "Continue" : "ಮುಂದುವರಿಸಿ", + "Size" : " ಗಾತ್ರ" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/l10n/ko.js b/l10n/ko.js index 2ff4e1f2..800603eb 100644 --- a/l10n/ko.js +++ b/l10n/ko.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "설정", "Timeline" : "타임라인", "Folders" : "폴더", "Favorites" : "즐겨찾기", @@ -8,13 +9,16 @@ OC.L10N.register( "Archive" : "보관", "Tags" : "태그", "Maps" : "지도", - "Settings" : "설정", + "Unsaved changes" : "저장하지 않은 변경 사항", + "Edit" : "편집", + "Loading …" : "불러오는 중 …", "Cancel" : "취소", "Delete" : "삭제", "Download" : "다운로드", "Favorite" : "즐겨찾기", "Unarchive" : "보관 해제", "View in folder" : "폴더에서 보기", + "Share" : "공유", "Copy public link" : "공용 링크 복사", "Public link" : "공개 링크", "Back" : "뒤로", @@ -26,7 +30,21 @@ OC.L10N.register( "Hour" : "시간", "Name" : "이름", "Update" : "업데이트", - "Loading …" : "불러오는 중 …", - "Refresh" : "새로 고침" + "Refresh" : "새로 고침", + "Remove" : "삭제", + "Reset" : "초기화", + "Continue" : "계속", + "Undo" : "실행 취소", + "Redo" : "다시 실행", + "Zoom in" : "확대", + "Original" : "원본", + "Custom" : "사용자 정의", + "Value" : "값", + "Text" : "텍스트", + "Size" : "크기", + "Position" : "위치", + "Extension" : "확장자", + "Quality" : "품질", + "Auto" : "자동" }, "nplurals=1; plural=0;"); diff --git a/l10n/ko.json b/l10n/ko.json index 59cd980c..62749376 100644 --- a/l10n/ko.json +++ b/l10n/ko.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "설정", "Timeline" : "타임라인", "Folders" : "폴더", "Favorites" : "즐겨찾기", @@ -6,13 +7,16 @@ "Archive" : "보관", "Tags" : "태그", "Maps" : "지도", - "Settings" : "설정", + "Unsaved changes" : "저장하지 않은 변경 사항", + "Edit" : "편집", + "Loading …" : "불러오는 중 …", "Cancel" : "취소", "Delete" : "삭제", "Download" : "다운로드", "Favorite" : "즐겨찾기", "Unarchive" : "보관 해제", "View in folder" : "폴더에서 보기", + "Share" : "공유", "Copy public link" : "공용 링크 복사", "Public link" : "공개 링크", "Back" : "뒤로", @@ -24,7 +28,21 @@ "Hour" : "시간", "Name" : "이름", "Update" : "업데이트", - "Loading …" : "불러오는 중 …", - "Refresh" : "새로 고침" + "Refresh" : "새로 고침", + "Remove" : "삭제", + "Reset" : "초기화", + "Continue" : "계속", + "Undo" : "실행 취소", + "Redo" : "다시 실행", + "Zoom in" : "확대", + "Original" : "원본", + "Custom" : "사용자 정의", + "Value" : "값", + "Text" : "텍스트", + "Size" : "크기", + "Position" : "위치", + "Extension" : "확장자", + "Quality" : "품질", + "Auto" : "자동" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/l10n/lb.js b/l10n/lb.js index 3cb030ef..22b6ad8f 100644 --- a/l10n/lb.js +++ b/l10n/lb.js @@ -1,15 +1,17 @@ OC.L10N.register( "memories", { + "Settings" : "Astellungen", "Favorites" : "Favoriten", "Tags" : "Tags", "Maps" : "Kaarten", - "Settings" : "Astellungen", + "Edit" : "Änneren", "Cancel" : "Ofbriechen", "Delete" : "Läschen", "Download" : "Eroflueden", "Favorite" : "Favorit", "View in folder" : "Kuk am Dossier ", + "Share" : "Deelen", "Back" : "Zeréck", "Save" : "Späicheren", "Month" : "Mount", @@ -18,6 +20,11 @@ OC.L10N.register( "Hour" : "Stonn", "Name" : "Numm", "Update" : "Update", - "Refresh" : "Opfrëschen" + "Refresh" : "Opfrëschen", + "Remove" : "Läschen", + "Reset" : "Zeréck setzen", + "Continue" : "Weider", + "Custom" : "Individualiséier", + "Size" : "Gréisst" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/lb.json b/l10n/lb.json index 5e4d0139..8fa4b101 100644 --- a/l10n/lb.json +++ b/l10n/lb.json @@ -1,13 +1,15 @@ { "translations": { + "Settings" : "Astellungen", "Favorites" : "Favoriten", "Tags" : "Tags", "Maps" : "Kaarten", - "Settings" : "Astellungen", + "Edit" : "Änneren", "Cancel" : "Ofbriechen", "Delete" : "Läschen", "Download" : "Eroflueden", "Favorite" : "Favorit", "View in folder" : "Kuk am Dossier ", + "Share" : "Deelen", "Back" : "Zeréck", "Save" : "Späicheren", "Month" : "Mount", @@ -16,6 +18,11 @@ "Hour" : "Stonn", "Name" : "Numm", "Update" : "Update", - "Refresh" : "Opfrëschen" + "Refresh" : "Opfrëschen", + "Remove" : "Läschen", + "Reset" : "Zeréck setzen", + "Continue" : "Weider", + "Custom" : "Individualiséier", + "Size" : "Gréisst" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/lo.js b/l10n/lo.js index bbd8c0c9..e4eb65d4 100644 --- a/l10n/lo.js +++ b/l10n/lo.js @@ -1,19 +1,25 @@ OC.L10N.register( "memories", { + "Settings" : "ການຕັ້ງຄ່າ", "Favorites" : "ລາຍການທີ່ມັກ", "Videos" : "ວິດີໂອ", "Tags" : "ປ້າຍກຳກັບ", - "Settings" : "ການຕັ້ງຄ່າ", + "Edit" : "ແກ້ໄຂ", + "Loading …" : "ກຳລັງໂຫຼດ", "Cancel" : "ຍົກເລີກ", "Delete" : "ລຶບ", "Download" : "ດາວໂຫລດ", "Favorite" : "ລາຍການທີ່ມັກ", "View in folder" : "ເບິ່ງໃນໂຟນເດີ", + "Share" : "ແບ່ງປັນ", "Back" : "ຫຼັງ", "Save" : "ບັນທຶກ", "Name" : "ຊື່", - "Loading …" : "ກຳລັງໂຫຼດ", - "Refresh" : "Refresh" + "Refresh" : "Refresh", + "Remove" : "ຍ້າຍອອກ", + "Continue" : "ສືບຕໍ່", + "Original" : "ຕົ້ນສະບັບ", + "Size" : "ຂະຫນາດ" }, "nplurals=1; plural=0;"); diff --git a/l10n/lo.json b/l10n/lo.json index ee482022..dc081a26 100644 --- a/l10n/lo.json +++ b/l10n/lo.json @@ -1,17 +1,23 @@ { "translations": { + "Settings" : "ການຕັ້ງຄ່າ", "Favorites" : "ລາຍການທີ່ມັກ", "Videos" : "ວິດີໂອ", "Tags" : "ປ້າຍກຳກັບ", - "Settings" : "ການຕັ້ງຄ່າ", + "Edit" : "ແກ້ໄຂ", + "Loading …" : "ກຳລັງໂຫຼດ", "Cancel" : "ຍົກເລີກ", "Delete" : "ລຶບ", "Download" : "ດາວໂຫລດ", "Favorite" : "ລາຍການທີ່ມັກ", "View in folder" : "ເບິ່ງໃນໂຟນເດີ", + "Share" : "ແບ່ງປັນ", "Back" : "ຫຼັງ", "Save" : "ບັນທຶກ", "Name" : "ຊື່", - "Loading …" : "ກຳລັງໂຫຼດ", - "Refresh" : "Refresh" + "Refresh" : "Refresh", + "Remove" : "ຍ້າຍອອກ", + "Continue" : "ສືບຕໍ່", + "Original" : "ຕົ້ນສະບັບ", + "Size" : "ຂະຫນາດ" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/l10n/lt_LT.js b/l10n/lt_LT.js index bb2e1d66..d89ebc8e 100644 --- a/l10n/lt_LT.js +++ b/l10n/lt_LT.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Prisiminimai", "Yet another photo management app" : "Dar viena nuotraukų tvarkymo programėlė", + "Settings" : "Nustatymai", "Timeline" : "Laiko juosta", "Folders" : "Aplankai", "Favorites" : "Mėgstami", @@ -13,8 +14,13 @@ OC.L10N.register( "On this day" : "Šią dieną", "Tags" : "Žymės", "Maps" : "Žemėlapiai", - "Settings" : "Nustatymai", + "EXIF" : "EXIF", "Click here to start" : "Spustelėkite čia, norėdami pradėti", + "Image saved successfully" : "Paveikslas sėkmingai įrašytas", + "Error saving image" : "Klaida įrašant paveikslą", + "Unsaved changes" : "Neįrašyti pakeitimai", + "Edit" : "Taisyti", + "Loading …" : "Įkeliama…", "Cancel" : "Atsisakyti", "Delete" : "Ištrinti", "Remove from album" : "Šalinti iš albumo", @@ -33,6 +39,7 @@ OC.L10N.register( "Square grid mode" : "Kvadratinio tinklelio veiksena", "Your Timeline" : "Jūsų laiko juostą", "Failed to load some photos" : "Nepavyko įkelti kai kurių nuotraukų", + "Share" : "Bendrinti", "Sidebar" : "Šoninė juosta", "Processing … {n}/{m}" : "Apdorojama… {n}/{m}", "Search people or groups" : "Ieškoti žmonių ar grupių", @@ -77,23 +84,51 @@ OC.L10N.register( "Rename person" : "Pervadinti žmogų", "Update" : "Atnaujinti", "Failed to rename {oldName} to {name}." : "Nepavyko pervadinti {oldName} į {name}.", - "Loading …" : "Įkeliama…", "Are you sure you want to merge {name} with {newName}?" : "Ar tikrai norite sulieti {name} su {newName}?", "Too many failures, aborting" : "Per daug nesėkmių, nutraukiama", "Error while moving {basename}" : "Klaida perkeliant {basename}", "Failed to move {name}." : "Nepavyko perkelti {name}.", + "Share Folder" : "Bendrinti aplanką", "Refresh" : "Įkelti iš naujo", + "Remove" : "Šalinti", "Share album" : "Bendrinti albumą", "Delete album" : "Ištrinti albumą", "Merge with different person" : "Sulieti su kitu žmogumi", "Share folder" : "Bendrinti aplanką", "Move left" : "Perkelti kairėn", "Move right" : "Perkelti dešinėn", + "Save as" : "Įrašyti kaip", + "Reset" : "Atstatyti", + "All changes will be lost." : "Visi pakeitimai bus prarasti.", + "Are you sure you want to continue?" : "Ar tikrai norite tęsti?", + "Continue" : "Tęsti", + "Undo" : "Atšaukti", + "Redo" : "Grąžinti", + "Zoom in" : "Didinti", + "Zoom out" : "Mažinti", + "Toggle zoom menu" : "Perjungti mastelio meniu", + "Resize" : "Keisti dydį", + "Crop" : "Apkirpti", + "Custom" : "Tinkinti", + "Landscape" : "Kraštovaizdis", + "Portrait" : "Portretas", + "Value" : "Reikšmė", + "Image" : "Paveikslas", + "Rotate" : "Pasukti", + "Text" : "Tekstas", + "Font family" : "Šriftas", + "Size" : "Dydis", + "Add as text" : "Pridėti kaip tekstą", + "Position" : "Vieta", + "Name is required." : "Vardas yra būtinas.", + "Quality" : "Kokybė", + "Auto" : "Automatiškai", "Failed to create {albumName}." : "Nepavyko sukurti {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Nepavyko pervadinti {currentAlbumName} į {newAlbumName}.", "General Failure" : "Bendrinė nesėkmė", "Error: {msg}" : "Klaida: {msg}", "Failed to delete files." : "Nepavyko ištrinti failų.", - "Failed to delete {fileName}." : "Nepavyko ištrinti {fileName}." + "Failed to delete {fileName}." : "Nepavyko ištrinti {fileName}.", + "Failed to download some files." : "Nepavyko atsisiųsti kai kurių failų." }, "nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/l10n/lt_LT.json b/l10n/lt_LT.json index 80f1ba20..1ef85ba0 100644 --- a/l10n/lt_LT.json +++ b/l10n/lt_LT.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Prisiminimai", "Yet another photo management app" : "Dar viena nuotraukų tvarkymo programėlė", + "Settings" : "Nustatymai", "Timeline" : "Laiko juosta", "Folders" : "Aplankai", "Favorites" : "Mėgstami", @@ -11,8 +12,13 @@ "On this day" : "Šią dieną", "Tags" : "Žymės", "Maps" : "Žemėlapiai", - "Settings" : "Nustatymai", + "EXIF" : "EXIF", "Click here to start" : "Spustelėkite čia, norėdami pradėti", + "Image saved successfully" : "Paveikslas sėkmingai įrašytas", + "Error saving image" : "Klaida įrašant paveikslą", + "Unsaved changes" : "Neįrašyti pakeitimai", + "Edit" : "Taisyti", + "Loading …" : "Įkeliama…", "Cancel" : "Atsisakyti", "Delete" : "Ištrinti", "Remove from album" : "Šalinti iš albumo", @@ -31,6 +37,7 @@ "Square grid mode" : "Kvadratinio tinklelio veiksena", "Your Timeline" : "Jūsų laiko juostą", "Failed to load some photos" : "Nepavyko įkelti kai kurių nuotraukų", + "Share" : "Bendrinti", "Sidebar" : "Šoninė juosta", "Processing … {n}/{m}" : "Apdorojama… {n}/{m}", "Search people or groups" : "Ieškoti žmonių ar grupių", @@ -75,23 +82,51 @@ "Rename person" : "Pervadinti žmogų", "Update" : "Atnaujinti", "Failed to rename {oldName} to {name}." : "Nepavyko pervadinti {oldName} į {name}.", - "Loading …" : "Įkeliama…", "Are you sure you want to merge {name} with {newName}?" : "Ar tikrai norite sulieti {name} su {newName}?", "Too many failures, aborting" : "Per daug nesėkmių, nutraukiama", "Error while moving {basename}" : "Klaida perkeliant {basename}", "Failed to move {name}." : "Nepavyko perkelti {name}.", + "Share Folder" : "Bendrinti aplanką", "Refresh" : "Įkelti iš naujo", + "Remove" : "Šalinti", "Share album" : "Bendrinti albumą", "Delete album" : "Ištrinti albumą", "Merge with different person" : "Sulieti su kitu žmogumi", "Share folder" : "Bendrinti aplanką", "Move left" : "Perkelti kairėn", "Move right" : "Perkelti dešinėn", + "Save as" : "Įrašyti kaip", + "Reset" : "Atstatyti", + "All changes will be lost." : "Visi pakeitimai bus prarasti.", + "Are you sure you want to continue?" : "Ar tikrai norite tęsti?", + "Continue" : "Tęsti", + "Undo" : "Atšaukti", + "Redo" : "Grąžinti", + "Zoom in" : "Didinti", + "Zoom out" : "Mažinti", + "Toggle zoom menu" : "Perjungti mastelio meniu", + "Resize" : "Keisti dydį", + "Crop" : "Apkirpti", + "Custom" : "Tinkinti", + "Landscape" : "Kraštovaizdis", + "Portrait" : "Portretas", + "Value" : "Reikšmė", + "Image" : "Paveikslas", + "Rotate" : "Pasukti", + "Text" : "Tekstas", + "Font family" : "Šriftas", + "Size" : "Dydis", + "Add as text" : "Pridėti kaip tekstą", + "Position" : "Vieta", + "Name is required." : "Vardas yra būtinas.", + "Quality" : "Kokybė", + "Auto" : "Automatiškai", "Failed to create {albumName}." : "Nepavyko sukurti {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Nepavyko pervadinti {currentAlbumName} į {newAlbumName}.", "General Failure" : "Bendrinė nesėkmė", "Error: {msg}" : "Klaida: {msg}", "Failed to delete files." : "Nepavyko ištrinti failų.", - "Failed to delete {fileName}." : "Nepavyko ištrinti {fileName}." + "Failed to delete {fileName}." : "Nepavyko ištrinti {fileName}.", + "Failed to download some files." : "Nepavyko atsisiųsti kai kurių failų." },"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);" } \ No newline at end of file diff --git a/l10n/lv.js b/l10n/lv.js index ad7818f2..4c55d1c4 100644 --- a/l10n/lv.js +++ b/l10n/lv.js @@ -1,26 +1,58 @@ OC.L10N.register( "memories", { + "Settings" : "Iestatījumi", "Folders" : "Mapes", "Favorites" : "Favorīti", "Videos" : "Video", + "Albums" : "Albumi", "Archive" : "Arhīvi", "Tags" : "Birkas", "Maps" : "Karte", - "Settings" : "Iestatījumi", + "EXIF" : "EXIF", + "Edit" : "Rediģēt", "Cancel" : "Atcelt", "Delete" : "Dzēst", "Download" : "Lejupielādēt", "Favorite" : "Favorīts", "View in folder" : "Skatīt mapē", + "Share" : "Koplietot", + "Sidebar" : "Sānjosla", + "Copy the public link" : "Kopējiet publisko saiti", + "Delete the public link" : "Dzēst publisko saiti", + "Public link copied!" : "Publiskā saite nokopēta!", + "Copy public link" : "Kopējiet publisko saiti", + "Share via public link" : "Kopīgojiet, izmantojot publisko saiti", + "Public link" : "Publiskā saite", "Back" : "Atpakaļ", "Save" : "Saglabāt", + "Create album" : "Izveidot albumu", "Month" : "Mēnesis", "Day" : "Diena", "Time" : "Laiks", "Hour" : "Stunda", "Name" : "Vārds", "Update" : "Atjaunināt", - "Refresh" : "Atsvaidzināt" + "Share Folder" : "Kopīgot mapi", + "Refresh" : "Atsvaidzināt", + "Remove" : "Noņemt", + "Save as" : "Saglabāt kā", + "Reset" : "Atiestatīt", + "Continue" : "Turpināt", + "Undo" : "Atsaukt", + "Redo" : "Atcelt atsaukšanu", + "Original" : "Oriģināls", + "Custom" : "Pielāgots", + "Value" : "Vērtība", + "Image" : "Attēli", + "Text" : "Teksts", + "Size" : "Izmērs", + "Save image as" : "Saglabāt attēlu kā", + "Quality" : "Kvalitāte", + "Saved image size (width x height)" : "Saglabātā attēla izmērs (platums x augstums)", + "Actual size (100%)" : "Faktiskais izmērs (100%)", + "Fit size" : "Atbilst izmēram", + "Auto" : "Automātiski", + "Shared Folder" : "Koplietotā mape" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/l10n/lv.json b/l10n/lv.json index e9036afa..fe87e73c 100644 --- a/l10n/lv.json +++ b/l10n/lv.json @@ -1,24 +1,56 @@ { "translations": { + "Settings" : "Iestatījumi", "Folders" : "Mapes", "Favorites" : "Favorīti", "Videos" : "Video", + "Albums" : "Albumi", "Archive" : "Arhīvi", "Tags" : "Birkas", "Maps" : "Karte", - "Settings" : "Iestatījumi", + "EXIF" : "EXIF", + "Edit" : "Rediģēt", "Cancel" : "Atcelt", "Delete" : "Dzēst", "Download" : "Lejupielādēt", "Favorite" : "Favorīts", "View in folder" : "Skatīt mapē", + "Share" : "Koplietot", + "Sidebar" : "Sānjosla", + "Copy the public link" : "Kopējiet publisko saiti", + "Delete the public link" : "Dzēst publisko saiti", + "Public link copied!" : "Publiskā saite nokopēta!", + "Copy public link" : "Kopējiet publisko saiti", + "Share via public link" : "Kopīgojiet, izmantojot publisko saiti", + "Public link" : "Publiskā saite", "Back" : "Atpakaļ", "Save" : "Saglabāt", + "Create album" : "Izveidot albumu", "Month" : "Mēnesis", "Day" : "Diena", "Time" : "Laiks", "Hour" : "Stunda", "Name" : "Vārds", "Update" : "Atjaunināt", - "Refresh" : "Atsvaidzināt" + "Share Folder" : "Kopīgot mapi", + "Refresh" : "Atsvaidzināt", + "Remove" : "Noņemt", + "Save as" : "Saglabāt kā", + "Reset" : "Atiestatīt", + "Continue" : "Turpināt", + "Undo" : "Atsaukt", + "Redo" : "Atcelt atsaukšanu", + "Original" : "Oriģināls", + "Custom" : "Pielāgots", + "Value" : "Vērtība", + "Image" : "Attēli", + "Text" : "Teksts", + "Size" : "Izmērs", + "Save image as" : "Saglabāt attēlu kā", + "Quality" : "Kvalitāte", + "Saved image size (width x height)" : "Saglabātā attēla izmērs (platums x augstums)", + "Actual size (100%)" : "Faktiskais izmērs (100%)", + "Fit size" : "Atbilst izmēram", + "Auto" : "Automātiski", + "Shared Folder" : "Koplietotā mape" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" } \ No newline at end of file diff --git a/l10n/mk.js b/l10n/mk.js index fac85f20..0d6b14e9 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Параметри", "Timeline" : "Времеплов", "Folders" : "Папки", "Favorites" : "Омилени", @@ -11,13 +12,16 @@ OC.L10N.register( "On this day" : "На денешен ден", "Tags" : "Ознаки", "Maps" : "Мапи", - "Settings" : "Параметри", + "Unsaved changes" : "Незачувани промени", + "Edit" : "Уреди", + "Loading …" : "Се вчитува…", "Cancel" : "Откажи", "Delete" : "Избриши", "Download" : "Преземи", "Favorite" : "Омилен", "View in folder" : "Погледни во папката", "Add to album" : "Додади во албум", + "Share" : "Сподели", "Sidebar" : "Странична лента", "Copy public link" : "Копирај јавен линк", "Public link" : "Јавен линк", @@ -40,11 +44,58 @@ OC.L10N.register( "Name" : "Име", "Rename person" : "Преименувај личност", "Update" : "Ажурирај", - "Loading …" : "Се вчитува…", "Refresh" : "Освежи", + "Remove" : "Отстрани ", "Delete album" : "Избриши албум", "Merge with different person" : "Спој со друга личност", "Share folder" : "Сподели папка", + "Save as" : "Зачувај како", + "Reset" : "Ресетирање", + "All changes will be lost." : "Сите промени ќе се изгубат.", + "Are you sure you want to continue?" : "Дали си сигурен дека сакаш да продолжиш?", + "Continue" : "Продолжи", + "Undo" : "Назад", + "Redo" : "Напред", + "Show original image" : "Прикажи ја оргиналната слика", + "Zoom in" : "Зумирај", + "Zoom out" : "Од зумирај", + "Toggle zoom menu" : "Прикажи мени за зумирање", + "Adjust" : "Прилагоди", + "Fine-tune" : "Фимо прилагодување", + "Filters" : "Филтри", + "Watermark" : "Воден печат", + "Draw" : "Нацрт", + "Resize" : "Промени големина", + "Invalid image." : "Невалидна слика.", + "Error while uploading the image." : "Грешка при прикачување на сликата.", + "are not images" : "не се слики", + "is not an image" : "не е слика", + "to be uploaded" : "за да се орикачат", + "Crop" : "Пресечи", + "Original" : "Оргинал", + "Custom" : "Прилагодено", + "Square" : "Квадрат", + "Landscape" : "Пејсаж", + "Portrait" : "Портрет", + "Ellipse" : "Елипса", + "Classic TV" : "Класичен ТВ", + "Arrow" : "Стрела", + "Brightness" : "Светлина", + "Contrast" : "Контраст", + "Value" : "Вредност", + "Image" : "Слика", + "+ Add image" : "+ Додади слика", + "Line" : "Линија", + "Text" : "Текст", + "Size" : "Големина", + "Position" : "Позиција", + "Save image as" : "Зачувај ја сликата како", + "Extension" : "Екстензија", + "Name is required." : "Потребно е име.", + "Quality" : "Квалитет", + "Actual size (100%)" : "Актуелна големина (100%)", + "Fit size" : "Соодветна големина", + "Auto" : "Автоматски", "Failed to create {albumName}." : "Неуспешно креирање {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Неуспешно преименување на {currentAlbumName} во {newAlbumName}.", "Failed to favorite {fileName}." : "Неуспешно додавање во омилени {fileName}." diff --git a/l10n/mk.json b/l10n/mk.json index b48c182d..af353775 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Параметри", "Timeline" : "Времеплов", "Folders" : "Папки", "Favorites" : "Омилени", @@ -9,13 +10,16 @@ "On this day" : "На денешен ден", "Tags" : "Ознаки", "Maps" : "Мапи", - "Settings" : "Параметри", + "Unsaved changes" : "Незачувани промени", + "Edit" : "Уреди", + "Loading …" : "Се вчитува…", "Cancel" : "Откажи", "Delete" : "Избриши", "Download" : "Преземи", "Favorite" : "Омилен", "View in folder" : "Погледни во папката", "Add to album" : "Додади во албум", + "Share" : "Сподели", "Sidebar" : "Странична лента", "Copy public link" : "Копирај јавен линк", "Public link" : "Јавен линк", @@ -38,11 +42,58 @@ "Name" : "Име", "Rename person" : "Преименувај личност", "Update" : "Ажурирај", - "Loading …" : "Се вчитува…", "Refresh" : "Освежи", + "Remove" : "Отстрани ", "Delete album" : "Избриши албум", "Merge with different person" : "Спој со друга личност", "Share folder" : "Сподели папка", + "Save as" : "Зачувај како", + "Reset" : "Ресетирање", + "All changes will be lost." : "Сите промени ќе се изгубат.", + "Are you sure you want to continue?" : "Дали си сигурен дека сакаш да продолжиш?", + "Continue" : "Продолжи", + "Undo" : "Назад", + "Redo" : "Напред", + "Show original image" : "Прикажи ја оргиналната слика", + "Zoom in" : "Зумирај", + "Zoom out" : "Од зумирај", + "Toggle zoom menu" : "Прикажи мени за зумирање", + "Adjust" : "Прилагоди", + "Fine-tune" : "Фимо прилагодување", + "Filters" : "Филтри", + "Watermark" : "Воден печат", + "Draw" : "Нацрт", + "Resize" : "Промени големина", + "Invalid image." : "Невалидна слика.", + "Error while uploading the image." : "Грешка при прикачување на сликата.", + "are not images" : "не се слики", + "is not an image" : "не е слика", + "to be uploaded" : "за да се орикачат", + "Crop" : "Пресечи", + "Original" : "Оргинал", + "Custom" : "Прилагодено", + "Square" : "Квадрат", + "Landscape" : "Пејсаж", + "Portrait" : "Портрет", + "Ellipse" : "Елипса", + "Classic TV" : "Класичен ТВ", + "Arrow" : "Стрела", + "Brightness" : "Светлина", + "Contrast" : "Контраст", + "Value" : "Вредност", + "Image" : "Слика", + "+ Add image" : "+ Додади слика", + "Line" : "Линија", + "Text" : "Текст", + "Size" : "Големина", + "Position" : "Позиција", + "Save image as" : "Зачувај ја сликата како", + "Extension" : "Екстензија", + "Name is required." : "Потребно е име.", + "Quality" : "Квалитет", + "Actual size (100%)" : "Актуелна големина (100%)", + "Fit size" : "Соодветна големина", + "Auto" : "Автоматски", "Failed to create {albumName}." : "Неуспешно креирање {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Неуспешно преименување на {currentAlbumName} во {newAlbumName}.", "Failed to favorite {fileName}." : "Неуспешно додавање во омилени {fileName}." diff --git a/l10n/mn.js b/l10n/mn.js index 7e370493..804d009d 100644 --- a/l10n/mn.js +++ b/l10n/mn.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Тохиргоо", "Folders" : "Хавтсууд", "Favorites" : "Онцолсон", "Videos" : "Бичлэгүүд", "Archive" : "архив", "Tags" : "Tag-үүд", "Maps" : "Газрын зураг", - "Settings" : "Тохиргоо", + "Edit" : "засварлах", + "Loading …" : "Уншиж байна...", "Cancel" : "болиулах", "Delete" : "Устгах", "Download" : "Татах", "Favorite" : "Дуртай", "Unarchive" : "Архиваас гаргах", "View in folder" : "Хавтасыг нээх", + "Share" : "Түгээх", "Back" : "буцах", "Save" : "Хадгалах", "Month" : "Сар", @@ -21,7 +24,14 @@ OC.L10N.register( "Time" : "Цаг", "Name" : "Нэр", "Update" : "Шинэчлэх", - "Loading …" : "Уншиж байна...", - "Refresh" : "Сэргээх" + "Refresh" : "Сэргээх", + "Remove" : "Устгах", + "Reset" : "тохируулах", + "Continue" : "үргэлжлүүлэх", + "Undo" : "буцах", + "Custom" : "Дурын", + "Value" : "Үнийн дүн", + "Size" : "Хэмжээ", + "Position" : "Байр" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/mn.json b/l10n/mn.json index 64af25f9..febd8b2b 100644 --- a/l10n/mn.json +++ b/l10n/mn.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Тохиргоо", "Folders" : "Хавтсууд", "Favorites" : "Онцолсон", "Videos" : "Бичлэгүүд", "Archive" : "архив", "Tags" : "Tag-үүд", "Maps" : "Газрын зураг", - "Settings" : "Тохиргоо", + "Edit" : "засварлах", + "Loading …" : "Уншиж байна...", "Cancel" : "болиулах", "Delete" : "Устгах", "Download" : "Татах", "Favorite" : "Дуртай", "Unarchive" : "Архиваас гаргах", "View in folder" : "Хавтасыг нээх", + "Share" : "Түгээх", "Back" : "буцах", "Save" : "Хадгалах", "Month" : "Сар", @@ -19,7 +22,14 @@ "Time" : "Цаг", "Name" : "Нэр", "Update" : "Шинэчлэх", - "Loading …" : "Уншиж байна...", - "Refresh" : "Сэргээх" + "Refresh" : "Сэргээх", + "Remove" : "Устгах", + "Reset" : "тохируулах", + "Continue" : "үргэлжлүүлэх", + "Undo" : "буцах", + "Custom" : "Дурын", + "Value" : "Үнийн дүн", + "Size" : "Хэмжээ", + "Position" : "Байр" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/ms_MY.js b/l10n/ms_MY.js index 0c0e967d..993eaf0d 100644 --- a/l10n/ms_MY.js +++ b/l10n/ms_MY.js @@ -1,17 +1,21 @@ OC.L10N.register( "memories", { - "Favorites" : "Favorites", "Settings" : "Tetapan", + "Favorites" : "Favorites", + "Edit" : "Sunting", "Cancel" : "Batal", "Delete" : "Padam", "Download" : "Muat turun", + "Share" : "Kongsi", "Back" : "Kembali", "Save" : "Simpan", "Month" : "Bulan", "Day" : "Hari", "Name" : "Nama", "Update" : "Kemaskini", - "Refresh" : "Refresh" + "Refresh" : "Refresh", + "Remove" : "Buang", + "Size" : "Saiz" }, "nplurals=1; plural=0;"); diff --git a/l10n/ms_MY.json b/l10n/ms_MY.json index a606c783..df3a6ca6 100644 --- a/l10n/ms_MY.json +++ b/l10n/ms_MY.json @@ -1,15 +1,19 @@ { "translations": { - "Favorites" : "Favorites", "Settings" : "Tetapan", + "Favorites" : "Favorites", + "Edit" : "Sunting", "Cancel" : "Batal", "Delete" : "Padam", "Download" : "Muat turun", + "Share" : "Kongsi", "Back" : "Kembali", "Save" : "Simpan", "Month" : "Bulan", "Day" : "Hari", "Name" : "Nama", "Update" : "Kemaskini", - "Refresh" : "Refresh" + "Refresh" : "Refresh", + "Remove" : "Buang", + "Size" : "Saiz" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/l10n/nb.js b/l10n/nb.js index 766c108f..c8a9c3e6 100644 --- a/l10n/nb.js +++ b/l10n/nb.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Innstillinger", "Timeline" : "Tidslinje", "Folders" : "Mapper", "Favorites" : "Favoritter", @@ -10,13 +11,16 @@ OC.L10N.register( "On this day" : "På denne dagen", "Tags" : "Merkelapper", "Maps" : "Kart", - "Settings" : "Innstillinger", + "Unsaved changes" : "Ulagrede endringer", + "Edit" : "Rediger", + "Loading …" : "Laster ...", "Cancel" : "Avbryt", "Delete" : "Slett", "Download" : "Last ned", "Favorite" : "Favoritt", "Unarchive" : "Dearkivere", "View in folder" : "Vis i mappe", + "Share" : "Del", "Copy public link" : "Kopier offentlig lenke", "Public link" : "Offentlig lenke", "Back" : "Tilbake", @@ -28,8 +32,50 @@ OC.L10N.register( "Hour" : "Time", "Name" : "Navn", "Update" : "Oppdater", - "Loading …" : "Laster ...", "Refresh" : "Oppdater", - "Share folder" : "Del mappe" + "Remove" : "Fjern", + "Share folder" : "Del mappe", + "Save as" : "Lagre som", + "Reset" : "Tilbakestill", + "All changes will be lost." : "Alle endringer vil gå tapt.", + "Are you sure you want to continue?" : "Er du sikker på at du vil fortsette?", + "Continue" : "Fortsett", + "Undo" : "Angre", + "Redo" : "Gjør om", + "Show original image" : "Vis originalbilde", + "Zoom in" : "Zoom inn", + "Zoom out" : "Zoom ut", + "Adjust" : "Juster", + "Fine-tune" : "Fininnstill", + "Filters" : "Filtere", + "Watermark" : "Vannmerke", + "Draw" : "Tegn", + "Resize" : "Endre størrelse", + "Invalid image." : "Ugyldig bilde.", + "Original" : "Original", + "Custom" : "Egendefinert", + "Value" : "Verdi", + "Image" : "Bilde", + "Importing …" : "Importerer…", + "+ Add image" : "+ Legg til bilde", + "Line" : "Linje", + "Rotate" : "Roter", + "Text" : "Tekst", + "Font family" : "Font-familie", + "Size" : "Størrelse", + "+ Add watermark" : "+ Legg til vannmerke", + "Choose watermark type" : "Velg vannmerke-type", + "Upload watermark" : "Last opp vannmerke", + "Add as text" : "Legg til som tekst", + "Shadow" : "Skygge", + "Horizontal" : "Horisontal", + "Vertical" : "Vertikal", + "Opacity" : "Gjennomsiktighet", + "Position" : "Posisjon", + "Save image as" : "Lagre bilde som", + "Extension" : "Filetternavn", + "Name is required." : "Navn er påkrevd.", + "Quality" : "Kvalitet", + "Auto" : "Auto" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/nb.json b/l10n/nb.json index 93dc45c4..14e32996 100644 --- a/l10n/nb.json +++ b/l10n/nb.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Innstillinger", "Timeline" : "Tidslinje", "Folders" : "Mapper", "Favorites" : "Favoritter", @@ -8,13 +9,16 @@ "On this day" : "På denne dagen", "Tags" : "Merkelapper", "Maps" : "Kart", - "Settings" : "Innstillinger", + "Unsaved changes" : "Ulagrede endringer", + "Edit" : "Rediger", + "Loading …" : "Laster ...", "Cancel" : "Avbryt", "Delete" : "Slett", "Download" : "Last ned", "Favorite" : "Favoritt", "Unarchive" : "Dearkivere", "View in folder" : "Vis i mappe", + "Share" : "Del", "Copy public link" : "Kopier offentlig lenke", "Public link" : "Offentlig lenke", "Back" : "Tilbake", @@ -26,8 +30,50 @@ "Hour" : "Time", "Name" : "Navn", "Update" : "Oppdater", - "Loading …" : "Laster ...", "Refresh" : "Oppdater", - "Share folder" : "Del mappe" + "Remove" : "Fjern", + "Share folder" : "Del mappe", + "Save as" : "Lagre som", + "Reset" : "Tilbakestill", + "All changes will be lost." : "Alle endringer vil gå tapt.", + "Are you sure you want to continue?" : "Er du sikker på at du vil fortsette?", + "Continue" : "Fortsett", + "Undo" : "Angre", + "Redo" : "Gjør om", + "Show original image" : "Vis originalbilde", + "Zoom in" : "Zoom inn", + "Zoom out" : "Zoom ut", + "Adjust" : "Juster", + "Fine-tune" : "Fininnstill", + "Filters" : "Filtere", + "Watermark" : "Vannmerke", + "Draw" : "Tegn", + "Resize" : "Endre størrelse", + "Invalid image." : "Ugyldig bilde.", + "Original" : "Original", + "Custom" : "Egendefinert", + "Value" : "Verdi", + "Image" : "Bilde", + "Importing …" : "Importerer…", + "+ Add image" : "+ Legg til bilde", + "Line" : "Linje", + "Rotate" : "Roter", + "Text" : "Tekst", + "Font family" : "Font-familie", + "Size" : "Størrelse", + "+ Add watermark" : "+ Legg til vannmerke", + "Choose watermark type" : "Velg vannmerke-type", + "Upload watermark" : "Last opp vannmerke", + "Add as text" : "Legg til som tekst", + "Shadow" : "Skygge", + "Horizontal" : "Horisontal", + "Vertical" : "Vertikal", + "Opacity" : "Gjennomsiktighet", + "Position" : "Posisjon", + "Save image as" : "Lagre bilde som", + "Extension" : "Filetternavn", + "Name is required." : "Navn er påkrevd.", + "Quality" : "Kvalitet", + "Auto" : "Auto" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/nl.js b/l10n/nl.js index 1117989c..b69994c6 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Instellingen", "Timeline" : "Tijdlijn", "Folders" : "Mappen", "Favorites" : "Favorieten", @@ -11,13 +12,16 @@ OC.L10N.register( "On this day" : "Vandaag", "Tags" : "Tags", "Maps" : "Kaarten", - "Settings" : "Instellingen", + "Unsaved changes" : "Niet opgeslagen veranderingen", + "Edit" : "Bewerk", + "Loading …" : "Laden …", "Cancel" : "Annuleren", "Delete" : "Verwijder", "Download" : "Download", "Favorite" : "Favoriet", "Unarchive" : "Terugzetten uit archief", "View in folder" : "Bekijken in map", + "Share" : "Delen", "Copy public link" : "Kopieer openbare link", "Public link" : "Openbare Link", "Back" : "Terug", @@ -30,8 +34,27 @@ OC.L10N.register( "Minute" : "Minuut", "Name" : "Naam", "Update" : "Update", - "Loading …" : "Laden …", "Refresh" : "Verversen", - "Share folder" : "Map delen" + "Remove" : "Verwijderen", + "Share folder" : "Map delen", + "Reset" : "Herstellen", + "Continue" : "Doorgaan", + "Undo" : "Ongedaan maken", + "Redo" : "Opnieuw doen", + "Zoom in" : "Zoom in", + "Draw" : "Teken", + "Original" : "Origineel", + "Custom" : "Maatwerk", + "Un-flip X" : "Ontspiegelen X", + "Value" : "Waarden", + "Image" : "Afbeelding", + "Line" : "Lijn", + "Text" : "Tekst", + "Size" : "Omvang", + "Position" : "Positie", + "Extension" : "Extensie", + "Name is required." : "Naam is verplicht.", + "Quality" : "Kwaliteit", + "Auto" : "Automatisch" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/nl.json b/l10n/nl.json index c04dc08a..a7da3d57 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Instellingen", "Timeline" : "Tijdlijn", "Folders" : "Mappen", "Favorites" : "Favorieten", @@ -9,13 +10,16 @@ "On this day" : "Vandaag", "Tags" : "Tags", "Maps" : "Kaarten", - "Settings" : "Instellingen", + "Unsaved changes" : "Niet opgeslagen veranderingen", + "Edit" : "Bewerk", + "Loading …" : "Laden …", "Cancel" : "Annuleren", "Delete" : "Verwijder", "Download" : "Download", "Favorite" : "Favoriet", "Unarchive" : "Terugzetten uit archief", "View in folder" : "Bekijken in map", + "Share" : "Delen", "Copy public link" : "Kopieer openbare link", "Public link" : "Openbare Link", "Back" : "Terug", @@ -28,8 +32,27 @@ "Minute" : "Minuut", "Name" : "Naam", "Update" : "Update", - "Loading …" : "Laden …", "Refresh" : "Verversen", - "Share folder" : "Map delen" + "Remove" : "Verwijderen", + "Share folder" : "Map delen", + "Reset" : "Herstellen", + "Continue" : "Doorgaan", + "Undo" : "Ongedaan maken", + "Redo" : "Opnieuw doen", + "Zoom in" : "Zoom in", + "Draw" : "Teken", + "Original" : "Origineel", + "Custom" : "Maatwerk", + "Un-flip X" : "Ontspiegelen X", + "Value" : "Waarden", + "Image" : "Afbeelding", + "Line" : "Lijn", + "Text" : "Tekst", + "Size" : "Omvang", + "Position" : "Positie", + "Extension" : "Extensie", + "Name is required." : "Naam is verplicht.", + "Quality" : "Kwaliteit", + "Auto" : "Automatisch" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/nn_NO.js b/l10n/nn_NO.js index 4296e3d1..ba0cea64 100644 --- a/l10n/nn_NO.js +++ b/l10n/nn_NO.js @@ -1,14 +1,16 @@ OC.L10N.register( "memories", { + "Settings" : "Innstillingar", "Favorites" : "Favorittar", "Videos" : "Video", "Tags" : "Emneord", - "Settings" : "Innstillingar", + "Edit" : "Rediger", "Cancel" : "Avbryt", "Delete" : "Slett", "Download" : "Last ned", "Favorite" : "Favoritt", + "Share" : "Del", "Back" : "Tilbake", "Save" : "Lagre", "Year" : "År", @@ -18,6 +20,10 @@ OC.L10N.register( "Minute" : "Minutt", "Name" : "Namn", "Update" : "Oppdater", - "Refresh" : "Last inn på nytt" + "Refresh" : "Last inn på nytt", + "Remove" : "Fjern", + "Continue" : "Gå vidare", + "Value" : "Verdi", + "Size" : "Storleik" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/nn_NO.json b/l10n/nn_NO.json index 4b150e5e..6507821f 100644 --- a/l10n/nn_NO.json +++ b/l10n/nn_NO.json @@ -1,12 +1,14 @@ { "translations": { + "Settings" : "Innstillingar", "Favorites" : "Favorittar", "Videos" : "Video", "Tags" : "Emneord", - "Settings" : "Innstillingar", + "Edit" : "Rediger", "Cancel" : "Avbryt", "Delete" : "Slett", "Download" : "Last ned", "Favorite" : "Favoritt", + "Share" : "Del", "Back" : "Tilbake", "Save" : "Lagre", "Year" : "År", @@ -16,6 +18,10 @@ "Minute" : "Minutt", "Name" : "Namn", "Update" : "Oppdater", - "Refresh" : "Last inn på nytt" + "Refresh" : "Last inn på nytt", + "Remove" : "Fjern", + "Continue" : "Gå vidare", + "Value" : "Verdi", + "Size" : "Storleik" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/oc.js b/l10n/oc.js index 07e4974d..ade963c7 100644 --- a/l10n/oc.js +++ b/l10n/oc.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Paramètres", "Folders" : "Repertòris", "Favorites" : "Favorits", "Albums" : "Albums", @@ -8,11 +9,14 @@ OC.L10N.register( "Archive" : "Archiu", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Paramètres", + "Unsaved changes" : "Modificacions pas enregistradas", + "Edit" : "Modificar", + "Loading …" : "Cargament…", "Cancel" : "Anullar", "Delete" : "Suprimir", "Download" : "Telecargar", "Favorite" : "Favorit", + "Share" : "Partejar", "Copy public link" : "Copiar lo ligam public", "Public link" : "Ligam public", "Back" : "Retorn", @@ -25,7 +29,19 @@ OC.L10N.register( "Minute" : "Minuta", "Name" : "Nom", "Update" : "Actualizar", - "Loading …" : "Cargament…", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Suprimir", + "Reset" : "Reïnicializar", + "Continue" : "Contunhar", + "Undo" : "Desfar", + "Redo" : "Refar", + "Custom" : "Personalizar", + "Portrait" : "Retrach", + "Value" : "Valor", + "Line" : "Linha", + "Text" : "Tèxt", + "Size" : "Talha", + "Position" : "Posicion", + "Extension" : "Extension" }, "nplurals=2; plural=(n > 1);"); diff --git a/l10n/oc.json b/l10n/oc.json index 326d6138..b41a982e 100644 --- a/l10n/oc.json +++ b/l10n/oc.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Paramètres", "Folders" : "Repertòris", "Favorites" : "Favorits", "Albums" : "Albums", @@ -6,11 +7,14 @@ "Archive" : "Archiu", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Paramètres", + "Unsaved changes" : "Modificacions pas enregistradas", + "Edit" : "Modificar", + "Loading …" : "Cargament…", "Cancel" : "Anullar", "Delete" : "Suprimir", "Download" : "Telecargar", "Favorite" : "Favorit", + "Share" : "Partejar", "Copy public link" : "Copiar lo ligam public", "Public link" : "Ligam public", "Back" : "Retorn", @@ -23,7 +27,19 @@ "Minute" : "Minuta", "Name" : "Nom", "Update" : "Actualizar", - "Loading …" : "Cargament…", - "Refresh" : "Actualizar" + "Refresh" : "Actualizar", + "Remove" : "Suprimir", + "Reset" : "Reïnicializar", + "Continue" : "Contunhar", + "Undo" : "Desfar", + "Redo" : "Refar", + "Custom" : "Personalizar", + "Portrait" : "Retrach", + "Value" : "Valor", + "Line" : "Linha", + "Text" : "Tèxt", + "Size" : "Talha", + "Position" : "Posicion", + "Extension" : "Extension" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/l10n/pl.js b/l10n/pl.js index 1d9831f4..56a70019 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Wspomnienia", "Yet another photo management app" : "Kolejna aplikacja do zarządzania zdjęciami", + "Settings" : "Ustawienia", "Timeline" : "Oś czasu", "Folders" : "Katalogi", "Favorites" : "Ulubione", @@ -13,7 +14,11 @@ OC.L10N.register( "On this day" : "W tym dniu", "Tags" : "Etykiety", "Maps" : "Mapy", - "Settings" : "Ustawienia", + "Error saving image" : "Błąd podczas zapisywania obrazu", + "Unsaved changes" : "Niezapisane zmiany", + "Drop changes" : "Odrzuć zmiany", + "Edit" : "Edytuj", + "Loading …" : "Wczytywanie…", "Cancel" : "Anuluj", "Delete" : "Usuń", "Download" : "Pobierz", @@ -29,6 +34,7 @@ OC.L10N.register( "Timeline Path" : "Ścieżka osi czasu", "Show hidden folders" : "Pokaż ukryte katalogi", "Failed to load some photos" : "Nie udało się załadować niektórych zdjęć", + "Share" : "Udostępnij", "Sidebar" : "Pasek boczny", "Search for collaborators" : "Szukaj współpracowników", "Search people or groups" : "Wyszukaj osoby lub grupy", @@ -75,11 +81,96 @@ OC.L10N.register( "Name" : "Nazwa", "Rename person" : "Zmień nazwę osoby", "Update" : "Aktualizuj", - "Loading …" : "Wczytywanie…", "Refresh" : "Odśwież", + "Remove" : "Usuń", "Delete album" : "Usuń album", "Merge with different person" : "Połącz z inną osobą", "Share folder" : "Udostępnij katalog", + "Save as" : "Zapisz jako", + "Reset" : "Resetuj", + "All changes will be lost." : "Wszystkie zmiany zostaną utracone.", + "Are you sure you want to continue?" : "Jesteś pewien, że chcesz kontynuować?", + "Continue" : "Kontynuuj", + "Undo" : "Cofnij", + "Redo" : "Powtórz", + "Show original image" : "Pokaż oryginalny obraz", + "Zoom in" : "Powiększ", + "Zoom out" : "Pomniejsz", + "Toggle zoom menu" : "Przełącz menu powiększania", + "Adjust" : "Dostosuj", + "Fine-tune" : "Dostrój", + "Filters" : "Filtry", + "Watermark" : "Znak wodny", + "Draw" : "Rysuj", + "Resize" : "Zmień rozmiar", + "Invalid image." : "Nieprawidłowy obraz.", + "Error while uploading the image." : "Błąd podczas wysyłania obrazu.", + "are not images" : "nie są obrazami", + "is not an image" : "nie jest obrazem", + "to be uploaded" : "do wysłania", + "Crop" : "Przytnij", + "Original" : "Oryginalny", + "Custom" : "Dowolnie", + "Square" : "Kwadrat", + "Landscape" : "Krajobraz", + "Portrait" : "Portret", + "Ellipse" : "Elipsa", + "Classic TV" : "Klasyczna TV", + "CinemaScope" : "CinemaScope", + "Arrow" : "Strzałka", + "Blur" : "Plama", + "Brightness" : "Jasność", + "Contrast" : "Kontrast", + "Un-flip X" : "Odwróć z powrotem X", + "Flip X" : "Odwróć X", + "Un-flip Y" : "Odwróć z powrotem Y", + "Flip Y" : "Odwróć Y", + "HSV" : "HSV", + "Hue" : "Odcień", + "Saturation" : "Nasycenie", + "Value" : "Wartość", + "Image" : "Obraz", + "Importing …" : "Importowanie…", + "+ Add image" : "+ Dodaj obraz", + "Line" : "Linia", + "Pen" : "Długopis", + "Polygon" : "Wielokąt", + "Sides" : "Krawędzie", + "Rectangle" : "Prostokąt", + "Corner Radius" : "Promień narożnika", + "Width in pixels" : "Szerokość w pikselach", + "Height in pixels" : "Wysokość w pikselach", + "Toggle ratio lock" : "Przełącz blokadę proporcji", + "Reset to original image size" : "Przywróć oryginalny rozmiar obrazu", + "Rotate" : "Obróć", + "Text" : "Tekst", + "Text spacing" : "Odstępy tekstu", + "Text alignment" : "Wyrównanie tekstu", + "Font family" : "Rodzina czcionek", + "Size" : "Wzrost", + "Letter spacing" : "Odstępy między literami", + "Line height" : "Wysokość linii", + "Warmth" : "Ciepły", + "+ Add watermark" : "+ Dodaj znak wodny", + "Choose watermark type" : "Wybierz typ znaku wodnego", + "Upload watermark" : "Wyślij znak wodny", + "Add as text" : "Dodaj jako tekst", + "Padding" : "Wypełnienie", + "Shadow" : "Cień", + "Horizontal" : "Poziomo", + "Vertical" : "Pionowo", + "Opacity" : "Nieprzezroczysty", + "Position" : "Stanowisko", + "Stroke" : "Pociągnięcie", + "Save image as" : "Zapisz obraz jako", + "Extension" : "Rozszerzenie", + "Name is required." : "Nazwa jest wymagana.", + "Quality" : "Jakość", + "Saved image size (width x height)" : "Rozmiar zapisanego obrazu (szerokość x wysokość)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Zwróć uwagę, że wybrany obszar kadrowania jest mniejszy niż zastosowana zmiana rozmiaru, co może spowodować spadek jakości", + "Actual size (100%)" : "Rzeczywisty rozmiar (100%)", + "Fit size" : "Dopasuj rozmiar", + "Auto" : "Automatycznie", "Failed to create {albumName}." : "Nie udało się utworzyć {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Nie udało się zmienić nazwy {currentAlbumName} na {newAlbumName}.", "General Failure" : "Ogólna awaria", diff --git a/l10n/pl.json b/l10n/pl.json index 3ac18eaa..549422fb 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Wspomnienia", "Yet another photo management app" : "Kolejna aplikacja do zarządzania zdjęciami", + "Settings" : "Ustawienia", "Timeline" : "Oś czasu", "Folders" : "Katalogi", "Favorites" : "Ulubione", @@ -11,7 +12,11 @@ "On this day" : "W tym dniu", "Tags" : "Etykiety", "Maps" : "Mapy", - "Settings" : "Ustawienia", + "Error saving image" : "Błąd podczas zapisywania obrazu", + "Unsaved changes" : "Niezapisane zmiany", + "Drop changes" : "Odrzuć zmiany", + "Edit" : "Edytuj", + "Loading …" : "Wczytywanie…", "Cancel" : "Anuluj", "Delete" : "Usuń", "Download" : "Pobierz", @@ -27,6 +32,7 @@ "Timeline Path" : "Ścieżka osi czasu", "Show hidden folders" : "Pokaż ukryte katalogi", "Failed to load some photos" : "Nie udało się załadować niektórych zdjęć", + "Share" : "Udostępnij", "Sidebar" : "Pasek boczny", "Search for collaborators" : "Szukaj współpracowników", "Search people or groups" : "Wyszukaj osoby lub grupy", @@ -73,11 +79,96 @@ "Name" : "Nazwa", "Rename person" : "Zmień nazwę osoby", "Update" : "Aktualizuj", - "Loading …" : "Wczytywanie…", "Refresh" : "Odśwież", + "Remove" : "Usuń", "Delete album" : "Usuń album", "Merge with different person" : "Połącz z inną osobą", "Share folder" : "Udostępnij katalog", + "Save as" : "Zapisz jako", + "Reset" : "Resetuj", + "All changes will be lost." : "Wszystkie zmiany zostaną utracone.", + "Are you sure you want to continue?" : "Jesteś pewien, że chcesz kontynuować?", + "Continue" : "Kontynuuj", + "Undo" : "Cofnij", + "Redo" : "Powtórz", + "Show original image" : "Pokaż oryginalny obraz", + "Zoom in" : "Powiększ", + "Zoom out" : "Pomniejsz", + "Toggle zoom menu" : "Przełącz menu powiększania", + "Adjust" : "Dostosuj", + "Fine-tune" : "Dostrój", + "Filters" : "Filtry", + "Watermark" : "Znak wodny", + "Draw" : "Rysuj", + "Resize" : "Zmień rozmiar", + "Invalid image." : "Nieprawidłowy obraz.", + "Error while uploading the image." : "Błąd podczas wysyłania obrazu.", + "are not images" : "nie są obrazami", + "is not an image" : "nie jest obrazem", + "to be uploaded" : "do wysłania", + "Crop" : "Przytnij", + "Original" : "Oryginalny", + "Custom" : "Dowolnie", + "Square" : "Kwadrat", + "Landscape" : "Krajobraz", + "Portrait" : "Portret", + "Ellipse" : "Elipsa", + "Classic TV" : "Klasyczna TV", + "CinemaScope" : "CinemaScope", + "Arrow" : "Strzałka", + "Blur" : "Plama", + "Brightness" : "Jasność", + "Contrast" : "Kontrast", + "Un-flip X" : "Odwróć z powrotem X", + "Flip X" : "Odwróć X", + "Un-flip Y" : "Odwróć z powrotem Y", + "Flip Y" : "Odwróć Y", + "HSV" : "HSV", + "Hue" : "Odcień", + "Saturation" : "Nasycenie", + "Value" : "Wartość", + "Image" : "Obraz", + "Importing …" : "Importowanie…", + "+ Add image" : "+ Dodaj obraz", + "Line" : "Linia", + "Pen" : "Długopis", + "Polygon" : "Wielokąt", + "Sides" : "Krawędzie", + "Rectangle" : "Prostokąt", + "Corner Radius" : "Promień narożnika", + "Width in pixels" : "Szerokość w pikselach", + "Height in pixels" : "Wysokość w pikselach", + "Toggle ratio lock" : "Przełącz blokadę proporcji", + "Reset to original image size" : "Przywróć oryginalny rozmiar obrazu", + "Rotate" : "Obróć", + "Text" : "Tekst", + "Text spacing" : "Odstępy tekstu", + "Text alignment" : "Wyrównanie tekstu", + "Font family" : "Rodzina czcionek", + "Size" : "Wzrost", + "Letter spacing" : "Odstępy między literami", + "Line height" : "Wysokość linii", + "Warmth" : "Ciepły", + "+ Add watermark" : "+ Dodaj znak wodny", + "Choose watermark type" : "Wybierz typ znaku wodnego", + "Upload watermark" : "Wyślij znak wodny", + "Add as text" : "Dodaj jako tekst", + "Padding" : "Wypełnienie", + "Shadow" : "Cień", + "Horizontal" : "Poziomo", + "Vertical" : "Pionowo", + "Opacity" : "Nieprzezroczysty", + "Position" : "Stanowisko", + "Stroke" : "Pociągnięcie", + "Save image as" : "Zapisz obraz jako", + "Extension" : "Rozszerzenie", + "Name is required." : "Nazwa jest wymagana.", + "Quality" : "Jakość", + "Saved image size (width x height)" : "Rozmiar zapisanego obrazu (szerokość x wysokość)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Zwróć uwagę, że wybrany obszar kadrowania jest mniejszy niż zastosowana zmiana rozmiaru, co może spowodować spadek jakości", + "Actual size (100%)" : "Rzeczywisty rozmiar (100%)", + "Fit size" : "Dopasuj rozmiar", + "Auto" : "Automatycznie", "Failed to create {albumName}." : "Nie udało się utworzyć {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Nie udało się zmienić nazwy {currentAlbumName} na {newAlbumName}.", "General Failure" : "Ogólna awaria", diff --git a/l10n/ps.js b/l10n/ps.js index 482e274e..32110a6d 100644 --- a/l10n/ps.js +++ b/l10n/ps.js @@ -1,15 +1,18 @@ OC.L10N.register( "memories", { + "Settings" : "سمونې", "Favorites" : "په نښه شوي", "Tags" : "نښکې", - "Settings" : "سمونې", "Cancel" : "پرېښول", "Delete" : "ړنګول", "Download" : "ښکته کول", "Favorite" : "په نښه شوی", "View in folder" : "په فولډر کې کتل", + "Share" : "شریکول", "Save" : "ساتل", - "Name" : "نوم" + "Name" : "نوم", + "Continue" : "وړاندې تګ", + "Size" : "کچه" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/ps.json b/l10n/ps.json index 9c583fd4..8322ab2c 100644 --- a/l10n/ps.json +++ b/l10n/ps.json @@ -1,13 +1,16 @@ { "translations": { + "Settings" : "سمونې", "Favorites" : "په نښه شوي", "Tags" : "نښکې", - "Settings" : "سمونې", "Cancel" : "پرېښول", "Delete" : "ړنګول", "Download" : "ښکته کول", "Favorite" : "په نښه شوی", "View in folder" : "په فولډر کې کتل", + "Share" : "شریکول", "Save" : "ساتل", - "Name" : "نوم" + "Name" : "نوم", + "Continue" : "وړاندې تګ", + "Size" : "کچه" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js index 9b0a6952..142658c1 100644 --- a/l10n/pt_BR.js +++ b/l10n/pt_BR.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Memórias", "Yet another photo management app" : "Mais um aplicativo de gerenciamento de fotos", + "Settings" : "Configurações", "Timeline" : "Linha do tempo", "Folders" : "Pastas", "Favorites" : "Favoritos", @@ -13,7 +14,6 @@ OC.L10N.register( "On this day" : "Nesse dia", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configurações", "A better photos experience awaits you" : "Uma melhor experiência de fotos espera por você", "Choose the root folder of your timeline to begin" : "Escolha a pasta raiz da sua linha do tempo para começar", "If you just installed Memories, run:" : "Se você acabou de instalar o Memórias, execute:", @@ -24,6 +24,11 @@ OC.L10N.register( "Choose the root of your timeline" : "Escolha a raiz da sua linha do tempo", "The selected folder does not seem to be valid. Try again." : "A pasta selecionada não parece ser válida. Tente novamente.", "Found {total} photos in {path}" : "Encontrou {total} fotos em {path}", + "Error saving image" : "Erro ao salvar imagem", + "Unsaved changes" : "Alterações não salvas", + "Drop changes" : "Cancelar mudanças", + "Edit" : "Editar", + "Loading …" : "Carregando …", "Cancel" : "Cancelar", "Delete" : "Excluir", "Remove from album" : "Remover do album", @@ -46,6 +51,7 @@ OC.L10N.register( "Choose the root for the folders view" : "Escolha a raiz para a visualização de pastas", "Your Timeline" : "Sua Linha-do-Tempo", "Failed to load some photos" : "Falha ao carregar algumas fotos", + "Share" : "Compartilhar", "Sidebar" : "Barra Lateral", "Processing … {n}/{m}" : "Processando … {n}/{m}", "Search for collaborators" : "Pesquisar colaboradores", @@ -96,7 +102,6 @@ OC.L10N.register( "Rename person" : "Renomear pessoa", "Update" : "Atualizar", "Failed to rename {oldName} to {name}." : "Falha ao renomear {oldName} para {name}.", - "Loading …" : "Carregando …", "Merge {name} with person" : "Unir {name} com pessoa", "Are you sure you want to merge {name} with {newName}?" : "Tem certeza que deseja unir {name} com {newName}?", "Too many failures, aborting" : "Abortando, falhas demais", @@ -105,12 +110,98 @@ OC.L10N.register( "Move selected photos to person" : "Mover fotos selecionadas para pessoa", "Are you sure you want to move the selected photos from {name} to {newName}?" : "Tem certeza de que deseja mover as fotos selecionadas de {name} para {newName}?", "Refresh" : "Atualizar", + "Remove" : "Remover", "Delete album" : "Remover álbum", "Merge with different person" : "Unir com outra pessoa", "Mark person in preview" : "Marcar pessoa na visualização", "Share folder" : "Compartilhar pasta", "Move left" : "Mover para a esquerda", "Move right" : "Mover para a direita", + "Save as" : "Salvar como", + "Reset" : "Redefinir", + "All changes will be lost." : "Todas as mudanças serão perdidas.", + "Are you sure you want to continue?" : "Tem certeza que deseja continuar?", + "Continue" : "Continuar", + "Undo" : "Desfazer", + "Redo" : "Refazer", + "Show original image" : "Mostrar imagem original", + "Zoom in" : "Ampliar", + "Zoom out" : "Diminuir zoom", + "Toggle zoom menu" : "Habilitar menu de zoom", + "Adjust" : "Ajustar", + "Fine-tune" : "Sintonia fina", + "Filters" : "Filtros", + "Watermark" : "Marca d'água", + "Draw" : "Desenhar", + "Resize" : "Redimensionar", + "Invalid image." : "Imagem inválida.", + "Error while uploading the image." : "Erro ao fazer upload da imagem.", + "are not images" : "não são imagens", + "is not an image" : "não é uma imagem", + "to be uploaded" : "para enviar", + "Crop" : "Cortar", + "Original" : "Original", + "Custom" : "Personalizar", + "Square" : "Quadrado", + "Landscape" : "Paisagem", + "Portrait" : "Retrato", + "Ellipse" : "Elipse", + "Classic TV" : "TV Clássica", + "CinemaScope" : "CinemaScope", + "Arrow" : "Flecha", + "Blur" : "Embaçar", + "Brightness" : "Brilho", + "Contrast" : "Contraste", + "Un-flip X" : "Desvirar X", + "Flip X" : "Inverter X", + "Un-flip Y" : "Desvirar Y", + "Flip Y" : "Inverter Y", + "HSV" : "HSV", + "Hue" : "Cor", + "Saturation" : "Saturação", + "Value" : "Valor", + "Image" : "Imagem", + "Importing …" : "Importing …", + "+ Add image" : "+ Adicionar imagem", + "Line" : "Linha", + "Pen" : "Caneta", + "Polygon" : "Polígono", + "Sides" : "Lados", + "Rectangle" : "Retângulo", + "Corner Radius" : "Raio do canto", + "Width in pixels" : "Comprimento em pixels", + "Height in pixels" : "Altura em pixels", + "Toggle ratio lock" : "Habilitar trava de razão", + "Reset to original image size" : "Voltar ao tamanho original", + "Rotate" : "Rotação", + "Text" : "Texto", + "Text spacing" : "Espaçamento do texto", + "Text alignment" : "Alinhamento de texto", + "Font family" : "Família da fonte", + "Size" : "Tamanho", + "Letter spacing" : "Espaçamento entre letras", + "Line height" : "Altura da linha", + "Warmth" : "Temperatura", + "+ Add watermark" : "+ Adicionar marca d'água", + "Choose watermark type" : "Escolha o tipo de marca d'água", + "Upload watermark" : "Enviar marca d'água", + "Add as text" : "Adicionar como texto", + "Padding" : "Preenchimento", + "Shadow" : "Sombra", + "Horizontal" : "Horizontal", + "Vertical" : "Vertical", + "Opacity" : "Opacidade", + "Position" : "Posição", + "Stroke" : "Derrame", + "Save image as" : "Salvar imagem como", + "Extension" : "Extensão", + "Name is required." : "O nome é obrigatório.", + "Quality" : "Qualidade", + "Saved image size (width x height)" : "Imagem salva (largura x altura)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Observe que a área de corte selecionada é menor que o redimensionamento aplicado, o que pode causar diminuição da qualidade", + "Actual size (100%)" : "Tamanho real (100%)", + "Fit size" : "Encaixar tamanho", + "Auto" : "Automático", "Failed to create {albumName}." : "Falha ao criar {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Falha ao renomear {currentAlbumName} para {newAlbumName}.", "General Failure" : "Falha Geral", diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json index 7f6789b8..baa8c1be 100644 --- a/l10n/pt_BR.json +++ b/l10n/pt_BR.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Memórias", "Yet another photo management app" : "Mais um aplicativo de gerenciamento de fotos", + "Settings" : "Configurações", "Timeline" : "Linha do tempo", "Folders" : "Pastas", "Favorites" : "Favoritos", @@ -11,7 +12,6 @@ "On this day" : "Nesse dia", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Configurações", "A better photos experience awaits you" : "Uma melhor experiência de fotos espera por você", "Choose the root folder of your timeline to begin" : "Escolha a pasta raiz da sua linha do tempo para começar", "If you just installed Memories, run:" : "Se você acabou de instalar o Memórias, execute:", @@ -22,6 +22,11 @@ "Choose the root of your timeline" : "Escolha a raiz da sua linha do tempo", "The selected folder does not seem to be valid. Try again." : "A pasta selecionada não parece ser válida. Tente novamente.", "Found {total} photos in {path}" : "Encontrou {total} fotos em {path}", + "Error saving image" : "Erro ao salvar imagem", + "Unsaved changes" : "Alterações não salvas", + "Drop changes" : "Cancelar mudanças", + "Edit" : "Editar", + "Loading …" : "Carregando …", "Cancel" : "Cancelar", "Delete" : "Excluir", "Remove from album" : "Remover do album", @@ -44,6 +49,7 @@ "Choose the root for the folders view" : "Escolha a raiz para a visualização de pastas", "Your Timeline" : "Sua Linha-do-Tempo", "Failed to load some photos" : "Falha ao carregar algumas fotos", + "Share" : "Compartilhar", "Sidebar" : "Barra Lateral", "Processing … {n}/{m}" : "Processando … {n}/{m}", "Search for collaborators" : "Pesquisar colaboradores", @@ -94,7 +100,6 @@ "Rename person" : "Renomear pessoa", "Update" : "Atualizar", "Failed to rename {oldName} to {name}." : "Falha ao renomear {oldName} para {name}.", - "Loading …" : "Carregando …", "Merge {name} with person" : "Unir {name} com pessoa", "Are you sure you want to merge {name} with {newName}?" : "Tem certeza que deseja unir {name} com {newName}?", "Too many failures, aborting" : "Abortando, falhas demais", @@ -103,12 +108,98 @@ "Move selected photos to person" : "Mover fotos selecionadas para pessoa", "Are you sure you want to move the selected photos from {name} to {newName}?" : "Tem certeza de que deseja mover as fotos selecionadas de {name} para {newName}?", "Refresh" : "Atualizar", + "Remove" : "Remover", "Delete album" : "Remover álbum", "Merge with different person" : "Unir com outra pessoa", "Mark person in preview" : "Marcar pessoa na visualização", "Share folder" : "Compartilhar pasta", "Move left" : "Mover para a esquerda", "Move right" : "Mover para a direita", + "Save as" : "Salvar como", + "Reset" : "Redefinir", + "All changes will be lost." : "Todas as mudanças serão perdidas.", + "Are you sure you want to continue?" : "Tem certeza que deseja continuar?", + "Continue" : "Continuar", + "Undo" : "Desfazer", + "Redo" : "Refazer", + "Show original image" : "Mostrar imagem original", + "Zoom in" : "Ampliar", + "Zoom out" : "Diminuir zoom", + "Toggle zoom menu" : "Habilitar menu de zoom", + "Adjust" : "Ajustar", + "Fine-tune" : "Sintonia fina", + "Filters" : "Filtros", + "Watermark" : "Marca d'água", + "Draw" : "Desenhar", + "Resize" : "Redimensionar", + "Invalid image." : "Imagem inválida.", + "Error while uploading the image." : "Erro ao fazer upload da imagem.", + "are not images" : "não são imagens", + "is not an image" : "não é uma imagem", + "to be uploaded" : "para enviar", + "Crop" : "Cortar", + "Original" : "Original", + "Custom" : "Personalizar", + "Square" : "Quadrado", + "Landscape" : "Paisagem", + "Portrait" : "Retrato", + "Ellipse" : "Elipse", + "Classic TV" : "TV Clássica", + "CinemaScope" : "CinemaScope", + "Arrow" : "Flecha", + "Blur" : "Embaçar", + "Brightness" : "Brilho", + "Contrast" : "Contraste", + "Un-flip X" : "Desvirar X", + "Flip X" : "Inverter X", + "Un-flip Y" : "Desvirar Y", + "Flip Y" : "Inverter Y", + "HSV" : "HSV", + "Hue" : "Cor", + "Saturation" : "Saturação", + "Value" : "Valor", + "Image" : "Imagem", + "Importing …" : "Importing …", + "+ Add image" : "+ Adicionar imagem", + "Line" : "Linha", + "Pen" : "Caneta", + "Polygon" : "Polígono", + "Sides" : "Lados", + "Rectangle" : "Retângulo", + "Corner Radius" : "Raio do canto", + "Width in pixels" : "Comprimento em pixels", + "Height in pixels" : "Altura em pixels", + "Toggle ratio lock" : "Habilitar trava de razão", + "Reset to original image size" : "Voltar ao tamanho original", + "Rotate" : "Rotação", + "Text" : "Texto", + "Text spacing" : "Espaçamento do texto", + "Text alignment" : "Alinhamento de texto", + "Font family" : "Família da fonte", + "Size" : "Tamanho", + "Letter spacing" : "Espaçamento entre letras", + "Line height" : "Altura da linha", + "Warmth" : "Temperatura", + "+ Add watermark" : "+ Adicionar marca d'água", + "Choose watermark type" : "Escolha o tipo de marca d'água", + "Upload watermark" : "Enviar marca d'água", + "Add as text" : "Adicionar como texto", + "Padding" : "Preenchimento", + "Shadow" : "Sombra", + "Horizontal" : "Horizontal", + "Vertical" : "Vertical", + "Opacity" : "Opacidade", + "Position" : "Posição", + "Stroke" : "Derrame", + "Save image as" : "Salvar imagem como", + "Extension" : "Extensão", + "Name is required." : "O nome é obrigatório.", + "Quality" : "Qualidade", + "Saved image size (width x height)" : "Imagem salva (largura x altura)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Observe que a área de corte selecionada é menor que o redimensionamento aplicado, o que pode causar diminuição da qualidade", + "Actual size (100%)" : "Tamanho real (100%)", + "Fit size" : "Encaixar tamanho", + "Auto" : "Automático", "Failed to create {albumName}." : "Falha ao criar {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Falha ao renomear {currentAlbumName} para {newAlbumName}.", "General Failure" : "Falha Geral", diff --git a/l10n/pt_PT.js b/l10n/pt_PT.js index de6f85a4..c6720693 100644 --- a/l10n/pt_PT.js +++ b/l10n/pt_PT.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Memories", "Yet another photo management app" : "Mais uma aplicação de gestão de fotografias", + "Settings" : "Definições", "Timeline" : "Linha do tempo", "Folders" : "Pastas", "Favorites" : "Favoritos", @@ -10,7 +11,9 @@ OC.L10N.register( "Archive" : "Arquivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Definições", + "Unsaved changes" : "Modificações não guardadas", + "Edit" : "Editar", + "Loading …" : "A carregar...", "Cancel" : "Cancelar", "Delete" : "Eliminar", "Download" : "Transferir", @@ -21,6 +24,7 @@ OC.L10N.register( "Timeline Path" : "Caminho da Cronologia", "Show hidden folders" : "Mostrar pastas ocultas", "Failed to load some photos" : "Não foi possível carregar algumas fotografias", + "Share" : "Partilhar", "Copy public link" : "Copiar ligação publica", "Public link" : "Hiperligação Pública", "Back" : "Anterior", @@ -31,9 +35,22 @@ OC.L10N.register( "Hour" : "Hora", "Name" : "Nome", "Update" : "Atualizar", - "Loading …" : "A carregar...", "Refresh" : "Atualizar", + "Remove" : "Remover", "Share folder" : "Partilhar pasta", + "Reset" : "Reiniciar", + "Continue" : "Continuar", + "Undo" : "Desfazer", + "Redo" : "Repetir", + "Original" : "Original", + "Custom" : "Personalizado", + "Value" : "Valor", + "Image" : "Imagem", + "Text" : "Texto", + "Size" : "Altura", + "Name is required." : "Nome é obrigatório.", + "Quality" : "Qualidade", + "Auto" : "Auto", "Failed to delete files." : "Não foi possível eliminar os ficheiros.", "Failed to delete {fileName}." : "Não foi possível eliminar {fileName}.", "Failed to favorite files." : "Não foi possível colocar os ficheiros nos favoritos.", diff --git a/l10n/pt_PT.json b/l10n/pt_PT.json index c1906ff1..0ebb9372 100644 --- a/l10n/pt_PT.json +++ b/l10n/pt_PT.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Memories", "Yet another photo management app" : "Mais uma aplicação de gestão de fotografias", + "Settings" : "Definições", "Timeline" : "Linha do tempo", "Folders" : "Pastas", "Favorites" : "Favoritos", @@ -8,7 +9,9 @@ "Archive" : "Arquivar", "Tags" : "Etiquetas", "Maps" : "Mapas", - "Settings" : "Definições", + "Unsaved changes" : "Modificações não guardadas", + "Edit" : "Editar", + "Loading …" : "A carregar...", "Cancel" : "Cancelar", "Delete" : "Eliminar", "Download" : "Transferir", @@ -19,6 +22,7 @@ "Timeline Path" : "Caminho da Cronologia", "Show hidden folders" : "Mostrar pastas ocultas", "Failed to load some photos" : "Não foi possível carregar algumas fotografias", + "Share" : "Partilhar", "Copy public link" : "Copiar ligação publica", "Public link" : "Hiperligação Pública", "Back" : "Anterior", @@ -29,9 +33,22 @@ "Hour" : "Hora", "Name" : "Nome", "Update" : "Atualizar", - "Loading …" : "A carregar...", "Refresh" : "Atualizar", + "Remove" : "Remover", "Share folder" : "Partilhar pasta", + "Reset" : "Reiniciar", + "Continue" : "Continuar", + "Undo" : "Desfazer", + "Redo" : "Repetir", + "Original" : "Original", + "Custom" : "Personalizado", + "Value" : "Valor", + "Image" : "Imagem", + "Text" : "Texto", + "Size" : "Altura", + "Name is required." : "Nome é obrigatório.", + "Quality" : "Qualidade", + "Auto" : "Auto", "Failed to delete files." : "Não foi possível eliminar os ficheiros.", "Failed to delete {fileName}." : "Não foi possível eliminar {fileName}.", "Failed to favorite files." : "Não foi possível colocar os ficheiros nos favoritos.", diff --git a/l10n/ro.js b/l10n/ro.js index ed9a7a2c..df876cbd 100644 --- a/l10n/ro.js +++ b/l10n/ro.js @@ -1,18 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Setări", "Folders" : "Director", "Favorites" : "Favorite", "Videos" : "Fișiere video", "Archive" : "Arhivă", "Tags" : "Etichete", "Maps" : "Hărți", - "Settings" : "Setări", + "Unsaved changes" : "Modificări nesalvate", + "Edit" : "Editează", + "Loading …" : "Se încarcă…", "Cancel" : "Anulare", "Delete" : "Șterge", "Download" : "Descărcare", "Favorite" : "Favorite", "View in folder" : "Vizualizează în director", + "Share" : "Partajează", "Copy public link" : "Copiză link-ul public", "Public link" : "Link public", "Back" : "Înapoi", @@ -23,8 +27,16 @@ OC.L10N.register( "Time" : "Timp", "Name" : "Nume", "Update" : "Actualizare", - "Loading …" : "Se încarcă…", "Refresh" : "Reîmprospătează", - "Share folder" : "Distribuie dosar" + "Remove" : "Elimină", + "Share folder" : "Distribuie dosar", + "Reset" : "Resetare", + "Continue" : "Continuă", + "Undo" : "Anulează ultima acțiune", + "Custom" : "Particularizat", + "Text" : "Text", + "Size" : "Mărime", + "Position" : "Poziție", + "Auto" : "Auto" }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/l10n/ro.json b/l10n/ro.json index 043e1c9b..f452423a 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -1,16 +1,20 @@ { "translations": { + "Settings" : "Setări", "Folders" : "Director", "Favorites" : "Favorite", "Videos" : "Fișiere video", "Archive" : "Arhivă", "Tags" : "Etichete", "Maps" : "Hărți", - "Settings" : "Setări", + "Unsaved changes" : "Modificări nesalvate", + "Edit" : "Editează", + "Loading …" : "Se încarcă…", "Cancel" : "Anulare", "Delete" : "Șterge", "Download" : "Descărcare", "Favorite" : "Favorite", "View in folder" : "Vizualizează în director", + "Share" : "Partajează", "Copy public link" : "Copiză link-ul public", "Public link" : "Link public", "Back" : "Înapoi", @@ -21,8 +25,16 @@ "Time" : "Timp", "Name" : "Nume", "Update" : "Actualizare", - "Loading …" : "Se încarcă…", "Refresh" : "Reîmprospătează", - "Share folder" : "Distribuie dosar" + "Remove" : "Elimină", + "Share folder" : "Distribuie dosar", + "Reset" : "Resetare", + "Continue" : "Continuă", + "Undo" : "Anulează ultima acțiune", + "Custom" : "Particularizat", + "Text" : "Text", + "Size" : "Mărime", + "Position" : "Poziție", + "Auto" : "Auto" },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" } \ No newline at end of file diff --git a/l10n/ru.js b/l10n/ru.js index 20b17161..da55dfcc 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Воспоминания", "Yet another photo management app" : "Приложение для управления фотографиями", + "Settings" : "Настройки", "Timeline" : "История", "Folders" : "Папки", "Favorites" : "Избранное", @@ -13,7 +14,11 @@ OC.L10N.register( "On this day" : "В этот день", "Tags" : "Метки", "Maps" : "Карты", - "Settings" : "Настройки", + "Error saving image" : "Не удалось сохранить изображение", + "Unsaved changes" : "Несохранённые изменения", + "Drop changes" : "Отменить изменения", + "Edit" : "Редактировать", + "Loading …" : "Загрузка …", "Cancel" : "Отменить", "Delete" : "Удалить", "Download" : "Скачать", @@ -25,11 +30,17 @@ OC.L10N.register( "Timeline Path" : "Расположение", "Show hidden folders" : "Показывать скрытые файлы", "Failed to load some photos" : "Не удалось загрузить некоторые фотографии", + "Share" : "Поделиться", "Sidebar" : "Боковая панель", "Copy public link" : "Скопировать общедоступную ссылку", "Public link" : "Общедоступная ссылка", + "Name of the album" : "Название альбома", + "Location of the album" : "Расположение альбома", + "Go back to the previous view." : "Вернуться к предыдущему режиму просмотра.", "Back" : "Назад", + "Add collaborators" : "Добавить соавторов", "Save" : "Сохранить", + "Create album" : "Создать альбом", "Year" : "Год", "Month" : "Месяц", "Day" : "День", @@ -38,9 +49,40 @@ OC.L10N.register( "Minute" : "Минута", "Name" : "Имя", "Update" : "Обновить", - "Loading …" : "Загрузка …", "Refresh" : "Обновить", + "Remove" : "Удалить", "Share folder" : "Поделиться папкой", + "Save as" : "Сохранить как", + "Reset" : "Сброс", + "All changes will be lost." : "Изменения не будут сохранены.", + "Are you sure you want to continue?" : "Продолжить?", + "Continue" : "Продолжить", + "Undo" : "Отменить", + "Redo" : "Повторить", + "Show original image" : "Показать исходное изображение", + "Zoom in" : "Приблизить", + "Zoom out" : "Отдалить", + "Watermark" : "Водяной знак", + "Invalid image." : "Неверный формат изображения.", + "Error while uploading the image." : "Не удалось передать изображение на сервер.", + "Crop" : "Обрезать", + "Original" : "Исходное", + "Custom" : "Свои параметры", + "Landscape" : "Ландшафт", + "Portrait" : "Портрет", + "HSV" : "HSV (Тон, насыщенность, значение)", + "Hue" : "Тон", + "Saturation" : "Насыщенность", + "Value" : "Значение", + "Image" : "Изображение", + "Line" : "Линия", + "Text" : "Текст", + "Size" : "Размер", + "Position" : "Должность", + "Extension" : "Расширение", + "Name is required." : "Необходимо указать имя.", + "Quality" : "Качество", + "Auto" : "Автоматически", "Failed to delete files." : "Ошибка удаления файлов.", "Failed to delete {fileName}." : "Ошибка удаления файла «{fileName}».", "Failed to favorite files." : "Не удалось добавить файлы в избранное.", diff --git a/l10n/ru.json b/l10n/ru.json index 18afa5c6..c9be4563 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Воспоминания", "Yet another photo management app" : "Приложение для управления фотографиями", + "Settings" : "Настройки", "Timeline" : "История", "Folders" : "Папки", "Favorites" : "Избранное", @@ -11,7 +12,11 @@ "On this day" : "В этот день", "Tags" : "Метки", "Maps" : "Карты", - "Settings" : "Настройки", + "Error saving image" : "Не удалось сохранить изображение", + "Unsaved changes" : "Несохранённые изменения", + "Drop changes" : "Отменить изменения", + "Edit" : "Редактировать", + "Loading …" : "Загрузка …", "Cancel" : "Отменить", "Delete" : "Удалить", "Download" : "Скачать", @@ -23,11 +28,17 @@ "Timeline Path" : "Расположение", "Show hidden folders" : "Показывать скрытые файлы", "Failed to load some photos" : "Не удалось загрузить некоторые фотографии", + "Share" : "Поделиться", "Sidebar" : "Боковая панель", "Copy public link" : "Скопировать общедоступную ссылку", "Public link" : "Общедоступная ссылка", + "Name of the album" : "Название альбома", + "Location of the album" : "Расположение альбома", + "Go back to the previous view." : "Вернуться к предыдущему режиму просмотра.", "Back" : "Назад", + "Add collaborators" : "Добавить соавторов", "Save" : "Сохранить", + "Create album" : "Создать альбом", "Year" : "Год", "Month" : "Месяц", "Day" : "День", @@ -36,9 +47,40 @@ "Minute" : "Минута", "Name" : "Имя", "Update" : "Обновить", - "Loading …" : "Загрузка …", "Refresh" : "Обновить", + "Remove" : "Удалить", "Share folder" : "Поделиться папкой", + "Save as" : "Сохранить как", + "Reset" : "Сброс", + "All changes will be lost." : "Изменения не будут сохранены.", + "Are you sure you want to continue?" : "Продолжить?", + "Continue" : "Продолжить", + "Undo" : "Отменить", + "Redo" : "Повторить", + "Show original image" : "Показать исходное изображение", + "Zoom in" : "Приблизить", + "Zoom out" : "Отдалить", + "Watermark" : "Водяной знак", + "Invalid image." : "Неверный формат изображения.", + "Error while uploading the image." : "Не удалось передать изображение на сервер.", + "Crop" : "Обрезать", + "Original" : "Исходное", + "Custom" : "Свои параметры", + "Landscape" : "Ландшафт", + "Portrait" : "Портрет", + "HSV" : "HSV (Тон, насыщенность, значение)", + "Hue" : "Тон", + "Saturation" : "Насыщенность", + "Value" : "Значение", + "Image" : "Изображение", + "Line" : "Линия", + "Text" : "Текст", + "Size" : "Размер", + "Position" : "Должность", + "Extension" : "Расширение", + "Name is required." : "Необходимо указать имя.", + "Quality" : "Качество", + "Auto" : "Автоматически", "Failed to delete files." : "Ошибка удаления файлов.", "Failed to delete {fileName}." : "Ошибка удаления файла «{fileName}».", "Failed to favorite files." : "Не удалось добавить файлы в избранное.", diff --git a/l10n/sc.js b/l10n/sc.js index 29950041..d3e3679f 100644 --- a/l10n/sc.js +++ b/l10n/sc.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Impostatziones", "Timeline" : "Lìnia de tempus", "Folders" : "Cartellas", "Favorites" : "Preferidos", @@ -10,12 +11,15 @@ OC.L10N.register( "Archive" : "Cartella", "Tags" : "Etichetas", "Maps" : "Mapas", - "Settings" : "Impostatziones", + "Unsaved changes" : "Mudas non sarvadas", + "Edit" : "Modìfica", + "Loading …" : "Carrigamentu …", "Cancel" : "Annulla", "Delete" : "Cantzella", "Download" : "Iscàrriga", "Favorite" : "Preferidu", "View in folder" : "Càstia in sa cartella", + "Share" : "Cumpartzidura", "Copy public link" : "Còpia ligòngiu pùblicu", "Public link" : "Ligòngiu pùblicu", "Back" : "In segus", @@ -28,8 +32,24 @@ OC.L10N.register( "Minute" : "Minutu", "Name" : "Nùmene", "Update" : "Agiorna", - "Loading …" : "Carrigamentu …", "Refresh" : "Agiorna", - "Share folder" : "Cumpartzi cartella" + "Remove" : "Boga", + "Share folder" : "Cumpartzi cartella", + "Reset" : "Torra a impostare", + "Continue" : "Sighi", + "Undo" : "Annulla", + "Redo" : "Torra a fàghere", + "Zoom in" : "Ammània", + "Original" : "Originale", + "Custom" : "Personaliza", + "Value" : "Balore", + "Image" : "Imàgine", + "Text" : "Testu", + "Size" : "Mannària", + "Position" : "Positzione", + "Extension" : "Estensione", + "Name is required." : "Su nùmene est rechertu: ", + "Quality" : "Calidade", + "Auto" : "Auto" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/sc.json b/l10n/sc.json index 1c16c973..cd5b5565 100644 --- a/l10n/sc.json +++ b/l10n/sc.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Impostatziones", "Timeline" : "Lìnia de tempus", "Folders" : "Cartellas", "Favorites" : "Preferidos", @@ -8,12 +9,15 @@ "Archive" : "Cartella", "Tags" : "Etichetas", "Maps" : "Mapas", - "Settings" : "Impostatziones", + "Unsaved changes" : "Mudas non sarvadas", + "Edit" : "Modìfica", + "Loading …" : "Carrigamentu …", "Cancel" : "Annulla", "Delete" : "Cantzella", "Download" : "Iscàrriga", "Favorite" : "Preferidu", "View in folder" : "Càstia in sa cartella", + "Share" : "Cumpartzidura", "Copy public link" : "Còpia ligòngiu pùblicu", "Public link" : "Ligòngiu pùblicu", "Back" : "In segus", @@ -26,8 +30,24 @@ "Minute" : "Minutu", "Name" : "Nùmene", "Update" : "Agiorna", - "Loading …" : "Carrigamentu …", "Refresh" : "Agiorna", - "Share folder" : "Cumpartzi cartella" + "Remove" : "Boga", + "Share folder" : "Cumpartzi cartella", + "Reset" : "Torra a impostare", + "Continue" : "Sighi", + "Undo" : "Annulla", + "Redo" : "Torra a fàghere", + "Zoom in" : "Ammània", + "Original" : "Originale", + "Custom" : "Personaliza", + "Value" : "Balore", + "Image" : "Imàgine", + "Text" : "Testu", + "Size" : "Mannària", + "Position" : "Positzione", + "Extension" : "Estensione", + "Name is required." : "Su nùmene est rechertu: ", + "Quality" : "Calidade", + "Auto" : "Auto" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/si.js b/l10n/si.js index b7e4aa8f..f0844f9d 100644 --- a/l10n/si.js +++ b/l10n/si.js @@ -1,14 +1,17 @@ OC.L10N.register( "memories", { + "Settings" : "සැකසුම්", "Favorites" : "ප්රියතම", "Archive" : "සංරක්ෂණය", "Maps" : "සිතියම්", - "Settings" : "සැකසුම්", + "Edit" : "සංස්කරණය", + "Loading …" : "පූරණය වෙමින් …", "Cancel" : "අවලංගු කරන්න", "Download" : "බාගන්න", "Favorite" : "ප්රියතම", "View in folder" : "බහාලුමේ බලන්න", + "Share" : "බෙදාගන්න", "Back" : "ආපසු", "Save" : "සුරකින්න", "Year" : "වර්ෂය", @@ -17,6 +20,9 @@ OC.L10N.register( "Time" : "වේලාව", "Name" : "නම", "Update" : "යාවත්කාල", - "Loading …" : "පූරණය වෙමින් …" + "Remove" : "ඉවත් කරන්න", + "Undo" : "පෙරසේ", + "Value" : "අගය", + "Size" : "ප්රමාණය" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/si.json b/l10n/si.json index 08eee5d0..bd4928a9 100644 --- a/l10n/si.json +++ b/l10n/si.json @@ -1,12 +1,15 @@ { "translations": { + "Settings" : "සැකසුම්", "Favorites" : "ප්රියතම", "Archive" : "සංරක්ෂණය", "Maps" : "සිතියම්", - "Settings" : "සැකසුම්", + "Edit" : "සංස්කරණය", + "Loading …" : "පූරණය වෙමින් …", "Cancel" : "අවලංගු කරන්න", "Download" : "බාගන්න", "Favorite" : "ප්රියතම", "View in folder" : "බහාලුමේ බලන්න", + "Share" : "බෙදාගන්න", "Back" : "ආපසු", "Save" : "සුරකින්න", "Year" : "වර්ෂය", @@ -15,6 +18,9 @@ "Time" : "වේලාව", "Name" : "නම", "Update" : "යාවත්කාල", - "Loading …" : "පූරණය වෙමින් …" + "Remove" : "ඉවත් කරන්න", + "Undo" : "පෙරසේ", + "Value" : "අගය", + "Size" : "ප්රමාණය" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/sk.js b/l10n/sk.js index 8b272e3a..86fd56b3 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Spomienky", "Yet another photo management app" : "Ďalšia aplikácia na správu fotografií", + "Settings" : "Nastavenia", "Timeline" : "Časová os", "Folders" : "Priečinky", "Favorites" : "Obľúbené", @@ -13,7 +14,11 @@ OC.L10N.register( "On this day" : "V tento deň", "Tags" : "Štítky", "Maps" : "Mapy", - "Settings" : "Nastavenia", + "Error saving image" : "Chyba pri ukladaní obrázku", + "Unsaved changes" : "Neuložené zmeny", + "Drop changes" : "Zrušiť zmeny", + "Edit" : "Upraviť", + "Loading …" : "Načítavam …", "Cancel" : "Zrušiť", "Delete" : "Vymazať", "Download" : "Sťahovanie", @@ -31,6 +36,7 @@ OC.L10N.register( "Show hidden folders" : "Zobraziť skryté priečinky", "Your Timeline" : "Vaša časová os", "Failed to load some photos" : "Načítanie akýchkoľvek fotiek zlyhalo", + "Share" : "Zdieľať", "Sidebar" : "Bočný panel", "Processing … {n}/{m}" : "Spracúvam ... {n}/{m}", "Search for collaborators" : "Vyhľadať spolupracovníkov", @@ -61,6 +67,7 @@ OC.L10N.register( "Add collaborators" : "Pridať spolupracujúcich", "Save" : "Uložiť", "Create album" : "Vytvoriť album", + "Add selection to album {albumName}" : "Pridať vybrané do albumu {ablumName}", "Create a new album." : "Vytvoriť nový album.", "Save collaborators for this album." : "Uložiť spolupracovníkov pre tento album.", "Year" : "Rok", @@ -80,16 +87,101 @@ OC.L10N.register( "Rename person" : "Premenovať osobu", "Update" : "Aktualizovať", "Failed to rename {oldName} to {name}." : "Nepodarilo sa premenovať {oldName} na {name}.", - "Loading …" : "Načítavam …", "Merge {name} with person" : "Zlúčiť {name} s osobou", "Are you sure you want to merge {name} with {newName}?" : "Naozaj chcete zlúčiť {name} s {newName}?", "Too many failures, aborting" : "Príliš veľa zlyhaní, prerušujem", "Error while moving {basename}" : "Chyba pri presúvaní {basename}", "Failed to move {name}." : "Nepodarilo sa presunúť {name}.", "Refresh" : "Obnoviť", + "Remove" : "Odobrať", "Delete album" : "Zmazať album", "Merge with different person" : "Spojiť s inou osobou", "Share folder" : "Zdieľať priečinok", + "Save as" : "Uložiť ako", + "Reset" : "Resetovať", + "All changes will be lost." : "Vaše zmeny budú stratené.", + "Are you sure you want to continue?" : "Naozaj chcete pokračovať?", + "Continue" : "Pokračovať", + "Undo" : "Vrátiť", + "Redo" : "Vrátiť", + "Show original image" : "Zobraziť originálny obrázok", + "Zoom in" : "Priblížiť", + "Zoom out" : "Oddialiť", + "Toggle zoom menu" : "Prepnúť ponuku priblíženia", + "Adjust" : "Prispôsobiť", + "Fine-tune" : "Vylepšiť", + "Filters" : "Filtre", + "Watermark" : "Vodoznak", + "Draw" : "Kreslenie", + "Resize" : "Zmeniť veľkosť", + "Invalid image." : "Chybný obrázok.", + "Error while uploading the image." : "Chyba pri nahrávaní obrázku", + "are not images" : "nie sú obrázky", + "is not an image" : "nie je obrázok", + "to be uploaded" : "bude nahrané", + "Crop" : "Orezať", + "Original" : "Pôvodné", + "Custom" : "Vlastný", + "Square" : "Štvorec", + "Landscape" : "Na šírku", + "Portrait" : "Na výšku", + "Ellipse" : "Elipsa", + "Classic TV" : "Klasická TV", + "CinemaScope" : "Širokoúhlo", + "Arrow" : "Šipka", + "Blur" : "Rozmazať", + "Brightness" : "Jas", + "Contrast" : "Kontrast", + "Un-flip X" : "Vrátiť prevrátenie zvislo", + "Flip X" : "Prevrátiť zvislo", + "Un-flip Y" : "Vrátiť prevrátenie vodorovne", + "Flip Y" : "Prevrátiť vodorovne", + "HSV" : "HSV", + "Hue" : "Odtieň", + "Saturation" : "Sýtosť", + "Value" : "Hodnota", + "Image" : "Obrázok", + "Importing …" : "Importuje sa ...", + "+ Add image" : "+ Pridať obrázok", + "Line" : "Čiara", + "Pen" : "Pero", + "Polygon" : "Mnohouholník", + "Sides" : "Strany", + "Rectangle" : "Odĺžnik", + "Corner Radius" : "Polomer zaoblenia", + "Width in pixels" : "Šírka v pixeloch", + "Height in pixels" : "Výška v pixeloch", + "Toggle ratio lock" : "Prepnúť zámok pomeru strán", + "Reset to original image size" : "Vrátiť pôvodnú veľkost obrázku", + "Rotate" : "Otočiť", + "Text" : "Text", + "Text spacing" : "Riadkovanie", + "Text alignment" : "Zarovnanie textu", + "Font family" : "Typ písma", + "Size" : "Veľkosť", + "Letter spacing" : "Medzery medzi písmenami", + "Line height" : "Hrúbka čiary", + "Warmth" : "Teplota", + "+ Add watermark" : "+ Pridať vodoznak", + "Choose watermark type" : "Vyberte typ vodoznaku", + "Upload watermark" : "Nahrať vodoznak", + "Add as text" : "Pridať ako text", + "Padding" : "Okraj", + "Shadow" : "Tieň", + "Horizontal" : "Horizontálne", + "Vertical" : "Vertikálne", + "Opacity" : "Priehľadnosť", + "Position" : "Pozícia", + "Stroke" : "Potiahnuť", + "Save image as" : "Uložiť obrázok ako", + "Extension" : "Prípona", + "Name is required." : "Meno je povinné.", + "Quality" : "Kvalita", + "Saved image size (width x height)" : "Veľkosť uloženého obrázka (šírka x výška)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Upozorňujeme, že vybratá oblasť orezania je menšia ako použitá zmena veľkosti, čo môže spôsobiť zníženie kvality", + "Actual size (100%)" : "Aktuálna veľkosť (100%)", + "Fit size" : "Prispôsobiť veľlkosť", + "Auto" : "Automaticky", "Failed to create {albumName}." : "Zlyhalo vytváranie {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Chyba pri premenovávaní {currentAlbumName} na {newAlbumName}.", "General Failure" : "Všeobecné zlyhanie", diff --git a/l10n/sk.json b/l10n/sk.json index ec36d928..4ab2812b 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Spomienky", "Yet another photo management app" : "Ďalšia aplikácia na správu fotografií", + "Settings" : "Nastavenia", "Timeline" : "Časová os", "Folders" : "Priečinky", "Favorites" : "Obľúbené", @@ -11,7 +12,11 @@ "On this day" : "V tento deň", "Tags" : "Štítky", "Maps" : "Mapy", - "Settings" : "Nastavenia", + "Error saving image" : "Chyba pri ukladaní obrázku", + "Unsaved changes" : "Neuložené zmeny", + "Drop changes" : "Zrušiť zmeny", + "Edit" : "Upraviť", + "Loading …" : "Načítavam …", "Cancel" : "Zrušiť", "Delete" : "Vymazať", "Download" : "Sťahovanie", @@ -29,6 +34,7 @@ "Show hidden folders" : "Zobraziť skryté priečinky", "Your Timeline" : "Vaša časová os", "Failed to load some photos" : "Načítanie akýchkoľvek fotiek zlyhalo", + "Share" : "Zdieľať", "Sidebar" : "Bočný panel", "Processing … {n}/{m}" : "Spracúvam ... {n}/{m}", "Search for collaborators" : "Vyhľadať spolupracovníkov", @@ -59,6 +65,7 @@ "Add collaborators" : "Pridať spolupracujúcich", "Save" : "Uložiť", "Create album" : "Vytvoriť album", + "Add selection to album {albumName}" : "Pridať vybrané do albumu {ablumName}", "Create a new album." : "Vytvoriť nový album.", "Save collaborators for this album." : "Uložiť spolupracovníkov pre tento album.", "Year" : "Rok", @@ -78,16 +85,101 @@ "Rename person" : "Premenovať osobu", "Update" : "Aktualizovať", "Failed to rename {oldName} to {name}." : "Nepodarilo sa premenovať {oldName} na {name}.", - "Loading …" : "Načítavam …", "Merge {name} with person" : "Zlúčiť {name} s osobou", "Are you sure you want to merge {name} with {newName}?" : "Naozaj chcete zlúčiť {name} s {newName}?", "Too many failures, aborting" : "Príliš veľa zlyhaní, prerušujem", "Error while moving {basename}" : "Chyba pri presúvaní {basename}", "Failed to move {name}." : "Nepodarilo sa presunúť {name}.", "Refresh" : "Obnoviť", + "Remove" : "Odobrať", "Delete album" : "Zmazať album", "Merge with different person" : "Spojiť s inou osobou", "Share folder" : "Zdieľať priečinok", + "Save as" : "Uložiť ako", + "Reset" : "Resetovať", + "All changes will be lost." : "Vaše zmeny budú stratené.", + "Are you sure you want to continue?" : "Naozaj chcete pokračovať?", + "Continue" : "Pokračovať", + "Undo" : "Vrátiť", + "Redo" : "Vrátiť", + "Show original image" : "Zobraziť originálny obrázok", + "Zoom in" : "Priblížiť", + "Zoom out" : "Oddialiť", + "Toggle zoom menu" : "Prepnúť ponuku priblíženia", + "Adjust" : "Prispôsobiť", + "Fine-tune" : "Vylepšiť", + "Filters" : "Filtre", + "Watermark" : "Vodoznak", + "Draw" : "Kreslenie", + "Resize" : "Zmeniť veľkosť", + "Invalid image." : "Chybný obrázok.", + "Error while uploading the image." : "Chyba pri nahrávaní obrázku", + "are not images" : "nie sú obrázky", + "is not an image" : "nie je obrázok", + "to be uploaded" : "bude nahrané", + "Crop" : "Orezať", + "Original" : "Pôvodné", + "Custom" : "Vlastný", + "Square" : "Štvorec", + "Landscape" : "Na šírku", + "Portrait" : "Na výšku", + "Ellipse" : "Elipsa", + "Classic TV" : "Klasická TV", + "CinemaScope" : "Širokoúhlo", + "Arrow" : "Šipka", + "Blur" : "Rozmazať", + "Brightness" : "Jas", + "Contrast" : "Kontrast", + "Un-flip X" : "Vrátiť prevrátenie zvislo", + "Flip X" : "Prevrátiť zvislo", + "Un-flip Y" : "Vrátiť prevrátenie vodorovne", + "Flip Y" : "Prevrátiť vodorovne", + "HSV" : "HSV", + "Hue" : "Odtieň", + "Saturation" : "Sýtosť", + "Value" : "Hodnota", + "Image" : "Obrázok", + "Importing …" : "Importuje sa ...", + "+ Add image" : "+ Pridať obrázok", + "Line" : "Čiara", + "Pen" : "Pero", + "Polygon" : "Mnohouholník", + "Sides" : "Strany", + "Rectangle" : "Odĺžnik", + "Corner Radius" : "Polomer zaoblenia", + "Width in pixels" : "Šírka v pixeloch", + "Height in pixels" : "Výška v pixeloch", + "Toggle ratio lock" : "Prepnúť zámok pomeru strán", + "Reset to original image size" : "Vrátiť pôvodnú veľkost obrázku", + "Rotate" : "Otočiť", + "Text" : "Text", + "Text spacing" : "Riadkovanie", + "Text alignment" : "Zarovnanie textu", + "Font family" : "Typ písma", + "Size" : "Veľkosť", + "Letter spacing" : "Medzery medzi písmenami", + "Line height" : "Hrúbka čiary", + "Warmth" : "Teplota", + "+ Add watermark" : "+ Pridať vodoznak", + "Choose watermark type" : "Vyberte typ vodoznaku", + "Upload watermark" : "Nahrať vodoznak", + "Add as text" : "Pridať ako text", + "Padding" : "Okraj", + "Shadow" : "Tieň", + "Horizontal" : "Horizontálne", + "Vertical" : "Vertikálne", + "Opacity" : "Priehľadnosť", + "Position" : "Pozícia", + "Stroke" : "Potiahnuť", + "Save image as" : "Uložiť obrázok ako", + "Extension" : "Prípona", + "Name is required." : "Meno je povinné.", + "Quality" : "Kvalita", + "Saved image size (width x height)" : "Veľkosť uloženého obrázka (šírka x výška)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Upozorňujeme, že vybratá oblasť orezania je menšia ako použitá zmena veľkosti, čo môže spôsobiť zníženie kvality", + "Actual size (100%)" : "Aktuálna veľkosť (100%)", + "Fit size" : "Prispôsobiť veľlkosť", + "Auto" : "Automaticky", "Failed to create {albumName}." : "Zlyhalo vytváranie {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Chyba pri premenovávaní {currentAlbumName} na {newAlbumName}.", "General Failure" : "Všeobecné zlyhanie", diff --git a/l10n/sl.js b/l10n/sl.js index 6f8c0461..66e1c043 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Nastavitve", "Timeline" : "Časovnica", "Folders" : "Mape", "Favorites" : "Priljubljeno", @@ -11,13 +12,16 @@ OC.L10N.register( "On this day" : "Na današnji dan", "Tags" : "Oznake", "Maps" : "Zemljevidi", - "Settings" : "Nastavitve", + "Unsaved changes" : "Neshranjene spremembe", + "Edit" : "Uredi", + "Loading …" : "Poteka nalaganje …", "Cancel" : "Prekliči", "Delete" : "Izbriši", "Download" : "Prejmi", "Favorite" : "Priljubljeno", "Unarchive" : "Odarhiviraj", "View in folder" : "Pokaži v mapi", + "Share" : "Souporaba", "Sidebar" : "Bočno okno", "Copy public link" : "Kopiraj javno povezavo", "Public link" : "Javna povezava", @@ -34,8 +38,28 @@ OC.L10N.register( "Minute" : "Minuta", "Name" : "Ime", "Update" : "Posodobi", - "Loading …" : "Poteka nalaganje …", "Refresh" : "Osveži", - "Share folder" : "Omogoči souporabo mape" + "Remove" : "Odstrani", + "Share folder" : "Omogoči souporabo mape", + "Reset" : "Ponastavi", + "Continue" : "Nadaljuj", + "Undo" : "Razveljavi", + "Redo" : "Ponovno uveljavi", + "Zoom in" : "Približaj", + "Draw" : "Risba", + "Original" : "Izvorno", + "Custom" : "Po meri", + "Landscape" : "Pokrajina", + "Portrait" : "Portret", + "Value" : "Vrednost", + "Image" : "Slika", + "Line" : "Črtni diagram", + "Text" : "Besedilo", + "Size" : "Višina", + "Position" : "Položaj", + "Extension" : "Pripona", + "Name is required." : "Ime mora biti vpisano.", + "Quality" : "Kakovost", + "Auto" : "Samodejno" }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/l10n/sl.json b/l10n/sl.json index cb81286d..8a82fda0 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Nastavitve", "Timeline" : "Časovnica", "Folders" : "Mape", "Favorites" : "Priljubljeno", @@ -9,13 +10,16 @@ "On this day" : "Na današnji dan", "Tags" : "Oznake", "Maps" : "Zemljevidi", - "Settings" : "Nastavitve", + "Unsaved changes" : "Neshranjene spremembe", + "Edit" : "Uredi", + "Loading …" : "Poteka nalaganje …", "Cancel" : "Prekliči", "Delete" : "Izbriši", "Download" : "Prejmi", "Favorite" : "Priljubljeno", "Unarchive" : "Odarhiviraj", "View in folder" : "Pokaži v mapi", + "Share" : "Souporaba", "Sidebar" : "Bočno okno", "Copy public link" : "Kopiraj javno povezavo", "Public link" : "Javna povezava", @@ -32,8 +36,28 @@ "Minute" : "Minuta", "Name" : "Ime", "Update" : "Posodobi", - "Loading …" : "Poteka nalaganje …", "Refresh" : "Osveži", - "Share folder" : "Omogoči souporabo mape" + "Remove" : "Odstrani", + "Share folder" : "Omogoči souporabo mape", + "Reset" : "Ponastavi", + "Continue" : "Nadaljuj", + "Undo" : "Razveljavi", + "Redo" : "Ponovno uveljavi", + "Zoom in" : "Približaj", + "Draw" : "Risba", + "Original" : "Izvorno", + "Custom" : "Po meri", + "Landscape" : "Pokrajina", + "Portrait" : "Portret", + "Value" : "Vrednost", + "Image" : "Slika", + "Line" : "Črtni diagram", + "Text" : "Besedilo", + "Size" : "Višina", + "Position" : "Položaj", + "Extension" : "Pripona", + "Name is required." : "Ime mora biti vpisano.", + "Quality" : "Kakovost", + "Auto" : "Samodejno" },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" } \ No newline at end of file diff --git a/l10n/sq.js b/l10n/sq.js index c6115dd0..d7f13f47 100644 --- a/l10n/sq.js +++ b/l10n/sq.js @@ -1,19 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Rregullimet", "Folders" : "Dosjet", "Favorites" : "Favorites", "Videos" : "Videot", "Archive" : "Arkiva", "Tags" : "Etiketat", "Maps" : "Harta", - "Settings" : "Rregullimet", + "Unsaved changes" : "Ndryshime të paruajtura", + "Edit" : "Përpuno", "Cancel" : "Anullo", "Delete" : "Fshi", "Download" : "Shkarko", "Favorite" : "I/E Preferuar", "Unarchive" : "Hiq nga arkivi", "View in folder" : "Shikoje në dosje", + "Share" : "Shpërndaje", "Back" : "Prapa", "Save" : "Ruaj", "Month" : "Muaj", @@ -22,6 +25,17 @@ OC.L10N.register( "Hour" : "Orë", "Name" : "Emri", "Update" : "Përditëso", - "Refresh" : "Rifresko" + "Refresh" : "Rifresko", + "Remove" : "Hiq", + "Reset" : "Rivendos", + "Continue" : "Vazhdo", + "Undo" : "Ktheje pas", + "Redo" : "Ribëj", + "Custom" : "E përshtatur", + "Value" : "Vlerë", + "Text" : "Tekst", + "Size" : "Madhësi", + "Position" : "Pozicion", + "Name is required." : "Emri është i domosdoshëm" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/sq.json b/l10n/sq.json index b7f52da8..47fc0b13 100644 --- a/l10n/sq.json +++ b/l10n/sq.json @@ -1,17 +1,20 @@ { "translations": { + "Settings" : "Rregullimet", "Folders" : "Dosjet", "Favorites" : "Favorites", "Videos" : "Videot", "Archive" : "Arkiva", "Tags" : "Etiketat", "Maps" : "Harta", - "Settings" : "Rregullimet", + "Unsaved changes" : "Ndryshime të paruajtura", + "Edit" : "Përpuno", "Cancel" : "Anullo", "Delete" : "Fshi", "Download" : "Shkarko", "Favorite" : "I/E Preferuar", "Unarchive" : "Hiq nga arkivi", "View in folder" : "Shikoje në dosje", + "Share" : "Shpërndaje", "Back" : "Prapa", "Save" : "Ruaj", "Month" : "Muaj", @@ -20,6 +23,17 @@ "Hour" : "Orë", "Name" : "Emri", "Update" : "Përditëso", - "Refresh" : "Rifresko" + "Refresh" : "Rifresko", + "Remove" : "Hiq", + "Reset" : "Rivendos", + "Continue" : "Vazhdo", + "Undo" : "Ktheje pas", + "Redo" : "Ribëj", + "Custom" : "E përshtatur", + "Value" : "Vlerë", + "Text" : "Tekst", + "Size" : "Madhësi", + "Position" : "Pozicion", + "Name is required." : "Emri është i domosdoshëm" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/sr.js b/l10n/sr.js index e69499eb..bbfe298c 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "Поставке", "Timeline" : "Временска оса", "Folders" : "Фасцикле", "Favorites" : "Омиљене", @@ -9,13 +10,16 @@ OC.L10N.register( "Archive" : "Архива", "Tags" : "Ознаке", "Maps" : "Мапе", - "Settings" : "Поставке", + "Unsaved changes" : "Несачуване измене", + "Edit" : "Измени", + "Loading …" : "Учитавање…", "Cancel" : "Поништи", "Delete" : "Избриши", "Download" : "Преузми", "Favorite" : "Омиљени", "Unarchive" : "Врати из архиве", "View in folder" : "Види у фасцикли", + "Share" : "Подели", "Sidebar" : "Бочна трака", "Public link" : "Јавна веза", "Back" : "Назад", @@ -28,7 +32,21 @@ OC.L10N.register( "Minute" : "Минут", "Name" : "Име", "Update" : "Ажурирај", - "Loading …" : "Учитавање…", - "Refresh" : "Освежи" + "Refresh" : "Освежи", + "Remove" : "Уклони", + "Reset" : "Ресетуј", + "Continue" : "Настави", + "Undo" : "Опозови", + "Redo" : "Понови", + "Zoom in" : "Увеличај", + "Original" : "Оригинал", + "Custom" : "Прилагођено", + "Value" : "Вредност", + "Image" : "Слика", + "Text" : "Текст", + "Size" : "величина", + "Position" : "Позиција", + "Extension" : "Екстензија", + "Auto" : "Аутоматски" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/l10n/sr.json b/l10n/sr.json index 437dc8ba..3d219a83 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "Поставке", "Timeline" : "Временска оса", "Folders" : "Фасцикле", "Favorites" : "Омиљене", @@ -7,13 +8,16 @@ "Archive" : "Архива", "Tags" : "Ознаке", "Maps" : "Мапе", - "Settings" : "Поставке", + "Unsaved changes" : "Несачуване измене", + "Edit" : "Измени", + "Loading …" : "Учитавање…", "Cancel" : "Поништи", "Delete" : "Избриши", "Download" : "Преузми", "Favorite" : "Омиљени", "Unarchive" : "Врати из архиве", "View in folder" : "Види у фасцикли", + "Share" : "Подели", "Sidebar" : "Бочна трака", "Public link" : "Јавна веза", "Back" : "Назад", @@ -26,7 +30,21 @@ "Minute" : "Минут", "Name" : "Име", "Update" : "Ажурирај", - "Loading …" : "Учитавање…", - "Refresh" : "Освежи" + "Refresh" : "Освежи", + "Remove" : "Уклони", + "Reset" : "Ресетуј", + "Continue" : "Настави", + "Undo" : "Опозови", + "Redo" : "Понови", + "Zoom in" : "Увеличај", + "Original" : "Оригинал", + "Custom" : "Прилагођено", + "Value" : "Вредност", + "Image" : "Слика", + "Text" : "Текст", + "Size" : "величина", + "Position" : "Позиција", + "Extension" : "Екстензија", + "Auto" : "Аутоматски" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/l10n/sr@latin.js b/l10n/sr@latin.js index e8288ad9..64711c6e 100644 --- a/l10n/sr@latin.js +++ b/l10n/sr@latin.js @@ -1,18 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "Поставке", "Favorites" : "Omiljene", "Videos" : "Video", "Tags" : "Oznake", - "Settings" : "Поставке", + "Edit" : "Izmeni", "Cancel" : "Otkaži", "Delete" : "Obriši", "Download" : "Preuzmi", "Favorite" : "Omiljene", + "Share" : "Podeli", "Back" : "Nazad", "Save" : "Sačuvaj", "Name" : "Ime", "Update" : "Ažuriraj", - "Refresh" : "Osveži" + "Refresh" : "Osveži", + "Remove" : "Ukloni", + "Undo" : "Opozovi" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/l10n/sr@latin.json b/l10n/sr@latin.json index 28da2419..9b01ee08 100644 --- a/l10n/sr@latin.json +++ b/l10n/sr@latin.json @@ -1,16 +1,20 @@ { "translations": { + "Settings" : "Поставке", "Favorites" : "Omiljene", "Videos" : "Video", "Tags" : "Oznake", - "Settings" : "Поставке", + "Edit" : "Izmeni", "Cancel" : "Otkaži", "Delete" : "Obriši", "Download" : "Preuzmi", "Favorite" : "Omiljene", + "Share" : "Podeli", "Back" : "Nazad", "Save" : "Sačuvaj", "Name" : "Ime", "Update" : "Ažuriraj", - "Refresh" : "Osveži" + "Refresh" : "Osveži", + "Remove" : "Ukloni", + "Undo" : "Opozovi" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/l10n/sv.js b/l10n/sv.js index acce724c..d6454f09 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Memories" : "Memories", "Yet another photo management app" : "Ännu en app för fotohantering", + "Settings" : "Inställningar", "Timeline" : "Tidslinje", "Folders" : "Mappar", "Favorites" : "Favoriter", @@ -13,7 +14,9 @@ OC.L10N.register( "On this day" : "På den här dagen", "Tags" : "Taggar", "Maps" : "Kartor", - "Settings" : "Inställningar", + "Unsaved changes" : "Ej sparade ändringar", + "Edit" : "Ändra", + "Loading …" : "Läser in …", "Cancel" : "Avbryt", "Delete" : "Radera", "Download" : "Ladda ner", @@ -26,6 +29,7 @@ OC.L10N.register( "Timeline Path" : "Tidslinjesökväg", "Show hidden folders" : "Visa dolda filer", "Failed to load some photos" : "Misslyckades att läsa in vissa foton", + "Share" : "Dela", "Copy the public link" : "Kopiera den publika länken", "Delete the public link" : "Ta bort den offentliga länken", "Public link copied!" : "Offentlig länk kopierad!", @@ -47,9 +51,24 @@ OC.L10N.register( "Remove person" : "Ta bort person", "Name" : "Namn", "Update" : "Uppdatera", - "Loading …" : "Läser in …", "Refresh" : "Uppdatera", + "Remove" : "Ta bort", "Share folder" : "Dela mapp", + "Reset" : "Återställ", + "Continue" : "Fortsätt", + "Undo" : "Ångra", + "Redo" : "Gör om", + "Original" : "Orginal", + "Custom" : "Anpassad", + "Value" : "Värde", + "Image" : "Bild", + "Line" : "Rad", + "Text" : "Text", + "Size" : "Storlek", + "Position" : "Position", + "Extension" : "Tillägg", + "Name is required." : "Namn är obligatoriskt.", + "Auto" : "Auto", "Failed to delete files." : "Misslyckades att radera filer.", "Failed to delete {fileName}." : "Misslyckades att radera {fileName}.", "Failed to favorite files." : "Misslyckades att favorisera filer.", diff --git a/l10n/sv.json b/l10n/sv.json index dcae1cbf..27c9b12f 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -1,6 +1,7 @@ { "translations": { "Memories" : "Memories", "Yet another photo management app" : "Ännu en app för fotohantering", + "Settings" : "Inställningar", "Timeline" : "Tidslinje", "Folders" : "Mappar", "Favorites" : "Favoriter", @@ -11,7 +12,9 @@ "On this day" : "På den här dagen", "Tags" : "Taggar", "Maps" : "Kartor", - "Settings" : "Inställningar", + "Unsaved changes" : "Ej sparade ändringar", + "Edit" : "Ändra", + "Loading …" : "Läser in …", "Cancel" : "Avbryt", "Delete" : "Radera", "Download" : "Ladda ner", @@ -24,6 +27,7 @@ "Timeline Path" : "Tidslinjesökväg", "Show hidden folders" : "Visa dolda filer", "Failed to load some photos" : "Misslyckades att läsa in vissa foton", + "Share" : "Dela", "Copy the public link" : "Kopiera den publika länken", "Delete the public link" : "Ta bort den offentliga länken", "Public link copied!" : "Offentlig länk kopierad!", @@ -45,9 +49,24 @@ "Remove person" : "Ta bort person", "Name" : "Namn", "Update" : "Uppdatera", - "Loading …" : "Läser in …", "Refresh" : "Uppdatera", + "Remove" : "Ta bort", "Share folder" : "Dela mapp", + "Reset" : "Återställ", + "Continue" : "Fortsätt", + "Undo" : "Ångra", + "Redo" : "Gör om", + "Original" : "Orginal", + "Custom" : "Anpassad", + "Value" : "Värde", + "Image" : "Bild", + "Line" : "Rad", + "Text" : "Text", + "Size" : "Storlek", + "Position" : "Position", + "Extension" : "Tillägg", + "Name is required." : "Namn är obligatoriskt.", + "Auto" : "Auto", "Failed to delete files." : "Misslyckades att radera filer.", "Failed to delete {fileName}." : "Misslyckades att radera {fileName}.", "Failed to favorite files." : "Misslyckades att favorisera filer.", diff --git a/l10n/ta.js b/l10n/ta.js index f84e5f49..388b6dcd 100644 --- a/l10n/ta.js +++ b/l10n/ta.js @@ -1,18 +1,24 @@ OC.L10N.register( "memories", { + "Settings" : "அமைப்புகள்", "Favorites" : "விருப்பங்கள்", "Tags" : "சீட்டுகள்", - "Settings" : "அமைப்புகள்", + "Edit" : "தொகுக்க", "Cancel" : "இரத்து செய்க", "Delete" : "நீக்குக", "Download" : "பதிவிறக்குக", "Favorite" : "விருப்பமான", + "Share" : "பகிர்வு", "Back" : "பின்னுக்கு", "Save" : "சேமிக்க ", "Month" : "மாதம்", "Name" : "பெயர்", "Update" : "இற்றைப்படுத்தல்", - "Refresh" : "மீள் ஏற்றுக" + "Refresh" : "மீள் ஏற்றுக", + "Remove" : "அகற்றுக", + "Continue" : "Continue", + "Value" : "Value", + "Size" : "அளவு" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/ta.json b/l10n/ta.json index ecd2ee79..1c02c5b1 100644 --- a/l10n/ta.json +++ b/l10n/ta.json @@ -1,16 +1,22 @@ { "translations": { + "Settings" : "அமைப்புகள்", "Favorites" : "விருப்பங்கள்", "Tags" : "சீட்டுகள்", - "Settings" : "அமைப்புகள்", + "Edit" : "தொகுக்க", "Cancel" : "இரத்து செய்க", "Delete" : "நீக்குக", "Download" : "பதிவிறக்குக", "Favorite" : "விருப்பமான", + "Share" : "பகிர்வு", "Back" : "பின்னுக்கு", "Save" : "சேமிக்க ", "Month" : "மாதம்", "Name" : "பெயர்", "Update" : "இற்றைப்படுத்தல்", - "Refresh" : "மீள் ஏற்றுக" + "Refresh" : "மீள் ஏற்றுக", + "Remove" : "அகற்றுக", + "Continue" : "Continue", + "Value" : "Value", + "Size" : "அளவு" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/th.js b/l10n/th.js index 11314ae7..ffba94a8 100644 --- a/l10n/th.js +++ b/l10n/th.js @@ -1,18 +1,20 @@ OC.L10N.register( "memories", { + "Settings" : "การตั้งค่า", "Folders" : "แฟ้มเอกสาร", "Favorites" : "รายการโปรด", "Videos" : "วิดีโอ", "Archive" : "เก็บถาวร", "Tags" : "แท็ก", "Maps" : "แผนที่", - "Settings" : "การตั้งค่า", + "Edit" : "แก้ไข", "Cancel" : "ยกเลิก", "Delete" : "ลบ", "Download" : "ดาวน์โหลด", "Favorite" : "รายการโปรด", "View in folder" : "ดูในโฟลเดอร์", + "Share" : "แชร์", "Public link" : "ลิงค์สาธารณะ", "Back" : "ย้อนกลับ", "Save" : "บันทึก", @@ -22,6 +24,14 @@ OC.L10N.register( "Name" : "ชื่อ", "Update" : "อัปเดต", "Refresh" : "รีเฟรช", - "Share folder" : "แชร์โฟลเดอร์" + "Remove" : "ลบออก", + "Share folder" : "แชร์โฟลเดอร์", + "Reset" : "ตั้งค่าใหม่", + "Continue" : "ดำเนินการต่อ", + "Undo" : "เลิกทำ", + "Custom" : "กำหนดเอง", + "Text" : "ข้อความ", + "Size" : "ขนาด", + "Position" : "ตำแหน่ง" }, "nplurals=1; plural=0;"); diff --git a/l10n/th.json b/l10n/th.json index a960786d..ae8954ff 100644 --- a/l10n/th.json +++ b/l10n/th.json @@ -1,16 +1,18 @@ { "translations": { + "Settings" : "การตั้งค่า", "Folders" : "แฟ้มเอกสาร", "Favorites" : "รายการโปรด", "Videos" : "วิดีโอ", "Archive" : "เก็บถาวร", "Tags" : "แท็ก", "Maps" : "แผนที่", - "Settings" : "การตั้งค่า", + "Edit" : "แก้ไข", "Cancel" : "ยกเลิก", "Delete" : "ลบ", "Download" : "ดาวน์โหลด", "Favorite" : "รายการโปรด", "View in folder" : "ดูในโฟลเดอร์", + "Share" : "แชร์", "Public link" : "ลิงค์สาธารณะ", "Back" : "ย้อนกลับ", "Save" : "บันทึก", @@ -20,6 +22,14 @@ "Name" : "ชื่อ", "Update" : "อัปเดต", "Refresh" : "รีเฟรช", - "Share folder" : "แชร์โฟลเดอร์" + "Remove" : "ลบออก", + "Share folder" : "แชร์โฟลเดอร์", + "Reset" : "ตั้งค่าใหม่", + "Continue" : "ดำเนินการต่อ", + "Undo" : "เลิกทำ", + "Custom" : "กำหนดเอง", + "Text" : "ข้อความ", + "Size" : "ขนาด", + "Position" : "ตำแหน่ง" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/l10n/tk.js b/l10n/tk.js index 3276e03e..1c38a94e 100644 --- a/l10n/tk.js +++ b/l10n/tk.js @@ -1,17 +1,20 @@ OC.L10N.register( "memories", { + "Settings" : "Sazlamalar", "Favorites" : "Halanýanlar", "Videos" : "Wideo", "Tags" : "Bellikler", - "Settings" : "Sazlamalar", + "Edit" : "Redaktirläň", "Cancel" : "ýatyrmak", "Delete" : "Pozmak", "Download" : "Göçürip almak", "Favorite" : "Halaýan", + "Share" : "Paýlaş", "Back" : "Yzyna", "Save" : "Saklamak", "Name" : "Ady", - "Refresh" : "Täzelemek" + "Refresh" : "Täzelemek", + "Remove" : "Aýyrmak" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/tk.json b/l10n/tk.json index aa8f1b84..fc3520e2 100644 --- a/l10n/tk.json +++ b/l10n/tk.json @@ -1,15 +1,18 @@ { "translations": { + "Settings" : "Sazlamalar", "Favorites" : "Halanýanlar", "Videos" : "Wideo", "Tags" : "Bellikler", - "Settings" : "Sazlamalar", + "Edit" : "Redaktirläň", "Cancel" : "ýatyrmak", "Delete" : "Pozmak", "Download" : "Göçürip almak", "Favorite" : "Halaýan", + "Share" : "Paýlaş", "Back" : "Yzyna", "Save" : "Saklamak", "Name" : "Ady", - "Refresh" : "Täzelemek" + "Refresh" : "Täzelemek", + "Remove" : "Aýyrmak" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/tr.js b/l10n/tr.js index 654e2483..44772e8a 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -3,7 +3,8 @@ OC.L10N.register( { "Memories" : "Anılar", "Yet another photo management app" : "Başka bir fotoğraf yönetimi uygulaması daha", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Anılar\n\nAnılar Nextcloud için aşağıdaki gibi gelişmiş özellikleri bulunan bir fotoğraf yönetimi uygulamasıdır:\n\n- **📸 Zaman tüneli**: Fotoğrafları ve görüntüleri çekildikleri tarihe göre sıralayabilir, Exif verilerine göre ayrıştırabilirsiniz.\n- **⏪ Geri sarma**: Geçmişte herhangi bir zamana atlayabilir ve anılarınızı yeniden yaşayabilirsiniz.\n- **🤖 Yapay zeka ile etiketleme**: [recognize](https://github.com/nextcloud/recognize) tarafından desteklenen yapay zeka ile fotoğrafları insanlara ve nesnelere göre gruplayabilirsiniz.\n- **🖼️ Albümler**: Fotoğrafları ve görüntülerü birlikte gruplandırmak için albümler oluşturabilirsiniz. Daha sonra bu albümleri başkalarıyla paylaşabilirsiniz.\n- **🫱🏻🫲🏻 Dış paylaşım**: Fotoğrafları ve görüntüleri Nextcloud bulut sunucunuzun dışındaki kişilerle paylaşabilirsiniz.\n- **📱 Mobil desteği**: Web uygulaması üzerinden farklı şekil ve boyuttaki aygıtlarda kullanabilirsiniz.\n- **✏️ Üst verileri düzenleme**: Fotoğraflardaki tarihleri hızlı ve kolay bir şekilde düzenleyebilirsiniz.\n- **📦 Arşiv**: Zaman tünelinizde görmek istemediğiniz fotoğrafları ayrı bir klasörde saklayabilirsiniz.\n- **⚡️ Başarım**: Anılar uygulaması son derece hızlıdır.\n\n## 🌐 Çevrimiçi Deneme\n\n- Anılar uygulamasının nasıl göründüğü ve nasıl hissettirdiği hakkında bir fikir edinmek için [genel deneme](https://memories-demo.radialapps.com/apps/memories/) sitesine göz atın.\n- Deneme sitesi salt okunurdur ve yavaş olabilir ([Oracle Cloud üzerinde](https://www.oracle.com/cloud/free/) ücretsiz VM paketini kullanır).\n- Fotoğraf hakkında emeği geçenler için [Unsplash](https://unsplash.com/) adresine bakabilirsiniz (bireysel eeği geçenler için her klasöre bakın).\n\n## 🚀 Kurulum\n\n1. Uygulamayı Nextcloud uygulama mağazasından yükleyin.\n1. Önerilen [yapılandırma adımlarını](https://github.com/pulsejet/memories/wiki/Extra-Configuration) gerçekleştirin.\n1. var olan fotoğrafların üst veri dizinlerini oluşturmak için `php ./occ memory:index` komutunu yürütün.\n1. Nextcloud üzerinde 📷 Anılar uygulamasını açın ve fotoğraflarınızın bulunduğu klasörü ayarlayın.", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Anılar\n\nAnılar, Nextcloud için \"pilleriyle birlikte\" gelen ve aşağıdaki gibi gelişmiş özellikleri bulunan bir fotoğraf yönetimi uygulamasıdır:\n\n- **📸 Zaman tüneli**: Fotoğrafları ve görüntüleri çekildikleri tarihe göre sıralayabilir, Exif verilerine göre ayrıştırabilirsiniz.\n- **⏪ Geri sarma**: Geçmişte herhangi bir zamana atlayabilir ve anılarınızı yeniden yaşayabilirsiniz.\n- **🤖 Yapay zeka ile etiketleme**: [recognize](https://github.com/nextcloud/recognize) tarafından desteklenen yapay zeka ile fotoğrafları insanlara ve nesnelere göre gruplayabilirsiniz.\n- **🖼️ Albümler**: Fotoğrafları ve görüntüleri birlikte gruplandırmak için albümler oluşturabilirsiniz. Daha sonra bu albümleri başkalarıyla paylaşabilirsiniz.\n- **🫱🏻🫲🏻 Dış paylaşım**: Fotoğrafları ve görüntüleri Nextcloud bulut sunucunuzun dışındaki kişilerle paylaşabilirsiniz.\n- **📱 Mobil desteği**: Web uygulaması üzerinden farklı şekil ve boyuttaki aygıtlarda kullanabilirsiniz.\n- **✏️ Üst verileri düzenleme**: Fotoğraflardaki tarihleri hızlı ve kolay bir şekilde düzenleyebilirsiniz.\n- **📦 Arşiv**: Zaman tünelinizde görmek istemediğiniz fotoğrafları ayrı bir klasörde saklayabilirsiniz.\n- **📹 Görüntü dönüştürme**: Anılar görüntüleri dönüştürebilir ve en iyi başarım için HLS kullanır.\n- **⚡️ Başarım**: Anılar uygulaması son derece hızlıdır.\n\n## 🌐 Çevrimiçi Deneme\n\n- Anılar uygulamasının nasıl göründüğü ve nasıl hissettirdiği hakkında bir fikir edinmek için [genel deneme](https://memories-demo.radialapps.com/apps/memories/) sitesine göz atın.\n- Deneme sitesi salt okunurdur ve yavaş olabilir ([Oracle Cloud üzerinde](https://www.oracle.com/cloud/free/) ücretsiz VM paketini kullanır).\n- Fotoğraf hakkında emeği geçenler için [Unsplash](https://unsplash.com/) adresine bakabilirsiniz (bireysel eeği geçenler için her klasöre bakın).\n\n## 🚀 Kurulum\n\n1. Uygulamayı Nextcloud uygulama mağazasından yükleyin.\n1. Önerilen [yapılandırma adımlarını](https://github.com/pulsejet/memories/wiki/Extra-Configuration) gerçekleştirin.\n1. var olan fotoğrafların üst veri dizinlerini oluşturmak için `php ./occ memory:index` komutunu yürütün.\n1. Nextcloud üzerinde 📷 Anılar uygulamasını açın ve fotoğraflarınızın bulunduğu klasörü ayarlayın.", + "Settings" : "Ayarlar", "Timeline" : "Zaman tüneli", "Folders" : "Klasörler", "Favorites" : "Sık kullanılanlar", @@ -14,7 +15,7 @@ OC.L10N.register( "On this day" : "Bugün", "Tags" : "Etiketler", "Maps" : "Haritalar", - "Settings" : "Ayarlar", + "EXIF" : "EXIF", "A better photos experience awaits you" : "Daha iyi bir fotoğraf deneyimi sizi bekliyor", "Choose the root folder of your timeline to begin" : "Zaman tünelinizin başlangıç kök klasörünü seçin", "If you just installed Memories, run:" : "Anılar uygulamasını yeni kurduysanız şunu çalıştırın:", @@ -25,6 +26,14 @@ OC.L10N.register( "Choose the root of your timeline" : "Zaman tünelinizin kök klasörünü seçin", "The selected folder does not seem to be valid. Try again." : "Seçilmiş klasör geçersiz gibi görünüyor. Yeniden deneyin.", "Found {total} photos in {path}" : "{path} yolunda {total} fotoğraf bulundu", + "Failed to get Exif data. Metadata may be lost!" : "EXIF verileri alınamadı. Üst veriler kaybolmuş olabilir!", + "No Exif data found! Continue?" : "Herhangi bir EXIF verisi bulunamadı. İlerlensin mi?", + "Image saved successfully" : "Görsel kaydedildi", + "Error saving image" : "Görsel kaydedilirken sorun çıktı", + "Unsaved changes" : "Kaydedilmemiş değişiklikler", + "Drop changes" : "Değişiklikleri yok say", + "Edit" : "Düzenle", + "Loading …" : "Yükleniyor…", "Cancel" : "İptal", "Delete" : "Sil", "Remove from album" : "Albümden kaldır", @@ -45,10 +54,14 @@ OC.L10N.register( "Folders Path" : "Klasörlerin yolu", "Show hidden folders" : "Gizli klasörleri görüntüle", "Square grid mode" : "Kare tablo kipi", + "Choose Timeline Paths" : "Zaman tüneli yollarını seçin", "Choose the root for the folders view" : "Klasörler görünümünün kök klasörünü seçin", "Your Timeline" : "Zaman tüneliniz", "Failed to load some photos" : "Bazı fotoğraflar yüklenemedi", + "Share" : "Paylaş", "Sidebar" : "Yan çubuk", + "Video sharing not supported yet" : "Görüntü paylaşımı henüz desteklenmiyor", + "Cannot share this type of data" : "Bu türdeki verileri paylaşamazsınız", "Processing … {n}/{m}" : "İşleniyor… {n}/{m}", "{n} photos added to album" : "{n} fotoğraf albüme eklendi", "Search for collaborators" : "Katılımcı arama", @@ -105,7 +118,6 @@ OC.L10N.register( "Rename person" : "Kişiyi yeniden adlandır", "Update" : "Güncelle", "Failed to rename {oldName} to {name}." : "{oldName} adı {name} olarak değiştirilemedi.", - "Loading …" : "Yükleniyor…", "Merge {name} with person" : "{name} kişisini kişi ile birleştir", "Are you sure you want to merge {name} with {newName}?" : "{name} kişisini {newName} kişisi ile birleştirmek istediğinize emin misiniz?", "Too many failures, aborting" : "Çok sayıda sorun çıktı, vazgeçiliyor", @@ -118,6 +130,9 @@ OC.L10N.register( "Use the sidebar to share this folder." : "Bu klasörü paylaşmak için yan çubuğu kullanın.", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Herkese açık bir bağlantı paylaşımı oluşturduktan sonra yenile üzerine tıklayın. Anılar için ilgili bağlantı aşağıda görüntülenir.", "Refresh" : "Yenlle", + "Remove" : "Kaldır", + "Add Path" : "Yol ekle", + "Add a root to your timeline" : "Zaman tünelinize bir kök klasör ekleyin", "Share album" : "Albümü paylaş", "Delete album" : "Albümü sil", "Merge with different person" : "Başka bir kişi ile birleştir", @@ -125,6 +140,92 @@ OC.L10N.register( "Share folder" : "Klasör paylaş", "Move left" : "Sola taşı", "Move right" : "Sağa taşı", + "Save as" : "Farklı kaydet", + "Reset" : "Sıfırla", + "All changes will be lost." : "Tüm değişiklikler kaybolacak.", + "Are you sure you want to continue?" : "İşlemi sürdürmek istediğinize emin misiniz?", + "Continue" : "Sürdür", + "Undo" : "Geri al", + "Redo" : "Yinele", + "Show original image" : "Özgün görseli görüntüle", + "Zoom in" : "Yakınlaştır", + "Zoom out" : "Uzaklaştır", + "Toggle zoom menu" : "Yakınlaştırma menüsünü aç/kapat", + "Adjust" : "Ayarla", + "Fine-tune" : "İnce ayar", + "Filters" : "Süzgeçler", + "Watermark" : "Filigran", + "Draw" : "Çizim", + "Resize" : "Yeniden boyutlandır", + "Invalid image." : "Görsel geçersiz.", + "Error while uploading the image." : "Görsel yüklenirken sorun çıktı.", + "are not images" : "görseller değil", + "is not an image" : "bir görsel değil", + "to be uploaded" : "yüklenecek", + "Crop" : "Kırp", + "Original" : "Özgün", + "Custom" : "Özel", + "Square" : "Kare", + "Landscape" : "Yatay", + "Portrait" : "Dikey", + "Ellipse" : "Elips", + "Classic TV" : "Klasik TV", + "CinemaScope" : "Sinemaskop", + "Arrow" : "Ok", + "Blur" : "Bulanıklaştır", + "Brightness" : "Parlaklık", + "Contrast" : "Karşıtlık", + "Un-flip X" : "X ekseninde döndürmeyi geri al", + "Flip X" : "X ekseninde döndür", + "Un-flip Y" : "Y ekseninde döndürmeyi geri al", + "Flip Y" : "Y ekseninde döndür", + "HSV" : "HSV", + "Hue" : "Renk tonu", + "Saturation" : "Doygunluk", + "Value" : "Değer", + "Image" : "Görsel", + "Importing …" : "İçe aktarılıyor…", + "+ Add image" : "+ Görsel ekle", + "Line" : "Çizgi", + "Pen" : "Kalem", + "Polygon" : "Çokgen", + "Sides" : "Yanlar", + "Rectangle" : "Dikdörtgen", + "Corner Radius" : "Köşe yarıçapı", + "Width in pixels" : "Piksel cinsinden genişlik", + "Height in pixels" : "Piksel cinsinden yüksekilk", + "Toggle ratio lock" : "En boy oranı kilidini aç/kapat", + "Reset to original image size" : "Özgün görsel boyutuna sıfırla", + "Rotate" : "Çevir", + "Text" : "Metin", + "Text spacing" : "Metin aralığı", + "Text alignment" : "Metin hizalaması", + "Font family" : "Yazı tipi ailesi", + "Size" : "Boyut", + "Letter spacing" : "Harf aralığı", + "Line height" : "Satır yüksekliği", + "Warmth" : "Sıcaklık", + "+ Add watermark" : "+ Filigran ekle", + "Choose watermark type" : "Filigran türünü seçin", + "Upload watermark" : "Filigran yükle", + "Add as text" : "Metin olarak ekle", + "Padding" : "Kenar payı", + "Shadow" : "Gölge", + "Horizontal" : "Yatay", + "Vertical" : "Dikey", + "Opacity" : "Matlık", + "Position" : "Konum", + "Stroke" : "Kalınlık", + "Save image as" : "Görseli farklı kaydet", + "Extension" : "Uzantı", + "Name is required." : "Adın yazılması zorunludur.", + "Quality" : "Kalite", + "Saved image size (width x height)" : "Kaydedilmiş görsel boyutu (genişlik x yükseklik)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Seçilmiş kırpma alanı uygulanan yeniden boyutlandırma alanından küçük. Bu durum görsel kalitesinin düşmesine neden olabilir.", + "Actual size (100%)" : "Gerçek boyut (%100)", + "Fit size" : "Boyutu sığdır", + "Transcoding failed." : "Kod dönüştürülemedi.", + "Auto" : "Otomatik", "Shared Folder" : "Paylaşılmış klasör", "Failed to create {albumName}." : "{albumName} albümü oluşturulamadı.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} albümünün adı {newAlbumName} olarak değiştirilemedi.", diff --git a/l10n/tr.json b/l10n/tr.json index 69fc8103..55d1540e 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -1,7 +1,8 @@ { "translations": { "Memories" : "Anılar", "Yet another photo management app" : "Başka bir fotoğraf yönetimi uygulaması daha", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Anılar\n\nAnılar Nextcloud için aşağıdaki gibi gelişmiş özellikleri bulunan bir fotoğraf yönetimi uygulamasıdır:\n\n- **📸 Zaman tüneli**: Fotoğrafları ve görüntüleri çekildikleri tarihe göre sıralayabilir, Exif verilerine göre ayrıştırabilirsiniz.\n- **⏪ Geri sarma**: Geçmişte herhangi bir zamana atlayabilir ve anılarınızı yeniden yaşayabilirsiniz.\n- **🤖 Yapay zeka ile etiketleme**: [recognize](https://github.com/nextcloud/recognize) tarafından desteklenen yapay zeka ile fotoğrafları insanlara ve nesnelere göre gruplayabilirsiniz.\n- **🖼️ Albümler**: Fotoğrafları ve görüntülerü birlikte gruplandırmak için albümler oluşturabilirsiniz. Daha sonra bu albümleri başkalarıyla paylaşabilirsiniz.\n- **🫱🏻🫲🏻 Dış paylaşım**: Fotoğrafları ve görüntüleri Nextcloud bulut sunucunuzun dışındaki kişilerle paylaşabilirsiniz.\n- **📱 Mobil desteği**: Web uygulaması üzerinden farklı şekil ve boyuttaki aygıtlarda kullanabilirsiniz.\n- **✏️ Üst verileri düzenleme**: Fotoğraflardaki tarihleri hızlı ve kolay bir şekilde düzenleyebilirsiniz.\n- **📦 Arşiv**: Zaman tünelinizde görmek istemediğiniz fotoğrafları ayrı bir klasörde saklayabilirsiniz.\n- **⚡️ Başarım**: Anılar uygulaması son derece hızlıdır.\n\n## 🌐 Çevrimiçi Deneme\n\n- Anılar uygulamasının nasıl göründüğü ve nasıl hissettirdiği hakkında bir fikir edinmek için [genel deneme](https://memories-demo.radialapps.com/apps/memories/) sitesine göz atın.\n- Deneme sitesi salt okunurdur ve yavaş olabilir ([Oracle Cloud üzerinde](https://www.oracle.com/cloud/free/) ücretsiz VM paketini kullanır).\n- Fotoğraf hakkında emeği geçenler için [Unsplash](https://unsplash.com/) adresine bakabilirsiniz (bireysel eeği geçenler için her klasöre bakın).\n\n## 🚀 Kurulum\n\n1. Uygulamayı Nextcloud uygulama mağazasından yükleyin.\n1. Önerilen [yapılandırma adımlarını](https://github.com/pulsejet/memories/wiki/Extra-Configuration) gerçekleştirin.\n1. var olan fotoğrafların üst veri dizinlerini oluşturmak için `php ./occ memory:index` komutunu yürütün.\n1. Nextcloud üzerinde 📷 Anılar uygulamasını açın ve fotoğraflarınızın bulunduğu klasörü ayarlayın.", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Anılar\n\nAnılar, Nextcloud için \"pilleriyle birlikte\" gelen ve aşağıdaki gibi gelişmiş özellikleri bulunan bir fotoğraf yönetimi uygulamasıdır:\n\n- **📸 Zaman tüneli**: Fotoğrafları ve görüntüleri çekildikleri tarihe göre sıralayabilir, Exif verilerine göre ayrıştırabilirsiniz.\n- **⏪ Geri sarma**: Geçmişte herhangi bir zamana atlayabilir ve anılarınızı yeniden yaşayabilirsiniz.\n- **🤖 Yapay zeka ile etiketleme**: [recognize](https://github.com/nextcloud/recognize) tarafından desteklenen yapay zeka ile fotoğrafları insanlara ve nesnelere göre gruplayabilirsiniz.\n- **🖼️ Albümler**: Fotoğrafları ve görüntüleri birlikte gruplandırmak için albümler oluşturabilirsiniz. Daha sonra bu albümleri başkalarıyla paylaşabilirsiniz.\n- **🫱🏻🫲🏻 Dış paylaşım**: Fotoğrafları ve görüntüleri Nextcloud bulut sunucunuzun dışındaki kişilerle paylaşabilirsiniz.\n- **📱 Mobil desteği**: Web uygulaması üzerinden farklı şekil ve boyuttaki aygıtlarda kullanabilirsiniz.\n- **✏️ Üst verileri düzenleme**: Fotoğraflardaki tarihleri hızlı ve kolay bir şekilde düzenleyebilirsiniz.\n- **📦 Arşiv**: Zaman tünelinizde görmek istemediğiniz fotoğrafları ayrı bir klasörde saklayabilirsiniz.\n- **📹 Görüntü dönüştürme**: Anılar görüntüleri dönüştürebilir ve en iyi başarım için HLS kullanır.\n- **⚡️ Başarım**: Anılar uygulaması son derece hızlıdır.\n\n## 🌐 Çevrimiçi Deneme\n\n- Anılar uygulamasının nasıl göründüğü ve nasıl hissettirdiği hakkında bir fikir edinmek için [genel deneme](https://memories-demo.radialapps.com/apps/memories/) sitesine göz atın.\n- Deneme sitesi salt okunurdur ve yavaş olabilir ([Oracle Cloud üzerinde](https://www.oracle.com/cloud/free/) ücretsiz VM paketini kullanır).\n- Fotoğraf hakkında emeği geçenler için [Unsplash](https://unsplash.com/) adresine bakabilirsiniz (bireysel eeği geçenler için her klasöre bakın).\n\n## 🚀 Kurulum\n\n1. Uygulamayı Nextcloud uygulama mağazasından yükleyin.\n1. Önerilen [yapılandırma adımlarını](https://github.com/pulsejet/memories/wiki/Extra-Configuration) gerçekleştirin.\n1. var olan fotoğrafların üst veri dizinlerini oluşturmak için `php ./occ memory:index` komutunu yürütün.\n1. Nextcloud üzerinde 📷 Anılar uygulamasını açın ve fotoğraflarınızın bulunduğu klasörü ayarlayın.", + "Settings" : "Ayarlar", "Timeline" : "Zaman tüneli", "Folders" : "Klasörler", "Favorites" : "Sık kullanılanlar", @@ -12,7 +13,7 @@ "On this day" : "Bugün", "Tags" : "Etiketler", "Maps" : "Haritalar", - "Settings" : "Ayarlar", + "EXIF" : "EXIF", "A better photos experience awaits you" : "Daha iyi bir fotoğraf deneyimi sizi bekliyor", "Choose the root folder of your timeline to begin" : "Zaman tünelinizin başlangıç kök klasörünü seçin", "If you just installed Memories, run:" : "Anılar uygulamasını yeni kurduysanız şunu çalıştırın:", @@ -23,6 +24,14 @@ "Choose the root of your timeline" : "Zaman tünelinizin kök klasörünü seçin", "The selected folder does not seem to be valid. Try again." : "Seçilmiş klasör geçersiz gibi görünüyor. Yeniden deneyin.", "Found {total} photos in {path}" : "{path} yolunda {total} fotoğraf bulundu", + "Failed to get Exif data. Metadata may be lost!" : "EXIF verileri alınamadı. Üst veriler kaybolmuş olabilir!", + "No Exif data found! Continue?" : "Herhangi bir EXIF verisi bulunamadı. İlerlensin mi?", + "Image saved successfully" : "Görsel kaydedildi", + "Error saving image" : "Görsel kaydedilirken sorun çıktı", + "Unsaved changes" : "Kaydedilmemiş değişiklikler", + "Drop changes" : "Değişiklikleri yok say", + "Edit" : "Düzenle", + "Loading …" : "Yükleniyor…", "Cancel" : "İptal", "Delete" : "Sil", "Remove from album" : "Albümden kaldır", @@ -43,10 +52,14 @@ "Folders Path" : "Klasörlerin yolu", "Show hidden folders" : "Gizli klasörleri görüntüle", "Square grid mode" : "Kare tablo kipi", + "Choose Timeline Paths" : "Zaman tüneli yollarını seçin", "Choose the root for the folders view" : "Klasörler görünümünün kök klasörünü seçin", "Your Timeline" : "Zaman tüneliniz", "Failed to load some photos" : "Bazı fotoğraflar yüklenemedi", + "Share" : "Paylaş", "Sidebar" : "Yan çubuk", + "Video sharing not supported yet" : "Görüntü paylaşımı henüz desteklenmiyor", + "Cannot share this type of data" : "Bu türdeki verileri paylaşamazsınız", "Processing … {n}/{m}" : "İşleniyor… {n}/{m}", "{n} photos added to album" : "{n} fotoğraf albüme eklendi", "Search for collaborators" : "Katılımcı arama", @@ -103,7 +116,6 @@ "Rename person" : "Kişiyi yeniden adlandır", "Update" : "Güncelle", "Failed to rename {oldName} to {name}." : "{oldName} adı {name} olarak değiştirilemedi.", - "Loading …" : "Yükleniyor…", "Merge {name} with person" : "{name} kişisini kişi ile birleştir", "Are you sure you want to merge {name} with {newName}?" : "{name} kişisini {newName} kişisi ile birleştirmek istediğinize emin misiniz?", "Too many failures, aborting" : "Çok sayıda sorun çıktı, vazgeçiliyor", @@ -116,6 +128,9 @@ "Use the sidebar to share this folder." : "Bu klasörü paylaşmak için yan çubuğu kullanın.", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "Herkese açık bir bağlantı paylaşımı oluşturduktan sonra yenile üzerine tıklayın. Anılar için ilgili bağlantı aşağıda görüntülenir.", "Refresh" : "Yenlle", + "Remove" : "Kaldır", + "Add Path" : "Yol ekle", + "Add a root to your timeline" : "Zaman tünelinize bir kök klasör ekleyin", "Share album" : "Albümü paylaş", "Delete album" : "Albümü sil", "Merge with different person" : "Başka bir kişi ile birleştir", @@ -123,6 +138,92 @@ "Share folder" : "Klasör paylaş", "Move left" : "Sola taşı", "Move right" : "Sağa taşı", + "Save as" : "Farklı kaydet", + "Reset" : "Sıfırla", + "All changes will be lost." : "Tüm değişiklikler kaybolacak.", + "Are you sure you want to continue?" : "İşlemi sürdürmek istediğinize emin misiniz?", + "Continue" : "Sürdür", + "Undo" : "Geri al", + "Redo" : "Yinele", + "Show original image" : "Özgün görseli görüntüle", + "Zoom in" : "Yakınlaştır", + "Zoom out" : "Uzaklaştır", + "Toggle zoom menu" : "Yakınlaştırma menüsünü aç/kapat", + "Adjust" : "Ayarla", + "Fine-tune" : "İnce ayar", + "Filters" : "Süzgeçler", + "Watermark" : "Filigran", + "Draw" : "Çizim", + "Resize" : "Yeniden boyutlandır", + "Invalid image." : "Görsel geçersiz.", + "Error while uploading the image." : "Görsel yüklenirken sorun çıktı.", + "are not images" : "görseller değil", + "is not an image" : "bir görsel değil", + "to be uploaded" : "yüklenecek", + "Crop" : "Kırp", + "Original" : "Özgün", + "Custom" : "Özel", + "Square" : "Kare", + "Landscape" : "Yatay", + "Portrait" : "Dikey", + "Ellipse" : "Elips", + "Classic TV" : "Klasik TV", + "CinemaScope" : "Sinemaskop", + "Arrow" : "Ok", + "Blur" : "Bulanıklaştır", + "Brightness" : "Parlaklık", + "Contrast" : "Karşıtlık", + "Un-flip X" : "X ekseninde döndürmeyi geri al", + "Flip X" : "X ekseninde döndür", + "Un-flip Y" : "Y ekseninde döndürmeyi geri al", + "Flip Y" : "Y ekseninde döndür", + "HSV" : "HSV", + "Hue" : "Renk tonu", + "Saturation" : "Doygunluk", + "Value" : "Değer", + "Image" : "Görsel", + "Importing …" : "İçe aktarılıyor…", + "+ Add image" : "+ Görsel ekle", + "Line" : "Çizgi", + "Pen" : "Kalem", + "Polygon" : "Çokgen", + "Sides" : "Yanlar", + "Rectangle" : "Dikdörtgen", + "Corner Radius" : "Köşe yarıçapı", + "Width in pixels" : "Piksel cinsinden genişlik", + "Height in pixels" : "Piksel cinsinden yüksekilk", + "Toggle ratio lock" : "En boy oranı kilidini aç/kapat", + "Reset to original image size" : "Özgün görsel boyutuna sıfırla", + "Rotate" : "Çevir", + "Text" : "Metin", + "Text spacing" : "Metin aralığı", + "Text alignment" : "Metin hizalaması", + "Font family" : "Yazı tipi ailesi", + "Size" : "Boyut", + "Letter spacing" : "Harf aralığı", + "Line height" : "Satır yüksekliği", + "Warmth" : "Sıcaklık", + "+ Add watermark" : "+ Filigran ekle", + "Choose watermark type" : "Filigran türünü seçin", + "Upload watermark" : "Filigran yükle", + "Add as text" : "Metin olarak ekle", + "Padding" : "Kenar payı", + "Shadow" : "Gölge", + "Horizontal" : "Yatay", + "Vertical" : "Dikey", + "Opacity" : "Matlık", + "Position" : "Konum", + "Stroke" : "Kalınlık", + "Save image as" : "Görseli farklı kaydet", + "Extension" : "Uzantı", + "Name is required." : "Adın yazılması zorunludur.", + "Quality" : "Kalite", + "Saved image size (width x height)" : "Kaydedilmiş görsel boyutu (genişlik x yükseklik)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Seçilmiş kırpma alanı uygulanan yeniden boyutlandırma alanından küçük. Bu durum görsel kalitesinin düşmesine neden olabilir.", + "Actual size (100%)" : "Gerçek boyut (%100)", + "Fit size" : "Boyutu sığdır", + "Transcoding failed." : "Kod dönüştürülemedi.", + "Auto" : "Otomatik", "Shared Folder" : "Paylaşılmış klasör", "Failed to create {albumName}." : "{albumName} albümü oluşturulamadı.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "{currentAlbumName} albümünün adı {newAlbumName} olarak değiştirilemedi.", diff --git a/l10n/ug.js b/l10n/ug.js index acb2b2fe..14fe96b6 100644 --- a/l10n/ug.js +++ b/l10n/ug.js @@ -1,18 +1,22 @@ OC.L10N.register( "memories", { + "Settings" : "تەڭشەكلەر", "Favorites" : "يىغقۇچ", "Tags" : "بەلگەلەر", - "Settings" : "تەڭشەكلەر", + "Edit" : "تەھرىر", "Cancel" : "ۋاز كەچ", "Delete" : "ئۆچۈر", "Download" : "چۈشۈر", "Favorite" : "يىغقۇچ", + "Share" : "ھەمبەھىر", "Save" : "ساقلا", "Month" : "ئاي", "Time" : "ۋاقىت", "Name" : "ئاتى", "Update" : "يېڭىلا", - "Refresh" : "يېڭىلا" + "Refresh" : "يېڭىلا", + "Remove" : "چىقىرىۋەت", + "Size" : "چوڭلۇقى" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/ug.json b/l10n/ug.json index 4d64534b..641c9311 100644 --- a/l10n/ug.json +++ b/l10n/ug.json @@ -1,16 +1,20 @@ { "translations": { + "Settings" : "تەڭشەكلەر", "Favorites" : "يىغقۇچ", "Tags" : "بەلگەلەر", - "Settings" : "تەڭشەكلەر", + "Edit" : "تەھرىر", "Cancel" : "ۋاز كەچ", "Delete" : "ئۆچۈر", "Download" : "چۈشۈر", "Favorite" : "يىغقۇچ", + "Share" : "ھەمبەھىر", "Save" : "ساقلا", "Month" : "ئاي", "Time" : "ۋاقىت", "Name" : "ئاتى", "Update" : "يېڭىلا", - "Refresh" : "يېڭىلا" + "Refresh" : "يېڭىلا", + "Remove" : "چىقىرىۋەت", + "Size" : "چوڭلۇقى" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/uk.js b/l10n/uk.js index 7e958ff3..7400609f 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -3,7 +3,7 @@ OC.L10N.register( { "Memories" : "Спогади", "Yet another photo management app" : "Іще один застосунок для роботи зі світлинами", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Memories\n\nMemories - це додаток для управління фотографіями для Nextcloud з розширеними можливостями:\n\n - **📸 Timeline**: Сортування фотографій та відео за датою зйомки на основі даних Exif.\n- **⏪ Перемотування назад**: Миттєво переходьте в будь-який час минулого та переживайте свої спогади.\n- **🤖Тегування AI**: Групування фотографій за людьми та об'єктами з використанням AI на основі функції [розпізнавання](https://github.com/nextcloud/recognize).\n- **🖼️ Альбоми**: Створюйте альбоми, щоб групувати фотографії та відео разом. Потім діліться цими альбомами з іншими.\n - **🫱🏻🫲🏻Зовнішній обмін**: Діліться фотографіями та відео з людьми за межами вашого екземпляра Nextcloud.\n- **📱 Мобільна підтримка**: Працює на пристроях будь-якої форми та розміру через веб-додаток.\n- **✏️ Редагування метаданих**: Редагуйте дати на фотографіях швидко та легко.\n- **📦 Архівувати**: Зберігайте фотографії, які ви не хочете бачити на часовій шкалі, в окремій папці.\n- **⚡️ Продуктивність**: Memories надзвичайно швидка.\n\n## 🌐 Онлайн демонстрація\n\n- Щоб отримати уявлення про те, як виглядає і відчувається пам'ять, перегляньте [загальнодоступну демонстраційну версію] (https://memories-demo.radialapps.com/apps/memories/).\n- Демонстрація доступна лише для читання і може працювати повільно (безкоштовна віртуальна машина з [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Титри фотографій можна знайти в [Unsplash] (https://unsplash.com/) (щодо окремих титрів див. кожну папку).\n\n## 🚀 Встановлення\n\n1. Встановіть додаток з магазину додатків Nextcloud.\n2. Виконайте рекомендовані [кроки налаштування] (https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n3. Запустіть `php ./occ memories:index` для створення індексів метаданих для наявних фотографій.\n4. Відкрийте додаток 📷 Memories у Nextcloud та встановіть каталог, що містить ваші фотографії.", + "Settings" : "Налаштування", "Timeline" : "Дії", "Folders" : "Каталоги", "Favorites" : "Із зірочкою", @@ -14,9 +14,13 @@ OC.L10N.register( "On this day" : "Цього дня", "Tags" : "Мітки", "Maps" : "Мапи", - "Settings" : "Налаштування", "A better photos experience awaits you" : "На вас чекає краща якість фотографій", "Choose the root folder of your timeline to begin" : "Виберіть кореневу папку вашої шкали часу для початку ", + "Error saving image" : "Помилка збереження зображення", + "Unsaved changes" : "Незбережені зміни", + "Drop changes" : "Відкинути зміни", + "Edit" : "Редагувати", + "Loading …" : "Завантаження …", "Cancel" : "Скасувати", "Delete" : "Вилучити", "Download" : "Завантажити", @@ -29,6 +33,7 @@ OC.L10N.register( "Timeline Path" : "Шлях шкали часу", "Show hidden folders" : "Показати приховані каталоги", "Failed to load some photos" : "Не вдалося завантажити деякі фотографії", + "Share" : "Спільний доступ", "Sidebar" : "Бокове меню", "Search for collaborators" : "Пошук співавторів", "Search people or groups" : "Пошук людей або груп", @@ -68,11 +73,96 @@ OC.L10N.register( "Name" : "Назва", "Rename person" : "Перейменувати особу", "Update" : "Оновлення", - "Loading …" : "Завантаження …", "Refresh" : "Оновити", + "Remove" : "Вилучити", "Delete album" : "Видалити альбом", "Merge with different person" : "Злитися з іншою людиною", "Share folder" : "Спільний доступ для каталогу", + "Save as" : "Зберегти як", + "Reset" : "Скидання", + "All changes will be lost." : "Усі зміни буде втрачено.", + "Are you sure you want to continue?" : "Ви впевнені, що бажаєте продовжити?", + "Continue" : "Продовжити", + "Undo" : "Скасувати", + "Redo" : "Повторити", + "Show original image" : "Показати вихідне зображення", + "Zoom in" : "Наблизити", + "Zoom out" : "Зменшення", + "Toggle zoom menu" : "Перемкнути меню масштабування", + "Adjust" : "Налаштувати", + "Fine-tune" : "Тонка настройка", + "Filters" : "Фільтри", + "Watermark" : "Водяний знак", + "Draw" : "Малювати", + "Resize" : "Змінити розмір", + "Invalid image." : "Недійсне зображення.", + "Error while uploading the image." : "Помилка під час завантаження зображення.", + "are not images" : "не є зображеннями", + "is not an image" : "не є зображенням", + "to be uploaded" : "для завантаження", + "Crop" : "Урожай", + "Original" : "Оригінал", + "Custom" : "Користувацьке", + "Square" : "Майдан", + "Landscape" : "Пейзаж", + "Portrait" : "Портрет", + "Ellipse" : "Еліпс", + "Classic TV" : "Класичний TV", + "CinemaScope" : "CinemaScope", + "Arrow" : "Стрілка", + "Blur" : "Розмиття", + "Brightness" : "Яскравість", + "Contrast" : "Контраст", + "Un-flip X" : "Розгорнути по X", + "Flip X" : "Перевернути X", + "Un-flip Y" : "Розгорнути по Y", + "Flip Y" : "Перевернути Y", + "HSV" : "HSV", + "Hue" : "Відтінок", + "Saturation" : "Насиченість", + "Value" : "Значення", + "Image" : "Зображення", + "Importing …" : "Імпорт…", + "+ Add image" : "+ Додати зображення", + "Line" : "лінія", + "Pen" : "Перо", + "Polygon" : "Багатокутник", + "Sides" : "Сторони", + "Rectangle" : "Прямокутник", + "Corner Radius" : "Радіус кута", + "Width in pixels" : "Ширина в пікселях", + "Height in pixels" : "Висота в пікселях", + "Toggle ratio lock" : "Перемкнути блокування співвідношення", + "Reset to original image size" : "Відновити початковий розмір зображення", + "Rotate" : "Обертати", + "Text" : "Текст", + "Text spacing" : "Інтервал між текстом", + "Text alignment" : "Вирівнювання тексту", + "Font family" : "Сімейство шрифтів", + "Size" : "Розмір", + "Letter spacing" : "Інтервал між літерами", + "Line height" : "Висота лінії", + "Warmth" : "Тепло", + "+ Add watermark" : "+ Додати водяний знак", + "Choose watermark type" : "Виберіть тип водяного знака", + "Upload watermark" : "Завантажити водяний знак", + "Add as text" : "Додати як текст", + "Padding" : "Відступи", + "Shadow" : "Тінь", + "Horizontal" : "Горизонтальний", + "Vertical" : "Вертикальний", + "Opacity" : "Непрозорість", + "Position" : "Позиція", + "Stroke" : "Інсульт", + "Save image as" : "Зберегти зображення як", + "Extension" : "Розширення", + "Name is required." : "Ім'я є обов'язковим.", + "Quality" : "Якість", + "Saved image size (width x height)" : "Розмір збереженого зображення (ширина x висота)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Зауважте, що вибрана область кадрування нижча за застосований розмір, що може спричинити погіршення якості", + "Actual size (100%)" : "Фактичний розмір (100%)", + "Fit size" : "Підходить за розміром", + "Auto" : "Автоматично", "Failed to create {albumName}." : "Не вдалося створити {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Не вдалося перейменувати {currentAlbumName} на {newAlbumName}.", "Failed to delete files." : "Не вдалося видалити файли.", diff --git a/l10n/uk.json b/l10n/uk.json index 46eb0b74..71910315 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -1,7 +1,7 @@ { "translations": { "Memories" : "Спогади", "Yet another photo management app" : "Іще один застосунок для роботи зі світлинами", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Memories\n\nMemories - це додаток для управління фотографіями для Nextcloud з розширеними можливостями:\n\n - **📸 Timeline**: Сортування фотографій та відео за датою зйомки на основі даних Exif.\n- **⏪ Перемотування назад**: Миттєво переходьте в будь-який час минулого та переживайте свої спогади.\n- **🤖Тегування AI**: Групування фотографій за людьми та об'єктами з використанням AI на основі функції [розпізнавання](https://github.com/nextcloud/recognize).\n- **🖼️ Альбоми**: Створюйте альбоми, щоб групувати фотографії та відео разом. Потім діліться цими альбомами з іншими.\n - **🫱🏻🫲🏻Зовнішній обмін**: Діліться фотографіями та відео з людьми за межами вашого екземпляра Nextcloud.\n- **📱 Мобільна підтримка**: Працює на пристроях будь-якої форми та розміру через веб-додаток.\n- **✏️ Редагування метаданих**: Редагуйте дати на фотографіях швидко та легко.\n- **📦 Архівувати**: Зберігайте фотографії, які ви не хочете бачити на часовій шкалі, в окремій папці.\n- **⚡️ Продуктивність**: Memories надзвичайно швидка.\n\n## 🌐 Онлайн демонстрація\n\n- Щоб отримати уявлення про те, як виглядає і відчувається пам'ять, перегляньте [загальнодоступну демонстраційну версію] (https://memories-demo.radialapps.com/apps/memories/).\n- Демонстрація доступна лише для читання і може працювати повільно (безкоштовна віртуальна машина з [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Титри фотографій можна знайти в [Unsplash] (https://unsplash.com/) (щодо окремих титрів див. кожну папку).\n\n## 🚀 Встановлення\n\n1. Встановіть додаток з магазину додатків Nextcloud.\n2. Виконайте рекомендовані [кроки налаштування] (https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n3. Запустіть `php ./occ memories:index` для створення індексів метаданих для наявних фотографій.\n4. Відкрийте додаток 📷 Memories у Nextcloud та встановіть каталог, що містить ваші фотографії.", + "Settings" : "Налаштування", "Timeline" : "Дії", "Folders" : "Каталоги", "Favorites" : "Із зірочкою", @@ -12,9 +12,13 @@ "On this day" : "Цього дня", "Tags" : "Мітки", "Maps" : "Мапи", - "Settings" : "Налаштування", "A better photos experience awaits you" : "На вас чекає краща якість фотографій", "Choose the root folder of your timeline to begin" : "Виберіть кореневу папку вашої шкали часу для початку ", + "Error saving image" : "Помилка збереження зображення", + "Unsaved changes" : "Незбережені зміни", + "Drop changes" : "Відкинути зміни", + "Edit" : "Редагувати", + "Loading …" : "Завантаження …", "Cancel" : "Скасувати", "Delete" : "Вилучити", "Download" : "Завантажити", @@ -27,6 +31,7 @@ "Timeline Path" : "Шлях шкали часу", "Show hidden folders" : "Показати приховані каталоги", "Failed to load some photos" : "Не вдалося завантажити деякі фотографії", + "Share" : "Спільний доступ", "Sidebar" : "Бокове меню", "Search for collaborators" : "Пошук співавторів", "Search people or groups" : "Пошук людей або груп", @@ -66,11 +71,96 @@ "Name" : "Назва", "Rename person" : "Перейменувати особу", "Update" : "Оновлення", - "Loading …" : "Завантаження …", "Refresh" : "Оновити", + "Remove" : "Вилучити", "Delete album" : "Видалити альбом", "Merge with different person" : "Злитися з іншою людиною", "Share folder" : "Спільний доступ для каталогу", + "Save as" : "Зберегти як", + "Reset" : "Скидання", + "All changes will be lost." : "Усі зміни буде втрачено.", + "Are you sure you want to continue?" : "Ви впевнені, що бажаєте продовжити?", + "Continue" : "Продовжити", + "Undo" : "Скасувати", + "Redo" : "Повторити", + "Show original image" : "Показати вихідне зображення", + "Zoom in" : "Наблизити", + "Zoom out" : "Зменшення", + "Toggle zoom menu" : "Перемкнути меню масштабування", + "Adjust" : "Налаштувати", + "Fine-tune" : "Тонка настройка", + "Filters" : "Фільтри", + "Watermark" : "Водяний знак", + "Draw" : "Малювати", + "Resize" : "Змінити розмір", + "Invalid image." : "Недійсне зображення.", + "Error while uploading the image." : "Помилка під час завантаження зображення.", + "are not images" : "не є зображеннями", + "is not an image" : "не є зображенням", + "to be uploaded" : "для завантаження", + "Crop" : "Урожай", + "Original" : "Оригінал", + "Custom" : "Користувацьке", + "Square" : "Майдан", + "Landscape" : "Пейзаж", + "Portrait" : "Портрет", + "Ellipse" : "Еліпс", + "Classic TV" : "Класичний TV", + "CinemaScope" : "CinemaScope", + "Arrow" : "Стрілка", + "Blur" : "Розмиття", + "Brightness" : "Яскравість", + "Contrast" : "Контраст", + "Un-flip X" : "Розгорнути по X", + "Flip X" : "Перевернути X", + "Un-flip Y" : "Розгорнути по Y", + "Flip Y" : "Перевернути Y", + "HSV" : "HSV", + "Hue" : "Відтінок", + "Saturation" : "Насиченість", + "Value" : "Значення", + "Image" : "Зображення", + "Importing …" : "Імпорт…", + "+ Add image" : "+ Додати зображення", + "Line" : "лінія", + "Pen" : "Перо", + "Polygon" : "Багатокутник", + "Sides" : "Сторони", + "Rectangle" : "Прямокутник", + "Corner Radius" : "Радіус кута", + "Width in pixels" : "Ширина в пікселях", + "Height in pixels" : "Висота в пікселях", + "Toggle ratio lock" : "Перемкнути блокування співвідношення", + "Reset to original image size" : "Відновити початковий розмір зображення", + "Rotate" : "Обертати", + "Text" : "Текст", + "Text spacing" : "Інтервал між текстом", + "Text alignment" : "Вирівнювання тексту", + "Font family" : "Сімейство шрифтів", + "Size" : "Розмір", + "Letter spacing" : "Інтервал між літерами", + "Line height" : "Висота лінії", + "Warmth" : "Тепло", + "+ Add watermark" : "+ Додати водяний знак", + "Choose watermark type" : "Виберіть тип водяного знака", + "Upload watermark" : "Завантажити водяний знак", + "Add as text" : "Додати як текст", + "Padding" : "Відступи", + "Shadow" : "Тінь", + "Horizontal" : "Горизонтальний", + "Vertical" : "Вертикальний", + "Opacity" : "Непрозорість", + "Position" : "Позиція", + "Stroke" : "Інсульт", + "Save image as" : "Зберегти зображення як", + "Extension" : "Розширення", + "Name is required." : "Ім'я є обов'язковим.", + "Quality" : "Якість", + "Saved image size (width x height)" : "Розмір збереженого зображення (ширина x висота)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "Зауважте, що вибрана область кадрування нижча за застосований розмір, що може спричинити погіршення якості", + "Actual size (100%)" : "Фактичний розмір (100%)", + "Fit size" : "Підходить за розміром", + "Auto" : "Автоматично", "Failed to create {albumName}." : "Не вдалося створити {albumName}.", "Failed to rename {currentAlbumName} to {newAlbumName}." : "Не вдалося перейменувати {currentAlbumName} на {newAlbumName}.", "Failed to delete files." : "Не вдалося видалити файли.", diff --git a/l10n/ur_PK.js b/l10n/ur_PK.js index c158d3f0..dc549f79 100644 --- a/l10n/ur_PK.js +++ b/l10n/ur_PK.js @@ -1,13 +1,17 @@ OC.L10N.register( "memories", { - "Favorites" : "Favorites", "Settings" : "سیٹینگز", + "Favorites" : "Favorites", + "Edit" : "تدوین کریں", "Cancel" : "منسوخ کریں", "Delete" : "حذف کریں", "Download" : "ڈاؤن لوڈ", + "Share" : "تقسیم", "Save" : "حفظ", "Month" : "ماہ", - "Name" : "اسم" + "Name" : "اسم", + "Reset" : "ری سیٹ", + "Continue" : "جاری" }, "nplurals=2; plural=(n != 1);"); diff --git a/l10n/ur_PK.json b/l10n/ur_PK.json index 1bc2397f..98578560 100644 --- a/l10n/ur_PK.json +++ b/l10n/ur_PK.json @@ -1,11 +1,15 @@ { "translations": { - "Favorites" : "Favorites", "Settings" : "سیٹینگز", + "Favorites" : "Favorites", + "Edit" : "تدوین کریں", "Cancel" : "منسوخ کریں", "Delete" : "حذف کریں", "Download" : "ڈاؤن لوڈ", + "Share" : "تقسیم", "Save" : "حفظ", "Month" : "ماہ", - "Name" : "اسم" + "Name" : "اسم", + "Reset" : "ری سیٹ", + "Continue" : "جاری" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/l10n/uz.js b/l10n/uz.js index 271bbd71..764f1ffb 100644 --- a/l10n/uz.js +++ b/l10n/uz.js @@ -1,11 +1,11 @@ OC.L10N.register( "memories", { + "Settings" : "Sozlamalar", "Favorites" : "Favorites", "Videos" : "Videos", "Tags" : "Tags", "Maps" : "Maps", - "Settings" : "Sozlamalar", "Cancel" : "Cancel", "Delete" : "Delete", "Download" : "Download", @@ -13,6 +13,9 @@ OC.L10N.register( "Save" : "Save", "Name" : "Name", "Update" : "Update", - "Refresh" : "Refresh" + "Refresh" : "Refresh", + "Remove" : "Remove", + "Continue" : "Continue", + "Size" : "Size" }, "nplurals=1; plural=0;"); diff --git a/l10n/uz.json b/l10n/uz.json index edae30e1..f756e480 100644 --- a/l10n/uz.json +++ b/l10n/uz.json @@ -1,9 +1,9 @@ { "translations": { + "Settings" : "Sozlamalar", "Favorites" : "Favorites", "Videos" : "Videos", "Tags" : "Tags", "Maps" : "Maps", - "Settings" : "Sozlamalar", "Cancel" : "Cancel", "Delete" : "Delete", "Download" : "Download", @@ -11,6 +11,9 @@ "Save" : "Save", "Name" : "Name", "Update" : "Update", - "Refresh" : "Refresh" + "Refresh" : "Refresh", + "Remove" : "Remove", + "Continue" : "Continue", + "Size" : "Size" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/l10n/vi.js b/l10n/vi.js index 9a54d9b5..2c7c8a16 100644 --- a/l10n/vi.js +++ b/l10n/vi.js @@ -1,19 +1,23 @@ OC.L10N.register( "memories", { + "Settings" : "Cài đặt", "Folders" : "Thư mục", "Favorites" : "Ưa thích", "Videos" : "Phim", "Archive" : "Lưu trữ", "Tags" : "Nhãn", "Maps" : "Bản đồ", - "Settings" : "Cài đặt", + "Unsaved changes" : "Thay đổi chưa được lưu", + "Edit" : "Chỉnh sửa", + "Loading …" : "Đang tải …", "Cancel" : "Hủy", "Delete" : "Xóa", "Download" : "Tải xuống", "Favorite" : "Ưa thích", "Unarchive" : "Bỏ lưu trữ", "View in folder" : "Xem trong thư mục", + "Share" : "Chia sẻ", "Copy public link" : "Sao chép liên kết công khai", "Back" : "Quay lại", "Save" : "Lưu", @@ -23,7 +27,17 @@ OC.L10N.register( "Time" : "Thời gian", "Name" : "Tên", "Update" : "Cập nhật", - "Loading …" : "Đang tải …", - "Refresh" : "Tải mới" + "Refresh" : "Tải mới", + "Remove" : "Xoá", + "Reset" : "Đặt lại", + "Continue" : "Tiếp tục", + "Undo" : "Hoàn tác", + "Redo" : "Làm lại", + "Custom" : "Tùy chỉnh", + "Image" : "Hình ảnh", + "Text" : "Văn bản", + "Size" : "Kích cỡ", + "Name is required." : "Tên là bắt buộc.", + "Auto" : "Tự động" }, "nplurals=1; plural=0;"); diff --git a/l10n/vi.json b/l10n/vi.json index 92c1e330..36b75fb3 100644 --- a/l10n/vi.json +++ b/l10n/vi.json @@ -1,17 +1,21 @@ { "translations": { + "Settings" : "Cài đặt", "Folders" : "Thư mục", "Favorites" : "Ưa thích", "Videos" : "Phim", "Archive" : "Lưu trữ", "Tags" : "Nhãn", "Maps" : "Bản đồ", - "Settings" : "Cài đặt", + "Unsaved changes" : "Thay đổi chưa được lưu", + "Edit" : "Chỉnh sửa", + "Loading …" : "Đang tải …", "Cancel" : "Hủy", "Delete" : "Xóa", "Download" : "Tải xuống", "Favorite" : "Ưa thích", "Unarchive" : "Bỏ lưu trữ", "View in folder" : "Xem trong thư mục", + "Share" : "Chia sẻ", "Copy public link" : "Sao chép liên kết công khai", "Back" : "Quay lại", "Save" : "Lưu", @@ -21,7 +25,17 @@ "Time" : "Thời gian", "Name" : "Tên", "Update" : "Cập nhật", - "Loading …" : "Đang tải …", - "Refresh" : "Tải mới" + "Refresh" : "Tải mới", + "Remove" : "Xoá", + "Reset" : "Đặt lại", + "Continue" : "Tiếp tục", + "Undo" : "Hoàn tác", + "Redo" : "Làm lại", + "Custom" : "Tùy chỉnh", + "Image" : "Hình ảnh", + "Text" : "Văn bản", + "Size" : "Kích cỡ", + "Name is required." : "Tên là bắt buộc.", + "Auto" : "Tự động" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/l10n/zh_CN.js b/l10n/zh_CN.js index ba79caee..7484d9d9 100644 --- a/l10n/zh_CN.js +++ b/l10n/zh_CN.js @@ -1,6 +1,7 @@ OC.L10N.register( "memories", { + "Settings" : "设置", "Timeline" : "时间线", "Folders" : "文件夹", "Favorites" : "收藏", @@ -11,7 +12,9 @@ OC.L10N.register( "On this day" : "当年今日", "Tags" : "标签", "Maps" : "地图", - "Settings" : "设置", + "Unsaved changes" : "未保存的更改", + "Edit" : "编辑", + "Loading …" : "正在加载 …", "Cancel" : "取消", "Delete" : "删除", "Download" : "下载", @@ -19,6 +22,7 @@ OC.L10N.register( "Unarchive" : "取消归档", "View in folder" : "在文件夹中查看", "Add to album" : "添加至相册", + "Share" : "共享", "Sidebar" : "侧边栏", "Search for collaborators" : "搜索协作者", "Search people or groups" : "搜索用户或群组", @@ -60,11 +64,28 @@ OC.L10N.register( "Name" : "名称", "Rename person" : "重命名用户", "Update" : "更新", - "Loading …" : "正在加载 …", "Refresh" : "刷新", + "Remove" : "移除", "Delete album" : "删除相册", "Merge with different person" : "与另一个人合并为同一人", "Share folder" : "共享文件夹", + "Reset" : "重置", + "Continue" : "继续", + "Undo" : "撤销操作", + "Redo" : "恢复上个操作", + "Zoom in" : "放大", + "Original" : "原图", + "Custom" : "自定义", + "Value" : "值", + "Image" : "图片", + "Line" : "线段", + "Text" : "文本 ", + "Size" : "尺寸", + "Position" : "位置", + "Extension" : "扩展", + "Name is required." : "名称是必填项。", + "Quality" : "质量", + "Auto" : "自动", "Failed to create {albumName}." : "创建 {albumName} 失败", "Failed to rename {currentAlbumName} to {newAlbumName}." : "重命名 {currentAlbumName} 为 {newAlbumName} 的操作失败", "Failed to delete {fileName}." : "删除 {fileName} 失败" diff --git a/l10n/zh_CN.json b/l10n/zh_CN.json index f01117a5..322ee301 100644 --- a/l10n/zh_CN.json +++ b/l10n/zh_CN.json @@ -1,4 +1,5 @@ { "translations": { + "Settings" : "设置", "Timeline" : "时间线", "Folders" : "文件夹", "Favorites" : "收藏", @@ -9,7 +10,9 @@ "On this day" : "当年今日", "Tags" : "标签", "Maps" : "地图", - "Settings" : "设置", + "Unsaved changes" : "未保存的更改", + "Edit" : "编辑", + "Loading …" : "正在加载 …", "Cancel" : "取消", "Delete" : "删除", "Download" : "下载", @@ -17,6 +20,7 @@ "Unarchive" : "取消归档", "View in folder" : "在文件夹中查看", "Add to album" : "添加至相册", + "Share" : "共享", "Sidebar" : "侧边栏", "Search for collaborators" : "搜索协作者", "Search people or groups" : "搜索用户或群组", @@ -58,11 +62,28 @@ "Name" : "名称", "Rename person" : "重命名用户", "Update" : "更新", - "Loading …" : "正在加载 …", "Refresh" : "刷新", + "Remove" : "移除", "Delete album" : "删除相册", "Merge with different person" : "与另一个人合并为同一人", "Share folder" : "共享文件夹", + "Reset" : "重置", + "Continue" : "继续", + "Undo" : "撤销操作", + "Redo" : "恢复上个操作", + "Zoom in" : "放大", + "Original" : "原图", + "Custom" : "自定义", + "Value" : "值", + "Image" : "图片", + "Line" : "线段", + "Text" : "文本 ", + "Size" : "尺寸", + "Position" : "位置", + "Extension" : "扩展", + "Name is required." : "名称是必填项。", + "Quality" : "质量", + "Auto" : "自动", "Failed to create {albumName}." : "创建 {albumName} 失败", "Failed to rename {currentAlbumName} to {newAlbumName}." : "重命名 {currentAlbumName} 为 {newAlbumName} 的操作失败", "Failed to delete {fileName}." : "删除 {fileName} 失败" diff --git a/l10n/zh_HK.js b/l10n/zh_HK.js index 01a64975..ab08e3fd 100644 --- a/l10n/zh_HK.js +++ b/l10n/zh_HK.js @@ -3,7 +3,8 @@ OC.L10N.register( { "Memories" : "回憶", "Yet another photo management app" : "又一個照片管理應用程式", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# 回憶\n\n回憶是一個有進階功能的相片管理 Nextcloud 應用程式,包含了以下功能:\n\n- **📸 時間軸**:從 Exif 資料中按拍攝日期對照片與影片進行排序。\n- **⏪ 倒帶**:立刻跳回過去的任何時間,重溫您的回憶。\n- **🤖 AI 標記**:使用 [recognize](https://github.com/nextcloud/recognize) 應用程式提供的 AI 功能按人物與物體對照片進行分組。\n- **🖼️ 相簿**:建立相簿以將照片與影片分組。然後將這些相簿與其他人分享。\n- **🫱🏻🫲🏻 外部分享**:與您 Nextcloud 站台以外的人們分享照片與影片。\n- **📱 行動裝置支援**:透過網路應用程式在任何形狀與大小的裝置上運作。\n- **✏️ 編輯詮釋資料**:快速輕鬆地編輯照片上的 Exif 日期。\n- **📦 封存**:將您不想在時間軸中看到的照片儲存在單獨的資料夾中。\n- **⚡️ 效能**:本應用程式超快。\n\n## 🌐 線上展示\n\n- 想看看本應用程式的外觀與感覺,請見[公開展示](https://memories-demo.radialapps.com/apps/memories/).\n- 展示站是唯讀的,可能會有點慢(來自 [Oracle Cloud](https://www.oracle.com/cloud/free/) 的免費層級虛擬機器)。\n- 照片則歸功於 [Unsplash](https://unsplash.com/)(若要檢視單獨的署名,請參見每個資料夾中的資訊)。\n\n\n## 🚀 安裝\n1. 從 Nextcloud 應用程式商店安裝應用程式\n1. 執行建議的[設定步驟](https://github.com/pulsejet/memories/wiki/Extra-Configuration)。\n1. 執行 `php ./occ memories:index` 以產生既有照片的詮釋資料索引。\n1. 在 Nextcloud 開啟 📷 回憶應用程式並設定包含您照片的目錄。", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Memories\n\nMemories 是一個有進階功能的相片管理 Nextcloud 應用程式,包含了以下功能:\n\n- **📸 時間軸**:從 Exif 資料中按拍攝日期對照片與影片進行排序。\n- **⏪ 倒帶**:立刻跳回過去的任何時間,重溫您的回憶。\n- **🤖 AI 標記**:使用 [recognize](https://github.com/nextcloud/recognize) 應用程式提供的 AI 功能按人物與物體對照片進行分組。\n- **🖼️ 相簿**:建立相簿以將照片與影片分組。然後將這些相簿與其他人分享。\n- **🫱🏻🫲🏻 外部分享**:與您 Nextcloud 站台以外的人們分享照片與影片。\n- **📱 行動裝置支援**:透過網路應用程式在任何形狀與大小的裝置上運作。\n- **✏️ 編輯詮釋資料**:快速輕鬆地編輯照片上的 Exif 日期。\n- **📦 封存**:將您不想在時間軸中看到的照片儲存在單獨的資料夾中。\n- **📹 視頻轉碼**:Memories 對視頻進行轉碼並使用 HLS 以獲得最佳性能。\n- **⚡️ 效能**:本應用程式超快。\n\n## 🌐 線上展示\n\n- 想看看本應用程式的外觀與感覺,請見[公開展示](https://memories-demo.radialapps.com/apps/memories/).\n- 展示站是唯讀的,可能會有點慢(來自 [Oracle Cloud](https://www.oracle.com/cloud/free/) 的免費層級虛擬機器)。\n- 照片則歸功於 [Unsplash](https://unsplash.com/)(若要檢視單獨的署名,請參見每個資料夾中的資訊)。\n\n\n## 🚀 安裝\n1. 從 Nextcloud 應用程式商店安裝應用程式\n1. 執行建議的[設定步驟](https://github.com/pulsejet/memories/wiki/Extra-Configuration)。\n1. 執行 `php ./occ memories:index` 以產生既有照片的詮釋資料索引。\n1. 在 Nextcloud 開啟 📷 回憶應用程式並設定包含您照片的目錄。", + "Settings" : "設定", "Timeline" : "時間線", "Folders" : "資料夾", "Favorites" : "最愛", @@ -14,7 +15,7 @@ OC.L10N.register( "On this day" : "當年今日", "Tags" : "標籤", "Maps" : "地圖", - "Settings" : "設定", + "EXIF" : "EXIF", "A better photos experience awaits you" : "更好的照片體驗正等著您", "Choose the root folder of your timeline to begin" : "選擇您時間軸的根資料夾以開始", "If you just installed Memories, run:" : "若您安裝了 Memories,請執行:", @@ -25,6 +26,14 @@ OC.L10N.register( "Choose the root of your timeline" : "選擇您時間線的根", "The selected folder does not seem to be valid. Try again." : "選定的資料夾似乎是無效的。請再試一次。", "Found {total} photos in {path}" : "在 {path} 中找到 {total} 張照片", + "Failed to get Exif data. Metadata may be lost!" : "獲取 Exif 數據失敗。元數據可能會丟失!", + "No Exif data found! Continue?" : "未找到 Exif 數據!繼續?", + "Image saved successfully" : "圖像保存成功", + "Error saving image" : "儲存圖像時發生錯誤", + "Unsaved changes" : "未儲存變更", + "Drop changes" : "取消更改", + "Edit" : "編輯", + "Loading …" : "加載中 …", "Cancel" : "取消", "Delete" : "刪除", "Remove from album" : "從相簿移除", @@ -45,10 +54,14 @@ OC.L10N.register( "Folders Path" : "資料夾路徑", "Show hidden folders" : "顯示隱藏資料夾", "Square grid mode" : "方形網格模式", + "Choose Timeline Paths" : "選擇時間線途徑", "Choose the root for the folders view" : "選擇資料夾檢視的根", "Your Timeline" : "您的時間線", "Failed to load some photos" : "未能加載一些照片", + "Share" : "分享", "Sidebar" : "側邊欄", + "Video sharing not supported yet" : "尚不支援視像分享", + "Cannot share this type of data" : "無法分享此類型的資料", "Processing … {n}/{m}" : "處理中 ... {n}/{m}", "{n} photos added to album" : "已新增 {n} 張照片至相簿", "Search for collaborators" : "尋找協作者", @@ -105,7 +118,6 @@ OC.L10N.register( "Rename person" : "重新命名人", "Update" : "更新", "Failed to rename {oldName} to {name}." : "重新命名 {oldName} 為 {name} 失敗。", - "Loading …" : "加載中 …", "Merge {name} with person" : "將 {name} 與人合併", "Are you sure you want to merge {name} with {newName}?" : "您確定要將 {name} 與 {newName} 合併嗎?", "Too many failures, aborting" : "失敗次數過多,中止", @@ -118,6 +130,9 @@ OC.L10N.register( "Use the sidebar to share this folder." : "使用側邊欄以分享此資料夾。", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "若您建立公開連結分享,請點擊「重新整理」,下方將會顯示對應的 Memories 連結。", "Refresh" : "刷新", + "Remove" : "移除", + "Add Path" : "添加途徑", + "Add a root to your timeline" : "添加您時間線的根", "Share album" : "分享相簿", "Delete album" : "刪除相簿", "Merge with different person" : "與其他人合併", @@ -125,6 +140,92 @@ OC.L10N.register( "Share folder" : "分享資料夾", "Move left" : "向左移動", "Move right" : "向右移動", + "Save as" : "另存為", + "Reset" : "重設", + "All changes will be lost." : "所有的更改將被掉棄。", + "Are you sure you want to continue?" : "您確定要繼續嗎?", + "Continue" : "繼續", + "Undo" : "撤消", + "Redo" : "重作", + "Show original image" : "顯示原始圖像", + "Zoom in" : "放大", + "Zoom out" : "縮小", + "Toggle zoom menu" : "切換縮放選項單", + "Adjust" : "調整", + "Fine-tune" : "微調", + "Filters" : "過濾", + "Watermark" : "水印", + "Draw" : "畫", + "Resize" : "調整大小", + "Invalid image." : "圖像無效。", + "Error while uploading the image." : "上傳圖像時發生錯誤。", + "are not images" : "不是圖像", + "is not an image" : "不是圖像", + "to be uploaded" : "待上傳", + "Crop" : "裁剪", + "Original" : "原始", + "Custom" : "自訂", + "Square" : "方形", + "Landscape" : "風景模式", + "Portrait" : "縱向模式", + "Ellipse" : "橢圓形", + "Classic TV" : "經典電視", + "CinemaScope" : "電影放映機", + "Arrow" : "箭嘴", + "Blur" : "模糊", + "Brightness" : "亮度", + "Contrast" : "對比", + "Un-flip X" : "取消翻轉 X", + "Flip X" : "翻轉 X", + "Un-flip Y" : "取消翻轉 X", + "Flip Y" : "翻轉 Y", + "HSV" : "HSV", + "Hue" : "色調", + "Saturation" : "飽和度", + "Value" : "值", + "Image" : "圖像", + "Importing …" : "導入中 ...", + "+ Add image" : "+ 添加圖像", + "Line" : "線形", + "Pen" : "筆", + "Polygon" : "多邊形", + "Sides" : "邊", + "Rectangle" : "長方形", + "Corner Radius" : "圓角半徑", + "Width in pixels" : "寬度像素", + "Height in pixels" : "高度像素", + "Toggle ratio lock" : "切換比例鎖定", + "Reset to original image size" : "重設為原始圖像大小", + "Rotate" : "旋轉", + "Text" : "文本 ", + "Text spacing" : "文字間距", + "Text alignment" : "文字對齊", + "Font family" : "字體系列", + "Size" : "大小", + "Letter spacing" : "字母間距", + "Line height" : "行高", + "Warmth" : "暖度", + "+ Add watermark" : "+ 添加水印", + "Choose watermark type" : "選擇水印類型", + "Upload watermark" : "上傳水印", + "Add as text" : "新增為文字", + "Padding" : "襯填", + "Shadow" : "陰影", + "Horizontal" : "水平", + "Vertical" : "垂直", + "Opacity" : "透明度", + "Position" : "位置", + "Stroke" : "筆劃", + "Save image as" : "保存圖像為", + "Extension" : "副檔名", + "Name is required." : "姓名為必填", + "Quality" : "質素", + "Saved image size (width x height)" : "已保存的圖像大小(寬度 x 高度)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "請注意,選定的裁剪區域低於套用的調整大小,這可能會導致品質下降", + "Actual size (100%)" : "實際大小 (100%)", + "Fit size" : "調整大小", + "Transcoding failed." : "轉碼失敗。", + "Auto" : "自動", "Shared Folder" : "分享資料夾", "Failed to create {albumName}." : "創建 {albumName} 失敗。", "Failed to rename {currentAlbumName} to {newAlbumName}." : "重新命名 {currentAlbumName} 為 {newAlbumName} 失敗。", diff --git a/l10n/zh_HK.json b/l10n/zh_HK.json index 1846e642..35af7619 100644 --- a/l10n/zh_HK.json +++ b/l10n/zh_HK.json @@ -1,7 +1,8 @@ { "translations": { "Memories" : "回憶", "Yet another photo management app" : "又一個照片管理應用程式", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# 回憶\n\n回憶是一個有進階功能的相片管理 Nextcloud 應用程式,包含了以下功能:\n\n- **📸 時間軸**:從 Exif 資料中按拍攝日期對照片與影片進行排序。\n- **⏪ 倒帶**:立刻跳回過去的任何時間,重溫您的回憶。\n- **🤖 AI 標記**:使用 [recognize](https://github.com/nextcloud/recognize) 應用程式提供的 AI 功能按人物與物體對照片進行分組。\n- **🖼️ 相簿**:建立相簿以將照片與影片分組。然後將這些相簿與其他人分享。\n- **🫱🏻🫲🏻 外部分享**:與您 Nextcloud 站台以外的人們分享照片與影片。\n- **📱 行動裝置支援**:透過網路應用程式在任何形狀與大小的裝置上運作。\n- **✏️ 編輯詮釋資料**:快速輕鬆地編輯照片上的 Exif 日期。\n- **📦 封存**:將您不想在時間軸中看到的照片儲存在單獨的資料夾中。\n- **⚡️ 效能**:本應用程式超快。\n\n## 🌐 線上展示\n\n- 想看看本應用程式的外觀與感覺,請見[公開展示](https://memories-demo.radialapps.com/apps/memories/).\n- 展示站是唯讀的,可能會有點慢(來自 [Oracle Cloud](https://www.oracle.com/cloud/free/) 的免費層級虛擬機器)。\n- 照片則歸功於 [Unsplash](https://unsplash.com/)(若要檢視單獨的署名,請參見每個資料夾中的資訊)。\n\n\n## 🚀 安裝\n1. 從 Nextcloud 應用程式商店安裝應用程式\n1. 執行建議的[設定步驟](https://github.com/pulsejet/memories/wiki/Extra-Configuration)。\n1. 執行 `php ./occ memories:index` 以產生既有照片的詮釋資料索引。\n1. 在 Nextcloud 開啟 📷 回憶應用程式並設定包含您照片的目錄。", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# Memories\n\nMemories 是一個有進階功能的相片管理 Nextcloud 應用程式,包含了以下功能:\n\n- **📸 時間軸**:從 Exif 資料中按拍攝日期對照片與影片進行排序。\n- **⏪ 倒帶**:立刻跳回過去的任何時間,重溫您的回憶。\n- **🤖 AI 標記**:使用 [recognize](https://github.com/nextcloud/recognize) 應用程式提供的 AI 功能按人物與物體對照片進行分組。\n- **🖼️ 相簿**:建立相簿以將照片與影片分組。然後將這些相簿與其他人分享。\n- **🫱🏻🫲🏻 外部分享**:與您 Nextcloud 站台以外的人們分享照片與影片。\n- **📱 行動裝置支援**:透過網路應用程式在任何形狀與大小的裝置上運作。\n- **✏️ 編輯詮釋資料**:快速輕鬆地編輯照片上的 Exif 日期。\n- **📦 封存**:將您不想在時間軸中看到的照片儲存在單獨的資料夾中。\n- **📹 視頻轉碼**:Memories 對視頻進行轉碼並使用 HLS 以獲得最佳性能。\n- **⚡️ 效能**:本應用程式超快。\n\n## 🌐 線上展示\n\n- 想看看本應用程式的外觀與感覺,請見[公開展示](https://memories-demo.radialapps.com/apps/memories/).\n- 展示站是唯讀的,可能會有點慢(來自 [Oracle Cloud](https://www.oracle.com/cloud/free/) 的免費層級虛擬機器)。\n- 照片則歸功於 [Unsplash](https://unsplash.com/)(若要檢視單獨的署名,請參見每個資料夾中的資訊)。\n\n\n## 🚀 安裝\n1. 從 Nextcloud 應用程式商店安裝應用程式\n1. 執行建議的[設定步驟](https://github.com/pulsejet/memories/wiki/Extra-Configuration)。\n1. 執行 `php ./occ memories:index` 以產生既有照片的詮釋資料索引。\n1. 在 Nextcloud 開啟 📷 回憶應用程式並設定包含您照片的目錄。", + "Settings" : "設定", "Timeline" : "時間線", "Folders" : "資料夾", "Favorites" : "最愛", @@ -12,7 +13,7 @@ "On this day" : "當年今日", "Tags" : "標籤", "Maps" : "地圖", - "Settings" : "設定", + "EXIF" : "EXIF", "A better photos experience awaits you" : "更好的照片體驗正等著您", "Choose the root folder of your timeline to begin" : "選擇您時間軸的根資料夾以開始", "If you just installed Memories, run:" : "若您安裝了 Memories,請執行:", @@ -23,6 +24,14 @@ "Choose the root of your timeline" : "選擇您時間線的根", "The selected folder does not seem to be valid. Try again." : "選定的資料夾似乎是無效的。請再試一次。", "Found {total} photos in {path}" : "在 {path} 中找到 {total} 張照片", + "Failed to get Exif data. Metadata may be lost!" : "獲取 Exif 數據失敗。元數據可能會丟失!", + "No Exif data found! Continue?" : "未找到 Exif 數據!繼續?", + "Image saved successfully" : "圖像保存成功", + "Error saving image" : "儲存圖像時發生錯誤", + "Unsaved changes" : "未儲存變更", + "Drop changes" : "取消更改", + "Edit" : "編輯", + "Loading …" : "加載中 …", "Cancel" : "取消", "Delete" : "刪除", "Remove from album" : "從相簿移除", @@ -43,10 +52,14 @@ "Folders Path" : "資料夾路徑", "Show hidden folders" : "顯示隱藏資料夾", "Square grid mode" : "方形網格模式", + "Choose Timeline Paths" : "選擇時間線途徑", "Choose the root for the folders view" : "選擇資料夾檢視的根", "Your Timeline" : "您的時間線", "Failed to load some photos" : "未能加載一些照片", + "Share" : "分享", "Sidebar" : "側邊欄", + "Video sharing not supported yet" : "尚不支援視像分享", + "Cannot share this type of data" : "無法分享此類型的資料", "Processing … {n}/{m}" : "處理中 ... {n}/{m}", "{n} photos added to album" : "已新增 {n} 張照片至相簿", "Search for collaborators" : "尋找協作者", @@ -103,7 +116,6 @@ "Rename person" : "重新命名人", "Update" : "更新", "Failed to rename {oldName} to {name}." : "重新命名 {oldName} 為 {name} 失敗。", - "Loading …" : "加載中 …", "Merge {name} with person" : "將 {name} 與人合併", "Are you sure you want to merge {name} with {newName}?" : "您確定要將 {name} 與 {newName} 合併嗎?", "Too many failures, aborting" : "失敗次數過多,中止", @@ -116,6 +128,9 @@ "Use the sidebar to share this folder." : "使用側邊欄以分享此資料夾。", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "若您建立公開連結分享,請點擊「重新整理」,下方將會顯示對應的 Memories 連結。", "Refresh" : "刷新", + "Remove" : "移除", + "Add Path" : "添加途徑", + "Add a root to your timeline" : "添加您時間線的根", "Share album" : "分享相簿", "Delete album" : "刪除相簿", "Merge with different person" : "與其他人合併", @@ -123,6 +138,92 @@ "Share folder" : "分享資料夾", "Move left" : "向左移動", "Move right" : "向右移動", + "Save as" : "另存為", + "Reset" : "重設", + "All changes will be lost." : "所有的更改將被掉棄。", + "Are you sure you want to continue?" : "您確定要繼續嗎?", + "Continue" : "繼續", + "Undo" : "撤消", + "Redo" : "重作", + "Show original image" : "顯示原始圖像", + "Zoom in" : "放大", + "Zoom out" : "縮小", + "Toggle zoom menu" : "切換縮放選項單", + "Adjust" : "調整", + "Fine-tune" : "微調", + "Filters" : "過濾", + "Watermark" : "水印", + "Draw" : "畫", + "Resize" : "調整大小", + "Invalid image." : "圖像無效。", + "Error while uploading the image." : "上傳圖像時發生錯誤。", + "are not images" : "不是圖像", + "is not an image" : "不是圖像", + "to be uploaded" : "待上傳", + "Crop" : "裁剪", + "Original" : "原始", + "Custom" : "自訂", + "Square" : "方形", + "Landscape" : "風景模式", + "Portrait" : "縱向模式", + "Ellipse" : "橢圓形", + "Classic TV" : "經典電視", + "CinemaScope" : "電影放映機", + "Arrow" : "箭嘴", + "Blur" : "模糊", + "Brightness" : "亮度", + "Contrast" : "對比", + "Un-flip X" : "取消翻轉 X", + "Flip X" : "翻轉 X", + "Un-flip Y" : "取消翻轉 X", + "Flip Y" : "翻轉 Y", + "HSV" : "HSV", + "Hue" : "色調", + "Saturation" : "飽和度", + "Value" : "值", + "Image" : "圖像", + "Importing …" : "導入中 ...", + "+ Add image" : "+ 添加圖像", + "Line" : "線形", + "Pen" : "筆", + "Polygon" : "多邊形", + "Sides" : "邊", + "Rectangle" : "長方形", + "Corner Radius" : "圓角半徑", + "Width in pixels" : "寬度像素", + "Height in pixels" : "高度像素", + "Toggle ratio lock" : "切換比例鎖定", + "Reset to original image size" : "重設為原始圖像大小", + "Rotate" : "旋轉", + "Text" : "文本 ", + "Text spacing" : "文字間距", + "Text alignment" : "文字對齊", + "Font family" : "字體系列", + "Size" : "大小", + "Letter spacing" : "字母間距", + "Line height" : "行高", + "Warmth" : "暖度", + "+ Add watermark" : "+ 添加水印", + "Choose watermark type" : "選擇水印類型", + "Upload watermark" : "上傳水印", + "Add as text" : "新增為文字", + "Padding" : "襯填", + "Shadow" : "陰影", + "Horizontal" : "水平", + "Vertical" : "垂直", + "Opacity" : "透明度", + "Position" : "位置", + "Stroke" : "筆劃", + "Save image as" : "保存圖像為", + "Extension" : "副檔名", + "Name is required." : "姓名為必填", + "Quality" : "質素", + "Saved image size (width x height)" : "已保存的圖像大小(寬度 x 高度)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "請注意,選定的裁剪區域低於套用的調整大小,這可能會導致品質下降", + "Actual size (100%)" : "實際大小 (100%)", + "Fit size" : "調整大小", + "Transcoding failed." : "轉碼失敗。", + "Auto" : "自動", "Shared Folder" : "分享資料夾", "Failed to create {albumName}." : "創建 {albumName} 失敗。", "Failed to rename {currentAlbumName} to {newAlbumName}." : "重新命名 {currentAlbumName} 為 {newAlbumName} 失敗。", diff --git a/l10n/zh_TW.js b/l10n/zh_TW.js index 9669aee5..f64f29a3 100644 --- a/l10n/zh_TW.js +++ b/l10n/zh_TW.js @@ -3,7 +3,8 @@ OC.L10N.register( { "Memories" : "回憶", "Yet another photo management app" : "又一個照片管理應用程式", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# 回憶\n\n回憶是一個有進階功能的相片管理 Nextcloud 應用程式,包含了以下功能:\n\n- **📸 時間軸**:從 Exif 資料中按拍攝日期對照片與影片進行排序。\n- **⏪ 倒帶**:立刻跳回過去的任何時間,重溫您的回憶。\n- **🤖 AI 標記**:使用 [recognize](https://github.com/nextcloud/recognize) 應用程式提供的 AI 功能按人物與物體對照片進行分組。\n- **🖼️ 相簿**:建立相簿以將照片與影片分組。然後將這些相簿與其他人分享。\n- **🫱🏻🫲🏻 外部分享**:與您 Nextcloud 站台以外的人們分享照片與影片。\n- **📱 行動裝置支援**:透過網路應用程式在任何形狀與大小的裝置上運作。\n- **✏️ 編輯詮釋資料**:快速輕鬆地編輯照片上的 Exif 日期。\n- **📦 封存**:將您不想在時間軸中看到的照片儲存在單獨的資料夾中。\n- **⚡️ 效能**:本應用程式超快。\n\n## 🌐 線上展示\n\n- 想看看本應用程式的外觀與感覺,請見[公開展示](https://memories-demo.radialapps.com/apps/memories/).\n- 展示站是唯讀的,可能會有點慢(來自 [Oracle Cloud](https://www.oracle.com/cloud/free/) 的免費層級虛擬機器)。\n- 照片則歸功於 [Unsplash](https://unsplash.com/)(若要檢視單獨的署名,請參見每個資料夾中的資訊)。\n\n\n## 🚀 安裝\n1. 從 Nextcloud 應用程式商店安裝應用程式\n1. 執行建議的[設定步驟](https://github.com/pulsejet/memories/wiki/Extra-Configuration)。\n1. 執行 `php ./occ memories:index` 以產生既有照片的詮釋資料索引。\n1. 在 Nextcloud 開啟 📷 回憶應用程式並設定包含您照片的目錄。", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# 回憶\n\n回憶是一個有進階功能的 *超強* Nextcloud 相片管理解決方案,包含了以下功能:\n\n- **📸 時間軸**:從 Exif 資料中按拍攝日期對照片與影片進行排序。\n- **⏪ 倒帶**:立刻跳回過去的任何時間,重溫您的回憶。\n- **🤖 AI 標記**:使用 [recognize](https://github.com/nextcloud/recognize) 應用程式提供的 AI 功能按人物與物體對照片進行分組。\n- **🖼️ 相簿**:建立相簿以將照片與影片分組。然後將這些相簿與其他人分享。\n- **🫱🏻🫲🏻 外部分享**:與您 Nextcloud 站台以外的人們分享照片與影片。\n- **📱 行動裝置支援**:透過網路應用程式在任何形狀與大小的裝置上運作。\n- **✏️ 編輯詮釋資料**:快速輕鬆地編輯照片上的 Exif 日期。\n- **📦 封存**:將您不想在時間軸中看到的照片儲存在單獨的資料夾中。\n- **📹 視訊轉換編碼**:回憶可以轉換視訊編碼並使用 HLS 來取得最大效能。\n- **⚡️ 效能**:本應用程式超快。\n\n## 🌐 線上展示\n\n- 想看看本應用程式的外觀與感覺,請見[公開展示](https://memories-demo.radialapps.com/apps/memories/).\n- 展示站是唯讀的,可能會有點慢(來自 [Oracle Cloud](https://www.oracle.com/cloud/free/) 的免費層級虛擬機器)。\n- 照片則歸功於 [Unsplash](https://unsplash.com/)(若要檢視單獨的署名,請參見每個資料夾中的資訊)。\n\n\n## 🚀 安裝\n1. 從 Nextcloud 應用程式商店安裝應用程式\n1. 執行建議的[設定步驟](https://github.com/pulsejet/memories/wiki/Extra-Configuration)。\n1. 執行 `php ./occ memories:index` 以產生既有照片的詮釋資料索引。\n1. 在 Nextcloud 開啟 📷 回憶應用程式並設定包含您照片的目錄。", + "Settings" : "設定", "Timeline" : "時間軸", "Folders" : "資料夾", "Favorites" : "最愛", @@ -14,7 +15,7 @@ OC.L10N.register( "On this day" : "在這天", "Tags" : "標籤", "Maps" : "地圖", - "Settings" : "設定", + "EXIF" : "EXIF", "A better photos experience awaits you" : "更好的照片體驗正等著您", "Choose the root folder of your timeline to begin" : "選擇您時間軸的根資料夾以開始", "If you just installed Memories, run:" : "若您安裝了 Memories,請執行:", @@ -25,6 +26,14 @@ OC.L10N.register( "Choose the root of your timeline" : "選擇您時間軸的根", "The selected folder does not seem to be valid. Try again." : "選定的資料夾似乎是無效的。請再試一次。", "Found {total} photos in {path}" : "在 {path} 中找到 {total} 張照片", + "Failed to get Exif data. Metadata may be lost!" : "取得 Exif 資料失敗。詮釋資料可能會遺失!", + "No Exif data found! Continue?" : "未找到 Exif 資料!繼續?", + "Image saved successfully" : "圖片儲存成功", + "Error saving image" : "儲存影像時發生錯誤", + "Unsaved changes" : "未儲存變更", + "Drop changes" : "放棄變更", + "Edit" : "編輯", + "Loading …" : "正在載入……", "Cancel" : "取消", "Delete" : "刪除", "Remove from album" : "從相簿移除", @@ -45,10 +54,14 @@ OC.L10N.register( "Folders Path" : "資料夾路徑", "Show hidden folders" : "顯示隱藏的資料夾", "Square grid mode" : "方形網格模式", + "Choose Timeline Paths" : "選擇時間軸路徑", "Choose the root for the folders view" : "選擇資料夾檢視的根", "Your Timeline" : "您的時間軸", "Failed to load some photos" : "載入部份照片時失敗", + "Share" : "分享", "Sidebar" : "側邊欄", + "Video sharing not supported yet" : "尚不支援影片分享", + "Cannot share this type of data" : "無法分享此類型的資料", "Processing … {n}/{m}" : "正在處理…… {n}/{m}", "{n} photos added to album" : "已新增 {n} 張照片至相簿", "Search for collaborators" : "搜尋協作者", @@ -105,7 +118,6 @@ OC.L10N.register( "Rename person" : "重新命名人", "Update" : "更新", "Failed to rename {oldName} to {name}." : "將 {oldName} 重新命名為 {name} 失敗。", - "Loading …" : "正在載入……", "Merge {name} with person" : "將 {name} 與人合併", "Are you sure you want to merge {name} with {newName}?" : "您真的想要將 {name} 與 {newName} 合併嗎?", "Too many failures, aborting" : "失敗次數過多,中止", @@ -118,6 +130,9 @@ OC.L10N.register( "Use the sidebar to share this folder." : "使用側邊欄以分享此資料夾。", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "若您建立公開連結分享,請點擊「重新整理」,下方將會顯示對應的 Memories 連結。", "Refresh" : "重新整理", + "Remove" : "移除", + "Add Path" : "新增路徑", + "Add a root to your timeline" : "新增您時間軸的根", "Share album" : "分享相簿", "Delete album" : "刪除相簿", "Merge with different person" : "與其他人合併", @@ -125,6 +140,92 @@ OC.L10N.register( "Share folder" : "分享資料夾", "Move left" : "向左移動", "Move right" : "向右移動", + "Save as" : "另存新檔", + "Reset" : "重設", + "All changes will be lost." : "所有變更都將會遺失。", + "Are you sure you want to continue?" : "您確定您想要繼續嗎?", + "Continue" : "繼續", + "Undo" : "復原", + "Redo" : "重作", + "Show original image" : "顯示原始影像", + "Zoom in" : "放大", + "Zoom out" : "縮小", + "Toggle zoom menu" : "切換縮放選單", + "Adjust" : "調整", + "Fine-tune" : "微調", + "Filters" : "過濾", + "Watermark" : "水印", + "Draw" : "繪圖", + "Resize" : "調整大小", + "Invalid image." : "無效的圖片。", + "Error while uploading the image." : "上傳圖片時發生錯誤。", + "are not images" : "不是圖片", + "is not an image" : "不是圖片", + "to be uploaded" : "待上傳", + "Crop" : "裁剪", + "Original" : "原始", + "Custom" : "自訂", + "Square" : "方形", + "Landscape" : "風景", + "Portrait" : "人像", + "Ellipse" : "橢圓", + "Classic TV" : "經典電視", + "CinemaScope" : "電影放映機", + "Arrow" : "箭頭", + "Blur" : "模糊", + "Brightness" : "亮度", + "Contrast" : "對比", + "Un-flip X" : "取消翻轉 X", + "Flip X" : "翻轉 X", + "Un-flip Y" : "取消翻轉 Y", + "Flip Y" : "翻轉 Y", + "HSV" : "HSV", + "Hue" : "色相", + "Saturation" : "飽和度", + "Value" : "價值", + "Image" : "圖片", + "Importing …" : "正在匯入……", + "+ Add image" : "+ 新增圖片", + "Line" : "線段", + "Pen" : "筆", + "Polygon" : "多邊形", + "Sides" : "邊", + "Rectangle" : "矩形", + "Corner Radius" : "圓角半徑", + "Width in pixels" : "像素寬度", + "Height in pixels" : "像素高度", + "Toggle ratio lock" : "切換比例鎖定", + "Reset to original image size" : "重設為原始圖片大小", + "Rotate" : "旋轉", + "Text" : "文字", + "Text spacing" : "文字間距", + "Text alignment" : "文字對齊", + "Font family" : "字型家族", + "Size" : "大小", + "Letter spacing" : "字母間距", + "Line height" : "行高", + "Warmth" : "溫暖", + "+ Add watermark" : "+ 新增水印", + "Choose watermark type" : "選擇水印類型", + "Upload watermark" : "上傳水印", + "Add as text" : "新增為留言", + "Padding" : "填充", + "Shadow" : "陰影", + "Horizontal" : "水平", + "Vertical" : "垂直", + "Opacity" : "不透明度", + "Position" : "位置", + "Stroke" : "筆劃", + "Save image as" : "儲存圖片為", + "Extension" : "副檔名", + "Name is required." : "名稱為必填。", + "Quality" : "品質", + "Saved image size (width x height)" : "儲存的圖片大小(寬度 x 高度)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "請注意,選定的裁剪區域低於套用的調整大小,這可能會導致品質下降", + "Actual size (100%)" : "實際大小 (100%)", + "Fit size" : "合適大小", + "Transcoding failed." : "轉換編碼失敗。", + "Auto" : "自動", "Shared Folder" : "已分享的資料夾", "Failed to create {albumName}." : "建立 {albumName} 失敗。", "Failed to rename {currentAlbumName} to {newAlbumName}." : "重新命名 {currentAlbumName} 為 {newAlbumName} 失敗。", diff --git a/l10n/zh_TW.json b/l10n/zh_TW.json index 63739269..08add1fa 100644 --- a/l10n/zh_TW.json +++ b/l10n/zh_TW.json @@ -1,7 +1,8 @@ { "translations": { "Memories" : "回憶", "Yet another photo management app" : "又一個照片管理應用程式", - "# Memories\n\nMemories is a photo management app for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **⚡️ Performance**: Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# 回憶\n\n回憶是一個有進階功能的相片管理 Nextcloud 應用程式,包含了以下功能:\n\n- **📸 時間軸**:從 Exif 資料中按拍攝日期對照片與影片進行排序。\n- **⏪ 倒帶**:立刻跳回過去的任何時間,重溫您的回憶。\n- **🤖 AI 標記**:使用 [recognize](https://github.com/nextcloud/recognize) 應用程式提供的 AI 功能按人物與物體對照片進行分組。\n- **🖼️ 相簿**:建立相簿以將照片與影片分組。然後將這些相簿與其他人分享。\n- **🫱🏻🫲🏻 外部分享**:與您 Nextcloud 站台以外的人們分享照片與影片。\n- **📱 行動裝置支援**:透過網路應用程式在任何形狀與大小的裝置上運作。\n- **✏️ 編輯詮釋資料**:快速輕鬆地編輯照片上的 Exif 日期。\n- **📦 封存**:將您不想在時間軸中看到的照片儲存在單獨的資料夾中。\n- **⚡️ 效能**:本應用程式超快。\n\n## 🌐 線上展示\n\n- 想看看本應用程式的外觀與感覺,請見[公開展示](https://memories-demo.radialapps.com/apps/memories/).\n- 展示站是唯讀的,可能會有點慢(來自 [Oracle Cloud](https://www.oracle.com/cloud/free/) 的免費層級虛擬機器)。\n- 照片則歸功於 [Unsplash](https://unsplash.com/)(若要檢視單獨的署名,請參見每個資料夾中的資訊)。\n\n\n## 🚀 安裝\n1. 從 Nextcloud 應用程式商店安裝應用程式\n1. 執行建議的[設定步驟](https://github.com/pulsejet/memories/wiki/Extra-Configuration)。\n1. 執行 `php ./occ memories:index` 以產生既有照片的詮釋資料索引。\n1. 在 Nextcloud 開啟 📷 回憶應用程式並設定包含您照片的目錄。", + "# Memories\n\nMemories is a *batteries-included* photo management solution for Nextcloud with advanced features including:\n\n- **📸 Timeline**: Sort photos and videos by date taken, parsed from Exif data.\n- **⏪ Rewind**: Jump to any time in the past instantly and relive your memories.\n- **🤖 AI Tagging**: Group photos by people and objects using AI, powered by [recognize](https://github.com/nextcloud/recognize).\n- **🖼️ Albums**: Create albums to group photos and videos together. Then share these albums with others.\n- **🫱🏻🫲🏻 External Sharing**: Share photos and videos with people outside of your Nextcloud instance.\n- **📱 Mobile Support**: Works on devices of any shape and size through the web app.\n- **✏️ Edit Metadata**: Edit dates on photos quickly and easily.\n- **📦 Archive**: Store photos you don't want to see in your timeline in a separate folder.\n- **📹 Video Transcoding**: Memories transcodes videos and uses HLS for maximal performance.\n- **⚡️ Performance**: In general, Memories is extremely fast.\n\n## 🌐 Online Demo\n\n- To get an idea of what memories looks and feels like, check out the [public demo](https://memories-demo.radialapps.com/apps/memories/).\n- The demo is read-only and may be slow (free tier VM from [Oracle Cloud](https://www.oracle.com/cloud/free/)).\n- Photo credits go to [Unsplash](https://unsplash.com/) (for individual credits, refer to each folder).\n\n## 🚀 Installation\n\n1. Install the app from the Nextcloud app store.\n1. Perform the recommended [configuration steps](https://github.com/pulsejet/memories/wiki/Extra-Configuration).\n1. Run `php ./occ memories:index` to generate metadata indices for existing photos.\n1. Open the 📷 Memories app in Nextcloud and set the directory containing your photos." : "# 回憶\n\n回憶是一個有進階功能的 *超強* Nextcloud 相片管理解決方案,包含了以下功能:\n\n- **📸 時間軸**:從 Exif 資料中按拍攝日期對照片與影片進行排序。\n- **⏪ 倒帶**:立刻跳回過去的任何時間,重溫您的回憶。\n- **🤖 AI 標記**:使用 [recognize](https://github.com/nextcloud/recognize) 應用程式提供的 AI 功能按人物與物體對照片進行分組。\n- **🖼️ 相簿**:建立相簿以將照片與影片分組。然後將這些相簿與其他人分享。\n- **🫱🏻🫲🏻 外部分享**:與您 Nextcloud 站台以外的人們分享照片與影片。\n- **📱 行動裝置支援**:透過網路應用程式在任何形狀與大小的裝置上運作。\n- **✏️ 編輯詮釋資料**:快速輕鬆地編輯照片上的 Exif 日期。\n- **📦 封存**:將您不想在時間軸中看到的照片儲存在單獨的資料夾中。\n- **📹 視訊轉換編碼**:回憶可以轉換視訊編碼並使用 HLS 來取得最大效能。\n- **⚡️ 效能**:本應用程式超快。\n\n## 🌐 線上展示\n\n- 想看看本應用程式的外觀與感覺,請見[公開展示](https://memories-demo.radialapps.com/apps/memories/).\n- 展示站是唯讀的,可能會有點慢(來自 [Oracle Cloud](https://www.oracle.com/cloud/free/) 的免費層級虛擬機器)。\n- 照片則歸功於 [Unsplash](https://unsplash.com/)(若要檢視單獨的署名,請參見每個資料夾中的資訊)。\n\n\n## 🚀 安裝\n1. 從 Nextcloud 應用程式商店安裝應用程式\n1. 執行建議的[設定步驟](https://github.com/pulsejet/memories/wiki/Extra-Configuration)。\n1. 執行 `php ./occ memories:index` 以產生既有照片的詮釋資料索引。\n1. 在 Nextcloud 開啟 📷 回憶應用程式並設定包含您照片的目錄。", + "Settings" : "設定", "Timeline" : "時間軸", "Folders" : "資料夾", "Favorites" : "最愛", @@ -12,7 +13,7 @@ "On this day" : "在這天", "Tags" : "標籤", "Maps" : "地圖", - "Settings" : "設定", + "EXIF" : "EXIF", "A better photos experience awaits you" : "更好的照片體驗正等著您", "Choose the root folder of your timeline to begin" : "選擇您時間軸的根資料夾以開始", "If you just installed Memories, run:" : "若您安裝了 Memories,請執行:", @@ -23,6 +24,14 @@ "Choose the root of your timeline" : "選擇您時間軸的根", "The selected folder does not seem to be valid. Try again." : "選定的資料夾似乎是無效的。請再試一次。", "Found {total} photos in {path}" : "在 {path} 中找到 {total} 張照片", + "Failed to get Exif data. Metadata may be lost!" : "取得 Exif 資料失敗。詮釋資料可能會遺失!", + "No Exif data found! Continue?" : "未找到 Exif 資料!繼續?", + "Image saved successfully" : "圖片儲存成功", + "Error saving image" : "儲存影像時發生錯誤", + "Unsaved changes" : "未儲存變更", + "Drop changes" : "放棄變更", + "Edit" : "編輯", + "Loading …" : "正在載入……", "Cancel" : "取消", "Delete" : "刪除", "Remove from album" : "從相簿移除", @@ -43,10 +52,14 @@ "Folders Path" : "資料夾路徑", "Show hidden folders" : "顯示隱藏的資料夾", "Square grid mode" : "方形網格模式", + "Choose Timeline Paths" : "選擇時間軸路徑", "Choose the root for the folders view" : "選擇資料夾檢視的根", "Your Timeline" : "您的時間軸", "Failed to load some photos" : "載入部份照片時失敗", + "Share" : "分享", "Sidebar" : "側邊欄", + "Video sharing not supported yet" : "尚不支援影片分享", + "Cannot share this type of data" : "無法分享此類型的資料", "Processing … {n}/{m}" : "正在處理…… {n}/{m}", "{n} photos added to album" : "已新增 {n} 張照片至相簿", "Search for collaborators" : "搜尋協作者", @@ -103,7 +116,6 @@ "Rename person" : "重新命名人", "Update" : "更新", "Failed to rename {oldName} to {name}." : "將 {oldName} 重新命名為 {name} 失敗。", - "Loading …" : "正在載入……", "Merge {name} with person" : "將 {name} 與人合併", "Are you sure you want to merge {name} with {newName}?" : "您真的想要將 {name} 與 {newName} 合併嗎?", "Too many failures, aborting" : "失敗次數過多,中止", @@ -116,6 +128,9 @@ "Use the sidebar to share this folder." : "使用側邊欄以分享此資料夾。", "If you create a public link share, click on refresh and a corresponding link to Memories will be shown below." : "若您建立公開連結分享,請點擊「重新整理」,下方將會顯示對應的 Memories 連結。", "Refresh" : "重新整理", + "Remove" : "移除", + "Add Path" : "新增路徑", + "Add a root to your timeline" : "新增您時間軸的根", "Share album" : "分享相簿", "Delete album" : "刪除相簿", "Merge with different person" : "與其他人合併", @@ -123,6 +138,92 @@ "Share folder" : "分享資料夾", "Move left" : "向左移動", "Move right" : "向右移動", + "Save as" : "另存新檔", + "Reset" : "重設", + "All changes will be lost." : "所有變更都將會遺失。", + "Are you sure you want to continue?" : "您確定您想要繼續嗎?", + "Continue" : "繼續", + "Undo" : "復原", + "Redo" : "重作", + "Show original image" : "顯示原始影像", + "Zoom in" : "放大", + "Zoom out" : "縮小", + "Toggle zoom menu" : "切換縮放選單", + "Adjust" : "調整", + "Fine-tune" : "微調", + "Filters" : "過濾", + "Watermark" : "水印", + "Draw" : "繪圖", + "Resize" : "調整大小", + "Invalid image." : "無效的圖片。", + "Error while uploading the image." : "上傳圖片時發生錯誤。", + "are not images" : "不是圖片", + "is not an image" : "不是圖片", + "to be uploaded" : "待上傳", + "Crop" : "裁剪", + "Original" : "原始", + "Custom" : "自訂", + "Square" : "方形", + "Landscape" : "風景", + "Portrait" : "人像", + "Ellipse" : "橢圓", + "Classic TV" : "經典電視", + "CinemaScope" : "電影放映機", + "Arrow" : "箭頭", + "Blur" : "模糊", + "Brightness" : "亮度", + "Contrast" : "對比", + "Un-flip X" : "取消翻轉 X", + "Flip X" : "翻轉 X", + "Un-flip Y" : "取消翻轉 Y", + "Flip Y" : "翻轉 Y", + "HSV" : "HSV", + "Hue" : "色相", + "Saturation" : "飽和度", + "Value" : "價值", + "Image" : "圖片", + "Importing …" : "正在匯入……", + "+ Add image" : "+ 新增圖片", + "Line" : "線段", + "Pen" : "筆", + "Polygon" : "多邊形", + "Sides" : "邊", + "Rectangle" : "矩形", + "Corner Radius" : "圓角半徑", + "Width in pixels" : "像素寬度", + "Height in pixels" : "像素高度", + "Toggle ratio lock" : "切換比例鎖定", + "Reset to original image size" : "重設為原始圖片大小", + "Rotate" : "旋轉", + "Text" : "文字", + "Text spacing" : "文字間距", + "Text alignment" : "文字對齊", + "Font family" : "字型家族", + "Size" : "大小", + "Letter spacing" : "字母間距", + "Line height" : "行高", + "Warmth" : "溫暖", + "+ Add watermark" : "+ 新增水印", + "Choose watermark type" : "選擇水印類型", + "Upload watermark" : "上傳水印", + "Add as text" : "新增為留言", + "Padding" : "填充", + "Shadow" : "陰影", + "Horizontal" : "水平", + "Vertical" : "垂直", + "Opacity" : "不透明度", + "Position" : "位置", + "Stroke" : "筆劃", + "Save image as" : "儲存圖片為", + "Extension" : "副檔名", + "Name is required." : "名稱為必填。", + "Quality" : "品質", + "Saved image size (width x height)" : "儲存的圖片大小(寬度 x 高度)", + "Note that the selected crop area is lower than the applied resize which might cause quality decrease" : "請注意,選定的裁剪區域低於套用的調整大小,這可能會導致品質下降", + "Actual size (100%)" : "實際大小 (100%)", + "Fit size" : "合適大小", + "Transcoding failed." : "轉換編碼失敗。", + "Auto" : "自動", "Shared Folder" : "已分享的資料夾", "Failed to create {albumName}." : "建立 {albumName} 失敗。", "Failed to rename {currentAlbumName} to {newAlbumName}." : "重新命名 {currentAlbumName} 為 {newAlbumName} 失敗。", diff --git a/lib/Command/Index.php b/lib/Command/Index.php index 44d629c9..d1ba0d55 100644 --- a/lib/Command/Index.php +++ b/lib/Command/Index.php @@ -25,7 +25,6 @@ namespace OCA\Memories\Command; use OC\DB\Connection; use OC\DB\SchemaWrapper; -use OCA\Files_External\Service\GlobalStoragesService; use OCA\Memories\AppInfo\Application; use OCA\Memories\Db\TimelineWrite; use OCP\Encryption\IManager; @@ -38,8 +37,6 @@ use OCP\IDBConnection; use OCP\IPreview; use OCP\IUser; use OCP\IUserManager; -use Psr\Container\ContainerExceptionInterface; -use Psr\Container\ContainerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -47,9 +44,6 @@ use Symfony\Component\Console\Output\OutputInterface; class Index extends Command { - /** @var ?GlobalStoragesService */ - protected $globalService; - /** @var int[][] */ protected array $sizes; @@ -78,8 +72,7 @@ class Index extends Command IConfig $config, IManager $encryptionManager, IDBConnection $connection, - Connection $connectionForSchema, - ContainerInterface $container + Connection $connectionForSchema ) { parent::__construct(); @@ -91,12 +84,6 @@ class Index extends Command $this->connection = $connection; $this->connectionForSchema = $connectionForSchema; $this->timelineWrite = new TimelineWrite($connection, $preview); - - try { - $this->globalService = $container->get(GlobalStoragesService::class); - } catch (ContainerExceptionInterface $e) { - $this->globalService = null; - } } protected function configure(): void @@ -277,14 +264,6 @@ class Index extends Command return; } - // Clear previous line and write new one - $line = 'Scanning folder '.$folderPath; - if ($this->previousLineLength) { - $this->output->write("\r".str_repeat(' ', $this->previousLineLength)."\r"); - } - $this->output->write($line."\r"); - $this->previousLineLength = \strlen($line); - $nodes = $folder->getDirectoryListing(); foreach ($nodes as &$node) { @@ -305,6 +284,15 @@ class Index extends Command private function parseFile(File &$file, bool &$refresh): void { + // Clear previous line and write new one + $line = 'Scanning file '.$file->getPath(); + if ($this->previousLineLength) { + $this->output->write("\r".str_repeat(' ', $this->previousLineLength)."\r"); + } + $this->output->write($line."\r"); + $this->previousLineLength = \strlen($line); + + // Process the file $res = $this->timelineWrite->processFile($file, $refresh); if (2 === $res) { ++$this->nProcessed; diff --git a/lib/Command/VideoSetup.php b/lib/Command/VideoSetup.php new file mode 100644 index 00000000..01b80be1 --- /dev/null +++ b/lib/Command/VideoSetup.php @@ -0,0 +1,175 @@ + + * @author Varun Patil + * @license AGPL-3.0-or-later + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace OCA\Memories\Command; + +use OCP\IConfig; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +class VideoSetup extends Command +{ + protected IConfig $config; + protected OutputInterface $output; + + public function __construct( + IConfig $config + ) { + parent::__construct(); + $this->config = $config; + } + + protected function configure(): void + { + $this + ->setName('memories:video-setup') + ->setDescription('Setup video streaming') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + // Preset executables + $ffmpegPath = $this->config->getSystemValue('memories.ffmpeg_path', 'ffmpeg'); + $ffprobePath = $this->config->getSystemValue('memories.ffprobe_path', 'ffprobe'); + + // Get ffmpeg version + $ffmpeg = shell_exec("{$ffmpegPath} -version"); + if (false === strpos($ffmpeg, 'ffmpeg version')) { + $ffmpeg = null; + $output->writeln('ffmpeg is not installed'); + } else { + $output->writeln('ffmpeg is installed'); + } + + // Get ffprobe version + $ffprobe = shell_exec("{$ffprobePath} -version"); + if (false === strpos($ffprobe, 'ffprobe version')) { + $ffprobe = null; + $output->writeln('ffprobe is not installed'); + } else { + $output->writeln('ffprobe is installed'); + } + + if (null === $ffmpeg || null === $ffprobe) { + $output->writeln('ffmpeg and ffprobe are required for video transcoding'); + + return $this->suggestDisable($output); + } + + // Check go-vod binary + $output->writeln('Checking for go-vod binary'); + + // Detect architecture + $arch = \OCA\Memories\Util::getArch(); + + if (!$arch) { + $output->writeln('Compatible go-vod binary not found'); + $this->suggestGoVod($output); + + return $this->suggestDisable($output); + } + + $goVodPath = realpath(__DIR__."/../../exiftool-bin/go-vod-{$arch}"); + $output->writeln("Trying go-vod from {$goVodPath}"); + chmod($goVodPath, 0755); + + $goVod = shell_exec($goVodPath.' test'); + if (!$goVod || false === strpos($goVod, 'test successful')) { + $output->writeln('go-vod could not be run'); + $this->suggestGoVod($output); + + return $this->suggestDisable($output); + } + + // Go transcode is working. Yay! + $output->writeln('go-vod is installed!'); + $output->writeln(''); + $output->writeln('You can use transcoding and HLS streaming'); + $output->writeln('This is recommended for better performance, but has implications if'); + $output->writeln('you are using external storage or run Nextcloud on a slow system.'); + $output->writeln(''); + $output->writeln('Read the following documentation carefully before continuing:'); + $output->writeln('https://github.com/pulsejet/memories/wiki/Configuration'); + $output->writeln(''); + $output->writeln('Do you want to enable transcoding and HLS? [Y/n]'); + + if ('n' === trim(fgets(fopen('php://stdin', 'r')))) { + $this->config->setSystemValue('memories.no_transcode', true); + $output->writeln('Transcoding and HLS are now disabled'); + + return 0; + } + + $this->config->setSystemValue('memories.transcoder', $goVodPath); + $this->config->setSystemValue('memories.no_transcode', false); + $output->writeln('Transcoding and HLS are now enabled! Monitor the output at /tmp/go-vod.log for any errors'); + $output->writeln('You should restart the server for changes to take effect'); + + // Check for VAAPI + $output->writeln("\nChecking for QSV (/dev/dri/renderD128)"); + if (file_exists('/dev/dri/renderD128')) { + $output->writeln('QSV is available. Do you want to enable it? [Y/n]'); + + if ('n' === trim(fgets(fopen('php://stdin', 'r')))) { + $this->config->setSystemValue('memories.qsv', false); + $output->writeln('QSV is now disabled'); + } else { + $output->writeln("\nQSV is now enabled. You may still need to install the Intel Media Driver"); + $output->writeln('and ensure proper permissions for /dev/dri/renderD128.'); + $output->writeln('See the documentation for more details.'); + $this->config->setSystemValue('memories.qsv', true); + } + } else { + $output->writeln('QSV is not available'); + $this->config->setSystemValue('memories.qsv', false); + } + + return 0; + } + + protected function suggestGoVod(OutputInterface $output): void + { + $output->writeln('You may build go-vod from source'); + $output->writeln('It can be downloaded from https://github.com/pulsejet/go-vod'); + $output->writeln('Once built, point the path to the binary in the config for `memories.transcoder`'); + } + + protected function suggestDisable(OutputInterface $output) + { + $output->writeln('Without transcoding, video playback may be slow and limited'); + $output->writeln('Do you want to disable transcoding and HLS streaming? [y/N]'); + if ('y' !== trim(fgets(fopen('php://stdin', 'r')))) { + $output->writeln('Aborting'); + + return 1; + } + + $this->config->setSystemValue('memories.no_transcode', true); + $output->writeln('Transcoding and HLS are now disabled'); + $output->writeln('You should restart the server for changes to take effect'); + + return 0; + } +} diff --git a/lib/Controller/ApiBase.php b/lib/Controller/ApiBase.php index 1916cca4..a7ea2319 100644 --- a/lib/Controller/ApiBase.php +++ b/lib/Controller/ApiBase.php @@ -25,12 +25,14 @@ namespace OCA\Memories\Controller; use OCA\Memories\AppInfo\Application; use OCA\Memories\Db\TimelineQuery; +use OCA\Memories\Db\TimelineRoot; use OCA\Memories\Db\TimelineWrite; use OCA\Memories\Exif; use OCP\App\IAppManager; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; +use OCP\Files\File; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\IConfig; @@ -87,12 +89,14 @@ class ApiBase extends Controller return $user ? $user->getUID() : ''; } - /** Get the Folder object relevant to the request */ - protected function getRequestFolder() + /** Get the TimelineRoot object relevant to the request */ + protected function getRequestRoot() { + $root = new TimelineRoot(); + // Albums have no folder if ($this->request->getParam('album')) { - return null; + return $root; } // Public shared folder @@ -102,35 +106,79 @@ class ApiBase extends Controller throw new \Exception('Share not found or invalid'); } - return $share; + $root->addFolder($share); + + return $root; } // Anything else needs a user $user = $this->userSession->getUser(); if (null === $user) { - return null; + throw new \Exception('User not logged in'); } $uid = $user->getUID(); $folder = null; $folderPath = $this->request->getParam('folder'); - $forcedTimelinePath = $this->request->getParam('timelinePath'); $userFolder = $this->rootFolder->getUserFolder($uid); - if (null !== $folderPath) { - $folder = $userFolder->get($folderPath); - } elseif (null !== $forcedTimelinePath) { - $folder = $userFolder->get($forcedTimelinePath); - } else { - $configPath = Exif::removeExtraSlash(Exif::getPhotosPath($this->config, $uid)); - $folder = $userFolder->get($configPath); + try { + if (null !== $folderPath) { + $folder = $userFolder->get(Exif::removeExtraSlash($folderPath)); + $root->addFolder($folder); + } else { + $timelinePath = $this->request->getParam('timelinePath', Exif::getPhotosPath($this->config, $uid)); + $timelinePath = Exif::removeExtraSlash($timelinePath); + + // Multiple timeline path support + $paths = explode(';', $timelinePath); + foreach ($paths as &$path) { + $folder = $userFolder->get(trim($path)); + $root->addFolder($folder); + } + $root->addMountPoints(); + } + } catch (\OCP\Files\NotFoundException $e) { + $msg = $e->getMessage(); + + throw new \Exception("Folder not found: {$msg}"); } - if (!$folder instanceof Folder) { - throw new \Exception('Folder not found'); + return $root; + } + + /** + * Get a file with ID from user's folder. + * + * @param int $fileId + * + * @return null|File + */ + protected function getUserFile(int $id) + { + $user = $this->userSession->getUser(); + if (null === $user) { + return null; + } + $userFolder = $this->rootFolder->getUserFolder($user->getUID()); + + // Check for permissions and get numeric Id + $file = $userFolder->getById($id); + if (0 === \count($file)) { + return null; } - return $folder; + // Check if node is a file + if (!$file[0] instanceof File) { + return null; + } + + // Check read permission + if (!($file[0]->getPermissions() & \OCP\Constants::PERMISSION_READ)) { + return null; + } + + return $file[0]; } protected function isRecursive() diff --git a/lib/Controller/ArchiveController.php b/lib/Controller/ArchiveController.php index 4ca93d0c..8c5a4ba6 100644 --- a/lib/Controller/ArchiveController.php +++ b/lib/Controller/ArchiveController.php @@ -54,62 +54,94 @@ class ArchiveController extends ApiBase $file = $file[0]; // Check if user has permissions - if (!$file->isUpdateable()) { + if (!$file->isUpdateable() || !($file->getPermissions() & \OCP\Constants::PERMISSION_UPDATE)) { return new JSONResponse(['message' => 'Cannot update this file'], Http::STATUS_FORBIDDEN); } // Create archive folder in the root of the user's configured timeline - $timelinePath = Exif::removeExtraSlash(Exif::getPhotosPath($this->config, $uid)); - $timelineFolder = $userFolder->get($timelinePath); - if (null === $timelineFolder || !$timelineFolder instanceof Folder) { - return new JSONResponse(['message' => 'Cannot get timeline'], Http::STATUS_INTERNAL_SERVER_ERROR); - } - if (!$timelineFolder->isCreatable()) { - return new JSONResponse(['message' => 'Cannot create archive folder'], Http::STATUS_FORBIDDEN); + $configPath = Exif::removeExtraSlash(Exif::getPhotosPath($this->config, $uid)); + $configPaths = explode(';', $configPath); + $timelineFolders = []; + $timelinePaths = []; + + // Get all timeline paths + foreach ($configPaths as $path) { + try { + $f = $userFolder->get($path); + $timelineFolders[] = $f; + $timelinePaths[] = $f->getPath(); + } catch (\OCP\Files\NotFoundException $e) { + return new JSONResponse(['message' => 'Timeline folder not found'], Http::STATUS_NOT_FOUND); + } } - // Get path of current file relative to the timeline folder - // remove timelineFolder path from start of file path - $timelinePath = $timelineFolder->getPath(); // no trailing slash - if (substr($file->getPath(), 0, \strlen($timelinePath)) !== $timelinePath) { - return new JSONResponse(['message' => 'Files outside timeline cannot be archived'], Http::STATUS_INTERNAL_SERVER_ERROR); - } - $relativePath = substr($file->getPath(), \strlen($timelinePath)); // has a leading slash + // Bubble up from file until we reach the correct folder + $fileStorageId = $file->getStorage()->getId(); + $parent = $file->getParent(); + $isArchived = false; + while (true) { + if (null === $parent) { + throw new \Exception('Cannot get correct parent of file'); + } - // Final path of the file including the file name - $destinationPath = ''; + // Hit a timeline folder + if (\in_array($parent->getPath(), $timelinePaths, true)) { + break; + } + + // Hit a storage root + try { + if ($parent->getParent()->getStorage()->getId() !== $fileStorageId) { + break; + } + } catch (\OCP\Files\NotFoundException $e) { + break; + } + + // Hit an archive folder root + if ($parent->getName() === \OCA\Memories\Util::$ARCHIVE_FOLDER) { + $isArchived = true; + + break; + } + + $parent = $parent->getParent(); + } + + // Get path of current file relative to the parent folder + $relativeFilePath = $parent->getRelativePath($file->getPath()); // Check if we want to archive or unarchive $body = $this->request->getParams(); $unarchive = isset($body['archive']) && false === $body['archive']; + if ($isArchived && !$unarchive) { + return new JSONResponse(['message' => 'File already archived'], Http::STATUS_BAD_REQUEST); + } + if (!$isArchived && $unarchive) { + return new JSONResponse(['message' => 'File not archived'], Http::STATUS_BAD_REQUEST); + } + + // Final path of the file including the file name + $destinationPath = ''; // Get if the file is already in the archive (relativePath starts with archive) - $archiveFolderWithLeadingSlash = '/'.\OCA\Memories\Util::$ARCHIVE_FOLDER; - if (substr($relativePath, 0, \strlen($archiveFolderWithLeadingSlash)) === $archiveFolderWithLeadingSlash) { - // file already in archive, remove it instead - $destinationPath = substr($relativePath, \strlen($archiveFolderWithLeadingSlash)); - if (!$unarchive) { - return new JSONResponse(['message' => 'File already archived'], Http::STATUS_BAD_REQUEST); - } + if ($isArchived) { + // file already in archive, remove it + $destinationPath = $relativeFilePath; + $parent = $parent->getParent(); } else { // file not in archive, put it in there - $destinationPath = Exif::removeExtraSlash(\OCA\Memories\Util::$ARCHIVE_FOLDER.$relativePath); - if ($unarchive) { - return new JSONResponse(['message' => 'File not archived'], Http::STATUS_BAD_REQUEST); - } + $af = \OCA\Memories\Util::$ARCHIVE_FOLDER; + $destinationPath = Exif::removeExtraSlash($af.$relativeFilePath); } // Remove the filename - $destinationFolders = explode('/', $destinationPath); + $destinationFolders = array_filter(explode('/', $destinationPath)); array_pop($destinationFolders); // Create folder tree - $folder = $timelineFolder; + $folder = $parent; foreach ($destinationFolders as $folderName) { - if ('' === $folderName) { - continue; - } - try { $existingFolder = $folder->get($folderName.'/'); if (!$existingFolder instanceof Folder) { diff --git a/lib/Controller/DaysController.php b/lib/Controller/DaysController.php index 5133676b..f3512cf3 100644 --- a/lib/Controller/DaysController.php +++ b/lib/Controller/DaysController.php @@ -23,9 +23,9 @@ declare(strict_types=1); namespace OCA\Memories\Controller; +use OCA\Memories\Db\TimelineRoot; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; -use OCP\Files\Folder; class DaysController extends ApiBase { @@ -42,10 +42,10 @@ class DaysController extends ApiBase $uid = $this->getUid(); // Get the folder to show - $folder = null; + $root = null; try { - $folder = $this->getRequestFolder(); + $root = $this->getRequestRoot(); } catch (\Exception $e) { return new JSONResponse(['message' => $e->getMessage()], Http::STATUS_NOT_FOUND); } @@ -53,7 +53,7 @@ class DaysController extends ApiBase // Run actual query try { $list = $this->timelineQuery->getDays( - $folder, + $root, $uid, $this->isRecursive(), $this->isArchive(), @@ -65,7 +65,7 @@ class DaysController extends ApiBase $list = $this->timelineQuery->daysToMonths($list); } else { // Preload some day responses - $this->preloadDays($list, $uid, $folder); + $this->preloadDays($list, $uid, $root); } // Reverse response if requested. Folders still stay at top. @@ -75,7 +75,7 @@ class DaysController extends ApiBase // Add subfolder info if querying non-recursively if (!$this->isRecursive()) { - array_unshift($list, $this->getSubfoldersEntry($folder)); + array_unshift($list, $this->getSubfoldersEntry($root->getFolder($root->getOneId()))); } return new JSONResponse($list, Http::STATUS_OK); @@ -111,10 +111,10 @@ class DaysController extends ApiBase } // Get the folder to show - $folder = null; + $root = null; try { - $folder = $this->getRequestFolder(); + $root = $this->getRequestRoot(); } catch (\Exception $e) { return new JSONResponse(['message' => $e->getMessage()], Http::STATUS_NOT_FOUND); } @@ -127,7 +127,7 @@ class DaysController extends ApiBase // Run actual query try { $list = $this->timelineQuery->getDay( - $folder, + $root, $uid, $dayIds, $this->isRecursive(), @@ -237,11 +237,11 @@ class DaysController extends ApiBase /** * Preload a few "day" at the start of "days" response. * - * @param array $days the days array - * @param string $uid User ID or blank for public shares - * @param null|Folder $folder the folder to search in + * @param array $days the days array + * @param string $uid User ID or blank for public shares + * @param TimelineRoot $root the root folder */ - private function preloadDays(array &$days, string $uid, &$folder) + private function preloadDays(array &$days, string $uid, TimelineRoot &$root) { $transforms = $this->getTransformations(false); $preloaded = 0; @@ -263,7 +263,7 @@ class DaysController extends ApiBase if (\count($preloadDayIds) > 0) { $allDetails = $this->timelineQuery->getDay( - $folder, + $root, $uid, $preloadDayIds, $this->isRecursive(), diff --git a/lib/Controller/FacesController.php b/lib/Controller/FacesController.php index a6634ed7..c768129e 100644 --- a/lib/Controller/FacesController.php +++ b/lib/Controller/FacesController.php @@ -49,14 +49,14 @@ class FacesController extends ApiBase } // If this isn't the timeline folder then things aren't going to work - $folder = $this->getRequestFolder(); - if (null === $folder) { + $root = $this->getRequestRoot(); + if ($root->isEmpty()) { return new JSONResponse([], Http::STATUS_NOT_FOUND); } // Run actual query $list = $this->timelineQuery->getFaces( - $folder, + $root, ); return new JSONResponse($list, Http::STATUS_OK); @@ -84,26 +84,32 @@ class FacesController extends ApiBase } // Get folder to search for - $folder = $this->getRequestFolder(); - if (null === $folder) { + $root = $this->getRequestRoot(); + if ($root->isEmpty()) { return new JSONResponse([], Http::STATUS_NOT_FOUND); } // Run actual query - $detections = $this->timelineQuery->getFacePreviewDetection($folder, (int) $id); + $detections = $this->timelineQuery->getFacePreviewDetection($root, (int) $id); if (null === $detections || 0 === \count($detections)) { return new DataResponse([], Http::STATUS_NOT_FOUND); } // Find the first detection that has a preview $preview = null; + $userFolder = $this->rootFolder->getUserFolder($user->getUID()); foreach ($detections as &$detection) { // Get the file (also checks permissions) - $files = $folder->getById($detection['file_id']); + $files = $userFolder->getById($detection['file_id']); if (0 === \count($files) || FileInfo::TYPE_FILE !== $files[0]->getType()) { continue; } + // Check read permission + if (!($files[0]->getPermissions() & \OCP\Constants::PERMISSION_READ)) { + continue; + } + // Get (hopefully cached) preview image try { $preview = $this->previewManager->getPreview($files[0], 2048, 2048, false); diff --git a/lib/Controller/FoldersTrait.php b/lib/Controller/FoldersTrait.php index 847e9fb8..c8a087b0 100644 --- a/lib/Controller/FoldersTrait.php +++ b/lib/Controller/FoldersTrait.php @@ -13,7 +13,7 @@ trait FoldersTrait /** * Get subfolders entry for days response. */ - public function getSubfoldersEntry(Folder &$folder) + public function getSubfoldersEntry(Folder $folder) { // Ugly: get the view of the folder with reflection // This is unfortunately the only way to get the contents of a folder @@ -34,7 +34,7 @@ trait FoldersTrait return [ 'dayid' => \OCA\Memories\Util::$TAG_DAYID_FOLDERS, 'count' => \count($folders), - 'detail' => array_map(function (&$node) use (&$folder) { + 'detail' => array_map(function ($node) use (&$folder) { return [ 'fileid' => $node->getId(), 'name' => $node->getName(), diff --git a/lib/Controller/ImageController.php b/lib/Controller/ImageController.php index ad9b7023..c6cb40bf 100644 --- a/lib/Controller/ImageController.php +++ b/lib/Controller/ImageController.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace OCA\Memories\Controller; +use OCA\Memories\AppInfo\Application; use OCA\Memories\Exif; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; @@ -38,21 +39,19 @@ class ImageController extends ApiBase */ public function info(string $id): JSONResponse { - $user = $this->userSession->getUser(); - if (null === $user) { - return new JSONResponse([], Http::STATUS_PRECONDITION_FAILED); - } - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - - // Check for permissions and get numeric Id - $file = $userFolder->getById((int) $id); - if (0 === \count($file)) { + $file = $this->getUserFile((int) $id); + if (!$file) { return new JSONResponse([], Http::STATUS_NOT_FOUND); } - $file = $file[0]; // Get the image info - $info = $this->timelineQuery->getInfoById($file->getId()); + $basic = false !== $this->request->getParam('basic', false); + $info = $this->timelineQuery->getInfoById($file->getId(), $basic); + + // Get latest exif data if requested + if ($this->request->getParam('current', false)) { + $info['current'] = Exif::getExifFromFile($file); + } return new JSONResponse($info, Http::STATUS_OK); } @@ -60,56 +59,74 @@ class ImageController extends ApiBase /** * @NoAdminRequired * - * Change exif data for one file + * Set the exif data for a file. * * @param string fileid */ - public function edit(string $id): JSONResponse + public function setExif(string $id): JSONResponse { - $user = $this->userSession->getUser(); - if (null === $user) { - return new JSONResponse([], Http::STATUS_PRECONDITION_FAILED); - } - $userFolder = $this->rootFolder->getUserFolder($user->getUID()); - - // Check for permissions and get numeric Id - $file = $userFolder->getById((int) $id); - if (0 === \count($file)) { + $file = $this->getUserFile((int) $id); + if (!$file) { return new JSONResponse([], Http::STATUS_NOT_FOUND); } - $file = $file[0]; // Check if user has permissions - if (!$file->isUpdateable()) { + if (!$file->isUpdateable() || !($file->getPermissions() & \OCP\Constants::PERMISSION_UPDATE)) { return new JSONResponse([], Http::STATUS_FORBIDDEN); } - // Get new date from body - $body = $this->request->getParams(); - if (!isset($body['date'])) { - return new JSONResponse(['message' => 'Missing date'], Http::STATUS_BAD_REQUEST); - } + // Get original file from body + $exif = $this->request->getParam('raw'); + $path = $file->getStorage()->getLocalFile($file->getInternalPath()); - // Make sure the date is valid try { - Exif::parseExifDate($body['date']); - } catch (\Exception $e) { - return new JSONResponse(['message' => $e->getMessage()], Http::STATUS_BAD_REQUEST); - } - - // Update date - try { - $res = Exif::updateExifDate($file, $body['date']); - if (false === $res) { - return new JSONResponse([], Http::STATUS_INTERNAL_SERVER_ERROR); - } + Exif::setExif($path, $exif); } catch (\Exception $e) { return new JSONResponse(['message' => $e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR); } + // Update remote file if not local + if (!$file->getStorage()->isLocal()) { + $file->putContent(fopen($path, 'r')); // closes the handler + } + // Reprocess the file $this->timelineWrite->processFile($file, true); - return $this->info($id); + return new JSONResponse([], Http::STATUS_OK); + } + + /** + * @NoAdminRequired + * + * @NoCSRFRequired + * + * Get a full resolution JPEG for editing from a file. + */ + public function jpeg(string $id) + { + $file = $this->getUserFile((int) $id); + if (!$file) { + return new JSONResponse([], Http::STATUS_NOT_FOUND); + } + + // check if valid image + $mimetype = $file->getMimeType(); + if (!\in_array($mimetype, Application::IMAGE_MIMES, true)) { + return new JSONResponse([], Http::STATUS_FORBIDDEN); + } + + // Get the image + $path = $file->getStorage()->getLocalFile($file->getInternalPath()); + $image = new \Imagick($path); + $image->setImageFormat('jpeg'); + $image->setImageCompressionQuality(95); + $blob = $image->getImageBlob(); + + // Return the image + $response = new Http\DataDisplayResponse($blob, Http::STATUS_OK, ['Content-Type' => $image->getImageMimeType()]); + $response->cacheFor(3600 * 24, false, false); + + return $response; } } diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index 39c9241f..7c2100d1 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -91,10 +91,25 @@ class PageController extends Controller // App version $this->initialState->provideInitialState('version', $this->appManager->getAppInfo('memories')['version']); + // Video configuration + $this->initialState->provideInitialState('notranscode', $this->config->getSystemValue('memories.no_transcode', 'UNSET')); + $policy = new ContentSecurityPolicy(); $policy->addAllowedWorkerSrcDomain("'self'"); $policy->addAllowedScriptDomain("'self'"); + // Video player + $policy->addAllowedWorkerSrcDomain('blob:'); + $policy->addAllowedScriptDomain('blob:'); + $policy->addAllowedMediaDomain('blob:'); + + // Image editor + $policy->addAllowedConnectDomain('data:'); + + // Allow nominatim for metadata + $policy->addAllowedConnectDomain('nominatim.openstreetmap.org'); + $policy->addAllowedFrameDomain('www.openstreetmap.org'); + $response = new TemplateResponse($this->appName, 'main'); $response->setContentSecurityPolicy($policy); diff --git a/lib/Controller/PublicController.php b/lib/Controller/PublicController.php index 1e6eaa9f..4fe47bee 100644 --- a/lib/Controller/PublicController.php +++ b/lib/Controller/PublicController.php @@ -6,6 +6,7 @@ use OCA\Files\Event\LoadSidebar; use OCP\App\IAppManager; use OCP\AppFramework\AuthPublicShareController; use OCP\AppFramework\Http\ContentSecurityPolicy; +use OCP\AppFramework\Http\Template\PublicTemplateResponse; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Services\IInitialState; use OCP\EventDispatcher\IEventDispatcher; @@ -105,11 +106,23 @@ class PublicController extends AuthPublicShareController // App version $this->initialState->provideInitialState('version', $this->appManager->getAppInfo('memories')['version']); + // Video configuration + $this->initialState->provideInitialState('notranscode', $this->config->getSystemValue('memories.no_transcode', 'UNSET')); + $policy = new ContentSecurityPolicy(); $policy->addAllowedWorkerSrcDomain("'self'"); $policy->addAllowedScriptDomain("'self'"); - $response = new TemplateResponse($this->appName, 'main'); + // Video player + $policy->addAllowedWorkerSrcDomain('blob:'); + $policy->addAllowedScriptDomain('blob:'); + $policy->addAllowedMediaDomain('blob:'); + + // Allow nominatim for metadata + $policy->addAllowedConnectDomain('nominatim.openstreetmap.org'); + $policy->addAllowedFrameDomain('www.openstreetmap.org'); + + $response = new PublicTemplateResponse($this->appName, 'main'); $response->setContentSecurityPolicy($policy); return $response; diff --git a/lib/Controller/TagsController.php b/lib/Controller/TagsController.php index d4c3c667..c689253d 100644 --- a/lib/Controller/TagsController.php +++ b/lib/Controller/TagsController.php @@ -46,14 +46,14 @@ class TagsController extends ApiBase } // If this isn't the timeline folder then things aren't going to work - $folder = $this->getRequestFolder(); - if (null === $folder) { + $root = $this->getRequestRoot(); + if ($root->isEmpty()) { return new JSONResponse([], Http::STATUS_NOT_FOUND); } // Run actual query $list = $this->timelineQuery->getTags( - $folder, + $root, ); return new JSONResponse($list, Http::STATUS_OK); @@ -77,8 +77,8 @@ class TagsController extends ApiBase } // If this isn't the timeline folder then things aren't going to work - $folder = $this->getRequestFolder(); - if (null === $folder) { + $root = $this->getRequestRoot(); + if ($root->isEmpty()) { return new JSONResponse([], Http::STATUS_NOT_FOUND); } @@ -88,7 +88,7 @@ class TagsController extends ApiBase // Run actual query $list = $this->timelineQuery->getTagPreviews( $tagName, - $folder, + $root, ); return new JSONResponse($list, Http::STATUS_OK); diff --git a/lib/Controller/VideoController.php b/lib/Controller/VideoController.php new file mode 100644 index 00000000..9f43bd39 --- /dev/null +++ b/lib/Controller/VideoController.php @@ -0,0 +1,154 @@ + + * @author Varun Patil + * @license AGPL-3.0-or-later + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace OCA\Memories\Controller; + +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataDisplayResponse; +use OCP\AppFramework\Http\JSONResponse; + +class VideoController extends ApiBase +{ + /** + * @NoAdminRequired + * + * @NoCSRFRequired + * + * Transcode a video to HLS by proxy + * + * @return JSONResponse an empty JSONResponse with respective http status code + */ + public function transcode(string $client, string $fileid, string $profile): Http\Response + { + $user = $this->userSession->getUser(); + if (null === $user) { + return new JSONResponse([], Http::STATUS_PRECONDITION_FAILED); + } + + // Make sure not running in read-only mode + if (false !== $this->config->getSystemValue('memories.no_transcode', 'UNSET')) { + return new JSONResponse(['message' => 'Transcoding disabled'], Http::STATUS_FORBIDDEN); + } + + // Check client identifier is 8 characters or more + if (\strlen($client) < 8) { + return new JSONResponse(['message' => 'Invalid client identifier'], Http::STATUS_BAD_REQUEST); + } + + // Get file + $files = $this->rootFolder->getUserFolder($user->getUID())->getById($fileid); + if (0 === \count($files)) { + return new JSONResponse(['message' => 'File not found'], Http::STATUS_NOT_FOUND); + } + $file = $files[0]; + + if (!($file->getPermissions() & \OCP\Constants::PERMISSION_READ)) { + return new JSONResponse(['message' => 'File not readable'], Http::STATUS_FORBIDDEN); + } + + // Local files only for now + if (!$file->getStorage()->isLocal()) { + return new JSONResponse(['message' => 'External storage not supported'], Http::STATUS_FORBIDDEN); + } + + // Get file path + $path = $file->getStorage()->getLocalFile($file->getInternalPath()); + if (!$path || !file_exists($path)) { + return new JSONResponse(['message' => 'File not found'], Http::STATUS_NOT_FOUND); + } + + // Check if file starts with temp dir + $tmpDir = sys_get_temp_dir(); + if (0 === strpos($path, $tmpDir)) { + return new JSONResponse(['message' => 'File is in temp dir!'], Http::STATUS_NOT_FOUND); + } + + // Make upstream request + [$data, $contentType, $returnCode] = $this->getUpstream($client, $path, $profile); + + // If status code was 0, it's likely the server is down + // Make one attempt to start if we can't find the process + if (0 === $returnCode) { + $transcoder = $this->config->getSystemValue('memories.transcoder', false); + if (!$transcoder) { + return new JSONResponse(['message' => 'Transcoder not configured'], Http::STATUS_INTERNAL_SERVER_ERROR); + } + + // Make transcoder executable + if (!is_executable($transcoder)) { + chmod($transcoder, 0755); + } + + // Check for environment variables + $env = ''; + + // QSV with VAAPI + $vaapi = $this->config->getSystemValue('memories.qsv', false); + if ($vaapi) { + $env .= 'VAAPI=1 '; + } + + // Paths + $ffmpegPath = $this->config->getSystemValue('memories.ffmpeg_path', 'ffmpeg'); + $ffprobePath = $this->config->getSystemValue('memories.ffprobe_path', 'ffprobe'); + $tmpPath = $this->config->getSystemValue('memories.tmp_path', sys_get_temp_dir()); + $env .= "FFMPEG='{$ffmpegPath}' FFPROBE='{$ffprobePath}' GOVOD_TEMPDIR='{$tmpPath}/go-vod' "; + + // Check if already running + exec("pkill {$transcoder}"); + shell_exec("{$env} nohup {$transcoder} > {$tmpPath}/go-vod.log 2>&1 & > /dev/null"); + + // wait for 1s and try again + sleep(1); + [$data, $contentType, $returnCode] = $this->getUpstream($client, $path, $profile); + } + + // Check data was received + if ($returnCode >= 400 || false === $data) { + return new JSONResponse(['message' => 'Transcode failed'], Http::STATUS_INTERNAL_SERVER_ERROR); + } + + // Create and send response + $response = new DataDisplayResponse($data, Http::STATUS_OK, [ + 'Content-Type' => $contentType, + ]); + $response->cacheFor(0, false, false); + + return $response; + } + + private function getUpstream($client, $path, $profile) + { + $path = rawurlencode($path); + $ch = curl_init("http://127.0.0.1:47788/{$client}{$path}/{$profile}"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + curl_setopt($ch, CURLOPT_HEADER, 0); + $data = curl_exec($ch); + $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); + $returnCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + return [$data, $contentType, $returnCode]; + } +} diff --git a/lib/Db/TimelineQuery.php b/lib/Db/TimelineQuery.php index 8974e541..54d33574 100644 --- a/lib/Db/TimelineQuery.php +++ b/lib/Db/TimelineQuery.php @@ -48,14 +48,18 @@ class TimelineQuery { } - public function getInfoById(int $id): array + public function getInfoById(int $id, bool $basic): array { $qb = $this->connection->getQueryBuilder(); - $qb->select('fileid', 'dayid', 'datetaken') + $qb->select('fileid', 'dayid', 'datetaken', 'w', 'h') ->from('memories') ->where($qb->expr()->eq('fileid', $qb->createNamedParameter($id, \PDO::PARAM_INT))) ; + if (!$basic) { + $qb->addSelect('exif'); + } + $result = $qb->executeQuery(); $row = $result->fetch(); $result->closeCursor(); @@ -68,10 +72,21 @@ class TimelineQuery } catch (\Throwable $e) { } + $exif = []; + if (!$basic && !empty($row['exif'])) { + try { + $exif = json_decode($row['exif'], true); + } catch (\Throwable $e) { + } + } + return [ 'fileid' => (int) $row['fileid'], 'dayid' => (int) $row['dayid'], 'datetaken' => $utcTs, + 'w' => (int) $row['w'], + 'h' => (int) $row['h'], + 'exif' => $exif, ]; } } diff --git a/lib/Db/TimelineQueryDays.php b/lib/Db/TimelineQueryDays.php index 8e5c2bb9..d1f58ffc 100644 --- a/lib/Db/TimelineQueryDays.php +++ b/lib/Db/TimelineQueryDays.php @@ -5,27 +5,77 @@ declare(strict_types=1); namespace OCA\Memories\Db; use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\Files\Folder; use OCP\IDBConnection; -const CTE_FOLDERS = // CTE to get all folders recursively in the given top folder - 'WITH RECURSIVE *PREFIX*cte_folders(fileid) AS ( +const CTE_FOLDERS = // CTE to get all folders recursively in the given top folders excluding archive + 'WITH RECURSIVE *PREFIX*cte_folders_all(fileid, rootid) AS ( SELECT - f.fileid + f.fileid, + f.fileid AS rootid FROM *PREFIX*filecache f WHERE - f.fileid = :topFolderId + f.fileid IN (:topFolderIds) UNION ALL SELECT - f.fileid + f.fileid, + c.rootid + FROM + *PREFIX*filecache f + INNER JOIN *PREFIX*cte_folders_all c + ON (f.parent = c.fileid + AND f.mimetype = (SELECT `id` FROM `*PREFIX*mimetypes` WHERE `mimetype` = \'httpd/unix-directory\') + AND f.name <> \'.archive\' + ) + ), *PREFIX*cte_folders AS ( + SELECT + fileid, + MIN(rootid) AS rootid + FROM + *PREFIX*cte_folders_all + GROUP BY + fileid + )'; + +const CTE_FOLDERS_ARCHIVE = // CTE to get all archive folders recursively in the given top folders + 'WITH RECURSIVE *PREFIX*cte_folders_all(fileid, name, rootid) AS ( + SELECT + f.fileid, + f.name, + f.fileid AS rootid + FROM + *PREFIX*filecache f + WHERE + f.fileid IN (:topFolderIds) + UNION ALL + SELECT + f.fileid, + f.name, + c.rootid + FROM + *PREFIX*filecache f + INNER JOIN *PREFIX*cte_folders_all c + ON (f.parent = c.fileid + AND f.mimetype = (SELECT `id` FROM `*PREFIX*mimetypes` WHERE `mimetype` = \'httpd/unix-directory\') + ) + ), *PREFIX*cte_folders(fileid, rootid) AS ( + SELECT + cfa.fileid, + MIN(cfa.rootid) AS rootid + FROM + *PREFIX*cte_folders_all cfa + WHERE + cfa.name = \'.archive\' + GROUP BY + cfa.fileid + UNION ALL + SELECT + f.fileid, + c.rootid FROM *PREFIX*filecache f INNER JOIN *PREFIX*cte_folders c - ON (f.parent = c.fileid - AND f.mimetype = (SELECT `id` FROM `*PREFIX*mimetypes` WHERE `mimetype` = \'httpd/unix-directory\') - AND f.fileid <> :excludedFolderId - ) + ON (f.parent = c.fileid) )'; trait TimelineQueryDays @@ -35,15 +85,15 @@ trait TimelineQueryDays /** * Get the days response from the database for the timeline. * - * @param null|Folder $folder The folder to get the days from - * @param bool $recursive Whether to get the days recursively - * @param bool $archive Whether to get the days only from the archive folder - * @param array $queryTransforms An array of query transforms to apply to the query + * @param TimelineRoot $root The root to get the days from + * @param bool $recursive Whether to get the days recursively + * @param bool $archive Whether to get the days only from the archive folder + * @param array $queryTransforms An array of query transforms to apply to the query * * @return array The days response */ public function getDays( - &$folder, + TimelineRoot &$root, string $uid, bool $recursive, bool $archive, @@ -56,7 +106,7 @@ trait TimelineQueryDays $query->select('m.dayid', $count) ->from('memories', 'm') ; - $query = $this->joinFilecache($query, $folder, $recursive, $archive); + $query = $this->joinFilecache($query, $root, $recursive, $archive); // Group and sort by dayid $query->groupBy('m.dayid') @@ -76,18 +126,18 @@ trait TimelineQueryDays /** * Get the day response from the database for the timeline. * - * @param null|Folder $folder The folder to get the day from - * @param string $uid The user id - * @param int[] $day_ids The day ids to fetch - * @param bool $recursive If the query should be recursive - * @param bool $archive If the query should include only the archive folder - * @param array $queryTransforms The query transformations to apply - * @param mixed $day_ids + * @param TimelineRoot $root The root to get the day from + * @param string $uid The user id + * @param int[] $day_ids The day ids to fetch + * @param bool $recursive If the query should be recursive + * @param bool $archive If the query should include only the archive folder + * @param array $queryTransforms The query transformations to apply + * @param mixed $day_ids * * @return array An array of day responses */ public function getDay( - &$folder, + TimelineRoot &$root, string $uid, $day_ids, bool $recursive, @@ -102,14 +152,19 @@ trait TimelineQueryDays // We don't actually use m.datetaken here, but postgres // needs that all fields in ORDER BY are also in SELECT // when using DISTINCT on selected fields - $query->select($fileid, 'm.isvideo', 'm.datetaken', 'm.dayid', 'm.w', 'm.h') + $query->select($fileid, 'm.isvideo', 'm.video_duration', 'm.datetaken', 'm.dayid', 'm.w', 'm.h') ->from('memories', 'm') ; // JOIN with filecache for existing files - $query = $this->joinFilecache($query, $folder, $recursive, $archive); + $query = $this->joinFilecache($query, $root, $recursive, $archive); $query->addSelect('f.etag', 'f.path', 'f.name AS basename'); + // SELECT rootid if not a single folder + if ($recursive && !$root->isEmpty()) { + $query->addSelect('cte_f.rootid'); + } + // JOIN with mimetypes to get the mimetype $query->join('f', 'mimetypes', 'mimetypes', $query->expr()->eq('f.mimetype', 'mimetypes.id')); $query->addSelect('mimetypes.mimetype'); @@ -136,7 +191,7 @@ trait TimelineQueryDays $rows = $cursor->fetchAll(); $cursor->closeCursor(); - return $this->processDay($rows, $uid, $folder); + return $this->processDay($rows, $uid, $root); } /** @@ -156,37 +211,55 @@ trait TimelineQueryDays /** * Process the single day response. - * - * @param array $day - * @param string $uid User or blank if not logged in - * @param null|Folder $folder */ - private function processDay(&$day, $uid, $folder) + private function processDay(array &$day, string $uid, TimelineRoot &$root) { - $basePath = '#__#__#'; - $davPath = ''; - if (null !== $folder) { + /** + * Path entry in database for folder. + * We need to splice this from the start of the file path. + */ + $internalPaths = []; + + /** + * DAV paths for the folders. + * We need to prefix this to the start of the file path. + */ + $davPaths = []; + + /** + * The root folder id for the folder. + * We fallback to this if rootid is not found. + */ + $defaultRootId = 0; + + if (!$root->isEmpty()) { + // Get root id of the top folder + $defaultRootId = $root->getOneId(); + // No way to get the internal path from the folder $query = $this->connection->getQueryBuilder(); - $query->select('path') + $query->select('fileid', 'path') ->from('filecache') - ->where($query->expr()->eq('fileid', $query->createNamedParameter($folder->getId(), IQueryBuilder::PARAM_INT))) + ->where($query->expr()->in('fileid', $query->createNamedParameter($root->getIds(), IQueryBuilder::PARAM_INT_ARRAY))) ; - $path = $query->executeQuery()->fetchOne(); - $basePath = $path ?: $basePath; + $paths = $query->executeQuery()->fetchAll(); + foreach ($paths as &$path) { + $fileid = (int) $path['fileid']; + $internalPaths[$fileid] = $path['path']; - // Get user facing path - // getPath looks like /user/files/... but we want /files/user/... - // Split at / and swap these - // For public shares, we just give the relative path - if (!empty($uid)) { - $actualPath = $folder->getPath(); - $actualPath = explode('/', $actualPath); - if (\count($actualPath) >= 3) { - $tmp = $actualPath[1]; - $actualPath[1] = $actualPath[2]; - $actualPath[2] = $tmp; - $davPath = implode('/', $actualPath); + // Get DAV path. + // getPath looks like /user/files/... but we want /files/user/... + // Split at / and swap these + // For public shares, we just give the relative path + if (!empty($uid) && ($actualPath = $root->getFolderPath($fileid))) { + $actualPath = explode('/', $actualPath); + if (\count($actualPath) >= 3) { + $tmp = $actualPath[1]; + $actualPath[1] = $actualPath[2]; + $actualPath[2] = $tmp; + $davPath = implode('/', $actualPath); + $davPaths[$fileid] = \OCA\Memories\Exif::removeExtraSlash('/'.$davPath.'/'); + } } } } @@ -198,11 +271,12 @@ trait TimelineQueryDays // Convert field types $row['fileid'] = (int) $row['fileid']; $row['isvideo'] = (int) $row['isvideo']; + $row['video_duration'] = (int) $row['video_duration']; $row['dayid'] = (int) $row['dayid']; $row['w'] = (int) $row['w']; $row['h'] = (int) $row['h']; if (!$row['isvideo']) { - unset($row['isvideo']); + unset($row['isvideo'], $row['video_duration']); } if ($row['categoryid']) { $row['isfavorite'] = 1; @@ -211,9 +285,14 @@ trait TimelineQueryDays // Check if path exists and starts with basePath and remove if (isset($row['path']) && !empty($row['path'])) { + $rootId = \array_key_exists('rootid', $row) ? $row['rootid'] : $defaultRootId; + $basePath = $internalPaths[$rootId] ?? '#__#'; + $davPath = $davPaths[$rootId] ?: ''; + if (0 === strpos($row['path'], $basePath)) { $row['filename'] = $davPath.substr($row['path'], \strlen($basePath)); } + unset($row['path']); } @@ -230,9 +309,14 @@ trait TimelineQueryDays $params = $query->getParameters(); $types = $query->getParameterTypes(); + // Get SQL + $CTE_SQL = \array_key_exists('cteFoldersArchive', $params) && $params['cteFoldersArchive'] + ? CTE_FOLDERS_ARCHIVE + : CTE_FOLDERS; + // Add WITH clause if needed if (false !== strpos($sql, 'cte_folders')) { - $sql = CTE_FOLDERS.' '.$sql; + $sql = $CTE_SQL.' '.$sql; } return $this->connection->executeQuery($sql, $params, $types); @@ -243,53 +327,31 @@ trait TimelineQueryDays */ private function addSubfolderJoinParams( IQueryBuilder &$query, - Folder &$folder, + TimelineRoot &$root, bool $archive ) { - // Query parameters, set at the end - $topFolderId = $folder->getId(); - $excludedFolderId = -1; - - /** @var Folder Archive folder if it exists */ - $archiveFolder = null; - - try { - $archiveFolder = $folder->get('.archive/'); - } catch (\OCP\Files\NotFoundException $e) { - } - - if (!$archive) { - // Exclude archive folder - if ($archiveFolder) { - $excludedFolderId = $archiveFolder->getId(); - } - } else { - // Only include archive folder - $topFolderId = $archiveFolder ? $archiveFolder->getId() : -1; - } - // Add query parameters - $query->setParameter('topFolderId', $topFolderId, IQueryBuilder::PARAM_INT); - $query->setParameter('excludedFolderId', $excludedFolderId, IQueryBuilder::PARAM_INT); + $query->setParameter('topFolderIds', $root->getIds(), IQueryBuilder::PARAM_INT_ARRAY); + $query->setParameter('cteFoldersArchive', $archive, IQueryBuilder::PARAM_BOOL); } /** * Inner join with oc_filecache. * * @param IQueryBuilder $query Query builder - * @param null|Folder $folder Either the top folder or null for all + * @param TimelineRoot $root Either the top folder or null for all * @param bool $recursive Whether to get the days recursively * @param bool $archive Whether to get the days only from the archive folder */ private function joinFilecache( IQueryBuilder &$query, - &$folder, + TimelineRoot &$root, bool $recursive, bool $archive ) { // Join with memories $baseOp = $query->expr()->eq('f.fileid', 'm.fileid'); - if (null === $folder) { + if ($root->isEmpty()) { return $query->innerJoin('m', 'filecache', 'f', $baseOp); } @@ -297,11 +359,11 @@ trait TimelineQueryDays $pathOp = null; if ($recursive) { // Join with folders CTE - $this->addSubfolderJoinParams($query, $folder, $archive); + $this->addSubfolderJoinParams($query, $root, $archive); $query->innerJoin('f', 'cte_folders', 'cte_f', $query->expr()->eq('f.parent', 'cte_f.fileid')); } else { // If getting non-recursively folder only check for parent - $pathOp = $query->expr()->eq('f.parent', $query->createNamedParameter($folder->getId(), IQueryBuilder::PARAM_INT)); + $pathOp = $query->expr()->eq('f.parent', $query->createNamedParameter($root->getOneId(), IQueryBuilder::PARAM_INT)); } return $query->innerJoin('m', 'filecache', 'f', $query->expr()->andX( diff --git a/lib/Db/TimelineQueryFaces.php b/lib/Db/TimelineQueryFaces.php index ed01fd2e..4cf6f6f2 100644 --- a/lib/Db/TimelineQueryFaces.php +++ b/lib/Db/TimelineQueryFaces.php @@ -47,7 +47,7 @@ trait TimelineQueryFaces ); } - public function getFaces(Folder $folder) + public function getFaces(TimelineRoot &$root) { $query = $this->connection->getQueryBuilder(); @@ -62,7 +62,7 @@ trait TimelineQueryFaces $query->innerJoin('rfd', 'memories', 'm', $query->expr()->eq('m.fileid', 'rfd.file_id')); // WHERE these photos are in the user's requested folder recursively - $query = $this->joinFilecache($query, $folder, true, false); + $query = $this->joinFilecache($query, $root, true, false); // GROUP by ID of face cluster $query->groupBy('rfc.id'); @@ -87,7 +87,7 @@ trait TimelineQueryFaces return $faces; } - public function getFacePreviewDetection(Folder &$folder, int $id) + public function getFacePreviewDetection(TimelineRoot &$root, int $id) { $query = $this->connection->getQueryBuilder(); @@ -109,7 +109,7 @@ trait TimelineQueryFaces $query->innerJoin('rfd', 'memories', 'm', $query->expr()->eq('m.fileid', 'rfd.file_id')); // WHERE these photos are in the user's requested folder recursively - $query = $this->joinFilecache($query, $folder, true, false); + $query = $this->joinFilecache($query, $root, true, false); // LIMIT results $query->setMaxResults(15); diff --git a/lib/Db/TimelineQueryFolders.php b/lib/Db/TimelineQueryFolders.php index 26910ece..347e7e64 100644 --- a/lib/Db/TimelineQueryFolders.php +++ b/lib/Db/TimelineQueryFolders.php @@ -19,7 +19,9 @@ trait TimelineQueryFolders $query->select('f.fileid', 'f.etag')->from('memories', 'm'); // WHERE these photos are in the user's requested folder recursively - $query = $this->joinFilecache($query, $folder, true, false); + $root = new TimelineRoot(); + $root->addFolder($folder); + $query = $this->joinFilecache($query, $root, true, false); // ORDER descending by fileid $query->orderBy('f.fileid', 'DESC'); diff --git a/lib/Db/TimelineQueryTags.php b/lib/Db/TimelineQueryTags.php index 8a3b9bfd..4c4224eb 100644 --- a/lib/Db/TimelineQueryTags.php +++ b/lib/Db/TimelineQueryTags.php @@ -38,7 +38,7 @@ trait TimelineQueryTags )); } - public function getTags(Folder $folder) + public function getTags(TimelineRoot &$root) { $query = $this->connection->getQueryBuilder(); @@ -58,7 +58,7 @@ trait TimelineQueryTags $query->innerJoin('stom', 'memories', 'm', $query->expr()->eq('m.objectid', 'stom.objectid')); // WHERE these photos are in the user's requested folder recursively - $query = $this->joinFilecache($query, $folder, true, false); + $query = $this->joinFilecache($query, $root, true, false); // GROUP and ORDER by tag name $query->groupBy('st.id'); @@ -78,7 +78,7 @@ trait TimelineQueryTags return $tags; } - public function getTagPreviews(string $tagName, Folder &$folder) + public function getTagPreviews(string $tagName, TimelineRoot &$root) { $query = $this->connection->getQueryBuilder(); $tagId = $this->getSystemTagId($query, $tagName); @@ -99,7 +99,7 @@ trait TimelineQueryTags $query->innerJoin('stom', 'memories', 'm', $query->expr()->eq('m.objectid', 'stom.objectid')); // WHERE these photos are in the user's requested folder recursively - $query = $this->joinFilecache($query, $folder, true, false); + $query = $this->joinFilecache($query, $root, true, false); // MAX 4 $query->setMaxResults(4); diff --git a/lib/Db/TimelineRoot.php b/lib/Db/TimelineRoot.php new file mode 100644 index 00000000..fc6b8f52 --- /dev/null +++ b/lib/Db/TimelineRoot.php @@ -0,0 +1,84 @@ +getPath(); + + if (!$folder instanceof Folder) { + throw new \Exception("Not a folder: {$folderPath}"); + } + + if (!($folder->getPermissions() & \OCP\Constants::PERMISSION_READ)) { + throw new \Exception("Folder not readable: {$folderPath}"); + } + + // Add top level folder + $id = $folder->getId(); + $this->folders[$id] = $folder; + $this->folderPaths[$id] = $folderPath; + } + + // Add mountpoints recursively + public function addMountPoints() + { + $mp = []; + foreach ($this->folderPaths as $id => $folderPath) { + $mounts = \OC\Files\Filesystem::getMountManager()->findIn($folderPath); + foreach ($mounts as &$mount) { + $id = $mount->getStorageRootId(); + $path = $mount->getMountPoint(); + $mp[$id] = $path; + } + } + $this->folderPaths += $mp; + } + + public function getFolderPath(int $id) + { + return $this->folderPaths[$id]; + } + + public function getIds() + { + return array_keys($this->folderPaths); + } + + public function getOneId() + { + return array_key_first($this->folders); + } + + public function getFolder(int $id) + { + return $this->folders[$id]; + } + + public function isEmpty() + { + return empty($this->folderPaths); + } +} diff --git a/lib/Db/TimelineWrite.php b/lib/Db/TimelineWrite.php index 20c11b07..a1eceba7 100644 --- a/lib/Db/TimelineWrite.php +++ b/lib/Db/TimelineWrite.php @@ -97,6 +97,27 @@ class TimelineWrite $dateTaken = gmdate('Y-m-d H:i:s', $dateTaken); [$w, $h] = Exif::getDimensions($exif); + // Video parameters + $videoDuration = 0; + if ($isvideo) { + $videoDuration = round($exif['Duration'] ?? $exif['TrackDuration'] ?? 0); + } + + // Truncate any fields >2048 chars + foreach ($exif as $key => &$value) { + if (\is_string($value) && \strlen($value) > 2048) { + $exif[$key] = substr($value, 0, 2048); + } + } + + // Store JSON string + $exifJson = json_encode($exif); + + // Store error if data > 64kb + if (\strlen($exifJson) > 65535) { + $exifJson = json_encode(['error' => 'Exif data too large']); + } + if ($prevRow) { // Update existing row // No need to set objectid again @@ -105,8 +126,10 @@ class TimelineWrite ->set('datetaken', $query->createNamedParameter($dateTaken, IQueryBuilder::PARAM_STR)) ->set('mtime', $query->createNamedParameter($mtime, IQueryBuilder::PARAM_INT)) ->set('isvideo', $query->createNamedParameter($isvideo, IQueryBuilder::PARAM_INT)) + ->set('video_duration', $query->createNamedParameter($videoDuration, IQueryBuilder::PARAM_INT)) ->set('w', $query->createNamedParameter($w, IQueryBuilder::PARAM_INT)) ->set('h', $query->createNamedParameter($h, IQueryBuilder::PARAM_INT)) + ->set('exif', $query->createNamedParameter($exifJson, IQueryBuilder::PARAM_STR)) ->where($query->expr()->eq('fileid', $query->createNamedParameter($fileId, IQueryBuilder::PARAM_INT))) ; $query->executeStatement(); @@ -121,8 +144,10 @@ class TimelineWrite 'datetaken' => $query->createNamedParameter($dateTaken, IQueryBuilder::PARAM_STR), 'mtime' => $query->createNamedParameter($mtime, IQueryBuilder::PARAM_INT), 'isvideo' => $query->createNamedParameter($isvideo, IQueryBuilder::PARAM_INT), + 'video_duration' => $query->createNamedParameter($videoDuration, IQueryBuilder::PARAM_INT), 'w' => $query->createNamedParameter($w, IQueryBuilder::PARAM_INT), 'h' => $query->createNamedParameter($h, IQueryBuilder::PARAM_INT), + 'exif' => $query->createNamedParameter($exifJson, IQueryBuilder::PARAM_STR), ]) ; $query->executeStatement(); diff --git a/lib/Exif.php b/lib/Exif.php index fd16becd..ebef819b 100644 --- a/lib/Exif.php +++ b/lib/Exif.php @@ -109,7 +109,12 @@ class Exif throw new \Exception('Failed to get local file path'); } - return self::getExifFromLocalPath($path); + $exif = self::getExifFromLocalPath($path); + + // We need to remove blacklisted fields to prevent leaking info + unset($exif['SourceFile'], $exif['FileName'], $exif['ExifToolVersion'], $exif['Directory'], $exif['FileSize'], $exif['FileModifyDate'], $exif['FileAccessDate'], $exif['FileInodeChangeDate'], $exif['FilePermissions'], $exif['ThumbnailImage']); + + return $exif; } /** Get exif data as a JSON object from a local file path */ @@ -225,29 +230,35 @@ class Exif } /** - * Update exif date using exiftool. + * Set exif data using raw json. * - * @param string $newDate formatted in standard Exif format (YYYY:MM:DD HH:MM:SS) + * @param string $path to local file + * @param array $data exif data + * + * @throws \Exception on failure */ - public static function updateExifDate(File &$file, string $newDate) + public static function setExif(string &$path, array &$data) { - // Don't want to mess these up, definitely - if ($file->isEncrypted()) { - throw new \Exception('Cannot update exif date on encrypted files'); - } + $data['SourceFile'] = $path; + $raw = json_encode([$data]); + $cmd = array_merge(self::getExiftool(), ['-json=-', $path]); + $proc = proc_open($cmd, [ + 0 => ['pipe', 'r'], + 1 => ['pipe', 'w'], + 2 => ['pipe', 'w'], + ], $pipes); - // Get path to local (copy) of the file - $path = $file->getStorage()->getLocalFile($file->getInternalPath()); - if (!\is_string($path)) { - throw new \Exception('Failed to get local file path'); - } + fwrite($pipes[0], $raw); + fclose($pipes[0]); - // Update exif data - self::updateExifDateForLocalFile($path, $newDate); + $stdout = self::readOrTimeout($pipes[1], 30000); + fclose($pipes[1]); + fclose($pipes[2]); + proc_terminate($proc); + if (false !== strpos($stdout, 'error')) { + error_log("Exiftool error: {$stdout}"); - // Update remote file if not local - if (!$file->getStorage()->isLocal()) { - $file->putContent(fopen($path, 'r')); // closes the handler + throw new \Exception('Could not set exif data: '.$stdout); } } @@ -269,28 +280,13 @@ class Exif } // Detect architecture - $arch = null; - $uname = php_uname('m'); - if (false !== stripos($uname, 'aarch64') || false !== stripos($uname, 'arm64')) { - $arch = 'aarch64'; - } elseif (false !== stripos($uname, 'x86_64') || false !== stripos($uname, 'amd64')) { - $arch = 'amd64'; - } - - // Detect glibc or musl - $libc = null; - if ($ldd = shell_exec('ldd --version 2>&1')) { - if (false !== stripos($ldd, 'musl')) { - $libc = 'musl'; - } elseif (false !== stripos($ldd, 'glibc')) { - $libc = 'glibc'; - } - } + $arch = $noLocal ? null : \OCA\Memories\Util::getArch(); + $libc = $noLocal ? null : \OCA\Memories\Util::getLibc(); // Get static binary if available if ($arch && $libc && !$noLocal) { // get target file path - $path = __DIR__."/../exiftool-bin/exiftool-{$arch}-{$libc}"; + $path = realpath(__DIR__."/../exiftool-bin/exiftool-{$arch}-{$libc}"); // check if file exists if (file_exists($path)) { @@ -372,7 +368,7 @@ class Exif private static function getExifFromLocalPathWithStaticProc(string &$path) { - fwrite(self::$staticPipes[0], "{$path}\n-json\n-api\nQuickTimeUTC=1\n-n\n-execute\n"); + fwrite(self::$staticPipes[0], "{$path}\n-U\n-json\n--b\n-api\nQuickTimeUTC=1\n-n\n-execute\n"); fflush(self::$staticPipes[0]); $readyToken = "\n{ready}\n"; @@ -394,7 +390,7 @@ class Exif private static function getExifFromLocalPathWithSeparateProc(string &$path) { $pipes = []; - $proc = proc_open(array_merge(self::getExiftool(), ['-api', 'QuickTimeUTC=1', '-n', '-json', $path]), [ + $proc = proc_open(array_merge(self::getExiftool(), ['-api', 'QuickTimeUTC=1', '-n', '-U', '-json', '--b', $path]), [ 1 => ['pipe', 'w'], 2 => ['pipe', 'w'], ], $pipes); @@ -425,29 +421,4 @@ class Exif return $json[0]; } - - /** - * Update exif date using exiftool for a local file. - * - * @param string $newDate formatted in standard Exif format (YYYY:MM:DD HH:MM:SS) - * - * @throws \Exception on failure - */ - private static function updateExifDateForLocalFile(string $path, string $newDate) - { - $cmd = array_merge(self::getExiftool(), ['-api', 'QuickTimeUTC=1', '-overwrite_original', '-DateTimeOriginal='.$newDate, $path]); - $proc = proc_open($cmd, [ - 1 => ['pipe', 'w'], - 2 => ['pipe', 'w'], - ], $pipes); - $stdout = self::readOrTimeout($pipes[1], 300000); - fclose($pipes[1]); - fclose($pipes[2]); - proc_terminate($proc); - if (false !== strpos($stdout, 'error')) { - error_log("Exiftool error: {$stdout}"); - - throw new \Exception('Could not update exif date: '.$stdout); - } - } } diff --git a/lib/Migration/Repair.php b/lib/Migration/Repair.php new file mode 100644 index 00000000..ddfb93b3 --- /dev/null +++ b/lib/Migration/Repair.php @@ -0,0 +1,31 @@ +config = $config; + } + + public function getName(): string + { + return 'Repair steps for Memories'; + } + + public function run(IOutput $output): void + { + // kill any instances of go-transcode and go-vod + shell_exec('pkill go-transcode'); + shell_exec('pkill go-vod'); + } +} diff --git a/lib/Migration/Version400604Date20221107205439.php b/lib/Migration/Version400604Date20221107205439.php new file mode 100644 index 00000000..c978652f --- /dev/null +++ b/lib/Migration/Version400604Date20221107205439.php @@ -0,0 +1,67 @@ + + * @author Your name + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace OCA\Memories\Migration; + +use OCP\DB\ISchemaWrapper; +use OCP\Migration\IOutput; +use OCP\Migration\SimpleMigrationStep; + +/** + * Auto-generated migration step: Please modify to your needs! + */ +class Version400604Date20221107205439 extends SimpleMigrationStep +{ + /** + * @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + */ + public function preSchemaChange(IOutput $output, \Closure $schemaClosure, array $options): void + { + } + + /** + * @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + */ + public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options): ?ISchemaWrapper + { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + + $table = $schema->getTable('memories'); + + $table->addColumn('exif', 'text', [ + 'notnull' => false, + 'length' => 65535, + 'default' => '', + ]); + + return $schema; + } + + /** + * @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + */ + public function postSchemaChange(IOutput $output, \Closure $schemaClosure, array $options): void + { + } +} diff --git a/lib/Migration/Version400700Date20221110030909.php b/lib/Migration/Version400700Date20221110030909.php new file mode 100644 index 00000000..4420c82b --- /dev/null +++ b/lib/Migration/Version400700Date20221110030909.php @@ -0,0 +1,67 @@ + + * @author Your name + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace OCA\Memories\Migration; + +use OCP\DB\ISchemaWrapper; +use OCP\DB\Types; +use OCP\Migration\IOutput; +use OCP\Migration\SimpleMigrationStep; + +/** + * Auto-generated migration step: Please modify to your needs! + */ +class Version400700Date20221110030909 extends SimpleMigrationStep +{ + /** + * @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + */ + public function preSchemaChange(IOutput $output, \Closure $schemaClosure, array $options): void + { + } + + /** + * @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + */ + public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options): ?ISchemaWrapper + { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + + $table = $schema->getTable('memories'); + + $table->addColumn('video_duration', Types::INTEGER, [ + 'notnull' => true, + 'default' => 0, + ]); + + return $schema; + } + + /** + * @param \Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + */ + public function postSchemaChange(IOutput $output, \Closure $schemaClosure, array $options): void + { + } +} diff --git a/lib/Util.php b/lib/Util.php index b7d078fd..2ddd9cb6 100644 --- a/lib/Util.php +++ b/lib/Util.php @@ -4,9 +4,6 @@ declare(strict_types=1); namespace OCA\Memories; -use OCA\Memories\AppInfo\Application; -use OCP\IConfig; - class Util { public static $TAG_DAYID_START = -(1 << 30); // the world surely didn't exist @@ -15,16 +12,36 @@ class Util public static $ARCHIVE_FOLDER = '.archive'; /** - * Get the path to the user's configured photos directory. + * Get host CPU architecture (amd64 or aarch64). */ - public static function getPhotosPath(IConfig &$config, string $userId) + public static function getArch() { - $p = $config->getUserValue($userId, Application::APPNAME, 'timelinePath', ''); - if (empty($p)) { - return '/Photos/'; + $uname = php_uname('m'); + if (false !== stripos($uname, 'aarch64') || false !== stripos($uname, 'arm64')) { + return 'aarch64'; + } + if (false !== stripos($uname, 'x86_64') || false !== stripos($uname, 'amd64')) { + return 'amd64'; } - return $p; + return null; + } + + /** + * Get the libc type for host (glibc or musl). + */ + public static function getLibc() + { + if ($ldd = shell_exec('ldd --version 2>&1')) { + if (false !== stripos($ldd, 'musl')) { + return 'musl'; + } + if (false !== stripos($ldd, 'glibc')) { + return 'glibc'; + } + } + + return null; } /** diff --git a/package-lock.json b/package-lock.json index b87a3720..961679c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,8 +19,10 @@ "moment": "^2.29.4", "path-posix": "^1.0.0", "photoswipe": "^5.3.3", + "plyr": "^3.7.2", "reflect-metadata": "^0.1.13", "video.js": "^7.20.3", + "videojs-contrib-quality-levels": "^2.2.0", "vue": "^2.7.10", "vue-class-component": "^7.2.6", "vue-material-design-icons": "^5.1.2", @@ -3983,6 +3985,11 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "node_modules/custom-event-polyfill": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz", + "integrity": "sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==" + }, "node_modules/date-format-parse": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/date-format-parse/-/date-format-parse-0.2.7.tgz", @@ -6245,6 +6252,11 @@ "node": ">=8.9.0" } }, + "node_modules/loadjs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loadjs/-/loadjs-4.2.0.tgz", + "integrity": "sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA==" + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -7100,6 +7112,18 @@ "node": ">=14" } }, + "node_modules/plyr": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/plyr/-/plyr-3.7.2.tgz", + "integrity": "sha512-I0ZC/OI4oJ0iWG9s2rrnO0YFO6aLyrPiQBq9kum0FqITYljwTPBbYL3TZZu8UJQJUq7tUWN18Q7ACwNCkGKABQ==", + "dependencies": { + "core-js": "^3.22.0", + "custom-event-polyfill": "^1.0.7", + "loadjs": "^4.2.0", + "rangetouch": "^2.0.1", + "url-polyfill": "^1.1.12" + } + }, "node_modules/polished": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/polished/-/polished-3.7.2.tgz", @@ -7412,6 +7436,11 @@ "node": ">= 0.6" } }, + "node_modules/rangetouch": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rangetouch/-/rangetouch-2.0.1.tgz", + "integrity": "sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==" + }, "node_modules/raw-body": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", @@ -9213,6 +9242,11 @@ "requires-port": "^1.0.0" } }, + "node_modules/url-polyfill": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.12.tgz", + "integrity": "sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A==" + }, "node_modules/url-toolkit": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz", @@ -9346,6 +9380,18 @@ "videojs-vtt.js": "^0.15.4" } }, + "node_modules/videojs-contrib-quality-levels": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.2.0.tgz", + "integrity": "sha512-r4LFNhjyeBmlGk4Ul43xl+f7sNJ9vFyM6p4NcZNbPlvs1IvykEXCqxvsvaR6KTBjHoHGJnr26grXWcJiLFP+cA==", + "dependencies": { + "global": "^4.3.2", + "video.js": "^6 || ^7" + }, + "peerDependencies": { + "video.js": "^6 || ^7" + } + }, "node_modules/videojs-font": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-3.2.0.tgz", @@ -13427,6 +13473,11 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "custom-event-polyfill": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz", + "integrity": "sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==" + }, "date-format-parse": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/date-format-parse/-/date-format-parse-0.2.7.tgz", @@ -15157,6 +15208,11 @@ "json5": "^2.1.2" } }, + "loadjs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loadjs/-/loadjs-4.2.0.tgz", + "integrity": "sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA==" + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -15829,6 +15885,18 @@ "integrity": "sha512-9EmeXDncC2Pmp/z+teoVYlvmPWUC6ejSSYZUln7YaP89Z6lpAaiaAnqroUt/BoLo8tn7WYShcfaCh+xofZa44Q==", "dev": true }, + "plyr": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/plyr/-/plyr-3.7.2.tgz", + "integrity": "sha512-I0ZC/OI4oJ0iWG9s2rrnO0YFO6aLyrPiQBq9kum0FqITYljwTPBbYL3TZZu8UJQJUq7tUWN18Q7ACwNCkGKABQ==", + "requires": { + "core-js": "^3.22.0", + "custom-event-polyfill": "^1.0.7", + "loadjs": "^4.2.0", + "rangetouch": "^2.0.1", + "url-polyfill": "^1.1.12" + } + }, "polished": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/polished/-/polished-3.7.2.tgz", @@ -16062,6 +16130,11 @@ "dev": true, "peer": true }, + "rangetouch": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rangetouch/-/rangetouch-2.0.1.tgz", + "integrity": "sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==" + }, "raw-body": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", @@ -17434,6 +17507,11 @@ "requires-port": "^1.0.0" } }, + "url-polyfill": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.12.tgz", + "integrity": "sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A==" + }, "url-toolkit": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz", @@ -17524,6 +17602,15 @@ "videojs-vtt.js": "^0.15.4" } }, + "videojs-contrib-quality-levels": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.2.0.tgz", + "integrity": "sha512-r4LFNhjyeBmlGk4Ul43xl+f7sNJ9vFyM6p4NcZNbPlvs1IvykEXCqxvsvaR6KTBjHoHGJnr26grXWcJiLFP+cA==", + "requires": { + "global": "^4.3.2", + "video.js": "^6 || ^7" + } + }, "videojs-font": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-3.2.0.tgz", diff --git a/package.json b/package.json index 88253bd5..aa91e4af 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,10 @@ "moment": "^2.29.4", "path-posix": "^1.0.0", "photoswipe": "^5.3.3", + "plyr": "^3.7.2", "reflect-metadata": "^0.1.13", "video.js": "^7.20.3", + "videojs-contrib-quality-levels": "^2.2.0", "vue": "^2.7.10", "vue-class-component": "^7.2.6", "vue-material-design-icons": "^5.1.2", diff --git a/patches/scroller.patch b/patches/scroller-perf.patch similarity index 100% rename from patches/scroller.patch rename to patches/scroller-perf.patch diff --git a/patches/scroller-sticky.patch b/patches/scroller-sticky.patch new file mode 100644 index 00000000..79a8a649 --- /dev/null +++ b/patches/scroller-sticky.patch @@ -0,0 +1,11 @@ +--- ./node_modules/vue-virtual-scroller/dist/vue-virtual-scroller.esm.js 2022-11-12 00:44:05.303602165 -0800 ++++ ./node_modules/vue-virtual-scroller/dist/vue-virtual-scroller.esm.js 2022-11-12 00:43:40.030571395 -0800 +@@ -425,7 +425,7 @@ + } + + // Check if index is still in visible range +- if (view.nr.index === -1 || view.nr.index < startIndex || view.nr.index >= endIndex) { ++ if (!view.item.virtualSticky && (view.nr.index === -1 || view.nr.index < startIndex || view.nr.index >= endIndex)) { + this.unuseView(view); + } + } diff --git a/scripts/bundle.sh b/scripts/bundle.sh index 39e33859..9ca1b61c 100755 --- a/scripts/bundle.sh +++ b/scripts/bundle.sh @@ -14,7 +14,7 @@ cd memories sh "$od/scripts/get-exiftool.sh" cd .. -tar -zvcf memories.tar.gz memories/ +tar --no-same-owner -p -zcf memories.tar.gz memories/ rm -rf memories cd $od diff --git a/scripts/get-exiftool.sh b/scripts/get-exiftool.sh index 925b7364..e83df762 100755 --- a/scripts/get-exiftool.sh +++ b/scripts/get-exiftool.sh @@ -17,4 +17,9 @@ mv "exiftool-$exifver" exiftool rm -rf *.zip exiftool/t exiftool/html chmod 755 exiftool/exiftool +govod="0.0.13" +wget -q "https://github.com/pulsejet/go-vod/releases/download/$govod/go-vod-amd64" +wget -q "https://github.com/pulsejet/go-vod/releases/download/$govod/go-vod-aarch64" +chmod 755 go-vod-* + cd .. diff --git a/src/App.vue b/src/App.vue index c8244f68..7b00bc27 100644 --- a/src/App.vue +++ b/src/App.vue @@ -8,74 +8,20 @@ 'remove-gap': removeOuterGap, }" > - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -102,10 +48,12 @@ import { } from "@nextcloud/vue"; import { generateUrl } from "@nextcloud/router"; import { getCurrentUser } from "@nextcloud/auth"; +import { translate as t } from "@nextcloud/l10n"; import Timeline from "./components/Timeline.vue"; import Settings from "./components/Settings.vue"; import FirstStart from "./components/FirstStart.vue"; +import Metadata from "./components/Metadata.vue"; import GlobalMixin from "./mixins/GlobalMixin"; import UserConfig from "./mixins/UserConfig"; @@ -147,6 +95,67 @@ import MapIcon from "vue-material-design-icons/Map.vue"; export default class App extends Mixins(GlobalMixin, UserConfig) { // Outer element + private metadataComponent!: Metadata; + + private readonly navItemsAll = [ + { + name: "timeline", + icon: ImageMultiple, + title: t("memories", "Timeline"), + }, + { + name: "folders", + icon: FolderIcon, + title: t("memories", "Folders"), + }, + { + name: "favorites", + icon: Star, + title: t("memories", "Favorites"), + }, + { + name: "videos", + icon: Video, + title: t("memories", "Videos"), + }, + { + name: "albums", + icon: AlbumIcon, + title: t("memories", "Albums"), + if: (self: any) => self.showAlbums, + }, + { + name: "people", + icon: PeopleIcon, + title: t("memories", "People"), + if: (self: any) => self.showPeople, + }, + { + name: "archive", + icon: ArchiveIcon, + title: t("memories", "Archive"), + }, + { + name: "thisday", + icon: CalendarIcon, + title: t("memories", "On this day"), + }, + { + name: "tags", + icon: TagsIcon, + title: t("memories", "Tags"), + if: (self: any) => self.config_tagsEnabled, + }, + { + name: "maps", + icon: MapIcon, + title: t("memories", "Maps"), + if: (self: any) => self.config_mapsEnabled, + }, + ]; + + private navItems = []; + get ncVersion() { const version = (window.OC).config.version.split("."); return Number(version[0]); @@ -180,11 +189,49 @@ export default class App extends Mixins(GlobalMixin, UserConfig) { mounted() { this.doRouteChecks(); + // Populate navigation + this.navItems = this.navItemsAll.filter( + (item) => !item.if || item.if(this) + ); + // Store CSS variables modified const root = document.documentElement; const colorPrimary = getComputedStyle(root).getPropertyValue("--color-primary"); root.style.setProperty("--color-primary-select-light", `${colorPrimary}40`); + root.style.setProperty("--plyr-color-main", colorPrimary); + + // Register sidebar metadata tab + const OCA = globalThis.OCA; + if (OCA.Files && OCA.Files.Sidebar) { + OCA.Files.Sidebar.registerTab( + new OCA.Files.Sidebar.Tab({ + id: "memories-metadata", + name: this.t("memories", "EXIF"), + icon: "icon-details", + + async mount(el, fileInfo, context) { + if (this.metadataComponent) { + this.metadataComponent.$destroy(); + } + this.metadataComponent = new Metadata({ + // Better integration with vue parent component + parent: context, + }); + // Only mount after we have all the info we need + await this.metadataComponent.update(fileInfo); + this.metadataComponent.$mount(el); + }, + update(fileInfo) { + this.metadataComponent.update(fileInfo); + }, + destroy() { + this.metadataComponent.$destroy(); + this.metadataComponent = null; + }, + }) + ); + } } async beforeMount() { @@ -206,6 +253,11 @@ export default class App extends Mixins(GlobalMixin, UserConfig) { } } + linkClick() { + const nav: any = this.$refs.nav; + if (window.innerWidth <= 1024) nav?.toggleNavigation(false); + } + doRouteChecks() { if (this.$route.name === "folder-share") { this.putFolderShareToken(this.$route.params.token); @@ -259,15 +311,21 @@ body { // Nextcloud 25+: get rid of gap and border radius at right #content-vue.remove-gap { // was var(--body-container-radius) - border-top-right-radius: 0; - border-bottom-right-radius: 0; - + // now set on #app-navigation-vue + border-radius: 0; width: calc(100% - var(--body-container-margin) * 1); // was *2 } // Prevent content overflow on NC <25 #content-vue { max-height: 100vh; + + // https://bugs.webkit.org/show_bug.cgi?id=160953 + overflow: visible; + #app-navigation-vue { + border-top-left-radius: var(--body-container-radius); + border-bottom-left-radius: var(--body-container-radius); + } } // Top bar is above everything else on mobile @@ -280,29 +338,17 @@ body.has-viewer header { z-index: 0 !important; } -// Patch viewer to remove the title and -// make the image fill the entire screen -.viewer { - .modal-title { - display: none; - } - .modal-wrapper .modal-container { - top: 0 !important; - bottom: 0 !important; - - .viewer__image-editor { - top: 0 !important; - bottom: 0 !important; - } - } -} - // Hide horizontal scrollbar on mobile // For the padding removal above #app-content-vue { overflow-x: hidden; } +// Prevent sidebar from becoming too big +aside.app-sidebar { + max-width: 360px !important; +} + // Fill all available space .fill-block { width: 100%; diff --git a/src/assets/plyr.svg b/src/assets/plyr.svg new file mode 100644 index 00000000..62ab2579 --- /dev/null +++ b/src/assets/plyr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/ImageEditor.vue b/src/components/ImageEditor.vue index 01bdedc9..8e051e9e 100644 --- a/src/components/ImageEditor.vue +++ b/src/components/ImageEditor.vue @@ -9,7 +9,9 @@ import GlobalMixin from "../mixins/GlobalMixin"; import { basename, dirname, extname, join } from "path"; import { emit } from "@nextcloud/event-bus"; import { showError, showSuccess } from "@nextcloud/dialogs"; +import { generateUrl } from "@nextcloud/router"; import axios from "@nextcloud/axios"; + import FilerobotImageEditor from "filerobot-image-editor"; import { FilerobotImageEditorConfig } from "react-filerobot-image-editor"; @@ -25,11 +27,22 @@ export default class ImageEditor extends Mixins(GlobalMixin) { @Prop() mime: string; @Prop() src: string; + private exif: any = null; + private imageEditor: FilerobotImageEditor = null; get config(): FilerobotImageEditorConfig & { theme: any } { + let src: string; + if (["image/png", "image/jpeg", "image/webp"].includes(this.mime)) { + src = this.src; + } else { + src = generateUrl("/apps/memories/api/image/jpeg/{fileid}", { + fileid: this.fileid, + }); + } + return { - source: this.src, + source: src, defaultSavedImageName: this.defaultSavedImageName, defaultSavedImageType: this.defaultSavedImageType, @@ -84,8 +97,8 @@ export default class ImageEditor extends Mixins(GlobalMixin) { }, }, - savingPixelRatio: 1, - previewPixelRatio: 1, + savingPixelRatio: 8, + previewPixelRatio: window.devicePixelRatio, }; } @@ -117,14 +130,32 @@ export default class ImageEditor extends Mixins(GlobalMixin) { }; } - mounted() { + async mounted() { this.imageEditor = new FilerobotImageEditor( this.$refs.editor, this.config ); this.imageEditor.render(); window.addEventListener("keydown", this.handleKeydown, true); - window.addEventListener("DOMNodeInserted", this.handleSfxModal); + + // Get latest exif data + try { + const res = await axios.get( + generateUrl("/apps/memories/api/image/info/{id}?basic=1¤t=1", { + id: this.fileid, + }) + ); + + this.exif = res.data?.current; + if (!this.exif) { + throw new Error("No exif data"); + } + } catch (err) { + console.error(err); + alert( + this.t("memories", "Failed to get Exif data. Metadata may be lost!") + ); + } } beforeDestroy() { @@ -147,46 +178,69 @@ export default class ImageEditor extends Mixins(GlobalMixin) { * User saved the image * * @see https://github.com/scaleflex/filerobot-image-editor#onsave - * @param {object} props destructuring object - * @param {string} props.fullName the file name - * @param {HTMLCanvasElement} props.imageCanvas the image canvas - * @param {string} props.mimeType the image mime type - * @param {number} props.quality the image saving quality */ async onSave({ fullName, - imageCanvas, - mimeType, - quality, + imageBase64, }: { fullName?: string; - imageCanvas?: HTMLCanvasElement; - mimeType?: string; - quality?: number; + imageBase64?: string; }): Promise { + if (!imageBase64) { + throw new Error("No image data"); + } + const { origin, pathname } = new URL(this.src); const putUrl = origin + join(dirname(pathname), fullName); - // toBlob is not very smart... - mimeType = mimeType.replace("jpg", "jpeg"); - - // Sanity check, 0 < quality < 1 - quality = Math.max(Math.min(quality, 1), 0) || 1; + if ( + !this.exif && + !confirm(this.t("memories", "No Exif data found! Continue?")) + ) { + return; + } try { - const blob = await new Promise((resolve: BlobCallback) => - imageCanvas.toBlob(resolve, mimeType, quality) - ); + const blob = await fetch(imageBase64).then((res) => res.blob()); const response = await axios.put(putUrl, new File([blob], fullName)); + const fileid = + parseInt(response?.headers?.["oc-fileid"]?.split("oc")[0]) || null; + if (response.status >= 400) { + throw new Error("Failed to save image"); + } + + // Strip old and incorrect exif data + const exif = this.exif; + delete exif.Orientation; + delete exif.Rotation; + delete exif.ImageHeight; + delete exif.ImageWidth; + delete exif.ImageSize; + delete exif.ModifyDate; + delete exif.ExifImageHeight; + delete exif.ExifImageWidth; + delete exif.ExifImageSize; + delete exif.CompatibleBrands; + delete exif.FileType; + delete exif.FileTypeExtension; + delete exif.MIMEType; + delete exif.MajorBrand; + + // Update exif data + await axios.patch( + generateUrl("/apps/memories/api/image/set-exif/{id}", { + id: fileid, + }), + { + raw: exif, + } + ); showSuccess(this.t("memories", "Image saved successfully")); - if (putUrl !== this.src) { - emit("files:file:created", { - fileid: - parseInt(response?.headers?.["oc-fileid"]?.split("oc")[0]) || null, - }); + if (fileid !== this.fileid) { + emit("files:file:created", { fileid }); } else { - emit("files:file:updated", { fileid: this.fileid }); + emit("files:file:updated", { fileid }); } this.onClose(undefined, false); } catch (error) { @@ -247,21 +301,6 @@ export default class ImageEditor extends Mixins(GlobalMixin) { ).click(); } } - - /** - * Watch out for Modal inject in document root - * That way we can adjust the focusTrap - * - * @param {Event} event Dom insertion event - */ - handleSfxModal(event) { - if ( - event.target?.classList && - event.target.classList.contains("SfxModal-Wrapper") - ) { - emit("viewer:trapElements:changed", event.target); - } - } } @@ -590,4 +629,9 @@ export default class ImageEditor extends Mixins(GlobalMixin) { filter: var(--background-invert-if-dark); } + +.FIE_carousel-prev-button, +.FIE_carousel-next-button { + background: none !important; +} \ No newline at end of file diff --git a/src/components/Metadata.vue b/src/components/Metadata.vue new file mode 100644 index 00000000..8e69d8ff --- /dev/null +++ b/src/components/Metadata.vue @@ -0,0 +1,350 @@ + + + + + + + + + + + {{ field.title }} + + + + {{ field.title }} + + + + + + + {{ part }} + + + + + + + + + {{ t("memories", "Edit") }} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/PsVideo.ts b/src/components/PsVideo.ts new file mode 100644 index 00000000..4b8b0b41 --- /dev/null +++ b/src/components/PsVideo.ts @@ -0,0 +1,470 @@ +import PhotoSwipe from "photoswipe"; +import { generateUrl } from "@nextcloud/router"; +import { loadState } from "@nextcloud/initial-state"; +import axios from "@nextcloud/axios"; +import { showError } from "@nextcloud/dialogs"; +import { translate as t } from "@nextcloud/l10n"; +import { getCurrentUser } from "@nextcloud/auth"; + +import Plyr from "plyr"; +import "plyr/dist/plyr.css"; +import plyrsvg from "../assets/plyr.svg"; + +import videojs from "video.js"; +import "video.js/dist/video-js.min.css"; +import "videojs-contrib-quality-levels"; + +const config_noTranscode = loadState( + "memories", + "notranscode", + "UNSET" +) as boolean | string; + +// Generate client id for this instance +// Does not need to be cryptographically secure +const clientId = Math.random().toString(36).substring(2, 15).padEnd(12, "0"); + +/** + * Check if slide has video content + * + * @param {Slide|Content} content Slide or Content object + * @returns Boolean + */ +function isVideoContent(content): boolean { + return content?.data?.type === "video"; +} + +class VideoContentSetup { + constructor(lightbox: PhotoSwipe, private options) { + this.initLightboxEvents(lightbox); + lightbox.on("init", () => { + this.initPswpEvents(lightbox); + }); + } + + initLightboxEvents(lightbox: PhotoSwipe) { + lightbox.on("contentLoad", this.onContentLoad.bind(this)); + lightbox.on("contentDestroy", this.onContentDestroy.bind(this)); + lightbox.on("contentActivate", this.onContentActivate.bind(this)); + lightbox.on("contentDeactivate", this.onContentDeactivate.bind(this)); + lightbox.on("contentAppend", this.onContentAppend.bind(this)); + lightbox.on("contentResize", this.onContentResize.bind(this)); + + lightbox.addFilter( + "isKeepingPlaceholder", + this.isKeepingPlaceholder.bind(this) + ); + lightbox.addFilter("isContentZoomable", this.isContentZoomable.bind(this)); + lightbox.addFilter( + "useContentPlaceholder", + this.useContentPlaceholder.bind(this) + ); + + lightbox.addFilter("domItemData", (itemData, element, linkEl) => { + return itemData; + }); + } + + initPswpEvents(pswp: PhotoSwipe) { + // Prevent draggin when pointer is in bottom part of the video + // todo: add option for this + pswp.on("pointerDown", (e) => { + const slide = pswp.currSlide; + if (isVideoContent(slide) && this.options.preventDragOffset) { + const origEvent = e.originalEvent; + if (origEvent.type === "pointerdown") { + // Check if directly over the videojs control bar + const elems = document.elementsFromPoint( + origEvent.clientX, + origEvent.clientY + ); + if (elems.some((el) => el.classList.contains("plyr__controls"))) { + e.preventDefault(); + return; + } + + const videoHeight = Math.ceil(slide.height * slide.currZoomLevel); + const verticalEnding = videoHeight + slide.bounds.center.y; + const pointerYPos = origEvent.pageY - pswp.offset.y; + if ( + pointerYPos > verticalEnding - this.options.preventDragOffset && + pointerYPos < verticalEnding + ) { + e.preventDefault(); + } + } + } + }); + + // do not append video on nearby slides + pswp.on("appendHeavy", (e) => { + if (isVideoContent(e.slide)) { + const content = e.slide.content; + + if (!e.slide.isActive) { + e.preventDefault(); + } else if (content.videoElement) { + this.initVideo(content); + } + } + }); + + pswp.on("close", () => { + if (isVideoContent(pswp.currSlide.content)) { + // Switch from zoom to fade closing transition, + // as zoom transition is choppy for videos + if ( + !pswp.options.showHideAnimationType || + pswp.options.showHideAnimationType === "zoom" + ) { + pswp.options.showHideAnimationType = "fade"; + } + + // prevent more requests + this.destroyVideo(pswp.currSlide.content); + } + }); + } + + initVideo(content: any) { + if (!isVideoContent(content) || content.videojs) { + return; + } + + content.videoElement = document.createElement("video"); + content.videoElement.className = "video-js"; + content.videoElement.setAttribute("poster", content.data.msrc); + if (this.options.videoAttributes) { + for (let key in this.options.videoAttributes) { + content.videoElement.setAttribute( + key, + this.options.videoAttributes[key] || "" + ); + } + } + + // Add the video element to the actual container + content.element.appendChild(content.videoElement); + + // Get file id + const fileid = content.data.photo.fileid; + + // Create hls sources if enabled + let sources: any[] = []; + const baseUrl = generateUrl( + `/apps/memories/api/video/transcode/${clientId}/${fileid}` + ); + + if (!config_noTranscode) { + sources.push({ + src: `${baseUrl}/index.m3u8`, + type: "application/x-mpegURL", + }); + } + + sources.push({ + src: content.data.src, + type: "video/mp4", + }); + + const overrideNative = !videojs.browser.IS_SAFARI; + content.videojs = videojs(content.videoElement, { + fill: true, + autoplay: true, + controls: false, + sources: sources, + preload: "metadata", + playbackRates: [0.5, 1, 1.5, 2], + responsive: true, + html5: { + vhs: { + overrideNative: overrideNative, + withCredentials: false, + }, + nativeAudioTracks: !overrideNative, + nativeVideoTracks: !overrideNative, + }, + }); + + content.videojs.on("error", () => { + if (content.videojs.error().code === 4) { + if (content.videojs.src().includes("m3u8")) { + // HLS could not be streamed + console.error("Video.js: HLS stream could not be opened."); + + if (getCurrentUser()?.isAdmin) { + showError(t("memories", "Transcoding failed.")); + } + + content.videojs.src({ + src: content.data.src, + type: "video/mp4", + }); + this.updateRotation(content, 0); + } + } + }); + + setTimeout(() => { + content.videojs.play(); // iOS needs this + }, 200); + + let canPlay = false; + content.videojs.on("loadedmetadata", () => { + canPlay = true; + this.updateRotation(content); // also gets the correct video elem as a side effect + this.initPlyr(content); + }); + + content.videojs.qualityLevels()?.on("addqualitylevel", (e) => { + window.setTimeout(() => { + this.initPlyr(content); + }, 0); + }); + + // Get correct orientation + axios + .get( + generateUrl("/apps/memories/api/image/info/{id}", { + id: content.data.photo.fileid, + }) + ) + .then((response) => { + content.data.exif = response.data?.exif; + + // Update only after video is ready + // Otherwise the poster image is rotated + if (canPlay) this.updateRotation(content); + }); + } + + destroyVideo(content: any) { + if (isVideoContent(content) && content.videojs) { + content.videojs.dispose(); + content.videojs = null; + + content.plyr?.elements?.container?.remove(); + content.plyr?.destroy(); + content.plyr = null; + + const elem: HTMLDivElement = content.element; + while (elem.lastElementChild) { + elem.removeChild(elem.lastElementChild); + } + content.videoElement = null; + } + } + + initPlyr(content: any) { + if (content.plyr) return; + + content.videoElement = content.videojs?.el()?.querySelector("video"); + if (!content.videoElement) return; + + // Retain original parent for video element + const origParent = content.videoElement.parentElement; + + // Populate quality list + const qualityList = content.videojs?.qualityLevels(); + let qualityNums: number[]; + if (qualityList && qualityList.length > 1) { + const s = new Set(); + for (let i = 0; i < qualityList?.length; i++) { + const { width, height } = qualityList[i]; + s.add(Math.min(width, height)); + } + qualityNums = Array.from(s).sort((a, b) => b - a); + qualityNums.unshift(0); + } + + // Create the plyr instance + const opts: Plyr.Options = { + iconUrl: plyrsvg, + blankVideo: "", + i18n: { + qualityLabel: { + 0: t("memories", "Auto"), + }, + }, + fullscreen: { + enabled: true, + container: ".pswp__item", + }, + }; + + if (qualityNums) { + opts.quality = { + default: 0, + options: qualityNums, + forced: true, + onChange: (quality: number) => { + if (!qualityList || !content.videojs) return; + for (let i = 0; i < qualityList.length; ++i) { + const { width, height } = qualityList[i]; + const pixels = Math.min(width, height); + qualityList[i].enabled = pixels === quality || !quality; + } + }, + }; + } + + const plyr = new Plyr(content.videoElement, opts); + plyr.elements.container.style.height = "100%"; + plyr.elements.container.style.width = "100%"; + plyr.elements.container + .querySelectorAll("button") + .forEach((el) => el.classList.add("button-vue")); + plyr.elements.container + .querySelectorAll("progress") + .forEach((el) => el.classList.add("vue")); + plyr.elements.container.style.backgroundColor = "transparent"; + plyr.elements.wrapper.style.backgroundColor = "transparent"; + + content.plyr = plyr; + + // Restore original parent of video element + origParent.appendChild(content.videoElement); + // Move plyr to the slide container + content.slide.holderElement.appendChild(plyr.elements.container); + } + + updateRotation(content, val?: number) { + if (!content.videojs) return; + + content.videoElement = content.videojs.el()?.querySelector("video"); + if (!content.videoElement) return; + + const rotation = val ?? Number(content.data.exif?.Rotation); + const shouldRotate = content.videojs?.src().includes("m3u8"); + + if (rotation && shouldRotate) { + let transform = `rotate(${rotation}deg)`; + + if (rotation === 90 || rotation === 270) { + content.videoElement.style.width = content.element.style.height; + content.videoElement.style.height = content.element.style.width; + + transform = `translateY(-${content.element.style.width}) ${transform}`; + content.videoElement.style.transformOrigin = "bottom left"; + } + + content.videoElement.style.transform = transform; + } else { + content.videoElement.style.transform = "none"; + content.videoElement.style.width = "100%"; + content.videoElement.style.height = "100%"; + } + } + + onContentDestroy({ content }) { + if (isVideoContent(content)) { + if (content.videojs) { + content.videojs.dispose(); + content.videojs = null; + } + } + } + + onContentResize(e) { + if (isVideoContent(e.content)) { + e.preventDefault(); + + const width = e.width; + const height = e.height; + const content = e.content; + + if (content.element) { + content.element.style.width = width + "px"; + content.element.style.height = height + "px"; + } + + if (content.slide && content.slide.placeholder) { + // override placeholder size, so it more accurately matches the video + const placeholderElStyle = content.slide.placeholder.element.style; + placeholderElStyle.transform = "none"; + placeholderElStyle.width = width + "px"; + placeholderElStyle.height = height + "px"; + } + + this.updateRotation(content); + } + } + + isKeepingPlaceholder(isZoomable, content) { + if (isVideoContent(content)) { + return false; + } + return isZoomable; + } + + isContentZoomable(isZoomable, content) { + if (isVideoContent(content)) { + return false; + } + return isZoomable; + } + + onContentActivate({ content }) { + this.initVideo(content); + } + + onContentDeactivate({ content }) { + this.destroyVideo(content); + } + + onContentAppend(e) { + if (isVideoContent(e.content)) { + e.preventDefault(); + e.content.isAttached = true; + e.content.appendImage(); + } + } + + onContentLoad(e) { + const content = e.content; // todo: videocontent + + if (!isVideoContent(e.content)) { + return; + } + + // stop default content load + e.preventDefault(); + + if (content.element) { + return; + } + + if (config_noTranscode === "UNSET") { + content.element = document.createElement("div"); + content.element.innerHTML = + "Video not configured. Run occ memories:video-setup"; + content.element.style.color = "red"; + content.element.style.display = "flex"; + content.element.style.alignItems = "center"; + content.element.style.justifyContent = "center"; + content.onLoaded(); + return; + } + + content.state = "loading"; + content.type = "video"; // TODO: move this to pswp core? + + content.element = document.createElement("div"); + content.element.style.position = "absolute"; + content.element.style.left = 0; + content.element.style.top = 0; + content.element.style.width = "100%"; + content.element.style.height = "100%"; + + content.onLoaded(); + } + + useContentPlaceholder(usePlaceholder, content) { + if (isVideoContent(content)) { + return true; + } + return usePlaceholder; + } +} + +export default VideoContentSetup; diff --git a/src/components/SelectionManager.vue b/src/components/SelectionManager.vue index c62b62f3..20f97fa8 100644 --- a/src/components/SelectionManager.vue +++ b/src/components/SelectionManager.vue @@ -52,13 +52,21 @@ import GlobalMixin from "../mixins/GlobalMixin"; import UserConfig from "../mixins/UserConfig"; import { showError } from "@nextcloud/dialogs"; -import { generateUrl } from "@nextcloud/router"; import { NcActions, NcActionButton } from "@nextcloud/vue"; import { translate as t, translatePlural as n } from "@nextcloud/l10n"; -import { IDay, IHeadRow, IPhoto, ISelectionAction } from "../types"; +import { + IDay, + IHeadRow, + IPhoto, + IRow, + IRowType, + ISelectionAction, +} from "../types"; import { getCurrentUser } from "@nextcloud/auth"; import * as dav from "../services/DavRequests"; +import * as utils from "../services/Utils"; + import EditDate from "./modal/EditDate.vue"; import FaceMoveModal from "./modal/FaceMoveModal.vue"; import AddToAlbumModal from "./modal/AddToAlbumModal.vue"; @@ -91,11 +99,28 @@ type Selection = Map; export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) { @Prop() public heads: { [dayid: number]: IHeadRow }; + /** List of rows for multi selection */ + @Prop() public rows: IRow[]; + + /** Rows are in ascending order (desc is normal) */ + @Prop() public isreverse: boolean; + + /** Recycler element to scroll during touch multi-select */ + @Prop() public recycler: any; + private show = false; private size = 0; private readonly selection!: Selection; private readonly defaultActions: ISelectionAction[]; + private touchAnchor: IPhoto = null; + private touchTimer: number = 0; + private touchPrevSel!: Selection; + private prevOver!: IPhoto; + private touchScrollInterval: number = 0; + private touchScrollDelta: number = 0; + private prevTouch: Touch = null; + @Emit("refresh") refresh() {} @@ -179,6 +204,33 @@ export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) { if: () => this.$route.name === "people", }, ]; + + // Ugly: globally exposed functions + globalThis.editDate = (photo: IPhoto) => { + const sel = new Map(); + sel.set(photo.fileid, photo); + this.editDateSelection(sel); + }; + } + + /** Archive is not allowed only on folder routes */ + private allowArchive() { + return this.$route.name !== "folders"; + } + + /** Is archive route */ + private routeIsArchive() { + return this.$route.name === "archive"; + } + + /** Is album route */ + private routeIsAlbum() { + return this.config_albumsEnabled && this.$route.name === "albums"; + } + + /** Public route that can't modify anything */ + private routeIsPublic() { + return this.$route.name === "folder-share"; } @Watch("show") @@ -191,6 +243,7 @@ export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) { } } + /** Trigger to update props from selection set */ private selectionChanged() { this.show = this.selection.size > 0; this.size = this.selection.size; @@ -204,37 +257,11 @@ export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) { return this.selection.has(fileid); } - /** Restore selections from new day object */ - public restoreDay(day: IDay) { - if (!this.has()) { - return; - } - - // FileID => Photo for new day - const dayMap = new Map(); - day.detail.forEach((photo) => { - dayMap.set(photo.fileid, photo); - }); - - this.selection.forEach((photo, fileid) => { - // Process this day only - if (photo.dayid !== day.dayid) { - return; - } - - // Remove all selections that are not in the new day - if (!dayMap.has(fileid)) { - this.selection.delete(fileid); - return; - } - - // Update the photo object - const newPhoto = dayMap.get(fileid); - this.selection.set(fileid, newPhoto); - newPhoto.flag |= this.c.FLAG_SELECTED; - }); - - this.selectionChanged(); + /** Get the actions list */ + private getActions(): ISelectionAction[] { + return this.defaultActions.filter( + (a) => (!a.if || a.if(this)) && (!this.routeIsPublic() || a.allowPublic) + ); } /** Click on an action */ @@ -249,43 +276,202 @@ export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) { } } - /** Get the actions list */ - private getActions(): ISelectionAction[] { - return this.defaultActions.filter( - (a) => (!a.if || a.if(this)) && (!this.routeIsPublic() || a.allowPublic) - ); - } + /** Clicking on photo */ + public clickPhoto(photo: IPhoto, event: PointerEvent, rowIdx: number) { + if (photo.flag & this.c.FLAG_PLACEHOLDER) return; + if (event.pointerType === "touch") return; // let touch events handle this - /** Clear all selected photos */ - public clearSelection(only?: IPhoto[]) { - const heads = new Set(); - const toClear = only || this.selection.values(); - Array.from(toClear).forEach((photo: IPhoto) => { - photo.flag &= ~this.c.FLAG_SELECTED; - heads.add(this.heads[photo.d.dayid]); - this.selection.delete(photo.fileid); - this.selectionChanged(); - }); - heads.forEach(this.updateHeadSelected); - this.$forceUpdate(); - } - - /** Check if the day for a photo is selected entirely */ - private updateHeadSelected(head: IHeadRow) { - let selected = true; - - // Check if all photos are selected - for (const row of head.day.rows) { - for (const photo of row.photos) { - if (!(photo.flag & this.c.FLAG_SELECTED)) { - selected = false; - break; - } + if (this.has()) { + if (event.shiftKey) { + this.selectMulti(photo, this.rows, rowIdx); + } else { + this.selectPhoto(photo); } + } else { + this.openViewer(photo); + } + } + + /** Tap on */ + protected touchstartPhoto(photo: IPhoto, event: TouchEvent, rowIdx: number) { + if (photo.flag & this.c.FLAG_PLACEHOLDER) return; + this.rows[rowIdx].virtualSticky = true; + + this.resetTouchParams(); + document.body.classList.add("vue-touching"); + + this.touchAnchor = photo; + this.prevOver = photo; + this.touchPrevSel = new Map(this.selection); + this.touchTimer = window.setTimeout(() => { + if (this.touchAnchor === photo) { + this.selectPhoto(photo, true); + } + this.touchTimer = 0; + }, 600); + } + + /** Tap off */ + protected touchendPhoto(photo: IPhoto, event: TouchEvent, rowIdx: number) { + if (photo.flag & this.c.FLAG_PLACEHOLDER) return; + delete this.rows[rowIdx].virtualSticky; + + if (this.touchTimer) this.clickPhoto(photo, {} as any, rowIdx); + this.resetTouchParams(); + + window.setTimeout(() => { + if (!this.touchAnchor) document.body.classList.remove("vue-touching"); + }, 1000); + } + + private resetTouchParams() { + window.clearTimeout(this.touchTimer); + this.touchTimer = 0; + this.touchAnchor = null; + this.prevOver = undefined; + + window.cancelAnimationFrame(this.touchScrollInterval); + this.touchScrollInterval = 0; + + this.prevTouch = null; + } + + /** + * Tap over + * photo and rowIdx are that of the *anchor* + */ + protected touchmovePhoto(anchor: IPhoto, event: TouchEvent, rowIdx: number) { + if (anchor.flag & this.c.FLAG_PLACEHOLDER) return; + + if (this.touchTimer) { + // Touch is not held, just cancel + window.clearTimeout(this.touchTimer); + this.touchTimer = 0; + this.touchAnchor = null; + return; + } else if (!this.touchAnchor) { + // Touch was previously cancelled + return; } - // Update head - head.selected = selected; + // Prevent scrolling + event.preventDefault(); + + // Use first touch -- can't do much + const touch: Touch = event.touches[0]; + if (!touch) return; + this.prevTouch = touch; + + // Scroll if at top or bottom + const scrollUp = touch.clientY > 50 && touch.clientY < 110; // 50 topbar + const scrollDown = touch.clientY > window.innerHeight - 60; + if (scrollUp || scrollDown) { + if (scrollUp) { + this.touchScrollDelta = (-1 * (110 - touch.clientY)) / 3; + } else { + this.touchScrollDelta = (touch.clientY - window.innerHeight + 60) / 3; + } + + if (this.touchAnchor && !this.touchScrollInterval) { + const fun = () => { + this.recycler.$el.scrollTop += this.touchScrollDelta; + this.touchMoveSelect(this.prevTouch, rowIdx); + + if (this.touchScrollInterval) { + this.touchScrollInterval = window.requestAnimationFrame(fun); + } + }; + this.touchScrollInterval = window.requestAnimationFrame(fun); + } + } else { + window.cancelAnimationFrame(this.touchScrollInterval); + this.touchScrollInterval = 0; + } + + this.touchMoveSelect(touch, rowIdx); + } + + /** Multi-select triggered by touchmove */ + private touchMoveSelect(touch: Touch, rowIdx: number) { + // Which photo is the cursor over, if any + const elems = document.elementsFromPoint(touch.clientX, touch.clientY); + const photoComp: any = elems.find((e) => e.classList.contains("p-outer")); + let overPhoto: IPhoto = photoComp?.__vue__?.data; + if (overPhoto && overPhoto.flag & this.c.FLAG_PLACEHOLDER) overPhoto = null; + + // Do multi-selection "till" overPhoto "from" anchor + // This logic is completely different from the desktop because of the + // existence of a definitive "anchor" element. We just need to find + // rverything between the anchor and the current photo + if (overPhoto && this.prevOver !== overPhoto) { + this.prevOver = overPhoto; + + // days reverse XOR rows reverse + let reverse: boolean; + if (overPhoto.dayid === this.touchAnchor.dayid) { + const l = overPhoto.d.detail; + const ai = l.indexOf(this.touchAnchor); + const oi = l.indexOf(overPhoto); + if (ai === -1 || oi === -1) return; // Shouldn't happen + reverse = ai > oi; + } else { + reverse = overPhoto.dayid > this.touchAnchor.dayid != this.isreverse; + } + + const newSelection = new Map(this.touchPrevSel); + const updatedDays = new Set(); + + // Walk over rows + let i = rowIdx; + let j = this.rows[i].photos.indexOf(this.touchAnchor); + while (true) { + if (j < 0) { + while (i > 0 && !this.rows[--i].photos); + if (!this.rows[i].photos) break; + j = this.rows[i].photos.length - 1; + continue; + } else if (j >= this.rows[i].photos.length) { + while (i < this.rows.length - 1 && !this.rows[++i].photos); + if (!this.rows[i].photos) break; + j = 0; + continue; + } + + let p = this.rows[i]?.photos?.[j]; + if (!p) break; // shouldn't happen, ever + + // This is there now + newSelection.set(p.fileid, p); + + // Perf: only update heads if not selected + if (!(p.flag & this.c.FLAG_SELECTED)) { + this.selectPhoto(p, true, true); + updatedDays.add(p.dayid); + } + + // We're trying to update too much -- something went wrong + if (newSelection.size - this.selection.size > 50) break; + + // Check goal + if (p === overPhoto) break; + j += reverse ? -1 : 1; + } + + // Remove unselected + for (const [fileid, p] of this.selection) { + if (!newSelection.has(fileid)) { + this.selectPhoto(p, false, true); + updatedDays.add(p.dayid); + } + } + + // Update heads + for (const dayid of updatedDays) { + this.updateHeadSelected(this.heads[dayid]); + } + + this.$forceUpdate(); + } } /** Add a photo to selection list */ @@ -321,6 +507,64 @@ export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) { } } + /** Multi-select */ + public selectMulti(photo: IPhoto, rows: IRow[], rowIdx: number) { + const pRow = rows[rowIdx]; + const pIdx = pRow.photos.indexOf(photo); + if (pIdx === -1) return; + + const updateDaySet = new Set(); + let behind = []; + let behindFound = false; + + // Look behind + for (let i = rowIdx; i > rowIdx - 100; i--) { + if (i < 0) break; + if (rows[i].type !== IRowType.PHOTOS) continue; + if (!rows[i].photos?.length) break; + + const sj = i === rowIdx ? pIdx : rows[i].photos.length - 1; + for (let j = sj; j >= 0; j--) { + const p = rows[i].photos[j]; + if (p.flag & this.c.FLAG_PLACEHOLDER || !p.fileid) continue; + if (p.flag & this.c.FLAG_SELECTED) { + behindFound = true; + break; + } + behind.push(p); + updateDaySet.add(p.d.dayid); + } + + if (behindFound) break; + } + + // Select everything behind + if (behindFound) { + // Clear everything in front in this day + const pdIdx = photo.d.detail.indexOf(photo); + for (let i = pdIdx + 1; i < photo.d.detail.length; i++) { + const p = photo.d.detail[i]; + if (p.flag & this.c.FLAG_SELECTED) this.selectPhoto(p, false, true); + } + + // Clear everything else in front + Array.from(this.selection.values()) + .filter((p) => { + return this.isreverse + ? p.d.dayid > photo.d.dayid + : p.d.dayid < photo.d.dayid; + }) + .forEach((photo: IPhoto) => { + this.selectPhoto(photo, false, true); + updateDaySet.add(photo.d.dayid); + }); + + behind.forEach((p) => this.selectPhoto(p, true, true)); + updateDaySet.forEach((d) => this.updateHeadSelected(this.heads[d])); + this.$forceUpdate(); + } + } + /** Select or deselect all photos in a head */ public selectHead(head: IHeadRow) { head.selected = !head.selected; @@ -332,6 +576,71 @@ export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) { this.$forceUpdate(); } + /** Check if the day for a photo is selected entirely */ + private updateHeadSelected(head: IHeadRow) { + let selected = true; + + // Check if all photos are selected + for (const row of head.day.rows) { + for (const photo of row.photos) { + if (!(photo.flag & this.c.FLAG_SELECTED)) { + selected = false; + break; + } + } + } + + // Update head + head.selected = selected; + } + + /** Clear all selected photos */ + public clearSelection(only?: IPhoto[]) { + const heads = new Set(); + const toClear = only || this.selection.values(); + Array.from(toClear).forEach((photo: IPhoto) => { + photo.flag &= ~this.c.FLAG_SELECTED; + heads.add(this.heads[photo.d.dayid]); + this.selection.delete(photo.fileid); + this.selectionChanged(); + }); + heads.forEach(this.updateHeadSelected); + this.$forceUpdate(); + } + + /** Restore selections from new day object */ + public restoreDay(day: IDay) { + if (!this.has()) { + return; + } + + // FileID => Photo for new day + const dayMap = new Map(); + day.detail.forEach((photo) => { + dayMap.set(photo.fileid, photo); + }); + + this.selection.forEach((photo, fileid) => { + // Process this day only + if (photo.dayid !== day.dayid) { + return; + } + + // Remove all selections that are not in the new day + if (!dayMap.has(fileid)) { + this.selection.delete(fileid); + return; + } + + // Update the photo object + const newPhoto = dayMap.get(fileid); + this.selection.set(fileid, newPhoto); + newPhoto.flag |= this.c.FLAG_SELECTED; + }); + + this.selectionChanged(); + } + /** * Download the currently selected files */ @@ -446,26 +755,6 @@ export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) { } } - /** Archive is not allowed only on folder routes */ - private allowArchive() { - return this.$route.name !== "folders"; - } - - /** Is archive route */ - private routeIsArchive() { - return this.$route.name === "archive"; - } - - /** Is album route */ - private routeIsAlbum() { - return this.config_albumsEnabled && this.$route.name === "albums"; - } - - /** Public route that can't modify anything */ - private routeIsPublic() { - return this.$route.name === "folder-share"; - } - /** * Move selected photos to album */ @@ -548,6 +837,14 @@ export default class SelectionManager extends Mixins(GlobalMixin, UserConfig) { this.deletePhotos(delPhotos); } } + + /** Open viewer with given photo */ + private openViewer(photo: IPhoto) { + this.$router.push({ + ...this.$route, + hash: utils.getViewerHash(photo), + }); + } } diff --git a/src/components/Settings.vue b/src/components/Settings.vue index 43839041..1d13d705 100644 --- a/src/components/Settings.vue +++ b/src/components/Settings.vue @@ -53,6 +53,12 @@ > {{ t("memories", "Square grid mode") }} + + @@ -65,18 +71,24 @@ input[type="text"] { @@ -250,7 +248,7 @@ $icon-size: $icon-half-size * 2; cursor: pointer; display: none; - .p-outer:not(.hasTouch):hover > & { + body:not(.vue-touching) .p-outer:hover > & { display: flex; } @@ -274,7 +272,7 @@ $icon-size: $icon-half-size * 2; color: var(--color-primary); } } -.play-circle-outline-icon, +.video, .star-icon { position: absolute; z-index: 100; @@ -282,12 +280,23 @@ $icon-size: $icon-half-size * 2; transition: transform 0.15s ease; filter: invert(1) brightness(100); } -.play-circle-outline-icon { +.video { + position: absolute; top: var(--icon-dist); right: var(--icon-dist); .p-outer.selected > & { transform: translate(-$icon-size, $icon-size); } + + display: flex; + align-items: center; + justify-content: center; + + .time { + font-size: 0.75em; + font-weight: bold; + margin-right: 3px; + } } .star-icon { bottom: var(--icon-dist); @@ -341,7 +350,7 @@ div.img-outer { display: none; transition: border-radius 0.1s ease-in; - .p-outer:not(.hasTouch):not(.selected):hover > & { + body:not(.vue-touching) .p-outer:not(.selected):hover > & { display: block; } } diff --git a/src/components/modal/EditDate.vue b/src/components/modal/EditDate.vue index da5723d8..52c5cc82 100644 --- a/src/components/modal/EditDate.vue +++ b/src/components/modal/EditDate.vue @@ -137,13 +137,14 @@ import { IPhoto } from "../../types"; import { NcButton, NcTextField } from "@nextcloud/vue"; import { showError } from "@nextcloud/dialogs"; import { generateUrl } from "@nextcloud/router"; +import { emit } from "@nextcloud/event-bus"; import Modal from "./Modal.vue"; import axios from "@nextcloud/axios"; import * as utils from "../../services/Utils"; import * as dav from "../../services/DavRequests"; -const INFO_API_URL = "/apps/memories/api/info/{id}"; -const EDIT_API_URL = "/apps/memories/api/edit/{id}"; +const INFO_API_URL = "/apps/memories/api/image/info/{id}"; +const EDIT_API_URL = "/apps/memories/api/image/set-exif/{id}"; @Component({ components: { @@ -186,7 +187,7 @@ export default class EditDate extends Mixins(GlobalMixin) { const calls = photos.map((p) => async () => { try { const res = await axios.get( - generateUrl(INFO_API_URL, { id: p.fileid }) + generateUrl(INFO_API_URL, { id: p.fileid }) + "?basic=1" ); if (typeof res.data.datetaken !== "number") { console.error("Invalid date for", p.fileid); @@ -267,12 +268,13 @@ export default class EditDate extends Mixins(GlobalMixin) { // Make PATCH request to update date try { this.processing = true; - const res = await axios.patch( - generateUrl(EDIT_API_URL, { id: this.photos[0].fileid }), - { - date: this.getExifFormat(this.getDate()), - } - ); + const fileid = this.photos[0].fileid; + await axios.patch(generateUrl(EDIT_API_URL, { id: fileid }), { + raw: { + DateTimeOriginal: this.getExifFormat(this.getDate()), + }, + }); + emit("files:file:updated", { fileid }); this.emitRefresh(true); this.close(); } catch (e) { @@ -333,12 +335,12 @@ export default class EditDate extends Mixins(GlobalMixin) { const offset = date.getTime() - pDate.getTime(); const scale = diff > 0 ? diffNew / diff : 0; const pDateNew = new Date(dateNew.getTime() - offset * scale); - const res = await axios.patch( - generateUrl(EDIT_API_URL, { id: p.fileid }), - { - date: this.getExifFormat(pDateNew), - } - ); + await axios.patch(generateUrl(EDIT_API_URL, { id: p.fileid }), { + raw: { + DateTimeOriginal: this.getExifFormat(pDateNew), + }, + }); + emit("files:file:updated", { fileid: p.fileid }); } catch (e) { if (e.response?.data?.message) { showError(e.response.data.message); diff --git a/src/components/modal/MultiPathSelectionModal.vue b/src/components/modal/MultiPathSelectionModal.vue new file mode 100644 index 00000000..b8b03165 --- /dev/null +++ b/src/components/modal/MultiPathSelectionModal.vue @@ -0,0 +1,112 @@ + + + + {{ title }} + + + + + {{ path }} + + + + {{ t("memories", "Remove") }} + + + + + + + + + {{ t("memories", "Add Path") }} + + + {{ t("memories", "Save") }} + + + + + + + + diff --git a/src/main.ts b/src/main.ts index 6bdab668..a59d656d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -29,12 +29,16 @@ import "vue-virtual-scroller/dist/vue-virtual-scroller.css"; import App from "./App.vue"; import router from "./router"; +import { IPhoto } from "./types"; // Global exposed variables declare global { var vuerouter: typeof router; var OC: Nextcloud.v24.OC; var OCP: Nextcloud.v24.OCP; + + var editDate: (photo: IPhoto) => void; + var currentViewerPhoto: IPhoto; } globalThis.vuerouter = router; diff --git a/src/services/Utils.ts b/src/services/Utils.ts index 858ddf0f..548af5d6 100644 --- a/src/services/Utils.ts +++ b/src/services/Utils.ts @@ -69,6 +69,26 @@ export function getFromNowStr(date: Date) { return text.charAt(0).toUpperCase() + text.slice(1); } +/** Convert number of seconds to time string */ +export function getDurationStr(sec: number) { + let hours = Math.floor(sec / 3600); + let minutes: number | string = Math.floor((sec - hours * 3600) / 60); + let seconds: number | string = sec - hours * 3600 - minutes * 60; + + if (seconds < 10) { + seconds = "0" + seconds; + } + + if (hours > 0) { + if (minutes < 10) { + minutes = "0" + minutes; + } + return `${hours}:${minutes}:${seconds}`; + } + + return `${minutes}:${seconds}`; +} + /** * Returns a hash code from a string * @param {String} str The string to hash. diff --git a/src/services/dav/base.ts b/src/services/dav/base.ts index c991421f..4365aedd 100644 --- a/src/services/dav/base.ts +++ b/src/services/dav/base.ts @@ -55,6 +55,7 @@ export async function getFiles(photos: IPhoto[]): Promise { photosWithFilename.map((photo) => { const prefixPath = `/files/${getCurrentUser()?.uid}`; return { + id: photo.fileid, fileid: photo.fileid, filename: photo.filename.replace(prefixPath, ""), originalFilename: photo.filename, diff --git a/src/services/dav/download.ts b/src/services/dav/download.ts index 48d0d7c7..4684a371 100644 --- a/src/services/dav/download.ts +++ b/src/services/dav/download.ts @@ -102,5 +102,5 @@ export function getDownloadLink(photo: IPhoto) { } } - return `/remote.php/dav${photo.filename}`; // normal route + return `/remote.php/dav${photo.filename}`; } diff --git a/src/types.ts b/src/types.ts index 83ec8ec7..c0196457 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,8 @@ import { VueConstructor } from "vue"; export type IFileInfo = { + /** Same as fileid */ + id: number; /** Database file ID */ fileid: number; /** Full file name, e.g. /pi/test/Qx0dq7dvEXA.jpg */ @@ -75,6 +77,8 @@ export type IPhoto = { /** Video flag from server */ isvideo?: boolean; + /** Video duration from server */ + video_duration?: number; /** Favorite flag from server */ isfavorite?: boolean; /** Is this a folder */ @@ -146,10 +150,13 @@ export type IRow = { selected?: boolean; /** Main list of photo items */ photos?: IPhoto[]; + /** Height in px of the row */ size?: number; /** Count of placeholders to create */ pct?: number; + /** Don't remove dom element */ + virtualSticky?: boolean; }; export type IHeadRow = IRow & { type: IRowType.HEAD;