diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b087aa8..1b1e0f4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,63 +1,90 @@ -name: Build Fladder +name: Build Fladder artifacts on: push: + tags: + - "v*" branches: - - develop - pull_request: - branches: - - develop + - master + workflow_dispatch: jobs: - #Implement linting/tests here first - flutter-checks: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4.1.1 - - - name: Set up Flutter - uses: subosito/flutter-action@v2.12.0 - with: - channel: "stable" - cache: true - cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache - cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path - - - name: Get dependencies - run: flutter pub get - build-android: - needs: flutter-checks runs-on: ubuntu-latest - steps: - name: Checkout repository uses: actions/checkout@v4.1.1 - - name: Set up Flutter - uses: subosito/flutter-action@v2.12.0 + - name: Decode Keystore + env: + ENCODED_STRING: ${{ secrets.KEYSTORE_BASE_64 }} + RELEASE_KEYSTORE_PASSWORD: ${{ secrets.RELEASE_KEYSTORE_PASSWORD }} + RELEASE_KEYSTORE_ALIAS: ${{ secrets.RELEASE_KEYSTORE_ALIAS }} + RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }} + GITHUB_RUN_NUMBER: ${{ github.run_number }} + run: | + echo "$ENCODED_STRING" | base64 -d > android/app/keystore.jks + + # Create the key.properties file + cat > android/app/key.properties <> $GITHUB_ENV + echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV - - name: Archive Android artifact + # Build APK + flutter build apk --release \ + --build-name=$VERSION_NAME \ + --build-number=$GITHUB_RUN_NUMBER \ + --dart-define=FLAVOR=release + + # Build AAB + flutter build appbundle --release \ + --build-name=$VERSION_NAME \ + --build-number=$GITHUB_RUN_NUMBER \ + --dart-define=FLAVOR=release + + - name: Rename APK and AAB + run: | + mv build/app/outputs/flutter-apk/app-release.apk "build/app/outputs/flutter-apk/${{ env.APP_NAME }}-${{ env.VERSION_NAME }}-release.apk" + mv build/app/outputs/bundle/release/app-release.aab "build/app/outputs/bundle/release/${{ env.APP_NAME }}-${{ env.VERSION_NAME }}-release.aab" + + - name: Archive Android artifacts uses: actions/upload-artifact@v4.0.0 with: - name: Android - path: build/app/outputs/apk/release/app-release.apk + name: Android-${{ env.VERSION_NAME }} + path: | + build/app/outputs/flutter-apk/${{ env.APP_NAME }}-${{ env.VERSION_NAME }}-release.apk + build/app/outputs/bundle/release/${{ env.APP_NAME }}-${{ env.VERSION_NAME }}-release.aab build-windows: - needs: flutter-checks runs-on: windows-latest steps: @@ -65,9 +92,10 @@ jobs: uses: actions/checkout@v4.1.1 - name: Set up Flutter - uses: subosito/flutter-action@v2.12.0 + uses: subosito/flutter-action@v2.16.0 with: - channel: "stable" + channel: ${{ vars.FLUTTER_CHANNEL }} + flutter-version: ${{ vars.FLUTTER_VERSION }} cache: true cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path @@ -76,43 +104,64 @@ jobs: run: flutter pub get - name: Build Windows EXE - run: flutter build windows + run: | + $pubspec = Get-Content pubspec.yaml + $APP_NAME = ($pubspec | Select-String '^name:' | ForEach-Object { ($_ -split ':')[1].Trim() }) + $VERSION_NAME = ($pubspec | Select-String '^version:' | ForEach-Object { ($_ -split ':')[1].Trim().Split('+')[0] }) + + echo "APP_NAME=$APP_NAME" >> $Env:GITHUB_ENV + echo "VERSION_NAME=$VERSION_NAME" >> $Env:GITHUB_ENV + + flutter build windows - name: Archive Windows artifact uses: actions/upload-artifact@v4.0.0 with: - name: Windows + name: Windows-${{ env.VERSION_NAME }} path: build\windows\x64\runner\Release\ - # build-ios: - # runs-on: macos-latest + # build-ios: + # runs-on: macos-latest - # steps: - # - name: Checkout repository - # uses: actions/checkout@v4.1.1 + # steps: + # - name: Checkout repository + # uses: actions/checkout@v4.1.1 - # - name: Set up Flutter - # uses: subosito/flutter-action@v2.12.0 - # with: - # channel: "stable" - # cache: true - # cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache - # cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path + # - name: Set up Flutter + # uses: subosito/flutter-action@v2.16.0 + # with: + # channel: ${{ vars.FLUTTER_CHANNEL }} + # flutter-version: ${{ vars.FLUTTER_VERSION }} + # cache: true + # cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional + # cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional - # - name: Get dependencies - # run: flutter pub get + # - name: Get dependencies + # run: flutter pub get - # - name: Build iOS app - # run: flutter build ios + # - name: Build iOS app + # run: | + # APP_NAME=$(grep '^name:' pubspec.yaml | cut -d ':' -f2 | tr -d ' ') + # VERSION_NAME=$(grep '^version:' pubspec.yaml | cut -d ':' -f2 | cut -d '+' -f1 | tr -d ' ') + # echo "APP_NAME=$APP_NAME" >> $GITHUB_ENV + # echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV - # - name: Archive iOS artifact - # uses: actions/upload-artifact@v2 - # with: - # name: ios - # path: build/ios/iphoneos/Runner.app + # flutter build ipa --no-codesign + + # - name: Export IPA from .xcarchive + # run: | + # xcodebuild -exportArchive \ + # -archivePath build/ios/archive/Runner.xcarchive \ + # -exportOptionsPlist ios/exportOptions.plist \ + # -exportPath build/ios/ipa + + # - name: Archive iOS IPA artifact + # uses: actions/upload-artifact@v4.0.0 + # with: + # name: ios-${{ env.VERSION_NAME }} + # path: build/ios/ipa/*.ipa build-macos: - needs: flutter-checks runs-on: macos-latest steps: @@ -120,9 +169,10 @@ jobs: uses: actions/checkout@v4.1.1 - name: Set up Flutter - uses: subosito/flutter-action@v2.12.0 + uses: subosito/flutter-action@v2.16.0 with: - channel: "stable" + channel: ${{ vars.FLUTTER_CHANNEL }} + flutter-version: ${{ vars.FLUTTER_VERSION }} cache: true cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path @@ -131,16 +181,21 @@ jobs: run: flutter pub get - name: Build macOS app - run: flutter build macos + run: | + APP_NAME=$(grep '^name:' pubspec.yaml | cut -d ':' -f2 | tr -d ' ') + VERSION_NAME=$(grep '^version:' pubspec.yaml | cut -d ':' -f2 | cut -d '+' -f1 | tr -d ' ') + echo "APP_NAME=$APP_NAME" >> $GITHUB_ENV + echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV + + flutter build macos - name: Archive macOS artifact uses: actions/upload-artifact@v4.0.0 with: - name: macOS + name: macOS-${{ env.VERSION_NAME }} path: build/macos/Build/Products/Release/fladder.app - # build-linux: - # needs: flutter-checks + # build-linux: # runs-on: ubuntu-latest # steps: @@ -148,9 +203,10 @@ jobs: # uses: actions/checkout@v4.1.1 # - name: Set up Flutter - # uses: subosito/flutter-action@v2.12.0 + # uses: subosito/flutter-action@v2.16.0 # with: - # channel: "stable" + # channel: ${{ vars.FLUTTER_CHANNEL }} + # flutter-version: ${{ vars.FLUTTER_VERSION }} # cache: true # cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache # cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path @@ -173,7 +229,6 @@ jobs: # path: build/linux/x64/release/bundle build-web: - needs: flutter-checks runs-on: ubuntu-latest steps: @@ -181,9 +236,10 @@ jobs: uses: actions/checkout@v4.1.1 - name: Set up Flutter - uses: subosito/flutter-action@v2.12.0 + uses: subosito/flutter-action@v2.16.0 with: - channel: "stable" + channel: ${{ vars.FLUTTER_CHANNEL }} + flutter-version: ${{ vars.FLUTTER_VERSION }} cache: true cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path @@ -192,10 +248,16 @@ jobs: run: flutter pub get - name: Build web app - run: flutter build web + run: | + APP_NAME=$(grep '^name:' pubspec.yaml | cut -d ':' -f2 | tr -d ' ') + VERSION_NAME=$(grep '^version:' pubspec.yaml | cut -d ':' -f2 | cut -d '+' -f1 | tr -d ' ') + echo "APP_NAME=$APP_NAME" >> $GITHUB_ENV + echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV + + flutter build web - name: Archive web artifact uses: actions/upload-artifact@v4.0.0 with: - name: Web + name: Web-${{ env.VERSION_NAME }} path: build/web diff --git a/.github/workflows/checks.yaml b/.github/workflows/checks.yaml new file mode 100644 index 0000000..65aea71 --- /dev/null +++ b/.github/workflows/checks.yaml @@ -0,0 +1,49 @@ +name: Flutter checks + +on: + pull_request: + branches: + - develop + workflow_dispatch: + +jobs: + linting: + name: Linting & Formatting + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4.1.1 + + - name: Set up Flutter + uses: subosito/flutter-action@v2.16.0 + with: + channel: ${{ vars.FLUTTER_CHANNEL }} + flutter-version: ${{ vars.FLUTTER_VERSION }} + cache: true + cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" + cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" + + - name: Get dependencies + run: flutter pub get + + - name: Install arb_utils to check sorting of translations + run: dart pub global activate arb_utils + + - name: Copy translation file + run: cp ./lib/l10n/app_en.arb ./lib/l10n/app_en_sorted.arb + + - name: Sort translation file alphabetically + run: arb_utils sort ./lib/l10n/app_en.arb + + - name: Check sorted translations against english base + run: | + # Check if the contents of the destination file match the reference file + if cmp -s "./lib/l10n/app_en.arb" "./lib/l10n/app_en_sorted.arb"; then + echo "Translation entries are in alphabetical order." + else + echo "Translation entries are not in alphabetical order." + exit 1 # Fail the workflow if files are not the same + fi + + - name: Linting + run: flutter analyze --no-fatal-infos --no-fatal-warnings diff --git a/analysis_options.yaml b/analysis_options.yaml index 615795d..ae5a2af 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,7 +1,17 @@ include: package:lints/recommended.yaml analyzer: - exclude: [build/**, lib/jellyfin/**] + exclude: + - build/** + - lib/jellyfin/** + - lib/**/**.g.dart + - lib/**/**.freezed.dart + - lib/**/**.mapped.dart + - packages/** + - pubspec.yaml + strong-mode: + implicit-casts: false + implicit-dynamic: false language: # strict-casts: false # strict-raw-types: true @@ -17,3 +27,10 @@ linter: prefer_relative_imports: false avoid_relative_lib_imports: true eol_at_end_of_file: true + prefer_final_fields: true + prefer_const_constructors: true + always_declare_return_types: true + type_init_formals: true + unnecessary_this: true + sort_pub_dependencies: true + use_key_in_widget_constructors: true diff --git a/android/app/build.gradle b/android/app/build.gradle index bd80375..a64138d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -5,7 +5,7 @@ plugins { } def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') +def keystorePropertiesFile = file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } @@ -54,12 +54,12 @@ android { } signingConfigs { - release { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword keystoreProperties['storePassword'] - } + release { + storeFile file('keystore.jks') + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storePassword keystoreProperties['storePassword'] + } } buildTypes { @@ -69,7 +69,7 @@ android { debug{ applicationIdSuffix = ".debug" } - } + } } flutter { diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 9625e10..3c2b7fa 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -1,26 +1,26 @@ - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 11.0 - + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 13.0 + diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index b218f13..ef94fe8 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -343,7 +343,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -420,7 +420,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -469,7 +469,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/ios/exportOptions.plist b/ios/exportOptions.plist new file mode 100644 index 0000000..6ca88de --- /dev/null +++ b/ios/exportOptions.plist @@ -0,0 +1,14 @@ + + + + + method + release-testing + compileBitcode + + destination + export + signingStyle + manual + + \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index bc96e53..1466f27 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1,42 +1,340 @@ { "@@locale": "en", - "switchUser": "Switch user", - "userName": "Username", - "password": "Password", - "login": "Login", - "logout": "Logout", - "cancel": "Cancel", + "about": "About", "accept": "Accept", - "code": "Code", - "error": "Error", - "clear": "Clear", - "days": "Days", - "search": "Search", - "loggedIn": "Logged-in", - "change": "Change", - "other": "Other", - "dynamicText": "Dynamic", - "enabled": "Enabled", - "disabled": "Disabled", - "dashboard": "Dashboard", + "active": "Active", + "actor": "{count, plural, other{Actors} one{Actor}}", + "@actor": { + "description": "actor", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "addAsFavorite": "Add as favorite", + "addToCollection": "Add to collection", + "addToPlaylist": "Add to playlist", "advanced": "Advanced", - "refresh": "Refresh", - "delete": "Delete", - "goTo": "Go To", - "loop": "Loop", - "empty": "Empty", - "noRating": "No rating", - "backgroundBlur": "Background blur", + "all": "All", + "amoledBlack": "Amoled black", + "appLockAutoLogin": "Auto login", + "appLockBiometrics": "Biometrics", + "appLockPasscode": "Passcode", + "appLockTitle": "Set the log-in method for {userName}", + "@appLockTitle": { + "description": "Pop-up to pick a login method", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "ascending": "Ascending", + "audio": "Audio", "autoPlay": "Auto-play", - "resume": "Resume {item}", - "@resume": { - "description": "resume", + "backgroundBlur": "Background blur", + "backgroundOpacity": "Background opacity", + "biometricsFailedCheckAgain": "Biometrics failed check settings and try again", + "bold": "Bold", + "cancel": "Cancel", + "change": "Change", + "chapter": "{count, plural, other{Chapters} one{Chapter}}", + "@chapter": { + "description": "chapter", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "clear": "Clear", + "clearAllSettings": "Clear all settings", + "clearAllSettingsQuestion": "Clear all settings?", + "clearChanges": "Clear changes", + "clearSelection": "Clear selection", + "close": "Close", + "code": "Code", + "collectionFolder": "Collection folder", + "color": "Color", + "combined": "Combined", + "communityRating": "Community Rating", + "continuePage": "Continue - page {page}", + "@continuePage": { + "description": "Continue - page 1", + "placeholders": { + "page": { + "type": "int" + } + } + }, + "controls": "Controls", + "dashboard": "Dashboard", + "dashboardContinue": "Continue", + "dashboardContinueListening": "Continue Listening", + "dashboardContinueReading": "Continue Reading", + "dashboardContinueWatching": "Continue Watching", + "dashboardNextUp": "Next-up", + "dashboardRecentlyAdded": "Recently added in {name}", + "@dashboardRecentlyAdded": { + "description": "Recently added on home screen", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "dateAdded": "Date added", + "dateLastContentAdded": "Date last content added", + "datePlayed": "Date played", + "days": "Days", + "delete": "Delete", + "deleteFileFromSystem": "Deleting this item {item} will delete it from both the file system and your media library.\nAre you sure you wish to continue?", + "@deleteFileFromSystem": { + "description": "Delete file from system", "placeholders": { "item": { "type": "String" } } }, + "deleteItem": "Delete {item}?", + "@deleteItem": { + "description": "deleteItem", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "descending": "Descending", + "director": "{count, plural, other{Director} two{Directors}}", + "@director": { + "description": "director", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "disableFilters": "Disable filters", + "disabled": "Disabled", + "discovered": "Discovered", + "displayLanguage": "Display language", + "downloadsClearDesc": "Are you sure you want to remove all synced data?\nThis will clear all data for every synced user!", + "downloadsClearTitle": "Clear synced data", + "downloadsPath": "Path", + "downloadsSyncedData": "Synced data", + "downloadsTitle": "Downloads", + "dynamicText": "Dynamic", + "editMetadata": "Edit metadata", + "empty": "Empty", + "enabled": "Enabled", + "episode": "{count, plural, other{Episodes} one{Episode} }", + "@episode": { + "description": "episode", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "error": "Error", + "failedToLoadImage": "Failed to load image", + "favorite": "Favorite", + "favorites": "Favorites", + "fetchingLibrary": "Fetching library items", + "filter": "{count, plural, other{Filters} one{Filter}}", + "@filter": { + "description": "filter", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "folders": "Folders", + "fontColor": "Font color", + "fontSize": "Font size", + "forceRefresh": "Force refresh", + "genre": "{count, plural, other{Genres} one{Genre}}", + "@genre": { + "description": "genre", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "goTo": "Go To", + "grid": "Grid", + "group": "Group", + "groupBy": "Group by", + "heightOffset": "Height offset", + "hide": "Hide", + "hideEmpty": "Hide empty", + "home": "Home", + "identify": "Identify", + "immediately": "Immediately", + "incorrectPinTryAgain": "Incorrect pin try again", + "info": "Info", + "invalidUrl": "Invalid url", + "invalidUrlDesc": "Url needs to start with http(s)://", + "itemCount": "Item count: {count}", + "@itemCount": { + "description": "Item count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "label": "{count, plural, other{Labels} one{Label}}", + "@label": { + "description": "label", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "library": "{count, plural, other{Libraries} one{Library}}", + "@library": { + "description": "Plural", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "libraryFetchNoItemsFound": "No items found, try different settings.", + "libraryPageSizeDesc": "Set the amount to load at a time. 0 disables paging", + "libraryPageSizeTitle": "Library page size", + "light": "Light", + "list": "List", + "lockscreen": "Lockscreen", + "loggedIn": "Logged-in", + "login": "Login", + "logout": "Logout", + "logoutUserPopupContent": "This will log-out {userName} and delete te user from the app.\nYou will have to log back in to {serverName}.", + "@logoutUserPopupContent": { + "description": "Pop-up for loging out the user description", + "placeholders": { + "userName": { + "type": "String" + }, + "serverName": { + "type": "String" + } + } + }, + "logoutUserPopupTitle": "Log-out user {userName}?", + "@logoutUserPopupTitle": { + "description": "Pop-up for loging out the user", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "loop": "Loop", + "markAsUnwatched": "Mark as unwatched", + "markAsWatched": "Mark as watched", + "masonry": "Masonry", + "mediaTypeBase": "Base Type", + "mediaTypeBook": "Book", + "mediaTypeBoxset": "Boxset", + "mediaTypeEpisode": "Episode", + "mediaTypeFolder": "Folder", + "mediaTypeMovie": "Movie", + "mediaTypePerson": "Person", + "mediaTypePhoto": "Photo", + "mediaTypePhotoAlbum": "Photo Album", + "mediaTypePlaylist": "Playlist", + "mediaTypeSeason": "Season", + "mediaTypeSeries": "Series", + "metaDataSavedFor": "Metadata saved for {item}", + "@metaDataSavedFor": { + "description": "metaDataSavedFor", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "metadataRefreshDefault": "Scan for new and updated files", + "metadataRefreshFull": "Replace all metadata", + "metadataRefreshValidation": "Search for missing metadata", + "minutes": "{count, plural, other{Minutes} one{Minute} }", + "@minutes": { + "description": "minute", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "mode": "Mode", + "moreFrom": "More from {info}", + "@moreFrom": { + "description": "More from", + "placeholders": { + "info": { + "type": "String" + } + } + }, + "moreOptions": "More options", + "mouseDragSupport": "Drag using mouse", + "musicAlbum": "Album", + "name": "Name", + "navigation": "Navigation", + "navigationDashboard": "Dashboard", + "navigationFavorites": "Favorites", + "navigationSync": "Synced", + "never": "Never", + "nextUp": "Next Up", + "noItemsSynced": "No items synced", + "noItemsToShow": "No items to show", + "noRating": "No rating", + "noResults": "No results", + "noServersFound": "No new servers found", + "noSuggestionsFound": "No suggestions found", + "none": "None", + "normal": "Normal", + "notPartOfAlbum": "Not part of a album", + "openParent": "Open parent", + "openShow": "Open show", + "openWebLink": "Open web link", + "options": "Options", + "other": "Other", + "outlineColor": "Outline color", + "outlineSize": "Outline size", + "overview": "Overview", + "page": "Page {index}", + "@page": { + "description": "page", + "placeholders": { + "index": { + "type": "int" + } + } + }, + "parentalRating": "Parental Rating", + "password": "Password", + "pathClearTitle": "Clear downloads path", + "pathEditDesc": "This location is set for all users, any synced data will no longer be accessible.\nIt will remain on your storage.", + "pathEditSelect": "Select downloads destination", + "pathEditTitle": "Change location", "play": "Play {item}", "@play": { "description": "Play with", @@ -46,24 +344,7 @@ } } }, - "read": "Read {item}", - "@read": { - "description": "read", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "readFromStart": "Read {item} from start", - "@readFromStart": { - "description": "Read book from start", - "placeholders": { - "item": { - "type": "String" - } - } - }, + "playCount": "Play count", "playFrom": "Play from {name}", "@playFrom": { "description": "playFrom", @@ -82,230 +363,46 @@ } } }, - "moreFrom": "More from {info}", - "@moreFrom": { - "description": "More from", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selectedWith": "Selected {info}", - "@selectedWith": { - "description": "selected", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selected": "Selected", - "restart": "Restart", - "reWatch": "Rewatch", - "options": "Options", - "list": "List", - "grid": "Grid", - "masonry": "Masonry", - "start": "Start", - "none": "None", - "chapter": "{count, plural, other{Chapters} one{Chapter}}", - "@chapter": { - "description": "chapter", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "watchOn": "Watch on", - "sync": "Sync", - "moreOptions": "More options", - "continuePage": "Continue - page {page}", - "@continuePage": { - "description": "Continue - page 1", - "placeholders": { - "page": { - "type": "int" - } - } - }, - "openShow": "Open show", - "showDetails": "Show details", - "showAlbum": "Show album", - "season": "{count, plural, other{Seasons} one{Season} }", - "@season": { - "description": "season", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "episode": "{count, plural, other{Episodes} one{Episode} }", - "@episode": { - "description": "episode", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "addToCollection": "Add to collection", - "addToPlaylist": "Add to playlist", - "removeFromCollection": "Remove to collection", - "removeFromPlaylist": "Remove to playlist", - "markAsWatched": "Mark as watched", - "markAsUnwatched": "Mark as unwatched", - "removeAsFavorite": "Remove as favorite", - "addAsFavorite": "Add as favorite", - "editMetadata": "Edit metadata", - "refreshMetadata": "Refresh metadata", - "syncDetails": "Sync details", - "identify": "Identify", - "info": "Info", - "clearAllSettings": "Clear all settings", - "clearAllSettingsQuestion": "Clear all settings?", - "unableToReverseAction": "This action can not be reversed, it will remove all settings.", - "navigationDashboard": "Dashboard", - "navigationFavorites": "Favorites", - "navigationSync": "Synced", - "navigation": "Navigation", - "library": "{count, plural, other{Libraries} one{Library}}", - "@library": { - "description": "Plural", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "scanLibrary": "Scan library", - "dashboardContinue": "Continue", - "dashboardContinueWatching": "Continue Watching", - "dashboardContinueReading": "Continue Reading", - "dashboardContinueListening": "Continue Listening", - "dashboardNextUp": "Next-up", - "dashboardRecentlyAdded": "Recently added in {name}", - "@dashboardRecentlyAdded": { - "description": "Recently added on home screen", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "settings": "Settings", - "settingsClientTitle": "Fladder", - "settingsClientDesc": "General, Time-out, Layout, Theme", - "settingsQuickConnectTitle": "Quick connect", - "settingsProfileTitle": "Profile", - "settingsProfileDesc": "Lockscreen", - "settingsPlayerTitle": "Player", - "settingsPlayerDesc": "Aspect-ratio, Advanced", - "logoutUserPopupTitle": "Log-out user {userName}?", - "@logoutUserPopupTitle": { - "description": "Pop-up for loging out the user", - "placeholders": { - "userName": { - "type": "String" - } - } - }, - "logoutUserPopupContent": "This will log-out {userName} and delete te user from the app.\nYou will have to log back in to {serverName}.", - "@logoutUserPopupContent": { - "description": "Pop-up for loging out the user description", - "placeholders": { - "userName": { - "type": "String" - }, - "serverName": { - "type": "String" - } - } - }, - "quickConnectTitle": "Quick-connect", + "playLabel": "Play", + "playVideos": "Play videos", + "played": "Played", "quickConnectAction": "Enter quick connect code for", "quickConnectInputACode": "Input a code", + "quickConnectTitle": "Quick-connect", "quickConnectWrongCode": "Wrong code", - "downloadsTitle": "Downloads", - "downloadsPath": "Path", - "pathEditTitle": "Change location", - "pathEditSelect": "Select downloads destination", - "pathClearTitle": "Clear downloads path", - "pathEditDesc": "This location is set for all users, any synced data will no longer be accessible.\nIt will remain on your storage.", - "downloadsSyncedData": "Synced data", - "downloadsClearTitle": "Clear synced data", - "downloadsClearDesc": "Are you sure you want to remove all synced data?\nThis will clear all data for every synced user!", - "lockscreen": "Lockscreen", - "timeOut": "Time-out", - "home": "Home", - "settingsHomeCarouselTitle": "Dashboard carousel", - "settingsHomeCarouselDesc": "Shows a carousel on the dashboard screen", - "settingsHomeNextUpTitle": "Next-up posters", - "settingsHomeNextUpDesc": "Type of posters shown in the dashboard screen", - "settingsVisual": "Visual", - "settingsBlurredPlaceholderTitle": "Blurred placeholder", - "settingsBlurredPlaceholderDesc": "Show blurred background when loading posters", - "settingsBlurEpisodesTitle": "Blur next-up episodes", - "settingsBlurEpisodesDesc": "Blur all upcoming episodes", - "settingsEnableOsMediaControls": "Enable OS media controls", - "settingsNextUpCutoffDays": "Next-up cutoff days", - "settingsShowScaleSlider": "Show poster size slide", - "settingsPosterSize": "Poster size", - "settingsPosterSlider": "Show scale slider", - "settingsPosterPinch": "Pinch-zoom to scale posters", - "theme": "Theme", - "mode": "Mode", - "themeModeSystem": "System", - "themeModeLight": "Light", - "themeModeDark": "Dark", - "themeColor": "Theme color", - "color": "Color", - "amoledBlack": "Amoled black", - "hide": "Hide", - "nextUp": "Next Up", - "settingsContinue": "Continue", - "separate": "Separate", - "combined": "Combined", - "settingsSecurity": "Security", - "settingSecurityApplockTitle": "App lock", - "appLockTitle": "Set the log-in method for {userName}", - "@appLockTitle": { - "description": "Pop-up to pick a login method", + "random": "Random", + "rating": "{count, plural, other{Ratings} one{Rating}}", + "@rating": { + "description": "rating", "placeholders": { - "userName": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "reWatch": "Rewatch", + "read": "Read {item}", + "@read": { + "description": "read", + "placeholders": { + "item": { "type": "String" } } }, - "biometricsFailedCheckAgain": "Biometrics failed check settings and try again", - "appLockAutoLogin": "Auto login", - "appLockPasscode": "Passcode", - "appLockBiometrics": "Biometrics", - "settingsPlayerVideoHWAccelTitle": "Hardware acceleration", - "settingsPlayerVideoHWAccelDesc": "Use the gpu to render video (recommended)", - "settingsPlayerNativeLibassAccelTitle": "Native libass subtitles", - "settingsPlayerNativeLibassAccelDesc": "Use video player libass subtitle renderer", - "settingsPlayerMobileWarning": "Enabling Hardware acceleration and native libass subtitles on Android might cause some subtitles to not render.", - "settingsPlayerCustomSubtitlesTitle": "Customize subtitles", - "settingsPlayerCustomSubtitlesDesc": "Customize Size, Color, Position, Outline", - "videoScalingFillScreenTitle": "Fill screen", - "videoScalingFillScreenDesc": "Fill the navigation and statusbar", - "videoScalingFillScreenNotif": "Fill-screen overwrites video fit, in horizontal rotation", - "videoScaling": "Video scaling", - "videoScalingFill": "Fill", - "videoScalingContain": "Contain", - "videoScalingCover": "Cover", - "videoScalingFitWidth": "Fit Width", - "videoScalingFitHeight": "Fit Height", - "videoScalingScaleDown": "ScaleDown", - "subtitleConfiguratorPlaceHolder": "This is placeholder text, \n nothing to see here.", - "subtitleConfigurator": "Subtitle configurator", + "readFromStart": "Read {item} from start", + "@readFromStart": { + "description": "Read book from start", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "recursive": "Recursive", + "refresh": "Refresh", + "refreshMetadata": "Refresh metadata", "refreshPopup": "Refresh - {name}", "@refreshPopup": { "placeholders": { @@ -314,6 +411,41 @@ } } }, + "refreshPopupContentMetadata": "Metadata is refreshed based on settings and internet services that are enabled in the Dashboard.", + "related": "Related", + "releaseDate": "Release date", + "removeAsFavorite": "Remove as favorite", + "removeFromCollection": "Remove to collection", + "removeFromPlaylist": "Remove to playlist", + "replaceAllImages": "Replace all images", + "replaceExistingImages": "Replace existing images", + "restart": "Restart", + "result": "Result", + "resumable": "Resumable", + "resume": "Resume {item}", + "@resume": { + "description": "resume", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "retrievePublicListOfUsers": "Retrieve public list of users", + "retry": "Retry", + "runTime": "Run time", + "save": "Save", + "saved": "Saved", + "scanBiometricHint": "Verify identity", + "scanLibrary": "Scan library", + "scanYourFingerprintToAuthenticate": "Scan your fingerprint to authenticate {user}", + "@scanYourFingerprintToAuthenticate": { + "placeholders": { + "user": { + "type": "String" + } + } + }, "scanningName": "Scanning - {name}", "@scanningName": { "placeholders": { @@ -322,249 +454,11 @@ } } }, - "refreshPopupContentMetadata": "Metadata is refreshed based on settings and internet services that are enabled in the Dashboard.", - "replaceExistingImages": "Replace existing images", - "metadataRefreshDefault": "Scan for new and updated files", - "metadataRefreshValidation": "Search for missing metadata", - "metadataRefreshFull": "Replace all metadata", - "syncedItems": "Synced items", - "noItemsSynced": "No items synced", - "syncDeletePopupPermanent": "This action is permanent and will remove all localy synced files", - "totalSize": "Total size: {size}", - "@totalSize": { - "placeholders": { - "size": { - "type": "String" - } - } - }, - "mediaTypeBase": "Base Type", - "mediaTypeMovie": "Movie", - "mediaTypeSeries": "Series", - "mediaTypeSeason": "Season", - "mediaTypeEpisode": "Episode", - "mediaTypePhoto": "Photo", - "mediaTypePerson": "Person", - "mediaTypePhotoAlbum": "Photo Album", - "mediaTypeFolder": "Folder", - "mediaTypeBoxset": "Boxset", - "mediaTypePlaylist": "Playlist", - "mediaTypeBook": "Book", - "actor": "{count, plural, other{Actors} one{Actor}}", - "@actor": { - "description": "actor", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "writer": "{count, plural, other{Writer} two{Writers}}", - "@writer": { - "description": "writer", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "director": "{count, plural, other{Director} two{Directors}}", - "@director": { - "description": "director", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "video": "Video", - "audio": "Audio", - "subtitles": "Subtitles", - "related": "Related", - "all": "All", - "overview": "Overview", - "selectViewType": "Select view type", - "noItemsToShow": "No items to show", - "sortBy": "Sort by", - "groupBy": "Group by", "scrollToTop": "Scroll to top", - "disableFilters": "Disable filters", - "selectAll": "Select all", - "clearSelection": "Clear selection", - "shuffleVideos": "Shuffle videos", - "shuffleGallery": "Shuffle gallery", - "unknown": "Unknown", - "favorites": "Favorites", - "recursive": "Recursive", - "genre": "{count, plural, other{Genres} one{Genre}}", - "@genre": { - "description": "genre", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "studio": "{count, plural, other{Studios} one{Studio}}", - "@studio": { - "description": "studio", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "label": "{count, plural, other{Labels} one{Label}}", - "@label": { - "description": "label", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "group": "Group", - "type": "{count, plural, other{Types} one{Type}}", - "@type": { - "description": "type", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "filter": "{count, plural, other{Filters} one{Filter}}", - "@filter": { - "description": "filter", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "showEmpty": "Show empty", - "hideEmpty": "Hide empty", - "rating": "{count, plural, other{Ratings} one{Rating}}", - "@rating": { - "description": "rating", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "year": "{count, plural, other{Years} one{Year}}", - "@year": { - "description": "year", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "playVideos": "Play videos", - "playLabel": "Play", - "forceRefresh": "Force refresh", - "itemCount": "Item count: {count}", - "@itemCount": { - "description": "Item count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "invalidUrl": "Invalid url", - "invalidUrlDesc": "Url needs to start with http(s)://", - "incorrectPinTryAgain": "Incorrect pin try again", - "somethingWentWrongPasswordCheck": "Something went wrong, check your password", - "unableToConnectHost": "Unable to connect to host", - "server": "Server", - "retrievePublicListOfUsers": "Retrieve public list of users", - "displayLanguage": "Display language", - "deleteItem": "Delete {item}?", - "@deleteItem": { - "description": "deleteItem", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncDeleteItemTitle": "Delete synced item", - "syncDeleteItemDesc": "Delete all synced data for?\n{item}", - "@syncDeleteItemDesc": { - "description": "Sync delete item pop-up window", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncOpenParent": "Open parent", - "syncRemoveDataTitle": "Remove synced data?", - "syncRemoveDataDesc": "Delete synced video data? This is permanent and you will need to re-sync the files", - "collectionFolder": "Collection folder", - "musicAlbum": "Album", - "active": "Active", - "name": "Name", - "result": "Result", - "close": "Close", - "replaceAllImages": "Replace all images", - "noResults": "No results", - "openWebLink": "Open web link", - "setIdentityTo": "Set identity to {name}", - "@setIdentityTo": { - "description": "setIdentityTo", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "somethingWentWrong": "Something went wrong", - "clearChanges": "Clear changes", - "useDefaults": "Use defaults", - "light": "Light", - "normal": "Normal", - "bold": "Bold", - "fontSize": "Font size", - "heightOffset": "Height offset", - "fontColor": "Font color", - "outlineColor": "Outline color", - "outlineSize": "Outline size", - "backgroundOpacity": "Background opacity", - "shadow": "Shadow", - "played": "Played", - "unPlayed": "Unplayed", - "resumable": "Resumable", - "sortOrder": "Sort order", - "sortName": "Name", - "communityRating": "Community Rating", - "parentalRating": "Parental Rating", - "dateAdded": "Date added", - "dateLastContentAdded": "Date last content added", - "favorite": "Favorite", - "datePlayed": "Date played", - "folders": "Folders", - "playCount": "Play count", - "releaseDate": "Release date", - "runTime": "Run time", - "ascending": "Ascending", - "descending": "Descending", - "minutes": "{count, plural, other{Minutes} one{Minute} }", - "@minutes": { - "description": "minute", + "search": "Search", + "season": "{count, plural, other{Seasons} one{Season} }", + "@season": { + "description": "season", "placeholders": { "count": { "type": "int", @@ -582,23 +476,126 @@ } } }, - "page": "Page {index}", - "@page": { - "description": "page", + "selectAll": "Select all", + "selectTime": "Select time", + "selectViewType": "Select view type", + "selected": "Selected", + "selectedWith": "Selected {info}", + "@selectedWith": { + "description": "selected", "placeholders": { - "index": { - "type": "int" + "info": { + "type": "String" } } }, + "separate": "Separate", + "server": "Server", "set": "Set", "@set": { "description": "Use for setting a certain value", "context": "Set 'time'" }, - "never": "Never", - "selectTime": "Select time", - "immediately": "Immediately", + "setIdentityTo": "Set identity to {name}", + "@setIdentityTo": { + "description": "setIdentityTo", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "settingSecurityApplockTitle": "App lock", + "settings": "Settings", + "settingsBlurEpisodesDesc": "Blur all upcoming episodes", + "settingsBlurEpisodesTitle": "Blur next-up episodes", + "settingsBlurredPlaceholderDesc": "Show blurred background when loading posters", + "settingsBlurredPlaceholderTitle": "Blurred placeholder", + "settingsClientDesc": "General, Time-out, Layout, Theme", + "settingsClientTitle": "Fladder", + "settingsContinue": "Continue", + "settingsEnableOsMediaControls": "Enable OS media controls", + "settingsHomeCarouselDesc": "Shows a carousel on the dashboard screen", + "settingsHomeCarouselTitle": "Dashboard carousel", + "settingsHomeNextUpDesc": "Type of posters shown in the dashboard screen", + "settingsHomeNextUpTitle": "Next-up posters", + "settingsNextUpCutoffDays": "Next-up cutoff days", + "settingsPlayerCustomSubtitlesDesc": "Customize Size, Color, Position, Outline", + "settingsPlayerCustomSubtitlesTitle": "Customize subtitles", + "settingsPlayerDesc": "Aspect-ratio, Advanced", + "settingsPlayerMobileWarning": "Enabling Hardware acceleration and native libass subtitles on Android might cause some subtitles to not render.", + "settingsPlayerNativeLibassAccelDesc": "Use video player libass subtitle renderer", + "settingsPlayerNativeLibassAccelTitle": "Native libass subtitles", + "settingsPlayerTitle": "Player", + "settingsPlayerVideoHWAccelDesc": "Use the gpu to render video (recommended)", + "settingsPlayerVideoHWAccelTitle": "Hardware acceleration", + "settingsPosterPinch": "Pinch-zoom to scale posters", + "settingsPosterSize": "Poster size", + "settingsPosterSlider": "Show scale slider", + "settingsProfileDesc": "Lockscreen", + "settingsProfileTitle": "Profile", + "settingsQuickConnectTitle": "Quick connect", + "settingsSecurity": "Security", + "settingsShowScaleSlider": "Show poster size slide", + "settingsVisual": "Visual", + "shadow": "Shadow", + "showAlbum": "Show album", + "showDetails": "Show details", + "showEmpty": "Show empty", + "shuffleGallery": "Shuffle gallery", + "shuffleVideos": "Shuffle videos", + "somethingWentWrong": "Something went wrong", + "somethingWentWrongPasswordCheck": "Something went wrong, check your password", + "sortBy": "Sort by", + "sortName": "Name", + "sortOrder": "Sort order", + "start": "Start", + "studio": "{count, plural, other{Studios} one{Studio}}", + "@studio": { + "description": "studio", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "subtitleConfigurator": "Subtitle configurator", + "subtitleConfiguratorPlaceHolder": "This is placeholder text, \n nothing to see here.", + "subtitles": "Subtitles", + "switchUser": "Switch user", + "sync": "Sync", + "syncDeleteItemDesc": "Delete all synced data for?\n{item}", + "@syncDeleteItemDesc": { + "description": "Sync delete item pop-up window", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "syncDeleteItemTitle": "Delete synced item", + "syncDeletePopupPermanent": "This action is permanent and will remove all localy synced files", + "syncDetails": "Sync details", + "syncOpenParent": "Open parent", + "syncRemoveDataDesc": "Delete synced video data? This is permanent and you will need to re-sync the files", + "syncRemoveDataTitle": "Remove synced data?", + "syncedItems": "Synced items", + "tag": "{count, plural, one{Tag} other{Tags}}", + "@tag": { + "description": "tag", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "theme": "Theme", + "themeColor": "Theme color", + "themeModeDark": "Dark", + "themeModeLight": "Light", + "themeModeSystem": "System", "timeAndAnnotation": "{minutes} and {seconds}", "@timeAndAnnotation": { "description": "timeAndAnnotation", @@ -611,47 +608,18 @@ } } }, - "scanYourFingerprintToAuthenticate": "Scan your fingerprint to authenticate {user}", - "@scanYourFingerprintToAuthenticate": { + "timeOut": "Time-out", + "totalSize": "Total size: {size}", + "@totalSize": { "placeholders": { - "user": { + "size": { "type": "String" } } }, - "scanBiometricHint": "Verify identity", - "deleteFileFromSystem": "Deleting this item {item} will delete it from both the file system and your media library.\nAre you sure you wish to continue?", - "@deleteFileFromSystem": { - "description": "Delete file from system", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "notPartOfAlbum": "Not part of a album", - "retry": "Retry", - "failedToLoadImage": "Failed to load image", - "save": "Save", - "metaDataSavedFor": "Metadata saved for {item}", - "@metaDataSavedFor": { - "description": "metaDataSavedFor", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "libraryPageSizeTitle": "Library page size", - "libraryPageSizeDesc": "Set the amount to load at a time. 0 disables paging", - "fetchingLibrary": "Fetching library items", - "libraryFetchNoItemsFound": "No items found, try different settings.", - "noSuggestionsFound": "No suggestions found", - "viewPhotos": "View photos", - "random": "Random", - "tag": "{count, plural, one{Tag} other{Tags}}", - "@tag": { - "description": "tag", + "type": "{count, plural, other{Types} one{Type}}", + "@type": { + "description": "type", "placeholders": { "count": { "type": "int", @@ -659,11 +627,43 @@ } } }, - "saved": "Saved", - "discovered": "Discovered", - "noServersFound": "No new servers found", - "about": "About", - "openParent": "Open parent", - "mouseDragSupport": "Drag using mouse", - "controls": "Controls" -} + "unPlayed": "Unplayed", + "unableToConnectHost": "Unable to connect to host", + "unableToReverseAction": "This action can not be reversed, it will remove all settings.", + "unknown": "Unknown", + "useDefaults": "Use defaults", + "userName": "Username", + "video": "Video", + "videoScaling": "Video scaling", + "videoScalingContain": "Contain", + "videoScalingCover": "Cover", + "videoScalingFill": "Fill", + "videoScalingFillScreenDesc": "Fill the navigation and statusbar", + "videoScalingFillScreenNotif": "Fill-screen overwrites video fit, in horizontal rotation", + "videoScalingFillScreenTitle": "Fill screen", + "videoScalingFitHeight": "Fit Height", + "videoScalingFitWidth": "Fit Width", + "videoScalingScaleDown": "ScaleDown", + "viewPhotos": "View photos", + "watchOn": "Watch on", + "writer": "{count, plural, other{Writer} two{Writers}}", + "@writer": { + "description": "writer", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "year": "{count, plural, other{Years} one{Year}}", + "@year": { + "description": "year", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index f379365..38cb55c 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1,42 +1,340 @@ { "@@locale": "es", - "switchUser": "Cambiar usuario", - "userName": "Nombre de usuario", - "password": "Contraseña", - "login": "Iniciar sesión", - "logout": "Cerrar sesión", - "cancel": "Cancelar", + "about": "Acerca de", "accept": "Aceptar", - "code": "Código", - "error": "Error", - "clear": "Borrar", - "days": "Días", - "search": "Buscar", - "loggedIn": "Conectado", - "change": "Cambiar", - "other": "Otro", - "dynamicText": "Dinámico", - "enabled": "Habilitado", - "disabled": "Deshabilitado", - "dashboard": "Tablero", + "active": "Activo", + "actor": "{count, plural, other{Actores} one{Actor}}", + "@actor": { + "description": "actor", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "addAsFavorite": "Agregar como favorito", + "addToCollection": "Agregar a la colección", + "addToPlaylist": "Agregar a la lista de reproducción", "advanced": "Avanzado", - "refresh": "Actualizar", - "delete": "Eliminar", - "goTo": "Ir a", - "loop": "Bucle", - "empty": "Vacío", - "noRating": "Sin calificación", - "backgroundBlur": "Desenfoque de fondo", + "all": "Todo", + "amoledBlack": "Negro amoled", + "appLockAutoLogin": "Inicio de sesión automático", + "appLockBiometrics": "Biometría", + "appLockPasscode": "Código de acceso", + "appLockTitle": "Establecer el método de inicio de sesión para {userName}", + "@appLockTitle": { + "description": "Pop-up para elegir un método de inicio de sesión", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "ascending": "Ascendente", + "audio": "Audio", "autoPlay": "Reproducción automática", - "resume": "Reanudar {item}", - "@resume": { - "description": "reanudar", + "backgroundBlur": "Desenfoque de fondo", + "backgroundOpacity": "Opacidad de fondo", + "biometricsFailedCheckAgain": "Falló la biometría, verifique la configuración y vuelva a intentarlo", + "bold": "Negrita", + "cancel": "Cancelar", + "change": "Cambiar", + "chapter": "{count, plural, other{Capítulos} one{Capítulo}}", + "@chapter": { + "description": "capítulo", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "clear": "Borrar", + "clearAllSettings": "Borrar todos los ajustes", + "clearAllSettingsQuestion": "¿Borrar todos los ajustes?", + "clearChanges": "Borrar cambios", + "clearSelection": "Borrar selección", + "close": "Cerrar", + "code": "Código", + "collectionFolder": "Carpeta de colección", + "color": "Color", + "combined": "Combinado", + "communityRating": "Calificación de la comunidad", + "continuePage": "Continuar - página {page}", + "@continuePage": { + "description": "Continuar - página 1", + "placeholders": { + "page": { + "type": "int" + } + } + }, + "controls": "Controles", + "dashboard": "Tablero", + "dashboardContinue": "Continuar", + "dashboardContinueListening": "Continuar escuchando", + "dashboardContinueReading": "Continuar leyendo", + "dashboardContinueWatching": "Continuar viendo", + "dashboardNextUp": "Próximo", + "dashboardRecentlyAdded": "Recientemente añadido en {name}", + "@dashboardRecentlyAdded": { + "description": "Recientemente añadido en la pantalla de inicio", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "dateAdded": "Fecha de añadido", + "dateLastContentAdded": "Fecha del último contenido añadido", + "datePlayed": "Fecha de reproducción", + "days": "Días", + "delete": "Eliminar", + "deleteFileFromSystem": "Eliminar este elemento {item} lo eliminará tanto del sistema de archivos como de su biblioteca multimedia.\n¿Estás seguro de que deseas continuar?", + "@deleteFileFromSystem": { + "description": "Eliminar archivo del sistema", "placeholders": { "item": { "type": "String" } } }, + "deleteItem": "¿Eliminar {item}?", + "@deleteItem": { + "description": "deleteItem", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "descending": "Descendente", + "director": "{count, plural, other{Directores} one{Director}}", + "@director": { + "description": "director", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "disableFilters": "Deshabilitar filtros", + "disabled": "Deshabilitado", + "discovered": "Descubierto", + "displayLanguage": "Idioma de visualización", + "downloadsClearDesc": "¿Está seguro de que desea eliminar todos los datos sincronizados?\n¡Esto eliminará todos los datos de cada usuario sincronizado!", + "downloadsClearTitle": "Borrar datos sincronizados", + "downloadsPath": "Ruta", + "downloadsSyncedData": "Datos sincronizados", + "downloadsTitle": "Descargas", + "dynamicText": "Dinámico", + "editMetadata": "Editar metadatos", + "empty": "Vacío", + "enabled": "Habilitado", + "episode": "{count, plural, other{Episodios} one{Episodio}}", + "@episode": { + "description": "episodio", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "error": "Error", + "failedToLoadImage": "Error al cargar la imagen", + "favorite": "Favorito", + "favorites": "Favoritos", + "fetchingLibrary": "Cargando elementos de la biblioteca", + "filter": "{count, plural, other{Filtros} one{Filtro}}", + "@filter": { + "description": "filtro", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "folders": "Carpetas", + "fontColor": "Color de fuente", + "fontSize": "Tamaño de fuente", + "forceRefresh": "Actualizar a la fuerza", + "genre": "{count, plural, other{Géneros} one{Género}}", + "@genre": { + "description": "género", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "goTo": "Ir a", + "grid": "Cuadrícula", + "group": "Grupo", + "groupBy": "Agrupar por", + "heightOffset": "Desplazamiento de altura", + "hide": "Ocultar", + "hideEmpty": "Ocultar vacío", + "home": "Inicio", + "identify": "Identificar", + "immediately": "Inmediatamente", + "incorrectPinTryAgain": "PIN incorrecto, intente nuevamente", + "info": "Información", + "invalidUrl": "URL inválida", + "invalidUrlDesc": "La URL debe comenzar con http(s)://", + "itemCount": "Cantidad de elementos: {count}", + "@itemCount": { + "description": "Cantidad de elementos", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "label": "{count, plural, other{Etiquetas} one{Etiqueta}}", + "@label": { + "description": "etiqueta", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "library": "{count, plural, other{Bibliotecas} one{Biblioteca}}", + "@library": { + "description": "plural", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "libraryFetchNoItemsFound": "No se encontraron elementos, intenta con diferentes configuraciones.", + "libraryPageSizeDesc": "Establece la cantidad a cargar a la vez. 0 desactiva el paginado.", + "libraryPageSizeTitle": "Tamaño de página de la biblioteca", + "light": "Ligero", + "list": "Lista", + "lockscreen": "Pantalla de bloqueo", + "loggedIn": "Conectado", + "login": "Iniciar sesión", + "logout": "Cerrar sesión", + "logoutUserPopupContent": "Esto cerrará la sesión de {userName} y eliminará al usuario de la aplicación.\nDeberá volver a iniciar sesión en {serverName}.", + "@logoutUserPopupContent": { + "description": "Pop-up para cerrar sesión del usuario descripción", + "placeholders": { + "userName": { + "type": "String" + }, + "serverName": { + "type": "String" + } + } + }, + "logoutUserPopupTitle": "¿Cerrar sesión del usuario {userName}?", + "@logoutUserPopupTitle": { + "description": "Pop-up para cerrar sesión del usuario", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "loop": "Bucle", + "markAsUnwatched": "Marcar como no visto", + "markAsWatched": "Marcar como visto", + "masonry": "Mampostería", + "mediaTypeBase": "Tipo base", + "mediaTypeBook": "Libro", + "mediaTypeBoxset": "Conjunto de cajas", + "mediaTypeEpisode": "Episodio", + "mediaTypeFolder": "Carpeta", + "mediaTypeMovie": "Película", + "mediaTypePerson": "Persona", + "mediaTypePhoto": "Foto", + "mediaTypePhotoAlbum": "Álbum de fotos", + "mediaTypePlaylist": "Lista de reproducción", + "mediaTypeSeason": "Temporada", + "mediaTypeSeries": "Serie", + "metaDataSavedFor": "Metadatos guardados para {item}", + "@metaDataSavedFor": { + "description": "metadatosGuardadosPara", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "metadataRefreshDefault": "Buscar archivos nuevos y actualizados", + "metadataRefreshFull": "Reemplazar todos los metadatos", + "metadataRefreshValidation": "Buscar metadatos faltantes", + "minutes": "{count, plural, other{Minutos} one{Minuto}}", + "@minutes": { + "description": "minuto", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "mode": "Modo", + "moreFrom": "Más de {info}", + "@moreFrom": { + "description": "Más de", + "placeholders": { + "info": { + "type": "String" + } + } + }, + "moreOptions": "Más opciones", + "mouseDragSupport": "Arrastrar con el ratón", + "musicAlbum": "Álbum", + "name": "Nombre", + "navigation": "Navegación", + "navigationDashboard": "Tablero", + "navigationFavorites": "Favoritos", + "navigationSync": "Sincronizado", + "never": "Nunca", + "nextUp": "Próximos", + "noItemsSynced": "No hay elementos sincronizados", + "noItemsToShow": "No hay elementos para mostrar", + "noRating": "Sin calificación", + "noResults": "Sin resultados", + "noServersFound": "No se encontraron nuevos servidores", + "noSuggestionsFound": "No se encontraron sugerencias", + "none": "Ninguno", + "normal": "Normal", + "notPartOfAlbum": "No forma parte de un álbum", + "openParent": "Abrir carpeta superior", + "openShow": "Abrir espectáculo", + "openWebLink": "Abrir enlace web", + "options": "Opciones", + "other": "Otro", + "outlineColor": "Color del contorno", + "outlineSize": "Tamaño del contorno", + "overview": "Visión general", + "page": "Página {index}", + "@page": { + "description": "página", + "placeholders": { + "index": { + "type": "int" + } + } + }, + "parentalRating": "Calificación parental", + "password": "Contraseña", + "pathClearTitle": "Borrar ruta de descargas", + "pathEditDesc": "Esta ubicación se establece para todos los usuarios, los datos sincronizados ya no serán accesibles.\nPermanecerán en su almacenamiento.", + "pathEditSelect": "Seleccionar destino de descargas", + "pathEditTitle": "Cambiar ubicación", "play": "Reproducir {item}", "@play": { "description": "Reproducir con", @@ -46,6 +344,44 @@ } } }, + "playCount": "Conteo de reproducciones", + "playFrom": "Reproducir desde {name}", + "@playFrom": { + "description": "reproducir desde", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "playFromStart": "Reproducir {name} desde el principio", + "@playFromStart": { + "description": "reproducir desde el inicio", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "playLabel": "Reproducir", + "playVideos": "Reproducir videos", + "played": "Reproducido", + "quickConnectAction": "Ingrese el código de conexión rápida para", + "quickConnectInputACode": "Ingrese un código", + "quickConnectTitle": "Conexión rápida", + "quickConnectWrongCode": "Código incorrecto", + "random": "Aleatorio", + "rating": "{count, plural, other{Calificaciones} one{Calificación}}", + "@rating": { + "description": "calificación", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "reWatch": "Volver a ver", "read": "Leer {item}", "@read": { "description": "leer", @@ -64,239 +400,9 @@ } } }, - "playFrom": "Reproducir desde {name}", - "@playFrom": { - "description": "reproducir desde", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "moreFrom": "Más de {info}", - "@moreFrom": { - "description": "Más de", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selectedWith": "Seleccionado {info}", - "@selectedWith": { - "description": "seleccionado", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selected": "Seleccionado", - "restart": "Reiniciar", - "reWatch": "Volver a ver", - "options": "Opciones", - "list": "Lista", - "grid": "Cuadrícula", - "masonry": "Mampostería", - "start": "Iniciar", - "none": "Ninguno", - "chapter": "{count, plural, other{Capítulos} one{Capítulo}}", - "@chapter": { - "description": "capítulo", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "watchOn": "Ver en", - "sync": "Sincronizar", - "moreOptions": "Más opciones", - "continuePage": "Continuar - página {page}", - "@continuePage": { - "description": "Continuar - página 1", - "placeholders": { - "page": { - "type": "int" - } - } - }, - "openShow": "Abrir espectáculo", - "showDetails": "Mostrar detalles", - "showAlbum": "Mostrar álbum", - "season": "{count, plural, other{Temporadas} one{Temporada}}", - "@season": { - "description": "temporada", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "episode": "{count, plural, other{Episodios} one{Episodio}}", - "@episode": { - "description": "episodio", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "addToCollection": "Agregar a la colección", - "addToPlaylist": "Agregar a la lista de reproducción", - "removeFromCollection": "Eliminar de la colección", - "removeFromPlaylist": "Eliminar de la lista de reproducción", - "markAsWatched": "Marcar como visto", - "markAsUnwatched": "Marcar como no visto", - "removeAsFavorite": "Eliminar como favorito", - "addAsFavorite": "Agregar como favorito", - "editMetadata": "Editar metadatos", + "recursive": "Recursivo", + "refresh": "Actualizar", "refreshMetadata": "Actualizar metadatos", - "syncDetails": "Sincronizar detalles", - "identify": "Identificar", - "info": "Información", - "clearAllSettings": "Borrar todos los ajustes", - "clearAllSettingsQuestion": "¿Borrar todos los ajustes?", - "unableToReverseAction": "Esta acción no se puede deshacer, eliminará todos los ajustes.", - "navigationDashboard": "Tablero", - "navigationFavorites": "Favoritos", - "navigationSync": "Sincronizado", - "navigation": "Navegación", - "library": "{count, plural, other{Bibliotecas} one{Biblioteca}}", - "@library": { - "description": "plural", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "scanLibrary": "Escanear biblioteca", - "dashboardContinue": "Continuar", - "dashboardContinueWatching": "Continuar viendo", - "dashboardContinueReading": "Continuar leyendo", - "dashboardContinueListening": "Continuar escuchando", - "dashboardNextUp": "Próximo", - "dashboardRecentlyAdded": "Recientemente añadido en {name}", - "@dashboardRecentlyAdded": { - "description": "Recientemente añadido en la pantalla de inicio", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "settings": "Ajustes", - "settingsClientTitle": "Fladder", - "settingsClientDesc": "General, Tiempo de espera, Diseño, Tema", - "settingsQuickConnectTitle": "Conexión rápida", - "settingsProfileTitle": "Perfil", - "settingsProfileDesc": "Pantalla de bloqueo", - "settingsPlayerTitle": "Reproductor", - "settingsPlayerDesc": "Relación de aspecto, Avanzado", - "logoutUserPopupTitle": "¿Cerrar sesión del usuario {userName}?", - "@logoutUserPopupTitle": { - "description": "Pop-up para cerrar sesión del usuario", - "placeholders": { - "userName": { - "type": "String" - } - } - }, - "logoutUserPopupContent": "Esto cerrará la sesión de {userName} y eliminará al usuario de la aplicación.\nDeberá volver a iniciar sesión en {serverName}.", - "@logoutUserPopupContent": { - "description": "Pop-up para cerrar sesión del usuario descripción", - "placeholders": { - "userName": { - "type": "String" - }, - "serverName": { - "type": "String" - } - } - }, - "quickConnectTitle": "Conexión rápida", - "quickConnectAction": "Ingrese el código de conexión rápida para", - "quickConnectInputACode": "Ingrese un código", - "quickConnectWrongCode": "Código incorrecto", - "downloadsTitle": "Descargas", - "downloadsPath": "Ruta", - "pathEditTitle": "Cambiar ubicación", - "pathEditSelect": "Seleccionar destino de descargas", - "pathClearTitle": "Borrar ruta de descargas", - "pathEditDesc": "Esta ubicación se establece para todos los usuarios, los datos sincronizados ya no serán accesibles.\nPermanecerán en su almacenamiento.", - "downloadsSyncedData": "Datos sincronizados", - "downloadsClearTitle": "Borrar datos sincronizados", - "downloadsClearDesc": "¿Está seguro de que desea eliminar todos los datos sincronizados?\n¡Esto eliminará todos los datos de cada usuario sincronizado!", - "lockscreen": "Pantalla de bloqueo", - "timeOut": "Tiempo de espera", - "home": "Inicio", - "settingsHomeCarouselTitle": "Carrusel del tablero", - "settingsHomeCarouselDesc": "Muestra un carrusel en la pantalla del tablero", - "settingsHomeNextUpTitle": "Próximos pósteres", - "settingsHomeNextUpDesc": "Tipo de pósteres mostrados en la pantalla del tablero", - "settingsVisual": "Visual", - "settingsBlurredPlaceholderTitle": "Marcador de posición difuminado", - "settingsBlurredPlaceholderDesc": "Mostrar fondo difuminado al cargar pósteres", - "settingsBlurEpisodesTitle": "Difuminar próximos episodios", - "settingsBlurEpisodesDesc": "Difuminar todos los próximos episodios", - "settingsEnableOsMediaControls": "Habilitar controles multimedia del sistema operativo", - "settingsNextUpCutoffDays": "Días límite de próximos", - "settingsShowScaleSlider": "Mostrar control deslizante de tamaño de póster", - "settingsPosterSize": "Tamaño del póster", - "settingsPosterSlider": "Mostrar control deslizante de escala", - "settingsPosterPinch": "Pellizcar para escalar pósteres", - "theme": "Tema", - "mode": "Modo", - "themeModeSystem": "Sistema", - "themeModeLight": "Claro", - "themeModeDark": "Oscuro", - "themeColor": "Color del tema", - "color": "Color", - "amoledBlack": "Negro amoled", - "hide": "Ocultar", - "nextUp": "Próximos", - "settingsContinue": "Continuar", - "separate": "Separado", - "combined": "Combinado", - "settingsSecurity": "Seguridad", - "settingSecurityApplockTitle": "Bloqueo de aplicación", - "appLockTitle": "Establecer el método de inicio de sesión para {userName}", - "@appLockTitle": { - "description": "Pop-up para elegir un método de inicio de sesión", - "placeholders": { - "userName": { - "type": "String" - } - } - }, - "biometricsFailedCheckAgain": "Falló la biometría, verifique la configuración y vuelva a intentarlo", - "appLockAutoLogin": "Inicio de sesión automático", - "appLockPasscode": "Código de acceso", - "appLockBiometrics": "Biometría", - "settingsPlayerVideoHWAccelTitle": "Aceleración de hardware", - "settingsPlayerVideoHWAccelDesc": "Usar la gpu para renderizar video (recomendado)", - "settingsPlayerNativeLibassAccelTitle": "Subtítulos nativos libass", - "settingsPlayerNativeLibassAccelDesc": "Usar el renderizador de subtítulos libass del reproductor de video", - "settingsPlayerMobileWarning": "Habilitar la aceleración de hardware y los subtítulos libass nativos en Android puede hacer que algunos subtítulos no se rendericen.", - "settingsPlayerCustomSubtitlesTitle": "Personalizar subtítulos", - "settingsPlayerCustomSubtitlesDesc": "Personalizar tamaño, color, posición, contorno", - "videoScalingFillScreenTitle": "Llenar pantalla", - "videoScalingFillScreenDesc": "Llenar la barra de navegación y la barra de estado", - "videoScalingFillScreenNotif": "Llenar pantalla sobrescribe ajuste de video, en rotación horizontal", - "videoScaling": "Escalado de video", - "videoScalingFill": "Llenar", - "videoScalingContain": "Contener", - "videoScalingCover": "Cubrir", - "videoScalingFitWidth": "Ajustar ancho", - "videoScalingFitHeight": "Ajustar altura", - "videoScalingScaleDown": "Reducir escala", - "subtitleConfiguratorPlaceHolder": "Este es un texto de marcador de posición,\nnada que ver aquí.", - "subtitleConfigurator": "Configurador de subtítulos", "refreshPopup": "Actualizar - {name}", "@refreshPopup": { "placeholders": { @@ -305,6 +411,41 @@ } } }, + "refreshPopupContentMetadata": "Los metadatos se actualizan según la configuración y los servicios de Internet que están habilitados en el Tablero.", + "related": "Relacionado", + "releaseDate": "Fecha de lanzamiento", + "removeAsFavorite": "Eliminar como favorito", + "removeFromCollection": "Eliminar de la colección", + "removeFromPlaylist": "Eliminar de la lista de reproducción", + "replaceAllImages": "Reemplazar todas las imágenes", + "replaceExistingImages": "Reemplazar imágenes existentes", + "restart": "Reiniciar", + "result": "Resultado", + "resumable": "Reanudable", + "resume": "Reanudar {item}", + "@resume": { + "description": "reanudar", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "retrievePublicListOfUsers": "Recuperar lista pública de usuarios", + "retry": "Reintentar", + "runTime": "Duración", + "save": "Guardar", + "saved": "Guardado", + "scanBiometricHint": "Verificar identidad", + "scanLibrary": "Escanear biblioteca", + "scanYourFingerprintToAuthenticate": "Escanea tu huella digital para autenticar a {user}", + "@scanYourFingerprintToAuthenticate": { + "placeholders": { + "user": { + "type": "String" + } + } + }, "scanningName": "Escaneando - {name}", "@scanningName": { "placeholders": { @@ -313,258 +454,11 @@ } } }, - "refreshPopupContentMetadata": "Los metadatos se actualizan según la configuración y los servicios de Internet que están habilitados en el Tablero.", - "replaceExistingImages": "Reemplazar imágenes existentes", - "metadataRefreshDefault": "Buscar archivos nuevos y actualizados", - "metadataRefreshValidation": "Buscar metadatos faltantes", - "metadataRefreshFull": "Reemplazar todos los metadatos", - "syncedItems": "Elementos sincronizados", - "noItemsSynced": "No hay elementos sincronizados", - "syncDeletePopupPermanent": "Esta acción es permanente y eliminará todos los archivos sincronizados localmente", - "totalSize": "Tamaño total: {size}", - "@totalSize": { - "placeholders": { - "size": { - "type": "String" - } - } - }, - "mediaTypeBase": "Tipo base", - "mediaTypeMovie": "Película", - "mediaTypeSeries": "Serie", - "mediaTypeSeason": "Temporada", - "mediaTypeEpisode": "Episodio", - "mediaTypePhoto": "Foto", - "mediaTypePerson": "Persona", - "mediaTypePhotoAlbum": "Álbum de fotos", - "mediaTypeFolder": "Carpeta", - "mediaTypeBoxset": "Conjunto de cajas", - "mediaTypePlaylist": "Lista de reproducción", - "mediaTypeBook": "Libro", - "actor": "{count, plural, other{Actores} one{Actor}}", - "@actor": { - "description": "actor", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "writer": "{count, plural, other{Escritores} one{Escritor}}", - "@writer": { - "description": "escritor", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "director": "{count, plural, other{Directores} one{Director}}", - "@director": { - "description": "director", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "video": "Video", - "audio": "Audio", - "subtitles": "Subtítulos", - "related": "Relacionado", - "all": "Todo", - "overview": "Visión general", - "selectViewType": "Seleccionar tipo de vista", - "noItemsToShow": "No hay elementos para mostrar", - "sortBy": "Ordenar por", - "groupBy": "Agrupar por", "scrollToTop": "Desplazarse hacia arriba", - "disableFilters": "Deshabilitar filtros", - "selectAll": "Seleccionar todo", - "clearSelection": "Borrar selección", - "shuffleVideos": "Videos aleatorios", - "shuffleGallery": "Galería aleatoria", - "unknown": "Desconocido", - "favorites": "Favoritos", - "recursive": "Recursivo", - "genre": "{count, plural, other{Géneros} one{Género}}", - "@genre": { - "description": "género", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "studio": "{count, plural, other{Estudios} one{Estudio}}", - "@studio": { - "description": "estudio", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "label": "{count, plural, other{Etiquetas} one{Etiqueta}}", - "@label": { - "description": "etiqueta", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "group": "Grupo", - "type": "{count, plural, other{Tipos} one{Tipo}}", - "@type": { - "description": "tipo", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "filter": "{count, plural, other{Filtros} one{Filtro}}", - "@filter": { - "description": "filtro", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "showEmpty": "Mostrar vacío", - "hideEmpty": "Ocultar vacío", - "rating": "{count, plural, other{Calificaciones} one{Calificación}}", - "@rating": { - "description": "calificación", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "year": "{count, plural, other{Años} one{Año}}", - "@year": { - "description": "año", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "playVideos": "Reproducir videos", - "playLabel": "Reproducir", - "forceRefresh": "Actualizar a la fuerza", - "itemCount": "Cantidad de elementos: {count}", - "@itemCount": { - "description": "Cantidad de elementos", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "invalidUrl": "URL inválida", - "invalidUrlDesc": "La URL debe comenzar con http(s)://", - "incorrectPinTryAgain": "PIN incorrecto, intente nuevamente", - "somethingWentWrongPasswordCheck": "Algo salió mal, verifique su contraseña", - "unableToConnectHost": "No se puede conectar al host", - "server": "Servidor", - "retrievePublicListOfUsers": "Recuperar lista pública de usuarios", - "displayLanguage": "Idioma de visualización", - "deleteItem": "¿Eliminar {item}?", - "@deleteItem": { - "description": "deleteItem", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncDeleteItemTitle": "Eliminar elemento sincronizado", - "syncDeleteItemDesc": "¿Eliminar todos los datos sincronizados de?\n{item}", - "@syncDeleteItemDesc": { - "description": "Ventana emergente de eliminación de elemento sincronizado", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncOpenParent": "Abrir padre", - "syncRemoveDataTitle": "¿Eliminar datos sincronizados?", - "syncRemoveDataDesc": "¿Eliminar los datos de video sincronizados? Esto es permanente y necesitarás volver a sincronizar los archivos", - "collectionFolder": "Carpeta de colección", - "musicAlbum": "Álbum", - "active": "Activo", - "name": "Nombre", - "result": "Resultado", - "close": "Cerrar", - "replaceAllImages": "Reemplazar todas las imágenes", - "noResults": "Sin resultados", - "openWebLink": "Abrir enlace web", - "setIdentityTo": "Establecer identidad a {name}", - "@setIdentityTo": { - "description": "setIdentityTo", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "somethingWentWrong": "Algo salió mal", - "clearChanges": "Borrar cambios", - "useDefaults": "Usar valores predeterminados", - "light": "Ligero", - "normal": "Normal", - "bold": "Negrita", - "fontSize": "Tamaño de fuente", - "heightOffset": "Desplazamiento de altura", - "fontColor": "Color de fuente", - "outlineColor": "Color del contorno", - "outlineSize": "Tamaño del contorno", - "backgroundOpacity": "Opacidad de fondo", - "shadow": "Sombra", - "played": "Reproducido", - "unPlayed": "No reproducido", - "resumable": "Reanudable", - "sortOrder": "Orden de clasificación", - "sortName": "Nombre", - "communityRating": "Calificación de la comunidad", - "parentalRating": "Calificación parental", - "dateAdded": "Fecha de añadido", - "dateLastContentAdded": "Fecha del último contenido añadido", - "favorite": "Favorito", - "datePlayed": "Fecha de reproducción", - "folders": "Carpetas", - "playCount": "Conteo de reproducciones", - "releaseDate": "Fecha de lanzamiento", - "runTime": "Duración", - "ascending": "Ascendente", - "descending": "Descendente", - "playFromStart": "Reproducir {name} desde el principio", - "@playFromStart": { - "description": "reproducir desde el inicio", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "minutes": "{count, plural, other{Minutos} one{Minuto}}", - "@minutes": { - "description": "minuto", + "search": "Buscar", + "season": "{count, plural, other{Temporadas} one{Temporada}}", + "@season": { + "description": "temporada", "placeholders": { "count": { "type": "int", @@ -582,23 +476,126 @@ } } }, - "page": "Página {index}", - "@page": { - "description": "página", + "selectAll": "Seleccionar todo", + "selectTime": "Seleccionar hora", + "selectViewType": "Seleccionar tipo de vista", + "selected": "Seleccionado", + "selectedWith": "Seleccionado {info}", + "@selectedWith": { + "description": "seleccionado", "placeholders": { - "index": { - "type": "int" + "info": { + "type": "String" } } }, + "separate": "Separado", + "server": "Servidor", "set": "Establecer", "@set": { "description": "Usar para establecer un cierto valor", "context": "Establecer 'tiempo'" }, - "never": "Nunca", - "selectTime": "Seleccionar hora", - "immediately": "Inmediatamente", + "setIdentityTo": "Establecer identidad a {name}", + "@setIdentityTo": { + "description": "setIdentityTo", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "settingSecurityApplockTitle": "Bloqueo de aplicación", + "settings": "Ajustes", + "settingsBlurEpisodesDesc": "Difuminar todos los próximos episodios", + "settingsBlurEpisodesTitle": "Difuminar próximos episodios", + "settingsBlurredPlaceholderDesc": "Mostrar fondo difuminado al cargar pósteres", + "settingsBlurredPlaceholderTitle": "Marcador de posición difuminado", + "settingsClientDesc": "General, Tiempo de espera, Diseño, Tema", + "settingsClientTitle": "Fladder", + "settingsContinue": "Continuar", + "settingsEnableOsMediaControls": "Habilitar controles multimedia del sistema operativo", + "settingsHomeCarouselDesc": "Muestra un carrusel en la pantalla del tablero", + "settingsHomeCarouselTitle": "Carrusel del tablero", + "settingsHomeNextUpDesc": "Tipo de pósteres mostrados en la pantalla del tablero", + "settingsHomeNextUpTitle": "Próximos pósteres", + "settingsNextUpCutoffDays": "Días límite de próximos", + "settingsPlayerCustomSubtitlesDesc": "Personalizar tamaño, color, posición, contorno", + "settingsPlayerCustomSubtitlesTitle": "Personalizar subtítulos", + "settingsPlayerDesc": "Relación de aspecto, Avanzado", + "settingsPlayerMobileWarning": "Habilitar la aceleración de hardware y los subtítulos libass nativos en Android puede hacer que algunos subtítulos no se rendericen.", + "settingsPlayerNativeLibassAccelDesc": "Usar el renderizador de subtítulos libass del reproductor de video", + "settingsPlayerNativeLibassAccelTitle": "Subtítulos nativos libass", + "settingsPlayerTitle": "Reproductor", + "settingsPlayerVideoHWAccelDesc": "Usar la gpu para renderizar video (recomendado)", + "settingsPlayerVideoHWAccelTitle": "Aceleración de hardware", + "settingsPosterPinch": "Pellizcar para escalar pósteres", + "settingsPosterSize": "Tamaño del póster", + "settingsPosterSlider": "Mostrar control deslizante de escala", + "settingsProfileDesc": "Pantalla de bloqueo", + "settingsProfileTitle": "Perfil", + "settingsQuickConnectTitle": "Conexión rápida", + "settingsSecurity": "Seguridad", + "settingsShowScaleSlider": "Mostrar control deslizante de tamaño de póster", + "settingsVisual": "Visual", + "shadow": "Sombra", + "showAlbum": "Mostrar álbum", + "showDetails": "Mostrar detalles", + "showEmpty": "Mostrar vacío", + "shuffleGallery": "Galería aleatoria", + "shuffleVideos": "Videos aleatorios", + "somethingWentWrong": "Algo salió mal", + "somethingWentWrongPasswordCheck": "Algo salió mal, verifique su contraseña", + "sortBy": "Ordenar por", + "sortName": "Nombre", + "sortOrder": "Orden de clasificación", + "start": "Iniciar", + "studio": "{count, plural, other{Estudios} one{Estudio}}", + "@studio": { + "description": "estudio", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "subtitleConfigurator": "Configurador de subtítulos", + "subtitleConfiguratorPlaceHolder": "Este es un texto de marcador de posición,\nnada que ver aquí.", + "subtitles": "Subtítulos", + "switchUser": "Cambiar usuario", + "sync": "Sincronizar", + "syncDeleteItemDesc": "¿Eliminar todos los datos sincronizados de?\n{item}", + "@syncDeleteItemDesc": { + "description": "Ventana emergente de eliminación de elemento sincronizado", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "syncDeleteItemTitle": "Eliminar elemento sincronizado", + "syncDeletePopupPermanent": "Esta acción es permanente y eliminará todos los archivos sincronizados localmente", + "syncDetails": "Sincronizar detalles", + "syncOpenParent": "Abrir padre", + "syncRemoveDataDesc": "¿Eliminar los datos de video sincronizados? Esto es permanente y necesitarás volver a sincronizar los archivos", + "syncRemoveDataTitle": "¿Eliminar datos sincronizados?", + "syncedItems": "Elementos sincronizados", + "tag": "{count, plural, one{Etiqueta} other{Etiquetas}}", + "@tag": { + "description": "etiqueta", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "theme": "Tema", + "themeColor": "Color del tema", + "themeModeDark": "Oscuro", + "themeModeLight": "Claro", + "themeModeSystem": "Sistema", "timeAndAnnotation": "{minutes} y {seconds}", "@timeAndAnnotation": { "description": "timeAndAnnotation", @@ -611,47 +608,18 @@ } } }, - "scanYourFingerprintToAuthenticate": "Escanea tu huella digital para autenticar a {user}", - "@scanYourFingerprintToAuthenticate": { + "timeOut": "Tiempo de espera", + "totalSize": "Tamaño total: {size}", + "@totalSize": { "placeholders": { - "user": { + "size": { "type": "String" } } }, - "scanBiometricHint": "Verificar identidad", - "deleteFileFromSystem": "Eliminar este elemento {item} lo eliminará tanto del sistema de archivos como de su biblioteca multimedia.\n¿Estás seguro de que deseas continuar?", - "@deleteFileFromSystem": { - "description": "Eliminar archivo del sistema", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "notPartOfAlbum": "No forma parte de un álbum", - "retry": "Reintentar", - "failedToLoadImage": "Error al cargar la imagen", - "save": "Guardar", - "metaDataSavedFor": "Metadatos guardados para {item}", - "@metaDataSavedFor": { - "description": "metadatosGuardadosPara", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "libraryPageSizeTitle": "Tamaño de página de la biblioteca", - "libraryPageSizeDesc": "Establece la cantidad a cargar a la vez. 0 desactiva el paginado.", - "fetchingLibrary": "Cargando elementos de la biblioteca", - "libraryFetchNoItemsFound": "No se encontraron elementos, intenta con diferentes configuraciones.", - "noSuggestionsFound": "No se encontraron sugerencias", - "viewPhotos": "Ver fotos", - "random": "Aleatorio", - "tag": "{count, plural, one{Etiqueta} other{Etiquetas}}", - "@tag": { - "description": "etiqueta", + "type": "{count, plural, other{Tipos} one{Tipo}}", + "@type": { + "description": "tipo", "placeholders": { "count": { "type": "int", @@ -659,11 +627,43 @@ } } }, - "saved": "Guardado", - "discovered": "Descubierto", - "noServersFound": "No se encontraron nuevos servidores", - "about": "Acerca de", - "openParent": "Abrir carpeta superior", - "mouseDragSupport": "Arrastrar con el ratón", - "controls": "Controles" -} + "unPlayed": "No reproducido", + "unableToConnectHost": "No se puede conectar al host", + "unableToReverseAction": "Esta acción no se puede deshacer, eliminará todos los ajustes.", + "unknown": "Desconocido", + "useDefaults": "Usar valores predeterminados", + "userName": "Nombre de usuario", + "video": "Video", + "videoScaling": "Escalado de video", + "videoScalingContain": "Contener", + "videoScalingCover": "Cubrir", + "videoScalingFill": "Llenar", + "videoScalingFillScreenDesc": "Llenar la barra de navegación y la barra de estado", + "videoScalingFillScreenNotif": "Llenar pantalla sobrescribe ajuste de video, en rotación horizontal", + "videoScalingFillScreenTitle": "Llenar pantalla", + "videoScalingFitHeight": "Ajustar altura", + "videoScalingFitWidth": "Ajustar ancho", + "videoScalingScaleDown": "Reducir escala", + "viewPhotos": "Ver fotos", + "watchOn": "Ver en", + "writer": "{count, plural, other{Escritores} one{Escritor}}", + "@writer": { + "description": "escritor", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "year": "{count, plural, other{Años} one{Año}}", + "@year": { + "description": "año", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 8ccb46e..aa427b5 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1,42 +1,340 @@ { "@@locale": "fr", - "switchUser": "Changer d'utilisateur", - "userName": "Nom d'utilisateur", - "password": "Mot de passe", - "login": "Connexion", - "logout": "Déconnexion", - "cancel": "Annuler", + "about": "À propos", "accept": "Accepter", - "code": "Code", - "error": "Erreur", - "clear": "Effacer", - "days": "Jours", - "search": "Recherche", - "loggedIn": "Connecté", - "change": "Changer", - "other": "Autre", - "dynamicText": "Dynamique", - "enabled": "Activé", - "disabled": "Désactivé", - "dashboard": "Tableau de bord", + "active": "Actif", + "actor": "{count, plural, other{Acteurs} one{Acteur}}", + "@actor": { + "description": "acteur", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "addAsFavorite": "Ajouter aux favoris", + "addToCollection": "Ajouter à la collection", + "addToPlaylist": "Ajouter à la playlist", "advanced": "Avancé", - "refresh": "Rafraîchir", - "delete": "Supprimer", - "goTo": "Aller à", - "loop": "Boucle", - "empty": "Vide", - "noRating": "Pas de note", - "backgroundBlur": "Flou de fond", + "all": "Tout", + "amoledBlack": "Noir Amoled", + "appLockAutoLogin": "Connexion automatique", + "appLockBiometrics": "Biométrie", + "appLockPasscode": "Code d'accès", + "appLockTitle": "Définir la méthode de connexion pour {userName}", + "@appLockTitle": { + "description": "Pop-up pour choisir une méthode de connexion", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "ascending": "Ascendant", + "audio": "Audio", "autoPlay": "Lecture automatique", - "resume": "Reprendre {item}", - "@resume": { - "description": "reprendre", + "backgroundBlur": "Flou de fond", + "backgroundOpacity": "Opacité de l'arrière-plan", + "biometricsFailedCheckAgain": "Échec de la biométrie, vérifiez les paramètres et réessayez", + "bold": "Gras", + "cancel": "Annuler", + "change": "Changer", + "chapter": "{count, plural, other{Chapitres} one{Chapitre}}", + "@chapter": { + "description": "chapitre", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "clear": "Effacer", + "clearAllSettings": "Effacer tous les paramètres", + "clearAllSettingsQuestion": "Effacer tous les paramètres?", + "clearChanges": "Effacer les modifications", + "clearSelection": "Effacer la sélection", + "close": "Fermer", + "code": "Code", + "collectionFolder": "Dossier de collection", + "color": "Couleur", + "combined": "Combiné", + "communityRating": "Évaluation de la communauté", + "continuePage": "Continuer - page {page}", + "@continuePage": { + "description": "Continuer - page 1", + "placeholders": { + "page": { + "type": "int" + } + } + }, + "controls": "Commandes", + "dashboard": "Tableau de bord", + "dashboardContinue": "Continuer", + "dashboardContinueListening": "Continuer à écouter", + "dashboardContinueReading": "Continuer à lire", + "dashboardContinueWatching": "Continuer à regarder", + "dashboardNextUp": "Suivant", + "dashboardRecentlyAdded": "Récemment ajouté dans {name}", + "@dashboardRecentlyAdded": { + "description": "Récemment ajouté sur l'écran d'accueil", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "dateAdded": "Date d'ajout", + "dateLastContentAdded": "Date du dernier contenu ajouté", + "datePlayed": "Date de lecture", + "days": "Jours", + "delete": "Supprimer", + "deleteFileFromSystem": "Supprimer cet élément {item} le supprimera à la fois du système de fichiers et de votre bibliothèque multimédia.\nÊtes-vous sûr de vouloir continuer?", + "@deleteFileFromSystem": { + "description": "Supprimer le fichier du système", "placeholders": { "item": { "type": "String" } } }, + "deleteItem": "Supprimer {item}?", + "@deleteItem": { + "description": "deleteItem", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "descending": "Descendant", + "director": "{count, plural, other{Réalisateurs} one{Réalisateur}}", + "@director": { + "description": "réalisateur", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "disableFilters": "Désactiver les filtres", + "disabled": "Désactivé", + "discovered": "Découvert", + "displayLanguage": "Langue d'affichage", + "downloadsClearDesc": "Êtes-vous sûr de vouloir supprimer toutes les données synchronisées?\nCela effacera toutes les données pour chaque utilisateur synchronisé!", + "downloadsClearTitle": "Effacer les données synchronisées", + "downloadsPath": "Chemin", + "downloadsSyncedData": "Données synchronisées", + "downloadsTitle": "Téléchargements", + "dynamicText": "Dynamique", + "editMetadata": "Modifier les métadonnées", + "empty": "Vide", + "enabled": "Activé", + "episode": "{count, plural, other{Épisodes} one{Épisode}}", + "@episode": { + "description": "épisode", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "error": "Erreur", + "failedToLoadImage": "Échec du chargement de l'image", + "favorite": "Favori", + "favorites": "Favoris", + "fetchingLibrary": "Chargement des éléments de la bibliothèque", + "filter": "{count, plural, other{Filtres} one{Filtre}}", + "@filter": { + "description": "filtre", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "folders": "Dossiers", + "fontColor": "Couleur de la police", + "fontSize": "Taille de la police", + "forceRefresh": "Forcer le rafraîchissement", + "genre": "{count, plural, other{Genres} one{Genre}}", + "@genre": { + "description": "genre", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "goTo": "Aller à", + "grid": "Grille", + "group": "Groupe", + "groupBy": "Grouper par", + "heightOffset": "Décalage de hauteur", + "hide": "Cacher", + "hideEmpty": "Cacher vide", + "home": "Accueil", + "identify": "Identifier", + "immediately": "Immédiatement", + "incorrectPinTryAgain": "PIN incorrect, réessayez", + "info": "Infos", + "invalidUrl": "URL invalide", + "invalidUrlDesc": "L'URL doit commencer par http(s)://", + "itemCount": "Nombre d'éléments: {count}", + "@itemCount": { + "description": "Nombre d'éléments", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "label": "{count, plural, other{Étiquettes} one{Étiquette}}", + "@label": { + "description": "étiquette", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "library": "{count, plural, other{Bibliothèques} one{Bibliothèque}}", + "@library": { + "description": "pluriel", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "libraryFetchNoItemsFound": "Aucun élément trouvé, essayez avec des paramètres différents.", + "libraryPageSizeDesc": "Définir la quantité à charger à la fois. 0 désactive la pagination.", + "libraryPageSizeTitle": "Taille de la page de la bibliothèque", + "light": "Léger", + "list": "Liste", + "lockscreen": "Écran de verrouillage", + "loggedIn": "Connecté", + "login": "Connexion", + "logout": "Déconnexion", + "logoutUserPopupContent": "Cela déconnectera {userName} et supprimera l'utilisateur de l'application.\nVous devrez vous reconnecter à {serverName}.", + "@logoutUserPopupContent": { + "description": "Pop-up pour déconnecter l'utilisateur description", + "placeholders": { + "userName": { + "type": "String" + }, + "serverName": { + "type": "String" + } + } + }, + "logoutUserPopupTitle": "Déconnecter l'utilisateur {userName}?", + "@logoutUserPopupTitle": { + "description": "Pop-up pour déconnecter l'utilisateur", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "loop": "Boucle", + "markAsUnwatched": "Marquer comme non regardé", + "markAsWatched": "Marquer comme regardé", + "masonry": "Maçonnerie", + "mediaTypeBase": "Type de base", + "mediaTypeBook": "Livre", + "mediaTypeBoxset": "Coffret", + "mediaTypeEpisode": "Épisode", + "mediaTypeFolder": "Dossier", + "mediaTypeMovie": "Film", + "mediaTypePerson": "Personne", + "mediaTypePhoto": "Photo", + "mediaTypePhotoAlbum": "Album photo", + "mediaTypePlaylist": "Liste de lecture", + "mediaTypeSeason": "Saison", + "mediaTypeSeries": "Série", + "metaDataSavedFor": "Métadonnées enregistrées pour {item}", + "@metaDataSavedFor": { + "description": "métadonnéesEnregistréesPour", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "metadataRefreshDefault": "Rechercher des fichiers nouveaux et mis à jour", + "metadataRefreshFull": "Remplacer toutes les métadonnées", + "metadataRefreshValidation": "Rechercher des métadonnées manquantes", + "minutes": "{count, plural, other{Minutes} one{Minute}}", + "@minutes": { + "description": "minute", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "mode": "Mode", + "moreFrom": "Plus de {info}", + "@moreFrom": { + "description": "Plus de", + "placeholders": { + "info": { + "type": "String" + } + } + }, + "moreOptions": "Plus d'options", + "mouseDragSupport": "Faire glisser avec la souris", + "musicAlbum": "Album", + "name": "Nom", + "navigation": "Navigation", + "navigationDashboard": "Tableau de bord", + "navigationFavorites": "Favoris", + "navigationSync": "Synchronisé", + "never": "Jamais", + "nextUp": "Suivant", + "noItemsSynced": "Aucun élément synchronisé", + "noItemsToShow": "Aucun élément à afficher", + "noRating": "Pas de note", + "noResults": "Aucun résultat", + "noServersFound": "Aucun nouveau serveur trouvé", + "noSuggestionsFound": "Aucune suggestion trouvée", + "none": "Aucun", + "normal": "Normal", + "notPartOfAlbum": "Ne fait pas partie d'un album", + "openParent": "Ouvrir le dossier parent", + "openShow": "Ouvrir le spectacle", + "openWebLink": "Ouvrir le lien web", + "options": "Options", + "other": "Autre", + "outlineColor": "Couleur du contour", + "outlineSize": "Taille du contour", + "overview": "Aperçu", + "page": "Page {index}", + "@page": { + "description": "page", + "placeholders": { + "index": { + "type": "int" + } + } + }, + "parentalRating": "Évaluation parentale", + "password": "Mot de passe", + "pathClearTitle": "Effacer le chemin de téléchargement", + "pathEditDesc": "Cet emplacement est défini pour tous les utilisateurs, toutes les données synchronisées ne seront plus accessibles.\nElles resteront sur votre stockage.", + "pathEditSelect": "Sélectionner la destination des téléchargements", + "pathEditTitle": "Changer l'emplacement", "play": "Lire {item}", "@play": { "description": "Lire avec", @@ -46,6 +344,44 @@ } } }, + "playCount": "Nombre de lectures", + "playFrom": "Lire depuis {name}", + "@playFrom": { + "description": "jouer de", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "playFromStart": "Lire {name} depuis le début", + "@playFromStart": { + "description": "jouer depuis le début", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "playLabel": "Lire", + "playVideos": "Lire les vidéos", + "played": "Joué", + "quickConnectAction": "Entrer le code de connexion rapide pour", + "quickConnectInputACode": "Entrer un code", + "quickConnectTitle": "Connexion rapide", + "quickConnectWrongCode": "Code incorrect", + "random": "Aléatoire", + "rating": "{count, plural, other{Notes} one{Note}}", + "@rating": { + "description": "note", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "reWatch": "Revoir", "read": "Lire {item}", "@read": { "description": "lire", @@ -64,239 +400,9 @@ } } }, - "playFrom": "Lire depuis {name}", - "@playFrom": { - "description": "jouer de", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "moreFrom": "Plus de {info}", - "@moreFrom": { - "description": "Plus de", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selectedWith": "Sélectionné {info}", - "@selectedWith": { - "description": "sélectionné", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selected": "Sélectionné", - "restart": "Redémarrer", - "reWatch": "Revoir", - "watchOn": "Regarder sur", - "options": "Options", - "list": "Liste", - "grid": "Grille", - "masonry": "Maçonnerie", - "start": "Commencer", - "none": "Aucun", - "chapter": "{count, plural, other{Chapitres} one{Chapitre}}", - "@chapter": { - "description": "chapitre", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "sync": "Synchroniser", - "moreOptions": "Plus d'options", - "continuePage": "Continuer - page {page}", - "@continuePage": { - "description": "Continuer - page 1", - "placeholders": { - "page": { - "type": "int" - } - } - }, - "openShow": "Ouvrir le spectacle", - "showDetails": "Afficher les détails", - "showAlbum": "Afficher l'album", - "season": "{count, plural, other{Saisons} one{Saison}}", - "@season": { - "description": "saison", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "episode": "{count, plural, other{Épisodes} one{Épisode}}", - "@episode": { - "description": "épisode", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "addToCollection": "Ajouter à la collection", - "addToPlaylist": "Ajouter à la playlist", - "removeFromCollection": "Retirer de la collection", - "removeFromPlaylist": "Retirer de la playlist", - "markAsWatched": "Marquer comme regardé", - "markAsUnwatched": "Marquer comme non regardé", - "removeAsFavorite": "Retirer des favoris", - "addAsFavorite": "Ajouter aux favoris", - "editMetadata": "Modifier les métadonnées", + "recursive": "Récursif", + "refresh": "Rafraîchir", "refreshMetadata": "Rafraîchir les métadonnées", - "syncDetails": "Synchroniser les détails", - "identify": "Identifier", - "info": "Infos", - "clearAllSettings": "Effacer tous les paramètres", - "clearAllSettingsQuestion": "Effacer tous les paramètres?", - "unableToReverseAction": "Cette action ne peut pas être annulée, elle supprimera tous les paramètres.", - "navigationDashboard": "Tableau de bord", - "navigationFavorites": "Favoris", - "navigationSync": "Synchronisé", - "navigation": "Navigation", - "library": "{count, plural, other{Bibliothèques} one{Bibliothèque}}", - "@library": { - "description": "pluriel", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "scanLibrary": "Scanner la bibliothèque", - "dashboardContinue": "Continuer", - "dashboardContinueWatching": "Continuer à regarder", - "dashboardContinueReading": "Continuer à lire", - "dashboardContinueListening": "Continuer à écouter", - "dashboardNextUp": "Suivant", - "dashboardRecentlyAdded": "Récemment ajouté dans {name}", - "@dashboardRecentlyAdded": { - "description": "Récemment ajouté sur l'écran d'accueil", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "settings": "Paramètres", - "settingsClientTitle": "Fladder", - "settingsClientDesc": "Général, Timeout, Disposition, Thème", - "settingsQuickConnectTitle": "Connexion rapide", - "settingsProfileTitle": "Profil", - "settingsProfileDesc": "Écran de verrouillage", - "settingsPlayerTitle": "Lecteur", - "settingsPlayerDesc": "Ratio, Avancé", - "logoutUserPopupTitle": "Déconnecter l'utilisateur {userName}?", - "@logoutUserPopupTitle": { - "description": "Pop-up pour déconnecter l'utilisateur", - "placeholders": { - "userName": { - "type": "String" - } - } - }, - "logoutUserPopupContent": "Cela déconnectera {userName} et supprimera l'utilisateur de l'application.\nVous devrez vous reconnecter à {serverName}.", - "@logoutUserPopupContent": { - "description": "Pop-up pour déconnecter l'utilisateur description", - "placeholders": { - "userName": { - "type": "String" - }, - "serverName": { - "type": "String" - } - } - }, - "quickConnectTitle": "Connexion rapide", - "quickConnectAction": "Entrer le code de connexion rapide pour", - "quickConnectInputACode": "Entrer un code", - "quickConnectWrongCode": "Code incorrect", - "downloadsTitle": "Téléchargements", - "downloadsPath": "Chemin", - "pathEditTitle": "Changer l'emplacement", - "pathEditSelect": "Sélectionner la destination des téléchargements", - "pathClearTitle": "Effacer le chemin de téléchargement", - "pathEditDesc": "Cet emplacement est défini pour tous les utilisateurs, toutes les données synchronisées ne seront plus accessibles.\nElles resteront sur votre stockage.", - "downloadsSyncedData": "Données synchronisées", - "downloadsClearTitle": "Effacer les données synchronisées", - "downloadsClearDesc": "Êtes-vous sûr de vouloir supprimer toutes les données synchronisées?\nCela effacera toutes les données pour chaque utilisateur synchronisé!", - "lockscreen": "Écran de verrouillage", - "timeOut": "Timeout", - "home": "Accueil", - "settingsHomeCarouselTitle": "Carrousel du tableau de bord", - "settingsHomeCarouselDesc": "Affiche un carrousel sur l'écran du tableau de bord", - "settingsHomeNextUpTitle": "Affiches à venir", - "settingsHomeNextUpDesc": "Type d'affiches affichées sur l'écran du tableau de bord", - "settingsVisual": "Visuel", - "settingsBlurredPlaceholderTitle": "Placeholder flou", - "settingsBlurredPlaceholderDesc": "Afficher un arrière-plan flou lors du chargement des affiches", - "settingsBlurEpisodesTitle": "Flouter les prochains épisodes", - "settingsBlurEpisodesDesc": "Flouter tous les épisodes à venir", - "settingsEnableOsMediaControls": "Activer les contrôles multimédia de l'OS", - "settingsNextUpCutoffDays": "Jours de coupure suivants", - "settingsShowScaleSlider": "Afficher le curseur de taille des affiches", - "settingsPosterSize": "Taille de l'affiche", - "settingsPosterSlider": "Afficher le curseur de mise à l'échelle", - "settingsPosterPinch": "Pincer pour zoomer pour mettre à l'échelle les affiches", - "theme": "Thème", - "mode": "Mode", - "themeModeSystem": "Système", - "themeModeLight": "Clair", - "themeModeDark": "Sombre", - "themeColor": "Couleur du thème", - "color": "Couleur", - "amoledBlack": "Noir Amoled", - "hide": "Cacher", - "nextUp": "Suivant", - "settingsContinue": "Continuer", - "separate": "Séparer", - "combined": "Combiné", - "settingsSecurity": "Sécurité", - "settingSecurityApplockTitle": "Verrouillage de l'application", - "appLockTitle": "Définir la méthode de connexion pour {userName}", - "@appLockTitle": { - "description": "Pop-up pour choisir une méthode de connexion", - "placeholders": { - "userName": { - "type": "String" - } - } - }, - "biometricsFailedCheckAgain": "Échec de la biométrie, vérifiez les paramètres et réessayez", - "appLockAutoLogin": "Connexion automatique", - "appLockPasscode": "Code d'accès", - "appLockBiometrics": "Biométrie", - "settingsPlayerVideoHWAccelTitle": "Accélération matérielle", - "settingsPlayerVideoHWAccelDesc": "Utiliser le GPU pour rendre la vidéo (recommandé)", - "settingsPlayerNativeLibassAccelTitle": "Sous-titres natifs libass", - "settingsPlayerNativeLibassAccelDesc": "Utiliser le rendu des sous-titres libass du lecteur vidéo", - "settingsPlayerMobileWarning": "L'activation de l'accélération matérielle et des sous-titres natifs libass sur Android peut empêcher certains sous-titres de s'afficher.", - "settingsPlayerCustomSubtitlesTitle": "Personnaliser les sous-titres", - "settingsPlayerCustomSubtitlesDesc": "Personnaliser la taille, la couleur, la position, le contour", - "videoScalingFillScreenTitle": "Remplir l'écran", - "videoScalingFillScreenDesc": "Remplir la barre de navigation et la barre d'état", - "videoScalingFillScreenNotif": "Le remplissage de l'écran écrase l'ajustement de la vidéo, en rotation horizontale", - "videoScaling": "Mise à l'échelle de la vidéo", - "videoScalingFill": "Remplir", - "videoScalingContain": "Contenir", - "videoScalingCover": "Couverture", - "videoScalingFitWidth": "Ajuster la largeur", - "videoScalingFitHeight": "Ajuster la hauteur", - "videoScalingScaleDown": "Réduire l'échelle", - "subtitleConfiguratorPlaceHolder": "Ceci est un texte de placeholder,\nrien à voir ici.", - "subtitleConfigurator": "Configurateur de sous-titres", "refreshPopup": "Rafraîchir - {name}", "@refreshPopup": { "placeholders": { @@ -305,6 +411,41 @@ } } }, + "refreshPopupContentMetadata": "Les métadonnées sont mises à jour en fonction des paramètres et des services Internet activés dans le tableau de bord.", + "related": "Lié", + "releaseDate": "Date de sortie", + "removeAsFavorite": "Retirer des favoris", + "removeFromCollection": "Retirer de la collection", + "removeFromPlaylist": "Retirer de la playlist", + "replaceAllImages": "Remplacer toutes les images", + "replaceExistingImages": "Remplacer les images existantes", + "restart": "Redémarrer", + "result": "Résultat", + "resumable": "Reprenable", + "resume": "Reprendre {item}", + "@resume": { + "description": "reprendre", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "retrievePublicListOfUsers": "Récupérer la liste publique des utilisateurs", + "retry": "Réessayer", + "runTime": "Durée", + "save": "Enregistrer", + "saved": "Enregistré", + "scanBiometricHint": "Vérifier identité", + "scanLibrary": "Scanner la bibliothèque", + "scanYourFingerprintToAuthenticate": "Scannez votre empreinte digitale pour authentifier {user}", + "@scanYourFingerprintToAuthenticate": { + "placeholders": { + "user": { + "type": "String" + } + } + }, "scanningName": "Analyse - {name}", "@scanningName": { "placeholders": { @@ -313,258 +454,11 @@ } } }, - "refreshPopupContentMetadata": "Les métadonnées sont mises à jour en fonction des paramètres et des services Internet activés dans le tableau de bord.", - "replaceExistingImages": "Remplacer les images existantes", - "metadataRefreshDefault": "Rechercher des fichiers nouveaux et mis à jour", - "metadataRefreshValidation": "Rechercher des métadonnées manquantes", - "metadataRefreshFull": "Remplacer toutes les métadonnées", - "syncedItems": "Éléments synchronisés", - "noItemsSynced": "Aucun élément synchronisé", - "syncDeletePopupPermanent": "Cette action est permanente et supprimera tous les fichiers synchronisés localement", - "totalSize": "Taille totale : {size}", - "@totalSize": { - "placeholders": { - "size": { - "type": "String" - } - } - }, - "mediaTypeBase": "Type de base", - "mediaTypeMovie": "Film", - "mediaTypeSeries": "Série", - "mediaTypeSeason": "Saison", - "mediaTypeEpisode": "Épisode", - "mediaTypePhoto": "Photo", - "mediaTypePerson": "Personne", - "mediaTypePhotoAlbum": "Album photo", - "mediaTypeFolder": "Dossier", - "mediaTypeBoxset": "Coffret", - "mediaTypePlaylist": "Liste de lecture", - "mediaTypeBook": "Livre", - "actor": "{count, plural, other{Acteurs} one{Acteur}}", - "@actor": { - "description": "acteur", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "writer": "{count, plural, other{Écrivains} one{Écrivain}}", - "@writer": { - "description": "écrivain", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "director": "{count, plural, other{Réalisateurs} one{Réalisateur}}", - "@director": { - "description": "réalisateur", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "video": "Vidéo", - "audio": "Audio", - "subtitles": "Sous-titres", - "related": "Lié", - "all": "Tout", - "overview": "Aperçu", - "selectViewType": "Sélectionner le type de vue", - "noItemsToShow": "Aucun élément à afficher", - "sortBy": "Trier par", - "groupBy": "Grouper par", "scrollToTop": "Défiler vers le haut", - "disableFilters": "Désactiver les filtres", - "selectAll": "Tout sélectionner", - "clearSelection": "Effacer la sélection", - "shuffleVideos": "Mélanger les vidéos", - "shuffleGallery": "Mélanger la galerie", - "unknown": "Inconnu", - "favorites": "Favoris", - "recursive": "Récursif", - "genre": "{count, plural, other{Genres} one{Genre}}", - "@genre": { - "description": "genre", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "studio": "{count, plural, other{Studios} one{Studio}}", - "@studio": { - "description": "studio", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "label": "{count, plural, other{Étiquettes} one{Étiquette}}", - "@label": { - "description": "étiquette", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "group": "Groupe", - "type": "{count, plural, other{Types} one{Type}}", - "@type": { - "description": "type", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "filter": "{count, plural, other{Filtres} one{Filtre}}", - "@filter": { - "description": "filtre", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "showEmpty": "Afficher vide", - "hideEmpty": "Cacher vide", - "rating": "{count, plural, other{Notes} one{Note}}", - "@rating": { - "description": "note", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "year": "{count, plural, other{Années} one{Année}}", - "@year": { - "description": "année", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "playVideos": "Lire les vidéos", - "playLabel": "Lire", - "forceRefresh": "Forcer le rafraîchissement", - "itemCount": "Nombre d'éléments: {count}", - "@itemCount": { - "description": "Nombre d'éléments", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "invalidUrl": "URL invalide", - "invalidUrlDesc": "L'URL doit commencer par http(s)://", - "incorrectPinTryAgain": "PIN incorrect, réessayez", - "somethingWentWrongPasswordCheck": "Quelque chose s'est mal passé, vérifiez votre mot de passe", - "unableToConnectHost": "Impossible de se connecter à l'hôte", - "server": "Serveur", - "retrievePublicListOfUsers": "Récupérer la liste publique des utilisateurs", - "displayLanguage": "Langue d'affichage", - "deleteItem": "Supprimer {item}?", - "@deleteItem": { - "description": "deleteItem", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncDeleteItemTitle": "Supprimer l'élément synchronisé", - "syncDeleteItemDesc": "Supprimer toutes les données synchronisées pour?\n{item}", - "@syncDeleteItemDesc": { - "description": "Fenêtre contextuelle de suppression d'élément synchronisé", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncOpenParent": "Ouvrir le parent", - "syncRemoveDataTitle": "Supprimer les données synchronisées?", - "syncRemoveDataDesc": "Supprimer les données vidéo synchronisées? Ceci est permanent et vous devrez resynchroniser les fichiers", - "collectionFolder": "Dossier de collection", - "musicAlbum": "Album", - "active": "Actif", - "name": "Nom", - "result": "Résultat", - "close": "Fermer", - "replaceAllImages": "Remplacer toutes les images", - "noResults": "Aucun résultat", - "openWebLink": "Ouvrir le lien web", - "setIdentityTo": "Définir l'identité sur {name}", - "@setIdentityTo": { - "description": "setIdentityTo", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "somethingWentWrong": "Quelque chose a mal tourné", - "clearChanges": "Effacer les modifications", - "useDefaults": "Utiliser les paramètres par défaut", - "light": "Léger", - "normal": "Normal", - "bold": "Gras", - "fontSize": "Taille de la police", - "heightOffset": "Décalage de hauteur", - "fontColor": "Couleur de la police", - "outlineColor": "Couleur du contour", - "outlineSize": "Taille du contour", - "backgroundOpacity": "Opacité de l'arrière-plan", - "shadow": "Ombre", - "played": "Joué", - "unPlayed": "Non joué", - "resumable": "Reprenable", - "sortOrder": "Ordre de tri", - "sortName": "Nom", - "communityRating": "Évaluation de la communauté", - "parentalRating": "Évaluation parentale", - "dateAdded": "Date d'ajout", - "dateLastContentAdded": "Date du dernier contenu ajouté", - "favorite": "Favori", - "datePlayed": "Date de lecture", - "folders": "Dossiers", - "playCount": "Nombre de lectures", - "releaseDate": "Date de sortie", - "runTime": "Durée", - "ascending": "Ascendant", - "descending": "Descendant", - "playFromStart": "Lire {name} depuis le début", - "@playFromStart": { - "description": "jouer depuis le début", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "minutes": "{count, plural, other{Minutes} one{Minute}}", - "@minutes": { - "description": "minute", + "search": "Recherche", + "season": "{count, plural, other{Saisons} one{Saison}}", + "@season": { + "description": "saison", "placeholders": { "count": { "type": "int", @@ -582,23 +476,126 @@ } } }, - "page": "Page {index}", - "@page": { - "description": "page", + "selectAll": "Tout sélectionner", + "selectTime": "Sélectionner l'heure", + "selectViewType": "Sélectionner le type de vue", + "selected": "Sélectionné", + "selectedWith": "Sélectionné {info}", + "@selectedWith": { + "description": "sélectionné", "placeholders": { - "index": { - "type": "int" + "info": { + "type": "String" } } }, + "separate": "Séparer", + "server": "Serveur", "set": "Régler", "@set": { "description": "Utiliser pour définir une certaine valeur", "context": "Régler 'heure'" }, - "never": "Jamais", - "selectTime": "Sélectionner l'heure", - "immediately": "Immédiatement", + "setIdentityTo": "Définir l'identité sur {name}", + "@setIdentityTo": { + "description": "setIdentityTo", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "settingSecurityApplockTitle": "Verrouillage de l'application", + "settings": "Paramètres", + "settingsBlurEpisodesDesc": "Flouter tous les épisodes à venir", + "settingsBlurEpisodesTitle": "Flouter les prochains épisodes", + "settingsBlurredPlaceholderDesc": "Afficher un arrière-plan flou lors du chargement des affiches", + "settingsBlurredPlaceholderTitle": "Placeholder flou", + "settingsClientDesc": "Général, Timeout, Disposition, Thème", + "settingsClientTitle": "Fladder", + "settingsContinue": "Continuer", + "settingsEnableOsMediaControls": "Activer les contrôles multimédia de l'OS", + "settingsHomeCarouselDesc": "Affiche un carrousel sur l'écran du tableau de bord", + "settingsHomeCarouselTitle": "Carrousel du tableau de bord", + "settingsHomeNextUpDesc": "Type d'affiches affichées sur l'écran du tableau de bord", + "settingsHomeNextUpTitle": "Affiches à venir", + "settingsNextUpCutoffDays": "Jours de coupure suivants", + "settingsPlayerCustomSubtitlesDesc": "Personnaliser la taille, la couleur, la position, le contour", + "settingsPlayerCustomSubtitlesTitle": "Personnaliser les sous-titres", + "settingsPlayerDesc": "Ratio, Avancé", + "settingsPlayerMobileWarning": "L'activation de l'accélération matérielle et des sous-titres natifs libass sur Android peut empêcher certains sous-titres de s'afficher.", + "settingsPlayerNativeLibassAccelDesc": "Utiliser le rendu des sous-titres libass du lecteur vidéo", + "settingsPlayerNativeLibassAccelTitle": "Sous-titres natifs libass", + "settingsPlayerTitle": "Lecteur", + "settingsPlayerVideoHWAccelDesc": "Utiliser le GPU pour rendre la vidéo (recommandé)", + "settingsPlayerVideoHWAccelTitle": "Accélération matérielle", + "settingsPosterPinch": "Pincer pour zoomer pour mettre à l'échelle les affiches", + "settingsPosterSize": "Taille de l'affiche", + "settingsPosterSlider": "Afficher le curseur de mise à l'échelle", + "settingsProfileDesc": "Écran de verrouillage", + "settingsProfileTitle": "Profil", + "settingsQuickConnectTitle": "Connexion rapide", + "settingsSecurity": "Sécurité", + "settingsShowScaleSlider": "Afficher le curseur de taille des affiches", + "settingsVisual": "Visuel", + "shadow": "Ombre", + "showAlbum": "Afficher l'album", + "showDetails": "Afficher les détails", + "showEmpty": "Afficher vide", + "shuffleGallery": "Mélanger la galerie", + "shuffleVideos": "Mélanger les vidéos", + "somethingWentWrong": "Quelque chose a mal tourné", + "somethingWentWrongPasswordCheck": "Quelque chose s'est mal passé, vérifiez votre mot de passe", + "sortBy": "Trier par", + "sortName": "Nom", + "sortOrder": "Ordre de tri", + "start": "Commencer", + "studio": "{count, plural, other{Studios} one{Studio}}", + "@studio": { + "description": "studio", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "subtitleConfigurator": "Configurateur de sous-titres", + "subtitleConfiguratorPlaceHolder": "Ceci est un texte de placeholder,\nrien à voir ici.", + "subtitles": "Sous-titres", + "switchUser": "Changer d'utilisateur", + "sync": "Synchroniser", + "syncDeleteItemDesc": "Supprimer toutes les données synchronisées pour?\n{item}", + "@syncDeleteItemDesc": { + "description": "Fenêtre contextuelle de suppression d'élément synchronisé", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "syncDeleteItemTitle": "Supprimer l'élément synchronisé", + "syncDeletePopupPermanent": "Cette action est permanente et supprimera tous les fichiers synchronisés localement", + "syncDetails": "Synchroniser les détails", + "syncOpenParent": "Ouvrir le parent", + "syncRemoveDataDesc": "Supprimer les données vidéo synchronisées? Ceci est permanent et vous devrez resynchroniser les fichiers", + "syncRemoveDataTitle": "Supprimer les données synchronisées?", + "syncedItems": "Éléments synchronisés", + "tag": "{count, plural, one{Étiquette} other{Étiquettes}}", + "@tag": { + "description": "étiquette", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "theme": "Thème", + "themeColor": "Couleur du thème", + "themeModeDark": "Sombre", + "themeModeLight": "Clair", + "themeModeSystem": "Système", "timeAndAnnotation": "{minutes} et {seconds}", "@timeAndAnnotation": { "description": "timeAndAnnotation", @@ -611,47 +608,18 @@ } } }, - "scanYourFingerprintToAuthenticate": "Scannez votre empreinte digitale pour authentifier {user}", - "@scanYourFingerprintToAuthenticate": { + "timeOut": "Timeout", + "totalSize": "Taille totale : {size}", + "@totalSize": { "placeholders": { - "user": { + "size": { "type": "String" } } }, - "scanBiometricHint": "Vérifier identité", - "deleteFileFromSystem": "Supprimer cet élément {item} le supprimera à la fois du système de fichiers et de votre bibliothèque multimédia.\nÊtes-vous sûr de vouloir continuer?", - "@deleteFileFromSystem": { - "description": "Supprimer le fichier du système", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "notPartOfAlbum": "Ne fait pas partie d'un album", - "retry": "Réessayer", - "failedToLoadImage": "Échec du chargement de l'image", - "save": "Enregistrer", - "metaDataSavedFor": "Métadonnées enregistrées pour {item}", - "@metaDataSavedFor": { - "description": "métadonnéesEnregistréesPour", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "libraryPageSizeTitle": "Taille de la page de la bibliothèque", - "libraryPageSizeDesc": "Définir la quantité à charger à la fois. 0 désactive la pagination.", - "fetchingLibrary": "Chargement des éléments de la bibliothèque", - "libraryFetchNoItemsFound": "Aucun élément trouvé, essayez avec des paramètres différents.", - "noSuggestionsFound": "Aucune suggestion trouvée", - "viewPhotos": "Voir les photos", - "random": "Aléatoire", - "tag": "{count, plural, one{Étiquette} other{Étiquettes}}", - "@tag": { - "description": "étiquette", + "type": "{count, plural, other{Types} one{Type}}", + "@type": { + "description": "type", "placeholders": { "count": { "type": "int", @@ -659,11 +627,43 @@ } } }, - "saved": "Enregistré", - "discovered": "Découvert", - "noServersFound": "Aucun nouveau serveur trouvé", - "about": "À propos", - "openParent": "Ouvrir le dossier parent", - "mouseDragSupport": "Faire glisser avec la souris", - "controls": "Commandes" -} + "unPlayed": "Non joué", + "unableToConnectHost": "Impossible de se connecter à l'hôte", + "unableToReverseAction": "Cette action ne peut pas être annulée, elle supprimera tous les paramètres.", + "unknown": "Inconnu", + "useDefaults": "Utiliser les paramètres par défaut", + "userName": "Nom d'utilisateur", + "video": "Vidéo", + "videoScaling": "Mise à l'échelle de la vidéo", + "videoScalingContain": "Contenir", + "videoScalingCover": "Couverture", + "videoScalingFill": "Remplir", + "videoScalingFillScreenDesc": "Remplir la barre de navigation et la barre d'état", + "videoScalingFillScreenNotif": "Le remplissage de l'écran écrase l'ajustement de la vidéo, en rotation horizontale", + "videoScalingFillScreenTitle": "Remplir l'écran", + "videoScalingFitHeight": "Ajuster la hauteur", + "videoScalingFitWidth": "Ajuster la largeur", + "videoScalingScaleDown": "Réduire l'échelle", + "viewPhotos": "Voir les photos", + "watchOn": "Regarder sur", + "writer": "{count, plural, other{Écrivains} one{Écrivain}}", + "@writer": { + "description": "écrivain", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "year": "{count, plural, other{Années} one{Année}}", + "@year": { + "description": "année", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/app_jp.arb b/lib/l10n/app_jp.arb index 155faea..e1731f6 100644 --- a/lib/l10n/app_jp.arb +++ b/lib/l10n/app_jp.arb @@ -1,42 +1,340 @@ { "@@locale": "ja", - "switchUser": "ユーザーを切り替える", - "userName": "ユーザー名", - "password": "パスワード", - "login": "ログイン", - "logout": "ログアウト", - "cancel": "キャンセル", + "about": "情報", "accept": "承認", - "code": "コード", - "error": "エラー", - "clear": "クリア", - "days": "日", - "search": "検索", - "loggedIn": "ログイン済み", - "change": "変更", - "other": "その他", - "dynamicText": "動的", - "enabled": "有効", - "disabled": "無効", - "dashboard": "ダッシュボード", + "active": "アクティブ", + "actor": "{count, plural, other{俳優} one{俳優}}", + "@actor": { + "description": "俳優", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "addAsFavorite": "お気に入りに追加", + "addToCollection": "コレクションに追加", + "addToPlaylist": "プレイリストに追加", "advanced": "高度な", - "refresh": "リフレッシュ", - "delete": "削除", - "goTo": "行く", - "loop": "ループ", - "empty": "空", - "noRating": "評価なし", - "backgroundBlur": "背景ぼかし", + "all": "すべて", + "amoledBlack": "アモレッドブラック", + "appLockAutoLogin": "自動ログイン", + "appLockBiometrics": "生体認証", + "appLockPasscode": "パスコード", + "appLockTitle": "{userName}のログイン方法を設定", + "@appLockTitle": { + "description": "ログイン方法を選択するポップアップ", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "ascending": "昇順", + "audio": "オーディオ", "autoPlay": "自動再生", - "resume": "{item}を再開する", - "@resume": { - "description": "再開する", + "backgroundBlur": "背景ぼかし", + "backgroundOpacity": "背景の不透明度", + "biometricsFailedCheckAgain": "生体認証に失敗しました。設定を確認してもう一度お試しください。", + "bold": "ボールド", + "cancel": "キャンセル", + "change": "変更", + "chapter": "{count, plural, other{チャプター} one{チャプター}}", + "@chapter": { + "description": "チャプター", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "clear": "クリア", + "clearAllSettings": "すべての設定をクリア", + "clearAllSettingsQuestion": "すべての設定をクリアしますか?", + "clearChanges": "変更をクリア", + "clearSelection": "選択をクリア", + "close": "閉じる", + "code": "コード", + "collectionFolder": "コレクションフォルダ", + "color": "カラー", + "combined": "組み合わせ", + "communityRating": "コミュニティ評価", + "continuePage": "続行 - ページ {page}", + "@continuePage": { + "description": "続行 - ページ 1", + "placeholders": { + "page": { + "type": "int" + } + } + }, + "controls": "コントロール", + "dashboard": "ダッシュボード", + "dashboardContinue": "続行", + "dashboardContinueListening": "リスニングを続ける", + "dashboardContinueReading": "読み続ける", + "dashboardContinueWatching": "視聴を続ける", + "dashboardNextUp": "次へ", + "dashboardRecentlyAdded": "{name}に最近追加", + "@dashboardRecentlyAdded": { + "description": "ホーム画面に最近追加", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "dateAdded": "追加日", + "dateLastContentAdded": "最後にコンテンツが追加された日", + "datePlayed": "再生日", + "days": "日", + "delete": "削除", + "deleteFileFromSystem": "このアイテム {item} を削除すると、ファイルシステムとメディアライブラリの両方から削除されます。\n続行してもよろしいですか?", + "@deleteFileFromSystem": { + "description": "システムからファイルを削除", "placeholders": { "item": { "type": "String" } } }, + "deleteItem": "{item}を削除しますか?", + "@deleteItem": { + "description": "deleteItem", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "descending": "降順", + "director": "{count, plural, other{監督} one{監督}}", + "@director": { + "description": "監督", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "disableFilters": "フィルターを無効にする", + "disabled": "無効", + "discovered": "発見済み", + "displayLanguage": "表示言語", + "downloadsClearDesc": "すべての同期データを削除してもよろしいですか?\nこれにより、すべての同期ユーザーのデータがクリアされます!", + "downloadsClearTitle": "同期データをクリア", + "downloadsPath": "パス", + "downloadsSyncedData": "同期データ", + "downloadsTitle": "ダウンロード", + "dynamicText": "動的", + "editMetadata": "メタデータを編集", + "empty": "空", + "enabled": "有効", + "episode": "{count, plural, other{エピソード} one{エピソード}}", + "@episode": { + "description": "エピソード", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "error": "エラー", + "failedToLoadImage": "画像の読み込みに失敗しました", + "favorite": "お気に入り", + "favorites": "お気に入り", + "fetchingLibrary": "ライブラリアイテムを取得しています", + "filter": "{count, plural, other{フィルター} one{フィルター}}", + "@filter": { + "description": "フィルター", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "folders": "フォルダ", + "fontColor": "フォントの色", + "fontSize": "フォントサイズ", + "forceRefresh": "強制リフレッシュ", + "genre": "{count, plural, other{ジャンル} one{ジャンル}}", + "@genre": { + "description": "ジャンル", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "goTo": "行く", + "grid": "グリッド", + "group": "グループ", + "groupBy": "グループ化", + "heightOffset": "高さのオフセット", + "hide": "非表示", + "hideEmpty": "空を非表示", + "home": "ホーム", + "identify": "識別", + "immediately": "すぐに", + "incorrectPinTryAgain": "PINが間違っています、もう一度試してください", + "info": "情報", + "invalidUrl": "無効なURL", + "invalidUrlDesc": "URLはhttp(s)://で始まる必要があります", + "itemCount": "アイテム数: {count}", + "@itemCount": { + "description": "アイテム数", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "label": "{count, plural, other{ラベル} one{ラベル}}", + "@label": { + "description": "ラベル", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "library": "{count, plural, other{ライブラリ} one{ライブラリ}}", + "@library": { + "description": "複数", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "libraryFetchNoItemsFound": "アイテムが見つかりませんでした。設定を変更してみてください。", + "libraryPageSizeDesc": "一度に読み込む量を設定します。0はページングを無効にします。", + "libraryPageSizeTitle": "ライブラリページのサイズ", + "light": "ライト", + "list": "リスト", + "lockscreen": "ロック画面", + "loggedIn": "ログイン済み", + "login": "ログイン", + "logout": "ログアウト", + "logoutUserPopupContent": "これにより、{userName} がログアウトされ、アプリからユーザーが削除されます。\n{serverName}に再ログインする必要があります。", + "@logoutUserPopupContent": { + "description": "ユーザーをログアウトするためのポップアップの説明", + "placeholders": { + "userName": { + "type": "String" + }, + "serverName": { + "type": "String" + } + } + }, + "logoutUserPopupTitle": "ユーザー {userName} をログアウトしますか?", + "@logoutUserPopupTitle": { + "description": "ユーザーをログアウトするためのポップアップ", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "loop": "ループ", + "markAsUnwatched": "未視聴にマーク", + "markAsWatched": "視聴済みにマーク", + "masonry": "石工", + "mediaTypeBase": "基本タイプ", + "mediaTypeBook": "本", + "mediaTypeBoxset": "ボックスセット", + "mediaTypeEpisode": "エピソード", + "mediaTypeFolder": "フォルダー", + "mediaTypeMovie": "映画", + "mediaTypePerson": "人物", + "mediaTypePhoto": "写真", + "mediaTypePhotoAlbum": "フォトアルバム", + "mediaTypePlaylist": "プレイリスト", + "mediaTypeSeason": "シーズン", + "mediaTypeSeries": "シリーズ", + "metaDataSavedFor": "{item} のメタデータが保存されました", + "@metaDataSavedFor": { + "description": "メタデータが保存されました", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "metadataRefreshDefault": "新しいファイルと更新されたファイルをスキャン", + "metadataRefreshFull": "すべてのメタデータを置き換える", + "metadataRefreshValidation": "欠落しているメタデータを検索", + "minutes": "分", + "@minutes": { + "description": "分", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "mode": "モード", + "moreFrom": "{info}の詳細", + "@moreFrom": { + "description": "詳細", + "placeholders": { + "info": { + "type": "String" + } + } + }, + "moreOptions": "その他のオプション", + "mouseDragSupport": "マウスでドラッグ", + "musicAlbum": "アルバム", + "name": "名前", + "navigation": "ナビゲーション", + "navigationDashboard": "ダッシュボード", + "navigationFavorites": "お気に入り", + "navigationSync": "同期済み", + "never": "なし", + "nextUp": "次へ", + "noItemsSynced": "同期されたアイテムはありません", + "noItemsToShow": "表示するアイテムがありません", + "noRating": "評価なし", + "noResults": "結果がありません", + "noServersFound": "新しいサーバーが見つかりません", + "noSuggestionsFound": "提案が見つかりません", + "none": "なし", + "normal": "ノーマル", + "notPartOfAlbum": "アルバムの一部ではありません", + "openParent": "親フォルダを開く", + "openShow": "番組を開く", + "openWebLink": "ウェブリンクを開く", + "options": "オプション", + "other": "その他", + "outlineColor": "アウトラインの色", + "outlineSize": "アウトラインのサイズ", + "overview": "概要", + "page": "{index} ページ", + "@page": { + "description": "ページ", + "placeholders": { + "index": { + "type": "int" + } + } + }, + "parentalRating": "ペアレンタル評価", + "password": "パスワード", + "pathClearTitle": "ダウンロードパスをクリア", + "pathEditDesc": "この場所はすべてのユーザーに設定されており、同期されたデータはもうアクセスできません。\nストレージに残ります。", + "pathEditSelect": "ダウンロード先を選択", + "pathEditTitle": "場所を変更", "play": "{item}を再生する", "@play": { "description": "再生する", @@ -46,6 +344,44 @@ } } }, + "playCount": "再生回数", + "playFrom": "{name}から再生する", + "@playFrom": { + "description": "から再生する", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "playFromStart": "{name} を最初から再生", + "@playFromStart": { + "description": "最初から再生", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "playLabel": "再生", + "playVideos": "ビデオを再生", + "played": "再生済み", + "quickConnectAction": "クイック接続コードを入力", + "quickConnectInputACode": "コードを入力", + "quickConnectTitle": "クイック接続", + "quickConnectWrongCode": "コードが間違っています", + "random": "ランダム", + "rating": "{count, plural, other{評価} one{評価}}", + "@rating": { + "description": "評価", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "reWatch": "再視聴", "read": "{item}を読む", "@read": { "description": "読む", @@ -64,239 +400,9 @@ } } }, - "playFrom": "{name}から再生する", - "@playFrom": { - "description": "から再生する", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "moreFrom": "{info}の詳細", - "@moreFrom": { - "description": "詳細", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selectedWith": "{info}を選択済み", - "@selectedWith": { - "description": "選択済み", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selected": "選択済み", - "restart": "再起動", - "reWatch": "再視聴", - "watchOn": "で見る", - "options": "オプション", - "list": "リスト", - "grid": "グリッド", - "masonry": "石工", - "start": "スタート", - "none": "なし", - "chapter": "{count, plural, other{チャプター} one{チャプター}}", - "@chapter": { - "description": "チャプター", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "sync": "同期", - "moreOptions": "その他のオプション", - "continuePage": "続行 - ページ {page}", - "@continuePage": { - "description": "続行 - ページ 1", - "placeholders": { - "page": { - "type": "int" - } - } - }, - "openShow": "番組を開く", - "showDetails": "詳細を表示", - "showAlbum": "アルバムを表示", - "season": "{count, plural, other{シーズン} one{シーズン}}", - "@season": { - "description": "シーズン", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "episode": "{count, plural, other{エピソード} one{エピソード}}", - "@episode": { - "description": "エピソード", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "addToCollection": "コレクションに追加", - "addToPlaylist": "プレイリストに追加", - "removeFromCollection": "コレクションから削除", - "removeFromPlaylist": "プレイリストから削除", - "markAsWatched": "視聴済みにマーク", - "markAsUnwatched": "未視聴にマーク", - "removeAsFavorite": "お気に入りから削除", - "addAsFavorite": "お気に入りに追加", - "editMetadata": "メタデータを編集", + "recursive": "再帰的", + "refresh": "リフレッシュ", "refreshMetadata": "メタデータを更新", - "syncDetails": "詳細を同期", - "identify": "識別", - "info": "情報", - "clearAllSettings": "すべての設定をクリア", - "clearAllSettingsQuestion": "すべての設定をクリアしますか?", - "unableToReverseAction": "この操作は元に戻せません。すべての設定が削除されます。", - "navigationDashboard": "ダッシュボード", - "navigationFavorites": "お気に入り", - "navigationSync": "同期済み", - "navigation": "ナビゲーション", - "library": "{count, plural, other{ライブラリ} one{ライブラリ}}", - "@library": { - "description": "複数", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "scanLibrary": "ライブラリをスキャン", - "dashboardContinue": "続行", - "dashboardContinueWatching": "視聴を続ける", - "dashboardContinueReading": "読み続ける", - "dashboardContinueListening": "リスニングを続ける", - "dashboardNextUp": "次へ", - "dashboardRecentlyAdded": "{name}に最近追加", - "@dashboardRecentlyAdded": { - "description": "ホーム画面に最近追加", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "settings": "設定", - "settingsClientTitle": "Fladder", - "settingsClientDesc": "一般, タイムアウト, レイアウト, テーマ", - "settingsQuickConnectTitle": "クイック接続", - "settingsProfileTitle": "プロフィール", - "settingsProfileDesc": "ロック画面", - "settingsPlayerTitle": "プレーヤー", - "settingsPlayerDesc": "アスペクト比, 高度な", - "logoutUserPopupTitle": "ユーザー {userName} をログアウトしますか?", - "@logoutUserPopupTitle": { - "description": "ユーザーをログアウトするためのポップアップ", - "placeholders": { - "userName": { - "type": "String" - } - } - }, - "logoutUserPopupContent": "これにより、{userName} がログアウトされ、アプリからユーザーが削除されます。\n{serverName}に再ログインする必要があります。", - "@logoutUserPopupContent": { - "description": "ユーザーをログアウトするためのポップアップの説明", - "placeholders": { - "userName": { - "type": "String" - }, - "serverName": { - "type": "String" - } - } - }, - "quickConnectTitle": "クイック接続", - "quickConnectAction": "クイック接続コードを入力", - "quickConnectInputACode": "コードを入力", - "quickConnectWrongCode": "コードが間違っています", - "downloadsTitle": "ダウンロード", - "downloadsPath": "パス", - "pathEditTitle": "場所を変更", - "pathEditSelect": "ダウンロード先を選択", - "pathClearTitle": "ダウンロードパスをクリア", - "pathEditDesc": "この場所はすべてのユーザーに設定されており、同期されたデータはもうアクセスできません。\nストレージに残ります。", - "downloadsSyncedData": "同期データ", - "downloadsClearTitle": "同期データをクリア", - "downloadsClearDesc": "すべての同期データを削除してもよろしいですか?\nこれにより、すべての同期ユーザーのデータがクリアされます!", - "lockscreen": "ロック画面", - "timeOut": "タイムアウト", - "home": "ホーム", - "settingsHomeCarouselTitle": "ダッシュボードのカルーセル", - "settingsHomeCarouselDesc": "ダッシュボード画面にカルーセルを表示", - "settingsHomeNextUpTitle": "次のポスター", - "settingsHomeNextUpDesc": "ダッシュボード画面に表示されるポスターの種類", - "settingsVisual": "ビジュアル", - "settingsBlurredPlaceholderTitle": "ぼかしプレースホルダー", - "settingsBlurredPlaceholderDesc": "ポスターの読み込み中にぼかし背景を表示", - "settingsBlurEpisodesTitle": "次のエピソードをぼかす", - "settingsBlurEpisodesDesc": "次のエピソードをすべてぼかす", - "settingsEnableOsMediaControls": "OSメディアコントロールを有効にする", - "settingsNextUpCutoffDays": "次のカットオフ日", - "settingsShowScaleSlider": "ポスターサイズスライダーを表示", - "settingsPosterSize": "ポスターサイズ", - "settingsPosterSlider": "スケールスライダーを表示", - "settingsPosterPinch": "ポスターをスケールするためにピンチズーム", - "theme": "テーマ", - "mode": "モード", - "themeModeSystem": "システム", - "themeModeLight": "ライト", - "themeModeDark": "ダーク", - "themeColor": "テーマカラー", - "color": "カラー", - "amoledBlack": "アモレッドブラック", - "hide": "非表示", - "nextUp": "次へ", - "settingsContinue": "続行", - "separate": "分離", - "combined": "組み合わせ", - "settingsSecurity": "セキュリティ", - "settingSecurityApplockTitle": "アプリロック", - "appLockTitle": "{userName}のログイン方法を設定", - "@appLockTitle": { - "description": "ログイン方法を選択するポップアップ", - "placeholders": { - "userName": { - "type": "String" - } - } - }, - "biometricsFailedCheckAgain": "生体認証に失敗しました。設定を確認してもう一度お試しください。", - "appLockAutoLogin": "自動ログイン", - "appLockPasscode": "パスコード", - "appLockBiometrics": "生体認証", - "settingsPlayerVideoHWAccelTitle": "ハードウェアアクセラレーション", - "settingsPlayerVideoHWAccelDesc": "ビデオをレンダリングするためにGPUを使用する(推奨)", - "settingsPlayerNativeLibassAccelTitle": "ネイティブlibass字幕", - "settingsPlayerNativeLibassAccelDesc": "ビデオプレーヤーlibass字幕レンダラーを使用する", - "settingsPlayerMobileWarning": "Androidでハードウェアアクセラレーションとネイティブlibass字幕を有効にすると、一部の字幕がレンダリングされない場合があります。", - "settingsPlayerCustomSubtitlesTitle": "字幕のカスタマイズ", - "settingsPlayerCustomSubtitlesDesc": "サイズ、色、位置、アウトラインをカスタマイズする", - "videoScalingFillScreenTitle": "画面全体に表示", - "videoScalingFillScreenDesc": "ナビゲーションバーとステータスバーを埋める", - "videoScalingFillScreenNotif": "画面全体はビデオフィットを上書きし、水平回転で", - "videoScaling": "ビデオスケーリング", - "videoScalingFill": "全体に表示", - "videoScalingContain": "含む", - "videoScalingCover": "カバー", - "videoScalingFitWidth": "幅に合わせる", - "videoScalingFitHeight": "高さに合わせる", - "videoScalingScaleDown": "スケールダウン", - "subtitleConfiguratorPlaceHolder": "これはプレースホルダーテキストです。\nここには何もありません。", - "subtitleConfigurator": "字幕コンフィギュレーター", "refreshPopup": "リフレッシュ - {name}", "@refreshPopup": { "placeholders": { @@ -305,6 +411,41 @@ } } }, + "refreshPopupContentMetadata": "メタデータはダッシュボードで有効にされた設定とインターネットサービスに基づいて更新されます。", + "related": "関連", + "releaseDate": "リリース日", + "removeAsFavorite": "お気に入りから削除", + "removeFromCollection": "コレクションから削除", + "removeFromPlaylist": "プレイリストから削除", + "replaceAllImages": "すべての画像を置き換える", + "replaceExistingImages": "既存の画像を置き換える", + "restart": "再起動", + "result": "結果", + "resumable": "再開可能", + "resume": "{item}を再開する", + "@resume": { + "description": "再開する", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "retrievePublicListOfUsers": "ユーザーの公開リストを取得", + "retry": "再試行", + "runTime": "再生時間", + "save": "保存", + "saved": "保存済み", + "scanBiometricHint": "身元を確認する", + "scanLibrary": "ライブラリをスキャン", + "scanYourFingerprintToAuthenticate": "指紋をスキャンして{user}を認証してください", + "@scanYourFingerprintToAuthenticate": { + "placeholders": { + "user": { + "type": "String" + } + } + }, "scanningName": "スキャン中 - {name}", "@scanningName": { "placeholders": { @@ -313,258 +454,11 @@ } } }, - "refreshPopupContentMetadata": "メタデータはダッシュボードで有効にされた設定とインターネットサービスに基づいて更新されます。", - "replaceExistingImages": "既存の画像を置き換える", - "metadataRefreshDefault": "新しいファイルと更新されたファイルをスキャン", - "metadataRefreshValidation": "欠落しているメタデータを検索", - "metadataRefreshFull": "すべてのメタデータを置き換える", - "syncedItems": "同期されたアイテム", - "noItemsSynced": "同期されたアイテムはありません", - "syncDeletePopupPermanent": "この操作は恒久的であり、すべてのローカルに同期されたファイルを削除します", - "totalSize": "合計サイズ: {size}", - "@totalSize": { - "placeholders": { - "size": { - "type": "String" - } - } - }, - "mediaTypeBase": "基本タイプ", - "mediaTypeMovie": "映画", - "mediaTypeSeries": "シリーズ", - "mediaTypeSeason": "シーズン", - "mediaTypeEpisode": "エピソード", - "mediaTypePhoto": "写真", - "mediaTypePerson": "人物", - "mediaTypePhotoAlbum": "フォトアルバム", - "mediaTypeFolder": "フォルダー", - "mediaTypeBoxset": "ボックスセット", - "mediaTypePlaylist": "プレイリスト", - "mediaTypeBook": "本", - "actor": "{count, plural, other{俳優} one{俳優}}", - "@actor": { - "description": "俳優", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "writer": "{count, plural, other{作家} one{作家}}", - "@writer": { - "description": "作家", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "director": "{count, plural, other{監督} one{監督}}", - "@director": { - "description": "監督", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "video": "ビデオ", - "audio": "オーディオ", - "subtitles": "字幕", - "related": "関連", - "all": "すべて", - "overview": "概要", - "selectViewType": "ビュータイプを選択", - "noItemsToShow": "表示するアイテムがありません", - "sortBy": "並び替え", - "groupBy": "グループ化", "scrollToTop": "トップにスクロール", - "disableFilters": "フィルターを無効にする", - "selectAll": "すべて選択", - "clearSelection": "選択をクリア", - "shuffleVideos": "ビデオをシャッフル", - "shuffleGallery": "ギャラリーをシャッフル", - "unknown": "不明", - "favorites": "お気に入り", - "recursive": "再帰的", - "genre": "{count, plural, other{ジャンル} one{ジャンル}}", - "@genre": { - "description": "ジャンル", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "studio": "{count, plural, other{スタジオ} one{スタジオ}}", - "@studio": { - "description": "スタジオ", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "label": "{count, plural, other{ラベル} one{ラベル}}", - "@label": { - "description": "ラベル", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "group": "グループ", - "type": "{count, plural, other{タイプ} one{タイプ}}", - "@type": { - "description": "タイプ", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "filter": "{count, plural, other{フィルター} one{フィルター}}", - "@filter": { - "description": "フィルター", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "showEmpty": "空を表示", - "hideEmpty": "空を非表示", - "rating": "{count, plural, other{評価} one{評価}}", - "@rating": { - "description": "評価", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "year": "{count, plural, other{年} one{年}}", - "@year": { - "description": "年", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "playVideos": "ビデオを再生", - "playLabel": "再生", - "forceRefresh": "強制リフレッシュ", - "itemCount": "アイテム数: {count}", - "@itemCount": { - "description": "アイテム数", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "invalidUrl": "無効なURL", - "invalidUrlDesc": "URLはhttp(s)://で始まる必要があります", - "incorrectPinTryAgain": "PINが間違っています、もう一度試してください", - "somethingWentWrongPasswordCheck": "何かがうまくいかなかった、パスワードを確認してください", - "unableToConnectHost": "ホストに接続できません", - "server": "サーバー", - "retrievePublicListOfUsers": "ユーザーの公開リストを取得", - "displayLanguage": "表示言語", - "deleteItem": "{item}を削除しますか?", - "@deleteItem": { - "description": "deleteItem", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncDeleteItemTitle": "同期されたアイテムを削除", - "syncDeleteItemDesc": "すべての同期されたデータを削除しますか?\n{item}", - "@syncDeleteItemDesc": { - "description": "同期削除アイテムのポップアップウィンドウ", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncOpenParent": "親を開く", - "syncRemoveDataTitle": "同期データを削除しますか?", - "syncRemoveDataDesc": "同期されたビデオデータを削除しますか?これは永久的なもので、ファイルを再同期する必要があります", - "collectionFolder": "コレクションフォルダ", - "musicAlbum": "アルバム", - "active": "アクティブ", - "name": "名前", - "result": "結果", - "close": "閉じる", - "replaceAllImages": "すべての画像を置き換える", - "noResults": "結果がありません", - "openWebLink": "ウェブリンクを開く", - "setIdentityTo": "{name}にアイデンティティを設定", - "@setIdentityTo": { - "description": "setIdentityTo", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "somethingWentWrong": "問題が発生しました", - "clearChanges": "変更をクリア", - "useDefaults": "デフォルトを使用", - "light": "ライト", - "normal": "ノーマル", - "bold": "ボールド", - "fontSize": "フォントサイズ", - "heightOffset": "高さのオフセット", - "fontColor": "フォントの色", - "outlineColor": "アウトラインの色", - "outlineSize": "アウトラインのサイズ", - "backgroundOpacity": "背景の不透明度", - "shadow": "影", - "played": "再生済み", - "unPlayed": "未再生", - "resumable": "再開可能", - "sortOrder": "並び順", - "sortName": "名前", - "communityRating": "コミュニティ評価", - "parentalRating": "ペアレンタル評価", - "dateAdded": "追加日", - "dateLastContentAdded": "最後にコンテンツが追加された日", - "favorite": "お気に入り", - "datePlayed": "再生日", - "folders": "フォルダ", - "playCount": "再生回数", - "releaseDate": "リリース日", - "runTime": "再生時間", - "ascending": "昇順", - "descending": "降順", - "playFromStart": "{name} を最初から再生", - "@playFromStart": { - "description": "最初から再生", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "minutes": "分", - "@minutes": { - "description": "分", + "search": "検索", + "season": "{count, plural, other{シーズン} one{シーズン}}", + "@season": { + "description": "シーズン", "placeholders": { "count": { "type": "int", @@ -582,23 +476,126 @@ } } }, - "page": "{index} ページ", - "@page": { - "description": "ページ", + "selectAll": "すべて選択", + "selectTime": "時間を選択", + "selectViewType": "ビュータイプを選択", + "selected": "選択済み", + "selectedWith": "{info}を選択済み", + "@selectedWith": { + "description": "選択済み", "placeholders": { - "index": { - "type": "int" + "info": { + "type": "String" } } }, + "separate": "分離", + "server": "サーバー", "set": "設定", "@set": { "description": "特定の値を設定するために使用", "context": "時間を設定" }, - "never": "なし", - "selectTime": "時間を選択", - "immediately": "すぐに", + "setIdentityTo": "{name}にアイデンティティを設定", + "@setIdentityTo": { + "description": "setIdentityTo", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "settingSecurityApplockTitle": "アプリロック", + "settings": "設定", + "settingsBlurEpisodesDesc": "次のエピソードをすべてぼかす", + "settingsBlurEpisodesTitle": "次のエピソードをぼかす", + "settingsBlurredPlaceholderDesc": "ポスターの読み込み中にぼかし背景を表示", + "settingsBlurredPlaceholderTitle": "ぼかしプレースホルダー", + "settingsClientDesc": "一般, タイムアウト, レイアウト, テーマ", + "settingsClientTitle": "Fladder", + "settingsContinue": "続行", + "settingsEnableOsMediaControls": "OSメディアコントロールを有効にする", + "settingsHomeCarouselDesc": "ダッシュボード画面にカルーセルを表示", + "settingsHomeCarouselTitle": "ダッシュボードのカルーセル", + "settingsHomeNextUpDesc": "ダッシュボード画面に表示されるポスターの種類", + "settingsHomeNextUpTitle": "次のポスター", + "settingsNextUpCutoffDays": "次のカットオフ日", + "settingsPlayerCustomSubtitlesDesc": "サイズ、色、位置、アウトラインをカスタマイズする", + "settingsPlayerCustomSubtitlesTitle": "字幕のカスタマイズ", + "settingsPlayerDesc": "アスペクト比, 高度な", + "settingsPlayerMobileWarning": "Androidでハードウェアアクセラレーションとネイティブlibass字幕を有効にすると、一部の字幕がレンダリングされない場合があります。", + "settingsPlayerNativeLibassAccelDesc": "ビデオプレーヤーlibass字幕レンダラーを使用する", + "settingsPlayerNativeLibassAccelTitle": "ネイティブlibass字幕", + "settingsPlayerTitle": "プレーヤー", + "settingsPlayerVideoHWAccelDesc": "ビデオをレンダリングするためにGPUを使用する(推奨)", + "settingsPlayerVideoHWAccelTitle": "ハードウェアアクセラレーション", + "settingsPosterPinch": "ポスターをスケールするためにピンチズーム", + "settingsPosterSize": "ポスターサイズ", + "settingsPosterSlider": "スケールスライダーを表示", + "settingsProfileDesc": "ロック画面", + "settingsProfileTitle": "プロフィール", + "settingsQuickConnectTitle": "クイック接続", + "settingsSecurity": "セキュリティ", + "settingsShowScaleSlider": "ポスターサイズスライダーを表示", + "settingsVisual": "ビジュアル", + "shadow": "影", + "showAlbum": "アルバムを表示", + "showDetails": "詳細を表示", + "showEmpty": "空を表示", + "shuffleGallery": "ギャラリーをシャッフル", + "shuffleVideos": "ビデオをシャッフル", + "somethingWentWrong": "問題が発生しました", + "somethingWentWrongPasswordCheck": "何かがうまくいかなかった、パスワードを確認してください", + "sortBy": "並び替え", + "sortName": "名前", + "sortOrder": "並び順", + "start": "スタート", + "studio": "{count, plural, other{スタジオ} one{スタジオ}}", + "@studio": { + "description": "スタジオ", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "subtitleConfigurator": "字幕コンフィギュレーター", + "subtitleConfiguratorPlaceHolder": "これはプレースホルダーテキストです。\nここには何もありません。", + "subtitles": "字幕", + "switchUser": "ユーザーを切り替える", + "sync": "同期", + "syncDeleteItemDesc": "すべての同期されたデータを削除しますか?\n{item}", + "@syncDeleteItemDesc": { + "description": "同期削除アイテムのポップアップウィンドウ", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "syncDeleteItemTitle": "同期されたアイテムを削除", + "syncDeletePopupPermanent": "この操作は恒久的であり、すべてのローカルに同期されたファイルを削除します", + "syncDetails": "詳細を同期", + "syncOpenParent": "親を開く", + "syncRemoveDataDesc": "同期されたビデオデータを削除しますか?これは永久的なもので、ファイルを再同期する必要があります", + "syncRemoveDataTitle": "同期データを削除しますか?", + "syncedItems": "同期されたアイテム", + "tag": "{count, plural, one{タグ} other{タグ}}", + "@tag": { + "description": "タグ", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "theme": "テーマ", + "themeColor": "テーマカラー", + "themeModeDark": "ダーク", + "themeModeLight": "ライト", + "themeModeSystem": "システム", "timeAndAnnotation": "{minutes} と {seconds}", "@timeAndAnnotation": { "description": "timeAndAnnotation", @@ -611,47 +608,18 @@ } } }, - "scanYourFingerprintToAuthenticate": "指紋をスキャンして{user}を認証してください", - "@scanYourFingerprintToAuthenticate": { + "timeOut": "タイムアウト", + "totalSize": "合計サイズ: {size}", + "@totalSize": { "placeholders": { - "user": { + "size": { "type": "String" } } }, - "scanBiometricHint": "身元を確認する", - "deleteFileFromSystem": "このアイテム {item} を削除すると、ファイルシステムとメディアライブラリの両方から削除されます。\n続行してもよろしいですか?", - "@deleteFileFromSystem": { - "description": "システムからファイルを削除", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "notPartOfAlbum": "アルバムの一部ではありません", - "retry": "再試行", - "failedToLoadImage": "画像の読み込みに失敗しました", - "save": "保存", - "metaDataSavedFor": "{item} のメタデータが保存されました", - "@metaDataSavedFor": { - "description": "メタデータが保存されました", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "libraryPageSizeTitle": "ライブラリページのサイズ", - "libraryPageSizeDesc": "一度に読み込む量を設定します。0はページングを無効にします。", - "fetchingLibrary": "ライブラリアイテムを取得しています", - "libraryFetchNoItemsFound": "アイテムが見つかりませんでした。設定を変更してみてください。", - "noSuggestionsFound": "提案が見つかりません", - "viewPhotos": "写真を見る", - "random": "ランダム", - "tag": "{count, plural, one{タグ} other{タグ}}", - "@tag": { - "description": "タグ", + "type": "{count, plural, other{タイプ} one{タイプ}}", + "@type": { + "description": "タイプ", "placeholders": { "count": { "type": "int", @@ -659,11 +627,43 @@ } } }, - "saved": "保存済み", - "discovered": "発見済み", - "noServersFound": "新しいサーバーが見つかりません", - "about": "情報", - "openParent": "親フォルダを開く", - "mouseDragSupport": "マウスでドラッグ", - "controls": "コントロール" -} + "unPlayed": "未再生", + "unableToConnectHost": "ホストに接続できません", + "unableToReverseAction": "この操作は元に戻せません。すべての設定が削除されます。", + "unknown": "不明", + "useDefaults": "デフォルトを使用", + "userName": "ユーザー名", + "video": "ビデオ", + "videoScaling": "ビデオスケーリング", + "videoScalingContain": "含む", + "videoScalingCover": "カバー", + "videoScalingFill": "全体に表示", + "videoScalingFillScreenDesc": "ナビゲーションバーとステータスバーを埋める", + "videoScalingFillScreenNotif": "画面全体はビデオフィットを上書きし、水平回転で", + "videoScalingFillScreenTitle": "画面全体に表示", + "videoScalingFitHeight": "高さに合わせる", + "videoScalingFitWidth": "幅に合わせる", + "videoScalingScaleDown": "スケールダウン", + "viewPhotos": "写真を見る", + "watchOn": "で見る", + "writer": "{count, plural, other{作家} one{作家}}", + "@writer": { + "description": "作家", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "year": "{count, plural, other{年} one{年}}", + "@year": { + "description": "年", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 1440ee2..2f4eba5 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -1,42 +1,340 @@ { "@@locale": "nl", - "switchUser": "Wissel gebruiker", - "userName": "Gebruikersnaam", - "password": "Wachtwoord", - "login": "Inloggen", - "logout": "Uitloggen", - "cancel": "Annuleren", + "about": "Over", "accept": "Accepteren", - "code": "Code", - "error": "Fout", - "clear": "Wissen", - "days": "Dagen", - "search": "Zoeken", - "loggedIn": "Ingelogd", - "change": "Wijzig", - "other": "Overig", - "dynamicText": "Dynamisch", - "enabled": "Ingeschakeld", - "disabled": "Uitgeschakeld", - "dashboard": "Dashboard", + "active": "Actief", + "actor": "{count, plural, other{Acteurs} one{Acteur}}", + "@actor": { + "description": "acteur", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "addAsFavorite": "Toevoegen als favoriet", + "addToCollection": "Toevoegen aan collectie", + "addToPlaylist": "Toevoegen aan afspeellijst", "advanced": "Geavanceerd", - "refresh": "Vernieuwen", - "delete": "Verwijderen", - "goTo": "Ga naar", - "loop": "Lus", - "empty": "Leeg", - "noRating": "Geen beoordeling", - "backgroundBlur": "Achtergrond vervagen", + "all": "Alles", + "amoledBlack": "Amoled zwart", + "appLockAutoLogin": "Automatisch inloggen", + "appLockBiometrics": "Biometrie", + "appLockPasscode": "Wachtwoord", + "appLockTitle": "Stel de inlogmethode in voor {userName}", + "@appLockTitle": { + "description": "Pop-up om een inlogmethode te kiezen", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "ascending": "Oplopend", + "audio": "Audio", "autoPlay": "Automatisch afspelen", - "resume": "{item} Hervatten", - "@resume": { - "description": "hervatten", + "backgroundBlur": "Achtergrond vervagen", + "backgroundOpacity": "Achtergrond doorzichtigheid", + "biometricsFailedCheckAgain": "Biometrie mislukt, controleer de instellingen en probeer opnieuw", + "bold": "Vet", + "cancel": "Annuleren", + "change": "Wijzig", + "chapter": "{count, plural, other{Hoofdstukken} one{Hoofdstuk}}", + "@chapter": { + "description": "hoofdstuk", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "clear": "Wissen", + "clearAllSettings": "Alle instellingen wissen", + "clearAllSettingsQuestion": "Alle instellingen wissen?", + "clearChanges": "Wijzigingen wissen", + "clearSelection": "Selectie wissen", + "close": "Sluiten", + "code": "Code", + "collectionFolder": "Collectiemap", + "color": "Kleur", + "combined": "Gecombineerd", + "communityRating": "Gemeenschapswaardering", + "continuePage": "Doorgaan - pagina {page}", + "@continuePage": { + "description": "Doorgaan - pagina 1", + "placeholders": { + "page": { + "type": "int" + } + } + }, + "controls": "Bediening", + "dashboard": "Dashboard", + "dashboardContinue": "Doorgaan", + "dashboardContinueListening": "Doorgaan met luisteren", + "dashboardContinueReading": "Doorgaan met lezen", + "dashboardContinueWatching": "Doorgaan met kijken", + "dashboardNextUp": "Volgende", + "dashboardRecentlyAdded": "Onlangs toegevoegd in {name}", + "@dashboardRecentlyAdded": { + "description": "Onlangs toegevoegd op startscherm", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "dateAdded": "Datum toegevoegd", + "dateLastContentAdded": "Datum laatste inhoud toegevoegd", + "datePlayed": "Datum afgespeeld", + "days": "Dagen", + "delete": "Verwijderen", + "deleteFileFromSystem": "Het verwijderen van dit item {item} zal het zowel uit het bestandssysteem als uit je mediatheek verwijderen.\nWeet je zeker dat je wilt doorgaan?", + "@deleteFileFromSystem": { + "description": "Bestand uit systeem verwijderen", "placeholders": { "item": { "type": "String" } } }, + "deleteItem": "{item} verwijderen?", + "@deleteItem": { + "description": "deleteItem", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "descending": "Aflopend", + "director": "{count, plural, other{Regisseurs} one{Regisseur}}", + "@director": { + "description": "regisseur", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "disableFilters": "Filters uitschakelen", + "disabled": "Uitgeschakeld", + "discovered": "Ontdekt", + "displayLanguage": "Weergavetaal", + "downloadsClearDesc": "Weet je zeker dat je alle gesynchroniseerde gegevens wilt verwijderen?\nDit wist alle gegevens voor elke gesynchroniseerde gebruiker!", + "downloadsClearTitle": "Gesynchroniseerde gegevens wissen", + "downloadsPath": "Pad", + "downloadsSyncedData": "Gesynchroniseerde gegevens", + "downloadsTitle": "Downloads", + "dynamicText": "Dynamisch", + "editMetadata": "Metadata bewerken", + "empty": "Leeg", + "enabled": "Ingeschakeld", + "episode": "{count, plural, other{Afleveringen} one{Aflevering}}", + "@episode": { + "description": "aflevering", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "error": "Fout", + "failedToLoadImage": "Kan afbeelding niet laden", + "favorite": "Favoriet", + "favorites": "Favorieten", + "fetchingLibrary": "Bibliotheek items ophalen", + "filter": "{count, plural, other{Filters} one{Filter}}", + "@filter": { + "description": "filter", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "folders": "Mappen", + "fontColor": "Letterkleur", + "fontSize": "Lettergrootte", + "forceRefresh": "Geforceerd vernieuwen", + "genre": "{count, plural, other{Genres} one{Genre}}", + "@genre": { + "description": "genre", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "goTo": "Ga naar", + "grid": "Raster", + "group": "Groeperen", + "groupBy": "Groepeer op", + "heightOffset": "Hoogte-offset", + "hide": "Verbergen", + "hideEmpty": "Verberg leeg", + "home": "Home", + "identify": "Identificeren", + "immediately": "Direct", + "incorrectPinTryAgain": "Onjuiste pin, probeer opnieuw", + "info": "Info", + "invalidUrl": "Ongeldige url", + "invalidUrlDesc": "Url moet beginnen met http(s)://", + "itemCount": "Aantal items: {count}", + "@itemCount": { + "description": "Aantal items", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "label": "{count, plural, other{Labels} one{Label}}", + "@label": { + "description": "label", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "library": "{count, plural, other{Bibliotheken} one{Bibliotheek}}", + "@library": { + "description": "meervoud", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "libraryFetchNoItemsFound": "Geen items gevonden, probeer andere instellingen.", + "libraryPageSizeDesc": "Stel de hoeveelheid in om per keer te laden. 0 schakelt paginering uit.", + "libraryPageSizeTitle": "Bibliotheek paginagrootte", + "light": "Licht", + "list": "Lijst", + "lockscreen": "Vergrendelscherm", + "loggedIn": "Ingelogd", + "login": "Inloggen", + "logout": "Uitloggen", + "logoutUserPopupContent": "Dit zal {userName} uitloggen en de gebruiker uit de app verwijderen.\nJe moet opnieuw inloggen op {serverName}.", + "@logoutUserPopupContent": { + "description": "Pop-up voor uitloggen gebruiker beschrijving", + "placeholders": { + "userName": { + "type": "String" + }, + "serverName": { + "type": "String" + } + } + }, + "logoutUserPopupTitle": "Gebruiker {userName} uitloggen?", + "@logoutUserPopupTitle": { + "description": "Pop-up voor uitloggen gebruiker", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "loop": "Lus", + "markAsUnwatched": "Markeer als niet bekeken", + "markAsWatched": "Markeer als bekeken", + "masonry": "Metseleffect", + "mediaTypeBase": "Basis type", + "mediaTypeBook": "Boek", + "mediaTypeBoxset": "Boxset", + "mediaTypeEpisode": "Aflevering", + "mediaTypeFolder": "Map", + "mediaTypeMovie": "Film", + "mediaTypePerson": "Persoon", + "mediaTypePhoto": "Foto", + "mediaTypePhotoAlbum": "Foto album", + "mediaTypePlaylist": "Afspeellijst", + "mediaTypeSeason": "Seizoen", + "mediaTypeSeries": "Serie", + "metaDataSavedFor": "Metadata opgeslagen voor {item}", + "@metaDataSavedFor": { + "description": "metadataOpgeslagenVoor", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "metadataRefreshDefault": "Scannen naar nieuwe en bijgewerkte bestanden", + "metadataRefreshFull": "Alle metadata vervangen", + "metadataRefreshValidation": "Zoeken naar ontbrekende metadata", + "minutes": "{count, plural, other{Minuten} one{Minuut}}", + "@minutes": { + "description": "minuut", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "mode": "Modus", + "moreFrom": "Meer van {info}", + "@moreFrom": { + "description": "Meer van", + "placeholders": { + "info": { + "type": "String" + } + } + }, + "moreOptions": "Meer opties", + "mouseDragSupport": "Slepen met de muis", + "musicAlbum": "Album", + "name": "Naam", + "navigation": "Navigatie", + "navigationDashboard": "Dashboard", + "navigationFavorites": "Favorieten", + "navigationSync": "Gesynchroniseerd", + "never": "Nooit", + "nextUp": "Volgende", + "noItemsSynced": "Geen items gesynchroniseerd", + "noItemsToShow": "Geen items om te tonen", + "noRating": "Geen beoordeling", + "noResults": "Geen resultaten", + "noServersFound": "Geen nieuwe servers gevonden", + "noSuggestionsFound": "Geen suggesties gevonden", + "none": "Geen", + "normal": "Normaal", + "notPartOfAlbum": "Maakt geen deel uit van een album", + "openParent": "Bovenliggende map openen", + "openShow": "Open show", + "openWebLink": "Weblink openen", + "options": "Opties", + "other": "Overig", + "outlineColor": "Omtreklijnkleur", + "outlineSize": "Omtreklijn grootte", + "overview": "Overzicht", + "page": "Pagina {index}", + "@page": { + "description": "pagina", + "placeholders": { + "index": { + "type": "int" + } + } + }, + "parentalRating": "Ouderlijk toezicht beoordeling", + "password": "Wachtwoord", + "pathClearTitle": "Downloadpad wissen", + "pathEditDesc": "Deze locatie is ingesteld voor alle gebruikers, gesynchroniseerde gegevens zijn niet meer toegankelijk.\nHet blijft op je opslag.", + "pathEditSelect": "Selecteer downloadbestemming", + "pathEditTitle": "Locatie wijzigen", "play": "{item} Afspelen", "@play": { "description": "Speel met", @@ -46,24 +344,7 @@ } } }, - "read": "{item} Lezen", - "@read": { - "description": "lezen", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "readFromStart": "{item} vanaf het begin lezen", - "@readFromStart": { - "description": "Lees boek vanaf het begin", - "placeholders": { - "item": { - "type": "String" - } - } - }, + "playCount": "Aantal keren afgespeeld", "playFrom": "Speel vanaf {name}", "@playFrom": { "description": "speel vanaf", @@ -82,230 +363,46 @@ } } }, - "moreFrom": "Meer van {info}", - "@moreFrom": { - "description": "Meer van", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selectedWith": "Geselecteerd {info}", - "@selectedWith": { - "description": "geselecteerd", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selected": "Geselecteerd", - "restart": "Herstarten", - "reWatch": "Opnieuw bekijken", - "watchOn": "Kijk op", - "options": "Opties", - "list": "Lijst", - "grid": "Raster", - "masonry": "Metseleffect", - "start": "Start", - "none": "Geen", - "chapter": "{count, plural, other{Hoofdstukken} one{Hoofdstuk}}", - "@chapter": { - "description": "hoofdstuk", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "sync": "Synchroniseren", - "moreOptions": "Meer opties", - "continuePage": "Doorgaan - pagina {page}", - "@continuePage": { - "description": "Doorgaan - pagina 1", - "placeholders": { - "page": { - "type": "int" - } - } - }, - "openShow": "Open show", - "showDetails": "Toon details", - "showAlbum": "Toon album", - "season": "{count, plural, other{Seizoenen} one{Seizoen}}", - "@season": { - "description": "seizoen", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "episode": "{count, plural, other{Afleveringen} one{Aflevering}}", - "@episode": { - "description": "aflevering", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "addToCollection": "Toevoegen aan collectie", - "addToPlaylist": "Toevoegen aan afspeellijst", - "removeFromCollection": "Verwijderen uit collectie", - "removeFromPlaylist": "Verwijderen uit afspeellijst", - "markAsWatched": "Markeer als bekeken", - "markAsUnwatched": "Markeer als niet bekeken", - "removeAsFavorite": "Verwijderen als favoriet", - "addAsFavorite": "Toevoegen als favoriet", - "editMetadata": "Metadata bewerken", - "refreshMetadata": "Metadata vernieuwen", - "syncDetails": "Details synchroniseren", - "identify": "Identificeren", - "info": "Info", - "clearAllSettings": "Alle instellingen wissen", - "clearAllSettingsQuestion": "Alle instellingen wissen?", - "unableToReverseAction": "Deze actie kan niet ongedaan worden gemaakt, het verwijdert alle instellingen.", - "navigationDashboard": "Dashboard", - "navigationFavorites": "Favorieten", - "navigationSync": "Gesynchroniseerd", - "navigation": "Navigatie", - "library": "{count, plural, other{Bibliotheken} one{Bibliotheek}}", - "@library": { - "description": "meervoud", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "scanLibrary": "Scan bibliotheek", - "dashboardContinue": "Doorgaan", - "dashboardContinueWatching": "Doorgaan met kijken", - "dashboardContinueReading": "Doorgaan met lezen", - "dashboardContinueListening": "Doorgaan met luisteren", - "dashboardNextUp": "Volgende", - "dashboardRecentlyAdded": "Onlangs toegevoegd in {name}", - "@dashboardRecentlyAdded": { - "description": "Onlangs toegevoegd op startscherm", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "settings": "Instellingen", - "settingsClientTitle": "Fladder", - "settingsClientDesc": "Algemeen, Time-out, Lay-out, Thema", - "settingsQuickConnectTitle": "Snel verbinden", - "settingsProfileTitle": "Profiel", - "settingsProfileDesc": "Vergrendelscherm", - "settingsPlayerTitle": "Speler", - "settingsPlayerDesc": "Beeldverhouding, Geavanceerd", - "logoutUserPopupTitle": "Gebruiker {userName} uitloggen?", - "@logoutUserPopupTitle": { - "description": "Pop-up voor uitloggen gebruiker", - "placeholders": { - "userName": { - "type": "String" - } - } - }, - "logoutUserPopupContent": "Dit zal {userName} uitloggen en de gebruiker uit de app verwijderen.\nJe moet opnieuw inloggen op {serverName}.", - "@logoutUserPopupContent": { - "description": "Pop-up voor uitloggen gebruiker beschrijving", - "placeholders": { - "userName": { - "type": "String" - }, - "serverName": { - "type": "String" - } - } - }, - "quickConnectTitle": "Snel verbinden", + "playLabel": "Afspelen", + "playVideos": "Video's afspelen", + "played": "Gespeeld", "quickConnectAction": "Voer snelverbind code in voor", "quickConnectInputACode": "Voer een code in", + "quickConnectTitle": "Snel verbinden", "quickConnectWrongCode": "Verkeerde code", - "downloadsTitle": "Downloads", - "downloadsPath": "Pad", - "pathEditTitle": "Locatie wijzigen", - "pathEditSelect": "Selecteer downloadbestemming", - "pathClearTitle": "Downloadpad wissen", - "pathEditDesc": "Deze locatie is ingesteld voor alle gebruikers, gesynchroniseerde gegevens zijn niet meer toegankelijk.\nHet blijft op je opslag.", - "downloadsSyncedData": "Gesynchroniseerde gegevens", - "downloadsClearTitle": "Gesynchroniseerde gegevens wissen", - "downloadsClearDesc": "Weet je zeker dat je alle gesynchroniseerde gegevens wilt verwijderen?\nDit wist alle gegevens voor elke gesynchroniseerde gebruiker!", - "lockscreen": "Vergrendelscherm", - "timeOut": "Time-out", - "home": "Home", - "settingsHomeCarouselTitle": "Dashboard carrousel", - "settingsHomeCarouselDesc": "Toont een carrousel op het dashboard scherm", - "settingsHomeNextUpTitle": "Volgende posters", - "settingsHomeNextUpDesc": "Soort posters getoond op het dashboard scherm", - "settingsVisual": "Visueel", - "settingsBlurredPlaceholderTitle": "Vervaagde placeholder", - "settingsBlurredPlaceholderDesc": "Toon vervaagde achtergrond bij het laden van posters", - "settingsBlurEpisodesTitle": "Vervagen volgende afleveringen", - "settingsBlurEpisodesDesc": "Vervaag alle komende afleveringen", - "settingsEnableOsMediaControls": "OS media bediening inschakelen", - "settingsNextUpCutoffDays": "Volgende cutoff dagen", - "settingsShowScaleSlider": "Toon posterschaal schuifregelaar", - "settingsPosterSize": "Poster grootte", - "settingsPosterSlider": "Toon schaal schuifregelaar", - "settingsPosterPinch": "Knijp-zoom om posters te schalen", - "theme": "Thema", - "mode": "Modus", - "themeModeSystem": "Systeem", - "themeModeLight": "Licht", - "themeModeDark": "Donker", - "themeColor": "Thema kleur", - "color": "Kleur", - "amoledBlack": "Amoled zwart", - "hide": "Verbergen", - "nextUp": "Volgende", - "settingsContinue": "Doorgaan", - "separate": "Gescheiden", - "combined": "Gecombineerd", - "settingsSecurity": "Beveiliging", - "settingSecurityApplockTitle": "App vergrendelen", - "appLockTitle": "Stel de inlogmethode in voor {userName}", - "@appLockTitle": { - "description": "Pop-up om een inlogmethode te kiezen", + "random": "Willekeurig", + "rating": "{count, plural, other{Beoordelingen} one{Beoordeling}}", + "@rating": { + "description": "beoordeling", "placeholders": { - "userName": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "reWatch": "Opnieuw bekijken", + "read": "{item} Lezen", + "@read": { + "description": "lezen", + "placeholders": { + "item": { "type": "String" } } }, - "biometricsFailedCheckAgain": "Biometrie mislukt, controleer de instellingen en probeer opnieuw", - "appLockAutoLogin": "Automatisch inloggen", - "appLockPasscode": "Wachtwoord", - "appLockBiometrics": "Biometrie", - "settingsPlayerVideoHWAccelTitle": "Hardwareversnelling", - "settingsPlayerVideoHWAccelDesc": "Gebruik de gpu om video weer te geven (aanbevolen)", - "settingsPlayerNativeLibassAccelTitle": "Native libass ondertiteling", - "settingsPlayerNativeLibassAccelDesc": "Gebruik videospeler libass ondertitel renderer", - "settingsPlayerMobileWarning": "Hardwareversnelling en native libass ondertitels inschakelen op Android kan ervoor zorgen dat sommige ondertitels niet worden weergegeven.", - "settingsPlayerCustomSubtitlesTitle": "Ondertitels aanpassen", - "settingsPlayerCustomSubtitlesDesc": "Pas grootte, kleur, positie, omtrek aan", - "videoScalingFillScreenTitle": "Vul scherm", - "videoScalingFillScreenDesc": "Vul de navigatie- en statusbalk", - "videoScalingFillScreenNotif": "Volledig scherm overschrijft videopasvorm, in horizontale rotatie", - "videoScaling": "Videoschaling", - "videoScalingFill": "Vullen", - "videoScalingContain": "Bevatten", - "videoScalingCover": "Bedekken", - "videoScalingFitWidth": "Pas breedte aan", - "videoScalingFitHeight": "Pas hoogte aan", - "videoScalingScaleDown": "Schaal omlaag", - "subtitleConfiguratorPlaceHolder": "Dit is placeholder tekst,\nniets te zien hier.", - "subtitleConfigurator": "Ondertitel configurator", + "readFromStart": "{item} vanaf het begin lezen", + "@readFromStart": { + "description": "Lees boek vanaf het begin", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "recursive": "Recursief", + "refresh": "Vernieuwen", + "refreshMetadata": "Metadata vernieuwen", "refreshPopup": "Vernieuwen - {name}", "@refreshPopup": { "placeholders": { @@ -314,6 +411,41 @@ } } }, + "refreshPopupContentMetadata": "Metadata wordt vernieuwd op basis van instellingen en internetdiensten die zijn ingeschakeld in het Dashboard.", + "related": "Gerelateerd", + "releaseDate": "Releasedatum", + "removeAsFavorite": "Verwijderen als favoriet", + "removeFromCollection": "Verwijderen uit collectie", + "removeFromPlaylist": "Verwijderen uit afspeellijst", + "replaceAllImages": "Alle afbeeldingen vervangen", + "replaceExistingImages": "Bestaande afbeeldingen vervangen", + "restart": "Herstarten", + "result": "Resultaat", + "resumable": "Hervatbaar", + "resume": "{item} Hervatten", + "@resume": { + "description": "hervatten", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "retrievePublicListOfUsers": "Publieke lijst van gebruikers ophalen", + "retry": "Opnieuw proberen", + "runTime": "Looptijd", + "save": "Opslaan", + "saved": "Opgeslagen", + "scanBiometricHint": "Identiteit verifiëren", + "scanLibrary": "Scan bibliotheek", + "scanYourFingerprintToAuthenticate": "Scan je vingerafdruk om {user} te verifiëren", + "@scanYourFingerprintToAuthenticate": { + "placeholders": { + "user": { + "type": "String" + } + } + }, "scanningName": "Scannen - {name}", "@scanningName": { "placeholders": { @@ -322,249 +454,11 @@ } } }, - "refreshPopupContentMetadata": "Metadata wordt vernieuwd op basis van instellingen en internetdiensten die zijn ingeschakeld in het Dashboard.", - "replaceExistingImages": "Bestaande afbeeldingen vervangen", - "metadataRefreshDefault": "Scannen naar nieuwe en bijgewerkte bestanden", - "metadataRefreshValidation": "Zoeken naar ontbrekende metadata", - "metadataRefreshFull": "Alle metadata vervangen", - "syncedItems": "Gesynchroniseerde items", - "noItemsSynced": "Geen items gesynchroniseerd", - "syncDeletePopupPermanent": "Deze actie is permanent en verwijdert alle lokaal gesynchroniseerde bestanden", - "totalSize": "Totale grootte: {size}", - "@totalSize": { - "placeholders": { - "size": { - "type": "String" - } - } - }, - "mediaTypeBase": "Basis type", - "mediaTypeMovie": "Film", - "mediaTypeSeries": "Serie", - "mediaTypeSeason": "Seizoen", - "mediaTypeEpisode": "Aflevering", - "mediaTypePhoto": "Foto", - "mediaTypePerson": "Persoon", - "mediaTypePhotoAlbum": "Foto album", - "mediaTypeFolder": "Map", - "mediaTypeBoxset": "Boxset", - "mediaTypePlaylist": "Afspeellijst", - "mediaTypeBook": "Boek", - "actor": "{count, plural, other{Acteurs} one{Acteur}}", - "@actor": { - "description": "acteur", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "writer": "{count, plural, other{Schrijvers} one{Schrijver}}", - "@writer": { - "description": "schrijver", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "director": "{count, plural, other{Regisseurs} one{Regisseur}}", - "@director": { - "description": "regisseur", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "video": "Video", - "audio": "Audio", - "subtitles": "Ondertitels", - "related": "Gerelateerd", - "all": "Alles", - "overview": "Overzicht", - "selectViewType": "Selecteer weergavetype", - "noItemsToShow": "Geen items om te tonen", - "sortBy": "Sorteer op", - "groupBy": "Groepeer op", "scrollToTop": "Scroll naar boven", - "disableFilters": "Filters uitschakelen", - "selectAll": "Alles selecteren", - "clearSelection": "Selectie wissen", - "shuffleVideos": "Video's shuffle", - "shuffleGallery": "Galerij shuffle", - "unknown": "Onbekend", - "favorites": "Favorieten", - "recursive": "Recursief", - "genre": "{count, plural, other{Genres} one{Genre}}", - "@genre": { - "description": "genre", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "studio": "{count, plural, other{Studio's} one{Studio}}", - "@studio": { - "description": "studio", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "label": "{count, plural, other{Labels} one{Label}}", - "@label": { - "description": "label", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "group": "Groeperen", - "type": "{count, plural, other{Types} one{Type}}", - "@type": { - "description": "type", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "filter": "{count, plural, other{Filters} one{Filter}}", - "@filter": { - "description": "filter", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "showEmpty": "Toon leeg", - "hideEmpty": "Verberg leeg", - "rating": "{count, plural, other{Beoordelingen} one{Beoordeling}}", - "@rating": { - "description": "beoordeling", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "year": "{count, plural, other{Jaren} one{Jaar}}", - "@year": { - "description": "jaar", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "playVideos": "Video's afspelen", - "playLabel": "Afspelen", - "forceRefresh": "Geforceerd vernieuwen", - "itemCount": "Aantal items: {count}", - "@itemCount": { - "description": "Aantal items", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "invalidUrl": "Ongeldige url", - "invalidUrlDesc": "Url moet beginnen met http(s)://", - "incorrectPinTryAgain": "Onjuiste pin, probeer opnieuw", - "somethingWentWrongPasswordCheck": "Er is iets misgegaan, controleer uw wachtwoord", - "unableToConnectHost": "Kan geen verbinding maken met host", - "server": "Server", - "retrievePublicListOfUsers": "Publieke lijst van gebruikers ophalen", - "displayLanguage": "Weergavetaal", - "deleteItem": "{item} verwijderen?", - "@deleteItem": { - "description": "deleteItem", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncDeleteItemTitle": "Gesynchroniseerd item verwijderen", - "syncDeleteItemDesc": "Alle gesynchroniseerde gegevens verwijderen voor?\n{item}", - "@syncDeleteItemDesc": { - "description": "Pop-upvenster voor synchronisatie van te verwijderen item", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncOpenParent": "Ouder openen", - "syncRemoveDataTitle": "Gesynchroniseerde gegevens verwijderen?", - "syncRemoveDataDesc": "Gesynchroniseerde videogegevens verwijderen? Dit is permanent en u moet de bestanden opnieuw synchroniseren", - "collectionFolder": "Collectiemap", - "musicAlbum": "Album", - "active": "Actief", - "name": "Naam", - "result": "Resultaat", - "close": "Sluiten", - "replaceAllImages": "Alle afbeeldingen vervangen", - "noResults": "Geen resultaten", - "openWebLink": "Weblink openen", - "setIdentityTo": "Identiteit instellen op {name}", - "@setIdentityTo": { - "description": "setIdentityTo", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "somethingWentWrong": "Er is iets misgegaan", - "clearChanges": "Wijzigingen wissen", - "useDefaults": "Standaardwaarden gebruiken", - "light": "Licht", - "normal": "Normaal", - "bold": "Vet", - "fontSize": "Lettergrootte", - "heightOffset": "Hoogte-offset", - "fontColor": "Letterkleur", - "outlineColor": "Omtreklijnkleur", - "outlineSize": "Omtreklijn grootte", - "backgroundOpacity": "Achtergrond doorzichtigheid", - "shadow": "Schaduw", - "played": "Gespeeld", - "unPlayed": "Ongespeeld", - "resumable": "Hervatbaar", - "sortOrder": "Sorteervolgorde", - "sortName": "Naam", - "communityRating": "Gemeenschapswaardering", - "parentalRating": "Ouderlijk toezicht beoordeling", - "dateAdded": "Datum toegevoegd", - "dateLastContentAdded": "Datum laatste inhoud toegevoegd", - "favorite": "Favoriet", - "datePlayed": "Datum afgespeeld", - "folders": "Mappen", - "playCount": "Aantal keren afgespeeld", - "releaseDate": "Releasedatum", - "runTime": "Looptijd", - "ascending": "Oplopend", - "descending": "Aflopend", - "minutes": "{count, plural, other{Minuten} one{Minuut}}", - "@minutes": { - "description": "minuut", + "search": "Zoeken", + "season": "{count, plural, other{Seizoenen} one{Seizoen}}", + "@season": { + "description": "seizoen", "placeholders": { "count": { "type": "int", @@ -582,23 +476,126 @@ } } }, - "page": "Pagina {index}", - "@page": { - "description": "pagina", + "selectAll": "Alles selecteren", + "selectTime": "Tijd selecteren", + "selectViewType": "Selecteer weergavetype", + "selected": "Geselecteerd", + "selectedWith": "Geselecteerd {info}", + "@selectedWith": { + "description": "geselecteerd", "placeholders": { - "index": { - "type": "int" + "info": { + "type": "String" } } }, + "separate": "Gescheiden", + "server": "Server", "set": "Instellen", "@set": { "description": "Gebruik voor het instellen van een bepaalde waarde", "context": "Instellen 'tijd'" }, - "never": "Nooit", - "selectTime": "Tijd selecteren", - "immediately": "Direct", + "setIdentityTo": "Identiteit instellen op {name}", + "@setIdentityTo": { + "description": "setIdentityTo", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "settingSecurityApplockTitle": "App vergrendelen", + "settings": "Instellingen", + "settingsBlurEpisodesDesc": "Vervaag alle komende afleveringen", + "settingsBlurEpisodesTitle": "Vervagen volgende afleveringen", + "settingsBlurredPlaceholderDesc": "Toon vervaagde achtergrond bij het laden van posters", + "settingsBlurredPlaceholderTitle": "Vervaagde placeholder", + "settingsClientDesc": "Algemeen, Time-out, Lay-out, Thema", + "settingsClientTitle": "Fladder", + "settingsContinue": "Doorgaan", + "settingsEnableOsMediaControls": "OS media bediening inschakelen", + "settingsHomeCarouselDesc": "Toont een carrousel op het dashboard scherm", + "settingsHomeCarouselTitle": "Dashboard carrousel", + "settingsHomeNextUpDesc": "Soort posters getoond op het dashboard scherm", + "settingsHomeNextUpTitle": "Volgende posters", + "settingsNextUpCutoffDays": "Volgende cutoff dagen", + "settingsPlayerCustomSubtitlesDesc": "Pas grootte, kleur, positie, omtrek aan", + "settingsPlayerCustomSubtitlesTitle": "Ondertitels aanpassen", + "settingsPlayerDesc": "Beeldverhouding, Geavanceerd", + "settingsPlayerMobileWarning": "Hardwareversnelling en native libass ondertitels inschakelen op Android kan ervoor zorgen dat sommige ondertitels niet worden weergegeven.", + "settingsPlayerNativeLibassAccelDesc": "Gebruik videospeler libass ondertitel renderer", + "settingsPlayerNativeLibassAccelTitle": "Native libass ondertiteling", + "settingsPlayerTitle": "Speler", + "settingsPlayerVideoHWAccelDesc": "Gebruik de gpu om video weer te geven (aanbevolen)", + "settingsPlayerVideoHWAccelTitle": "Hardwareversnelling", + "settingsPosterPinch": "Knijp-zoom om posters te schalen", + "settingsPosterSize": "Poster grootte", + "settingsPosterSlider": "Toon schaal schuifregelaar", + "settingsProfileDesc": "Vergrendelscherm", + "settingsProfileTitle": "Profiel", + "settingsQuickConnectTitle": "Snel verbinden", + "settingsSecurity": "Beveiliging", + "settingsShowScaleSlider": "Toon posterschaal schuifregelaar", + "settingsVisual": "Visueel", + "shadow": "Schaduw", + "showAlbum": "Toon album", + "showDetails": "Toon details", + "showEmpty": "Toon leeg", + "shuffleGallery": "Galerij shuffle", + "shuffleVideos": "Video's shuffle", + "somethingWentWrong": "Er is iets misgegaan", + "somethingWentWrongPasswordCheck": "Er is iets misgegaan, controleer uw wachtwoord", + "sortBy": "Sorteer op", + "sortName": "Naam", + "sortOrder": "Sorteervolgorde", + "start": "Start", + "studio": "{count, plural, other{Studio's} one{Studio}}", + "@studio": { + "description": "studio", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "subtitleConfigurator": "Ondertitel configurator", + "subtitleConfiguratorPlaceHolder": "Dit is placeholder tekst,\nniets te zien hier.", + "subtitles": "Ondertitels", + "switchUser": "Wissel gebruiker", + "sync": "Synchroniseren", + "syncDeleteItemDesc": "Alle gesynchroniseerde gegevens verwijderen voor?\n{item}", + "@syncDeleteItemDesc": { + "description": "Pop-upvenster voor synchronisatie van te verwijderen item", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "syncDeleteItemTitle": "Gesynchroniseerd item verwijderen", + "syncDeletePopupPermanent": "Deze actie is permanent en verwijdert alle lokaal gesynchroniseerde bestanden", + "syncDetails": "Details synchroniseren", + "syncOpenParent": "Ouder openen", + "syncRemoveDataDesc": "Gesynchroniseerde videogegevens verwijderen? Dit is permanent en u moet de bestanden opnieuw synchroniseren", + "syncRemoveDataTitle": "Gesynchroniseerde gegevens verwijderen?", + "syncedItems": "Gesynchroniseerde items", + "tag": "{count, plural, one{Label} other{Labels}}", + "@tag": { + "description": "label", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "theme": "Thema", + "themeColor": "Thema kleur", + "themeModeDark": "Donker", + "themeModeLight": "Licht", + "themeModeSystem": "Systeem", "timeAndAnnotation": "{minutes} en {seconds}", "@timeAndAnnotation": { "description": "timeAndAnnotation", @@ -611,47 +608,18 @@ } } }, - "scanYourFingerprintToAuthenticate": "Scan je vingerafdruk om {user} te verifiëren", - "@scanYourFingerprintToAuthenticate": { + "timeOut": "Time-out", + "totalSize": "Totale grootte: {size}", + "@totalSize": { "placeholders": { - "user": { + "size": { "type": "String" } } }, - "scanBiometricHint": "Identiteit verifiëren", - "deleteFileFromSystem": "Het verwijderen van dit item {item} zal het zowel uit het bestandssysteem als uit je mediatheek verwijderen.\nWeet je zeker dat je wilt doorgaan?", - "@deleteFileFromSystem": { - "description": "Bestand uit systeem verwijderen", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "notPartOfAlbum": "Maakt geen deel uit van een album", - "retry": "Opnieuw proberen", - "failedToLoadImage": "Kan afbeelding niet laden", - "save": "Opslaan", - "metaDataSavedFor": "Metadata opgeslagen voor {item}", - "@metaDataSavedFor": { - "description": "metadataOpgeslagenVoor", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "libraryPageSizeTitle": "Bibliotheek paginagrootte", - "libraryPageSizeDesc": "Stel de hoeveelheid in om per keer te laden. 0 schakelt paginering uit.", - "fetchingLibrary": "Bibliotheek items ophalen", - "libraryFetchNoItemsFound": "Geen items gevonden, probeer andere instellingen.", - "noSuggestionsFound": "Geen suggesties gevonden", - "viewPhotos": "Foto's bekijken", - "random": "Willekeurig", - "tag": "{count, plural, one{Label} other{Labels}}", - "@tag": { - "description": "label", + "type": "{count, plural, other{Types} one{Type}}", + "@type": { + "description": "type", "placeholders": { "count": { "type": "int", @@ -659,11 +627,43 @@ } } }, - "saved": "Opgeslagen", - "discovered": "Ontdekt", - "noServersFound": "Geen nieuwe servers gevonden", - "about": "Over", - "openParent": "Bovenliggende map openen", - "mouseDragSupport": "Slepen met de muis", - "controls": "Bediening" -} + "unPlayed": "Ongespeeld", + "unableToConnectHost": "Kan geen verbinding maken met host", + "unableToReverseAction": "Deze actie kan niet ongedaan worden gemaakt, het verwijdert alle instellingen.", + "unknown": "Onbekend", + "useDefaults": "Standaardwaarden gebruiken", + "userName": "Gebruikersnaam", + "video": "Video", + "videoScaling": "Videoschaling", + "videoScalingContain": "Bevatten", + "videoScalingCover": "Bedekken", + "videoScalingFill": "Vullen", + "videoScalingFillScreenDesc": "Vul de navigatie- en statusbalk", + "videoScalingFillScreenNotif": "Volledig scherm overschrijft videopasvorm, in horizontale rotatie", + "videoScalingFillScreenTitle": "Vul scherm", + "videoScalingFitHeight": "Pas hoogte aan", + "videoScalingFitWidth": "Pas breedte aan", + "videoScalingScaleDown": "Schaal omlaag", + "viewPhotos": "Foto's bekijken", + "watchOn": "Kijk op", + "writer": "{count, plural, other{Schrijvers} one{Schrijver}}", + "@writer": { + "description": "schrijver", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "year": "{count, plural, other{Jaren} one{Jaar}}", + "@year": { + "description": "jaar", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 22dcbda..a720275 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1,42 +1,340 @@ { "@@locale": "zh", - "switchUser": "切换用户", - "userName": "用户名", - "password": "密码", - "login": "登录", - "logout": "登出", - "cancel": "取消", + "about": "关于", "accept": "接受", - "code": "代码", - "error": "错误", - "clear": "清除", - "days": "天", - "search": "搜索", - "loggedIn": "已登录", - "change": "更改", - "other": "其他", - "dynamicText": "动态", - "enabled": "启用", - "disabled": "禁用", - "dashboard": "仪表板", + "active": "活跃", + "actor": "{count, plural, other{演员} one{演员}}", + "@actor": { + "description": "演员", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "addAsFavorite": "添加为收藏", + "addToCollection": "添加到收藏", + "addToPlaylist": "添加到播放列表", "advanced": "高级", - "refresh": "刷新", - "delete": "删除", - "goTo": "去往", - "loop": "循环", - "empty": "空", - "noRating": "无评分", - "backgroundBlur": "背景模糊", + "all": "全部", + "amoledBlack": "Amoled 黑色", + "appLockAutoLogin": "自动登录", + "appLockBiometrics": "生物识别", + "appLockPasscode": "密码", + "appLockTitle": "设置 {userName} 的登录方式", + "@appLockTitle": { + "description": "选择登录方式的弹窗", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "ascending": "升序", + "audio": "音频", "autoPlay": "自动播放", - "resume": "继续 {item}", - "@resume": { - "description": "继续", + "backgroundBlur": "背景模糊", + "backgroundOpacity": "背景不透明度", + "biometricsFailedCheckAgain": "生物识别失败,请检查设置并重试", + "bold": "粗体", + "cancel": "取消", + "change": "更改", + "chapter": "{count, plural, other{章节} one{章节}}", + "@chapter": { + "description": "章节", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "clear": "清除", + "clearAllSettings": "清除所有设置", + "clearAllSettingsQuestion": "清除所有设置?", + "clearChanges": "清除更改", + "clearSelection": "清除选择", + "close": "关闭", + "code": "代码", + "collectionFolder": "收藏夹", + "color": "颜色", + "combined": "组合", + "communityRating": "社区评分", + "continuePage": "继续 - 第 {page} 页", + "@continuePage": { + "description": "继续 - 第 1 页", + "placeholders": { + "page": { + "type": "int" + } + } + }, + "controls": "控制", + "dashboard": "仪表板", + "dashboardContinue": "继续", + "dashboardContinueListening": "继续听", + "dashboardContinueReading": "继续阅读", + "dashboardContinueWatching": "继续观看", + "dashboardNextUp": "下一个", + "dashboardRecentlyAdded": "最近添加于 {name}", + "@dashboardRecentlyAdded": { + "description": "最近添加到首页", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "dateAdded": "添加日期", + "dateLastContentAdded": "最后添加内容的日期", + "datePlayed": "播放日期", + "days": "天", + "delete": "删除", + "deleteFileFromSystem": "删除此项目 {item} 将从文件系统和您的媒体库中删除它。\n您确定要继续吗?", + "@deleteFileFromSystem": { + "description": "从系统中删除文件", "placeholders": { "item": { "type": "String" } } }, + "deleteItem": "删除 {item}?", + "@deleteItem": { + "description": "deleteItem", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "descending": "降序", + "director": "{count, plural, other{导演} one{导演}}", + "@director": { + "description": "导演", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "disableFilters": "禁用过滤器", + "disabled": "禁用", + "discovered": "已发现", + "displayLanguage": "显示语言 (显示语言)", + "downloadsClearDesc": "你确定要删除所有同步数据吗?\n这将清除每个同步用户的所有数据!", + "downloadsClearTitle": "清除同步数据", + "downloadsPath": "路径", + "downloadsSyncedData": "同步数据", + "downloadsTitle": "下载", + "dynamicText": "动态", + "editMetadata": "编辑元数据", + "empty": "空", + "enabled": "启用", + "episode": "{count, plural, other{集} one{集}}", + "@episode": { + "description": "集", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "error": "错误", + "failedToLoadImage": "加载图像失败", + "favorite": "收藏", + "favorites": "收藏", + "fetchingLibrary": "正在获取库项目", + "filter": "{count, plural, other{过滤器} one{过滤器}}", + "@filter": { + "description": "过滤器", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "folders": "文件夹", + "fontColor": "字体颜色", + "fontSize": "字体大小", + "forceRefresh": "强制刷新", + "genre": "{count, plural, other{类型} one{类型}}", + "@genre": { + "description": "类型", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "goTo": "去往", + "grid": "网格", + "group": "组", + "groupBy": "分组依据", + "heightOffset": "高度偏移", + "hide": "隐藏", + "hideEmpty": "隐藏空", + "home": "主页", + "identify": "识别", + "immediately": "立即", + "incorrectPinTryAgain": "错误的 PIN,请重试", + "info": "信息", + "invalidUrl": "无效的 URL", + "invalidUrlDesc": "URL 必须以 http(s):// 开头", + "itemCount": "项目数:{count}", + "@itemCount": { + "description": "项目数", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "label": "{count, plural, other{标签} one{标签}}", + "@label": { + "description": "标签", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "library": "{count, plural, other{库} one{库}}", + "@library": { + "description": "复数", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "libraryFetchNoItemsFound": "未找到项目,请尝试不同的设置。", + "libraryPageSizeDesc": "设置每次加载的数量。0 禁用分页。", + "libraryPageSizeTitle": "库页面大小", + "light": "浅色", + "list": "列表", + "lockscreen": "锁屏", + "loggedIn": "已登录", + "login": "登录", + "logout": "登出", + "logoutUserPopupContent": "这将登出 {userName} 并从应用程序中删除用户。\n你需要重新登录到 {serverName}。", + "@logoutUserPopupContent": { + "description": "登出用户的弹窗描述", + "placeholders": { + "userName": { + "type": "String" + }, + "serverName": { + "type": "String" + } + } + }, + "logoutUserPopupTitle": "登出用户 {userName}?", + "@logoutUserPopupTitle": { + "description": "登出用户的弹窗", + "placeholders": { + "userName": { + "type": "String" + } + } + }, + "loop": "循环", + "markAsUnwatched": "标记为未观看", + "markAsWatched": "标记为已观看", + "masonry": "砖石", + "mediaTypeBase": "基础类型", + "mediaTypeBook": "书籍", + "mediaTypeBoxset": "套装", + "mediaTypeEpisode": "集", + "mediaTypeFolder": "文件夹", + "mediaTypeMovie": "电影", + "mediaTypePerson": "人物", + "mediaTypePhoto": "照片", + "mediaTypePhotoAlbum": "相册", + "mediaTypePlaylist": "播放列表", + "mediaTypeSeason": "季", + "mediaTypeSeries": "系列", + "metaDataSavedFor": "{item} 的元数据已保存", + "@metaDataSavedFor": { + "description": "元数据已保存", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "metadataRefreshDefault": "扫描新文件和更新的文件", + "metadataRefreshFull": "替换所有元数据", + "metadataRefreshValidation": "搜索缺失的元数据", + "minutes": "分钟", + "@minutes": { + "description": "分钟", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "mode": "模式", + "moreFrom": "更多来自 {info}", + "@moreFrom": { + "description": "更多来自", + "placeholders": { + "info": { + "type": "String" + } + } + }, + "moreOptions": "更多选项", + "mouseDragSupport": "使用鼠标拖动", + "musicAlbum": "专辑", + "name": "名称", + "navigation": "导航", + "navigationDashboard": "仪表板", + "navigationFavorites": "收藏夹", + "navigationSync": "已同步", + "never": "从不", + "nextUp": "下一个", + "noItemsSynced": "没有同步项目", + "noItemsToShow": "没有可显示的项目", + "noRating": "无评分", + "noResults": "没有结果", + "noServersFound": "未找到新服务器", + "noSuggestionsFound": "未找到建议", + "none": "无", + "normal": "正常", + "notPartOfAlbum": "不属于专辑的一部分", + "openParent": "打开上级文件夹", + "openShow": "打开节目", + "openWebLink": "打开网页链接", + "options": "选项", + "other": "其他", + "outlineColor": "轮廓颜色", + "outlineSize": "轮廓大小", + "overview": "概述", + "page": "第 {index} 页", + "@page": { + "description": "页数", + "placeholders": { + "index": { + "type": "int" + } + } + }, + "parentalRating": "家长评级", + "password": "密码", + "pathClearTitle": "清除下载路径", + "pathEditDesc": "此位置设置适用于所有用户,任何同步的数据将不再可访问。\n它将保留在你的存储中。", + "pathEditSelect": "选择下载目标", + "pathEditTitle": "更改位置", "play": "播放 {item}", "@play": { "description": "播放", @@ -46,6 +344,44 @@ } } }, + "playCount": "播放次数", + "playFrom": "从 {name} 开始播放", + "@playFrom": { + "description": "从...开始播放", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "playFromStart": "从头播放 {name}", + "@playFromStart": { + "description": "从头播放", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "playLabel": "播放", + "playVideos": "播放视频", + "played": "已播放", + "quickConnectAction": "输入快速连接代码", + "quickConnectInputACode": "输入代码", + "quickConnectTitle": "快速连接", + "quickConnectWrongCode": "错误的代码", + "random": "随机", + "rating": "{count, plural, other{评分} one{评分}}", + "@rating": { + "description": "评分", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "reWatch": "重新观看", "read": "阅读 {item}", "@read": { "description": "阅读", @@ -64,239 +400,9 @@ } } }, - "playFrom": "从 {name} 开始播放", - "@playFrom": { - "description": "从...开始播放", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "moreFrom": "更多来自 {info}", - "@moreFrom": { - "description": "更多来自", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selectedWith": "选择了 {info}", - "@selectedWith": { - "description": "选择", - "placeholders": { - "info": { - "type": "String" - } - } - }, - "selected": "已选择", - "restart": "重新开始", - "reWatch": "重新观看", - "watchOn": "观看于", - "options": "选项", - "list": "列表", - "grid": "网格", - "masonry": "砖石", - "start": "开始", - "none": "无", - "chapter": "{count, plural, other{章节} one{章节}}", - "@chapter": { - "description": "章节", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "sync": "同步", - "moreOptions": "更多选项", - "continuePage": "继续 - 第 {page} 页", - "@continuePage": { - "description": "继续 - 第 1 页", - "placeholders": { - "page": { - "type": "int" - } - } - }, - "openShow": "打开节目", - "showDetails": "显示详情", - "showAlbum": "显示相册", - "season": "{count, plural, other{季} one{季}}", - "@season": { - "description": "季", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "episode": "{count, plural, other{集} one{集}}", - "@episode": { - "description": "集", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "addToCollection": "添加到收藏", - "addToPlaylist": "添加到播放列表", - "removeFromCollection": "从收藏中删除", - "removeFromPlaylist": "从播放列表中删除", - "markAsWatched": "标记为已观看", - "markAsUnwatched": "标记为未观看", - "removeAsFavorite": "取消收藏", - "addAsFavorite": "添加为收藏", - "editMetadata": "编辑元数据", + "recursive": "递归", + "refresh": "刷新", "refreshMetadata": "刷新元数据", - "syncDetails": "同步详情", - "identify": "识别", - "info": "信息", - "clearAllSettings": "清除所有设置", - "clearAllSettingsQuestion": "清除所有设置?", - "unableToReverseAction": "此操作无法撤销,它将删除所有设置。", - "navigationDashboard": "仪表板", - "navigationFavorites": "收藏夹", - "navigationSync": "已同步", - "navigation": "导航", - "library": "{count, plural, other{库} one{库}}", - "@library": { - "description": "复数", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "scanLibrary": "扫描库", - "dashboardContinue": "继续", - "dashboardContinueWatching": "继续观看", - "dashboardContinueReading": "继续阅读", - "dashboardContinueListening": "继续听", - "dashboardNextUp": "下一个", - "dashboardRecentlyAdded": "最近添加于 {name}", - "@dashboardRecentlyAdded": { - "description": "最近添加到首页", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "settings": "设置", - "settingsClientTitle": "Fladder", - "settingsClientDesc": "常规,超时,布局,主题", - "settingsQuickConnectTitle": "快速连接", - "settingsProfileTitle": "个人资料", - "settingsProfileDesc": "锁屏", - "settingsPlayerTitle": "播放器", - "settingsPlayerDesc": "纵横比,高级", - "logoutUserPopupTitle": "登出用户 {userName}?", - "@logoutUserPopupTitle": { - "description": "登出用户的弹窗", - "placeholders": { - "userName": { - "type": "String" - } - } - }, - "logoutUserPopupContent": "这将登出 {userName} 并从应用程序中删除用户。\n你需要重新登录到 {serverName}。", - "@logoutUserPopupContent": { - "description": "登出用户的弹窗描述", - "placeholders": { - "userName": { - "type": "String" - }, - "serverName": { - "type": "String" - } - } - }, - "quickConnectTitle": "快速连接", - "quickConnectAction": "输入快速连接代码", - "quickConnectInputACode": "输入代码", - "quickConnectWrongCode": "错误的代码", - "downloadsTitle": "下载", - "downloadsPath": "路径", - "pathEditTitle": "更改位置", - "pathEditSelect": "选择下载目标", - "pathClearTitle": "清除下载路径", - "pathEditDesc": "此位置设置适用于所有用户,任何同步的数据将不再可访问。\n它将保留在你的存储中。", - "downloadsSyncedData": "同步数据", - "downloadsClearTitle": "清除同步数据", - "downloadsClearDesc": "你确定要删除所有同步数据吗?\n这将清除每个同步用户的所有数据!", - "lockscreen": "锁屏", - "timeOut": "超时", - "home": "主页", - "settingsHomeCarouselTitle": "仪表板轮播", - "settingsHomeCarouselDesc": "在仪表板屏幕上显示轮播", - "settingsHomeNextUpTitle": "下一个海报", - "settingsHomeNextUpDesc": "仪表板屏幕上显示的海报类型", - "settingsVisual": "视觉", - "settingsBlurredPlaceholderTitle": "模糊的占位符", - "settingsBlurredPlaceholderDesc": "加载海报时显示模糊的背景", - "settingsBlurEpisodesTitle": "模糊下一个集数", - "settingsBlurEpisodesDesc": "模糊所有即将播放的集数", - "settingsEnableOsMediaControls": "启用操作系统媒体控制", - "settingsNextUpCutoffDays": "下一个截止天数", - "settingsShowScaleSlider": "显示海报大小滑块", - "settingsPosterSize": "海报大小", - "settingsPosterSlider": "显示比例滑块", - "settingsPosterPinch": "捏合缩放以调整海报大小", - "theme": "主题", - "mode": "模式", - "themeModeSystem": "系统", - "themeModeLight": "浅色", - "themeModeDark": "深色", - "themeColor": "主题颜色", - "color": "颜色", - "amoledBlack": "Amoled 黑色", - "hide": "隐藏", - "nextUp": "下一个", - "settingsContinue": "继续", - "separate": "分开", - "combined": "组合", - "settingsSecurity": "安全", - "settingSecurityApplockTitle": "应用锁", - "appLockTitle": "设置 {userName} 的登录方式", - "@appLockTitle": { - "description": "选择登录方式的弹窗", - "placeholders": { - "userName": { - "type": "String" - } - } - }, - "biometricsFailedCheckAgain": "生物识别失败,请检查设置并重试", - "appLockAutoLogin": "自动登录", - "appLockPasscode": "密码", - "appLockBiometrics": "生物识别", - "settingsPlayerVideoHWAccelTitle": "硬件加速", - "settingsPlayerVideoHWAccelDesc": "使用 GPU 渲染视频(推荐)", - "settingsPlayerNativeLibassAccelTitle": "本地 libass 字幕", - "settingsPlayerNativeLibassAccelDesc": "使用视频播放器 libass 字幕渲染器", - "settingsPlayerMobileWarning": "在 Android 上启用硬件加速和本地 libass 字幕可能会导致某些字幕无法渲染。", - "settingsPlayerCustomSubtitlesTitle": "自定义字幕", - "settingsPlayerCustomSubtitlesDesc": "自定义大小、颜色、位置、轮廓", - "videoScalingFillScreenTitle": "填满屏幕", - "videoScalingFillScreenDesc": "填充导航栏和状态栏", - "videoScalingFillScreenNotif": "全屏覆盖视频适应,在水平旋转中", - "videoScaling": "视频缩放", - "videoScalingFill": "填充", - "videoScalingContain": "包含", - "videoScalingCover": "覆盖", - "videoScalingFitWidth": "适应宽度", - "videoScalingFitHeight": "适应高度", - "videoScalingScaleDown": "缩小", - "subtitleConfiguratorPlaceHolder": "这是占位符文本,\n这里没有什么可看的。", - "subtitleConfigurator": "字幕配置器", "refreshPopup": "刷新 - {name}", "@refreshPopup": { "placeholders": { @@ -305,6 +411,41 @@ } } }, + "refreshPopupContentMetadata": "根据仪表板中启用的设置和互联网服务刷新元数据。", + "related": "相关", + "releaseDate": "发布日期", + "removeAsFavorite": "取消收藏", + "removeFromCollection": "从收藏中删除", + "removeFromPlaylist": "从播放列表中删除", + "replaceAllImages": "替换所有图像", + "replaceExistingImages": "替换现有图像", + "restart": "重新开始", + "result": "结果", + "resumable": "可恢复", + "resume": "继续 {item}", + "@resume": { + "description": "继续", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "retrievePublicListOfUsers": "检索公共用户列表", + "retry": "重试", + "runTime": "运行时间", + "save": "保存", + "saved": "已保存", + "scanBiometricHint": "验证身份", + "scanLibrary": "扫描库", + "scanYourFingerprintToAuthenticate": "扫描您的指纹以验证 {user}", + "@scanYourFingerprintToAuthenticate": { + "placeholders": { + "user": { + "type": "String" + } + } + }, "scanningName": "扫描 - {name}", "@scanningName": { "placeholders": { @@ -313,258 +454,11 @@ } } }, - "refreshPopupContentMetadata": "根据仪表板中启用的设置和互联网服务刷新元数据。", - "replaceExistingImages": "替换现有图像", - "metadataRefreshDefault": "扫描新文件和更新的文件", - "metadataRefreshValidation": "搜索缺失的元数据", - "metadataRefreshFull": "替换所有元数据", - "syncedItems": "同步项目", - "noItemsSynced": "没有同步项目", - "syncDeletePopupPermanent": "此操作是永久性的,将删除所有本地同步的文件", - "totalSize": "总大小:{size}", - "@totalSize": { - "placeholders": { - "size": { - "type": "String" - } - } - }, - "mediaTypeBase": "基础类型", - "mediaTypeMovie": "电影", - "mediaTypeSeries": "系列", - "mediaTypeSeason": "季", - "mediaTypeEpisode": "集", - "mediaTypePhoto": "照片", - "mediaTypePerson": "人物", - "mediaTypePhotoAlbum": "相册", - "mediaTypeFolder": "文件夹", - "mediaTypeBoxset": "套装", - "mediaTypePlaylist": "播放列表", - "mediaTypeBook": "书籍", - "actor": "{count, plural, other{演员} one{演员}}", - "@actor": { - "description": "演员", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "writer": "{count, plural, other{作家} one{作家}}", - "@writer": { - "description": "作家", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "director": "{count, plural, other{导演} one{导演}}", - "@director": { - "description": "导演", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "video": "视频", - "audio": "音频", - "subtitles": "字幕", - "related": "相关", - "all": "全部", - "overview": "概述", - "selectViewType": "选择查看类型", - "noItemsToShow": "没有可显示的项目", - "sortBy": "排序方式", - "groupBy": "分组依据", "scrollToTop": "滚动到顶部", - "disableFilters": "禁用过滤器", - "selectAll": "全选", - "clearSelection": "清除选择", - "shuffleVideos": "随机播放视频", - "shuffleGallery": "随机播放图库", - "unknown": "未知", - "favorites": "收藏", - "recursive": "递归", - "genre": "{count, plural, other{类型} one{类型}}", - "@genre": { - "description": "类型", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "studio": "{count, plural, other{工作室} one{工作室}}", - "@studio": { - "description": "工作室", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "label": "{count, plural, other{标签} one{标签}}", - "@label": { - "description": "标签", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "group": "组", - "type": "{count, plural, other{类型} one{类型}}", - "@type": { - "description": "类型", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "filter": "{count, plural, other{过滤器} one{过滤器}}", - "@filter": { - "description": "过滤器", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "showEmpty": "显示空", - "hideEmpty": "隐藏空", - "rating": "{count, plural, other{评分} one{评分}}", - "@rating": { - "description": "评分", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "year": "{count, plural, other{年} one{年}}", - "@year": { - "description": "年", - "placeholders": { - "count": { - "type": "int", - "example": "1" - } - } - }, - "playVideos": "播放视频", - "playLabel": "播放", - "forceRefresh": "强制刷新", - "itemCount": "项目数:{count}", - "@itemCount": { - "description": "项目数", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "invalidUrl": "无效的 URL", - "invalidUrlDesc": "URL 必须以 http(s):// 开头", - "incorrectPinTryAgain": "错误的 PIN,请重试", - "somethingWentWrongPasswordCheck": "出了点问题,请检查您的密码", - "unableToConnectHost": "无法连接到主机", - "server": "服务器", - "retrievePublicListOfUsers": "检索公共用户列表", - "displayLanguage": "显示语言 (显示语言)", - "deleteItem": "删除 {item}?", - "@deleteItem": { - "description": "deleteItem", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncDeleteItemTitle": "删除同步的项目", - "syncDeleteItemDesc": "删除所有同步数据?\n{item}", - "@syncDeleteItemDesc": { - "description": "同步删除项目弹出窗口", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "syncOpenParent": "打开父级", - "syncRemoveDataTitle": "删除同步的数据?", - "syncRemoveDataDesc": "删除同步的视频数据?这是永久性的,您需要重新同步文件", - "collectionFolder": "收藏夹", - "musicAlbum": "专辑", - "active": "活跃", - "name": "名称", - "result": "结果", - "close": "关闭", - "replaceAllImages": "替换所有图像", - "noResults": "没有结果", - "openWebLink": "打开网页链接", - "setIdentityTo": "设置身份为 {name}", - "@setIdentityTo": { - "description": "setIdentityTo", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "somethingWentWrong": "出了些问题", - "clearChanges": "清除更改", - "useDefaults": "使用默认值", - "light": "浅色", - "normal": "正常", - "bold": "粗体", - "fontSize": "字体大小", - "heightOffset": "高度偏移", - "fontColor": "字体颜色", - "outlineColor": "轮廓颜色", - "outlineSize": "轮廓大小", - "backgroundOpacity": "背景不透明度", - "shadow": "阴影", - "played": "已播放", - "unPlayed": "未播放", - "resumable": "可恢复", - "sortOrder": "排序顺序", - "sortName": "名称", - "communityRating": "社区评分", - "parentalRating": "家长评级", - "dateAdded": "添加日期", - "dateLastContentAdded": "最后添加内容的日期", - "favorite": "收藏", - "datePlayed": "播放日期", - "folders": "文件夹", - "playCount": "播放次数", - "releaseDate": "发布日期", - "runTime": "运行时间", - "ascending": "升序", - "descending": "降序", - "playFromStart": "从头播放 {name}", - "@playFromStart": { - "description": "从头播放", - "placeholders": { - "name": { - "type": "String" - } - } - }, - "minutes": "分钟", - "@minutes": { - "description": "分钟", + "search": "搜索", + "season": "{count, plural, other{季} one{季}}", + "@season": { + "description": "季", "placeholders": { "count": { "type": "int", @@ -582,23 +476,126 @@ } } }, - "page": "第 {index} 页", - "@page": { - "description": "页数", + "selectAll": "全选", + "selectTime": "选择时间", + "selectViewType": "选择查看类型", + "selected": "已选择", + "selectedWith": "选择了 {info}", + "@selectedWith": { + "description": "选择", "placeholders": { - "index": { - "type": "int" + "info": { + "type": "String" } } }, + "separate": "分开", + "server": "服务器", "set": "设置", "@set": { "description": "用于设置某个值", "context": "设置时间" }, - "never": "从不", - "selectTime": "选择时间", - "immediately": "立即", + "setIdentityTo": "设置身份为 {name}", + "@setIdentityTo": { + "description": "setIdentityTo", + "placeholders": { + "name": { + "type": "String" + } + } + }, + "settingSecurityApplockTitle": "应用锁", + "settings": "设置", + "settingsBlurEpisodesDesc": "模糊所有即将播放的集数", + "settingsBlurEpisodesTitle": "模糊下一个集数", + "settingsBlurredPlaceholderDesc": "加载海报时显示模糊的背景", + "settingsBlurredPlaceholderTitle": "模糊的占位符", + "settingsClientDesc": "常规,超时,布局,主题", + "settingsClientTitle": "Fladder", + "settingsContinue": "继续", + "settingsEnableOsMediaControls": "启用操作系统媒体控制", + "settingsHomeCarouselDesc": "在仪表板屏幕上显示轮播", + "settingsHomeCarouselTitle": "仪表板轮播", + "settingsHomeNextUpDesc": "仪表板屏幕上显示的海报类型", + "settingsHomeNextUpTitle": "下一个海报", + "settingsNextUpCutoffDays": "下一个截止天数", + "settingsPlayerCustomSubtitlesDesc": "自定义大小、颜色、位置、轮廓", + "settingsPlayerCustomSubtitlesTitle": "自定义字幕", + "settingsPlayerDesc": "纵横比,高级", + "settingsPlayerMobileWarning": "在 Android 上启用硬件加速和本地 libass 字幕可能会导致某些字幕无法渲染。", + "settingsPlayerNativeLibassAccelDesc": "使用视频播放器 libass 字幕渲染器", + "settingsPlayerNativeLibassAccelTitle": "本地 libass 字幕", + "settingsPlayerTitle": "播放器", + "settingsPlayerVideoHWAccelDesc": "使用 GPU 渲染视频(推荐)", + "settingsPlayerVideoHWAccelTitle": "硬件加速", + "settingsPosterPinch": "捏合缩放以调整海报大小", + "settingsPosterSize": "海报大小", + "settingsPosterSlider": "显示比例滑块", + "settingsProfileDesc": "锁屏", + "settingsProfileTitle": "个人资料", + "settingsQuickConnectTitle": "快速连接", + "settingsSecurity": "安全", + "settingsShowScaleSlider": "显示海报大小滑块", + "settingsVisual": "视觉", + "shadow": "阴影", + "showAlbum": "显示相册", + "showDetails": "显示详情", + "showEmpty": "显示空", + "shuffleGallery": "随机播放图库", + "shuffleVideos": "随机播放视频", + "somethingWentWrong": "出了些问题", + "somethingWentWrongPasswordCheck": "出了点问题,请检查您的密码", + "sortBy": "排序方式", + "sortName": "名称", + "sortOrder": "排序顺序", + "start": "开始", + "studio": "{count, plural, other{工作室} one{工作室}}", + "@studio": { + "description": "工作室", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "subtitleConfigurator": "字幕配置器", + "subtitleConfiguratorPlaceHolder": "这是占位符文本,\n这里没有什么可看的。", + "subtitles": "字幕", + "switchUser": "切换用户", + "sync": "同步", + "syncDeleteItemDesc": "删除所有同步数据?\n{item}", + "@syncDeleteItemDesc": { + "description": "同步删除项目弹出窗口", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "syncDeleteItemTitle": "删除同步的项目", + "syncDeletePopupPermanent": "此操作是永久性的,将删除所有本地同步的文件", + "syncDetails": "同步详情", + "syncOpenParent": "打开父级", + "syncRemoveDataDesc": "删除同步的视频数据?这是永久性的,您需要重新同步文件", + "syncRemoveDataTitle": "删除同步的数据?", + "syncedItems": "同步项目", + "tag": "{count, plural, one{标签} other{标签}}", + "@tag": { + "description": "标签", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "theme": "主题", + "themeColor": "主题颜色", + "themeModeDark": "深色", + "themeModeLight": "浅色", + "themeModeSystem": "系统", "timeAndAnnotation": "{minutes} 分 {seconds} 秒", "@timeAndAnnotation": { "description": "时间和注释", @@ -611,47 +608,18 @@ } } }, - "scanYourFingerprintToAuthenticate": "扫描您的指纹以验证 {user}", - "@scanYourFingerprintToAuthenticate": { + "timeOut": "超时", + "totalSize": "总大小:{size}", + "@totalSize": { "placeholders": { - "user": { + "size": { "type": "String" } } }, - "scanBiometricHint": "验证身份", - "deleteFileFromSystem": "删除此项目 {item} 将从文件系统和您的媒体库中删除它。\n您确定要继续吗?", - "@deleteFileFromSystem": { - "description": "从系统中删除文件", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "notPartOfAlbum": "不属于专辑的一部分", - "retry": "重试", - "failedToLoadImage": "加载图像失败", - "save": "保存", - "metaDataSavedFor": "{item} 的元数据已保存", - "@metaDataSavedFor": { - "description": "元数据已保存", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "libraryPageSizeTitle": "库页面大小", - "libraryPageSizeDesc": "设置每次加载的数量。0 禁用分页。", - "fetchingLibrary": "正在获取库项目", - "libraryFetchNoItemsFound": "未找到项目,请尝试不同的设置。", - "noSuggestionsFound": "未找到建议", - "viewPhotos": "查看照片", - "random": "随机", - "tag": "{count, plural, one{标签} other{标签}}", - "@tag": { - "description": "标签", + "type": "{count, plural, other{类型} one{类型}}", + "@type": { + "description": "类型", "placeholders": { "count": { "type": "int", @@ -659,11 +627,43 @@ } } }, - "saved": "已保存", - "discovered": "已发现", - "noServersFound": "未找到新服务器", - "about": "关于", - "openParent": "打开上级文件夹", - "mouseDragSupport": "使用鼠标拖动", - "controls": "控制" -} + "unPlayed": "未播放", + "unableToConnectHost": "无法连接到主机", + "unableToReverseAction": "此操作无法撤销,它将删除所有设置。", + "unknown": "未知", + "useDefaults": "使用默认值", + "userName": "用户名", + "video": "视频", + "videoScaling": "视频缩放", + "videoScalingContain": "包含", + "videoScalingCover": "覆盖", + "videoScalingFill": "填充", + "videoScalingFillScreenDesc": "填充导航栏和状态栏", + "videoScalingFillScreenNotif": "全屏覆盖视频适应,在水平旋转中", + "videoScalingFillScreenTitle": "填满屏幕", + "videoScalingFitHeight": "适应高度", + "videoScalingFitWidth": "适应宽度", + "videoScalingScaleDown": "缩小", + "viewPhotos": "查看照片", + "watchOn": "观看于", + "writer": "{count, plural, other{作家} one{作家}}", + "@writer": { + "description": "作家", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + }, + "year": "{count, plural, other{年} one{年}}", + "@year": { + "description": "年", + "placeholders": { + "count": { + "type": "int", + "example": "1" + } + } + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index c78be9e..c6dd8a5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -302,7 +302,7 @@ class _MainState extends ConsumerState
with WindowListener, WidgetsBinding context: context, locale: AppLocalizations.supportedLocales.firstWhere( (element) => element.languageCode == language.languageCode, - orElse: () => Locale('en', "GB"), + orElse: () => const Locale('en', "GB"), ), child: ScaffoldMessenger(child: child ?? Container()), ), diff --git a/lib/models/item_base_model.dart b/lib/models/item_base_model.dart index ea77d5f..7b229dc 100644 --- a/lib/models/item_base_model.dart +++ b/lib/models/item_base_model.dart @@ -72,7 +72,7 @@ class ItemBaseModel with ItemBaseModelMappable { SortingOptions.parentalRating => overview.parentalRating != null ? Row( children: [ - Icon( + const Icon( IconsaxBold.star_1, size: 14, color: Colors.yellowAccent, @@ -85,7 +85,7 @@ class ItemBaseModel with ItemBaseModelMappable { SortingOptions.communityRating => overview.communityRating != null ? Row( children: [ - Icon( + const Icon( IconsaxBold.star_1, size: 14, color: Colors.yellowAccent, diff --git a/lib/models/items/episode_model.dart b/lib/models/items/episode_model.dart index bc40726..052be90 100644 --- a/lib/models/items/episode_model.dart +++ b/lib/models/items/episode_model.dart @@ -74,7 +74,7 @@ class EpisodeModel extends ItemStreamModel with EpisodeModelMappable { images: images, childCount: childCount, primaryRatio: primaryRatio, - userData: UserData(), + userData: const UserData(), ); @override diff --git a/lib/models/items/item_shared_models.dart b/lib/models/items/item_shared_models.dart index d3cc130..0e21014 100644 --- a/lib/models/items/item_shared_models.dart +++ b/lib/models/items/item_shared_models.dart @@ -35,7 +35,7 @@ class UserData with UserDataMappable { factory UserData.fromDto(dto.UserItemDataDto? dto) { if (dto == null) { - return UserData(); + return const UserData(); } return UserData( isFavourite: dto.isFavorite ?? false, diff --git a/lib/models/items/season_model.dart b/lib/models/items/season_model.dart index 41b03bd..2532aae 100644 --- a/lib/models/items/season_model.dart +++ b/lib/models/items/season_model.dart @@ -89,7 +89,7 @@ class SeasonModel extends ItemBaseModel with SeasonModelMappable { images: images, childCount: childCount, primaryRatio: primaryRatio, - userData: UserData(), + userData: const UserData(), ); static List seasonsFromDto(List? dto, Ref ref) { diff --git a/lib/models/settings/client_settings_model.dart b/lib/models/settings/client_settings_model.dart index af2662e..f16e89b 100644 --- a/lib/models/settings/client_settings_model.dart +++ b/lib/models/settings/client_settings_model.dart @@ -113,5 +113,5 @@ class Vector2 { @override int get hashCode => x.hashCode ^ y.hashCode; - static fromPosition(Offset windowPosition) => Vector2(x: windowPosition.dx, y: windowPosition.dy); + static Vector2 fromPosition(Offset windowPosition) => Vector2(x: windowPosition.dx, y: windowPosition.dy); } diff --git a/lib/providers/dashboard_provider.dart b/lib/providers/dashboard_provider.dart index 27209c0..9527f56 100644 --- a/lib/providers/dashboard_provider.dart +++ b/lib/providers/dashboard_provider.dart @@ -85,7 +85,7 @@ class DashboardNotifier extends StateNotifier { final nextResponse = await api.showsNextUpGet( limit: 16, nextUpDateCutoff: DateTime.now() - .subtract(ref.read(clientSettingsProvider.select((value) => value.nextUpDateCutoff ?? Duration(days: 28)))), + .subtract(ref.read(clientSettingsProvider.select((value) => value.nextUpDateCutoff ?? const Duration(days: 28)))), fields: [ ItemFields.parentid, ItemFields.mediastreams, diff --git a/lib/providers/library_search_provider.dart b/lib/providers/library_search_provider.dart index b9fe295..5130073 100644 --- a/lib/providers/library_search_provider.dart +++ b/lib/providers/library_search_provider.dart @@ -33,7 +33,7 @@ final librarySearchProvider = }); class LibrarySearchNotifier extends StateNotifier { - LibrarySearchNotifier(this.ref) : super(LibrarySearchModel()); + LibrarySearchNotifier(this.ref) : super(const LibrarySearchModel()); final Ref ref; @@ -379,7 +379,7 @@ class LibrarySearchNotifier extends StateNotifier { } } - selectAll(bool select) => state = state.copyWith(selectedPosters: select ? state.posters : []); + LibrarySearchModel selectAll(bool select) => state = state.copyWith(selectedPosters: select ? state.posters : []); Future setSelectedAsFavorite(bool bool) async { final Map updateInfo = {}; diff --git a/lib/providers/session_info_provider.dart b/lib/providers/session_info_provider.dart index 31fb8fc..4a36ed6 100644 --- a/lib/providers/session_info_provider.dart +++ b/lib/providers/session_info_provider.dart @@ -23,7 +23,7 @@ class SessionInfo extends _$SessionInfo { void _startTimer() { _fetchData(); - _timer = Timer.periodic(Duration(seconds: 2), (timer) async { + _timer = Timer.periodic(const Duration(seconds: 2), (timer) async { await _fetchData(); }); } diff --git a/lib/providers/settings/book_viewer_settings_provider.dart b/lib/providers/settings/book_viewer_settings_provider.dart index 97e6d7e..a16bf56 100644 --- a/lib/providers/settings/book_viewer_settings_provider.dart +++ b/lib/providers/settings/book_viewer_settings_provider.dart @@ -130,7 +130,7 @@ class BookViewerSettingsNotifier extends StateNotifier } } - setSavedBrightness() { + void setSavedBrightness() { if (state.screenBrightness != null) { ScreenBrightness().setScreenBrightness(state.screenBrightness!); } diff --git a/lib/providers/settings/home_settings_provider.dart b/lib/providers/settings/home_settings_provider.dart index 63f8fcd..67d5e1f 100644 --- a/lib/providers/settings/home_settings_provider.dart +++ b/lib/providers/settings/home_settings_provider.dart @@ -17,5 +17,5 @@ class HomeSettingsNotifier extends StateNotifier { ref.read(sharedUtilityProvider).homeSettings = value; } - update(HomeSettingsModel Function(HomeSettingsModel currentState) value) => state = value(state); + HomeSettingsModel update(HomeSettingsModel Function(HomeSettingsModel currentState) value) => state = value(state); } diff --git a/lib/providers/settings/subtitle_settings_provider.dart b/lib/providers/settings/subtitle_settings_provider.dart index 2bc89cc..b3271d0 100644 --- a/lib/providers/settings/subtitle_settings_provider.dart +++ b/lib/providers/settings/subtitle_settings_provider.dart @@ -27,14 +27,14 @@ class SubtitleSettingsNotifier extends StateNotifier { void setOutlineColor(Color e) => state = state.copyWith(outlineColor: e); - setOutlineThickness(double value) => state = state.copyWith(outlineSize: value); + SubtitleSettingsModel setOutlineThickness(double value) => state = state.copyWith(outlineSize: value); void resetSettings({SubtitleSettingsModel? value}) => state = value ?? const SubtitleSettingsModel(); void setFontWeight(FontWeight? value) => state = state.copyWith(fontWeight: value); - setBackGroundOpacity(double value) => + SubtitleSettingsModel setBackGroundOpacity(double value) => state = state.copyWith(backGroundColor: state.backGroundColor.withOpacity(value)); - setShadowIntensity(double value) => state = state.copyWith(shadow: value); + SubtitleSettingsModel setShadowIntensity(double value) => state = state.copyWith(shadow: value); } diff --git a/lib/providers/settings/video_player_settings_provider.dart b/lib/providers/settings/video_player_settings_provider.dart index 744e83e..0acd3cf 100644 --- a/lib/providers/settings/video_player_settings_provider.dart +++ b/lib/providers/settings/video_player_settings_provider.dart @@ -36,7 +36,7 @@ class VideoPlayerSettingsProviderNotifier extends StateNotifier { Future syncVideoFile(SyncedItem syncItem, bool skipDownload) async { final playbackResponse = await api.itemsItemIdPlaybackInfoPost( itemId: syncItem.id, - body: PlaybackInfoDto( + body: const PlaybackInfoDto( enableDirectPlay: true, enableDirectStream: true, enableTranscoding: false, diff --git a/lib/providers/video_player_provider.dart b/lib/providers/video_player_provider.dart index 6473bc7..3364ef0 100644 --- a/lib/providers/video_player_provider.dart +++ b/lib/providers/video_player_provider.dart @@ -74,7 +74,7 @@ class VideoPlayerNotifier extends StateNotifier { final lastPosition = ref.read(mediaPlaybackProvider.select((value) => value.lastPosition)); final diff = (position.inMilliseconds - lastPosition.inMilliseconds).abs(); - if (diff > Duration(seconds: 1, milliseconds: 500).inMilliseconds) { + if (diff > const Duration(seconds: 1, milliseconds: 500).inMilliseconds) { mediaState.update((value) => value.copyWith( position: event, playing: player.state.playing, diff --git a/lib/screens/book_viewer/book_viewer_reader_web.dart b/lib/screens/book_viewer/book_viewer_reader_web.dart index 2c2c20d..2d1eb3e 100644 --- a/lib/screens/book_viewer/book_viewer_reader_web.dart +++ b/lib/screens/book_viewer/book_viewer_reader_web.dart @@ -27,7 +27,7 @@ class BookViewerReader extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { return Container( - child: Text("Web not supported."), + child: const Text("Web not supported."), ); } } diff --git a/lib/screens/book_viewer/book_viewer_screen.dart b/lib/screens/book_viewer/book_viewer_screen.dart index f9ee091..4d9a2a0 100644 --- a/lib/screens/book_viewer/book_viewer_screen.dart +++ b/lib/screens/book_viewer/book_viewer_screen.dart @@ -159,14 +159,14 @@ class _BookViewerScreenState extends ConsumerState { ), } else ...{ const SizedBox(height: 32), - Card( + const Card( child: Padding( - padding: const EdgeInsets.all(16), + padding: EdgeInsets.all(16), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon(Icons.info_rounded), - const SizedBox(width: 16), + SizedBox(width: 16), Text("No next chapter"), ], ), @@ -211,14 +211,14 @@ class _BookViewerScreenState extends ConsumerState { ), } else ...{ const SizedBox(height: 32), - Card( + const Card( child: Padding( - padding: const EdgeInsets.all(16), + padding: EdgeInsets.all(16), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon(Icons.info_rounded), - const SizedBox(width: 16), + SizedBox(width: 16), Text("First chapter"), ], ), diff --git a/lib/screens/dashboard/dashboard_screen.dart b/lib/screens/dashboard/dashboard_screen.dart index 8caf0b7..3d4269a 100644 --- a/lib/screens/dashboard/dashboard_screen.dart +++ b/lib/screens/dashboard/dashboard_screen.dart @@ -120,9 +120,9 @@ class _DashboardScreenState extends ConsumerState { ), ), } else if (AdaptiveLayout.of(context).isDesktop) - DefaultSliverTopBadding(), + const DefaultSliverTopBadding(), if (AdaptiveLayout.of(context).isDesktop) - SliverToBoxAdapter( + const SliverToBoxAdapter( child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ @@ -191,7 +191,7 @@ class _DashboardScreenState extends ConsumerState { posters: view.recentlyAdded, ), )), - ].whereNotNull().toList().addInBetween(SliverToBoxAdapter(child: SizedBox(height: 16))), + ].whereNotNull().toList().addInBetween(const SliverToBoxAdapter(child: SizedBox(height: 16))), const DefautlSliverBottomPadding(), ], ), diff --git a/lib/screens/details_screens/components/overview_header.dart b/lib/screens/details_screens/components/overview_header.dart index 3e894a3..23c09d6 100644 --- a/lib/screens/details_screens/components/overview_header.dart +++ b/lib/screens/details_screens/components/overview_header.dart @@ -83,7 +83,7 @@ class OverviewHeader extends ConsumerWidget { if (onTitleClicked != null) IconButton( onPressed: onTitleClicked, - icon: Transform.translate(offset: Offset(0, 1.5), child: Icon(Icons.read_more_rounded))) + icon: Transform.translate(offset: const Offset(0, 1.5), child: const Icon(Icons.read_more_rounded))) ], ), ), diff --git a/lib/screens/details_screens/season_detail_screen.dart b/lib/screens/details_screens/season_detail_screen.dart index b21b9c6..e34be27 100644 --- a/lib/screens/details_screens/season_detail_screen.dart +++ b/lib/screens/details_screens/season_detail_screen.dart @@ -58,7 +58,7 @@ class _SeasonDetailScreenState extends ConsumerState { crossAxisAlignment: WrapCrossAlignment.center, children: [ ConstrainedBox( - constraints: BoxConstraints( + constraints: const BoxConstraints( maxWidth: 600, ), child: Column( @@ -86,7 +86,7 @@ class _SeasonDetailScreenState extends ConsumerState { ), ), ConstrainedBox( - constraints: BoxConstraints(maxWidth: 300), + constraints: const BoxConstraints(maxWidth: 300), child: Card(child: FladderImage(image: details.getPosters?.primary))), ], ).padding(padding), @@ -122,7 +122,7 @@ class _SeasonDetailScreenState extends ConsumerState { Card( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(200)), child: SegmentedButton( - style: ButtonStyle( + style: const ButtonStyle( elevation: WidgetStatePropertyAll(5), side: WidgetStatePropertyAll(BorderSide.none), ), diff --git a/lib/screens/favourites/favourites_screen.dart b/lib/screens/favourites/favourites_screen.dart index 7a35d04..baf73e5 100644 --- a/lib/screens/favourites/favourites_screen.dart +++ b/lib/screens/favourites/favourites_screen.dart @@ -41,7 +41,7 @@ class FavouritesScreen extends ConsumerWidget { else const DefaultSliverTopBadding(), if (AdaptiveLayout.of(context).isDesktop) - SliverToBoxAdapter( + const SliverToBoxAdapter( child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ diff --git a/lib/screens/library_search/library_search_screen.dart b/lib/screens/library_search/library_search_screen.dart index ede46bc..ea64112 100644 --- a/lib/screens/library_search/library_search_screen.dart +++ b/lib/screens/library_search/library_search_screen.dart @@ -142,7 +142,7 @@ class _LibrarySearchScreenState extends ConsumerState { floatingActionButtonLocation: playerState == VideoPlayerState.minimized ? FloatingActionButtonLocation.centerFloat : null, floatingActionButton: switch (playerState) { - VideoPlayerState.minimized => Padding( + VideoPlayerState.minimized => const Padding( padding: EdgeInsets.symmetric(horizontal: 8), child: FloatingPlayerBar(), ), @@ -171,7 +171,7 @@ class _LibrarySearchScreenState extends ConsumerState { label: Text(context.localized.viewPhotos), icon: const Icon(IconsaxBold.gallery), ) - ].addInBetween(SizedBox(height: 10)), + ].addInBetween(const SizedBox(height: 10)), ), ), }, @@ -251,12 +251,12 @@ class _LibrarySearchScreenState extends ConsumerState { []; final itemCountWidget = ItemActionButton( label: Text(context.localized.itemCount(librarySearchResults.totalItemCount)), - icon: Icon(IconsaxBold.document_1), + icon: const Icon(IconsaxBold.document_1), ); final refreshAction = ItemActionButton( label: Text(context.localized.forceRefresh), action: () => refreshKey.currentState?.show(), - icon: Icon(IconsaxOutline.refresh), + icon: const Icon(IconsaxOutline.refresh), ); final itemViewAction = ItemActionButton( label: Text(context.localized.selectViewType), @@ -279,7 +279,7 @@ class _LibrarySearchScreenState extends ConsumerState { .map( (e) => FilledButton.tonal( style: FilledButtonTheme.of(context).style?.copyWith( - padding: WidgetStatePropertyAll( + padding: const WidgetStatePropertyAll( EdgeInsets.symmetric( horizontal: 12, vertical: 24)), backgroundColor: WidgetStateProperty.resolveWith( @@ -373,7 +373,7 @@ class _LibrarySearchScreenState extends ConsumerState { }), if (AdaptiveLayout.of(context).layout == LayoutState.phone) ...[ const SizedBox(width: 6), - SizedBox.square(dimension: 46, child: SettingsUserIcon()), + const SizedBox.square(dimension: 46, child: SettingsUserIcon()), ], const SizedBox(width: 12) ], @@ -421,7 +421,7 @@ class _LibrarySearchScreenState extends ConsumerState { ), ), ), - Row(), + const Row(), ], ), ), @@ -429,7 +429,7 @@ class _LibrarySearchScreenState extends ConsumerState { ), ), if (AdaptiveLayout.of(context).isDesktop) - SliverToBoxAdapter( + const SliverToBoxAdapter( child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ @@ -476,15 +476,15 @@ class _LibrarySearchScreenState extends ConsumerState { borderRadius: BorderRadius.circular(16), ), child: Padding( - padding: EdgeInsets.all(16), + padding: const EdgeInsets.all(16), child: Row( mainAxisSize: MainAxisSize.min, children: [ - CircularProgressIndicator.adaptive(), + const CircularProgressIndicator.adaptive(), Text(context.localized.fetchingLibrary, style: Theme.of(context).textTheme.titleMedium), IconButton( onPressed: () => libraryProvider.cancelFetch(), - icon: Icon(IconsaxOutline.close_square), + icon: const Icon(IconsaxOutline.close_square), ) ].addInBetween(const SizedBox(width: 16)), ), @@ -598,7 +598,7 @@ class _LibrarySearchBottomBar extends ConsumerWidget { if (context.mounted) context.refreshData(); }, label: Text(context.localized.addToCollection), - icon: Icon( + icon: const Icon( IconsaxOutline.save_add, size: 20, ), @@ -726,7 +726,7 @@ class _LibrarySearchBottomBar extends ConsumerWidget { ), ); }, - icon: Icon(IconsaxOutline.more)) + icon: const Icon(IconsaxOutline.more)) }, ], ), @@ -775,7 +775,7 @@ class _LibrarySearchBottomBar extends ConsumerWidget { ), ], ), - if (AdaptiveLayout.of(context).isDesktop) SizedBox(height: 8), + if (AdaptiveLayout.of(context).isDesktop) const SizedBox(height: 8), ], ), ); diff --git a/lib/screens/library_search/widgets/library_views.dart b/lib/screens/library_search/widgets/library_views.dart index b043b68..7ce625f 100644 --- a/lib/screens/library_search/widgets/library_views.dart +++ b/lib/screens/library_search/widgets/library_views.dart @@ -81,7 +81,7 @@ class LibraryViews extends ConsumerWidget { if (ref.watch(librarySearchProvider(key!).select((value) => value.nestedCurrentItem is BoxSetModel))) ...{ ItemActionButton( label: Text(context.localized.removeFromCollection), - icon: Icon(IconsaxOutline.archive_slash), + icon: const Icon(IconsaxOutline.archive_slash), action: () async { await libraryProvider.removeFromCollection(items: [item]); if (context.mounted) { @@ -93,7 +93,7 @@ class LibraryViews extends ConsumerWidget { if (ref.watch(librarySearchProvider(key!).select((value) => value.nestedCurrentItem is PlaylistModel))) ...{ ItemActionButton( label: Text(context.localized.removeFromPlaylist), - icon: Icon(IconsaxOutline.archive_minus), + icon: const Icon(IconsaxOutline.archive_minus), action: () async { await libraryProvider.removeFromPlaylist(items: [item]); if (context.mounted) { diff --git a/lib/screens/library_search/widgets/suggestion_search_bar.dart b/lib/screens/library_search/widgets/suggestion_search_bar.dart index d61ae16..8a92b2f 100644 --- a/lib/screens/library_search/widgets/suggestion_search_bar.dart +++ b/lib/screens/library_search/widgets/suggestion_search_bar.dart @@ -98,8 +98,8 @@ class _SearchBarState extends ConsumerState { }, decoration: InputDecoration( hintText: widget.title ?? "${context.localized.search}...", - prefixIcon: Icon(IconsaxOutline.search_normal), - contentPadding: EdgeInsets.only(top: 13), + prefixIcon: const Icon(IconsaxOutline.search_normal), + contentPadding: const EdgeInsets.only(top: 13), suffixIcon: controller.text.isNotEmpty ? IconButton( onPressed: () { diff --git a/lib/screens/login/lock_screen.dart b/lib/screens/login/lock_screen.dart index 4e5d0b1..29aee34 100644 --- a/lib/screens/login/lock_screen.dart +++ b/lib/screens/login/lock_screen.dart @@ -116,7 +116,7 @@ class _LockScreenState extends ConsumerState with WidgetsBindingObse size: 38, ), ConstrainedBox( - constraints: BoxConstraints( + constraints: const BoxConstraints( maxHeight: 400, maxWidth: 400, ), diff --git a/lib/screens/login/login_edit_user.dart b/lib/screens/login/login_edit_user.dart index 5dfbf85..06cd5d3 100644 --- a/lib/screens/login/login_edit_user.dart +++ b/lib/screens/login/login_edit_user.dart @@ -57,7 +57,7 @@ class LoginEditUser extends ConsumerWidget { ), Row( children: [ - Icon(IconsaxBold.clock), + const Icon(IconsaxBold.clock), const SizedBox(width: 8), Column( mainAxisAlignment: MainAxisAlignment.start, diff --git a/lib/screens/login/login_screen.dart b/lib/screens/login/login_screen.dart index 646a537..d6a7f0e 100644 --- a/lib/screens/login/login_screen.dart +++ b/lib/screens/login/login_screen.dart @@ -79,13 +79,13 @@ class _LoginPageState extends ConsumerState { children: [ if (!AdaptiveLayout.of(context).isDesktop) FloatingActionButton( - key: Key("edit_button"), - child: Icon(IconsaxOutline.edit_2), + key: const Key("edit_button"), + child: const Icon(IconsaxOutline.edit_2), onPressed: () => setState(() => editingUsers = !editingUsers), ), FloatingActionButton( - key: Key("new_button"), - child: Icon(IconsaxOutline.add_square), + key: const Key("new_button"), + child: const Icon(IconsaxOutline.add_square), onPressed: startAddingNewUser, ), ].addInBetween(const SizedBox(width: 16)), @@ -98,7 +98,7 @@ class _LoginPageState extends ConsumerState { shrinkWrap: true, padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 32), children: [ - Center( + const Center( child: FladderLogo(), ), AnimatedFadeSize( @@ -369,7 +369,7 @@ class _LoginPageState extends ConsumerState { children: [ Text(context.localized.login), const SizedBox(width: 8), - Icon(IconsaxBold.send_1), + const Icon(IconsaxBold.send_1), ], ), ), diff --git a/lib/screens/login/login_user_grid.dart b/lib/screens/login/login_user_grid.dart index 27012aa..c4b7cbf 100644 --- a/lib/screens/login/login_user_grid.dart +++ b/lib/screens/login/login_user_grid.dart @@ -88,16 +88,16 @@ class LoginUserGrid extends ConsumerWidget { ], ), ) - ].addInBetween(SizedBox(width: 4, height: 4)), + ].addInBetween(const SizedBox(width: 4, height: 4)), ), if (editMode) Align( alignment: Alignment.topRight, child: Card( color: Theme.of(context).colorScheme.errorContainer, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: const Icon( + child: const Padding( + padding: EdgeInsets.all(8.0), + child: Icon( IconsaxBold.edit_2, size: 14, ), diff --git a/lib/screens/login/widgets/discover_servers_widget.dart b/lib/screens/login/widgets/discover_servers_widget.dart index 6e1b788..d6d1707 100644 --- a/lib/screens/login/widgets/discover_servers_widget.dart +++ b/lib/screens/login/widgets/discover_servers_widget.dart @@ -41,7 +41,7 @@ class DiscoverServersWidget extends ConsumerWidget { style: context.textTheme.bodyLarge, ), const Spacer(), - Opacity(opacity: 0.65, child: Icon(IconsaxOutline.bookmark, size: 16)), + const Opacity(opacity: 0.65, child: Icon(IconsaxOutline.bookmark, size: 16)), ], ), const SizedBox(height: 4), @@ -63,7 +63,7 @@ class DiscoverServersWidget extends ConsumerWidget { style: context.textTheme.bodyLarge, ), const Spacer(), - Opacity(opacity: 0.65, child: Icon(IconsaxBold.airdrop, size: 16)), + const Opacity(opacity: 0.65, child: Icon(IconsaxBold.airdrop, size: 16)), ], ), const SizedBox(height: 4), @@ -92,7 +92,7 @@ class DiscoverServersWidget extends ConsumerWidget { )); }, error: (error, stackTrace) => Text(context.localized.error), - loading: () => Center( + loading: () => const Center( child: SizedBox.square( dimension: 24.0, child: CircularProgressIndicator.adaptive(strokeCap: StrokeCap.round), @@ -151,7 +151,7 @@ class _ServerInfoCard extends StatelessWidget { ], ), ), - Icon(IconsaxOutline.edit_2, size: 16) + const Icon(IconsaxOutline.edit_2, size: 16) ].addInBetween(const SizedBox(width: 12)), ), ), diff --git a/lib/screens/login/widgets/login_icon.dart b/lib/screens/login/widgets/login_icon.dart index dad6138..d0f374e 100644 --- a/lib/screens/login/widgets/login_icon.dart +++ b/lib/screens/login/widgets/login_icon.dart @@ -82,7 +82,7 @@ class LoginIcon extends ConsumerWidget { ], ), ) - ].addInBetween(SizedBox(width: 8, height: 8)), + ].addInBetween(const SizedBox(width: 8, height: 8)), ), ), FlatButton( diff --git a/lib/screens/metadata/edit_item.dart b/lib/screens/metadata/edit_item.dart index 6fc06a3..b4fb2bd 100644 --- a/lib/screens/metadata/edit_item.dart +++ b/lib/screens/metadata/edit_item.dart @@ -28,7 +28,7 @@ Future showEditItemPopup( ); return AdaptiveLayout.of(context).inputDevice == InputDevice.pointer ? Dialog( - insetPadding: EdgeInsets.all(64), + insetPadding: const EdgeInsets.all(64), child: editWidget(), ) : Dialog.fullscreen( @@ -75,11 +75,11 @@ class _EditDialogSwitcherState extends ConsumerState with Ti final advancedFields = ref.watch(editItemProvider.notifier).advancedFields ?? {}; Map widgets = { - Tab(text: "General"): EditFields(fields: generalFields, json: state), - Tab(text: "Primary"): EditImageContent(type: ImageType.primary), - Tab(text: "Logo"): EditImageContent(type: ImageType.logo), - Tab(text: "Backdrops"): EditImageContent(type: ImageType.backdrop), - Tab(text: "Advanced"): EditFields(fields: advancedFields, json: state), + const Tab(text: "General"): EditFields(fields: generalFields, json: state), + const Tab(text: "Primary"): const EditImageContent(type: ImageType.primary), + const Tab(text: "Logo"): const EditImageContent(type: ImageType.logo), + const Tab(text: "Backdrops"): const EditImageContent(type: ImageType.backdrop), + const Tab(text: "Advanced"): EditFields(fields: advancedFields, json: state), }; return Card( @@ -103,7 +103,7 @@ class _EditDialogSwitcherState extends ConsumerState with Ti style: Theme.of(context).textTheme.titleLarge, ), ), - IconButton(onPressed: () => refreshEditor(), icon: Icon(IconsaxOutline.refresh)) + IconButton(onPressed: () => refreshEditor(), icon: const Icon(IconsaxOutline.refresh)) ], ), ), diff --git a/lib/screens/metadata/edit_screens/edit_fields.dart b/lib/screens/metadata/edit_screens/edit_fields.dart index 17b7628..74c850f 100644 --- a/lib/screens/metadata/edit_screens/edit_fields.dart +++ b/lib/screens/metadata/edit_screens/edit_fields.dart @@ -46,7 +46,7 @@ class _EditGeneralState extends ConsumerState { children: [ Flexible( child: ListView( - padding: EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric(horizontal: 16), shrinkWrap: true, children: [ if (widget.json != null) @@ -64,7 +64,7 @@ class _EditGeneralState extends ConsumerState { current: map.entries.firstWhereOrNull((element) => element.value == true)?.key ?? "", itemBuilder: (context) => [ PopupMenuItem( - child: Text(""), + child: const Text(""), onTap: () => ref.read(editItemProvider.notifier).updateField(MapEntry(e.key, "")), ), ...map.entries.map( @@ -119,7 +119,7 @@ class _EditGeneralState extends ConsumerState { onPressed: () => ref.read(editItemProvider.notifier).updateField( MapEntry(e.key, list..remove(genre)), ), - icon: Icon(Icons.remove_rounded)) + icon: const Icon(Icons.remove_rounded)) ], ), ), @@ -217,7 +217,7 @@ class _EditGeneralState extends ConsumerState { ref.read(editItemProvider.notifier).updateField( MapEntry(e.key, listToMap(list..remove(person)))); }, - icon: Icon(Icons.remove_rounded)) + icon: const Icon(Icons.remove_rounded)) ], ), ), @@ -272,7 +272,7 @@ class _EditGeneralState extends ConsumerState { personRole.text = ""; }); }, - icon: Icon(Icons.add_rounded), + icon: const Icon(Icons.add_rounded), ) ], ), @@ -326,7 +326,7 @@ class _EditGeneralState extends ConsumerState { message: "Open in browser", child: IconButton( onPressed: () => launchUrl(context, externalUrl.url), - icon: Icon(Icons.open_in_browser_rounded)), + icon: const Icon(Icons.open_in_browser_rounded)), ), IconButton( onPressed: () { @@ -338,7 +338,7 @@ class _EditGeneralState extends ConsumerState { .toList()), ); }, - icon: Icon(Icons.remove_rounded)) + icon: const Icon(Icons.remove_rounded)) ], ), ), @@ -371,7 +371,7 @@ class _EditGeneralState extends ConsumerState { .toList()), ); }, - icon: Icon(Icons.add_rounded), + icon: const Icon(Icons.add_rounded), ) ], ), @@ -429,7 +429,7 @@ class _EditGeneralState extends ConsumerState { const Spacer(), IconButton( onPressed: () => setMapping(list..remove(studio)), - icon: Icon(Icons.remove_rounded)) + icon: const Icon(Icons.remove_rounded)) ], ), ), @@ -557,7 +557,7 @@ class _EditGeneralState extends ConsumerState { .read(editItemProvider.notifier) .updateField(MapEntry(e.key, newDate.toIso8601String())); }, - icon: Icon(IconsaxOutline.calendar_2)) + icon: const Icon(IconsaxOutline.calendar_2)) ], ), DisplayOrder _ => Builder(builder: (context) { @@ -580,8 +580,8 @@ class _EditGeneralState extends ConsumerState { .toList(), ), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12), child: Text("Order episodes by air date, DVD order, or absolute numbering."), ) ], @@ -656,7 +656,7 @@ class _EditGeneralState extends ConsumerState { children: [ Text(keyLabel, style: Theme.of(context).textTheme.titleLarge), const SizedBox(height: 6), - Text( + const Text( "Uncheck a field to lock it and prevent its data from being changed.", ), const SizedBox(height: 6), @@ -722,8 +722,8 @@ class _EditGeneralState extends ConsumerState { }, ) else - Padding( - padding: const EdgeInsets.all(8.0), + const Padding( + padding: EdgeInsets.all(8.0), child: Center( child: CircularProgressIndicator.adaptive(strokeCap: StrokeCap.round), ), diff --git a/lib/screens/metadata/edit_screens/edit_image_content.dart b/lib/screens/metadata/edit_screens/edit_image_content.dart index 4670216..3016969 100644 --- a/lib/screens/metadata/edit_screens/edit_image_content.dart +++ b/lib/screens/metadata/edit_screens/edit_image_content.dart @@ -105,7 +105,7 @@ class _EditImageContentState extends ConsumerState { Align( alignment: Alignment.bottomRight, child: Transform.translate( - offset: Offset(2, 2), + offset: const Offset(2, 2), child: IconButton.filledTonal( style: FilledButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.error, @@ -115,10 +115,10 @@ class _EditImageContentState extends ConsumerState { await showDialog( context: context, builder: (context) => AlertDialog.adaptive( - title: Text("Delete image"), - content: Text("Deleting is permanent are you sure?"), + title: const Text("Delete image"), + content: const Text("Deleting is permanent are you sure?"), actions: [ - ElevatedButton(onPressed: () => Navigator.of(context).pop(), child: Text("Cancel")), + ElevatedButton(onPressed: () => Navigator.of(context).pop(), child: const Text("Cancel")), FilledButton( style: FilledButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.error, @@ -128,7 +128,7 @@ class _EditImageContentState extends ConsumerState { await ref.read(editItemProvider.notifier).deleteImage(widget.type, image); Navigator.of(context).pop(); }, - child: Text( + child: const Text( "Delete", ), ) @@ -136,7 +136,7 @@ class _EditImageContentState extends ConsumerState { ), ); }, - icon: Icon(Icons.delete_rounded), + icon: const Icon(Icons.delete_rounded), ), ), ) @@ -208,7 +208,7 @@ class _EditImageContentState extends ConsumerState { ), ), SettingsListTile( - label: Text("Include all languages"), + label: const Text("Include all languages"), trailing: Switch.adaptive( value: includeAllImages, onChanged: (value) { @@ -231,7 +231,7 @@ class _EditImageContentState extends ConsumerState { ), children: [...serverImageCards, ...imageCards], ), - if (loading) Center(child: CircularProgressIndicator.adaptive(strokeCap: StrokeCap.round)), + if (loading) const Center(child: CircularProgressIndicator.adaptive(strokeCap: StrokeCap.round)), if (!loading && [...serverImageCards, ...imageCards].isEmpty) Center(child: Text("No ${widget.type.value}s found")) ], diff --git a/lib/screens/metadata/identifty_screen.dart b/lib/screens/metadata/identifty_screen.dart index f7d828b..f0f4ca1 100644 --- a/lib/screens/metadata/identifty_screen.dart +++ b/lib/screens/metadata/identifty_screen.dart @@ -72,7 +72,7 @@ class _IdentifyScreenState extends ConsumerState with TickerProv const Spacer(), IconButton( onPressed: () async => await ref.read(provider.notifier).fetchInformation(), - icon: Icon(IconsaxOutline.refresh)), + icon: const Icon(IconsaxOutline.refresh)), ], ), ), @@ -106,7 +106,7 @@ class _IdentifyScreenState extends ConsumerState with TickerProv if (posters.isEmpty) Center( child: processing - ? CircularProgressIndicator.adaptive(strokeCap: StrokeCap.round) + ? const CircularProgressIndicator.adaptive(strokeCap: StrokeCap.round) : Text(context.localized.noResults), ) else @@ -181,7 +181,7 @@ class _IdentifyScreenState extends ConsumerState with TickerProv launchUrl(context, url ?? ""); }, - icon: Icon(Icons.launch_rounded)), + icon: const Icon(Icons.launch_rounded)), ), Tooltip( message: "Select result", @@ -202,7 +202,7 @@ class _IdentifyScreenState extends ConsumerState with TickerProv Navigator.of(context).pop(); } : null, - icon: Icon(Icons.save_alt_rounded), + icon: const Icon(Icons.save_alt_rounded), ), ) ], diff --git a/lib/screens/metadata/info_screen.dart b/lib/screens/metadata/info_screen.dart index 6834781..00e2262 100644 --- a/lib/screens/metadata/info_screen.dart +++ b/lib/screens/metadata/info_screen.dart @@ -125,7 +125,7 @@ class ItemInfoScreenState extends ConsumerState { style: Theme.of(context).textTheme.titleLarge, ), ), - Opacity(opacity: 0.3, child: const Divider()), + const Opacity(opacity: 0.3, child: Divider()), Padding( padding: const EdgeInsets.all(8.0), child: Row( diff --git a/lib/screens/photo_viewer/photo_viewer_controls.dart b/lib/screens/photo_viewer/photo_viewer_controls.dart index 5bb59a6..a14bfd0 100644 --- a/lib/screens/photo_viewer/photo_viewer_controls.dart +++ b/lib/screens/photo_viewer/photo_viewer_controls.dart @@ -214,13 +214,13 @@ class _PhotoViewerControllsState extends ConsumerState with ?.copyWith(fontWeight: FontWeight.bold), ), if (widget.loadingMoreItems) - SizedBox.square( + const SizedBox.square( dimension: 16, child: CircularProgressIndicator.adaptive( strokeCap: StrokeCap.round, ), ), - ].addInBetween(SizedBox(width: 6)), + ].addInBetween(const SizedBox(width: 6)), ), ), Positioned.fill( @@ -301,7 +301,7 @@ class _PhotoViewerControllsState extends ConsumerState with onPressed: widget.openOptions, icon: IconsaxOutline.more_2, ), - Spacer(), + const Spacer(), ElevatedIconButton( onPressed: markAsFavourite, color: widget.photo.userData.isFavourite ? Colors.red : null, diff --git a/lib/screens/photo_viewer/photo_viewer_screen.dart b/lib/screens/photo_viewer/photo_viewer_screen.dart index 937f45b..6b39b7a 100644 --- a/lib/screens/photo_viewer/photo_viewer_screen.dart +++ b/lib/screens/photo_viewer/photo_viewer_screen.dart @@ -150,7 +150,7 @@ class _PhotoViewerScreenState extends ConsumerState with Widg onExit: (event) => setState(() => _showOverlay(show: false)), child: Scaffold( appBar: photos.isEmpty - ? FladderAppbar( + ? const FladderAppbar( automaticallyImplyLeading: true, ) : null, @@ -242,7 +242,7 @@ class _PhotoViewerScreenState extends ConsumerState with Widg ), ), switch (state.extendedImageLoadState) { - LoadState.loading => Center( + LoadState.loading => const Center( child: CircularProgressIndicator.adaptive(strokeCap: StrokeCap.round), ), LoadState.completed => switch (photo.internalType) { @@ -256,7 +256,7 @@ class _PhotoViewerScreenState extends ConsumerState with Widg LoadState.failed || _ => Align( alignment: Alignment.topRight, child: Padding( - padding: EdgeInsets.all(24).copyWith(top: topPadding + 85), + padding: const EdgeInsets.all(24).copyWith(top: topPadding + 85), child: Card( child: Padding( padding: const EdgeInsets.all(24), @@ -426,7 +426,7 @@ class _PhotoViewerScreenState extends ConsumerState with Widg controller: scrollController, children: [ Padding( - padding: EdgeInsets.symmetric(horizontal: 12), + padding: const EdgeInsets.symmetric(horizontal: 12), child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: Consumer(builder: (context, ref, child) { @@ -474,7 +474,7 @@ class _PhotoViewerScreenState extends ConsumerState with Widg }), ), ), - Divider(), + const Divider(), ...currentPhoto .generateActions( context, diff --git a/lib/screens/settings/client_settings_page.dart b/lib/screens/settings/client_settings_page.dart index 15f1f8e..7c2c677 100644 --- a/lib/screens/settings/client_settings_page.dart +++ b/lib/screens/settings/client_settings_page.dart @@ -109,7 +109,7 @@ class _ClientSettingsPageState extends ConsumerState { ], ), ), - icon: Icon(IconsaxOutline.folder_minus), + icon: const Icon(IconsaxOutline.folder_minus), ) : null, ), diff --git a/lib/screens/settings/quick_connect_window.dart b/lib/screens/settings/quick_connect_window.dart index e2a196b..2840796 100644 --- a/lib/screens/settings/quick_connect_window.dart +++ b/lib/screens/settings/quick_connect_window.dart @@ -10,7 +10,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; Future openQuickConnectDialog( BuildContext context, ) async { - return showDialog(context: context, builder: (context) => QuickConnectDialog()); + return showDialog(context: context, builder: (context) => const QuickConnectDialog()); } class QuickConnectDialog extends ConsumerStatefulWidget { @@ -90,7 +90,7 @@ class _QuickConnectDialogState extends ConsumerState { success = context.localized.loggedIn; }, ); - await Future.delayed(Duration(seconds: 2)); + await Future.delayed(const Duration(seconds: 2)); Navigator.of(context).pop(); } else { if (controller.text.isEmpty) { @@ -106,7 +106,7 @@ class _QuickConnectDialogState extends ConsumerState { controller.text = ""; }, child: loading - ? SizedBox.square( + ? const SizedBox.square( child: CircularProgressIndicator(), dimension: 16.0, ) diff --git a/lib/screens/settings/settings_screen.dart b/lib/screens/settings/settings_screen.dart index 387a22b..a6e07b4 100644 --- a/lib/screens/settings/settings_screen.dart +++ b/lib/screens/settings/settings_screen.dart @@ -92,7 +92,7 @@ class _SettingsScreenState extends ConsumerState { }, icon: Padding( padding: EdgeInsets.all(AdaptiveLayout.of(context).inputDevice == InputDevice.pointer ? 0 : 4), - child: Icon(IconsaxOutline.arrow_left_2), + child: const Icon(IconsaxOutline.arrow_left_2), ), ), ), @@ -126,7 +126,7 @@ class _SettingsScreenState extends ConsumerState { ), SettingsListTile( label: Text(context.localized.about), - subLabel: Text("Fladder"), + subLabel: const Text("Fladder"), suffix: Opacity( opacity: 1, child: FladderIconOutlined( @@ -135,7 +135,7 @@ class _SettingsScreenState extends ConsumerState { )), onTap: () => showAboutDialog( context: context, - applicationIcon: FladderIcon(size: 85), + applicationIcon: const FladderIcon(size: 85), applicationVersion: ref.watch(applicationInfoProvider).versionAndPlatform, applicationLegalese: "Donut Factory", ), diff --git a/lib/screens/shared/authenticate_button_options.dart b/lib/screens/shared/authenticate_button_options.dart index 4751d9b..0e0ed22 100644 --- a/lib/screens/shared/authenticate_button_options.dart +++ b/lib/screens/shared/authenticate_button_options.dart @@ -7,7 +7,7 @@ import 'package:fladder/util/list_padding.dart'; import 'package:fladder/util/localization_helper.dart'; import 'package:flutter/material.dart'; -showAuthOptionsDialogue( +void showAuthOptionsDialogue( BuildContext context, AccountModel currentUser, Function(AccountModel) setMethod, diff --git a/lib/screens/shared/chips/category_chip.dart b/lib/screens/shared/chips/category_chip.dart index 575025e..6d7e247 100644 --- a/lib/screens/shared/chips/category_chip.dart +++ b/lib/screens/shared/chips/category_chip.dart @@ -225,7 +225,7 @@ class _CategoryChipEditorState extends State> { onChanged: (value) => updateKey(MapEntry(element.key, value == null ? null : element.value)), ); }), - Divider(), + const Divider(), }, ...otherItems.mapIndexed((index, element) { return CheckboxListTile.adaptive( diff --git a/lib/screens/shared/default_titlebar.dart b/lib/screens/shared/default_titlebar.dart index 369489d..c090992 100644 --- a/lib/screens/shared/default_titlebar.dart +++ b/lib/screens/shared/default_titlebar.dart @@ -87,7 +87,7 @@ class _DefaultTitleBarState extends ConsumerState with WindowLi } }, icon: Transform.translate( - offset: Offset(0, -2), + offset: const Offset(0, -2), child: Icon( Icons.minimize_rounded, color: iconColor, @@ -126,7 +126,7 @@ class _DefaultTitleBarState extends ConsumerState with WindowLi } }, icon: Transform.translate( - offset: Offset(0, 0), + offset: const Offset(0, 0), child: Icon( maximized ? Icons.maximize_rounded : Icons.crop_square_rounded, color: iconColor, @@ -148,7 +148,7 @@ class _DefaultTitleBarState extends ConsumerState with WindowLi windowManager.close(); }, icon: Transform.translate( - offset: Offset(0, -2), + offset: const Offset(0, -2), child: Icon( Icons.close_rounded, color: iconColor, diff --git a/lib/screens/shared/detail_scaffold.dart b/lib/screens/shared/detail_scaffold.dart index afdf0de..59b9aaf 100644 --- a/lib/screens/shared/detail_scaffold.dart +++ b/lib/screens/shared/detail_scaffold.dart @@ -72,7 +72,7 @@ class _DetailScreenState extends ConsumerState { ), //Small offset to match detailscaffold child: Transform.translate( - offset: Offset(0, -5), child: FladderImage(image: widget.item?.getPosters?.primary)), + offset: const Offset(0, -5), child: FladderImage(image: widget.item?.getPosters?.primary)), ), ), AnimatedFadeSize( @@ -140,8 +140,8 @@ class _DetailScaffoldState extends ConsumerState { child: Scaffold( floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, floatingActionButton: switch (playerState) { - VideoPlayerState.minimized => Padding( - padding: const EdgeInsets.all(8.0), + VideoPlayerState.minimized => const Padding( + padding: EdgeInsets.all(8.0), child: FloatingPlayerBar(), ), _ => null, @@ -204,11 +204,11 @@ class _DetailScaffoldState extends ConsumerState { IconTheme( data: IconThemeData(color: Theme.of(context).colorScheme.onSurface), child: Transform.translate( - offset: Offset(0, kToolbarHeight), + offset: const Offset(0, kToolbarHeight), child: Row( children: [ Padding( - padding: EdgeInsets.only(left: 16), + padding: const EdgeInsets.only(left: 16), child: IconButton.filledTonal( style: IconButton.styleFrom( backgroundColor: backGroundColor, @@ -223,7 +223,7 @@ class _DetailScaffoldState extends ConsumerState { icon: Padding( padding: EdgeInsets.all(AdaptiveLayout.of(context).inputDevice == InputDevice.pointer ? 0 : 4), - child: Icon(IconsaxOutline.arrow_left_2), + child: const Icon(IconsaxOutline.arrow_left_2), ), ), ), @@ -273,17 +273,17 @@ class _DetailScaffoldState extends ConsumerState { message: context.localized.refresh, child: IconButton( onPressed: () => context.refreshData(), - icon: Icon(IconsaxOutline.refresh), + icon: const Icon(IconsaxOutline.refresh), ), ), ) else - SizedBox(height: 30, width: 30, child: SettingsUserIcon()), + const SizedBox(height: 30, width: 30, child: SettingsUserIcon()), Tooltip( message: context.localized.home, child: IconButton( onPressed: () => context.routeGo(DashboardRoute()), - icon: Icon(IconsaxOutline.home), + icon: const Icon(IconsaxOutline.home), ), ), ], diff --git a/lib/screens/shared/file_picker.dart b/lib/screens/shared/file_picker.dart index 2865b3b..c9d5622 100644 --- a/lib/screens/shared/file_picker.dart +++ b/lib/screens/shared/file_picker.dart @@ -94,7 +94,7 @@ class _FilePickerBarState extends ConsumerState { }, onDragExited: (details) => setState(() => dragStart = false), child: Container( - constraints: BoxConstraints(minHeight: 50, minWidth: 50), + constraints: const BoxConstraints(minHeight: 50, minWidth: 50), decoration: BoxDecoration( color: Colors.grey, gradient: LinearGradient( @@ -106,7 +106,7 @@ class _FilePickerBarState extends ConsumerState { ), ), child: AnimatedSwitcher( - duration: Duration(milliseconds: 250), + duration: const Duration(milliseconds: 250), child: inputField ? OutlinedTextField( controller: controller, diff --git a/lib/screens/shared/fladder_snackbar.dart b/lib/screens/shared/fladder_snackbar.dart index ede0939..113a199 100644 --- a/lib/screens/shared/fladder_snackbar.dart +++ b/lib/screens/shared/fladder_snackbar.dart @@ -20,7 +20,7 @@ void fladderSnackbar( clipBehavior: Clip.none, showCloseIcon: showCloseButton, duration: duration, - padding: EdgeInsets.all(18), + padding: const EdgeInsets.all(18), action: action, )); } diff --git a/lib/screens/shared/input_fields.dart b/lib/screens/shared/input_fields.dart index f45a183..30f9a39 100644 --- a/lib/screens/shared/input_fields.dart +++ b/lib/screens/shared/input_fields.dart @@ -32,7 +32,7 @@ class IntInputField extends ConsumerWidget { onSubmitted: (value) => onSubmitted?.call(int.tryParse(value)), textAlign: TextAlign.center, decoration: InputDecoration( - contentPadding: EdgeInsets.all(0), + contentPadding: const EdgeInsets.all(0), hintText: placeHolder, suffixText: suffix, border: InputBorder.none, diff --git a/lib/screens/shared/media/carousel_banner.dart b/lib/screens/shared/media/carousel_banner.dart index dabcb89..6609289 100644 --- a/lib/screens/shared/media/carousel_banner.dart +++ b/lib/screens/shared/media/carousel_banner.dart @@ -36,7 +36,7 @@ class _CarouselBannerState extends ConsumerState { double dragIntensity = 1; double slidePosition = 1; - late final RestartableTimer timer = RestartableTimer(Duration(seconds: 8), () => nextSlide()); + late final RestartableTimer timer = RestartableTimer(const Duration(seconds: 8), () => nextSlide()); @override void initState() { @@ -121,7 +121,7 @@ class _CarouselBannerState extends ConsumerState { fit: StackFit.expand, children: [ Dismissible( - key: Key("Dismissable"), + key: const Key("Dismissable"), direction: DismissDirection.horizontal, onUpdate: (details) { setState(() { @@ -137,10 +137,10 @@ class _CarouselBannerState extends ConsumerState { return false; }, child: AnimatedOpacity( - duration: Duration(milliseconds: 125), + duration: const Duration(milliseconds: 125), opacity: dragOpacity.abs(), child: AnimatedSwitcher( - duration: Duration(milliseconds: 125), + duration: const Duration(milliseconds: 125), child: Container( key: Key(currentItem.id), clipBehavior: Clip.hardEdge, @@ -228,7 +228,7 @@ class _CarouselBannerState extends ConsumerState { ), ), ), - ].addInBetween(SizedBox(height: 6)), + ].addInBetween(const SizedBox(height: 6)), ), ), ), @@ -248,7 +248,7 @@ class _CarouselBannerState extends ConsumerState { ), ], ), - ].addInBetween(SizedBox(height: 16)), + ].addInBetween(const SizedBox(height: 16)), ), ), ), @@ -256,13 +256,13 @@ class _CarouselBannerState extends ConsumerState { padding: const EdgeInsets.symmetric(horizontal: 12), child: AnimatedOpacity( opacity: showControls ? 1 : 0, - duration: Duration(milliseconds: 250), + duration: const Duration(milliseconds: 250), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ IconButton.filledTonal( onPressed: () => nextSlide(), - icon: Icon(IconsaxOutline.arrow_right_3), + icon: const Icon(IconsaxOutline.arrow_right_3), ) ], ), @@ -335,7 +335,7 @@ class _CarouselBannerState extends ConsumerState { width: 28, height: 28, child: AnimatedContainer( - duration: Duration(milliseconds: 125), + duration: const Duration(milliseconds: 125), width: currentItem == e ? 22 : 6, height: currentItem == e ? 10 : 6, decoration: BoxDecoration( diff --git a/lib/screens/shared/media/components/poster_image.dart b/lib/screens/shared/media/components/poster_image.dart index 233e8f5..03d4ee4 100644 --- a/lib/screens/shared/media/components/poster_image.dart +++ b/lib/screens/shared/media/components/poster_image.dart @@ -89,7 +89,7 @@ class _PosterImageState extends ConsumerState { @override Widget build(BuildContext context) { final poster = widget.poster; - final padding = EdgeInsets.all(5); + final padding = const EdgeInsets.all(5); return Hero( tag: currentTag, child: MouseRegion( @@ -169,7 +169,7 @@ class _PosterImageState extends ConsumerState { mainAxisSize: MainAxisSize.min, children: [ if (widget.poster.userData.isFavourite) - Row( + const Row( children: [ StatusCard( color: Colors.red, @@ -327,7 +327,7 @@ class _PosterImageState extends ConsumerState { child: Padding( padding: const EdgeInsets.all(10), child: Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( shape: BoxShape.circle, color: Colors.amber, ), @@ -347,8 +347,8 @@ class _PosterImageState extends ConsumerState { .textTheme .labelLarge ?.copyWith(fontSize: 20, fontWeight: FontWeight.bold, shadows: [ - BoxShadow(blurRadius: 8, spreadRadius: 16), - BoxShadow(blurRadius: 2, spreadRadius: 16), + const BoxShadow(blurRadius: 8, spreadRadius: 16), + const BoxShadow(blurRadius: 2, spreadRadius: 16), ]), ), ), diff --git a/lib/screens/shared/media/episode_details_list.dart b/lib/screens/shared/media/episode_details_list.dart index 77f8427..60df085 100644 --- a/lib/screens/shared/media/episode_details_list.dart +++ b/lib/screens/shared/media/episode_details_list.dart @@ -39,7 +39,7 @@ class EpisodeDetailsList extends ConsumerWidget { ref.watch(clientSettingsProvider.select((value) => value.posterSize))); final decimals = size - size.toInt(); return AnimatedSwitcher( - duration: Duration(milliseconds: 250), + duration: const Duration(milliseconds: 250), child: switch (viewType) { EpisodeDetailsViewType.list => ListView.builder( shrinkWrap: true, diff --git a/lib/screens/shared/media/episode_posters.dart b/lib/screens/shared/media/episode_posters.dart index 8f3d5ae..24d1ee3 100644 --- a/lib/screens/shared/media/episode_posters.dart +++ b/lib/screens/shared/media/episode_posters.dart @@ -59,7 +59,7 @@ class _EpisodePosterState extends ConsumerState { label: widget.label, titleActions: [ if (episodesBySeason.isNotEmpty && episodesBySeason.length > 1) ...{ - SizedBox(width: 12), + const SizedBox(width: 12), EnumBox( current: selectedSeason != null ? "${context.localized.season(1)} $selectedSeason" : context.localized.all, itemBuilder: (context) => [ @@ -210,7 +210,7 @@ class EpisodePoster extends ConsumerWidget { ); }), if (episode.userData.isFavourite) - StatusCard( + const StatusCard( color: Colors.red, child: Icon( Icons.favorite_rounded, @@ -219,7 +219,7 @@ class EpisodePoster extends ConsumerWidget { if (episode.userData.played) StatusCard( color: Theme.of(context).colorScheme.primary, - child: Icon( + child: const Icon( Icons.check_rounded, ), ), diff --git a/lib/screens/shared/media/poster_list_item.dart b/lib/screens/shared/media/poster_list_item.dart index b82ac6f..df4bdad 100644 --- a/lib/screens/shared/media/poster_list_item.dart +++ b/lib/screens/shared/media/poster_list_item.dart @@ -54,7 +54,7 @@ class PosterListItem extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { return Padding( - padding: EdgeInsets.symmetric(vertical: 2), + padding: const EdgeInsets.symmetric(vertical: 2), child: Card( color: Theme.of(context).colorScheme.surface, child: SizedBox( @@ -151,7 +151,7 @@ class PosterListItem extends ConsumerWidget { children: [ if (subTitle != null) ...[ subTitle!, - Spacer(), + const Spacer(), ], if (poster.subText != null && poster.subText != poster.name) ClickableText( @@ -180,7 +180,7 @@ class PosterListItem extends ConsumerWidget { ), ), if (poster.userData.isFavourite) - Icon( + const Icon( IconsaxBold.heart, color: Colors.red, ), @@ -206,7 +206,7 @@ class PosterListItem extends ConsumerWidget { .popupMenuItems(useIcons: true), ), ) - ].addInBetween(SizedBox(width: 8)), + ].addInBetween(const SizedBox(width: 8)), ), ), ), diff --git a/lib/screens/shared/media/poster_widget.dart b/lib/screens/shared/media/poster_widget.dart index da484e6..be2b898 100644 --- a/lib/screens/shared/media/poster_widget.dart +++ b/lib/screens/shared/media/poster_widget.dart @@ -85,7 +85,7 @@ class PosterWidget extends ConsumerWidget { opacity: opacity, child: subTitle!, ), - Spacer() + const Spacer() ], if (poster.subText?.isNotEmpty ?? false) Flexible( diff --git a/lib/screens/shared/media/season_row.dart b/lib/screens/shared/media/season_row.dart index 566b786..53f9326 100644 --- a/lib/screens/shared/media/season_row.dart +++ b/lib/screens/shared/media/season_row.dart @@ -55,7 +55,7 @@ class SeasonPoster extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - placeHolder(String title) { + Padding placeHolder(String title) { return Padding( padding: const EdgeInsets.all(4), child: Container( @@ -104,7 +104,7 @@ class SeasonPoster extends ConsumerWidget { child: Center( child: Text( season.userData.unPlayedItemCount.toString(), - style: TextStyle(fontWeight: FontWeight.w700, fontSize: 14), + style: const TextStyle(fontWeight: FontWeight.w700, fontSize: 14), ), ), ), @@ -114,7 +114,7 @@ class SeasonPoster extends ConsumerWidget { alignment: Alignment.topRight, child: StatusCard( color: Theme.of(context).colorScheme.primary, - child: Icon( + child: const Icon( Icons.check_rounded, ), ), diff --git a/lib/screens/shared/nested_scaffold.dart b/lib/screens/shared/nested_scaffold.dart index 259a857..129b856 100644 --- a/lib/screens/shared/nested_scaffold.dart +++ b/lib/screens/shared/nested_scaffold.dart @@ -20,8 +20,8 @@ class NestedScaffold extends ConsumerWidget { floatingActionButton: switch (AdaptiveLayout.layoutOf(context)) { LayoutState.phone => null, _ => switch (playerState) { - VideoPlayerState.minimized => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), + VideoPlayerState.minimized => const Padding( + padding: EdgeInsets.symmetric(horizontal: 8), child: FloatingPlayerBar(), ), _ => null, diff --git a/lib/screens/shared/nested_sliver_appbar.dart b/lib/screens/shared/nested_sliver_appbar.dart index 46f4996..ad379b4 100644 --- a/lib/screens/shared/nested_sliver_appbar.dart +++ b/lib/screens/shared/nested_sliver_appbar.dart @@ -35,7 +35,7 @@ class NestedSliverAppBar extends ConsumerWidget { backgroundColor: WidgetStatePropertyAll(Theme.of(context).colorScheme.surface), ), onPressed: () => Scaffold.of(parent).openDrawer(), - icon: Icon( + icon: const Icon( IconsaxBold.menu, size: 28, ), @@ -59,10 +59,10 @@ class NestedSliverAppBar extends ConsumerWidget { child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Icon(IconsaxOutline.search_normal), + const Icon(IconsaxOutline.search_normal), const SizedBox(width: 16), Transform.translate( - offset: Offset(0, 2.5), child: Text(searchTitle ?? "${context.localized.search}...")), + offset: const Offset(0, 2.5), child: Text(searchTitle ?? "${context.localized.search}...")), ], ), ), @@ -71,7 +71,7 @@ class NestedSliverAppBar extends ConsumerWidget { ), ), ), - SettingsUserIcon() + const SettingsUserIcon() ].addInBetween(const SizedBox(width: 16)), ), ), diff --git a/lib/screens/shared/outlined_text_field.dart b/lib/screens/shared/outlined_text_field.dart index 27eed00..10a4e34 100644 --- a/lib/screens/shared/outlined_text_field.dart +++ b/lib/screens/shared/outlined_text_field.dart @@ -84,7 +84,7 @@ class _OutlinedTextFieldState extends ConsumerState { child: Padding( padding: const EdgeInsets.symmetric(vertical: 6), child: AnimatedContainer( - duration: Duration(milliseconds: 250), + duration: const Duration(milliseconds: 250), decoration: BoxDecoration( color: widget.fillColor ?? getColor(), borderRadius: FladderTheme.defaultShape.borderRadius, diff --git a/lib/screens/splash_screen.dart b/lib/screens/splash_screen.dart index ac05eae..af7bbcb 100644 --- a/lib/screens/splash_screen.dart +++ b/lib/screens/splash_screen.dart @@ -44,11 +44,11 @@ class _SplashScreenState extends ConsumerState { @override Widget build(BuildContext context) { - return Scaffold( + return const Scaffold( body: Center( child: FractionallySizedBox( heightFactor: 0.4, - child: const FladderLogo(), + child: FladderLogo(), ), ), ); diff --git a/lib/screens/syncing/sync_button.dart b/lib/screens/syncing/sync_button.dart index 0cc8b09..225eb3a 100644 --- a/lib/screens/syncing/sync_button.dart +++ b/lib/screens/syncing/sync_button.dart @@ -56,7 +56,7 @@ class _SyncButtonState extends ConsumerState { if ((progress?.progress ?? 0) > 0) IgnorePointer( child: SizedBox.fromSize( - size: Size.fromRadius(10), + size: const Size.fromRadius(10), child: CircularProgressIndicator( strokeCap: StrokeCap.round, strokeWidth: 2, diff --git a/lib/screens/syncing/sync_item_details.dart b/lib/screens/syncing/sync_item_details.dart index f2dae8b..60d49ce 100644 --- a/lib/screens/syncing/sync_item_details.dart +++ b/lib/screens/syncing/sync_item_details.dart @@ -76,12 +76,12 @@ class _SyncItemDetailsState extends ConsumerState { ), IconButton( onPressed: () => Navigator.pop(context), - icon: Icon(IconsaxBold.close_circle), + icon: const Icon(IconsaxBold.close_circle), ) ], ), if (baseItem != null) ...{ - Divider(), + const Divider(), Padding( padding: const EdgeInsets.symmetric(vertical: 8), child: Row( @@ -128,24 +128,24 @@ class _SyncItemDetailsState extends ConsumerState { IconButton( onPressed: () => ref.read(backgroundDownloaderProvider).pause(combinedStream!.task!), - icon: Icon(IconsaxBold.pause), + icon: const Icon(IconsaxBold.pause), ), if (combinedStream?.status == TaskStatus.paused) ...[ IconButton( onPressed: () => ref.read(backgroundDownloaderProvider).resume(combinedStream!.task!), - icon: Icon(IconsaxBold.play), + icon: const Icon(IconsaxBold.play), ), IconButton( onPressed: () => ref.read(syncProvider.notifier).deleteFullSyncFiles(syncedItem), - icon: Icon(IconsaxBold.stop), + icon: const Icon(IconsaxBold.stop), ), ], const SizedBox(width: 16) }, if (combinedStream != null && combinedStream.hasDownload) SizedBox.fromSize( - size: Size.fromRadius(35), + size: const Size.fromRadius(35), child: Stack( fit: StackFit.expand, alignment: Alignment.center, @@ -168,7 +168,7 @@ class _SyncItemDetailsState extends ConsumerState { if (!hasFile && !downloadTask.hasDownload && syncedItem.hasVideoFile) IconButtonAwait( onPressed: () async => await ref.read(syncProvider.notifier).syncVideoFile(syncedItem, false), - icon: Icon(IconsaxOutline.cloud_change), + icon: const Icon(IconsaxOutline.cloud_change), ) else if (hasFile) IconButtonAwait( @@ -187,13 +187,13 @@ class _SyncItemDetailsState extends ConsumerState { context.localized.cancel, ); }, - icon: Icon(IconsaxOutline.trash), + icon: const Icon(IconsaxOutline.trash), ), ].addInBetween(const SizedBox(width: 16)), ), ), }, - Divider(), + const Divider(), if (syncChildren.isNotEmpty == true) Flexible( child: ListView( diff --git a/lib/screens/syncing/sync_list_item.dart b/lib/screens/syncing/sync_list_item.dart index dd9defd..c7a97ce 100644 --- a/lib/screens/syncing/sync_list_item.dart +++ b/lib/screens/syncing/sync_list_item.dart @@ -38,8 +38,8 @@ class SyncListItemState extends ConsumerState { child: Dismissible( background: Container( color: Theme.of(context).colorScheme.errorContainer, - child: Padding( - padding: const EdgeInsets.all(8.0), + child: const Padding( + padding: EdgeInsets.all(8.0), child: Row( children: [Icon(IconsaxBold.trash)], ), @@ -130,11 +130,11 @@ class SyncListItemState extends ConsumerState { )), IconButton( onPressed: () => showSyncItemDetails(context, syncedItem, ref), - icon: Icon(IconsaxOutline.more_square), + icon: const Icon(IconsaxOutline.more_square), ), ], ), - ].addInBetween(SizedBox(width: 16)), + ].addInBetween(const SizedBox(width: 16)), ), ), ), diff --git a/lib/screens/syncing/sync_widgets.dart b/lib/screens/syncing/sync_widgets.dart index 1764b13..84acdeb 100644 --- a/lib/screens/syncing/sync_widgets.dart +++ b/lib/screens/syncing/sync_widgets.dart @@ -50,7 +50,7 @@ class SyncProgressBar extends ConsumerWidget { final downloadProgress = task.progress; final downloadTask = task.task; if (!task.hasDownload) { - return SizedBox.shrink(); + return const SizedBox.shrink(); } return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -73,20 +73,20 @@ class SyncProgressBar extends ConsumerWidget { if (downloadStatus != TaskStatus.paused) IconButton( onPressed: () => ref.read(backgroundDownloaderProvider).pause(downloadTask), - icon: Icon(IconsaxBold.pause), + icon: const Icon(IconsaxBold.pause), ) }, if (downloadStatus == TaskStatus.paused && downloadTask != null) ...[ IconButton( onPressed: () => ref.read(backgroundDownloaderProvider).resume(downloadTask), - icon: Icon(IconsaxBold.play), + icon: const Icon(IconsaxBold.play), ), IconButton( onPressed: () => ref.read(syncProvider.notifier).deleteFullSyncFiles(item), - icon: Icon(IconsaxBold.stop), + icon: const Icon(IconsaxBold.stop), ) ], - ].addInBetween(SizedBox(width: 8)), + ].addInBetween(const SizedBox(width: 8)), ), const SizedBox(width: 6), ], diff --git a/lib/screens/syncing/synced_screen.dart b/lib/screens/syncing/synced_screen.dart index 64b7bdf..97d324a 100644 --- a/lib/screens/syncing/synced_screen.dart +++ b/lib/screens/syncing/synced_screen.dart @@ -48,7 +48,7 @@ class _SyncedScreenState extends ConsumerState { const DefaultSliverTopBadding(), SliverToBoxAdapter( child: Padding( - padding: EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric(horizontal: 16), child: Text( context.localized.syncedItems, style: Theme.of(context).textTheme.titleLarge, @@ -56,7 +56,7 @@ class _SyncedScreenState extends ConsumerState { ), ), SliverPadding( - padding: EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric(horizontal: 16), sliver: SliverList.builder( itemBuilder: (context, index) { final item = items[index]; @@ -78,7 +78,7 @@ class _SyncedScreenState extends ConsumerState { style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(width: 16), - Icon( + const Icon( IconsaxOutline.cloud_cross, ) ], diff --git a/lib/screens/syncing/widgets/sync_markedfordelete.dart b/lib/screens/syncing/widgets/sync_markedfordelete.dart index 871a669..75c02bc 100644 --- a/lib/screens/syncing/widgets/sync_markedfordelete.dart +++ b/lib/screens/syncing/widgets/sync_markedfordelete.dart @@ -29,9 +29,9 @@ class SyncMarkedForDelete extends ConsumerWidget { strokeCap: StrokeCap.round, valueColor: AlwaysStoppedAnimation(Theme.of(context).colorScheme.error), ), - Text("Deleting"), - Icon(IconsaxOutline.trash) - ].addPadding(EdgeInsets.symmetric(horizontal: 16)), + const Text("Deleting"), + const Icon(IconsaxOutline.trash) + ].addPadding(const EdgeInsets.symmetric(horizontal: 16)), ), ), ) diff --git a/lib/screens/syncing/widgets/synced_episode_item.dart b/lib/screens/syncing/widgets/synced_episode_item.dart index 5cf7eb3..203f683 100644 --- a/lib/screens/syncing/widgets/synced_episode_item.dart +++ b/lib/screens/syncing/widgets/synced_episode_item.dart @@ -95,7 +95,7 @@ class _SyncedEpisodeItemState extends ConsumerState { if (!hasFile && !downloadTask.hasDownload) IconButtonAwait( onPressed: () async => await ref.read(syncProvider.notifier).syncVideoFile(syncedItem, false), - icon: Icon(IconsaxOutline.cloud_change), + icon: const Icon(IconsaxOutline.cloud_change), ) else if (hasFile) IconButtonAwait( @@ -114,7 +114,7 @@ class _SyncedEpisodeItemState extends ConsumerState { context.localized.cancel, ); }, - icon: Icon(IconsaxOutline.trash), + icon: const Icon(IconsaxOutline.trash), ) ].addInBetween(const SizedBox(width: 16)), ); diff --git a/lib/screens/syncing/widgets/synced_season_poster.dart b/lib/screens/syncing/widgets/synced_season_poster.dart index 1a87054..79ce2b5 100644 --- a/lib/screens/syncing/widgets/synced_season_poster.dart +++ b/lib/screens/syncing/widgets/synced_season_poster.dart @@ -54,7 +54,7 @@ class _SyncedSeasonPosterState extends ConsumerState { ) ], ), - Spacer(), + const Spacer(), IconButton( onPressed: () { setState(() { @@ -63,16 +63,16 @@ class _SyncedSeasonPosterState extends ConsumerState { }, icon: Icon(!expanded ? Icons.keyboard_arrow_down_rounded : Icons.keyboard_arrow_up_rounded), ) - ].addPadding(EdgeInsets.symmetric(horizontal: 6)), + ].addPadding(const EdgeInsets.symmetric(horizontal: 6)), ), AnimatedFadeSize( duration: const Duration(milliseconds: 250), child: expanded && children.isNotEmpty ? ListView( shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), + physics: const NeverScrollableScrollPhysics(), children: [ - Divider(), + const Divider(), ...children.map( (item) { final baseItem = ref.read(syncProvider.notifier).getItem(item); @@ -85,7 +85,7 @@ class _SyncedSeasonPosterState extends ConsumerState { ); }, ) - ].addPadding(EdgeInsets.symmetric(vertical: 10)), + ].addPadding(const EdgeInsets.symmetric(vertical: 10)), ) : Container(), ) diff --git a/lib/screens/video_player/components/video_playback_information.dart b/lib/screens/video_player/components/video_playback_information.dart index a7a87d4..ad8e6ba 100644 --- a/lib/screens/video_player/components/video_playback_information.dart +++ b/lib/screens/video_player/components/video_playback_information.dart @@ -8,7 +8,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; Future showVideoPlaybackInformation(BuildContext context) { return showDialog( context: context, - builder: (context) => _VideoPlaybackInformation(), + builder: (context) => const _VideoPlaybackInformation(), ); } @@ -28,11 +28,11 @@ class _VideoPlaybackInformation extends ConsumerWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text("Playback information", style: Theme.of(context).textTheme.titleMedium), - Divider(), + const Divider(), ...[ Row( mainAxisSize: MainAxisSize.min, - children: [Text('type: '), Text(playbackModel.label ?? "")], + children: [const Text('type: '), Text(playbackModel.label ?? "")], ), if (sessionInfo.transCodeInfo != null) ...[ const SizedBox(height: 6), @@ -40,34 +40,34 @@ class _VideoPlaybackInformation extends ConsumerWidget { if (sessionInfo.transCodeInfo?.transcodeReasons?.isNotEmpty == true) Row( mainAxisSize: MainAxisSize.min, - children: [Text('reason: '), Text(sessionInfo.transCodeInfo?.transcodeReasons.toString() ?? "")], + children: [const Text('reason: '), Text(sessionInfo.transCodeInfo?.transcodeReasons.toString() ?? "")], ), if (sessionInfo.transCodeInfo?.completionPercentage != null) Row( mainAxisSize: MainAxisSize.min, children: [ - Text('transcode progress: '), + const Text('transcode progress: '), Text("${sessionInfo.transCodeInfo?.completionPercentage?.toStringAsFixed(2)} %") ], ), if (sessionInfo.transCodeInfo?.container != null) Row( mainAxisSize: MainAxisSize.min, - children: [Text('container: '), Text(sessionInfo.transCodeInfo!.container.toString())], + children: [const Text('container: '), Text(sessionInfo.transCodeInfo!.container.toString())], ), ], Row( mainAxisSize: MainAxisSize.min, - children: [Text('resolution: '), Text(playbackModel?.item.streamModel?.resolutionText ?? "")], + children: [const Text('resolution: '), Text(playbackModel?.item.streamModel?.resolutionText ?? "")], ), Row( mainAxisSize: MainAxisSize.min, children: [ - Text('container: '), + const Text('container: '), Text(playbackModel?.playbackInfo?.mediaSources?.firstOrNull?.container ?? "") ], ), - ].addPadding(EdgeInsets.symmetric(vertical: 3)) + ].addPadding(const EdgeInsets.symmetric(vertical: 3)) ], ), ), diff --git a/lib/screens/video_player/components/video_player_chapters.dart b/lib/screens/video_player/components/video_player_chapters.dart index 0fa999b..26035b5 100644 --- a/lib/screens/video_player/components/video_player_chapters.dart +++ b/lib/screens/video_player/components/video_player_chapters.dart @@ -5,7 +5,7 @@ import 'package:fladder/widgets/shared/horizontal_list.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -showPlayerChapterDialogue( +void showPlayerChapterDialogue( BuildContext context, { required List chapters, required Function(Chapter chapter) onChapterTapped, diff --git a/lib/screens/video_player/components/video_player_options_sheet.dart b/lib/screens/video_player/components/video_player_options_sheet.dart index e00e160..6881987 100644 --- a/lib/screens/video_player/components/video_player_options_sheet.dart +++ b/lib/screens/video_player/components/video_player_options_sheet.dart @@ -80,7 +80,7 @@ class _VideoOptionsMobileState extends ConsumerState { ], ), const Spacer(), - Opacity(opacity: 0.1, child: Icon(Icons.info_outline_rounded)) + const Opacity(opacity: 0.1, child: Icon(Icons.info_outline_rounded)) ], ), ), @@ -93,7 +93,7 @@ class _VideoOptionsMobileState extends ConsumerState { title: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Flexible(flex: 1, child: const Text("Screen Brightness")), + const Flexible(flex: 1, child: Text("Screen Brightness")), Flexible( child: Row( children: [ @@ -250,7 +250,7 @@ class _VideoOptionsMobileState extends ConsumerState { Navigator.of(context).pop(); showInfoScreen(context, currentItem); }, - title: Text('Media info'), + title: const Text('Media info'), ), } ], @@ -337,7 +337,7 @@ Future showSubSelection(BuildContext context) { final playbackModel = ref.watch(playBackModel); final player = ref.watch(videoPlayerProvider); return SimpleDialog( - contentPadding: EdgeInsets.only(top: 8, bottom: 24), + contentPadding: const EdgeInsets.only(top: 8, bottom: 24), title: Row( children: [ const Text("Subtitle"), @@ -388,7 +388,7 @@ Future showAudioSelection(BuildContext context) { final playbackModel = ref.watch(playBackModel); final player = ref.watch(videoPlayerProvider); return SimpleDialog( - contentPadding: EdgeInsets.only(top: 8, bottom: 24), + contentPadding: const EdgeInsets.only(top: 8, bottom: 24), title: Row( children: [ const Text("Subtitle"), diff --git a/lib/screens/video_player/components/video_player_queue.dart b/lib/screens/video_player/components/video_player_queue.dart index 54f8a91..1646bb0 100644 --- a/lib/screens/video_player/components/video_player_queue.dart +++ b/lib/screens/video_player/components/video_player_queue.dart @@ -5,7 +5,7 @@ import 'package:fladder/widgets/navigation_scaffold/components/fladder_appbar.da import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -showFullScreenItemQueue( +void showFullScreenItemQueue( BuildContext context, { required List items, ValueChanged>? onListChanged, diff --git a/lib/screens/video_player/components/video_progress_bar.dart b/lib/screens/video_player/components/video_progress_bar.dart index 8a60d93..f6ff25a 100644 --- a/lib/screens/video_player/components/video_progress_bar.dart +++ b/lib/screens/video_player/components/video_progress_bar.dart @@ -304,7 +304,7 @@ class _ChapterProgressSliderState extends ConsumerState { AnimatedContainer( duration: const Duration(milliseconds: 250), child: ConstrainedBox( - constraints: BoxConstraints(maxHeight: 250), + constraints: const BoxConstraints(maxHeight: 250), child: ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(8)), child: trickPlay == null || trickPlay.images.isEmpty @@ -313,7 +313,7 @@ class _ChapterProgressSliderState extends ConsumerState { image: chapter.imageProvider, fit: BoxFit.contain, ) - : SizedBox.shrink() + : const SizedBox.shrink() : AspectRatio( aspectRatio: trickPlay.width.toDouble() / trickPlay.height.toDouble(), child: TrickplayImage( diff --git a/lib/screens/video_player/components/video_subtitle_controls.dart b/lib/screens/video_player/components/video_subtitle_controls.dart index f2dfb56..6ecdc41 100644 --- a/lib/screens/video_player/components/video_subtitle_controls.dart +++ b/lib/screens/video_player/components/video_subtitle_controls.dart @@ -108,15 +108,15 @@ class _VideoSubtitleControlsState extends ConsumerState { multiSelectionEnabled: false, segments: [ ButtonSegment( - label: Text(context.localized.light, style: TextStyle(fontWeight: FontWeight.w100)), + label: Text(context.localized.light, style: const TextStyle(fontWeight: FontWeight.w100)), value: FontWeight.w100, ), ButtonSegment( - label: Text(context.localized.normal, style: TextStyle(fontWeight: FontWeight.w500)), + label: Text(context.localized.normal, style: const TextStyle(fontWeight: FontWeight.w500)), value: FontWeight.normal, ), ButtonSegment( - label: Text(context.localized.bold, style: TextStyle(fontWeight: FontWeight.w900)), + label: Text(context.localized.bold, style: const TextStyle(fontWeight: FontWeight.w900)), value: FontWeight.bold, ), ], diff --git a/lib/screens/video_player/components/video_volume_slider.dart b/lib/screens/video_player/components/video_volume_slider.dart index 910f2d5..d926214 100644 --- a/lib/screens/video_player/components/video_volume_slider.dart +++ b/lib/screens/video_player/components/video_volume_slider.dart @@ -60,7 +60,7 @@ class _VideoVolumeSliderState extends ConsumerState { textAlign: TextAlign.center, ), ), - ].addInBetween(SizedBox(width: 6)), + ].addInBetween(const SizedBox(width: 6)), ); } } diff --git a/lib/screens/video_player/video_player.dart b/lib/screens/video_player/video_player.dart index d43058a..c964450 100644 --- a/lib/screens/video_player/video_player.dart +++ b/lib/screens/video_player/video_player.dart @@ -114,7 +114,7 @@ class _VideoPlayerState extends ConsumerState with WidgetsBindingOb ); }), ), - DesktopControls(), + const DesktopControls(), if (errorPlaying) const _VideoErrorWidget(), ], ), diff --git a/lib/screens/video_player/video_player_controls.dart b/lib/screens/video_player/video_player_controls.dart index 913415a..12dd8b8 100644 --- a/lib/screens/video_player/video_player_controls.dart +++ b/lib/screens/video_player/video_player_controls.dart @@ -242,7 +242,7 @@ class _DesktopControlsState extends ConsumerState { .update((state) => state.copyWith(state: VideoPlayerState.minimized)); Navigator.of(context).pop(); }, - icon: Icon( + icon: const Icon( IconsaxOutline.arrow_down_1, size: 24, ), @@ -256,7 +256,7 @@ class _DesktopControlsState extends ConsumerState { ), ) else - Flexible(child: Align(alignment: Alignment.topRight, child: DefaultTitleBar())) + const Flexible(child: Align(alignment: Alignment.topRight, child: DefaultTitleBar())) ], ), ), @@ -279,7 +279,7 @@ class _DesktopControlsState extends ConsumerState { child: Padding( padding: EdgeInsets.only(bottom: bottomPadding) .copyWith(bottom: 21) - .add(EdgeInsets.symmetric(vertical: 16)) + .add(const EdgeInsets.symmetric(vertical: 16)) .add(EdgeInsets.symmetric(horizontal: AdaptiveLayout.of(context).isDesktop ? 32 : 0)), child: Column( children: [ @@ -362,7 +362,7 @@ class _DesktopControlsState extends ConsumerState { children: [ Tooltip( message: "Stop", - child: IconButton(onPressed: () => closePlayer(), icon: Icon(IconsaxOutline.stop))), + child: IconButton(onPressed: () => closePlayer(), icon: const Icon(IconsaxOutline.stop))), const Spacer(), if (AdaptiveLayout.of(context).isDesktop && ref.read(videoPlayerProvider).player != null) ...{ // OpenQueueButton(x), @@ -457,7 +457,7 @@ class _DesktopControlsState extends ConsumerState { ), ), } - ].addPadding(EdgeInsets.symmetric(horizontal: 4)), + ].addPadding(const EdgeInsets.symmetric(horizontal: 4)), ), const SizedBox(height: 4), SizedBox( @@ -558,9 +558,9 @@ class _DesktopControlsState extends ConsumerState { onPressed: () => seekForward(mediaPlaybackModel), tooltip: "15", iconSize: 40, - icon: Stack( + icon: const Stack( children: [ - const Icon(IconsaxOutline.forward_15_seconds), + Icon(IconsaxOutline.forward_15_seconds), ], ), ); diff --git a/lib/theme.dart b/lib/theme.dart index 36657b3..c7445fd 100644 --- a/lib/theme.dart +++ b/lib/theme.dart @@ -28,8 +28,8 @@ class FladderTheme { static RoundedRectangleBorder get defaultShape => RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)); static RoundedRectangleBorder get largeShape => RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)); - static Color get darkBackgroundColor => Color.fromARGB(255, 10, 10, 10); - static Color get lightBackgroundColor => Color.fromARGB(237, 255, 255, 255); + static Color get darkBackgroundColor => const Color.fromARGB(255, 10, 10, 10); + static Color get lightBackgroundColor => const Color.fromARGB(237, 255, 255, 255); static ThemeData theme(ColorScheme? colorScheme) { final ColorScheme? scheme = generateDynamicColourSchemes(colorScheme); @@ -50,7 +50,7 @@ class FladderTheme { margin: EdgeInsets.zero, shape: defaultShape, ), - progressIndicatorTheme: ProgressIndicatorThemeData(), + progressIndicatorTheme: const ProgressIndicatorThemeData(), floatingActionButtonTheme: FloatingActionButtonThemeData( backgroundColor: scheme?.secondaryContainer, foregroundColor: scheme?.onSecondaryContainer, @@ -65,7 +65,7 @@ class FladderTheme { ), tooltipTheme: TooltipThemeData( textAlign: TextAlign.center, - waitDuration: Duration(milliseconds: 500), + waitDuration: const Duration(milliseconds: 500), textStyle: TextStyle( color: scheme?.onSurface, ), @@ -77,21 +77,21 @@ class FladderTheme { switchTheme: SwitchThemeData( thumbIcon: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.selected)) { - return Icon(Icons.check_rounded); + return const Icon(Icons.check_rounded); } return null; }), - trackOutlineWidth: WidgetStatePropertyAll(1), + trackOutlineWidth: const WidgetStatePropertyAll(1), ), iconButtonTheme: IconButtonThemeData( style: ButtonStyle( shape: WidgetStatePropertyAll(defaultShape), ), ), - navigationBarTheme: NavigationBarThemeData(), + navigationBarTheme: const NavigationBarThemeData(), dialogTheme: DialogTheme(shape: defaultShape), scrollbarTheme: ScrollbarThemeData( - radius: Radius.circular(16), + radius: const Radius.circular(16), thumbColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.hovered)) { return colorScheme?.primary; diff --git a/lib/util/adaptive_layout.dart b/lib/util/adaptive_layout.dart index d538b45..ae0fe01 100644 --- a/lib/util/adaptive_layout.dart +++ b/lib/util/adaptive_layout.dart @@ -183,9 +183,9 @@ class _AdaptiveLayoutBuilderState extends ConsumerState { isDesktop: isDesktop, router: router, posterDefaults: switch (layout) { - LayoutState.phone => PosterDefaults(size: 300, ratio: 0.55), - LayoutState.tablet => PosterDefaults(size: 350, ratio: 0.55), - LayoutState.desktop => PosterDefaults(size: 400, ratio: 0.55), + LayoutState.phone => const PosterDefaults(size: 300, ratio: 0.55), + LayoutState.tablet => const PosterDefaults(size: 350, ratio: 0.55), + LayoutState.desktop => const PosterDefaults(size: 400, ratio: 0.55), }, child: widget.child, ); diff --git a/lib/util/fab_extended_anim.dart b/lib/util/fab_extended_anim.dart index 3481348..920a0f1 100644 --- a/lib/util/fab_extended_anim.dart +++ b/lib/util/fab_extended_anim.dart @@ -26,7 +26,7 @@ class FloatingActionButtonAnimated extends ConsumerWidget { onPressed: onPressed, foregroundColor: alternate ? Theme.of(context).colorScheme.onSecondary : null, backgroundColor: alternate ? Theme.of(context).colorScheme.secondary : null, - extendedPadding: EdgeInsets.all(14), + extendedPadding: const EdgeInsets.all(14), label: AnimatedSize( duration: const Duration(milliseconds: 250), child: isExtended diff --git a/lib/util/item_base_model/item_base_model_extensions.dart b/lib/util/item_base_model/item_base_model_extensions.dart index fc9bb38..e16087c 100644 --- a/lib/util/item_base_model/item_base_model_extensions.dart +++ b/lib/util/item_base_model/item_base_model_extensions.dart @@ -79,7 +79,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { if (playAble) ItemActionButton( action: () => play(context, ref), - icon: Icon(IconsaxOutline.play), + icon: const Icon(IconsaxOutline.play), label: Text(playButtonLabel(context)), ), if (parentId?.isNotEmpty == true) ...[ @@ -99,7 +99,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { if (!galleryItem && !exclude.contains(ItemActions.details)) ItemActionButton( action: () async => await navigateTo(context), - icon: Icon(IconsaxOutline.main_component), + icon: const Icon(IconsaxOutline.main_component), label: Text(context.localized.showDetails), ) else if (!exclude.contains(ItemActions.showAlbum) && galleryItem) @@ -111,7 +111,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { if (!exclude.contains(ItemActions.playFromStart)) if ((userData.progress) > 0) ItemActionButton( - icon: Icon(IconsaxOutline.refresh), + icon: const Icon(IconsaxOutline.refresh), action: (this is BookModel) ? () => ((this as BookModel).play(context, ref, currentPage: 0)) : () => play(context, ref, startPosition: Duration.zero), @@ -123,7 +123,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { if (!exclude.contains(ItemActions.addCollection)) if (type != FladderItemType.boxset) ItemActionButton( - icon: Icon(IconsaxOutline.archive_add), + icon: const Icon(IconsaxOutline.archive_add), action: () async { await addItemToCollection(context, [this]); if (context.mounted) { @@ -135,7 +135,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { if (!exclude.contains(ItemActions.addPlaylist)) if (type != FladderItemType.playlist) ItemActionButton( - icon: Icon(IconsaxOutline.archive_add), + icon: const Icon(IconsaxOutline.archive_add), action: () async { await addItemToPlaylist(context, [this]); if (context.mounted) { @@ -146,7 +146,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { ), if (!exclude.contains(ItemActions.markPlayed)) ItemActionButton( - icon: Icon(IconsaxOutline.eye), + icon: const Icon(IconsaxOutline.eye), action: () async { final userData = await ref.read(userProvider.notifier).markAsPlayed(true, id); onUserDataChanged?.call(userData?.bodyOrThrow); @@ -156,7 +156,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { ), if (!exclude.contains(ItemActions.markUnplayed)) ItemActionButton( - icon: Icon(IconsaxOutline.eye_slash), + icon: const Icon(IconsaxOutline.eye_slash), label: Text(context.localized.markAsUnwatched), action: () async { final userData = await ref.read(userProvider.notifier).markAsPlayed(false, id); @@ -178,7 +178,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { ItemActionDivider(), if (!exclude.contains(ItemActions.editMetaData) && isAdmin) ItemActionButton( - icon: Icon(IconsaxOutline.edit), + icon: const Icon(IconsaxOutline.edit), action: () async { final newItem = await showEditItemPopup(context, id); if (newItem != null) { @@ -189,7 +189,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { ), if (!exclude.contains(ItemActions.refreshMetaData) && isAdmin) ItemActionButton( - icon: Icon(IconsaxOutline.global_refresh), + icon: const Icon(IconsaxOutline.global_refresh), action: () async { showRefreshPopup(context, id, detailedName(context) ?? name); }, @@ -198,7 +198,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { if (!exclude.contains(ItemActions.download) && downloadEnabled) ...{ if (syncedItem == null) ItemActionButton( - icon: Icon(IconsaxOutline.arrow_down_2), + icon: const Icon(IconsaxOutline.arrow_down_2), label: Text(context.localized.sync), action: () => ref.read(syncProvider.notifier).addSyncItem(context, this), ) @@ -212,7 +212,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { if (canDelete == true) ItemActionButton( icon: Container( - child: Icon( + child: const Icon( IconsaxOutline.trash, ), ), @@ -231,7 +231,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { ), if (!exclude.contains(ItemActions.identify) && identifiable && isAdmin) ItemActionButton( - icon: Icon(IconsaxOutline.search_normal), + icon: const Icon(IconsaxOutline.search_normal), action: () async { showIdentifyScreen(context, this); }, @@ -239,7 +239,7 @@ extension ItemBaseModelExtensions on ItemBaseModel { ), if (!exclude.contains(ItemActions.mediaInfo)) ItemActionButton( - icon: Icon(IconsaxOutline.info_circle), + icon: const Icon(IconsaxOutline.info_circle), action: () async { showInfoScreen(context, this); }, diff --git a/lib/util/item_base_model/play_item_helpers.dart b/lib/util/item_base_model/play_item_helpers.dart index b70f3c9..fc80255 100644 --- a/lib/util/item_base_model/play_item_helpers.dart +++ b/lib/util/item_base_model/play_item_helpers.dart @@ -320,7 +320,7 @@ class PlaybackDialogue extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Padding( - padding: const EdgeInsets.symmetric(horizontal: 16).add(EdgeInsets.only(top: 16, bottom: 8)), + padding: const EdgeInsets.symmetric(horizontal: 16).add(const EdgeInsets.only(top: 16, bottom: 8)), child: Text( "Playback type", style: Theme.of(context).textTheme.titleLarge, diff --git a/lib/util/jelly_id.dart b/lib/util/jelly_id.dart index 11e1832..cd900f5 100644 --- a/lib/util/jelly_id.dart +++ b/lib/util/jelly_id.dart @@ -2,7 +2,7 @@ import 'package:uuid/uuid.dart'; String get jellyId { - var uuid = Uuid(); + var uuid = const Uuid(); var guid = uuid.v4().replaceAll('-', ''); // Remove hyphens return guid.substring(0, 32); // Take only the first 32 characters } diff --git a/lib/util/list_padding.dart b/lib/util/list_padding.dart index 354de08..80c5948 100644 --- a/lib/util/list_padding.dart +++ b/lib/util/list_padding.dart @@ -2,7 +2,7 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; extension ListExtensions on List { - addInBetween(Widget widget) { + List addInBetween(Widget widget) { return mapIndexed( (index, element) { if (element != last) { @@ -14,7 +14,7 @@ extension ListExtensions on List { ).expand((element) => element).toList(); } - addPadding(EdgeInsets padding) { + List addPadding(EdgeInsets padding) { return map((e) { if (e is Expanded || e is Spacer || e is Flexible) return e; return Padding( @@ -29,7 +29,7 @@ extension ListExtensions on List { }).toList(); } - addSize({double? width, double? height}) { + List addSize({double? width, double? height}) { return map((e) { if (e is Expanded || e is Spacer || e is Flexible) return e; return SizedBox( diff --git a/lib/widgets/gapped_container_shape.dart b/lib/widgets/gapped_container_shape.dart index 9f4705f..b0f93a3 100644 --- a/lib/widgets/gapped_container_shape.dart +++ b/lib/widgets/gapped_container_shape.dart @@ -61,7 +61,7 @@ class _GappedContainerPainter extends CustomPainter { thumbCenterDxFraction.isFinite ? thumbCenterDxFraction * size.width : 0.0; // Default to 0 if invalid fraction final Radius trackCornerRadius = Radius.circular(trackRect.shortestSide / 2); - final Radius trackInsideCornerRadius = Radius.circular(2.0); + final Radius trackInsideCornerRadius = const Radius.circular(2.0); final RRect trackRRect = RRect.fromRectAndCorners( trackRect, diff --git a/lib/widgets/navigation_scaffold/components/fladder_appbar.dart b/lib/widgets/navigation_scaffold/components/fladder_appbar.dart index 1f13d70..994eefe 100644 --- a/lib/widgets/navigation_scaffold/components/fladder_appbar.dart +++ b/lib/widgets/navigation_scaffold/components/fladder_appbar.dart @@ -29,7 +29,7 @@ class FladderAppbar extends StatelessWidget implements PreferredSize { height: height, child: Row( children: [ - if (automaticallyImplyLeading && context.canPop()) BackButton(), + if (automaticallyImplyLeading && context.canPop()) const BackButton(), Expanded( child: DefaultTitleBar( label: label, @@ -44,7 +44,7 @@ class FladderAppbar extends StatelessWidget implements PreferredSize { backgroundColor: Theme.of(context).colorScheme.surface.withOpacity(0), scrolledUnderElevation: 0, elevation: 0, - systemOverlayStyle: SystemUiOverlayStyle(), + systemOverlayStyle: const SystemUiOverlayStyle(), title: const Text(""), automaticallyImplyLeading: automaticallyImplyLeading, ); diff --git a/lib/widgets/navigation_scaffold/components/floating_player_bar.dart b/lib/widgets/navigation_scaffold/components/floating_player_bar.dart index 1559406..437cd3e 100644 --- a/lib/widgets/navigation_scaffold/components/floating_player_bar.dart +++ b/lib/widgets/navigation_scaffold/components/floating_player_bar.dart @@ -56,7 +56,7 @@ class _CurrentlyPlayingBarState extends ConsumerState { final playbackModel = ref.watch(playBackModel.select((value) => value?.item)); final progress = playbackInfo.position.inMilliseconds / playbackInfo.duration.inMilliseconds; return Dismissible( - key: Key("CurrentlyPlayingBar"), + key: const Key("CurrentlyPlayingBar"), confirmDismiss: (direction) async { if (direction == DismissDirection.up) { await openFullScreenPlayer(); @@ -73,7 +73,7 @@ class _CurrentlyPlayingBarState extends ConsumerState { child: Card( elevation: 3, child: ConstrainedBox( - constraints: BoxConstraints(minHeight: 50, maxHeight: 85), + constraints: const BoxConstraints(minHeight: 50, maxHeight: 85), child: LayoutBuilder(builder: (context, constraints) { return Row( children: [ @@ -108,7 +108,7 @@ class _CurrentlyPlayingBarState extends ConsumerState { Positioned.fill( child: Tooltip( message: "Expand player", - waitDuration: Duration(milliseconds: 500), + waitDuration: const Duration(milliseconds: 500), child: AnimatedOpacity( opacity: showExpandButton ? 1 : 0, duration: const Duration(milliseconds: 125), @@ -116,7 +116,7 @@ class _CurrentlyPlayingBarState extends ConsumerState { color: Colors.black.withOpacity(0.6), child: FlatButton( onTap: () async => openFullScreenPlayer(), - child: Icon(Icons.keyboard_arrow_up_rounded), + child: const Icon(Icons.keyboard_arrow_up_rounded), ), ), ), @@ -157,8 +157,8 @@ class _CurrentlyPlayingBarState extends ConsumerState { child: IconButton.filledTonal( onPressed: () => ref.read(videoPlayerProvider).playOrPause(), icon: playbackInfo.playing - ? Icon(Icons.pause_rounded) - : Icon(Icons.play_arrow_rounded), + ? const Icon(Icons.pause_rounded) + : const Icon(Icons.play_arrow_rounded), ), ), if (constraints.maxWidth > 500) ...{ @@ -176,14 +176,14 @@ class _CurrentlyPlayingBarState extends ConsumerState { ), Tooltip( message: "Stop playback", - waitDuration: Duration(milliseconds: 500), + waitDuration: const Duration(milliseconds: 500), child: IconButton( onPressed: () async => stopPlayer(), - icon: Icon(IconsaxBold.stop), + icon: const Icon(IconsaxBold.stop), ), ), }, - ].addInBetween(SizedBox(width: 8)), + ].addInBetween(const SizedBox(width: 8)), ), ), ), diff --git a/lib/widgets/navigation_scaffold/components/navigation_body.dart b/lib/widgets/navigation_scaffold/components/navigation_body.dart index 09a7c32..8edd2b5 100644 --- a/lib/widgets/navigation_scaffold/components/navigation_body.dart +++ b/lib/widgets/navigation_scaffold/components/navigation_body.dart @@ -137,7 +137,7 @@ class _NavigationBodyState extends ConsumerState { ], const Spacer(), IconTheme( - data: IconThemeData(size: 28), + data: const IconThemeData(size: 28), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -155,8 +155,8 @@ class _NavigationBodyState extends ConsumerState { child: widget.currentLocation.contains(SettingsRoute().route) ? Card( color: Theme.of(context).colorScheme.primaryContainer, - child: Padding( - padding: const EdgeInsets.all(10), + child: const Padding( + padding: EdgeInsets.all(10), child: Icon(IconsaxBold.setting_3), ), ) diff --git a/lib/widgets/navigation_scaffold/components/navigation_button.dart b/lib/widgets/navigation_scaffold/components/navigation_button.dart index 0fe4bff..34c7b7a 100644 --- a/lib/widgets/navigation_scaffold/components/navigation_button.dart +++ b/lib/widgets/navigation_scaffold/components/navigation_button.dart @@ -55,9 +55,9 @@ class _NavigationButtonState extends ConsumerState { Flexible( child: ElevatedButton( style: ButtonStyle( - elevation: WidgetStatePropertyAll(0), - padding: WidgetStatePropertyAll(EdgeInsets.zero), - backgroundColor: WidgetStatePropertyAll(Colors.transparent), + elevation: const WidgetStatePropertyAll(0), + padding: const WidgetStatePropertyAll(EdgeInsets.zero), + backgroundColor: const WidgetStatePropertyAll(Colors.transparent), foregroundColor: WidgetStateProperty.resolveWith((states) { return widget.selected ? Theme.of(context).colorScheme.primary @@ -88,7 +88,7 @@ class _NavigationButtonState extends ConsumerState { ], ), AnimatedContainer( - duration: Duration(milliseconds: 250), + duration: const Duration(milliseconds: 250), margin: EdgeInsets.only(top: widget.selected ? 8 : 0), height: widget.selected ? 6 : 0, width: widget.selected ? 14 : 0, diff --git a/lib/widgets/navigation_scaffold/components/navigation_drawer.dart b/lib/widgets/navigation_scaffold/components/navigation_drawer.dart index a3807a1..610ef66 100644 --- a/lib/widgets/navigation_scaffold/components/navigation_drawer.dart +++ b/lib/widgets/navigation_scaffold/components/navigation_drawer.dart @@ -95,7 +95,7 @@ class NestedNavigationDrawer extends ConsumerWidget { actions: [ ItemActionButton( label: Text(context.localized.scanLibrary), - icon: Icon(IconsaxOutline.refresh), + icon: const Icon(IconsaxOutline.refresh), action: () => showRefreshPopup(context, library.id, library.name), ), ], @@ -109,7 +109,7 @@ class NestedNavigationDrawer extends ConsumerWidget { const Divider(indent: 28, endIndent: 28), if (isExpanded) Transform.translate( - offset: Offset(-8, 0), + offset: const Offset(-8, 0), child: DrawerListButton( label: context.localized.settings, selectedIcon: const Icon(IconsaxBold.setting_3), @@ -131,8 +131,8 @@ class NestedNavigationDrawer extends ConsumerWidget { else DrawerListButton( label: context.localized.settings, - selectedIcon: Icon(IconsaxBold.setting_2), - icon: Icon(IconsaxOutline.setting_2), + selectedIcon: const Icon(IconsaxBold.setting_2), + icon: const Icon(IconsaxOutline.setting_2), selected: currentLocation.contains(SettingsRoute().basePath), onPressed: () { switch (AdaptiveLayout.of(context).size) { diff --git a/lib/widgets/navigation_scaffold/navigation_scaffold.dart b/lib/widgets/navigation_scaffold/navigation_scaffold.dart index a83bff3..de74826 100644 --- a/lib/widgets/navigation_scaffold/navigation_scaffold.dart +++ b/lib/widgets/navigation_scaffold/navigation_scaffold.dart @@ -66,8 +66,8 @@ class _NavigationScaffoldState extends ConsumerState { playerState == VideoPlayerState.minimized ? FloatingActionButtonLocation.centerFloat : null, floatingActionButton: AdaptiveLayout.of(context).layout == LayoutState.phone ? switch (playerState) { - VideoPlayerState.minimized => Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), + VideoPlayerState.minimized => const Padding( + padding: EdgeInsets.symmetric(horizontal: 8), child: FloatingPlayerBar(), ), _ => widget.destinations.elementAtOrNull(currentIndex)?.floatingActionButton?.normal, @@ -87,7 +87,7 @@ class _NavigationScaffoldState extends ConsumerState { controller: AppRoutes.scrollController, child: NestedBottomAppBar( child: Transform.translate( - offset: Offset(0, 8), + offset: const Offset(0, 8), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.stretch, diff --git a/lib/widgets/shared/elevated_icon.dart b/lib/widgets/shared/elevated_icon.dart index 841ab8a..502090e 100644 --- a/lib/widgets/shared/elevated_icon.dart +++ b/lib/widgets/shared/elevated_icon.dart @@ -65,7 +65,7 @@ class ElevatedIconButtonLabel extends StatelessWidget { return Tooltip( message: label, child: ConstrainedBox( - constraints: BoxConstraints(maxWidth: 65), + constraints: const BoxConstraints(maxWidth: 65), child: Column( mainAxisSize: MainAxisSize.min, children: [ diff --git a/lib/widgets/shared/enum_selection.dart b/lib/widgets/shared/enum_selection.dart index c18b125..128259b 100644 --- a/lib/widgets/shared/enum_selection.dart +++ b/lib/widgets/shared/enum_selection.dart @@ -58,7 +58,7 @@ class EnumSelection extends StatelessWidget { final Text label; final String current; final List> Function(BuildContext context) itemBuilder; - const EnumSelection({ + const EnumSelection({super.key, required this.label, required this.current, required this.itemBuilder, diff --git a/lib/widgets/shared/fladder_scrollbar.dart b/lib/widgets/shared/fladder_scrollbar.dart index b5f8949..bfe8e39 100644 --- a/lib/widgets/shared/fladder_scrollbar.dart +++ b/lib/widgets/shared/fladder_scrollbar.dart @@ -30,7 +30,7 @@ class FladderScrollbar extends ConsumerWidget { ? Theme.of(context).colorScheme.secondary : Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.75), ), - duration: Duration(milliseconds: 250), + duration: const Duration(milliseconds: 250), ); }, ) diff --git a/lib/widgets/shared/item_actions.dart b/lib/widgets/shared/item_actions.dart index 63f9059..40064c7 100644 --- a/lib/widgets/shared/item_actions.dart +++ b/lib/widgets/shared/item_actions.dart @@ -12,19 +12,19 @@ abstract class ItemAction { } class ItemActionDivider extends ItemAction { - Widget toWidget() => Divider(); + Widget toWidget() => const Divider(); @override - Divider toMenuItemButton() => Divider(); + Divider toMenuItemButton() => const Divider(); @override - PopupMenuEntry toPopupMenuItem({bool useIcons = false}) => PopupMenuDivider(height: 3); + PopupMenuEntry toPopupMenuItem({bool useIcons = false}) => const PopupMenuDivider(height: 3); @override Widget toLabel() => Container(); @override - Widget toListItem(BuildContext context, {bool useIcons = false, bool shouldPop = true}) => Divider(); + Widget toListItem(BuildContext context, {bool useIcons = false, bool shouldPop = true}) => const Divider(); } class ItemActionButton extends ItemAction { @@ -67,7 +67,7 @@ class ItemActionButton extends ItemAction { iconTheme: IconThemeData(color: Theme.of(context).colorScheme.onSurface), ), child: Row( - children: [if (icon != null) icon!, SizedBox(width: 8), if (label != null) Flexible(child: label!)], + children: [if (icon != null) icon!, const SizedBox(width: 8), if (label != null) Flexible(child: label!)], ), ), ); @@ -97,7 +97,7 @@ class ItemActionButton extends ItemAction { iconTheme: IconThemeData(color: Theme.of(context).colorScheme.onSurface), ), child: Row( - children: [if (icon != null) icon!, SizedBox(width: 8), if (label != null) Flexible(child: label!)], + children: [if (icon != null) icon!, const SizedBox(width: 8), if (label != null) Flexible(child: label!)], ), ); }) diff --git a/lib/widgets/shared/poster_size_slider.dart b/lib/widgets/shared/poster_size_slider.dart index 89c5739..9e40599 100644 --- a/lib/widgets/shared/poster_size_slider.dart +++ b/lib/widgets/shared/poster_size_slider.dart @@ -19,7 +19,7 @@ class PosterSizeWidget extends ConsumerWidget { child: IconButton( onPressed: () => ref.read(clientSettingsProvider.notifier).update((current) => current.copyWith(posterSize: 1)), - icon: Icon(Icons.photo_size_select_large_rounded), + icon: const Icon(Icons.photo_size_select_large_rounded), color: iconColor ?? Theme.of(context).colorScheme.onSurface, ), ), diff --git a/lib/widgets/shared/shapes.dart b/lib/widgets/shared/shapes.dart index 8020260..425ad7d 100644 --- a/lib/widgets/shared/shapes.dart +++ b/lib/widgets/shared/shapes.dart @@ -11,8 +11,8 @@ class AppBarShape extends OutlinedBorder { ..addRect(rect) ..addRRect(RRect.fromRectAndCorners( Rect.fromLTWH(rect.left, rect.bottom - 14, rect.width, 14), - topLeft: Radius.circular(14), - topRight: Radius.circular(14), + topLeft: const Radius.circular(14), + topRight: const Radius.circular(14), )); return path; } @@ -43,8 +43,8 @@ class BottomBarShape extends OutlinedBorder { ..addRect(rect) ..addRRect(RRect.fromRectAndCorners( Rect.fromLTWH(rect.left, rect.top, rect.width, 14), - bottomLeft: Radius.circular(14), - bottomRight: Radius.circular(14), + bottomLeft: const Radius.circular(14), + bottomRight: const Radius.circular(14), )); return path; } diff --git a/lib/widgets/shared/status_card.dart b/lib/widgets/shared/status_card.dart index 4d4d528..c77c246 100644 --- a/lib/widgets/shared/status_card.dart +++ b/lib/widgets/shared/status_card.dart @@ -10,7 +10,7 @@ class StatusCard extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { return Padding( - padding: EdgeInsets.all(5), + padding: const EdgeInsets.all(5), child: SizedBox( width: 33, height: 33, diff --git a/lib/widgets/shared/trickplay_image.dart b/lib/widgets/shared/trickplay_image.dart index f223e90..2a8b40f 100644 --- a/lib/widgets/shared/trickplay_image.dart +++ b/lib/widgets/shared/trickplay_image.dart @@ -23,7 +23,7 @@ class _TrickplayImageState extends ConsumerState { ui.Image? image; late TrickPlayModel model = widget.trickplay; late Duration time = widget.position ?? Duration.zero; - late Offset currentOffset = Offset(0, 0); + late Offset currentOffset = const Offset(0, 0); String? currentUrl; @override diff --git a/lib/wrappers/media_control_base.dart b/lib/wrappers/media_control_base.dart index 51a54c7..7bf82a3 100644 --- a/lib/wrappers/media_control_base.dart +++ b/lib/wrappers/media_control_base.dart @@ -1,7 +1,7 @@ import 'package:audio_service/audio_service.dart'; import 'package:media_kit/media_kit.dart'; -get audioServiceConfig => AudioServiceConfig( +AudioServiceConfig get audioServiceConfig => const AudioServiceConfig( androidNotificationChannelId: 'nl.jknaapen.fladder.channel.playback', androidNotificationChannelName: 'Video playback', androidNotificationOngoing: true,