diff --git a/.github/workflows/localization.yml b/.github/workflows/localization.yml new file mode 100644 index 00000000..a17b3338 --- /dev/null +++ b/.github/workflows/localization.yml @@ -0,0 +1,29 @@ +name: Localization + +on: + push: + branches: ["dev"] + pull_request: + branches: ["dev", "main"] + workflow_dispatch: + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + report: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v7.0.1 + + - uses: oven-sh/setup-bun@v2.2.0 + with: + bun-version: "1.3.14" + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Check catalogs and report status + run: | + bun run check + bun run localization:report -- --markdown | tee -a "$GITHUB_STEP_SUMMARY" diff --git a/.gitignore b/.gitignore index 19a93c6c..73fdecfb 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ coverage/ tmp/ .DS_Store *.tsbuildinfo +apps/web/src/paraglide/ .env diff --git a/Dockerfile b/Dockerfile index 74c1717a..7fc722c9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,10 +21,13 @@ ARG BUILD_VERSION=0.1.0 ARG BUILD_REVISION=development ARG BUILD_TIME=unknown +# Let the official entrypoint derive the resolver from the runtime network. +ENV NGINX_ENTRYPOINT_LOCAL_RESOLVERS=1 + RUN apk upgrade --no-cache libxml2 libcrypto3 libssl3 libexpat COPY --from=builder /app/apps/web/dist /usr/share/nginx/html -COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY nginx.conf /etc/nginx/templates/default.conf.template RUN short_revision="$(printf '%s' "$BUILD_REVISION" | cut -c1-12)" \ && printf '{"service":"typetype","version":"%s","revision":"%s","shortRevision":"%s","buildTime":"%s"}\n' \ "$BUILD_VERSION" "$BUILD_REVISION" "$short_revision" "$BUILD_TIME" \ diff --git a/LOCALIZATION.md b/LOCALIZATION.md new file mode 100644 index 00000000..6e67f72a --- /dev/null +++ b/LOCALIZATION.md @@ -0,0 +1,37 @@ +# Localization + +TypeType stores interface translations in `apps/web/messages`. +English is the source catalog. The Weblate component is scoped to +`apps/web/messages/*.json`; it must never import or edit the generated files in +`apps/web/src/paraglide`. + +## For Contributors + +Use [Weblate](https://translate.typetype.video/engage/typetype/) to translate +without writing code. Select a language, translate the available messages, and +submit the proposed changes there. Weblate sends the resulting catalog changes +back as a pull request targeting `dev`, where the normal checks validate keys, +placeholders, and the frontend build. + +The [translation status badge](https://translate.typetype.video/engage/typetype/) +in the README is supplied by Weblate. For a local, reproducible snapshot, run: + +```sh +bun run localization:report -- --markdown +``` + +The report distinguishes complete key coverage from values that differ from +English. The latter is only an indicator because product names and technical +labels can intentionally remain identical. + +To add a language: + +1. Add its BCP 47 code to `locales` in `apps/web/project.inlang/settings.json`. +2. Add a matching JSON catalog in `apps/web/messages`. +3. Translate existing values without changing their keys or parameters. +4. Add the language to the interface selector. +5. Run `bun run build`, `bun test`, and `bun run check` from the repository root. + +Missing messages fall back to English. Keep product names, protocol names, and +provider names unchanged unless their official localization differs. Never edit +`apps/web/src/paraglide` by hand; regenerate it with `bun run localize`. diff --git a/README.md b/README.md index 4c7d45cf..b8ad99df 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@
The React web client for TypeType.
+[](https://translate.typetype.video/engage/typetype/) + This repository contains the browser application and its nginx container. It owns the user interface, routing, settings, account flows, library views, and integration with the TypeType API and playback package. If you want to install or update a complete TypeType instance, use the [central TypeType repository](https://github.com/TypeType-Video/TypeType) and the [self-hosting documentation](https://typetype-video.github.io/Docs-TypeType/self-hosting/introduction). @@ -73,6 +75,12 @@ bun run sherif bun run build ``` +Translation contributors can use [Weblate](https://translate.typetype.video/engage/typetype/) +without editing code. The current catalog status can also be inspected locally +with `bun run localization:report -- --markdown`. See +[LOCALIZATION.md](LOCALIZATION.md) for the source catalog, Weblate sync rules, +and the contributor workflow. + Read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request. Bug reports and feature requests belong in the [central issue tracker](https://github.com/TypeType-Video/TypeType/issues). ## License diff --git a/THIRD_PARTY_ASSETS.md b/THIRD_PARTY_ASSETS.md new file mode 100644 index 00000000..a63133c8 --- /dev/null +++ b/THIRD_PARTY_ASSETS.md @@ -0,0 +1,17 @@ +# Third-party assets + +The data portability interface uses the following unmodified project icons for +identification. Each asset remains covered by its source project's license and +trademark rules; the repository's MIT license does not relicense these files. + +| Asset | Source file | Source revision | License | +|---|---|---|---| +| `flow.png` | [Flow icon](https://github.com/A-EDev/Flow/blob/c98a425bd55eca5a8d0edc74981d30c52379fb1b/fastlane/metadata/android/en-US/images/icon.png) | `c98a425bd55eca5a8d0edc74981d30c52379fb1b` | GPL-3.0 | +| `grayjay.png` | [Grayjay launcher icon](https://github.com/futo-org/grayjay-android/blob/3d62258fb2b28f65c3fe7d03357af7c63deb712f/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png) | `3d62258fb2b28f65c3fe7d03357af7c63deb712f` | Source First License 1.1 | +| `materialious.png` | [Materialious launcher icon](https://github.com/Materialious/Materialious/blob/32121b880a7287f70de9ee71634fc11beba52ce4/materialious/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png) | `32121b880a7287f70de9ee71634fc11beba52ce4` | AGPL-3.0 | +| `skytube.png` | [SkyTube launcher icon](https://github.com/SkyTubeTeam/SkyTube/blob/46d9d393f584a5698689dd4e0145058c6ca8801c/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png) | `46d9d393f584a5698689dd4e0145058c6ca8801c` | GPL-3.0 | +| `viewtube.png` | [ViewTube icon](https://github.com/ViewTube/viewtube/blob/2b0183cba46e7a525e363c47bb6df7a62faf5dd1/client/app/assets/icon-192.png) | `2b0183cba46e7a525e363c47bb6df7a62faf5dd1` | AGPL-3.0 | +| `youtube-local.ico` | [youtube-local icon](https://github.com/user234683/youtube-local/blob/1adaf33f4572bbca423ab61d21b5654c8f3b56b9/youtube/static/favicon.ico) | `1adaf33f4572bbca423ab61d21b5654c8f3b56b9` | AGPL-3.0 | + +The remaining brand marks come from the `simple-icons` package or the TypeType +and PipePipe project assets already present in the web application. diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json new file mode 100644 index 00000000..bd3e971a --- /dev/null +++ b/apps/web/messages/en.json @@ -0,0 +1,1293 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + "admin_access_description": "Define who can join and which content is available.", + "admin_access_label": "Access", + "admin_access_mode_description": "Parental controls restrict extraction and discovery to approved channels.", + "admin_access_mode_label": "Content access", + "admin_allow_guest_description": "Let visitors browse without a personal account.", + "admin_allow_guest_label": "Allow guest mode", + "admin_allow_registration_description": "Let new users create an account.", + "admin_allow_registration_label": "Allow registrations", + "admin_authentication_description": "Control account entry points and remote YouTube sessions.", + "admin_authentication_label": "Authentication", + "admin_console_subtitle": "Configure this instance and inspect its users, access policy, sessions, feeds, and reports.", + "admin_console_title": "Admin console", + "admin_banner_url_label": "Banner URL", + "admin_identity_description": "Shown on sign-in pages and across this instance.", + "admin_identity_label": "Identity", + "admin_instance_description": "Branding, access, authentication, and platform behavior.", + "admin_instance_label": "Instance", + "admin_instance_name_label": "Instance name", + "admin_local_login_description": "Allow email and password authentication.", + "admin_local_login_label": "Local login", + "admin_logo_url_label": "Logo URL", + "admin_min_android_description": "Leave empty when no minimum is required.", + "admin_min_android_label": "Minimum Android version", + "admin_oidc_description": "Send users directly to the configured identity provider.", + "admin_oidc_label": "Redirect to OIDC", + "admin_parental_description": "Choose the channels available while controlled access is enabled.", + "admin_parental_label": "Parental controls", + "admin_reports_description": "Investigate reports with request and playback diagnostics.", + "admin_reports_label": "Reports", + "admin_rss_description": "Configure private feeds, limits, and account access.", + "admin_save_changes": "Save changes", + "admin_saving": "Saving", + "admin_sessions_description": "Review connected devices, activity, and current playback.", + "admin_sessions_label": "Sessions", + "admin_tagline_label": "Tagline", + "admin_track_sessions_description": "Expose connected devices and playback activity to administrators.", + "admin_track_sessions_label": "Track active sessions", + "admin_unrestricted_label": "Unrestricted", + "admin_unsaved_changes": "Unsaved changes", + "admin_users_description": "Manage roles, suspension, identities, and account recovery.", + "admin_users_label": "Users", + "admin_verified_email_description": "Require verification before account use.", + "admin_verified_email_label": "Require verified email", + "admin_youtube_login_description": "Allow browser-based YouTube session setup.", + "admin_youtube_login_label": "Remote YouTube login", + "admin_preview_tagline": "Your private video platform", + "language_english": "English", + "language_french": "French", + "nav_admin": "Admin", + "nav_close_sidebar": "Close sidebar", + "nav_data_transfer": "Data transfer", + "nav_history": "History", + "nav_home": "Home", + "nav_login": "Login", + "nav_more": "More", + "nav_open_menu": "Open menu", + "nav_playlists": "Playlists", + "nav_primary": "Primary navigation", + "nav_privacy": "Privacy", + "nav_services": "Services", + "nav_settings": "Settings", + "nav_shorts": "Shorts", + "nav_sign_out": "Sign out", + "nav_subscriptions": "Subscriptions", + "shell_built_by_community": "Built by the TypeType community", + "shell_search": "Search", + "shell_support": "Support", + "shell_support_typetype": "Support TypeType", + "watch_audio_loading": "Loading audio...", + "watch_audio_only": "Audio only", + "watch_autoplay": "Autoplay", + "watch_block_channel": "Block channel", + "watch_block_video": "Block video", + "watch_channel_blocked": "Channel blocked:", + "watch_channel_unblocked": "Channel unblocked", + "watch_comments": "Comments", + "watch_comments_disabled": "Comments are disabled for this video.", + "watch_could_not_update_later": "Could not update Watch later", + "watch_download": "Download", + "watch_favorite": "Favorite", + "watch_favorited": "Favorited", + "watch_hide_replies": "Hide replies", + "watch_likes": "likes", + "watch_link_copied": "Link copied to clipboard", + "watch_load_more_replies": "Load more replies", + "watch_more": "More", + "watch_pinned": "Pinned", + "watch_removed_favorites": "Removed from Favorites", + "watch_removed_later": "Removed from Watch later", + "watch_remove_later": "Remove from Watch later", + "watch_replies": "replies", + "watch_report": "Report", + "watch_save": "Save", + "watch_save_later": "Save to Watch later", + "watch_save_playlist": "Save to playlist", + "watch_saved_favorites": "Saved to Favorites", + "watch_saved_later": "Saved to Watch later", + "watch_saving": "Saving...", + "watch_share": "Share", + "watch_show_less": "Show less", + "watch_show_more": "Show more", + "watch_show_replies": "Show replies", + "watch_subscribe": "Subscribe", + "watch_subscribed": "Subscribed", + "watch_subscribed_to": "Subscribed to", + "watch_subscription_failed": "Subscription update failed", + "watch_unsubscribed_from": "Unsubscribed from", + "watch_unblock_channel": "Unblock channel", + "watch_unblock_video": "Unblock video", + "watch_verified": "verified", + "watch_video_blocked": "Video blocked", + "watch_video_options": "Video options", + "watch_video_unblocked": "Video unblocked", + "player_format": "Format", + "player_disable_cinema_mode": "Disable cinema mode", + "player_enable_cinema_mode": "Enable cinema mode", + "player_language": "Language", + "player_mute": "Mute", + "player_next_video": "Next video", + "player_original": "original", + "player_pause": "Pause", + "player_play": "Play", + "player_previous_video": "Previous video", + "player_quality": "Quality", + "player_seek_backward_10": "Seek backward 10 seconds", + "player_seek_forward_10": "Seek forward 10 seconds", + "player_unmute": "Unmute", + "player_accessibility": "Accessibility", + "player_announcements": "Announcements", + "player_audio": "Audio", + "player_auto": "Auto", + "player_boost": "Boost", + "player_caption_styles": "Caption styles", + "player_chapters": "Chapters", + "player_closed_captions_off": "Subtitles off", + "player_closed_captions_on": "Subtitles on", + "player_continue": "Continue", + "player_default": "Default", + "player_disabled": "Disabled", + "player_enter_fullscreen": "Enter fullscreen", + "player_enter_pip": "Enter picture-in-picture", + "player_exit_fullscreen": "Exit fullscreen", + "player_exit_pip": "Exit picture-in-picture", + "player_fullscreen": "Fullscreen", + "player_keyboard_animations": "Keyboard animations", + "player_loop": "Loop", + "player_normal": "Normal", + "player_off": "Off", + "player_playback": "Playback", + "player_replay": "Replay", + "player_reset": "Reset", + "player_seek": "Seek", + "player_seek_backward": "Seek backward", + "player_seek_forward": "Seek forward", + "player_settings": "Settings", + "player_skip_to_live": "Skip to live", + "player_speed": "Speed", + "player_track": "Track", + "player_volume": "Volume", + "player_next_video_fallback": "Next video", + "player_unavailable_video": "Unavailable video", + "settings_about_description": "Versions, project links, and third-party information.", + "settings_about_label": "About", + "settings_blocked_description": "Review channels, videos, and keywords you have hidden.", + "settings_blocked_label": "Blocked content", + "settings_data_description": "Import, restore, and export account data.", + "settings_data_label": "Data", + "settings_interface_description": "Choose what TypeType opens and highlights.", + "settings_interface_label": "Interface", + "settings_language_description": "Interface, audio, and subtitle preferences.", + "settings_language_label": "Languages", + "settings_language_section": "Language", + "settings_playback_description": "Quality, speed, autoplay, and audio-only defaults.", + "settings_playback_label": "Playback", + "settings_privacy_description": "Control history, sessions, and account privacy.", + "settings_privacy_label": "Privacy", + "settings_rss_description": "Manage private feeds for this account.", + "settings_services_description": "Select the provider used by default.", + "settings_services_label": "Services", + "settings_subtitle": "Personalize playback, content, privacy, and account data. Changes follow your TypeType account.", + "settings_subtitle_default_description": "Enable subtitles by default", + "settings_subtitle_default_label": "Subtitles", + "settings_subtitle_language_description": "Preferred subtitle track", + "settings_subtitle_language_label": "Subtitle language", + "settings_title": "Settings", + "settings_audio_language_description": "Preferred audio track", + "settings_audio_language_ignored": "Ignored while original language is forced", + "settings_audio_language_label": "Audio language", + "settings_original_audio_description": "Always use the original audio track", + "settings_original_audio_label": "Prefer original language", + "settings_ui_language_description": "Language used by TypeType on this device.", + "settings_ui_language_label": "Interface language", + "settings_video_description": "Content visibility and SponsorBlock behavior.", + "settings_video_label": "Video", + "profile_title": "Profile", + "profile_subtitle": "Manage how your account appears and how you sign in.", + "profile_public_title": "Public profile", + "profile_public_description": "Choose the name and bio shown with your activity.", + "profile_no_public_username": "No public username", + "profile_username_label": "Public username", + "profile_username_help": "3-32 characters: letters, numbers, dot, underscore or dash.", + "profile_bio_label": "Bio", + "profile_bio_placeholder": "Tell people who you are", + "profile_bio_help": "Up to 280 characters", + "profile_save": "Save profile", + "profile_saved": "Profile updated", + "profile_username_taken": "This username is already taken.", + "profile_username_invalid_format": "Use only letters, numbers, dot, underscore or dash.", + "profile_username_invalid_length": "Username must be between 3 and 32 characters.", + "profile_username_too_short": "Username must be at least 3 characters.", + "profile_username_too_long": "Username must be at most 32 characters.", + "profile_bio_too_long": "Bio must be at most 280 characters.", + "profile_update_failed": "Unable to update profile.", + "account_identity_title": "Account identity", + "account_identity_description": "Used for sign-in and account display.", + "account_identity_managed": "Managed by your identity provider.", + "account_display_name": "Display name", + "account_email": "Email address", + "account_current_password": "Current password", + "account_save": "Save account", + "account_saved": "Account updated", + "account_update_failed": "Update failed", + "account_password_title": "Password", + "account_password_description": "Reset your account password.", + "account_password_reset": "Reset password", + "avatar_title": "Avatar", + "avatar_custom_title": "Custom image", + "avatar_custom_description": "PNG, JPEG, WebP, or animated GIF up to 10 MB.", + "avatar_upload": "Upload", + "avatar_invalid_type": "Use a PNG, JPEG, WebP, or GIF image", + "avatar_too_large": "Avatar must be 10 MB or smaller", + "avatar_updated": "Avatar updated", + "avatar_upload_failed": "Unable to upload avatar", + "avatar_update_failed": "Unable to update avatar", + "avatar_clear_failed": "Unable to clear avatar", + "avatar_emoji_source": "Emojis from", + "avatar_search": "Search emojis", + "avatar_scroll_left": "Scroll emoji list left", + "avatar_scroll_right": "Scroll emoji list right", + "avatar_clear": "Clear", + "not_found_title": "This page is out of frame", + "not_found_description": "The address may be incorrect, or the page may have moved.", + "not_found_back": "Go back", + "not_found_home": "Home", + "data_portability_title": "Data portability", + "data_portability_subtitle": "Move account data into TypeType or create a backup for another supported app.", + "data_portability_import": "Import", + "data_portability_export": "Export", + "data_portability_loading_formats": "Loading supported formats...", + "portability_export_download_started": "Export download started", + "portability_export_ready": "Export ready", + "portability_no_export_format": "No export format is available.", + "portability_export_title": "Export data", + "portability_generate_export": "Generate export", + "portability_export_description": "Choose a destination and create a portable backup.", + "portability_destination_format": "Destination format", + "portability_export_partial_warning": "This destination cannot represent every TypeType field. The completed report will list any data that could not be preserved.", + "portability_export_notes": "Export notes", + "portability_download_export": "Download export", + "portability_new_export": "New export", + "portability_download_report": "Download report", + "portability_start_another_export": "Start another export", + "portability_export_failed": "Export failed", + "portability_import_completed": "Import completed", + "portability_items": "items", + "portability_no_import_format": "No import format is available.", + "portability_import_title": "Import data", + "portability_import_description": "Preview and choose what to restore.", + "portability_import_from": "Import from", + "portability_choose_or_drop": "Choose or drop a backup", + "portability_drop_original_prefix": "Drop the original", + "portability_drop_original_suffix": "file. Nothing is imported until you review the preview.", + "portability_duplicate_records": "duplicate records found", + "portability_different_file": "Different file", + "portability_compatibility_notes": "Compatibility notes", + "portability_duplicate_policy": "When an item already exists", + "portability_skip": "Skip", + "portability_replace": "Replace", + "portability_import_selected": "Import selected", + "portability_start_another_import": "Start another import", + "portability_choose_another_backup": "Choose another backup", + "portability_import_failed": "Import failed", + "portability_job_waiting": "Waiting to start", + "portability_job_analyzing": "Analyzing backup", + "portability_job_ready": "Ready to import", + "portability_job_importing": "Importing data", + "portability_job_generating": "Generating export", + "portability_job_import_completed": "Import completed", + "portability_job_export_ready": "Export ready", + "portability_job_cancelled": "Operation cancelled", + "portability_job_failed": "Operation failed", + "portability_operation_failed": "Portability operation failed", + "portability_copy_reference": "Copy support reference", + "portability_cancel": "Cancel", + "portability_job_label": "Job", + "portability_request_label": "Request", + "portability_code_label": "Code", + "portability_status_partial": "Partial support", + "portability_status_supported": "Supported", + "portability_status_not_supported": "Not supported", + "portability_get_backup": "Get your", + "portability_backup_suffix": "backup", + "portability_guide_typetype_description": "Move data from another TypeType instance or restore a portable backup.", + "portability_guide_typetype_step_one": "Open Settings, then Data portability on the source instance.", + "portability_guide_typetype_step_two": "Choose TypeType as the destination and download the export.", + "portability_guide_typetype_step_three": "Drop the downloaded backup below without changing it.", + "portability_guide_takeout_description": "Google Takeout can provide your subscriptions, history, playlists, Watch later and liked videos.", + "portability_guide_takeout_step_one": "Open Google Takeout with YouTube and My Activity selected.", + "portability_guide_takeout_step_two": "Create a one-time ZIP export, then download it from Google.", + "portability_guide_takeout_step_three": "Drop the original ZIP below. If Google creates several ZIPs, import them one at a time.", + "portability_guide_takeout_action": "Open Google Takeout", + "portability_guide_opml_description": "Move subscriptions from any app or service that can export an OPML file.", + "portability_guide_opml_step_one": "Find the subscription export or backup action in the source app.", + "portability_guide_opml_step_two": "Choose OPML when the app asks for an export format.", + "portability_guide_opml_step_three": "Download the OPML file, then drop it below.", + "portability_guide_generic_prefix": "Bring your existing", + "portability_guide_generic_suffix": "data into TypeType.", + "portability_guide_generic_open_prefix": "Open", + "portability_guide_generic_open_suffix": "and find its backup or export action.", + "portability_guide_generic_download": "Download the original backup file without editing or extracting it.", + "portability_guide_generic_drop": "Drop the file below. TypeType will preview the data before anything is imported.", + "portability_stale_job_toast": "The previous operation is no longer available. Start again.", + "portability_category_subscriptions": "Subscriptions", + "portability_category_subscriptions_detail": "Channels you follow", + "portability_category_subscription_groups": "Subscription groups", + "portability_category_subscription_groups_detail": "Named channel groups", + "portability_category_history": "Watch history", + "portability_category_history_detail": "Previously watched videos", + "portability_category_playlists": "Playlists", + "portability_category_playlists_detail": "Local playlists and their videos", + "portability_category_watch_later": "Watch later", + "portability_category_watch_later_detail": "Videos saved for later", + "portability_category_favorites": "Favorites", + "portability_category_favorites_detail": "Favorited videos", + "portability_category_progress": "Playback progress", + "portability_category_progress_detail": "Saved video positions", + "portability_category_search_history": "Search history", + "portability_category_search_history_detail": "Recent searches", + "portability_category_saved_playlists": "Saved playlists", + "portability_category_saved_playlists_detail": "Remote playlists you follow", + "portability_category_settings": "Settings", + "portability_category_settings_detail": "Portable preferences", + "portability_category_content_filters": "Content filters", + "portability_category_content_filters_detail": "Blocked content rules", + "groups_preview_data_transfer": "Data transfer", + "groups_preview_title": "Subscription groups", + "groups_preview_import": "Import", + "groups_preview_groups": "Groups", + "groups_preview_done": "Done", + "groups_preview_import_complete": "Import complete", + "groups_preview_import_summary": "{channels} subscriptions, {playlists} playlists, {history} history entries, and {groups} groups were restored.", + "groups_preview_channels": "Channels", + "groups_preview_groups_label": "Groups", + "groups_preview_ungrouped": "Ungrouped", + "groups_preview_coverage": "Coverage", + "groups_preview_organize": "Organize groups", + "groups_preview_view_subscriptions": "View subscriptions", + "groups_preview_restored_groups": "Restored groups", + "groups_preview_channel_count": "{count} channel", + "groups_preview_channel_count_plural": "{count} channels", + "groups_preview_group_name": "Group name", + "groups_preview_all_channels": "All channels ({count})", + "groups_preview_search": "Search imported channels", + "groups_preview_select_visible": "Select visible", + "groups_preview_clear_page": "Clear page", + "groups_preview_finish": "Finish", + "groups_preview_no_group": "No group", + "groups_preview_no_match": "No channel matches this view", + "groups_preview_selected": "{count} selected", + "groups_preview_add_to_group": "Add to group", + "groups_preview_remove_from_group": "Remove from group", + "groups_preview_clear": "Clear", + "groups_preview_added": "{count} channels added to {group}", + "groups_preview_removed": "{count} channels removed from {group}", + "groups_preview_group_created": "{group} created", + "groups_preview_group_removed": "{group} removed", + "groups_preview_organization_updated": "Organization updated", + "groups_preview_coverage_line": "{grouped} of {total} channels have at least one group ({coverage}%)", + "groups_preview_more": "+{count} more", + "groups_preview_open_subscriptions": "Open subscriptions", + "groups_preview_keep_organizing": "Keep organizing", + "groups_preview_mock": "Mock", + "groups_preview_reset": "Reset preview", + "groups_preview_close_new_group": "Close new group", + "groups_preview_create_group": "Create a group", + "groups_preview_select_channel": "Select", + "groups_preview_remove_from_specific_group": "Remove from {group}", + "admin_users_search": "Search users", + "admin_users_search_placeholder": "Search name, email or ID", + "admin_users_filter": "Status and role", + "admin_users_filter_all": "All", + "admin_users_filter_admins": "Admins", + "admin_users_filter_moderators": "Moderators", + "admin_users_filter_users": "Users", + "admin_users_filter_suspended": "Suspended", + "admin_users_loading": "Loading users...", + "admin_users_load_error": "Unable to load users right now.", + "admin_users_empty": "No user matches this view.", + "admin_users_column_user": "User", + "admin_users_column_role": "Role", + "admin_users_column_status": "Status", + "admin_users_column_joined": "Joined", + "admin_users_column_actions": "Actions", + "admin_users_active": "Active", + "admin_users_role_user": "User", + "admin_users_role_moderator": "Moderator", + "admin_users_role_admin": "Admin", + "admin_users_manage": "Manage", + "admin_users_details": "User details", + "admin_users_details_description": "Manage identity, role and access", + "admin_users_close_details": "Close user details", + "admin_users_close": "Close", + "admin_users_account_access": "Account access", + "admin_users_suspend": "Suspend", + "admin_users_unsuspend": "Unsuspend", + "admin_users_reset_token": "Reset token", + "admin_users_previous_page": "Previous page", + "admin_users_next_page": "Next page", + "admin_users_page": "Page", + "admin_users_of": "of", + "admin_users_display_name": "Display name", + "admin_users_email": "Email", + "admin_users_email_address": "Email address", + "admin_users_save_identity": "Save identity", + "admin_users_identity_updated": "User identity updated", + "admin_users_update_failed": "Update failed", + "admin_users_role_updated": "Role updated", + "admin_users_suspend_updated": "Account access updated", + "admin_users_reset_failed": "Unable to generate reset token", + "admin_users_token_copied": "Token copied to clipboard", + "admin_users_reset_title": "Password reset token", + "admin_users_reset_label": "Password reset token", + "admin_users_clipboard_unavailable": "Clipboard access is unavailable. Select the token above and copy it manually.", + "admin_users_copy_token": "Copy token", + "login_title": "Sign in", + "login_subtitle": "Use your account credentials to continue.", + "login_signed_in": "Signed in", + "login_invalid_credentials": "Invalid credentials.", + "login_or": "or", + "login_identifier_placeholder": "Email or username", + "login_password_placeholder": "Password", + "login_pending": "Signing in...", + "login_no_method": "No sign-in method is available.", + "login_create_account": "Create account", + "login_reset_password": "Reset password", + "login_oidc_redirecting": "Redirecting...", + "login_oidc_continue": "Continue with", + "login_oidc_failed": "Could not start sign-in. Try again.", + "nav_sign_in": "Sign in", + "nav_register": "Register", + "nav_browse": "Browse", + "nav_account": "Account", + "nav_guest": "Guest", + "nav_connected": "Connected", + "nav_loading": "Loading", + "nav_signed_out": "Signed out", + "ui_ranked_by_youtube": ", ranked by YouTube.", + "ui_click_the_browser_area_before_typing": "Click the browser area before typing.", + "ui_api_errors": "· API errors:", + "ui_accepted_entries": "Accepted entries", + "ui_add_blocked_keyword": "Add blocked keyword", + "ui_add_channel_for_this_user": "Add channel for this user", + "ui_add_global_channel": "Add global channel", + "ui_add_global_playlist": "Add global playlist", + "ui_add_playlist_for_this_user": "Add playlist for this user", + "ui_advanced_display": "Advanced display", + "ui_after_connection_retry_the_video_and_streams_uses_your_youtube_sessio": "After connection, retry the video and /streams uses your YouTube session.", + "ui_all_categories": "All Categories", + "ui_all_statuses": "All Statuses", + "ui_allowed_playlists": "Allowed playlists", + "ui_already_have_an_account_sign_in": "Already have an account? Sign in", + "ui_applied_when_a_video_starts": "Applied when a video starts", + "ui_audio_only_playback": "Audio-only playback", + "ui_autoplay_countdown": "Autoplay countdown", + "ui_back": "Back", + "ui_back_home": "Back home", + "ui_back_to_all_videos": "Back to all videos", + "ui_back_to_import_sources": "Back to import sources", + "ui_back_to_login": "Back to login", + "ui_back_to_playlists": "Back to playlists", + "ui_back_to_sign_in": "Back to sign in", + "ui_badge_temporarily_unavailable": "Badge temporarily unavailable.", + "ui_blocked_channels": "Blocked channels", + "ui_blocked_keywords": "Blocked keywords", + "ui_blocked_videos": "Blocked videos", + "ui_cancel_autoplay": "Cancel autoplay", + "ui_cancel_sign_in": "Cancel sign-in", + "ui_captured_at": "Captured at:", + "ui_category": "Category", + "ui_channel": "Channel", + "ui_channel_name_or_handle": "Channel name or @handle", + "ui_channels": "channels", + "ui_channels_available_when_allow_list_mode_is_enabled": "Channels available when allow-list mode is enabled.", + "ui_choose_the_image_shown_for_youtube_videos": "Choose the image shown for YouTube videos.", + "ui_choose_the_title_shown_for_youtube_videos": "Choose the title shown for YouTube videos.", + "ui_choose_zip_format_any_size": "Choose ZIP format, any size", + "ui_clear_all": "Clear all", + "ui_clear_filters": "Clear filters", + "ui_clear_search_history_in_settings": "Clear search history in Settings.", + "ui_clear_search_history": "Clear search history?", + "ui_clear_stored_watch_history_search_history_subscriptions_and_playback": "Clear stored watch history, search history, subscriptions, and playback progress from this account.", + "ui_clear_watch_history_in_settings": "Clear watch history in Settings.", + "ui_clear_watch_history": "Clear watch history?", + "ui_click_deselect_all_then_select_only_youtube_and_my_activity": "Click \"Deselect all\", then select only YouTube and My Activity", + "ui_close_download": "Close download", + "ui_close_filters": "Close filters", + "ui_close_picker": "Close picker", + "ui_collection": "Collection", + "ui_community_only": "Community only", + "ui_community_title": "Community title", + "ui_community_then_neutral_frame": "Community, then neutral frame", + "ui_confidence": "Confidence", + "ui_connect_with_youtube": "Connect with YouTube", + "ui_connect_youtube_inside_typetype": "Connect YouTube inside TypeType", + "ui_connect_youtube_on_typetype": "Connect YouTube on TypeType", + "ui_content": "Content", + "ui_content_controls": "Content controls", + "ui_continue": "Continue", + "ui_continue_watching": "Continue watching", + "ui_control_which_community_entries_are_used": "Control which community entries are used.", + "ui_controls": "Controls", + "ui_cookies_and_playback_token_are_captured_server_side_only": "Cookies and playback token are captured server-side only.", + "ui_cooking_your_import": "Cooking your import", + "ui_couldn_t_load_this_video": "Couldn't load this video", + "ui_crash_logs": "Crash logs:", + "ui_create": "Create", + "ui_create_export_and_wait_for_the_email": "Create export and wait for the email", + "ui_create_github_issue": "Create GitHub Issue", + "ui_created_feeds": "Created feeds", + "ui_date": "Date", + "ui_dearrow_confidence": "DeArrow confidence", + "ui_dearrow_thumbnails": "DeArrow thumbnails", + "ui_dearrow_titles": "DeArrow titles", + "ui_default_landing_page": "Default landing page", + "ui_default_playback_speed": "Default playback speed", + "ui_default_quality": "Default quality", + "ui_default_service": "Default service", + "ui_delete": "Delete", + "ui_delete_2": "Delete (", + "ui_delete_playlist": "Delete playlist", + "ui_describe_the_issue": "Describe the issue...", + "ui_description": "Description", + "ui_diagnostics": "Diagnostics", + "ui_did_you_mean": "Did you mean", + "ui_disabling_rss_keeps_existing_feed_configuration_intact": "Disabling RSS keeps existing feed configuration intact.", + "ui_disconnect": "Disconnect", + "ui_discovery_surfaces": "Discovery surfaces", + "ui_dismiss": "Dismiss", + "ui_dismiss_notification": "Dismiss notification", + "ui_do_you_know_how_much_time_i_spent_building_all_of_this": "Do you know how much time I spent building all of this?!", + "ui_download_the_zip_and_drop_it_here": "Download the ZIP and drop it here", + "ui_drag_to_reorder": "Drag to reorder", + "ui_drop_one_or_more_takeout_zip_files_here": "Drop one or more Takeout ZIP files here", + "ui_drop_your_pipepipe_backup_zip_here": "Drop your PipePipe backup ZIP here", + "ui_embed_unavailable": "Embed unavailable", + "ui_empty_playlist": "Empty playlist", + "ui_enter_the_public_http_or_https_url_of_this_instance": "Enter the public HTTP or HTTPS URL of this instance.", + "ui_entire_instance": "Entire instance", + "ui_estimated_sync_in_progress": "estimated sync in progress...", + "ui_event_timeline": "Event timeline (", + "ui_export_selected": "Export selected", + "ui_failed_to_load_notifications_retry_in_a_few_seconds": "Failed to load notifications. Retry in a few seconds.", + "ui_failed_to_submit_report_please_try_again": "Failed to submit report. Please try again.", + "ui_family_list": "Family list", + "ui_file_is_ready_tap_below_to_open_it_in_ios_and_save_to_files": "File is ready. Tap below to open it in iOS and save to Files.", + "ui_filters": "Filters", + "ui_fine": "Fine!", + "ui_followed": "followed", + "ui_global_behavior_first_then_category_rules_decide_what_gets_skipped_or": "Global behavior first, then category rules decide what gets skipped or marked.", + "ui_go_and_relax": "Go and relax", + "ui_go_back_to": "Go back to", + "ui_go_to": "Go to", + "ui_go_to_video": "Go to video", + "ui_guest_mode_disabled": "Guest mode disabled", + "ui_hide_every_recommendation_comment_and_surface_at_once": "Hide every recommendation, comment, and surface at once.", + "ui_hide_everything": "Hide everything", + "ui_history": "History:", + "ui_how_to_export_from_youtube": "How to export from YouTube", + "ui_import_from_pipepipe": "Import from PipePipe", + "ui_import_from_youtube": "Import from YouTube", + "ui_import_id": "Import ID:", + "ui_imported": "Imported:", + "ui_import_phase_analyzing": "Analyzing", + "ui_import_phase_applying": "Applying", + "ui_import_phase_collecting": "Collecting", + "ui_import_phase_encoding": "Generating", + "ui_import_phase_in_progress": "In progress", + "ui_inherited_global_channels": "Inherited global channels", + "ui_inherited_global_playlists": "Inherited global playlists", + "ui_instance_policy": "Instance policy", + "ui_issue": "Issue", + "ui_keyword": "Keyword", + "ui_keyword_to_block": "Keyword to block", + "ui_language": "Language:", + "ui_last_read": "Last read:", + "ui_last_used": "Last used", + "ui_library": "Library", + "ui_live_public_playlists_saved_to_your_library": "Live public playlists saved to your library.", + "ui_load_more": "Load more", + "ui_loading_active_sessions": "Loading active sessions...", + "ui_loading_admin_settings": "Loading admin settings...", + "ui_loading_allow_list": "Loading allow list...", + "ui_loading_bug_reports": "Loading bug reports...", + "ui_loading_more": "Loading more...", + "ui_loading_notifications": "Loading notifications...", + "ui_loading_private_feeds": "Loading private feeds...", + "ui_loading_rss_controls": "Loading RSS controls...", + "ui_loading_rss_feeds": "Loading RSS feeds...", + "ui_loading_rss_settings": "Loading RSS settings...", + "ui_loading_session": "Loading session...", + "ui_loading_user_allow_list": "Loading user allow list...", + "ui_loading": "Loading...", + "ui_local_registration_is_disabled": "Local registration is disabled.", + "ui_locked_entries_only": "Locked entries only", + "ui_manage_stored_data": "Manage stored data", + "ui_mark_all_read": "Mark all read", + "ui_members_only": "Members only", + "ui_minimum_segment_duration": "Minimum segment duration", + "ui_move_data_between_supported_apps": "Move data between supported apps", + "ui_move_down": "Move down", + "ui_move_up": "Move up", + "ui_name": "Name", + "ui_network": "Network:", + "ui_neutral_frame": "Neutral frame", + "ui_new_feed": "New feed", + "ui_new_password": "New password", + "ui_new_playlist": "New playlist", + "ui_new_playlist_2": "New playlist...", + "ui_next": "Next", + "ui_next_month": "Next month", + "ui_no_active_playback": "No active playback", + "ui_no_active_sessions_are_currently_reported": "No active sessions are currently reported.", + "ui_no_blocked_keywords": "No blocked keywords", + "ui_no_bug_reports_found": "No bug reports found.", + "ui_no_channels_added": "No channels added.", + "ui_no_channels_found_try_the_exact_channel_name_or_handle": "No channels found. Try the exact channel name or handle.", + "ui_no_custom_playlists_yet": "No custom playlists yet.", + "ui_no_episodes_found": "No episodes found.", + "ui_no_family_recommendations_yet": "No family recommendations yet", + "ui_no_family_list_results": "No family-list results", + "ui_no_favorites_yet": "No favorites yet.", + "ui_no_matching_subscriptions": "No matching subscriptions", + "ui_no_notifications_yet": "No notifications yet.", + "ui_no_playlist_selected": "No playlist selected.", + "ui_no_playlists_added": "No playlists added.", + "ui_no_playlists_found": "No playlists found.", + "ui_no_playlists_on_this_channel": "No playlists on this channel.", + "ui_no_playlists_yet": "No playlists yet.", + "ui_no_podcast_selected": "No podcast selected.", + "ui_no_preference": "No preference", + "ui_no_private_feeds": "No private feeds", + "ui_no_private_feeds_have_been_created": "No private feeds have been created.", + "ui_no_results_for": "No results for “", + "ui_no_shorts_available_right_now": "No shorts available right now.", + "ui_no_subscriptions_yet": "No subscriptions yet", + "ui_no_subscriptions_yet_2": "No subscriptions yet.", + "ui_no_videos_saved_for_later": "No videos saved for later.", + "ui_notification_popups": "Notification popups", + "ui_notifications": "Notifications", + "ui_open_allow_list": "Open allow list", + "ui_open_data_transfer": "Open data transfer", + "ui_open_notifications_to_load_items": "Open notifications to load items.", + "ui_open_settings": "Open settings", + "ui_or_click_to_select": "or click to select", + "ui_or_click_to_select_multiple_zip_files": "or click to select multiple ZIP files", + "ui_original_thumbnail": "Original thumbnail", + "ui_original_title": "Original title", + "ui_password_updated_you_can_sign_in_with_your_new_password": "Password updated. You can sign in with your new password.", + "ui_phase": "Phase:", + "ui_play_all": "Play all", + "ui_play_now": "Play now", + "ui_playback_failed": "Playback failed", + "ui_playback_progress": "Playback progress.", + "ui_player_snapshot": "Player snapshot", + "ui_playlist_name": "Playlist name", + "ui_playlist_name_2": "Playlist name...", + "ui_playlist_not_found": "Playlist not found.", + "ui_playlist_url": "Playlist URL", + "ui_playlist_videos": "playlist videos", + "ui_playlist_videos_2": "Playlist videos:", + "ui_playlists": "playlists,", + "ui_playlists_2": "Playlists:", + "ui_please_wait": "Please wait...", + "ui_podcast": "Podcast", + "ui_podcast_playlists_from_this_channel": "Podcast playlists from this channel", + "ui_podcasts": "Podcasts", + "ui_preferred_video_resolution": "Preferred video resolution", + "ui_prev": "Prev", + "ui_preview_imports_or_create_a_compatible_export": "Preview imports or create a compatible export.", + "ui_preview": "Preview:", + "ui_previous_month": "Previous month", + "ui_private_feeds": "Private feeds", + "ui_private_link_shown_once": "Private link shown once", + "ui_private_rss_link": "Private RSS link", + "ui_public_instance_url": "Public instance URL", + "ui_queued_archives": "Queued archives (", + "ui_rate_limited_while_loading_more": "Rate limited while loading more.", + "ui_recommended": "Recommended", + "ui_refresh_versions": "Refresh versions", + "ui_remote_browser": "Remote browser", + "ui_remote_youtube_login_is_disabled_on_this_instance": "Remote YouTube login is disabled on this instance.", + "ui_remove": "Remove", + "ui_remove_from_history": "Remove from history", + "ui_remove_from_history_2": "Remove from history?", + "ui_remove_saved_playlist": "Remove saved playlist", + "ui_remove_video": "Remove video", + "ui_rename_playlist": "Rename playlist", + "ui_report": "report", + "ui_report_a_bug": "Report a Bug", + "ui_requestid": "requestId:", + "ui_reset": "Reset", + "ui_restore_backup": "Restore backup", + "ui_restoring_replaces_the_categories_included_in_the_backup": "Restoring replaces the categories included in the backup.", + "ui_restoring_your_backup": "Restoring your backup", + "ui_restrict_entire_instance": "Restrict entire instance", + "ui_restrict_everyone_to_the_admin_allow_list_including_guests": "Restrict everyone to the admin allow list, including guests.", + "ui_retry": "Retry", + "ui_retry_video": "Retry video", + "ui_revoke_this_rss_feed": "Revoke this RSS feed?", + "ui_route": "Route:", + "ui_save_videos_from_the_watch_page_using_the_save_button": "Save videos from the watch page using the Save button.", + "ui_save_watched_videos_and_playback_progress": "Save watched videos and playback progress", + "ui_saved_public_playlists": "Saved public playlists", + "ui_search_by_email_or_name": "Search by email or name", + "ui_search_filters": "Search filters", + "ui_search_history": "Search history.", + "ui_search_history_2": "Search history...", + "ui_search_id_email_text": "Search id, email, text...", + "ui_search_instead_for": "Search instead for “", + "ui_search_language": "Search language...", + "ui_search_results_for": "Search results for", + "ui_search_subscriptions": "Search subscriptions", + "ui_search_this_channel": "Search this channel", + "ui_search_videos_channels": "Search videos, channels...", + "ui_searching_channels": "Searching channels...", + "ui_searching_playlists": "Searching playlists...", + "ui_searching_users": "Searching users...", + "ui_secrets_are_never_available_from_this_console": "Secrets are never available from this console.", + "ui_seek": "Seek", + "ui_select_a_report_to_inspect_details": "Select a report to inspect details.", + "ui_selected": "selected", + "ui_selected_2": "Selected", + "ui_selected_3": "Selected:", + "ui_shorts_are_hidden": "Shorts are hidden", + "ui_show_a_popup_when_a_subscribed_channel_publishes_a_video": "Show a popup when a subscribed channel publishes a video.", + "ui_showing": "Showing", + "ui_showing_results_for": "Showing results for", + "ui_shuffle": "Shuffle", + "ui_shuffle_playlist": "Shuffle playlist", + "ui_sign_in_could_not_be_completed": "Sign-in could not be completed.", + "ui_signing_in": "Signing in", + "ui_size": "Size", + "ui_skip_playlist_autoplay_screen": "Skip playlist autoplay screen", + "ui_sort": "Sort", + "ui_specific_users": "Specific users", + "ui_speed": "Speed", + "ui_sponsorblock": "SponsorBlock", + "ui_sponsorblock_behavior": "SponsorBlock behavior", + "ui_sponsorblock_categories": "SponsorBlock categories", + "ui_start_download": "Start download", + "ui_start_import": "Start import", + "ui_startup": "Startup", + "ui_status": "Status:", + "ui_stored_data": "Stored data", + "ui_subscribe_to_channels_to_unlock_a_personalized_home_feed": "Subscribe to channels to unlock a personalized home feed.", + "ui_subscribers": "subscribers", + "ui_subscription_views": "Subscription views", + "ui_subscriptions": "subscriptions,", + "ui_subscriptions_2": "Subscriptions:", + "ui_subscriptions_3": "Subscriptions.", + "ui_the_admin_has_disabled_guest_access": "The admin has disabled guest access.", + "ui_the_browser_context_is_destroyed_after_success_timeout_or_cancel": "The browser context is destroyed after success, timeout, or cancel.", + "ui_the_client_is_connected_and_ready": "The client is connected and ready.", + "ui_the_login_page_is_rendered_by_a_disposable_chromium_session_running_i": "The login page is rendered by a disposable Chromium session running in TypeType-Token.", + "ui_the_page_typetype_opens_on_when_you_launch_it": "The page TypeType opens on when you launch it.", + "ui_the_youtube_sign_in_window_will_appear_here": "The YouTube sign-in window will appear here.", + "ui_third_party_notices": "Third-party notices", + "ui_this_channel_is_blocked": "This channel is blocked", + "ui_this_channel_is_outside_the_family_list": "This channel is outside the family list", + "ui_this_instance_does_not_allow_guest_access_which_is_required_for_embed": "This instance does not allow guest access, which is required for embedded playback.", + "ui_this_link_will_open_in_a_new_tab": "This link will open in a new tab:", + "ui_this_playlist_could_not_be_loaded": "This playlist could not be loaded.", + "ui_this_playlist_has_no_videos": "This playlist has no videos.", + "ui_this_video_could_not_be_played_the_stream_may_be_unavailable_or_unsup": "This video could not be played. The stream may be unavailable or unsupported.", + "ui_thumbnails": "Thumbnails", + "ui_titles": "Titles", + "ui_to_use_this_typetype_instance_create_an_account_or_sign_in_with_an_ex": "To use this TypeType instance, create an account or sign in with an existing one.", + "ui_toggle": "toggle", + "ui_toggle_sidebar": "Toggle sidebar", + "ui_total": "total", + "ui_type_at_least_two_characters_to_search_channels": "Type at least two characters to search channels.", + "ui_type_at_least_two_characters": "Type at least two characters.", + "ui_typetype_backup": "TypeType backup", + "ui_typetype_opens_a_temporary_remote_browser_for_youtube_sign_in_cookies": "TypeType opens a temporary remote browser for YouTube sign-in. Cookies and playback token are captured server-side, encrypted, and never sent to the web UI.", + "ui_unable_to_load_active_sessions": "Unable to load active sessions.", + "ui_unable_to_load_admin_settings": "Unable to load admin settings:", + "ui_unable_to_load_allow_list_settings": "Unable to load allow list settings.", + "ui_unable_to_load_bug_reports": "Unable to load bug reports.", + "ui_unavailable": "Unavailable", + "ui_unblock": "Unblock", + "ui_unpacking_and_syncing_your_data_this_may_take_a_moment": "Unpacking and syncing your data. This may take a moment.", + "ui_unsubscribe_all": "Unsubscribe all", + "ui_unsubscribe_from_all_channels_in_settings": "Unsubscribe from all channels in Settings.", + "ui_up_next": "Up next", + "ui_updated": "Updated", + "ui_use_a_secondary_youtube_account_the_remote_browser_is_temporary_and_c": "Use a secondary YouTube account. The remote browser is temporary and closes after connection, timeout, or cancellation.", + "ui_use_the_new_playlist_button_to_get_started": "Use the New playlist button to get started.", + "ui_used": "used", + "ui_user_agent": "User agent:", + "ui_user_channels": "User channels", + "ui_user_playlists": "User playlists", + "ui_users_with_admin_managed_access_appear_here_search_to_configure_anoth": "Users with admin-managed access appear here. Search to configure another account.", + "ui_verified": "Verified", + "ui_versions": "Versions", + "ui_video": "video", + "ui_videos": "Videos", + "ui_view_github_issue": "View GitHub Issue", + "ui_viewport": "Viewport:", + "ui_watch_dates": "Watch dates:", + "ui_watch_history_tracking": "Watch history tracking", + "ui_watch_history": "Watch history.", + "ui_watch_page": "Watch page", + "ui_watched": "Watched", + "ui_we_are_plating_your_data_now": "We are plating your data now.", + "ui_we_import_subscriptions_playlists_and_watch_history_if_available": "We import subscriptions, playlists, and watch history (if available).", + "ui_what_happens": "What happens", + "ui_you_are_leaving_typetype": "You are leaving TypeType", + "ui_you_can_re_enable_shorts_from_video_preferences": "You can re-enable Shorts from video preferences.", + "ui_you_sign_in_inside_the_remote_browser_shown_above": "You sign in inside the remote browser shown above.", + "ui_you_want_to_hide_everything": "You want to hide everything?", + "ui_your_backup_has_been_restored": "Your backup has been restored.", + "ui_your_data_has_been_plated_check_your_subscriptions_and_playlists": "Your data has been plated. Check your subscriptions and playlists.", + "ui_youtube_remote_sign_in": "YouTube remote sign-in", + "ui_youtube_sign_in_remote_browser": "YouTube sign-in remote browser", + "ui_yeah_hide_it": "Yeah, hide it", + "ui_like_actually_sure_you_will_have_nothing_left_to_scroll": "Like, actually sure? You will have nothing left to scroll.", + "ui_yes_gone": "Yes, gone", + "ui_fine_i_ll_hide_it": "Fine, I'll hide it", + "ui_allowed_channels": "Allowed channels", + "ui_unable_to_update_mode": "Unable to update mode", + "ui_search_by_channel_name_or_handle_added_channels_apply_to_every_restri": "Search by channel name or handle. Added channels apply to every restricted user.", + "ui_search_playlists_by_name_added_playlists_apply_to_every_restricted_us": "Search playlists by name. Added playlists apply to every restricted user.", + "ui_user_specific_allow_list": "User-specific allow-list", + "ui_set_unrestricted_override": "Set unrestricted override", + "ui_unrestrict_user": "Unrestrict user", + "ui_unrestricted_override_set": "Unrestricted override set", + "ui_user_unrestricted": "User unrestricted", + "ui_admin_unrestricted_override": "Admin unrestricted override", + "ui_restrict_user": "Restrict user", + "ui_user_restricted": "User restricted", + "ui_restricted_by_entire_instance": "Restricted by entire instance", + "ui_unable_to_update_user": "Unable to update user", + "ui_search_by_channel_name_or_handle_this_does_not_affect_other_users": "Search by channel name or handle. This does not affect other users.", + "ui_search_playlists_by_name_this_does_not_affect_other_users": "Search playlists by name. This does not affect other users.", + "ui_failed_to_update": "Failed to update", + "ui_failed_to_create_issue": "Failed to create issue", + "ui_account_suspended": "Account suspended", + "ui_account_rss_off": "Account RSS off", + "ui_feed_off": "Feed off", + "ui_disable_feed": "Disable feed", + "ui_enable_feed": "Enable feed", + "ui_disable_rss_for_account": "Disable RSS for account", + "ui_enable_rss_for_account": "Enable RSS for account", + "ui_revoke_feed": "Revoke feed", + "ui_enable_private_rss_feeds": "Enable private RSS feeds", + "ui_unable_to_update_rss_settings": "Unable to update RSS settings", + "ui_unable_to_load_rss_controls": "Unable to load RSS controls", + "ui_unable_to_load_private_feeds": "Unable to load private feeds", + "ui_unable_to_update_rss_feed": "Unable to update RSS feed", + "ui_unable_to_update_account_rss": "Unable to update account RSS", + "ui_revoke": "Revoke", + "ui_unable_to_revoke_rss_feed": "Unable to revoke RSS feed", + "ui_paused": "Paused", + "ui_online": "Online", + "ui_unable_to_update_admin_settings": "Unable to update admin settings", + "ui_unable_to_load_admin_settings_2": "Unable to load admin settings.", + "ui_pause_audio": "Pause audio", + "ui_backward": "backward", + "ui_resume_autoplay_timer": "Resume autoplay timer", + "ui_pause_autoplay_timer": "Pause autoplay timer", + "ui_live": "Live", + "ui_a_parent_can_add_this_channel_if_it_belongs_in_your_trusted_family_sp": "A parent can add this channel if it belongs in your trusted family space.", + "ui_unable_to_load_channel_right_now": "Unable to load channel right now.", + "ui_unblock_it_from_settings_to_see_this_channel_again": "Unblock it from Settings to see this channel again.", + "ui_audio": "Audio", + "ui_file": "file", + "ui_nothing_from_the_family_list_yet": "Nothing from the family list yet", + "ui_add_trusted_channels_so_this_page_can_stay_focused_on_videos_you_pick": "Add trusted channels so this page can stay focused on videos you picked for your family.", + "ui_su": "Su", + "ui_mo": "Mo", + "ui_tu": "Tu", + "ui_th": "Th", + "ui_fr": "Fr", + "ui_sa": "Sa", + "ui_this_week": "This week", + "ui_this_month": "This month", + "ui_this_removes_all_saved_searches_from_your_account": "This removes all saved searches from your account.", + "ui_recent": "recent", + "ui_just_now": "Just now", + "ui_deselect": "Deselect", + "ui_audio_language": "Audio Language", + "ui_functionality": "Functionality", + "ui_create_rss_feed_for_this_channel": "Create RSS feed for this channel", + "ui_create_subscription_rss_feed": "Create subscription RSS feed", + "ui_sabr_playback_is_unavailable_for_this_short": "SABR playback is unavailable for this Short", + "ui_this_short_stopped_playing": "This Short stopped playing", + "ui_this_short_is_only_available_for_members": "This Short is only available for members", + "ui_original_audio_unavailable": "Original audio unavailable", + "ui_skipped_automatically": "Skipped automatically", + "ui_skipped": "Skipped", + "ui_add": "add", + "ui_switch_to_light_mode": "Switch to light mode", + "ui_switch_to_dark_mode": "Switch to dark mode", + "ui_light_mode": "Light mode", + "ui_dark_mode": "Dark mode", + "ui_bullet_comments": "Bullet comments", + "ui_more_actions": "More actions", + "ui_report_bug": "Report bug", + "ui_likes": "Likes", + "ui_dislikes": "Dislikes", + "ui_audio_only_unavailable": "Audio only unavailable", + "ui_expand_playlist": "Expand playlist", + "ui_error_occurs_when_fetching_the_page_try_increase_the_loading_timeout": "Error occurs when fetching the page. Try increase the loading timeout in Settings.", + "ui_connect_youtube_to_access_this_video": "Connect YouTube to access this video.", + "ui_this_video_is_currently_unavailable": "This video is currently unavailable", + "ui_failed_to_load_stream": "Failed to load stream.", + "ui_mute_zen_music": "Mute zen music", + "ui_completing_sign_in_with_your_provider": "Completing sign-in with your provider.", + "ui_could_not_load_player": "Could not load player.", + "ui_this_removes_every_video_from_your_watch_history": "This removes every video from your watch history.", + "ui_failed_to_clear_history": "Failed to clear history", + "ui_this_video_will_be_removed_from_your_watch_history": "This video will be removed from your watch history.", + "ui_pipepipe_import_completed": "PipePipe import completed.", + "ui_pipepipe_import_failed": "PipePipe import failed.", + "ui_pipepipe_backup": "PipePipe Backup", + "ui_restore_history_subscriptions_playlists_and_watch_progress_from_a_bac": "Restore history, subscriptions, playlists, and watch progress from a backup ZIP.", + "ui_youtube_import_completed": "YouTube import completed.", + "ui_all_archives_processed": "All archives processed.", + "ui_youtube_takeout": "YouTube Takeout", + "ui_drop_your_takeout_zip_below_we_import_subscriptions_playlists_and_his": "Drop your Takeout ZIP below. We import subscriptions, playlists, and history.", + "ui_import_started": "Import started.", + "ui_trending": "Trending", + "ui_this_playlist": "this playlist", + "ui_this_action_cannot_be_undone": "This action cannot be undone.", + "ui_this_only_removes_the_saved_reference_from_your_library": "This only removes the saved reference from your library.", + "ui_unable_to_load_podcast_episodes": "Unable to load podcast episodes.", + "ui_first_installation_detected_set_up_the_administrator_account": "First installation detected. Set up the administrator account.", + "ui_registrations_are_currently_closed": "Registrations are currently closed.", + "ui_use_your_email_to_create_an_account_you_can_sign_in_with_email_or_use": "Use your email to create an account. You can sign in with email or username.", + "ui_account_created": "Account created", + "ui_unable_to_create_account": "Unable to create account.", + "ui_create_admin_account": "Create admin account", + "ui_administrator_name": "Administrator name", + "ui_invalid_or_expired_reset_token": "Invalid or expired reset token.", + "ui_use_the_token_generated_from_the_admin_panel": "Use the token generated from the admin panel.", + "ui_try_a_channel_you_already_trust_or_add_more_channels_to_the_family_li": "Try a channel you already trust, or add more channels to the family list.", + "ui_youtube_session_connected": "YouTube session connected", + "ui_remote_youtube_login_is_not_available_yet": "Remote YouTube login is not available yet", + "ui_youtube_session_disconnected": "YouTube session disconnected", + "ui_could_not_disconnect_youtube_session": "Could not disconnect YouTube session", + "ui_all_those_recommendations_comments_and_shorts_we_worked_so_hard_on_go": "All those recommendations, comments and shorts we worked so hard on, gone.", + "ui_are_you_sure": "Are you sure?", + "ui_i_am_sure": "I am sure", + "ui_are_you_sure_sure": "Are you SURE sure?!", + "ui_last_chance": "LAST CHANCE.", + "ui_okay_fine_do_not_say_we_did_not_warn_you": "Okay fine. Do not say we did not warn you.", + "settings_sponsorblock_hide": "Hide", + "ui_upcoming": "Upcoming", + "ui_enabled": "Enabled", + "ui_disabled": "Disabled", + "ui_copy_private_link": "Copy private link", + "ui_edit_feed": "Edit feed", + "ui_replace_private_link": "Replace private link", + "ui_delete_feed": "Delete feed", + "ui_export_completed": "Export completed", + "ui_restore_failed": "Restore failed", + "ui_autoplay_next_video": "Autoplay next video", + "ui_automatically_continue_with_the_first_item_in_the_suggestions_column": "Automatically continue with the first item in the suggestions column.", + "ui_dearrow_titles_and_thumbnails": "DeArrow titles and thumbnails", + "ui_use_community_written_titles_and_representative_thumbnails_for_youtub": "Use community-written titles and representative thumbnails for YouTube videos.", + "ui_related_videos": "Related videos", + "ui_comments_and_danmaku": "Comments and danmaku", + "ui_stop_loading_watch_comments_shorts_comments_and_bullet_comments": "Stop loading watch comments, Shorts comments, and bullet comments.", + "ui_shorts_surface": "Shorts surface", + "ui_live_streams": "Live streams", + "ui_members_only_videos": "Members-only videos", + "ui_auto": "Auto", + "ui_automatically_play_the_next_video": "Automatically play the next video", + "ui_seconds_before_autoplay_advances_or_0_for_immediate_playlists": "Seconds before autoplay advances, or 0 for immediate playlists", + "ui_load_a_backend_provided_audio_stream_when_available": "Load a backend-provided audio stream when available", + "ui_unsubscribed_from_all_channels": "Unsubscribed from all channels", + "ui_search_history_cleared": "Search history cleared", + "ui_action_failed": "Action failed", + "ui_subscriptions_4": "subscriptions", + "ui_rss_feed_updated": "RSS feed updated", + "ui_rss_feed_deleted": "RSS feed deleted", + "ui_feed_limit_reached": "Feed limit reached", + "ui_create_rss_feed": "Create RSS feed", + "ui_delete_3": "delete", + "ui_delete_rss_feed": "Delete RSS feed?", + "ui_replace_private_link_2": "Replace private link?", + "ui_the_current_link_will_stop_working_immediately": "The current link will stop working immediately.", + "ui_the_current_private_link_will_be_revoked_immediately": "The current private link will be revoked immediately.", + "ui_replace_link": "Replace link", + "ui_mark": "Mark", + "ui_use_category_rules_for_automatic_skips": "Use category rules for automatic skips.", + "ui_show_matching_segments_without_skipping": "Show matching segments without skipping.", + "ui_off": "Off", + "ui_ignore_all_sponsorblock_data": "Ignore all SponsorBlock data.", + "ui_updating": "Updating...", + "ui_update_password": "Update password", + "ui_registrations_closed": "Registrations closed", + "ui_creating_account": "Creating account...", + "ui_remote_browser_connection_failed": "Remote browser connection failed", + "ui_playlist_removed": "Playlist removed", + "ui_playlist_saved": "Playlist saved", + "ui_watch_history_cleared": "Watch history cleared", + "ui_private_rss_link_copied": "Private RSS link copied", + "ui_allow_list_mode_updated": "Allow list mode updated", + "ui_status_updated": "Status updated", + "ui_github_issue_created": "GitHub issue created", + "ui_rss_settings_updated": "RSS settings updated", + "ui_rss_feed_revoked": "RSS feed revoked", + "video_premiere_scheduled": "Premiere scheduled", + "video_premiere_starts_in": "This premiere starts in {relativeTime}.", + "video_premiere_not_started": "This premiere has not started yet.", + "video_paid": "Paid video", + "video_paid_message": "This video must be purchased on YouTube before it can be played.", + "video_members_only": "Members-only video", + "video_members_only_message": "This video is only available for members", + "channel_sort_newest": "Newest", + "channel_sort_popular": "Popular", + "channel_sort_oldest": "Oldest", + "playlist_sort_manual": "Manual", + "playlist_sort_added_newest": "Date added (newest)", + "playlist_sort_added_oldest": "Date added (oldest)", + "playlist_sort_posted_newest": "Date posted (newest)", + "playlist_sort_posted_oldest": "Date posted (oldest)", + "playlist_sort_popularity": "Popularity", + "search_filter_sort_by": "Sort by", + "search_filter_upload_date": "Upload date", + "search_filter_relevance": "Relevance", + "search_filter_rating": "Rating", + "search_filter_view_count": "View count", + "search_filter_past_hour": "Past hour", + "search_filter_today": "Today", + "search_filter_this_week": "This week", + "search_filter_this_year": "This year", + "search_filter_short": "Short", + "search_filter_long": "Long", + "search_filter_creative_commons": "Creative Commons", + "sponsorblock_sponsored_message": "Sponsored message", + "sponsorblock_sponsored_message_description": "Paid promotion, sponsorship, or direct advertising.", + "sponsorblock_self_promotion": "Self-promotion", + "sponsorblock_self_promotion_description": "Unpaid promotion, merch, donations, or guest promotion.", + "sponsorblock_exclusive_access": "Exclusive access", + "sponsorblock_exclusive_access_description": "Whole-video labels for free or subsidized access.", + "sponsorblock_interaction_reminder": "Interaction reminder", + "sponsorblock_interaction_reminder_description": "Short reminders to like, subscribe, or follow.", + "sponsorblock_highlight": "Highlight", + "sponsorblock_highlight_description": "The main point most viewers are looking for.", + "sponsorblock_intermission_or_intro": "Intermission or intro", + "sponsorblock_intermission_or_intro_description": "Low-content pauses, static screens, or repeated animations.", + "sponsorblock_endcards_or_credits": "Endcards or credits", + "sponsorblock_endcards_or_credits_description": "Credits or YouTube end screens without useful conclusions.", + "sponsorblock_preview_or_recap": "Preview or recap", + "sponsorblock_preview_or_recap_description": "Clips repeated later in the same video or series.", + "sponsorblock_tangents_or_jokes": "Tangents or jokes", + "sponsorblock_tangents_or_jokes_description": "Aggressive skipping for non-essential tangents or jokes.", + "sponsorblock_chapter": "Chapter", + "sponsorblock_chapter_description": "Custom chapters describing important sections.", + "sponsorblock_music_non_music": "Music: non-music", + "sponsorblock_music_non_music_description": "Non-musical sections in music videos.", + "ui_hide_in_progress_videos_from_the_home_page": "Hide in-progress videos from the home page.", + "ui_home_recommendations": "Home recommendations", + "ui_hide_personalized_recommendations_from_the_home_page": "Hide personalized recommendations from the home page.", + "ui_hide_the_suggestions_column_on_watch_pages": "Hide the suggestions column on watch pages.", + "ui_watch_and_shorts": "Watch + Shorts", + "ui_hide_shorts_navigation_and_block_the_shorts_page": "Hide Shorts navigation and block the Shorts page.", + "ui_hide_active_and_scheduled_live_streams_from_the_subscriptions_feed": "Hide active and scheduled live streams from the subscriptions feed.", + "ui_hide_videos_that_require_a_paid_youtube_channel_membership": "Hide videos that require a paid YouTube channel membership.", + "ui_play_next_playlist_item_immediately_while_keeping_the_countdown_for_recommendations": "Play the next playlist item immediately while keeping the countdown for recommendations.", + "ui_john_doe": "john.doe", + "ui_admin_settings_updated": "Admin settings updated", + "ui_failed_to_clear_download_job": "Failed to clear download job", + "ui_hide_everything_question": "Hide everything?", + "ui_we_spent_months_on_this_months_and_poof_you_want_it_gone": "We spent months on this. Months. And poof, you want it gone?", + "ui_backup_restored": "Backup restored: {count} items", + "ui_unable_to_load_rss_feeds": "Unable to load RSS feeds", + "ui_large_history_in": "Large history in {file}", + "ui_files_queued": "{count} file(s) queued.", + "ui_unable_to_load_import_report": "Unable to load import report.", + "ui_unable_to_process_archive": "Unable to process archive.", + "ui_registration_rejected_server": "Registration was rejected by the server. Add {origin} to ALLOWED_ORIGINS without a trailing slash, then restart typetype-server.", + "ui_copied": "Copied", + "ui_link": "Link", + "ui_player": "Player", + "ui_bug_status_new": "New", + "ui_bug_status_triaged": "Triaged", + "ui_bug_status_in_progress": "In Progress", + "ui_bug_status_fixed": "Fixed", + "ui_bug_status_closed": "Closed", + "ui_bug_category_player": "Player", + "ui_bug_category_audio_language": "Audio Language", + "ui_bug_category_subtitles": "Subtitles", + "ui_bug_category_interface": "Interface", + "ui_bug_category_functionality": "Functionality", + "ui_sending": "Sending...", + "ui_submit": "Submit", + "ui_history_count": "{count} entries", + "ui_subscription_count": "{count} channels", + "ui_search_history_count": "{count} entries", + "ui_clear_history_question": "Clear {label}?", + "ui_unsubscribe_from_count_question": "Unsubscribe from {label}?", + "ui_clear_search_history_question": "Clear {label}?", + "ui_playing": "Playing", + "ui_we": "We", + "ui_play_zen_music": "Play zen music", + "ui_collapse_playlist": "Collapse playlist", + "ui_play_audio": "Play audio", + "ui_channel_followed": "{count} channel followed", + "ui_channels_followed": "{count} channels followed", + "ui_channel_feed": "Channel feed", + "ui_my_subscriptions": "My subscriptions", + "ui_edit_rss_feed": "Edit RSS feed", + "ui_new_rss_feed": "New RSS feed", + "ui_saving": "Saving...", + "ui_save": "Save", + "ui_create_feed": "Create feed", + "ui_all": "All", + "ui_all_subscriptions": "All subscriptions", + "ui_selected_channel": "{count} selected channel", + "ui_selected_channels": "{count} selected channels", + "ui_never": "Never", + "ui_no_users_found": "No users found.", + "ui_no_managed_users_yet": "No users are managed by allow-list rules yet.", + "ui_load_more_users": "Load more users", + "ui_import_report_summary": "{subscriptions} subscriptions · {playlists} playlists · {videos} playlist videos", + "ui_import_started_keep_window_open": "Import started. Keep this window open.", + "ui_connected": "Connected", + "ui_reconnect_needed": "Reconnect needed", + "ui_not_connected": "Not connected", + "ui_typetype_can_use_this_session": "TypeType can use this session when extraction needs it.", + "ui_youtube_rejected_stored_session": "YouTube rejected the stored session. Create a new code.", + "ui_no_youtube_session_connected": "No YouTube session is connected.", + "ui_prepare": "Prepare", + "ui_download": "Download", + "ui_finalize": "Finalize", + "ui_opening_file": "Opening file", + "ui_failed": "Failed", + "ui_ready_from_cache": "Ready from cache", + "ui_ready": "Ready", + "ui_queued": "Queued", + "ui_downloading": "Downloading", + "ui_finalizing": "Finalizing", + "ui_preparing_download": "Preparing download", + "ui_handing_file_to_browser": "Handing the file to your browser.", + "ui_download_cancelled": "The download was cancelled.", + "ui_download_could_not_be_completed": "The download could not be completed.", + "ui_using_cached_file": "Using the cached file.", + "ui_file_is_ready": "Your file is ready.", + "ui_waiting_for_worker": "Waiting for an available worker.", + "ui_downloading_selected_media": "Downloading the selected media.", + "ui_combining_final_file": "Combining the final file.", + "ui_preparing_streams_and_selecting_format": "Preparing streams and selecting the format.", + "ui_unknown": "Unknown", + "ui_unknown_size": "Unknown size", + "ui_default": "default", + "ui_seconds_left": "{count}s left", + "ui_minutes_seconds_left": "{minutes}m {seconds}s left", + "ui_hours_minutes_left": "{hours}h {minutes}m left", + "ui_rss_feed_will_stop_working": "{name} will stop working immediately.", + "ui_flag": "{code} flag", + "ui_video_count": "{count} video", + "ui_videos_count": "{count} videos", + "ui_remove_video_from_playlist_question": "Remove \"{name}\" from this playlist?", + "ui_delete_playlist_confirmation": "Delete \"{name}\"? This cannot be undone.", + "ui_remove_filter": "Remove {label} filter", + "ui_select_named_channel": "Select {name}", + "ui_replay": "REPLAY", + "ui_subtitle_auto": "{label} (auto)", + "ui_requested_quality_unavailable": "Requested {height}p is unavailable. Pick another format.", + "ui_selected_format_unavailable": "Selected format is unavailable. Pick another format.", + "ui_downloaded_of": "{downloaded} of {total}", + "ui_playlist_deleted": "Playlist deleted", + "ui_playlists_deleted": "{count} playlists deleted", + "ui_saved_playlist_removed": "Removed {name}", + "ui_delete_playlist_question": "Delete \"{name}\"?", + "ui_delete_playlists_question": "Delete {count} playlists?", + "ui_playlist_created": "\"{name}\" created", + "ui_remove_saved_playlist_question": "Remove \"{name}\"?", + "ui_all_videos_in_playlist_blocked": "All videos in this playlist are blocked.", + "ui_no_videos_in_playlist_yet": "No videos in this playlist yet.", + "ui_copy_json": "Copy JSON", + "ui_cancel": "Cancel", + "ui_clear": "Clear", + "ui_open_file": "Open file", + "ui_added": "Added", + "ui_saved": "Saved", + "ui_allowed": "Allowed", + "ui_adding": "Adding", + "ui_allow_channel": "Allow channel", + "ui_january": "January", + "ui_february": "February", + "ui_march": "March", + "ui_april": "April", + "ui_may": "May", + "ui_june": "June", + "ui_july": "July", + "ui_august": "August", + "ui_september": "September", + "ui_october": "October", + "ui_november": "November", + "ui_december": "December", + "ui_add_url": "Add URL", + "ui_unknown_user": "Unknown user", + "ui_browser": "Browser", + "ui_rss_feed_disabled": "RSS feed disabled", + "ui_rss_feed_enabled": "RSS feed enabled", + "ui_account_rss_disabled": "Account RSS disabled", + "ui_account_rss_enabled": "Account RSS enabled", + "ui_feeds_per_account": "Feeds per account", + "ui_items_per_feed": "Items per feed", + "ui_minimum_poll_minutes": "Minimum poll (minutes)", + "ui_requests_per_minute": "Requests per minute", + "ui_save_policy": "Save policy", + "ui_older": "Older", + "ui_loading_videos": "Loading videos", + "ui_simple_view": "Simple view", + "ui_all_formats_count": "All formats ({count})", + "ui_danmaku_on": "Danmaku on", + "ui_danmaku": "Danmaku", + "ui_cancelling": "Cancelling...", + "ui_clearing": "Clearing...", + "ui_new_upload": "New upload", + "ui_new_uploads": "{count} new uploads", + "ui_checking_availability": "Checking availability...", + "ui_opening": "Opening...", + "ui_hide_guide": "Hide guide", + "ui_need_help": "Need help?", + "ui_playback_unavailable_for_short": "Playback is unavailable for this Short", + "ui_unsubscribed_from": "Unsubscribed from {name}", + "ui_subscribed_to": "Subscribed to {name}", + "ui_videos_waiting": "New videos are waiting", + "ui_best_quality": "Best quality", + "ui_best_sound": "Best sound", + "ui_recommended_quality": "Recommended ({height}p)", + "ui_balanced": "Balanced", + "ui_small_size_360p": "Small size (360p)", + "ui_small_size": "Small size", + "ui_removed_from_playlist": "Removed from {name}", + "ui_saved_to_playlist": "Saved to {name}", + "ui_playlist_named_created": "Playlist \"{name}\" created", + "ui_watch_later_update_failed": "Could not update Watch later", + "ui_show_current_segment_next_to_time": "Show current segment next to time", + "ui_show_sponsorblock_chapters": "Show SponsorBlock chapters", + "ui_show_full_video_labels": "Show full-video labels", + "ui_manual_skip_full_video_labels": "Manual skip for full-video labels", + "ui_skip_non_music_on_music_videos": "Skip non-music only on music videos", + "ui_mute_segments_instead_of_skipping": "Mute segments instead of skipping", + "ui_report_count": "{count} report", + "ui_reports_count": "{count} reports", + "ui_playlist": "playlist", + "ui_offline": "offline", + "ui_episode_count": "{count} episode", + "ui_episodes_count": "{count} episodes", + "ui_ending_video": "ending video", + "ui_backup_archive": "Backup archive", + "ui_family_list_blocked": "This channel is not on your family list. A parent can add it from the allow list.", + "ui_views": "views", + "ui_no_watch_date_range": "No watch date range available", + "data_portability_formats_failed": "Unable to load supported formats.", + "ui_downloader_insufficient_storage": "The instance does not have enough storage to complete this download.", + "ui_downloader_insufficient_storage_help": "Free storage and try again. If the problem continues, contact the instance administrator with code: insufficient_storage (HTTP 507).", + "portability_progress_of": "{processed} of {total}", + "portability_progress_records": "records", + "portability_progress_categories": "categories", + "portability_progress_bytes": "bytes", + "ui_download_started": "Download started: {selected}", + "ui_download_failed": "Download failed.", + "portability_issue_detected": "Issue detected: {code}", + "ui_remote_browser_error": "The remote browser reported an error.", + "ui_remote_phase_idle": "Idle", + "ui_remote_phase_connecting": "Connecting", + "ui_remote_phase_opening": "Opening", + "ui_remote_phase_awaiting_login": "Waiting for sign-in", + "ui_remote_phase_capturing_session": "Capturing session", + "ui_remote_phase_connected": "Connected", + "ui_remote_phase_closed": "Closed", + "ui_remote_phase_error": "Error" +} diff --git a/apps/web/messages/fr.json b/apps/web/messages/fr.json new file mode 100644 index 00000000..b280d451 --- /dev/null +++ b/apps/web/messages/fr.json @@ -0,0 +1,1293 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + "admin_access_description": "Définissez qui peut rejoindre l'instance et quels contenus sont disponibles.", + "admin_access_label": "Accès", + "admin_access_mode_description": "Le contrôle parental limite l'extraction et la découverte aux chaînes approuvées.", + "admin_access_mode_label": "Accès au contenu", + "admin_allow_guest_description": "Permettre aux visiteurs de naviguer sans compte personnel.", + "admin_allow_guest_label": "Autoriser le mode invité", + "admin_allow_registration_description": "Permettre aux nouveaux utilisateurs de créer un compte.", + "admin_allow_registration_label": "Autoriser les inscriptions", + "admin_authentication_description": "Contrôlez les points d'entrée des comptes et les sessions YouTube distantes.", + "admin_authentication_label": "Authentification", + "admin_console_subtitle": "Configurez cette instance et inspectez ses utilisateurs, accès, sessions, flux et signalements.", + "admin_console_title": "Administration", + "admin_banner_url_label": "URL de la bannière", + "admin_identity_description": "Affichée sur les pages de connexion et dans toute cette instance.", + "admin_identity_label": "Identité", + "admin_instance_description": "Identité visuelle, accès, authentification et comportement de la plateforme.", + "admin_instance_label": "Instance", + "admin_instance_name_label": "Nom de l'instance", + "admin_local_login_description": "Autoriser l'authentification par e-mail et mot de passe.", + "admin_local_login_label": "Connexion locale", + "admin_logo_url_label": "URL du logo", + "admin_min_android_description": "Laissez vide si aucune version minimale n'est requise.", + "admin_min_android_label": "Version Android minimale", + "admin_oidc_description": "Rediriger les utilisateurs directement vers le fournisseur d'identité configuré.", + "admin_oidc_label": "Rediriger vers OIDC", + "admin_parental_description": "Choisissez les chaînes disponibles lorsque l'accès contrôlé est actif.", + "admin_parental_label": "Contrôle parental", + "admin_reports_description": "Analysez les signalements avec les diagnostics de requêtes et de lecture.", + "admin_reports_label": "Signalements", + "admin_rss_description": "Configurez les flux privés, les limites et les accès par compte.", + "admin_save_changes": "Enregistrer", + "admin_saving": "Enregistrement", + "admin_sessions_description": "Consultez les appareils connectés, l'activité et les lectures en cours.", + "admin_sessions_label": "Sessions", + "admin_tagline_label": "Slogan", + "admin_track_sessions_description": "Afficher aux administrateurs les appareils connectés et l'activité de lecture.", + "admin_track_sessions_label": "Suivre les sessions actives", + "admin_unrestricted_label": "Sans restriction", + "admin_unsaved_changes": "Modifications non enregistrées", + "admin_users_description": "Gérez les rôles, suspensions, identités et récupérations de compte.", + "admin_users_label": "Utilisateurs", + "admin_verified_email_description": "Exiger une vérification avant l'utilisation du compte.", + "admin_verified_email_label": "Exiger un e-mail vérifié", + "admin_youtube_login_description": "Autoriser la configuration d'une session YouTube depuis le navigateur.", + "admin_youtube_login_label": "Connexion YouTube distante", + "admin_preview_tagline": "Votre plateforme vidéo privée", + "language_english": "Anglais", + "language_french": "Français", + "nav_admin": "Administration", + "nav_close_sidebar": "Fermer la barre latérale", + "nav_data_transfer": "Transfert de données", + "nav_history": "Historique", + "nav_home": "Accueil", + "nav_login": "Connexion", + "nav_more": "Plus", + "nav_open_menu": "Ouvrir le menu", + "nav_playlists": "Playlists", + "nav_primary": "Navigation principale", + "nav_privacy": "Confidentialité", + "nav_services": "Services", + "nav_settings": "Paramètres", + "nav_shorts": "Shorts", + "nav_sign_out": "Se déconnecter", + "nav_subscriptions": "Abonnements", + "shell_built_by_community": "Créé par la communauté TypeType", + "shell_search": "Rechercher", + "shell_support": "Soutenir", + "shell_support_typetype": "Soutenir TypeType", + "watch_audio_loading": "Chargement de l'audio...", + "watch_audio_only": "Audio uniquement", + "watch_autoplay": "Lecture automatique", + "watch_block_channel": "Bloquer la chaîne", + "watch_block_video": "Bloquer la vidéo", + "watch_channel_blocked": "Chaîne bloquée :", + "watch_channel_unblocked": "Chaîne débloquée", + "watch_comments": "Commentaires", + "watch_comments_disabled": "Les commentaires sont désactivés pour cette vidéo.", + "watch_could_not_update_later": "Impossible de mettre à jour À regarder plus tard", + "watch_download": "Télécharger", + "watch_favorite": "Favori", + "watch_favorited": "En favori", + "watch_hide_replies": "Masquer les réponses", + "watch_likes": "J'aime", + "watch_link_copied": "Lien copié dans le presse-papiers", + "watch_load_more_replies": "Charger plus de réponses", + "watch_more": "Plus", + "watch_pinned": "Épinglé", + "watch_removed_favorites": "Retiré des favoris", + "watch_removed_later": "Retiré de À regarder plus tard", + "watch_remove_later": "Retirer de À regarder plus tard", + "watch_replies": "réponses", + "watch_report": "Signaler", + "watch_save": "Enregistrer", + "watch_save_later": "Enregistrer dans À regarder plus tard", + "watch_save_playlist": "Enregistrer dans une playlist", + "watch_saved_favorites": "Ajouté aux favoris", + "watch_saved_later": "Ajouté à À regarder plus tard", + "watch_saving": "Enregistrement...", + "watch_share": "Partager", + "watch_show_less": "Afficher moins", + "watch_show_more": "Afficher plus", + "watch_show_replies": "Afficher les réponses", + "watch_subscribe": "S'abonner", + "watch_subscribed": "Abonné", + "watch_subscribed_to": "Abonné à", + "watch_subscription_failed": "La mise à jour de l'abonnement a échoué", + "watch_unsubscribed_from": "Désabonné de", + "watch_unblock_channel": "Débloquer la chaîne", + "watch_unblock_video": "Débloquer la vidéo", + "watch_verified": "vérifié", + "watch_video_blocked": "Vidéo bloquée", + "watch_video_options": "Options de la vidéo", + "watch_video_unblocked": "Vidéo débloquée", + "player_format": "Format", + "player_disable_cinema_mode": "Désactiver le mode cinéma", + "player_enable_cinema_mode": "Activer le mode cinéma", + "player_language": "Langue", + "player_mute": "Couper le son", + "player_next_video": "Vidéo suivante", + "player_original": "original", + "player_pause": "Pause", + "player_play": "Lecture", + "player_previous_video": "Vidéo précédente", + "player_quality": "Qualité", + "player_seek_backward_10": "Reculer de 10 secondes", + "player_seek_forward_10": "Avancer de 10 secondes", + "player_unmute": "Rétablir le son", + "player_accessibility": "Accessibilité", + "player_announcements": "Annonces", + "player_audio": "Audio", + "player_auto": "Auto", + "player_boost": "Amplifier", + "player_caption_styles": "Style des sous-titres", + "player_chapters": "Chapitres", + "player_closed_captions_off": "Sous-titres désactivés", + "player_closed_captions_on": "Sous-titres activés", + "player_continue": "Continuer", + "player_default": "Par défaut", + "player_disabled": "Désactivé", + "player_enter_fullscreen": "Passer en plein écran", + "player_enter_pip": "Activer l’image dans l’image", + "player_exit_fullscreen": "Quitter le plein écran", + "player_exit_pip": "Quitter l’image dans l’image", + "player_fullscreen": "Plein écran", + "player_keyboard_animations": "Animations au clavier", + "player_loop": "Boucle", + "player_normal": "Normale", + "player_off": "Désactivé", + "player_playback": "Lecture", + "player_replay": "Rejouer", + "player_reset": "Réinitialiser", + "player_seek": "Navigation", + "player_seek_backward": "Reculer", + "player_seek_forward": "Avancer", + "player_settings": "Réglages", + "player_skip_to_live": "Revenir au direct", + "player_speed": "Vitesse", + "player_track": "Piste", + "player_volume": "Volume", + "player_next_video_fallback": "Vidéo suivante", + "player_unavailable_video": "Vidéo indisponible", + "settings_about_description": "Versions, liens du projet et logiciels tiers.", + "settings_about_label": "À propos", + "settings_blocked_description": "Consultez les chaînes, vidéos et mots-clés masqués.", + "settings_blocked_label": "Contenu bloqué", + "settings_data_description": "Importez, restaurez et exportez les données du compte.", + "settings_data_label": "Données", + "settings_interface_description": "Choisissez ce que TypeType ouvre et met en avant.", + "settings_interface_label": "Interface", + "settings_language_description": "Préférences d'interface, d'audio et de sous-titres.", + "settings_language_label": "Langues", + "settings_language_section": "Langue", + "settings_playback_description": "Qualité, vitesse, lecture automatique et audio uniquement.", + "settings_playback_label": "Lecture", + "settings_privacy_description": "Contrôlez l'historique, les sessions et la confidentialité du compte.", + "settings_privacy_label": "Confidentialité", + "settings_rss_description": "Gérez les flux privés de ce compte.", + "settings_services_description": "Sélectionnez le fournisseur utilisé par défaut.", + "settings_services_label": "Services", + "settings_subtitle": "Personnalisez la lecture, le contenu, la confidentialité et les données de votre compte.", + "settings_subtitle_default_description": "Activer les sous-titres par défaut", + "settings_subtitle_default_label": "Sous-titres", + "settings_subtitle_language_description": "Piste de sous-titres préférée", + "settings_subtitle_language_label": "Langue des sous-titres", + "settings_title": "Paramètres", + "settings_audio_language_description": "Piste audio préférée", + "settings_audio_language_ignored": "Ignoré lorsque la langue d'origine est imposée", + "settings_audio_language_label": "Langue audio", + "settings_original_audio_description": "Toujours utiliser la piste audio d'origine", + "settings_original_audio_label": "Préférer la langue d'origine", + "settings_ui_language_description": "Langue utilisée par TypeType sur cet appareil.", + "settings_ui_language_label": "Langue de l'interface", + "settings_video_description": "Visibilité du contenu et comportement de SponsorBlock.", + "settings_video_label": "Vidéo", + "profile_title": "Profil", + "profile_subtitle": "Gérez l'apparence de votre compte et vos informations de connexion.", + "profile_public_title": "Profil public", + "profile_public_description": "Choisissez le nom et la bio affichés avec votre activité.", + "profile_no_public_username": "Aucun nom d'utilisateur public", + "profile_username_label": "Nom d'utilisateur public", + "profile_username_help": "3 à 32 caractères : lettres, chiffres, point, tiret bas ou tiret.", + "profile_bio_label": "Bio", + "profile_bio_placeholder": "Présentez-vous en quelques mots", + "profile_bio_help": "Jusqu'à 280 caractères", + "profile_save": "Enregistrer le profil", + "profile_saved": "Profil mis à jour", + "profile_username_taken": "Ce nom d'utilisateur est déjà utilisé.", + "profile_username_invalid_format": "Utilisez uniquement des lettres, chiffres, points, tirets bas ou tirets.", + "profile_username_invalid_length": "Le nom d'utilisateur doit comporter entre 3 et 32 caractères.", + "profile_username_too_short": "Le nom d'utilisateur doit comporter au moins 3 caractères.", + "profile_username_too_long": "Le nom d'utilisateur doit comporter au plus 32 caractères.", + "profile_bio_too_long": "La bio doit comporter au plus 280 caractères.", + "profile_update_failed": "Impossible de mettre à jour le profil.", + "account_identity_title": "Identité du compte", + "account_identity_description": "Utilisée pour la connexion et l'affichage du compte.", + "account_identity_managed": "Gérée par votre fournisseur d'identité.", + "account_display_name": "Nom affiché", + "account_email": "Adresse e-mail", + "account_current_password": "Mot de passe actuel", + "account_save": "Enregistrer le compte", + "account_saved": "Compte mis à jour", + "account_update_failed": "Échec de la mise à jour", + "account_password_title": "Mot de passe", + "account_password_description": "Réinitialisez le mot de passe de votre compte.", + "account_password_reset": "Réinitialiser le mot de passe", + "avatar_title": "Avatar", + "avatar_custom_title": "Image personnalisée", + "avatar_custom_description": "PNG, JPEG, WebP ou GIF animé jusqu'à 10 Mo.", + "avatar_upload": "Importer", + "avatar_invalid_type": "Utilisez une image PNG, JPEG, WebP ou GIF", + "avatar_too_large": "L'avatar doit faire 10 Mo ou moins", + "avatar_updated": "Avatar mis à jour", + "avatar_upload_failed": "Impossible d'importer l'avatar", + "avatar_update_failed": "Impossible de modifier l'avatar", + "avatar_clear_failed": "Impossible de supprimer l'avatar", + "avatar_emoji_source": "Emojis fournis par", + "avatar_search": "Rechercher des emojis", + "avatar_scroll_left": "Faire défiler les emojis vers la gauche", + "avatar_scroll_right": "Faire défiler les emojis vers la droite", + "avatar_clear": "Supprimer", + "not_found_title": "Cette page est hors champ", + "not_found_description": "L'adresse est peut-être incorrecte, ou la page a été déplacée.", + "not_found_back": "Retour", + "not_found_home": "Accueil", + "data_portability_title": "Portabilité des données", + "data_portability_subtitle": "Importez les données du compte dans TypeType ou créez une sauvegarde pour une application compatible.", + "data_portability_import": "Importer", + "data_portability_export": "Exporter", + "data_portability_loading_formats": "Chargement des formats compatibles...", + "portability_export_download_started": "Téléchargement de l'export démarré", + "portability_export_ready": "Export prêt", + "portability_no_export_format": "Aucun format d'export n'est disponible.", + "portability_export_title": "Exporter les données", + "portability_generate_export": "Générer l'export", + "portability_export_description": "Choisissez une destination et créez une sauvegarde portable.", + "portability_destination_format": "Format de destination", + "portability_export_partial_warning": "Cette destination ne peut pas représenter tous les champs TypeType. Le rapport final indiquera les données qui n'ont pas pu être conservées.", + "portability_export_notes": "Notes de l'export", + "portability_download_export": "Télécharger l'export", + "portability_new_export": "Nouvel export", + "portability_download_report": "Télécharger le rapport", + "portability_start_another_export": "Démarrer un autre export", + "portability_export_failed": "Échec de l'export", + "portability_import_completed": "Import terminé", + "portability_items": "éléments", + "portability_no_import_format": "Aucun format d'import n'est disponible.", + "portability_import_title": "Importer des données", + "portability_import_description": "Prévisualisez les données et choisissez ce qui doit être restauré.", + "portability_import_from": "Importer depuis", + "portability_choose_or_drop": "Choisissez ou déposez une sauvegarde", + "portability_drop_original_prefix": "Déposez le fichier original", + "portability_drop_original_suffix": "de sauvegarde. Rien ne sera importé avant la validation de l'aperçu.", + "portability_duplicate_records": "enregistrements en double trouvés", + "portability_different_file": "Autre fichier", + "portability_compatibility_notes": "Notes de compatibilité", + "portability_duplicate_policy": "Lorsqu'un élément existe déjà", + "portability_skip": "Ignorer", + "portability_replace": "Remplacer", + "portability_import_selected": "Importer la sélection", + "portability_start_another_import": "Démarrer un autre import", + "portability_choose_another_backup": "Choisir une autre sauvegarde", + "portability_import_failed": "Échec de l'import", + "portability_job_waiting": "En attente de démarrage", + "portability_job_analyzing": "Analyse de la sauvegarde", + "portability_job_ready": "Prêt à importer", + "portability_job_importing": "Import des données", + "portability_job_generating": "Génération de l'export", + "portability_job_import_completed": "Import terminé", + "portability_job_export_ready": "Export prêt", + "portability_job_cancelled": "Opération annulée", + "portability_job_failed": "Échec de l'opération", + "portability_operation_failed": "L'opération de portabilité a échoué", + "portability_copy_reference": "Copier la référence du support", + "portability_cancel": "Annuler", + "portability_job_label": "Tâche", + "portability_request_label": "Requête", + "portability_code_label": "Code", + "portability_status_partial": "Prise en charge partielle", + "portability_status_supported": "Pris en charge", + "portability_status_not_supported": "Non pris en charge", + "portability_get_backup": "Récupérer votre sauvegarde", + "portability_backup_suffix": "Sauvegarde", + "portability_guide_typetype_description": "Déplacez vos données depuis une autre instance TypeType ou restaurez une sauvegarde portable.", + "portability_guide_typetype_step_one": "Ouvrez Paramètres, puis Portabilité des données sur l'instance source.", + "portability_guide_typetype_step_two": "Choisissez TypeType comme destination et téléchargez l'export.", + "portability_guide_typetype_step_three": "Déposez la sauvegarde téléchargée sans la modifier.", + "portability_guide_takeout_description": "Google Takeout peut fournir vos abonnements, votre historique, vos playlists, À regarder plus tard et vos vidéos aimées.", + "portability_guide_takeout_step_one": "Ouvrez Google Takeout avec YouTube et Mon activité sélectionnés.", + "portability_guide_takeout_step_two": "Créez un export ZIP unique, puis téléchargez-le depuis Google.", + "portability_guide_takeout_step_three": "Déposez le ZIP original. Si Google crée plusieurs ZIP, importez-les un par un.", + "portability_guide_takeout_action": "Ouvrir Google Takeout", + "portability_guide_opml_description": "Déplacez vos abonnements depuis toute application ou service capable d'exporter un fichier OPML.", + "portability_guide_opml_step_one": "Trouvez l'action d'export ou de sauvegarde des abonnements dans l'application source.", + "portability_guide_opml_step_two": "Choisissez OPML lorsque l'application demande un format d'export.", + "portability_guide_opml_step_three": "Téléchargez le fichier OPML, puis déposez-le ici.", + "portability_guide_generic_prefix": "Importez vos données existantes", + "portability_guide_generic_suffix": "dans TypeType.", + "portability_guide_generic_open_prefix": "Ouvrez", + "portability_guide_generic_open_suffix": "et recherchez son action de sauvegarde ou d'export.", + "portability_guide_generic_download": "Téléchargez la sauvegarde originale sans la modifier ni l'extraire.", + "portability_guide_generic_drop": "Déposez le fichier ici. TypeType prévisualisera les données avant tout import.", + "portability_stale_job_toast": "L'opération précédente n'est plus disponible. Recommencez.", + "portability_category_subscriptions": "Abonnements", + "portability_category_subscriptions_detail": "Chaînes suivies", + "portability_category_subscription_groups": "Groupes d'abonnements", + "portability_category_subscription_groups_detail": "Groupes de chaînes nommés", + "portability_category_history": "Historique de visionnage", + "portability_category_history_detail": "Vidéos déjà regardées", + "portability_category_playlists": "Playlists", + "portability_category_playlists_detail": "Playlists locales et leurs vidéos", + "portability_category_watch_later": "À regarder plus tard", + "portability_category_watch_later_detail": "Vidéos enregistrées pour plus tard", + "portability_category_favorites": "Favoris", + "portability_category_favorites_detail": "Vidéos ajoutées aux favoris", + "portability_category_progress": "Progression de lecture", + "portability_category_progress_detail": "Positions de lecture enregistrées", + "portability_category_search_history": "Historique des recherches", + "portability_category_search_history_detail": "Recherches récentes", + "portability_category_saved_playlists": "Playlists enregistrées", + "portability_category_saved_playlists_detail": "Playlists distantes suivies", + "portability_category_settings": "Paramètres", + "portability_category_settings_detail": "Préférences portables", + "portability_category_content_filters": "Filtres de contenu", + "portability_category_content_filters_detail": "Règles de contenu masqué", + "groups_preview_data_transfer": "Transfert de données", + "groups_preview_title": "Groupes d'abonnements", + "groups_preview_import": "Import", + "groups_preview_groups": "Groupes", + "groups_preview_done": "Terminé", + "groups_preview_import_complete": "Import terminé", + "groups_preview_import_summary": "{channels} abonnements, {playlists} playlists, {history} entrées d'historique et {groups} groupes ont été restaurés.", + "groups_preview_channels": "Chaînes", + "groups_preview_groups_label": "Groupes", + "groups_preview_ungrouped": "Non groupées", + "groups_preview_coverage": "Couverture", + "groups_preview_organize": "Organiser les groupes", + "groups_preview_view_subscriptions": "Voir mes abonnements", + "groups_preview_restored_groups": "Groupes restaurés", + "groups_preview_channel_count": "{count} chaîne", + "groups_preview_channel_count_plural": "{count} chaînes", + "groups_preview_group_name": "Nom du groupe", + "groups_preview_all_channels": "Toutes les chaînes ({count})", + "groups_preview_search": "Rechercher les chaînes importées", + "groups_preview_select_visible": "Sélectionner visibles", + "groups_preview_clear_page": "Vider la page", + "groups_preview_finish": "Terminer", + "groups_preview_no_group": "Aucun groupe", + "groups_preview_no_match": "Aucune chaîne ne correspond à cette vue", + "groups_preview_selected": "{count} sélectionnées", + "groups_preview_add_to_group": "Ajouter à un groupe", + "groups_preview_remove_from_group": "Retirer d'un groupe", + "groups_preview_clear": "Effacer", + "groups_preview_added": "{count} chaînes ajoutées à {group}", + "groups_preview_removed": "{count} chaînes retirées de {group}", + "groups_preview_group_created": "{group} créé", + "groups_preview_group_removed": "{group} retiré", + "groups_preview_organization_updated": "Organisation mise à jour", + "groups_preview_coverage_line": "{grouped} chaînes sur {total} ont au moins un groupe ({coverage} %)", + "groups_preview_more": "+{count} autres", + "groups_preview_open_subscriptions": "Ouvrir les abonnements", + "groups_preview_keep_organizing": "Continuer", + "groups_preview_mock": "Mock", + "groups_preview_reset": "Réinitialiser l'aperçu", + "groups_preview_close_new_group": "Fermer le nouveau groupe", + "groups_preview_create_group": "Créer un groupe", + "groups_preview_select_channel": "Sélectionner", + "groups_preview_remove_from_specific_group": "Retirer de {group}", + "admin_users_search": "Rechercher des utilisateurs", + "admin_users_search_placeholder": "Rechercher par nom, e-mail ou ID", + "admin_users_filter": "Statut et rôle", + "admin_users_filter_all": "Tous", + "admin_users_filter_admins": "Administrateurs", + "admin_users_filter_moderators": "Modérateurs", + "admin_users_filter_users": "Utilisateurs", + "admin_users_filter_suspended": "Suspendus", + "admin_users_loading": "Chargement des utilisateurs...", + "admin_users_load_error": "Impossible de charger les utilisateurs pour le moment.", + "admin_users_empty": "Aucun utilisateur ne correspond à cette vue.", + "admin_users_column_user": "Utilisateur", + "admin_users_column_role": "Rôle", + "admin_users_column_status": "Statut", + "admin_users_column_joined": "Inscription", + "admin_users_column_actions": "Actions", + "admin_users_active": "Actif", + "admin_users_role_user": "Utilisateur", + "admin_users_role_moderator": "Modérateur", + "admin_users_role_admin": "Administrateur", + "admin_users_manage": "Gérer", + "admin_users_details": "Détails de l'utilisateur", + "admin_users_details_description": "Gérer l'identité, le rôle et l'accès", + "admin_users_close_details": "Fermer les détails de l'utilisateur", + "admin_users_close": "Fermer", + "admin_users_account_access": "Accès au compte", + "admin_users_suspend": "Suspendre", + "admin_users_unsuspend": "Réactiver", + "admin_users_reset_token": "Réinitialiser le mot de passe", + "admin_users_previous_page": "Page précédente", + "admin_users_next_page": "Page suivante", + "admin_users_page": "Page", + "admin_users_of": "sur", + "admin_users_display_name": "Nom affiché", + "admin_users_email": "E-mail", + "admin_users_email_address": "Adresse e-mail", + "admin_users_save_identity": "Enregistrer l'identité", + "admin_users_identity_updated": "Identité de l'utilisateur mise à jour", + "admin_users_update_failed": "Échec de la mise à jour", + "admin_users_role_updated": "Rôle mis à jour", + "admin_users_suspend_updated": "Accès au compte mis à jour", + "admin_users_reset_failed": "Impossible de générer le jeton de réinitialisation", + "admin_users_token_copied": "Jeton copié dans le presse-papiers", + "admin_users_reset_title": "Jeton de réinitialisation du mot de passe", + "admin_users_reset_label": "Jeton de réinitialisation du mot de passe", + "admin_users_clipboard_unavailable": "Le presse-papiers n'est pas disponible. Sélectionnez le jeton ci-dessus et copiez-le manuellement.", + "admin_users_copy_token": "Copier le jeton", + "login_title": "Se connecter", + "login_subtitle": "Utilisez les identifiants de votre compte pour continuer.", + "login_signed_in": "Connecté", + "login_invalid_credentials": "Identifiants incorrects.", + "login_or": "ou", + "login_identifier_placeholder": "E-mail ou nom d'utilisateur", + "login_password_placeholder": "Mot de passe", + "login_pending": "Connexion...", + "login_no_method": "Aucune méthode de connexion n'est disponible.", + "login_create_account": "Créer un compte", + "login_reset_password": "Réinitialiser le mot de passe", + "login_oidc_redirecting": "Redirection...", + "login_oidc_continue": "Continuer avec", + "login_oidc_failed": "Impossible de démarrer la connexion. Réessayez.", + "nav_sign_in": "Se connecter", + "nav_register": "Créer un compte", + "nav_browse": "Parcourir", + "nav_account": "Compte", + "nav_guest": "Invité", + "nav_connected": "Connecté", + "nav_loading": "Chargement", + "nav_signed_out": "Déconnecté", + "ui_ranked_by_youtube": ", ranked by YouTube.", + "ui_click_the_browser_area_before_typing": "Cliquez dans la zone du navigateur avant de saisir du texte.", + "ui_api_errors": "· API errors:", + "ui_accepted_entries": "Accepted entries", + "ui_add_blocked_keyword": "Ajouter blocked keyword", + "ui_add_channel_for_this_user": "Ajouter channel for this user", + "ui_add_global_channel": "Ajouter global channel", + "ui_add_global_playlist": "Ajouter global playlist", + "ui_add_playlist_for_this_user": "Ajouter playlist for this user", + "ui_advanced_display": "Advanced display", + "ui_after_connection_retry_the_video_and_streams_uses_your_youtube_sessio": "After connection, retry the video and /streams uses your YouTube session.", + "ui_all_categories": "Toutes les catégories", + "ui_all_statuses": "Tous les états", + "ui_allowed_playlists": "Allowed playlists", + "ui_already_have_an_account_sign_in": "Already have an account? Sign in", + "ui_applied_when_a_video_starts": "Applied when a video starts", + "ui_audio_only_playback": "Audio-only playback", + "ui_autoplay_countdown": "Autoplay countdown", + "ui_back": "Back", + "ui_back_home": "Back home", + "ui_back_to_all_videos": "Retour à all videos", + "ui_back_to_import_sources": "Retour à import sources", + "ui_back_to_login": "Retour à login", + "ui_back_to_playlists": "Retour à playlists", + "ui_back_to_sign_in": "Retour à sign in", + "ui_badge_temporarily_unavailable": "Badge temporarily unavailable.", + "ui_blocked_channels": "Chaînes bloquées", + "ui_blocked_keywords": "Mots-clés bloqués", + "ui_blocked_videos": "Vidéos bloquées", + "ui_cancel_autoplay": "Cancel autoplay", + "ui_cancel_sign_in": "Cancel sign-in", + "ui_captured_at": "Captured at:", + "ui_category": "Category", + "ui_channel": "Chaîne", + "ui_channel_name_or_handle": "Channel name or @handle", + "ui_channels": "channels", + "ui_channels_available_when_allow_list_mode_is_enabled": "Channels available when allow-list mode is enabled.", + "ui_choose_the_image_shown_for_youtube_videos": "Choisir the image shown for YouTube videos.", + "ui_choose_the_title_shown_for_youtube_videos": "Choisir the title shown for YouTube videos.", + "ui_choose_zip_format_any_size": "Choisir ZIP format, any size", + "ui_clear_all": "Tout effacer", + "ui_clear_filters": "Effacer les filtres", + "ui_clear_search_history_in_settings": "Clear search history in Settings.", + "ui_clear_search_history": "Clear search history?", + "ui_clear_stored_watch_history_search_history_subscriptions_and_playback": "Clear stored watch history, search history, subscriptions, and playback progress from this account.", + "ui_clear_watch_history_in_settings": "Clear watch history in Settings.", + "ui_clear_watch_history": "Clear watch history?", + "ui_click_deselect_all_then_select_only_youtube_and_my_activity": "Click \"Deselect all\", then select only YouTube and My Activity", + "ui_close_download": "Fermer download", + "ui_close_filters": "Fermer filters", + "ui_close_picker": "Fermer picker", + "ui_collection": "Collection", + "ui_community_only": "Community only", + "ui_community_title": "Community title", + "ui_community_then_neutral_frame": "Community, then neutral frame", + "ui_confidence": "Confidence", + "ui_connect_with_youtube": "Connecter with YouTube", + "ui_connect_youtube_inside_typetype": "Connecter YouTube inside TypeType", + "ui_connect_youtube_on_typetype": "Connecter YouTube on TypeType", + "ui_content": "Contenu", + "ui_content_controls": "Content controls", + "ui_continue": "Continue", + "ui_continue_watching": "Continue watching", + "ui_control_which_community_entries_are_used": "Control which community entries are used.", + "ui_controls": "Contrôles", + "ui_cookies_and_playback_token_are_captured_server_side_only": "Cookies and playback token are captured server-side only.", + "ui_cooking_your_import": "Cooking your import", + "ui_couldn_t_load_this_video": "Couldn't load this video", + "ui_crash_logs": "Crash logs:", + "ui_create": "Créer", + "ui_create_export_and_wait_for_the_email": "Create export and wait for the email", + "ui_create_github_issue": "Create GitHub Issue", + "ui_created_feeds": "Created feeds", + "ui_date": "Date", + "ui_dearrow_confidence": "DeArrow confidence", + "ui_dearrow_thumbnails": "DeArrow thumbnails", + "ui_dearrow_titles": "DeArrow titles", + "ui_default_landing_page": "Default landing page", + "ui_default_playback_speed": "Default playback speed", + "ui_default_quality": "Default quality", + "ui_default_service": "Service par défaut", + "ui_delete": "Supprimer", + "ui_delete_2": "Delete (", + "ui_delete_playlist": "Supprimer la playlist", + "ui_describe_the_issue": "Describe the issue...", + "ui_description": "Description", + "ui_diagnostics": "Diagnostics", + "ui_did_you_mean": "Did you mean", + "ui_disabling_rss_keeps_existing_feed_configuration_intact": "Disabling RSS keeps existing feed configuration intact.", + "ui_disconnect": "Déconnecter", + "ui_discovery_surfaces": "Surfaces de découverte", + "ui_dismiss": "Dismiss", + "ui_dismiss_notification": "Dismiss notification", + "ui_do_you_know_how_much_time_i_spent_building_all_of_this": "Do you know how much time I spent building all of this?!", + "ui_download_the_zip_and_drop_it_here": "Download the ZIP and drop it here", + "ui_drag_to_reorder": "Drag to reorder", + "ui_drop_one_or_more_takeout_zip_files_here": "Drop one or more Takeout ZIP files here", + "ui_drop_your_pipepipe_backup_zip_here": "Drop your PipePipe backup ZIP here", + "ui_embed_unavailable": "Intégration indisponible", + "ui_empty_playlist": "Playlist vide", + "ui_enter_the_public_http_or_https_url_of_this_instance": "Enter the public HTTP or HTTPS URL of this instance.", + "ui_entire_instance": "Toute l’instance", + "ui_estimated_sync_in_progress": "estimated sync in progress...", + "ui_event_timeline": "Event timeline (", + "ui_export_selected": "Exporter la sélection", + "ui_failed_to_load_notifications_retry_in_a_few_seconds": "Échec lors de load notifications. Retry in a few seconds.", + "ui_failed_to_submit_report_please_try_again": "Échec lors de submit report. Please try again.", + "ui_family_list": "Liste familiale", + "ui_file_is_ready_tap_below_to_open_it_in_ios_and_save_to_files": "File is ready. Tap below to open it in iOS and save to Files.", + "ui_filters": "Filtres", + "ui_fine": "Très bien !", + "ui_followed": "suivis", + "ui_global_behavior_first_then_category_rules_decide_what_gets_skipped_or": "Global behavior first, then category rules decide what gets skipped or marked.", + "ui_go_and_relax": "Go and relax", + "ui_go_back_to": "Go back to", + "ui_go_to": "Go to", + "ui_go_to_video": "Aller à video", + "ui_guest_mode_disabled": "Guest mode disabled", + "ui_hide_every_recommendation_comment_and_surface_at_once": "Masquer every recommendation, comment, and surface at once.", + "ui_hide_everything": "Masquer everything", + "ui_history": "Historique :", + "ui_how_to_export_from_youtube": "How to export from YouTube", + "ui_import_from_pipepipe": "Import from PipePipe", + "ui_import_from_youtube": "Import from YouTube", + "ui_import_id": "Import ID:", + "ui_imported": "Imported:", + "ui_import_phase_analyzing": "Analyse en cours", + "ui_import_phase_applying": "Application en cours", + "ui_import_phase_collecting": "Collecte en cours", + "ui_import_phase_encoding": "Génération en cours", + "ui_import_phase_in_progress": "En cours", + "ui_inherited_global_channels": "Inherited global channels", + "ui_inherited_global_playlists": "Inherited global playlists", + "ui_instance_policy": "Instance policy", + "ui_issue": "Problème", + "ui_keyword": "Keyword", + "ui_keyword_to_block": "Keyword to block", + "ui_language": "Langue :", + "ui_last_read": "Last read:", + "ui_last_used": "Dernière utilisation", + "ui_library": "Bibliothèque", + "ui_live_public_playlists_saved_to_your_library": "Live public playlists saved to your library.", + "ui_load_more": "Charger plus", + "ui_loading_active_sessions": "Chargement de active sessions…", + "ui_loading_admin_settings": "Chargement de admin settings…", + "ui_loading_allow_list": "Chargement de allow list…", + "ui_loading_bug_reports": "Chargement de bug reports…", + "ui_loading_more": "Chargement de more…", + "ui_loading_notifications": "Chargement de notifications…", + "ui_loading_private_feeds": "Chargement de private feeds…", + "ui_loading_rss_controls": "Chargement de RSS controls…", + "ui_loading_rss_feeds": "Chargement de RSS feeds…", + "ui_loading_rss_settings": "Chargement de RSS settings…", + "ui_loading_session": "Chargement de session…", + "ui_loading_user_allow_list": "Chargement de user allow list…", + "ui_loading": "Chargement...", + "ui_local_registration_is_disabled": "Local registration is disabled.", + "ui_locked_entries_only": "Locked entries only", + "ui_manage_stored_data": "Manage stored data", + "ui_mark_all_read": "Mark all read", + "ui_members_only": "Members only", + "ui_minimum_segment_duration": "Minimum segment duration", + "ui_move_data_between_supported_apps": "Move data between supported apps", + "ui_move_down": "Move down", + "ui_move_up": "Move up", + "ui_name": "Nom", + "ui_network": "Réseau :", + "ui_neutral_frame": "Neutral frame", + "ui_new_feed": "New feed", + "ui_new_password": "New password", + "ui_new_playlist": "New playlist", + "ui_new_playlist_2": "New playlist...", + "ui_next": "Suivant", + "ui_next_month": "Next month", + "ui_no_active_playback": "No active playback", + "ui_no_active_sessions_are_currently_reported": "No active sessions are currently reported.", + "ui_no_blocked_keywords": "Aucun mot-clé bloqué", + "ui_no_bug_reports_found": "Aucun bug reports trouvé.", + "ui_no_channels_added": "Aucun channels ajouté.", + "ui_no_channels_found_try_the_exact_channel_name_or_handle": "No channels found. Try the exact channel name or handle.", + "ui_no_custom_playlists_yet": "Aucun custom playlists pour le moment.", + "ui_no_episodes_found": "Aucun episodes trouvé.", + "ui_no_family_recommendations_yet": "Aucun family recommendations pour le moment.", + "ui_no_family_list_results": "No family-list results", + "ui_no_favorites_yet": "Aucun favori pour le moment.", + "ui_no_matching_subscriptions": "No matching subscriptions", + "ui_no_notifications_yet": "Aucune notification pour le moment.", + "ui_no_playlist_selected": "Aucune playlist sélectionnée.", + "ui_no_playlists_added": "Aucun playlists ajouté.", + "ui_no_playlists_found": "Aucun playlists trouvé.", + "ui_no_playlists_on_this_channel": "No playlists on this channel.", + "ui_no_playlists_yet": "Aucune playlist pour le moment.", + "ui_no_podcast_selected": "Aucun podcast sélectionné.", + "ui_no_preference": "Aucune préférence", + "ui_no_private_feeds": "Aucun flux privé", + "ui_no_private_feeds_have_been_created": "No private feeds have been created.", + "ui_no_results_for": "Aucun résultat pour « ", + "ui_no_shorts_available_right_now": "No shorts available right now.", + "ui_no_subscriptions_yet": "Aucun subscriptions pour le moment.", + "ui_no_subscriptions_yet_2": "Aucun abonnement pour le moment.", + "ui_no_videos_saved_for_later": "Aucune vidéo enregistrée pour plus tard.", + "ui_notification_popups": "Notification popups", + "ui_notifications": "Notifications", + "ui_open_allow_list": "Ouvrir allow list", + "ui_open_data_transfer": "Ouvrir data transfer", + "ui_open_notifications_to_load_items": "Ouvrir notifications to load items.", + "ui_open_settings": "Ouvrir les paramètres", + "ui_or_click_to_select": "or click to select", + "ui_or_click_to_select_multiple_zip_files": "or click to select multiple ZIP files", + "ui_original_thumbnail": "Miniature originale", + "ui_original_title": "Titre original", + "ui_password_updated_you_can_sign_in_with_your_new_password": "Password updated. You can sign in with your new password.", + "ui_phase": "Phase:", + "ui_play_all": "Tout lire", + "ui_play_now": "Lire maintenant", + "ui_playback_failed": "Échec de la lecture", + "ui_playback_progress": "Playback progress.", + "ui_player_snapshot": "Player snapshot", + "ui_playlist_name": "Playlist name", + "ui_playlist_name_2": "Playlist name...", + "ui_playlist_not_found": "Playlist not found.", + "ui_playlist_url": "Playlist URL", + "ui_playlist_videos": "playlist videos", + "ui_playlist_videos_2": "Playlist videos:", + "ui_playlists": "playlists,", + "ui_playlists_2": "Playlists:", + "ui_please_wait": "Please wait...", + "ui_podcast": "Podcast", + "ui_podcast_playlists_from_this_channel": "Podcast playlists from this channel", + "ui_podcasts": "Podcasts", + "ui_preferred_video_resolution": "Preferred video resolution", + "ui_prev": "Précédent", + "ui_preview_imports_or_create_a_compatible_export": "Preview imports or create a compatible export.", + "ui_preview": "Preview:", + "ui_previous_month": "Previous month", + "ui_private_feeds": "Flux privés", + "ui_private_link_shown_once": "Private link shown once", + "ui_private_rss_link": "Private RSS link", + "ui_public_instance_url": "URL publique de l’instance", + "ui_queued_archives": "Queued archives (", + "ui_rate_limited_while_loading_more": "Rate limited while loading more.", + "ui_recommended": "Recommandé", + "ui_refresh_versions": "Refresh versions", + "ui_remote_browser": "Remote browser", + "ui_remote_youtube_login_is_disabled_on_this_instance": "Remote YouTube login is disabled on this instance.", + "ui_remove": "Supprimer", + "ui_remove_from_history": "Supprimer from history", + "ui_remove_from_history_2": "Supprimer from history?", + "ui_remove_saved_playlist": "Supprimer saved playlist", + "ui_remove_video": "Supprimer video", + "ui_rename_playlist": "Renommer la playlist", + "ui_report": "report", + "ui_report_a_bug": "Signaler un bug", + "ui_requestid": "requestId:", + "ui_reset": "Réinitialiser", + "ui_restore_backup": "Restaurer la sauvegarde", + "ui_restoring_replaces_the_categories_included_in_the_backup": "Restoring replaces the categories included in the backup.", + "ui_restoring_your_backup": "Restoring your backup", + "ui_restrict_entire_instance": "Restrict entire instance", + "ui_restrict_everyone_to_the_admin_allow_list_including_guests": "Restrict everyone to the admin allow list, including guests.", + "ui_retry": "Réessayer", + "ui_retry_video": "Retry video", + "ui_revoke_this_rss_feed": "Revoke this RSS feed?", + "ui_route": "Route:", + "ui_save_videos_from_the_watch_page_using_the_save_button": "Enregistrer videos from the watch page using the Save button.", + "ui_save_watched_videos_and_playback_progress": "Enregistrer watched videos and playback progress", + "ui_saved_public_playlists": "Playlists publiques enregistrées", + "ui_search_by_email_or_name": "Rechercher by email or name", + "ui_search_filters": "Rechercher filters", + "ui_search_history": "Rechercher history.", + "ui_search_history_2": "Rechercher history...", + "ui_search_id_email_text": "Rechercher id, email, text...", + "ui_search_instead_for": "Rechercher instead for “", + "ui_search_language": "Rechercher language...", + "ui_search_results_for": "Rechercher results for", + "ui_search_subscriptions": "Rechercher subscriptions", + "ui_search_this_channel": "Rechercher this channel", + "ui_search_videos_channels": "Rechercher videos, channels...", + "ui_searching_channels": "Searching channels...", + "ui_searching_playlists": "Searching playlists...", + "ui_searching_users": "Searching users...", + "ui_secrets_are_never_available_from_this_console": "Secrets are never available from this console.", + "ui_seek": "Seek", + "ui_select_a_report_to_inspect_details": "Sélectionner a report to inspect details.", + "ui_selected": "selected", + "ui_selected_2": "Sélectionné", + "ui_selected_3": "Selected:", + "ui_shorts_are_hidden": "Les Shorts sont masqués", + "ui_show_a_popup_when_a_subscribed_channel_publishes_a_video": "Afficher a popup when a subscribed channel publishes a video.", + "ui_showing": "Showing", + "ui_showing_results_for": "Showing results for", + "ui_shuffle": "Lecture aléatoire", + "ui_shuffle_playlist": "Shuffle playlist", + "ui_sign_in_could_not_be_completed": "Sign-in could not be completed.", + "ui_signing_in": "Connexion en cours", + "ui_size": "Taille", + "ui_skip_playlist_autoplay_screen": "Skip playlist autoplay screen", + "ui_sort": "Trier", + "ui_specific_users": "Utilisateurs spécifiques", + "ui_speed": "Vitesse", + "ui_sponsorblock": "SponsorBlock", + "ui_sponsorblock_behavior": "SponsorBlock behavior", + "ui_sponsorblock_categories": "SponsorBlock categories", + "ui_start_download": "Démarrer le téléchargement", + "ui_start_import": "Démarrer l’importation", + "ui_startup": "Démarrage", + "ui_status": "Status:", + "ui_stored_data": "Données stockées", + "ui_subscribe_to_channels_to_unlock_a_personalized_home_feed": "Subscribe to channels to unlock a personalized home feed.", + "ui_subscribers": "subscribers", + "ui_subscription_views": "Subscription views", + "ui_subscriptions": "subscriptions,", + "ui_subscriptions_2": "Subscriptions:", + "ui_subscriptions_3": "Subscriptions.", + "ui_the_admin_has_disabled_guest_access": "The admin has disabled guest access.", + "ui_the_browser_context_is_destroyed_after_success_timeout_or_cancel": "The browser context is destroyed after success, timeout, or cancel.", + "ui_the_client_is_connected_and_ready": "The client is connected and ready.", + "ui_the_login_page_is_rendered_by_a_disposable_chromium_session_running_i": "The login page is rendered by a disposable Chromium session running in TypeType-Token.", + "ui_the_page_typetype_opens_on_when_you_launch_it": "The page TypeType opens on when you launch it.", + "ui_the_youtube_sign_in_window_will_appear_here": "The YouTube sign-in window will appear here.", + "ui_third_party_notices": "Third-party notices", + "ui_this_channel_is_blocked": "This channel is blocked", + "ui_this_channel_is_outside_the_family_list": "This channel is outside the family list", + "ui_this_instance_does_not_allow_guest_access_which_is_required_for_embed": "This instance does not allow guest access, which is required for embedded playback.", + "ui_this_link_will_open_in_a_new_tab": "This link will open in a new tab:", + "ui_this_playlist_could_not_be_loaded": "This playlist could not be loaded.", + "ui_this_playlist_has_no_videos": "This playlist has no videos.", + "ui_this_video_could_not_be_played_the_stream_may_be_unavailable_or_unsup": "This video could not be played. The stream may be unavailable or unsupported.", + "ui_thumbnails": "Miniatures", + "ui_titles": "Titres", + "ui_to_use_this_typetype_instance_create_an_account_or_sign_in_with_an_ex": "To use this TypeType instance, create an account or sign in with an existing one.", + "ui_toggle": "toggle", + "ui_toggle_sidebar": "Toggle sidebar", + "ui_total": "total", + "ui_type_at_least_two_characters_to_search_channels": "Saisissez au moins two characters to search channels.", + "ui_type_at_least_two_characters": "Saisissez au moins two characters.", + "ui_typetype_backup": "TypeType backup", + "ui_typetype_opens_a_temporary_remote_browser_for_youtube_sign_in_cookies": "TypeType opens a temporary remote browser for YouTube sign-in. Cookies and playback token are captured server-side, encrypted, and never sent to the web UI.", + "ui_unable_to_load_active_sessions": "Impossible de charger active sessions..", + "ui_unable_to_load_admin_settings": "Impossible de charger admin settings:.", + "ui_unable_to_load_allow_list_settings": "Impossible de charger allow list settings..", + "ui_unable_to_load_bug_reports": "Impossible de charger bug reports..", + "ui_unavailable": "Indisponible", + "ui_unblock": "Débloquer", + "ui_unpacking_and_syncing_your_data_this_may_take_a_moment": "Unpacking and syncing your data. This may take a moment.", + "ui_unsubscribe_all": "Unsubscribe all", + "ui_unsubscribe_from_all_channels_in_settings": "Unsubscribe from all channels in Settings.", + "ui_up_next": "À suivre", + "ui_updated": "Mis à jour", + "ui_use_a_secondary_youtube_account_the_remote_browser_is_temporary_and_c": "Utiliser a secondary YouTube account. The remote browser is temporary and closes after connection, timeout, or cancellation.", + "ui_use_the_new_playlist_button_to_get_started": "Utiliser the New playlist button to get started.", + "ui_used": "used", + "ui_user_agent": "User agent:", + "ui_user_channels": "Chaînes de l’utilisateur", + "ui_user_playlists": "Playlists de l’utilisateur", + "ui_users_with_admin_managed_access_appear_here_search_to_configure_anoth": "Users with admin-managed access appear here. Search to configure another account.", + "ui_verified": "Verified", + "ui_versions": "Versions", + "ui_video": "video", + "ui_videos": "Vidéos", + "ui_view_github_issue": "View GitHub Issue", + "ui_viewport": "Viewport:", + "ui_watch_dates": "Dates de visionnage :", + "ui_watch_history_tracking": "Watch history tracking", + "ui_watch_history": "Watch history.", + "ui_watch_page": "Watch page", + "ui_watched": "Regardé", + "ui_we_are_plating_your_data_now": "We are plating your data now.", + "ui_we_import_subscriptions_playlists_and_watch_history_if_available": "We import subscriptions, playlists, and watch history (if available).", + "ui_what_happens": "Ce qui se passe", + "ui_you_are_leaving_typetype": "You are leaving TypeType", + "ui_you_can_re_enable_shorts_from_video_preferences": "You can re-enable Shorts from video preferences.", + "ui_you_sign_in_inside_the_remote_browser_shown_above": "You sign in inside the remote browser shown above.", + "ui_you_want_to_hide_everything": "You want to hide everything?", + "ui_your_backup_has_been_restored": "Your backup has been restored.", + "ui_your_data_has_been_plated_check_your_subscriptions_and_playlists": "Your data has been plated. Check your subscriptions and playlists.", + "ui_youtube_remote_sign_in": "YouTube remote sign-in", + "ui_youtube_sign_in_remote_browser": "YouTube sign-in remote browser", + "ui_yeah_hide_it": "Yeah, hide it", + "ui_like_actually_sure_you_will_have_nothing_left_to_scroll": "Like, actually sure? You will have nothing left to scroll.", + "ui_yes_gone": "Yes, gone", + "ui_fine_i_ll_hide_it": "Fine, I'll hide it", + "ui_allowed_channels": "Allowed channels", + "ui_unable_to_update_mode": "Unable to update mode", + "ui_search_by_channel_name_or_handle_added_channels_apply_to_every_restri": "Rechercher by channel name or handle. Added channels apply to every restricted user.", + "ui_search_playlists_by_name_added_playlists_apply_to_every_restricted_us": "Rechercher playlists by name. Added playlists apply to every restricted user.", + "ui_user_specific_allow_list": "User-specific allow-list", + "ui_set_unrestricted_override": "Set unrestricted override", + "ui_unrestrict_user": "Unrestrict user", + "ui_unrestricted_override_set": "Unrestricted override set", + "ui_user_unrestricted": "User unrestricted", + "ui_admin_unrestricted_override": "Admin unrestricted override", + "ui_restrict_user": "Restrict user", + "ui_user_restricted": "User restricted", + "ui_restricted_by_entire_instance": "Restricted by entire instance", + "ui_unable_to_update_user": "Unable to update user", + "ui_search_by_channel_name_or_handle_this_does_not_affect_other_users": "Rechercher by channel name or handle. This does not affect other users.", + "ui_search_playlists_by_name_this_does_not_affect_other_users": "Rechercher playlists by name. This does not affect other users.", + "ui_failed_to_update": "Échec de la mise à jour", + "ui_failed_to_create_issue": "Échec lors de create issue.", + "ui_account_suspended": "Compte suspendu", + "ui_account_rss_off": "Account RSS off", + "ui_feed_off": "Feed off", + "ui_disable_feed": "Disable feed", + "ui_enable_feed": "Enable feed", + "ui_disable_rss_for_account": "Disable RSS for account", + "ui_enable_rss_for_account": "Enable RSS for account", + "ui_revoke_feed": "Revoke feed", + "ui_enable_private_rss_feeds": "Enable private RSS feeds", + "ui_unable_to_update_rss_settings": "Unable to update RSS settings", + "ui_unable_to_load_rss_controls": "Impossible de charger RSS controls.", + "ui_unable_to_load_private_feeds": "Impossible de charger private feeds.", + "ui_unable_to_update_rss_feed": "Unable to update RSS feed", + "ui_unable_to_update_account_rss": "Unable to update account RSS", + "ui_revoke": "Revoke", + "ui_unable_to_revoke_rss_feed": "Unable to revoke RSS feed", + "ui_paused": "En pause", + "ui_online": "En ligne", + "ui_unable_to_update_admin_settings": "Unable to update admin settings", + "ui_unable_to_load_admin_settings_2": "Impossible de charger admin settings..", + "ui_pause_audio": "Pause audio", + "ui_backward": "backward", + "ui_resume_autoplay_timer": "Resume autoplay timer", + "ui_pause_autoplay_timer": "Pause autoplay timer", + "ui_live": "Live", + "ui_a_parent_can_add_this_channel_if_it_belongs_in_your_trusted_family_sp": "A parent can add this channel if it belongs in your trusted family space.", + "ui_unable_to_load_channel_right_now": "Impossible de charger channel right now..", + "ui_unblock_it_from_settings_to_see_this_channel_again": "Unblock it from Settings to see this channel again.", + "ui_audio": "Audio", + "ui_file": "file", + "ui_nothing_from_the_family_list_yet": "Nothing from the family list yet", + "ui_add_trusted_channels_so_this_page_can_stay_focused_on_videos_you_pick": "Ajouter trusted channels so this page can stay focused on videos you picked for your family.", + "ui_su": "Su", + "ui_mo": "Mo", + "ui_tu": "Tu", + "ui_th": "Th", + "ui_fr": "Fr", + "ui_sa": "Sa", + "ui_this_week": "This week", + "ui_this_month": "This month", + "ui_this_removes_all_saved_searches_from_your_account": "This removes all saved searches from your account.", + "ui_recent": "recent", + "ui_just_now": "Just now", + "ui_deselect": "Désélectionner", + "ui_audio_language": "Audio Language", + "ui_functionality": "Functionality", + "ui_create_rss_feed_for_this_channel": "Create RSS feed for this channel", + "ui_create_subscription_rss_feed": "Create subscription RSS feed", + "ui_sabr_playback_is_unavailable_for_this_short": "SABR playback is unavailable for this Short", + "ui_this_short_stopped_playing": "This Short stopped playing", + "ui_this_short_is_only_available_for_members": "This Short is only available for members", + "ui_original_audio_unavailable": "Original audio unavailable", + "ui_skipped_automatically": "Passé automatiquement", + "ui_skipped": "Passé", + "ui_add": "add", + "ui_switch_to_light_mode": "Switch to light mode", + "ui_switch_to_dark_mode": "Switch to dark mode", + "ui_light_mode": "Light mode", + "ui_dark_mode": "Dark mode", + "ui_bullet_comments": "Bullet comments", + "ui_more_actions": "More actions", + "ui_report_bug": "Report bug", + "ui_likes": "Likes", + "ui_dislikes": "Dislikes", + "ui_audio_only_unavailable": "Audio only unavailable", + "ui_expand_playlist": "Expand playlist", + "ui_error_occurs_when_fetching_the_page_try_increase_the_loading_timeout": "Error occurs when fetching the page. Try increase the loading timeout in Settings.", + "ui_connect_youtube_to_access_this_video": "Connect YouTube to access this video.", + "ui_this_video_is_currently_unavailable": "This video is currently unavailable", + "ui_failed_to_load_stream": "Échec lors de load stream..", + "ui_mute_zen_music": "Mute zen music", + "ui_completing_sign_in_with_your_provider": "Completing sign-in with your provider.", + "ui_could_not_load_player": "Could not load player.", + "ui_this_removes_every_video_from_your_watch_history": "This removes every video from your watch history.", + "ui_failed_to_clear_history": "Échec lors de clear history.", + "ui_this_video_will_be_removed_from_your_watch_history": "This video will be removed from your watch history.", + "ui_pipepipe_import_completed": "PipePipe import completed.", + "ui_pipepipe_import_failed": "PipePipe import failed.", + "ui_pipepipe_backup": "PipePipe Backup", + "ui_restore_history_subscriptions_playlists_and_watch_progress_from_a_bac": "Restore history, subscriptions, playlists, and watch progress from a backup ZIP.", + "ui_youtube_import_completed": "YouTube import completed.", + "ui_all_archives_processed": "All archives processed.", + "ui_youtube_takeout": "YouTube Takeout", + "ui_drop_your_takeout_zip_below_we_import_subscriptions_playlists_and_his": "Drop your Takeout ZIP below. We import subscriptions, playlists, and history.", + "ui_import_started": "Importation démarrée.", + "ui_trending": "Tendances", + "ui_this_playlist": "this playlist", + "ui_this_action_cannot_be_undone": "This action cannot be undone.", + "ui_this_only_removes_the_saved_reference_from_your_library": "This only removes the saved reference from your library.", + "ui_unable_to_load_podcast_episodes": "Impossible de charger podcast episodes..", + "ui_first_installation_detected_set_up_the_administrator_account": "First installation detected. Set up the administrator account.", + "ui_registrations_are_currently_closed": "Registrations are currently closed.", + "ui_use_your_email_to_create_an_account_you_can_sign_in_with_email_or_use": "Use your email to create an account. You can sign in with email or username.", + "ui_account_created": "Compte créé", + "ui_unable_to_create_account": "Unable to create account.", + "ui_create_admin_account": "Create admin account", + "ui_administrator_name": "Administrator name", + "ui_invalid_or_expired_reset_token": "Invalid or expired reset token.", + "ui_use_the_token_generated_from_the_admin_panel": "Use the token generated from the admin panel.", + "ui_try_a_channel_you_already_trust_or_add_more_channels_to_the_family_li": "Try a channel you already trust, or add more channels to the family list.", + "ui_youtube_session_connected": "YouTube session connected", + "ui_remote_youtube_login_is_not_available_yet": "Remote YouTube login is not available yet", + "ui_youtube_session_disconnected": "YouTube session disconnected", + "ui_could_not_disconnect_youtube_session": "Could not disconnect YouTube session", + "ui_all_those_recommendations_comments_and_shorts_we_worked_so_hard_on_go": "All those recommendations, comments and shorts we worked so hard on, gone.", + "ui_are_you_sure": "Are you sure?", + "ui_i_am_sure": "I am sure", + "ui_are_you_sure_sure": "Are you SURE sure?!", + "ui_last_chance": "LAST CHANCE.", + "ui_okay_fine_do_not_say_we_did_not_warn_you": "Okay fine. Do not say we did not warn you.", + "settings_sponsorblock_hide": "Masquer", + "ui_upcoming": "Upcoming", + "ui_enabled": "Activé", + "ui_disabled": "Désactivé", + "ui_copy_private_link": "Copy private link", + "ui_edit_feed": "Edit feed", + "ui_replace_private_link": "Replace private link", + "ui_delete_feed": "Delete feed", + "ui_export_completed": "Export terminé", + "ui_restore_failed": "Restore failed", + "ui_autoplay_next_video": "Autoplay next video", + "ui_automatically_continue_with_the_first_item_in_the_suggestions_column": "Automatically continue with the first item in the suggestions column.", + "ui_dearrow_titles_and_thumbnails": "DeArrow titles and thumbnails", + "ui_use_community_written_titles_and_representative_thumbnails_for_youtub": "Use community-written titles and representative thumbnails for YouTube videos.", + "ui_related_videos": "Related videos", + "ui_comments_and_danmaku": "Comments and danmaku", + "ui_stop_loading_watch_comments_shorts_comments_and_bullet_comments": "Stop loading watch comments, Shorts comments, and bullet comments.", + "ui_shorts_surface": "Shorts surface", + "ui_live_streams": "Live streams", + "ui_members_only_videos": "Members-only videos", + "ui_auto": "Auto", + "ui_automatically_play_the_next_video": "Automatically play the next video", + "ui_seconds_before_autoplay_advances_or_0_for_immediate_playlists": "Seconds before autoplay advances, or 0 for immediate playlists", + "ui_load_a_backend_provided_audio_stream_when_available": "Load a backend-provided audio stream when available", + "ui_unsubscribed_from_all_channels": "Unsubscribed from all channels", + "ui_search_history_cleared": "Rechercher history cleared", + "ui_action_failed": "Échec de l’action", + "ui_subscriptions_4": "subscriptions", + "ui_rss_feed_updated": "RSS feed updated", + "ui_rss_feed_deleted": "RSS feed deleted", + "ui_feed_limit_reached": "Feed limit reached", + "ui_create_rss_feed": "Create RSS feed", + "ui_delete_3": "delete", + "ui_delete_rss_feed": "Delete RSS feed?", + "ui_replace_private_link_2": "Replace private link?", + "ui_the_current_link_will_stop_working_immediately": "The current link will stop working immediately.", + "ui_the_current_private_link_will_be_revoked_immediately": "The current private link will be revoked immediately.", + "ui_replace_link": "Replace link", + "ui_mark": "Marquer", + "ui_use_category_rules_for_automatic_skips": "Use category rules for automatic skips.", + "ui_show_matching_segments_without_skipping": "Afficher matching segments without skipping.", + "ui_off": "Off", + "ui_ignore_all_sponsorblock_data": "Ignorer toutes les données SponsorBlock.", + "ui_updating": "Mise à jour...", + "ui_update_password": "Mettre à jour le mot de passe", + "ui_registrations_closed": "Inscriptions fermées", + "ui_creating_account": "Création du compte...", + "ui_remote_browser_connection_failed": "La connexion au navigateur distant a échoué", + "ui_playlist_removed": "Playlist supprimée", + "ui_playlist_saved": "Playlist enregistrée", + "ui_watch_history_cleared": "Historique des vidéos effacé", + "ui_private_rss_link_copied": "Lien RSS privé copié", + "ui_allow_list_mode_updated": "Mode liste autorisée mis à jour", + "ui_status_updated": "Statut mis à jour", + "ui_github_issue_created": "Issue GitHub créée", + "ui_rss_settings_updated": "Paramètres RSS mis à jour", + "ui_rss_feed_revoked": "Flux RSS révoqué", + "video_premiere_scheduled": "Première programmée", + "video_premiere_starts_in": "Cette première commence dans {relativeTime}.", + "video_premiere_not_started": "Cette première n'a pas encore commencé.", + "video_paid": "Vidéo payante", + "video_paid_message": "Cette vidéo doit être achetée sur YouTube avant de pouvoir être lue.", + "video_members_only": "Vidéo réservée aux membres", + "video_members_only_message": "Cette vidéo est uniquement disponible pour les membres", + "channel_sort_newest": "Plus récentes", + "channel_sort_popular": "Populaires", + "channel_sort_oldest": "Plus anciennes", + "playlist_sort_manual": "Manuel", + "playlist_sort_added_newest": "Date d'ajout (récentes)", + "playlist_sort_added_oldest": "Date d'ajout (anciennes)", + "playlist_sort_posted_newest": "Date de publication (récentes)", + "playlist_sort_posted_oldest": "Date de publication (anciennes)", + "playlist_sort_popularity": "Popularité", + "search_filter_sort_by": "Trier par", + "search_filter_upload_date": "Date de mise en ligne", + "search_filter_relevance": "Pertinence", + "search_filter_rating": "Évaluation", + "search_filter_view_count": "Nombre de vues", + "search_filter_past_hour": "Dernière heure", + "search_filter_today": "Aujourd'hui", + "search_filter_this_week": "Cette semaine", + "search_filter_this_year": "Cette année", + "search_filter_short": "Courte", + "search_filter_long": "Longue", + "search_filter_creative_commons": "Creative Commons", + "sponsorblock_sponsored_message": "Message sponsorisé", + "sponsorblock_sponsored_message_description": "Promotion payante, parrainage ou publicité directe.", + "sponsorblock_self_promotion": "Auto-promotion", + "sponsorblock_self_promotion_description": "Promotion non rémunérée, produits dérivés, dons ou promotion d'un invité.", + "sponsorblock_exclusive_access": "Accès exclusif", + "sponsorblock_exclusive_access_description": "Marquages sur toute la vidéo pour un accès gratuit ou subventionné.", + "sponsorblock_interaction_reminder": "Rappel d'interaction", + "sponsorblock_interaction_reminder_description": "Courts rappels pour aimer, s'abonner ou suivre.", + "sponsorblock_highlight": "Point fort", + "sponsorblock_highlight_description": "Le point principal recherché par la plupart des spectateurs.", + "sponsorblock_intermission_or_intro": "Interlude ou introduction", + "sponsorblock_intermission_or_intro_description": "Pauses pauvres en contenu, écrans statiques ou animations répétées.", + "sponsorblock_endcards_or_credits": "Cartons de fin ou crédits", + "sponsorblock_endcards_or_credits_description": "Crédits ou écrans de fin YouTube sans conclusion utile.", + "sponsorblock_preview_or_recap": "Aperçu ou récapitulatif", + "sponsorblock_preview_or_recap_description": "Extraits répétés plus tard dans la même vidéo ou la même série.", + "sponsorblock_tangents_or_jokes": "Digressions ou blagues", + "sponsorblock_tangents_or_jokes_description": "Sauts agressifs pour les digressions ou blagues non essentielles.", + "sponsorblock_chapter": "Chapitre", + "sponsorblock_chapter_description": "Chapitres personnalisés décrivant les sections importantes.", + "sponsorblock_music_non_music": "Musique : non-musical", + "sponsorblock_music_non_music_description": "Sections non musicales dans les vidéos musicales.", + "ui_hide_in_progress_videos_from_the_home_page": "Masquer les vidéos en cours depuis l'accueil.", + "ui_home_recommendations": "Recommandations de l'accueil", + "ui_hide_personalized_recommendations_from_the_home_page": "Masquer les recommandations personnalisées de l'accueil.", + "ui_hide_the_suggestions_column_on_watch_pages": "Masquer la colonne de suggestions sur les pages de lecture.", + "ui_watch_and_shorts": "Lecture + Shorts", + "ui_hide_shorts_navigation_and_block_the_shorts_page": "Masquer la navigation Shorts et bloquer la page Shorts.", + "ui_hide_active_and_scheduled_live_streams_from_the_subscriptions_feed": "Masquer les directs actifs et programmés du flux des abonnements.", + "ui_hide_videos_that_require_a_paid_youtube_channel_membership": "Masquer les vidéos nécessitant une adhésion payante à une chaîne YouTube.", + "ui_play_next_playlist_item_immediately_while_keeping_the_countdown_for_recommendations": "Lire immédiatement l'élément suivant de la playlist tout en conservant le compte à rebours des recommandations.", + "ui_john_doe": "john.doe", + "ui_admin_settings_updated": "Paramètres d’administration mis à jour", + "ui_failed_to_clear_download_job": "Impossible d’effacer la tâche de téléchargement", + "ui_hide_everything_question": "Masquer tout ?", + "ui_we_spent_months_on_this_months_and_poof_you_want_it_gone": "J’ai passé des mois là-dessus. Des mois. Et pouf, vous voulez tout supprimer ?", + "ui_backup_restored": "Sauvegarde restaurée : {count} éléments", + "ui_unable_to_load_rss_feeds": "Impossible de charger les flux RSS", + "ui_large_history_in": "Historique volumineux dans {file}", + "ui_files_queued": "{count} fichier(s) en attente.", + "ui_unable_to_load_import_report": "Impossible de charger le rapport d’importation.", + "ui_unable_to_process_archive": "Impossible de traiter l’archive.", + "ui_registration_rejected_server": "L’inscription a été refusée par le serveur. Ajoutez {origin} à ALLOWED_ORIGINS sans slash final, puis redémarrez typetype-server.", + "ui_copied": "Copié", + "ui_link": "Lien", + "ui_player": "Lecteur", + "ui_bug_status_new": "Nouveau", + "ui_bug_status_triaged": "Analysé", + "ui_bug_status_in_progress": "En cours", + "ui_bug_status_fixed": "Corrigé", + "ui_bug_status_closed": "Fermé", + "ui_bug_category_player": "Lecteur", + "ui_bug_category_audio_language": "Langue audio", + "ui_bug_category_subtitles": "Sous-titres", + "ui_bug_category_interface": "Interface", + "ui_bug_category_functionality": "Fonctionnalité", + "ui_sending": "Envoi...", + "ui_submit": "Envoyer", + "ui_history_count": "{count} entrées", + "ui_subscription_count": "{count} chaînes", + "ui_search_history_count": "{count} entrées", + "ui_clear_history_question": "Effacer {label} ?", + "ui_unsubscribe_from_count_question": "Se désabonner de {label} ?", + "ui_clear_search_history_question": "Effacer {label} ?", + "ui_playing": "En lecture", + "ui_we": "Me", + "ui_play_zen_music": "Lire la musique zen", + "ui_collapse_playlist": "Réduire la playlist", + "ui_play_audio": "Lire l’audio", + "ui_channel_followed": "{count} chaîne suivie", + "ui_channels_followed": "{count} chaînes suivies", + "ui_channel_feed": "Flux de la chaîne", + "ui_my_subscriptions": "Mes abonnements", + "ui_edit_rss_feed": "Modifier le flux RSS", + "ui_new_rss_feed": "Nouveau flux RSS", + "ui_saving": "Enregistrement…", + "ui_save": "Enregistrer", + "ui_create_feed": "Créer le flux", + "ui_all": "Tous", + "ui_all_subscriptions": "Tous les abonnements", + "ui_selected_channel": "{count} chaîne sélectionnée", + "ui_selected_channels": "{count} chaînes sélectionnées", + "ui_never": "Jamais", + "ui_no_users_found": "Aucun utilisateur trouvé.", + "ui_no_managed_users_yet": "Aucun utilisateur n’est encore géré par les règles de liste autorisée.", + "ui_load_more_users": "Charger plus d’utilisateurs", + "ui_import_report_summary": "{subscriptions} abonnements · {playlists} playlists · {videos} vidéos de playlist", + "ui_import_started_keep_window_open": "Importation démarrée. Gardez cette fenêtre ouverte.", + "ui_connected": "Connecté", + "ui_reconnect_needed": "Reconnexion nécessaire", + "ui_not_connected": "Non connecté", + "ui_typetype_can_use_this_session": "TypeType peut utiliser cette session lorsque l’extraction en a besoin.", + "ui_youtube_rejected_stored_session": "YouTube a rejeté la session enregistrée. Créez un nouveau code.", + "ui_no_youtube_session_connected": "Aucune session YouTube n’est connectée.", + "ui_prepare": "Préparer", + "ui_download": "Télécharger", + "ui_finalize": "Finaliser", + "ui_opening_file": "Ouverture du fichier", + "ui_failed": "Échec", + "ui_ready_from_cache": "Prêt depuis le cache", + "ui_ready": "Prêt", + "ui_queued": "En attente", + "ui_downloading": "Téléchargement", + "ui_finalizing": "Finalisation", + "ui_preparing_download": "Préparation du téléchargement", + "ui_handing_file_to_browser": "Transmission du fichier à votre navigateur.", + "ui_download_cancelled": "Le téléchargement a été annulé.", + "ui_download_could_not_be_completed": "Le téléchargement n’a pas pu être terminé.", + "ui_using_cached_file": "Utilisation du fichier en cache.", + "ui_file_is_ready": "Votre fichier est prêt.", + "ui_waiting_for_worker": "En attente d’un processus disponible.", + "ui_downloading_selected_media": "Téléchargement du média sélectionné.", + "ui_combining_final_file": "Assemblage du fichier final.", + "ui_preparing_streams_and_selecting_format": "Préparation des flux et sélection du format.", + "ui_unknown": "Inconnu", + "ui_unknown_size": "Taille inconnue", + "ui_default": "par défaut", + "ui_seconds_left": "Encore {count} s", + "ui_minutes_seconds_left": "Encore {minutes} min {seconds} s", + "ui_hours_minutes_left": "Encore {hours} h {minutes} min", + "ui_rss_feed_will_stop_working": "{name} cessera immédiatement de fonctionner.", + "ui_flag": "Drapeau {code}", + "ui_video_count": "{count} vidéo", + "ui_videos_count": "{count} vidéos", + "ui_remove_video_from_playlist_question": "Supprimer « {name} » de cette playlist ?", + "ui_delete_playlist_confirmation": "Supprimer « {name} » ? Cette action est irréversible.", + "ui_remove_filter": "Supprimer le filtre {label}", + "ui_select_named_channel": "Sélectionner {name}", + "ui_replay": "REDIFFUSION", + "ui_subtitle_auto": "{label} (auto)", + "ui_requested_quality_unavailable": "La qualité {height}p demandée n’est pas disponible. Choisissez un autre format.", + "ui_selected_format_unavailable": "Le format sélectionné n’est pas disponible. Choisissez un autre format.", + "ui_downloaded_of": "{downloaded} sur {total}", + "ui_playlist_deleted": "Playlist supprimée", + "ui_playlists_deleted": "{count} playlists supprimées", + "ui_saved_playlist_removed": "{name} supprimée", + "ui_delete_playlist_question": "Supprimer « {name} » ?", + "ui_delete_playlists_question": "Supprimer {count} playlists ?", + "ui_playlist_created": "« {name} » créée", + "ui_remove_saved_playlist_question": "Supprimer « {name} » ?", + "ui_all_videos_in_playlist_blocked": "Toutes les vidéos de cette playlist sont bloquées.", + "ui_no_videos_in_playlist_yet": "Aucune vidéo dans cette playlist pour le moment.", + "ui_copy_json": "Copier le JSON", + "ui_cancel": "Annuler", + "ui_clear": "Effacer", + "ui_open_file": "Ouvrir le fichier", + "ui_added": "Ajouté", + "ui_saved": "Enregistré", + "ui_allowed": "Autorisé", + "ui_adding": "Ajout…", + "ui_allow_channel": "Autoriser la chaîne", + "ui_january": "Janvier", + "ui_february": "Février", + "ui_march": "Mars", + "ui_april": "Avril", + "ui_may": "Mai", + "ui_june": "Juin", + "ui_july": "Juillet", + "ui_august": "Août", + "ui_september": "Septembre", + "ui_october": "Octobre", + "ui_november": "Novembre", + "ui_december": "Décembre", + "ui_add_url": "Ajouter l’URL", + "ui_unknown_user": "Utilisateur inconnu", + "ui_browser": "Navigateur", + "ui_rss_feed_disabled": "Flux RSS désactivé", + "ui_rss_feed_enabled": "Flux RSS activé", + "ui_account_rss_disabled": "RSS du compte désactivé", + "ui_account_rss_enabled": "RSS du compte activé", + "ui_feeds_per_account": "Flux par compte", + "ui_items_per_feed": "Éléments par flux", + "ui_minimum_poll_minutes": "Intervalle minimal (minutes)", + "ui_requests_per_minute": "Requêtes par minute", + "ui_save_policy": "Enregistrer la politique", + "ui_older": "Plus ancien", + "ui_loading_videos": "Chargement des vidéos", + "ui_simple_view": "Vue simple", + "ui_all_formats_count": "Tous les formats ({count})", + "ui_danmaku_on": "Danmaku activé", + "ui_danmaku": "Danmaku", + "ui_cancelling": "Annulation…", + "ui_clearing": "Effacement…", + "ui_new_upload": "Nouvel envoi", + "ui_new_uploads": "{count} nouveaux envois", + "ui_checking_availability": "Vérification de la disponibilité…", + "ui_opening": "Ouverture…", + "ui_hide_guide": "Masquer le guide", + "ui_need_help": "Besoin d’aide ?", + "ui_playback_unavailable_for_short": "La lecture de ce Short est indisponible", + "ui_unsubscribed_from": "Désabonné de {name}", + "ui_subscribed_to": "Abonné à {name}", + "ui_videos_waiting": "De nouvelles vidéos vous attendent", + "ui_best_quality": "Meilleure qualité", + "ui_best_sound": "Meilleur son", + "ui_recommended_quality": "Recommandé ({height}p)", + "ui_balanced": "Équilibré", + "ui_small_size_360p": "Petite taille (360p)", + "ui_small_size": "Petite taille", + "ui_removed_from_playlist": "Supprimé de {name}", + "ui_saved_to_playlist": "Enregistré dans {name}", + "ui_playlist_named_created": "Playlist « {name} » créée", + "ui_watch_later_update_failed": "Impossible de mettre à jour À regarder plus tard", + "ui_show_current_segment_next_to_time": "Afficher le segment actuel à côté du temps", + "ui_show_sponsorblock_chapters": "Afficher les chapitres SponsorBlock", + "ui_show_full_video_labels": "Afficher les libellés des vidéos complètes", + "ui_manual_skip_full_video_labels": "Ignorer manuellement les libellés des vidéos complètes", + "ui_skip_non_music_on_music_videos": "Ignorer les segments non musicaux des vidéos musicales", + "ui_mute_segments_instead_of_skipping": "Couper le son des segments au lieu de les ignorer", + "ui_report_count": "{count} rapport", + "ui_reports_count": "{count} rapports", + "ui_playlist": "playlist", + "ui_offline": "hors ligne", + "ui_episode_count": "{count} épisode", + "ui_episodes_count": "{count} épisodes", + "ui_ending_video": "fin de la vidéo", + "ui_backup_archive": "Archive de sauvegarde", + "ui_family_list_blocked": "Cette chaîne ne figure pas dans votre liste familiale. Un parent peut l’ajouter depuis la liste d’autorisation.", + "ui_views": "vues", + "ui_no_watch_date_range": "Aucune plage de dates de visionnage disponible", + "data_portability_formats_failed": "Impossible de charger les formats compatibles.", + "ui_downloader_insufficient_storage": "L’instance n’a pas assez d’espace pour terminer ce téléchargement.", + "ui_downloader_insufficient_storage_help": "Libérez de l’espace puis réessayez. Si le problème persiste, contactez l’administrateur de l’instance avec le code : insufficient_storage (HTTP 507).", + "portability_progress_of": "{processed} sur {total}", + "portability_progress_records": "enregistrements", + "portability_progress_categories": "catégories", + "portability_progress_bytes": "octets", + "ui_download_started": "Téléchargement démarré : {selected}", + "ui_download_failed": "Le téléchargement a échoué.", + "portability_issue_detected": "Problème détecté : {code}", + "ui_remote_browser_error": "Le navigateur distant a signalé une erreur.", + "ui_remote_phase_idle": "Inactif", + "ui_remote_phase_connecting": "Connexion", + "ui_remote_phase_opening": "Ouverture", + "ui_remote_phase_awaiting_login": "En attente de la connexion", + "ui_remote_phase_capturing_session": "Capture de la session", + "ui_remote_phase_connected": "Connecté", + "ui_remote_phase_closed": "Fermé", + "ui_remote_phase_error": "Erreur" +} diff --git a/apps/web/package.json b/apps/web/package.json index dd373521..cb1c9933 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,19 +1,20 @@ { "name": "@typetype/web", "private": true, - "version": "1.6.0", + "version": "1.7.0", "type": "module", "scripts": { "dev": "vite", - "build": "tsc -b && vite build", + "localize": "paraglide-js compile --project ./project.inlang --outdir ./src/paraglide --strategy localStorage preferredLanguage baseLocale --emit-ts-declarations --silent", + "build": "bun run localize && tsc -b && vite build", "preview": "vite preview", - "test": "bun test", - "test:coverage": "bun test --coverage --coverage-reporter=lcov" + "test": "bun test --preload ./tests/setup.ts", + "test:coverage": "bun test --preload ./tests/setup.ts --coverage --coverage-reporter=lcov" }, "dependencies": { "@tanstack/react-query": "^5.101.2", "@tanstack/react-router": "^1.170.17", - "@typetype/mse": "0.1.49", + "@typetype/mse": "0.1.56", "@vidstack/react": "1.12.13", "dashjs": "^5.2.0", "hls.js": "1.6.16", @@ -25,6 +26,7 @@ "zustand": "^5.0.14" }, "devDependencies": { + "@inlang/paraglide-js": "2.24.1", "@tailwindcss/vite": "^4.3.2", "@tanstack/router-plugin": "^1.168.19", "@types/node": "^26.1.1", @@ -32,7 +34,7 @@ "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.3", "tailwindcss": "^4.3.2", - "typescript": "~6.0.3", + "typescript": "~7.0.2", "vite": "^8.1.4" } } diff --git a/apps/web/project.inlang/settings.json b/apps/web/project.inlang/settings.json new file mode 100644 index 00000000..d4485822 --- /dev/null +++ b/apps/web/project.inlang/settings.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://inlang.com/schema/project-settings", + "baseLocale": "en", + "locales": ["en", "fr"], + "modules": ["https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4.4.0/dist/index.js"], + "plugin.inlang.messageFormat": { + "pathPattern": "./messages/{locale}.json", + "sort": "asc" + } +} diff --git a/apps/web/public/THIRD_PARTY_NOTICES.txt b/apps/web/public/THIRD_PARTY_NOTICES.txt new file mode 100644 index 00000000..dfcde846 --- /dev/null +++ b/apps/web/public/THIRD_PARTY_NOTICES.txt @@ -0,0 +1,23 @@ +TypeType Frontend includes software distributed under third-party licenses. + +Paraglide JS +Copyright (c) 2025 Opral US Inc. +https://github.com/opral/paraglide-js + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/apps/web/public/not-found-dark.gif b/apps/web/public/not-found-dark.gif new file mode 100644 index 00000000..8499fac4 Binary files /dev/null and b/apps/web/public/not-found-dark.gif differ diff --git a/apps/web/public/not-found.gif b/apps/web/public/not-found.gif new file mode 100644 index 00000000..e0bee899 Binary files /dev/null and b/apps/web/public/not-found.gif differ diff --git a/apps/web/public/portability-formats/flow.png b/apps/web/public/portability-formats/flow.png new file mode 100644 index 00000000..7fe49a14 Binary files /dev/null and b/apps/web/public/portability-formats/flow.png differ diff --git a/apps/web/public/portability-formats/grayjay.png b/apps/web/public/portability-formats/grayjay.png new file mode 100644 index 00000000..32a3810e Binary files /dev/null and b/apps/web/public/portability-formats/grayjay.png differ diff --git a/apps/web/public/portability-formats/materialious.png b/apps/web/public/portability-formats/materialious.png new file mode 100644 index 00000000..8980240b Binary files /dev/null and b/apps/web/public/portability-formats/materialious.png differ diff --git a/apps/web/public/portability-formats/skytube.png b/apps/web/public/portability-formats/skytube.png new file mode 100644 index 00000000..bf06d57f Binary files /dev/null and b/apps/web/public/portability-formats/skytube.png differ diff --git a/apps/web/public/portability-formats/viewtube.png b/apps/web/public/portability-formats/viewtube.png new file mode 100644 index 00000000..c850d3a1 Binary files /dev/null and b/apps/web/public/portability-formats/viewtube.png differ diff --git a/apps/web/public/portability-formats/youtube-local.ico b/apps/web/public/portability-formats/youtube-local.ico new file mode 100644 index 00000000..9d6417c6 Binary files /dev/null and b/apps/web/public/portability-formats/youtube-local.ico differ diff --git a/apps/web/src/components/account-identity-settings.tsx b/apps/web/src/components/account-identity-settings.tsx index d52005c9..35bbc731 100644 --- a/apps/web/src/components/account-identity-settings.tsx +++ b/apps/web/src/components/account-identity-settings.tsx @@ -1,5 +1,6 @@ import { useEffect, useState } from "react"; import { useAccountIdentity } from "../hooks/use-account-identity"; +import { m } from "../paraglide/messages.js"; type Props = { enabled: boolean; @@ -24,43 +25,43 @@ export function AccountIdentitySettings({ enabled, onMessage }: Props) { email.trim().toLowerCase() !== query.data?.email || name.trim() !== query.data?.name; return ( -Account identity
-
- {managed ? "Managed by your identity provider" : "Used for sign-in and account display"}
+
+ {managed ? m.account_identity_managed() : m.account_identity_description()}
{m.account_identity_title()}
+
- Channels available when allow-list mode is enabled. + {m.ui_channels_available_when_allow_list_mode_is_enabled()}
No channels added.
+{m.ui_no_channels_added()}
) : (