mirror of
https://github.com/photoprism/photoprism.git
synced 2026-07-17 16:49:04 +00:00
* Frontend: Add settings for albums, favorites, folders, and media features * Frontend: Enhance download settings for files and albums #848 * Frontend: Enhance download settings for files and albums #848 * Frontend: Update album download settings to restrict access to super admins * Frontend: Add album sorting options to settings for super admins * Frontend: Update download settings visibility * Frontend: Refine download settings access control for user roles * Tests: Add album, folder, moment, state, and month order selection options to page-model * Frontend: Update access control for super admins in settings to include scope check * Tests: Add new tests for download name and album order settings persistence * Tests: Implement new tests for default album sort order persistence in settings * Frontend: Move default album order settings * Frontend: Add zoom accessibility option in settings #799 * Frontend: Update download name from "Share Identifier" to "Share Friendly" and refine hints for download options in settings * Tests: Add new acceptance test for disabling album downloads while allowing file downloads in settings * Frontend: Improve download options layout and hints * Frontend: Refactor download options condition in settings page * Frontend: Implement native zoom control in lightbox component * Settings: Add Collections tab and move Services to its own page #848 #5429 - Add a super-admin Collections tab after Content holding the album Download and Sort Order settings; remove those cards from Content. - Move Services from a settings tab to a dedicated page (page/services.vue) with a search toolbar and a Reload / Learn More action menu; link it from the navigation settings menu. - Implement server-side services search (acc_name filter) with tests. - De-duplicate the picture sort-order options into a shared SortOrderOptions builder in options.js. - Update acceptance/unit tests and page models to match. * Frontend: Regenerate translation catalogs #848 #5429 Ran `make gettext-extract` to pick up the new settings strings (Collections, Features, Disable Downloads, and related messages) so Weblate can translate them. Existing translations are preserved. * Frontend: Move lightbox viewport-zoom handling into the view helper - Move the viewport pinch-zoom lock/restore (disableNativeZoom / restoreNativeZoom + savedViewportContent) from lightbox.vue onto the View singleton in common/view.js. - Drive it passively from View.apply() via a disableViewportZoom flag in the PLightbox case, alongside hideScrollbar / disableScrolling / disableNavigationGestures; lightbox.vue no longer references zoom. - Make save/restore idempotent and extract the viewport constants. - Cover the helpers and the apply() wiring in view.test.js. * Settings: Add Accessibility section to General with Reduce Motion #848 #5429 - Move the page-zoom checkbox out of the feature-flags grid into a dedicated Accessibility card (super-admin only) with four toggles: Open on Hover, Reduce Motion, Hide Scrollbar, and Allow Page Zoom. - Add a UI.ReduceMotion flag (defaults false) that toggles an html.reduce-motion class via config.setReduceMotion and suppresses map fly-to animations non-destructively (util.mapAnimateDuration). - Make Open on Hover apply live by reading shouldOpenOnHover() through a reactive computed in the action/auth/lightbox menus; Zoom and Hide Scrollbar reload since they are baked into the server-rendered HTML. - Reword two feature-grid hints to the "pictures" convention and cover the new helpers with Go and Vitest tests. * Frontend: Regenerate translation catalogs #848 #5429 Ran `make gettext-extract` to pick up the new Accessibility settings strings (Accessibility, Allow Page Zoom, Open on Hover, Hide Scrollbar, Reduce Motion, and their hints) and the reworded feature-grid hints. Existing translations are preserved. --------- Co-authored-by: Michael Mayer <michael@photoprism.app>
This commit is contained in:
parent
a22c99dd12
commit
6dc0acac13
126 changed files with 15234 additions and 10288 deletions
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-28 15:07+0000\n"
|
||||
"Last-Translator: jean-louis67 <jean-louis.frenkel@orange.fr>\n"
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
@ -15,8 +15,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(n>"
|
||||
"6 && n<11) ? 3 : 4;\n"
|
||||
"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :"
|
||||
"(n>6 && n<11) ? 3 : 4;\n"
|
||||
"X-Generator: Weblate 2026.5\n"
|
||||
|
||||
#: messages.go:112
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: DeepL <noreply-mt-deepl@weblate.org>\n"
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: ci@photoprism.app\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-06-27 09:13+0000\n"
|
||||
"PO-Revision-Date: 2026-06-27 10:28+0000\n"
|
||||
"Last-Translator: Google Cloud Translation Basic <noreply-mt-google-"
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ import Labels from "page/labels.vue";
|
|||
import People from "page/people.vue";
|
||||
import Library from "page/library.vue";
|
||||
import Settings from "page/settings.vue";
|
||||
import Services from "page/services.vue";
|
||||
import Admin from "page/admin.vue";
|
||||
import Cluster from "page/cluster.vue";
|
||||
import Login from "page/auth/login.vue";
|
||||
|
|
@ -676,6 +677,19 @@ export default [
|
|||
},
|
||||
props: { tab: "settings_content" },
|
||||
},
|
||||
{
|
||||
name: "settings_collections",
|
||||
path: "/settings/collections",
|
||||
component: Settings,
|
||||
meta: {
|
||||
title: $gettext("Settings"),
|
||||
requiresAuth: true,
|
||||
admin: true,
|
||||
settings: true,
|
||||
background: "background",
|
||||
},
|
||||
props: { tab: "settings_collections" },
|
||||
},
|
||||
{
|
||||
name: "settings_media",
|
||||
path: "/settings/media",
|
||||
|
|
@ -697,7 +711,7 @@ export default [
|
|||
{
|
||||
name: "settings_services",
|
||||
path: "/settings/services",
|
||||
component: Settings,
|
||||
component: Services,
|
||||
meta: {
|
||||
title: $gettext("Settings"),
|
||||
requiresAuth: true,
|
||||
|
|
@ -705,7 +719,15 @@ export default [
|
|||
settings: true,
|
||||
background: "background",
|
||||
},
|
||||
props: { tab: "settings_services" },
|
||||
beforeEnter: (to, from, next) => {
|
||||
if ($session.loginRequired()) {
|
||||
next({ name: loginRoute });
|
||||
} else if (!$config.feature("services") || $config.deny("services", "manage")) {
|
||||
next({ name: $session.getDefaultRoute() });
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "settings_account",
|
||||
|
|
|
|||
|
|
@ -149,6 +149,8 @@ export default class Config {
|
|||
} else {
|
||||
this.setTheme("default");
|
||||
}
|
||||
|
||||
this.setReduceMotion(this.getSettings()?.ui.reduceMotion);
|
||||
}
|
||||
|
||||
loading() {
|
||||
|
|
@ -209,6 +211,7 @@ export default class Config {
|
|||
this.setBatchSize(values.settings);
|
||||
await this.setLanguage(this.getLanguageLocale(), true);
|
||||
this.setTheme(values.settings.ui.theme);
|
||||
this.setReduceMotion(values.settings.ui.reduceMotion);
|
||||
}
|
||||
|
||||
// Adjust album counts by access level.
|
||||
|
|
@ -591,6 +594,16 @@ export default class Config {
|
|||
}
|
||||
}
|
||||
|
||||
// setReduceMotion toggles the "reduce-motion" class on the <html> element so CSS can
|
||||
// suppress interface animations and transitions when the accessibility setting is enabled.
|
||||
setReduceMotion(enabled) {
|
||||
if (document && document.documentElement) {
|
||||
document.documentElement.classList.toggle("reduce-motion", !!enabled);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
// getSettings returns the current user's configuration settings.
|
||||
getSettings() {
|
||||
return this.values.settings;
|
||||
|
|
@ -612,6 +625,7 @@ export default class Config {
|
|||
this.setBatchSize(settings);
|
||||
this.setLanguage(settings.ui.language, false);
|
||||
this.setTheme(settings.ui.theme);
|
||||
this.setReduceMotion(settings.ui.reduceMotion);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
export default {
|
||||
docs: "https://link.photoprism.app/docs",
|
||||
userGuide: "https://docs.photoprism.app/user-guide/",
|
||||
syncSettings: "https://docs.photoprism.app/user-guide/settings/sync/",
|
||||
developerGuide: "https://docs.photoprism.app/developer-guide/",
|
||||
developerSetup: "https://docs.photoprism.app/developer-guide/setup/",
|
||||
firstSteps: "https://docs.photoprism.app/user-guide/first-steps/",
|
||||
|
|
|
|||
|
|
@ -476,6 +476,21 @@ export default class $util {
|
|||
return ($config.getSettings()?.ui?.openOnHover ?? true) && !$util.hasTouch();
|
||||
}
|
||||
|
||||
// mapAnimateDuration returns the map fly-to animation duration in milliseconds, forcing 0
|
||||
// (no animation) when the Reduce Motion accessibility setting is enabled. A non-negative
|
||||
// overrideMs takes precedence over the global Maps.Animate preference.
|
||||
static mapAnimateDuration(settings, overrideMs = -1) {
|
||||
if (settings?.ui?.reduceMotion) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (overrideMs >= 0) {
|
||||
return overrideMs;
|
||||
}
|
||||
|
||||
return settings?.maps?.animate ?? 0;
|
||||
}
|
||||
|
||||
// isMobile returns true when the current user agent or touch capability indicates a mobile device.
|
||||
// The `> 2` touch check covers iPads in desktop mode, where the user agent omits the mobile hint.
|
||||
static isMobile() {
|
||||
|
|
|
|||
|
|
@ -5,6 +5,15 @@ import { getAppSessionStorage, getAppStorage } from "common/storage";
|
|||
const TouchStartEvent = "touchstart";
|
||||
const TouchMoveEvent = "touchmove";
|
||||
|
||||
// Selector for the document's viewport meta tag.
|
||||
const ViewportMetaSelector = 'meta[name="viewport"]';
|
||||
|
||||
// Viewport content that disables the browser's native pinch-zoom of the whole page.
|
||||
const ViewportNoZoom = "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no";
|
||||
|
||||
// Token in a viewport content string indicating native zoom is already disabled.
|
||||
const ViewportNoZoomToken = "user-scalable=no";
|
||||
|
||||
// True if debug and/or trace logs should be recorded.
|
||||
const debug = window.__CONFIG__?.debug;
|
||||
const trace = window.__CONFIG__?.trace;
|
||||
|
|
@ -405,6 +414,7 @@ export class View {
|
|||
this.scopes = [];
|
||||
this.hideScrollbar = false;
|
||||
this.preventNavigation = false;
|
||||
this.savedViewportContent = "";
|
||||
this.focusScopes = new Map();
|
||||
|
||||
// Tracks the most recent history position and derived navigation direction so components can
|
||||
|
|
@ -555,6 +565,7 @@ export class View {
|
|||
let hideScrollbar = this.len() > 2 ? this.hideScrollbar : false;
|
||||
let disableScrolling = false;
|
||||
let disableNavigationGestures = false;
|
||||
let disableViewportZoom = false;
|
||||
let preventNavigation = uid > 0 && !name.startsWith("PPage");
|
||||
|
||||
switch (name) {
|
||||
|
|
@ -582,6 +593,7 @@ export class View {
|
|||
hideScrollbar = true;
|
||||
disableScrolling = true;
|
||||
disableNavigationGestures = true;
|
||||
disableViewportZoom = true;
|
||||
preventNavigation = true;
|
||||
break;
|
||||
}
|
||||
|
|
@ -661,6 +673,14 @@ export class View {
|
|||
}
|
||||
}
|
||||
|
||||
// Lock native pinch-zoom while a flagged overlay is active, restore it otherwise.
|
||||
// Both helpers are idempotent, so re-applying the same state is a no-op.
|
||||
if (disableViewportZoom) {
|
||||
this.disableNativeZoom();
|
||||
} else {
|
||||
this.restoreNativeZoom();
|
||||
}
|
||||
|
||||
if (debug) {
|
||||
console.groupEnd();
|
||||
}
|
||||
|
|
@ -818,6 +838,47 @@ export class View {
|
|||
return setFocus(el, selector, scroll);
|
||||
}
|
||||
|
||||
// disableNativeZoom locks the viewport so the browser can't pinch-zoom the whole page
|
||||
// while an overlay (e.g. the lightbox) handles zoom itself; restoreNativeZoom restores
|
||||
// the saved content. Idempotent; assumes one active overlay (savedViewportContent is
|
||||
// app-global), which View.apply() upholds by locking only for the top-of-stack view.
|
||||
disableNativeZoom() {
|
||||
if (this.savedViewportContent) {
|
||||
return;
|
||||
}
|
||||
|
||||
const viewport = document.querySelector(ViewportMetaSelector);
|
||||
|
||||
if (!viewport) {
|
||||
return;
|
||||
}
|
||||
|
||||
const content = viewport.getAttribute("content") || "";
|
||||
|
||||
// Nothing to restore if the base viewport already blocks zoom (e.g. the Zoom setting is off).
|
||||
if (content.includes(ViewportNoZoomToken)) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.savedViewportContent = content;
|
||||
viewport.setAttribute("content", ViewportNoZoom);
|
||||
}
|
||||
|
||||
// restoreNativeZoom restores the viewport content saved by disableNativeZoom, if any.
|
||||
restoreNativeZoom() {
|
||||
if (!this.savedViewportContent) {
|
||||
return;
|
||||
}
|
||||
|
||||
const viewport = document.querySelector(ViewportMetaSelector);
|
||||
|
||||
if (viewport) {
|
||||
viewport.setAttribute("content", this.savedViewportContent);
|
||||
}
|
||||
|
||||
this.savedViewportContent = "";
|
||||
}
|
||||
|
||||
// Navigates to the specified URL, optionally with a delay set in milliseconds and a blocked user interface.
|
||||
redirect(url, delay, blockUI) {
|
||||
// Return if no URL was passed.
|
||||
|
|
|
|||
|
|
@ -63,9 +63,15 @@ export default {
|
|||
return {
|
||||
visible: false,
|
||||
actions: [],
|
||||
openOnHover: this.$util.shouldOpenOnHover(),
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
// openOnHover reactively reflects the user's menu open-on-hover preference so a settings
|
||||
// change applies without a page reload (persistent menus keep no mount-time snapshot).
|
||||
openOnHover() {
|
||||
return this.$util.shouldOpenOnHover();
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
show() {
|
||||
this.actions = this.items().filter((action) => action.visible);
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@
|
|||
<script>
|
||||
import Album, { MaxLength as AlbumMaxLength } from "model/album";
|
||||
import { rules } from "common/form";
|
||||
import { AlbumSortOrder } from "options/options";
|
||||
|
||||
export default {
|
||||
name: "PAlbumEditDialog",
|
||||
|
|
@ -118,16 +119,7 @@ export default {
|
|||
model: new Album(),
|
||||
growDesc: false,
|
||||
loading: false,
|
||||
sorting: [
|
||||
{ value: "newest", text: this.$gettext("Newest First") },
|
||||
{ value: "oldest", text: this.$gettext("Oldest First") },
|
||||
{ value: "added", text: this.$gettext("Recently Added") },
|
||||
{ value: "title", text: this.$gettext("Picture Title") },
|
||||
{ value: "name", text: this.$gettext("File Name") },
|
||||
{ value: "size", text: this.$gettext("File Size") },
|
||||
{ value: "duration", text: this.$gettext("Video Duration") },
|
||||
{ value: "relevance", text: this.$gettext("Most Relevant") },
|
||||
],
|
||||
sorting: AlbumSortOrder(),
|
||||
category: null,
|
||||
categories: this.$config.albumCategories(),
|
||||
rules,
|
||||
|
|
|
|||
|
|
@ -60,10 +60,16 @@ export default {
|
|||
data() {
|
||||
return {
|
||||
open: false,
|
||||
openOnHover: this.$util.shouldOpenOnHover(),
|
||||
instances: [],
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
// openOnHover reactively reflects the user's menu open-on-hover preference so a settings
|
||||
// change applies without a page reload (persistent menus keep no mount-time snapshot).
|
||||
openOnHover() {
|
||||
return this.$util.shouldOpenOnHover();
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.refresh();
|
||||
},
|
||||
|
|
|
|||
|
|
@ -56,9 +56,15 @@ export default {
|
|||
return {
|
||||
visible: false,
|
||||
actions: [],
|
||||
openOnHover: this.$util.shouldOpenOnHover(),
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
// openOnHover reactively reflects the user's menu open-on-hover preference so a settings
|
||||
// change applies without a page reload (persistent menus keep no mount-time snapshot).
|
||||
openOnHover() {
|
||||
return this.$util.shouldOpenOnHover();
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
show() {
|
||||
this.actions = this.items().filter((action) => action.visible);
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ export default {
|
|||
map: null,
|
||||
marker: null,
|
||||
position: [0.0, 0.0],
|
||||
animate: this.animateDuration >= 0 ? this.animateDuration : settings.maps.animate,
|
||||
animate: this.$util.mapAnimateDuration(settings, this.animateDuration),
|
||||
options: {
|
||||
container: null,
|
||||
// Styles can be edited/created with https://maplibre.org/maputnik/.
|
||||
|
|
|
|||
|
|
@ -550,6 +550,20 @@
|
|||
</v-list-item-title>
|
||||
</v-list-item>
|
||||
|
||||
<v-list-item
|
||||
v-if="canManageServices"
|
||||
:to="{ path: '/settings/services' }"
|
||||
:exact="false"
|
||||
variant="text"
|
||||
class="nav-services"
|
||||
:ripple="false"
|
||||
@click.stop=""
|
||||
>
|
||||
<v-list-item-title :class="`menu-item`">
|
||||
{{ $gettext(`Services`) }}
|
||||
</v-list-item-title>
|
||||
</v-list-item>
|
||||
|
||||
<v-list-item :to="{ name: 'license' }" :exact="true" variant="text" class="nav-license" :ripple="false" @click.stop="">
|
||||
<v-list-item-title :class="`menu-item`">
|
||||
{{ $gettext(`License`) }}
|
||||
|
|
@ -808,6 +822,7 @@ export default {
|
|||
canManagePhotos: canManagePhotos,
|
||||
canManagePeople: this.$config.allow("people", "manage"),
|
||||
canManageUsers: (!isPublic || isDemo) && this.$config.allow("users", "access_all"),
|
||||
canManageServices: this.$config.feature("services") && this.$config.allow("services", "manage"),
|
||||
appNameSuffix: appNameSuffix,
|
||||
appName: this.$config.getName(),
|
||||
appAbout: this.$config.getAbout(),
|
||||
|
|
|
|||
|
|
@ -398,40 +398,12 @@ export default {
|
|||
sortOptions() {
|
||||
switch (this.context) {
|
||||
case contexts.Archive:
|
||||
return [
|
||||
{ value: "newest", text: this.$gettext("Newest First") },
|
||||
{ value: "oldest", text: this.$gettext("Oldest First") },
|
||||
{ value: "added", text: this.$gettext("Recently Added") },
|
||||
{ value: "archived", text: this.$gettext("Recently Archived") },
|
||||
{ value: "title", text: this.$gettext("Picture Title") },
|
||||
{ value: "name", text: this.$gettext("File Name") },
|
||||
{ value: "size", text: this.$gettext("File Size") },
|
||||
{ value: "duration", text: this.$gettext("Video Duration") },
|
||||
];
|
||||
return options.SortOrderOptions(["newest", "oldest", "added", "archived", "title", "name", "size", "duration"]);
|
||||
case contexts.Hidden:
|
||||
case contexts.Review:
|
||||
return [
|
||||
{ value: "newest", text: this.$gettext("Newest First") },
|
||||
{ value: "oldest", text: this.$gettext("Oldest First") },
|
||||
{ value: "added", text: this.$gettext("Recently Added") },
|
||||
{ value: "title", text: this.$gettext("Picture Title") },
|
||||
{ value: "name", text: this.$gettext("File Name") },
|
||||
{ value: "size", text: this.$gettext("File Size") },
|
||||
{ value: "duration", text: this.$gettext("Video Duration") },
|
||||
];
|
||||
return options.SortOrderOptions(["newest", "oldest", "added", "title", "name", "size", "duration"]);
|
||||
default:
|
||||
return [
|
||||
{ value: "newest", text: this.$gettext("Newest First") },
|
||||
{ value: "oldest", text: this.$gettext("Oldest First") },
|
||||
{ value: "added", text: this.$gettext("Recently Added") },
|
||||
{ value: "edited", text: this.$gettext("Recently Edited") },
|
||||
{ value: "title", text: this.$gettext("Picture Title") },
|
||||
{ value: "name", text: this.$gettext("File Name") },
|
||||
{ value: "size", text: this.$gettext("File Size") },
|
||||
{ value: "duration", text: this.$gettext("Video Duration") },
|
||||
{ value: "similar", text: this.$gettext("Visual Similarity") },
|
||||
{ value: "relevance", text: this.$gettext("Most Relevant") },
|
||||
];
|
||||
return options.SortOrderOptions(["newest", "oldest", "added", "edited", "title", "name", "size", "duration", "similar", "relevance"]);
|
||||
}
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -253,7 +253,7 @@ export default {
|
|||
type: String,
|
||||
default: "",
|
||||
},
|
||||
// The parent passes `service.clone()` (see settings/services.vue) so the
|
||||
// The parent passes `service.clone()` (see page/services.vue) so the
|
||||
// dialog operates on a parent-owned clone — mutations are intentional and
|
||||
// do not bleed into the parent's list state. We accept it as `service` and
|
||||
// alias it as `model` via the computed below so the existing template and
|
||||
|
|
|
|||
|
|
@ -52,6 +52,17 @@ html.hide-scrollbar {
|
|||
scrollbar-width: none;
|
||||
}
|
||||
|
||||
/* Reduce interface animations and motion when the accessibility setting is enabled. */
|
||||
|
||||
html.reduce-motion *,
|
||||
html.reduce-motion *::before,
|
||||
html.reduce-motion *::after {
|
||||
transition-duration: 0.01ms !important;
|
||||
animation-duration: 0.01ms !important;
|
||||
animation-iteration-count: 1 !important;
|
||||
scroll-behavior: auto !important;
|
||||
}
|
||||
|
||||
body.nojs::-webkit-scrollbar,
|
||||
body.hide-scrollbar::-webkit-scrollbar,
|
||||
html.hide-scrollbar ::-webkit-scrollbar {
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue