Compare commits

..

1 Commits

Author SHA1 Message Date
Mees Frensel de9abf8ce9 fix(web): URI encode slug and reduce confusion for users 2026-07-10 12:24:06 +02:00
12 changed files with 63 additions and 54 deletions
+1 -1
View File
@@ -2180,7 +2180,7 @@
"video_quality": "Якасць відэа",
"videos": "Відэа",
"videos_count": "{count, plural, one {# відэа} other {# відэа}}",
"view": "Выгляд",
"view": "Прагляд",
"view_album": "Праглядзець альбом",
"view_all": "Праглядзець усё",
"view_all_users": "Праглядзець усех карыстальнікаў",
+1 -1
View File
@@ -108,7 +108,7 @@
"image_thumbnail_quality_description": "Kvalita miniatur od 1 do 100. Vyšší je lepší, ale vytváří větší soubory a může snížit odezvu aplikace.",
"image_thumbnail_title": "Miniatury",
"import_config_from_json_description": "Importujte konfiguraci systému nahráním konfiguračního JSON souboru",
"integrity_checks_checksum_files": "Kontrolní součty souborů",
"integrity_checks_checksum_files": "Soubory s kontrolními součty",
"integrity_checks_checksum_files_description": "Nastavení kontroly kontrolního součtu",
"integrity_checks_checksum_files_enable_description": "Zapnout kontrolu kontrolního součtu",
"integrity_checks_checksum_files_percentage_limit": "Procentuální limit",
+3 -2
View File
@@ -814,7 +814,7 @@
"custom_date": "Custom date",
"custom_locale": "Custom locale",
"custom_locale_description": "Format dates, times, and numbers based on the selected language and region",
"custom_url": "Custom URL",
"custom_url_name": "Custom URL name",
"cutoff_date_description": "Keep photos from the last…",
"cutoff_day": "{count, plural, one {day} other {days}}",
"cutoff_year": "{count, plural, one {year} other {years}}",
@@ -1948,7 +1948,8 @@
"shared_link_app_bar_title": "Shared Links",
"shared_link_clipboard_copied_massage": "Copied to clipboard",
"shared_link_create_error": "Error while creating shared link",
"shared_link_custom_url_description": "Access this shared link with a custom URL",
"shared_link_custom_url_description": "Access this shared link with a custom URL name",
"shared_link_custom_url_warning": "Warning: a custom URL name with a forward slash may not behave as you expect.",
"shared_link_edit_description_hint": "Enter the share description",
"shared_link_edit_expire_after_option_day": "1 day",
"shared_link_edit_expire_after_option_days": "{count} days",
-2
View File
@@ -434,7 +434,6 @@
"transcoding_realtime_resolutions": "Risoluzioni",
"transcoding_realtime_resolutions_description": "Le risoluzioni offerte per la transcodifica in tempo reale. Risoluzioni più elevate possono causare problemi di riproduzione se il server non riesce a transcodificarle abbastanza rapidamente.",
"transcoding_realtime_video_codecs": "Codec video",
"transcoding_realtime_video_codecs_description": "I codec video disponibili per la transcodifica in tempo reale. I client sceglieranno l'opzione migliore tra quelle supportate durante la riproduzione. L'AV1 è più efficiente dell'HEVC, che a sua volta è più efficiente dell'H.264. Quando si utilizza l'accelerazione hardware, selezionare solo i codec che l'acceleratore è in grado di codificare. Quando si utilizza la transcodifica software, tenere presente che l'H.264 è più veloce dell'AV1, che a sua volta è più veloce dell'HEVC.",
"transcoding_reference_frames": "Frame di riferimento",
"transcoding_reference_frames_description": "Il numero di frame da prendere in considerazione nel comprimere un determinato frame. Valori più alti migliorano l'efficienza di compressione, ma rallentano la codifica. 0 imposta questo valore automaticamente.",
"transcoding_required_description": "Solo video che non sono in un formato accettato",
@@ -2191,7 +2190,6 @@
"upload_status_errors": "Errori",
"upload_status_uploaded": "Caricato",
"upload_success": "Caricamento completato, aggiorna la pagina per vedere le nuove risorse caricate.",
"upload_to_album_body": "Per gli utenti che non utilizzano la funzione di caricamento manuale, ora è possibile scegliere di aggiungere le foto locali direttamente a un album mentre le si carica, senza più bisogno di caricarle prima per poi aggiungerle a un album in un secondo momento.",
"upload_to_album_title": "Carica direttamente in un album",
"upload_to_immich": "Carica su Immich ({count})",
"uploading": "Caricamento",
+1 -7
View File
@@ -108,7 +108,7 @@
"image_thumbnail_quality_description": "Qualidade das miniaturas de 1 a 100. Maior é melhor, mas produz tamanhos de ficheiro maiores e podem reduzir a capacidade de resposta da aplicação.",
"image_thumbnail_title": "Definições de Miniaturas",
"import_config_from_json_description": "Importar configuração do sistema ao carregar um ficheiro JSON",
"integrity_checks_checksum_files": "Checksum de ficheiros",
"integrity_checks_checksum_files": "Ficheiros de checksum",
"integrity_checks_checksum_files_description": "Configurar a verificação de checksum",
"integrity_checks_checksum_files_enable_description": "Ativar a verificação de checksum",
"integrity_checks_checksum_files_percentage_limit": "Limite percentual",
@@ -431,10 +431,6 @@
"transcoding_realtime_description": "Permite que a transcodificação seja efetuada em tempo real enquanto o vídeo a está a ser transmitido. Permite a alteração de qualidade, mas pode causar um maior atraso na reprodução e lentidão dependendo da capacidade do servidor.",
"transcoding_realtime_enabled": "Ativar transcodificação em tempo real",
"transcoding_realtime_enabled_description": "Se estiver desativado, o servidor irá recusar o início de novas sessões de transcodificação em tempo real.",
"transcoding_realtime_resolutions": "Resoluções",
"transcoding_realtime_resolutions_description": "As resoluções que são disponibilizadas para transcodificação em tempo real. Resoluções mais altas podem causar problemas de reprodução se o servidor não conseguir transcodificá-las com rapidez suficiente.",
"transcoding_realtime_video_codecs": "Codecs de vídeo",
"transcoding_realtime_video_codecs_description": "Os codecs de vídeo que são disponibilizados para transcodificação em tempo real. Os clientes vão escolher a melhor opção que suportam durante a reprodução. AV1 é mais eficiente do que HEVC, que por sua vez é mais eficiente do que H.264. Ao utilizar aceleração por hardware, selecione apenas os codecs que o acelerador consegue codificar. Ao utilizar transcodificação por software, observe que H.264 é mais rápido do que AV1, que por sua vez é mais rápido do que HEVC.",
"transcoding_reference_frames": "Quadros de referência",
"transcoding_reference_frames_description": "O número de quadros a serem referenciados ao comprimir um determinado quadro. Valores mais altos melhoram a eficiência da compressão, mas tornam a codificação mais lenta. 0 define esse valor automaticamente.",
"transcoding_required_description": "Apenas vídeos que não estejam num formato aceite",
@@ -597,7 +593,6 @@
"asset_viewer_settings_title": "Visualizador",
"assets": "Ficheiros",
"assets_added_to_album_count": "{count, plural, one {# ficheiro adicionado} other {# ficheiros adicionados}} ao álbum",
"assets_added_to_album_partial_count": "{totalCount, plural, one {Foi adicionado} other {Foram adicionados}} {successCount} de {totalCount} {totalCount, plural, one {ficheiro} other {ficheiros}} ao álbum",
"assets_added_to_albums_count": "{assetTotal, plural, one {Foi adicionado # ficheiro} other {Foram adiciondos # ficheiros}} a {albumTotal, plural, one {# álbum} other {# albuns}}",
"assets_cannot_be_added_to_album_count": "Não foi possível adicionar {count, plural, one {ficheiro} other {ficheiros}} ao álbum",
"assets_cannot_be_added_to_albums": "{count, plural, one {Ficheiro não pode ser adicionado} other {Ficheiros não podem ser adiciondos}} a nenhum dos álbuns",
@@ -2155,7 +2150,6 @@
"unknown": "Desconhecido",
"unknown_country": "País desconhecido",
"unknown_date": "Data desconhecida",
"unknown_schema": "Esquema desconhecido",
"unknown_year": "Ano desconhecido",
"unlimited": "Ilimitado",
"unlink_motion_video": "Remover relação com video animado",
+31 -31
View File
@@ -392,52 +392,52 @@
"transcoding_acceleration_qsv": "Quick Sync (требуется процессор Intel 7-го поколения или новее)",
"transcoding_acceleration_rkmpp": "RKMPP (только для SOC Rockchip)",
"transcoding_acceleration_vaapi": "VAAPI",
"transcoding_accepted_audio_codecs": "Допустимые аудиокодеки",
"transcoding_accepted_audio_codecs_description": "Выберите аудиокодеки, видео с которыми не нужно перекодировать. Используется только для определенных политик перекодирования.",
"transcoding_accepted_containers": "Допустимые контейнеры",
"transcoding_accepted_audio_codecs": "Поддерживаемые аудиокодеки",
"transcoding_accepted_audio_codecs_description": "Выберите аудиокодеки, которые не нужно перекодировать. Используется только для определенных политик перекодирования.",
"transcoding_accepted_containers": "Поддерживаемые контейнеры",
"transcoding_accepted_containers_description": "Выберите, какие форматы контейнеров не нужно преобразовывать в MP4. Используется только для определенных политик перекодирования.",
"transcoding_accepted_video_codecs": "Допустимые видеокодеки",
"transcoding_accepted_video_codecs_description": "Выберите видеокодеки, видео с которыми не нужно перекодировать. Используется только для определенных политик перекодирования.",
"transcoding_advanced_options_description": "Параметры, которые большинству пользователей не следует изменять",
"transcoding_accepted_video_codecs": "Поддерживаемые видеокодеки",
"transcoding_accepted_video_codecs_description": "Выберите видеокодеки, которые не нужно перекодировать. Используется только для определенных политик перекодирования.",
"transcoding_advanced_options_description": "Параметры, которые большинству пользователей не следует менять",
"transcoding_audio_codec": "Аудиокодек",
"transcoding_audio_codec_description": "Opus — вариант самого высокого качества, но имеет меньшую совместимость со старыми устройствами или программным обеспечением.",
"transcoding_bitrate_description": "Видео с битрейтом выше максимального или в недопустимом формате",
"transcoding_bitrate_description": "Видео с битрейтом выше максимального или в неподходящем формате может вызвать проблемы",
"transcoding_codecs_learn_more": "Для понимания используемой терминологии обратитесь к документации FFmpeg по кодекам <h264-link>H.264</h264-link>, <hevc-link>HEVC</hevc-link> и <vp9-link>VP9</vp9-link>.",
"transcoding_constant_quality_mode": "Режим постоянного качества",
"transcoding_constant_quality_mode_description": "Режим ICQ лучше, чем CQP, но некоторые устройства аппаратного ускорения его не поддерживают. Установка этой опции будет отдавать предпочтение указанному режиму при использовании кодирования на основе качества. NVENC не поддерживает режим ICQ.",
"transcoding_constant_rate_factor": "Постоянный коэффициент скорости (-crf)",
"transcoding_constant_rate_factor": "Коэффициент постоянной скорости (-crf)",
"transcoding_constant_rate_factor_description": "Уровень качества видео. Типичные значения: 23 для H.264, 28 для HEVC, 31 для VP9 и 35 для AV1. Чем ниже, тем лучше, но при этом создаются файлы большего размера.",
"transcoding_disabled_description": "Не перекодировать никакие видео, может привести к проблемам воспроизведения на некоторых клиентах",
"transcoding_disabled_description": "Не перекодировать видео, это может привести к сбою воспроизведения на некоторых клиентах",
"transcoding_encoding_options": "Параметры кодирования",
"transcoding_encoding_options_description": "Кодеки, разрешение, качество и другие параметры для перекодирования видео",
"transcoding_encoding_options_description": "Установите кодеки, разрешение, качество и другие параметры для кодированного видео",
"transcoding_hardware_acceleration": "Аппаратное ускорение",
"transcoding_hardware_acceleration_description": "Экспериментально: более быстрое транскодирование, но с возможным ухудшением качества при том же битрейте",
"transcoding_hardware_decoding": "Аппаратное декодирование",
"transcoding_hardware_decoding_setting_description": "Дополнительно ускоряет декодирование, а не только кодирование. Может работать не со всеми видео.",
"transcoding_max_b_frames": "Максимальное количество промежуточных кадров",
"transcoding_max_b_frames_description": "Более высокие значения повышают эффективность сжатия, но замедляют кодирование. Может быть несовместимо с аппаратным ускорением на старых устройствах. Значение 0 полностью отключает создание промежуточных B-кадров, а -1 - устанавливает автоматическое определение их количества.",
"transcoding_max_b_frames": "Максимально промежуточных кадров",
"transcoding_max_b_frames_description": "Более высокие значения повышают эффективность сжатия, но замедляют кодирование. Может быть несовместимо с аппаратным ускорением на старых устройствах. 0 отключает B-кадры, а -1 устанавливает это значение автоматически.",
"transcoding_max_bitrate": "Максимальный битрейт",
"transcoding_max_bitrate_description": "Ограничение битрейта может сделать размер файла более предсказуемым при незначительном снижении качества. При разрешении 720p типичными значениями являются 2600 кбит/с для кодеков VP9 или HEVC и 4500 кбит/с для H.264. Ограничение отключено, если задано значение 0. Когда единица измерения не указана, предполагается k (кбит/с); поэтому значения 5000, 5000k и 5M (для Мбит/с) эквивалентны.",
"transcoding_max_keyframe_interval": "Максимальный интервал ключевых кадров",
"transcoding_max_keyframe_interval_description": "Устанавливает максимальное расстояние между ключевыми кадрами. Более низкие значения ухудшают эффективность сжатия, но сокращают время поиска и могут улучшить качество в сценах с быстрым движением. Значение 0 устанавливает автоматическое определение.",
"transcoding_optimal_description": "Видео с разрешениями выше целевого или в недопустимом формате",
"transcoding_policy": "Политика перекодирования",
"transcoding_policy_description": "Какие видео должны подвергаться перекодированию",
"transcoding_max_keyframe_interval_description": "Устанавливает максимальное расстояние между ключевыми кадрами. Более низкие значения ухудшают эффективность сжатия, но сокращают время поиска и могут улучшить качество в сценах с быстрым движением. 0 устанавливает это значение автоматически.",
"transcoding_optimal_description": "Видео с разрешением выше целевого или не в принятом формате",
"transcoding_policy": "Политика перекодировки",
"transcoding_policy_description": "Установите, когда видео будет перекодировано",
"transcoding_preferred_hardware_device": "Предпочитаемое аппаратное устройство",
"transcoding_preferred_hardware_device_description": "Применяется только к VAAPI и QSV. Устанавливает dri-узел, используемый для аппаратного транскодирования.",
"transcoding_preset_preset": "Профиль кодирования (-preset)",
"transcoding_preset_preset_description": "Определяют скорость сжатия. Более медленные профили приводят к созданию файлов меньшего размера и повышают качество при установке достаточного битрейта. VP9 игнорирует профили выше “faster”.",
"transcoding_realtime": "[ЭКСПЕРИМЕНТАЛЬНО] Транскодирование в реальном времени",
"transcoding_realtime_description": "Позволяет транскодировать видео в режиме реального времени во время воспроизведения. Поддерживает переключение качества, но может вызывать задержки воспроизведения и подтормаживания в случае недостаточной производительности сервера.",
"transcoding_realtime_enabled": "Включить транскодирование в реальном времени",
"transcoding_realtime_enabled_description": "Отключение приведёт к недоступности транскодирования в реальном времени.",
"transcoding_preset_preset": "Предустановка",
"transcoding_preset_preset_description": "Скорость сжатия. Медленные настройки создают более маленькие файлы и повышают качество при достижении определенного битрейта. VP9 игнорирует скорости выше “faster”.",
"transcoding_realtime": "[ЭКСПЕРИМЕНТАЛЬНО] Перекодирование в реальном времени",
"transcoding_realtime_description": "Позволяет перекодировать видео в режиме реального времени во время воспроизведения. Поддерживает переключение качества, но может вызывать более высокие задержки воспроизведения и подтормаживания в зависимости от производительности сервера.",
"transcoding_realtime_enabled": "Включить перекодирование в реальном времени",
"transcoding_realtime_enabled_description": "Отключение параметра приведёт к недоступности запуска перекодирования в реальном времени.",
"transcoding_realtime_resolutions": "Разрешения",
"transcoding_realtime_resolutions_description": "Доступные разрешения для транскодирования в реальном времени. Высокие разрешения могут вызвать проблемы с воспроизведением, если возможностей сервера будет недостаточно.",
"transcoding_realtime_video_codecs": "Видеокодеки",
"transcoding_realtime_video_codecs_description": "Доступные видеокодеки для транскодирования в реальном времени. Клиенты будут выбирать наиболее подходящий кодек во время воспроизведения. AV1 эффективнее, чем HEVC, который, в свою очередь, эффективнее, чем H.264. При использовании аппаратного ускорения выбирайте только те кодеки, которые поддерживает ускоритель. При использовании программного перекодирования обратите внимание, что H.264 быстрее, чем AV1, который, в свою очередь, быстрее, чем HEVC.",
"transcoding_reference_frames": "Опорные кадры",
"transcoding_reference_frames_description": "Количество кадров, на которые следует ссылаться при сжатии текущего кадра. Более высокие значения повышают эффективность сжатия, но замедляют кодирование. Значение 0 устанавливает автоматическое определение их количества.",
"transcoding_required_description": "Только видео в недопустимом формате",
"transcoding_reference_frames_description": "Количество кадров, на которые следует ссылаться при сжатии данного кадра. Более высокие значения повышают эффективность сжатия, но замедляют кодирование. 0 устанавливает это значение автоматически.",
"transcoding_required_description": "Только видео в нестандартном формате",
"transcoding_settings": "Настройки транскодирования видео",
"transcoding_settings_description": "Управляйте тем, какие видео нужно перекодировать и как их обрабатывать",
"transcoding_target_resolution": "Целевое разрешение",
@@ -445,15 +445,15 @@
"transcoding_temporal_aq": "Temporal Adaptive Quantization (временное адаптивное квантование)",
"transcoding_temporal_aq_description": "Применимо только к NVENC (NVIDIA Encoder). Технология повышает качество высокодетализированных нединамичных сцен. Может быть несовместима со старыми устройствами.",
"transcoding_threads": "Потоки",
"transcoding_threads_description": "Более высокие значения приводят к более быстрому перекодированию, но отнимают больше ресурсов у сервера для выполнения других задач. Значение не должно превышать количество ядер процессора. Значение 0 максимизирует использование ресурсов.",
"transcoding_threads_description": "Более высокие значения приводят к более быстрому кодированию, но оставляют серверу меньше места для обработки других задач во время активности. Это значение не должно превышать количество ядер процессора. Максимизирует использование, если установлено значение 0.",
"transcoding_tone_mapping": "Отображение тонов",
"transcoding_tone_mapping_description": "Технология сохранения отображения HDR-видео при преобразовании в SDR. Каждый алгоритм предлагает разные компромиссы между цветом, детализацией и яркостью. Hable сохраняет детали, Mobius сохраняет цвет, а Reinhard сохраняет яркость.",
"transcoding_tone_mapping_description": "Пытается сохранить внешний вид HDR-видео при преобразовании в SDR. Каждый алгоритм делает разные компромиссы между цветом, детализацией и яркостью. Hable сохраняет детали, Mobius сохраняет цвет, а Reinhard сохраняет яркость.",
"transcoding_transcode_policy": "Политика перекодирования",
"transcoding_transcode_policy_description": "Определяет какие видео должны быть перекодированы. HDR-видео и видео с форматом пикселей, отличным от YUV 4:2:0, всегда будут перекодироваться (за исключением случаев, когда перекодирование отключено).",
"transcoding_transcode_policy_description": "Правила, определяющие, какие видео должны быть перекодированы. HDR-видео и видео с форматом пикселей, отличным от YUV 4:2:0, всегда будут перекодироваться (за исключением случаев, когда перекодирование отключено).",
"transcoding_two_pass_encoding": "Двухпроходное кодирование",
"transcoding_two_pass_encoding_setting_description": "Перекодирование в два прохода для получения более качественного видео. Когда включён максимальный битрейт (требуется для работы с H.264 и HEVC), этот режим использует диапазон битрейта, опираясь на значение максимального битрейта, и игнорирует CRF (постоянный коэффициент скорости). Для VP9 CRF может использоваться только если отключён максимальный битрейт.",
"transcoding_two_pass_encoding_setting_description": "Перекодируйте за два прохода, чтобы получить более качественное кодирование видео. Когда включен максимальный битрейт (необходим для работы с H.264 и HEVC), в этом режиме используется диапазон битрейта, основанный на максимальном битрейте, и игнорируется CRF. Для VP9 можно использовать CRF, если отключен максимальный битрейт.",
"transcoding_video_codec": "Видеокодек",
"transcoding_video_codec_description": "VP9 обладает высокой эффективностью и веб-совместимостью, но перекодирование занимает больше времени. HEVC работает аналогично, но имеет меньшую веб-совместимость. H.264 широко совместим и быстро кодируется, но создаёт файлы гораздо большего размера. AV1 — наиболее эффективный кодек, но он не поддерживается старыми устройствами.",
"transcoding_video_codec_description": "VP9 обладает высокой эффективностью и веб-совместимостью, но перекодирование занимает больше времени. HEVC работает аналогично, но имеет меньшую веб-совместимость. H.264 широко совместим и быстро перекодируется, но создает файлы гораздо большего размера. AV1 — наиболее эффективный кодек, но он не поддерживается на старых устройствах.",
"trash_enabled_description": "Включить корзину",
"trash_number_of_days": "Срок хранения",
"trash_number_of_days_description": "Количество дней, в течение которых файлы будут храниться в корзине до окончательного удаления",
@@ -479,7 +479,7 @@
"user_successfully_removed": "Пользователь {email} успешно удален.",
"users_page_description": "Управление пользователями системы",
"version_check_channel": "Канал обновлений",
"version_check_channel_description": "Выберите канал по которому получать уведомления о новых версиях",
"version_check_channel_description": "Выберите канал по которым получать уведомления о новых версиях",
"version_check_enabled_description": "Включить проверку наличия новых версий",
"version_check_implications": "Функция проверки версии периодически обращается к сайту {server}",
"version_check_settings": "Проверка версии",
@@ -1728,7 +1728,7 @@
"recently_added_title": "Недавно добавленные",
"recently_taken": "Недавно снято",
"refresh": "Обновить",
"refresh_encoded_videos": "Обновить перекодированные видео",
"refresh_encoded_videos": "Обновить закодированные видео",
"refresh_faces": "Обновить лица",
"refresh_metadata": "Обновить метаданные",
"refresh_thumbnails": "Обновить миниатюры",
-2
View File
@@ -431,8 +431,6 @@
"transcoding_realtime_description": "Videonun akışı sırasında kod dönüştürme işleminin gerçek zamanlı olarak yapılmasını sağlar. Kalite değiştirmeye olanak tanır, ancak sunucu yeteneklerine bağlı olarak daha yüksek oynatma gecikmesine ve takılmalara neden olabilir.",
"transcoding_realtime_enabled": "Gerçek zamanlı kod dönüştürmeyi etkinleştirin",
"transcoding_realtime_enabled_description": "Devre dışı bırakılırsa, sunucu yeni gerçek zamanlı kod dönüştürme oturumları başlatmayı reddedecektir.",
"transcoding_realtime_resolutions": "Çözüm",
"transcoding_realtime_video_codecs": "Video kodekleri",
"transcoding_reference_frames": "Referans kareler",
"transcoding_reference_frames_description": "Belirli bir kareyi sıkıştırırken referans alınacak kare sayısı. Daha yüksek değerler sıkıştırma verimliliğini artırır, ancak kodlamayı yavaşlatır. 0 bu değeri otomatik olarak ayarlar.",
"transcoding_required_description": "Yalnızca kabul edilen formatta olmayan videolar",
@@ -1,6 +1,6 @@
<script lang="ts">
import SharedLinkExpiration from '$lib/components/SharedLinkExpiration.svelte';
import { Field, Input, PasswordInput, Switch, Text } from '@immich/ui';
import { Field, HelperText, Input, PasswordInput, Switch, Text } from '@immich/ui';
import { t } from 'svelte-i18n';
type Props = {
@@ -32,8 +32,11 @@
<div class="mt-4 flex flex-col gap-4">
<div>
<Field label={$t('custom_url')} description={$t('shared_link_custom_url_description')}>
<Field label={$t('custom_url_name')} description={$t('shared_link_custom_url_description')}>
<Input bind:value={slug} autocomplete="off" />
{#if slug.includes('/')}
<HelperText class="text-warning">{$t('shared_link_custom_url_warning')}</HelperText>
{/if}
</Field>
{#if slug}
<Text size="tiny" color="muted" class="pt-2 break-all">/s/{encodeURIComponent(slug)}</Text>
+14
View File
@@ -24,6 +24,20 @@ describe('Route', () => {
});
});
describe(Route.viewSharedLink.name, () => {
it('should work with key', () => {
expect(Route.viewSharedLink({ key: 'uuid-key' })).toBe('/share/uuid-key');
});
it('should work with key and slug', () => {
expect(Route.viewSharedLink({ key: 'uuid-key', slug: 'custom-slug' })).toBe('/s/custom-slug');
});
it('should URI encode slug', () => {
expect(Route.viewSharedLink({ key: 'uuid-key', slug: 'albums/the-moon?' })).toBe('/s/albums%2Fthe-moon%3F');
});
});
describe(Route.tags.name, () => {
it('should work', () => {
expect(Route.tags()).toBe('/tags');
+2 -1
View File
@@ -120,7 +120,8 @@ export const Route = {
// shared links
sharedLinks: (params?: { filter?: SharedLinkTab }) => '/shared-links' + asQueryString(params),
editSharedLink: ({ id }: { id: string }) => `/shared-links/${id}/edit`,
viewSharedLink: ({ slug, key }: { slug?: string | null; key: string }) => (slug ? `/s/${slug}` : `/share/${key}`),
viewSharedLink: ({ slug, key }: { slug?: string | null; key: string }) =>
slug ? `/s/${encodeURIComponent(slug)}` : `/share/${key}`,
// settings
userSettings: (params?: { isOpen?: OpenQueryParam }) => '/user-settings' + asQueryString(params),
+1 -3
View File
@@ -60,9 +60,7 @@ export const getSharedLinkActions = ($t: MessageFormatter, sharedLink: SharedLin
};
export const asUrl = (sharedLink: SharedLinkResponseDto) => {
const path = sharedLink.slug
? `s/${encodeURIComponent(sharedLink.slug)}`
: `share/${encodeURIComponent(sharedLink.key)}`;
const path = Route.viewSharedLink(sharedLink);
return new URL(path, serverConfigManager.value.externalDomain || globalThis.location.origin).href;
};
@@ -56,8 +56,10 @@
{#if shareType === SharedLinkType.Individual}
<div class="text-sm">
{$t('individual_share')} |
<span class="text-primary">{sharedLink.description || ''}</span>
{$t('individual_share')}
{#if description !== ''}
| <span class="text-primary">{description}</span>
{/if}
</div>
{/if}