diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e1047f965..467073cd2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,7 @@ name: CI Build on: push: branches: [ develop, master ] + workflow_dispatch: jobs: build-ui: @@ -38,7 +39,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-dotnet@v1 with: - dotnet-version: '5.0.x' + dotnet-version: '6.0.x' - name: Nuget Cache uses: actions/cache@v2 @@ -67,6 +68,7 @@ jobs: uses: TriPSs/conventional-changelog-action@v3 with: version-file: 'version.json' + release-count: 20 skip-on-empty: 'false' git-message: 'chore(release): :rocket: {version}' @@ -102,6 +104,12 @@ jobs: format: tar.gz steps: - uses: actions/checkout@v2 + - uses: actions/setup-dotnet@v1 + with: + dotnet-version: '6.0.x' + - uses: actions/setup-dotnet@v1 + with: + dotnet-version: '5.0.x' - name: Nuget Cache uses: actions/cache@v2 diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index 499cd272d..2e382eee3 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -7,6 +7,7 @@ on: branches: [ develop ] schedule: - cron: '0 0 * * *' + workflow_dispatch: jobs: automation-tests: @@ -18,7 +19,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v1 with: - dotnet-version: 5.0.x + dotnet-version: 6.0.x - uses: actions/setup-node@v2 with: node-version: '14' @@ -38,7 +39,7 @@ jobs: - name: Start Backend run: | - nohup dotnet run -p ./src/Ombi -- --host http://*:3577 & + nohup dotnet run --project ./src/Ombi -- --host http://*:3577 & - name: Start Frontend run: | nohup yarn --cwd ./src/Ombi/ClientApp start & diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index e353dce4d..961871f8a 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -3,6 +3,7 @@ name: PR Build on: pull_request: types: [opened, synchronize, reopened] + workflow_dispatch: jobs: build-ui: @@ -31,7 +32,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-dotnet@v1 with: - dotnet-version: '5.0.x' + dotnet-version: '6.0.x' - name: Nuget Cache uses: actions/cache@v2 @@ -89,6 +90,9 @@ jobs: format: tar.gz steps: - uses: actions/checkout@v2 + - uses: actions/setup-dotnet@v1 + with: + dotnet-version: '6.0.x' - name: Nuget Cache uses: actions/cache@v2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 7de5d4064..d65ba2568 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,61 @@ +## [4.6.4](https://github.com/Ombi-app/Ombi/compare/v4.6.3...v4.6.4) (2021-11-12) + + + +## [4.6.3](https://github.com/Ombi-app/Ombi/compare/v4.6.2...v4.6.3) (2021-11-11) + + +### Bug Fixes + +* **discover:** :bug: Display TV + movies on actor page in user language ([#4395](https://github.com/Ombi-app/Ombi/issues/4395)) ([fe635c7](https://github.com/Ombi-app/Ombi/commit/fe635c7106bc487ff879bdc8a73bab16cb389b97)) +* **permissions:** :bug: Improved the security around the role "Manage Own Requests" ([#4397](https://github.com/Ombi-app/Ombi/issues/4397)) ([334a32b](https://github.com/Ombi-app/Ombi/commit/334a32bca42f90198d9b720d2bdb710a583be47f)), closes [#4391](https://github.com/Ombi-app/Ombi/issues/4391) +* **search:** Fixed some cases where search wouldn't work correctly ([#4398](https://github.com/Ombi-app/Ombi/issues/4398)) ([4410790](https://github.com/Ombi-app/Ombi/commit/4410790bc096826bc11554098f846e3acb59589a)) + + + +## [4.6.2](https://github.com/Ombi-app/Ombi/compare/v4.6.1...v4.6.2) (2021-11-10) + + +### Bug Fixes + +* **discover:** TV shows now display on the Actor Pages ([#4388](https://github.com/Ombi-app/Ombi/issues/4388)) ([6b716e7](https://github.com/Ombi-app/Ombi/commit/6b716e722076e3d1e6bf2097c5263645d5ea9edf)) + + + +## [4.6.1](https://github.com/Ombi-app/Ombi/compare/v4.6.0...v4.6.1) (2021-11-10) + + +### Bug Fixes + +* :bug: Fixed the MySQL issue after .net 6 upgrade [#4393](https://github.com/Ombi-app/Ombi/issues/4393) ([fea7ff0](https://github.com/Ombi-app/Ombi/commit/fea7ff05139e9ff50c8097fa5389b4ef9ad21a15)) +* **translations:** 🌐 New translations from Crowdin [skip ci] ([c6acb45](https://github.com/Ombi-app/Ombi/commit/c6acb45f8d3f371c0b4024c4272849d0d0cc867f)) +* **translations:** 🌐 New translations from Crowdin [skip ci] ([18c220a](https://github.com/Ombi-app/Ombi/commit/18c220a0cd0d19e45a07d0c319da2b9512778a8a)) + + + +# [4.6.0](https://github.com/Ombi-app/Ombi/compare/v4.4.0...v4.6.0) (2021-11-09) + + +### Features + +* :sparkles: Upgrade Ombi to .NET 6 ([#4390](https://github.com/Ombi-app/Ombi/issues/4390)) ([719eb7d](https://github.com/Ombi-app/Ombi/commit/719eb7dbe37b3a72d264e2f670067518eef70694)), closes [#4392](https://github.com/Ombi-app/Ombi/issues/4392) + + + +# [4.4.0](https://github.com/Ombi-app/Ombi/compare/v4.3.2...v4.4.0) (2021-11-06) + + +### Bug Fixes + +* **request-list:** :bug: Fixed an issue where the request options were not appearing for Music requests ([c0406a2](https://github.com/Ombi-app/Ombi/commit/c0406a2ddebafb03d98ed25cdf7d89dc9a600c7d)) + + +### Features + +* **mass-email:** :sparkles: Added the ability to configure the Mass Email, we can now send BCC and we are less likely to be rate limited when not using bcc [#4377](https://github.com/Ombi-app/Ombi/issues/4377) ([ca655ae](https://github.com/Ombi-app/Ombi/commit/ca655ae57042dec44106a2f2ef5ba2e6f1019ee4)) + + + ## [4.3.2](https://github.com/Ombi-app/Ombi/compare/v4.3.1...v4.3.2) (2021-11-02) @@ -67,3 +125,76 @@ +## [4.2.11](https://github.com/Ombi-app/Ombi/compare/v4.2.10...v4.2.11) (2021-10-18) + + + +## [4.2.10](https://github.com/Ombi-app/Ombi/compare/v4.2.9...v4.2.10) (2021-10-15) + + +### Bug Fixes + +* :bug: Really really fix it this time? ([543d36e](https://github.com/Ombi-app/Ombi/commit/543d36e5615341bc8378cac377b843a3dbc1ef99)) + + + +## [4.2.9](https://github.com/Ombi-app/Ombi/compare/v4.2.8...v4.2.9) (2021-10-15) + + +### Bug Fixes + +* :fire: Really fix the base url issue this time ([9f36923](https://github.com/Ombi-app/Ombi/commit/9f36923c51bfabf9cb026f2da14f9947050af0d9)) + + + +## [4.2.8](https://github.com/Ombi-app/Ombi/compare/v4.2.7...v4.2.8) (2021-10-15) + + +### Bug Fixes + +* :adhesive_bandage: See if this fixes the proxy issue ([74d1aca](https://github.com/Ombi-app/Ombi/commit/74d1acae499707a7e21401f53eb2bb90c5bb9cfa)) +* :bug: Fixed Ombi not writing the baseUrl correctly ([e9cc8b6](https://github.com/Ombi-app/Ombi/commit/e9cc8b6fe71d3e10c1a901e70227989b3362afe3)) + + + +## [4.2.7](https://github.com/Ombi-app/Ombi/compare/v4.2.6...v4.2.7) (2021-10-14) + + +### Bug Fixes + +* :bug: Fixed the issue parsing TheMovieDB dates. They have broken something... ([6e397e0](https://github.com/Ombi-app/Ombi/commit/6e397e02e95f894a92e8bf02428efdcac1275b31)) + + + +## [4.2.6](https://github.com/Ombi-app/Ombi/compare/v4.2.5...v4.2.6) (2021-10-14) + + +### Performance Improvements + +* :zap: Use ngxs store for the whole customization section of the app ([97b493d](https://github.com/Ombi-app/Ombi/commit/97b493d869feee59d360b484a6c59388a2aead1f)) + + + +## [4.2.5](https://github.com/Ombi-app/Ombi/compare/v4.2.4...v4.2.5) (2021-10-14) + + + +## [4.2.4](https://github.com/Ombi-app/Ombi/compare/v4.2.3...v4.2.4) (2021-10-13) + + +### Bug Fixes + +* **#4344:** :bug: Fixed an issue where we errored on Plex Episode Scan ([cd5532f](https://github.com/Ombi-app/Ombi/commit/cd5532fa8f7ebbfaf942841398672bafb9a405d4)) +* **#4345:** :bug: Fixed the issue where denied requests we not appearing correctly ([5a2f652](https://github.com/Ombi-app/Ombi/commit/5a2f652a28f5699dd667afef8dde129817e53392)) + + + +## [4.2.3](https://github.com/Ombi-app/Ombi/compare/v4.2.2...v4.2.3) (2021-10-12) + + +### Bug Fixes + +* **user-management:** :bug: Fixed an issue where the Copy users App Link did not generate the correct app link for that user ([8cafcdc](https://github.com/Ombi-app/Ombi/commit/8cafcdcc3baa85c55d75e43835b2289bbea69b0e)) + + + diff --git a/README.md b/README.md index 636c58c3e..33310efd2 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Don't worry, it's grandma friendly, and more importantly; has wife approval cert | Service | Stable | Develop |----------|:---------------------------:|:----------------------------:| -| Build Status | [![CI Build](https://github.com/Ombi-app/Ombi/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/Ombi-app/Ombi/actions/workflows/build.yml) | [![CI Build](https://github.com/Ombi-app/Ombi/actions/workflows/build.yml/badge.svg)](https://github.com/Ombi-app/Ombi/actions/workflows/build.yml) | [![Build Status](https://dev.azure.com/tidusjar/Ombi/_apis/build/status/Ombi%20CI?branchName=feature%2Fv4)](https://dev.azure.com/tidusjar/Ombi/_build/latest?definitionId=18&branchName=feature%2Fv4) +| Build Status | [![CI Build](https://github.com/Ombi-app/Ombi/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/Ombi-app/Ombi/actions/workflows/build.yml) | [![CI Build](https://github.com/Ombi-app/Ombi/actions/workflows/build.yml/badge.svg?branch=develop)](https://github.com/Ombi-app/Ombi/actions/workflows/build.yml) | [![Build Status](https://dev.azure.com/tidusjar/Ombi/_apis/build/status/Ombi%20CI?branchName=feature%2Fv4)](https://dev.azure.com/tidusjar/Ombi/_build/latest?definitionId=18&branchName=feature%2Fv4) | Download |[![Download](https://img.shields.io/badge/-Download-blue)](https://github.com/Ombi-app/Ombi/releases) | [![Download](https://img.shields.io/badge/-Download-blue)](https://ci.appveyor.com/project/tidusjar/requestplex/branch/develop/artifacts) | [![Download](https://img.shields.io/badge/-Download-blue)](https://github.com/ombi-app/ombi/releases) | # Feature Requests @@ -142,21 +142,28 @@ Here are some of the features Ombi has: Victor Usoltsev + + + sephrat +
+ Sephrat +
+ dhruvb14
Dhruv Bhavsar
- + + joshuaboniface
Joshua M. Boniface
- - + bruvv @@ -164,13 +171,6 @@ Here are some of the features Ombi has: Bruvv - - - sephrat -
- Sephrat -
- louis-lau diff --git a/makefile b/makefile new file mode 100644 index 000000000..ec70a7815 --- /dev/null +++ b/makefile @@ -0,0 +1,14 @@ +backend: + cd src/Ombi && dotnet watch run -- --host http://*:3577 + +frontend: + cd src/Ombi/ClientApp && yarn start + +install-frontend: + cd src/Ombi/ClientApp && yarn + +install-tests: + cd tests && yarn + +tests: + cd tests && npx cypress open diff --git a/src/Ombi.Api.CloudService/Ombi.Api.CloudService.csproj b/src/Ombi.Api.CloudService/Ombi.Api.CloudService.csproj index 0701967d1..5939549de 100644 --- a/src/Ombi.Api.CloudService/Ombi.Api.CloudService.csproj +++ b/src/Ombi.Api.CloudService/Ombi.Api.CloudService.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.CouchPotato/Ombi.Api.CouchPotato.csproj b/src/Ombi.Api.CouchPotato/Ombi.Api.CouchPotato.csproj index 320c51076..6353f4bf9 100644 --- a/src/Ombi.Api.CouchPotato/Ombi.Api.CouchPotato.csproj +++ b/src/Ombi.Api.CouchPotato/Ombi.Api.CouchPotato.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Discord/Ombi.Api.Discord.csproj b/src/Ombi.Api.Discord/Ombi.Api.Discord.csproj index 20c8a9aef..4945a2fb2 100644 --- a/src/Ombi.Api.Discord/Ombi.Api.Discord.csproj +++ b/src/Ombi.Api.Discord/Ombi.Api.Discord.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.DogNzb/Ombi.Api.DogNzb.csproj b/src/Ombi.Api.DogNzb/Ombi.Api.DogNzb.csproj index 320c51076..6353f4bf9 100644 --- a/src/Ombi.Api.DogNzb/Ombi.Api.DogNzb.csproj +++ b/src/Ombi.Api.DogNzb/Ombi.Api.DogNzb.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Emby/Ombi.Api.Emby.csproj b/src/Ombi.Api.Emby/Ombi.Api.Emby.csproj index 3008c9230..f167146af 100644 --- a/src/Ombi.Api.Emby/Ombi.Api.Emby.csproj +++ b/src/Ombi.Api.Emby/Ombi.Api.Emby.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.FanartTv/Ombi.Api.FanartTv.csproj b/src/Ombi.Api.FanartTv/Ombi.Api.FanartTv.csproj index 20c8a9aef..4945a2fb2 100644 --- a/src/Ombi.Api.FanartTv/Ombi.Api.FanartTv.csproj +++ b/src/Ombi.Api.FanartTv/Ombi.Api.FanartTv.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.Github/Ombi.Api.Github.csproj b/src/Ombi.Api.Github/Ombi.Api.Github.csproj index 320c51076..6353f4bf9 100644 --- a/src/Ombi.Api.Github/Ombi.Api.Github.csproj +++ b/src/Ombi.Api.Github/Ombi.Api.Github.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Gotify/Ombi.Api.Gotify.csproj b/src/Ombi.Api.Gotify/Ombi.Api.Gotify.csproj index 7065a1e65..1285c073c 100644 --- a/src/Ombi.Api.Gotify/Ombi.Api.Gotify.csproj +++ b/src/Ombi.Api.Gotify/Ombi.Api.Gotify.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.GroupMe/Ombi.Api.GroupMe.csproj b/src/Ombi.Api.GroupMe/Ombi.Api.GroupMe.csproj index 320c51076..6353f4bf9 100644 --- a/src/Ombi.Api.GroupMe/Ombi.Api.GroupMe.csproj +++ b/src/Ombi.Api.GroupMe/Ombi.Api.GroupMe.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Jellyfin/Ombi.Api.Jellyfin.csproj b/src/Ombi.Api.Jellyfin/Ombi.Api.Jellyfin.csproj index 3008c9230..f167146af 100644 --- a/src/Ombi.Api.Jellyfin/Ombi.Api.Jellyfin.csproj +++ b/src/Ombi.Api.Jellyfin/Ombi.Api.Jellyfin.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.Lidarr/Ombi.Api.Lidarr.csproj b/src/Ombi.Api.Lidarr/Ombi.Api.Lidarr.csproj index 320c51076..6353f4bf9 100644 --- a/src/Ombi.Api.Lidarr/Ombi.Api.Lidarr.csproj +++ b/src/Ombi.Api.Lidarr/Ombi.Api.Lidarr.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Mattermost/Ombi.Api.Mattermost.csproj b/src/Ombi.Api.Mattermost/Ombi.Api.Mattermost.csproj index 5742fd3a5..a25024b6c 100644 --- a/src/Ombi.Api.Mattermost/Ombi.Api.Mattermost.csproj +++ b/src/Ombi.Api.Mattermost/Ombi.Api.Mattermost.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.MusicBrainz/Ombi.Api.MusicBrainz.csproj b/src/Ombi.Api.MusicBrainz/Ombi.Api.MusicBrainz.csproj index 65b4175d4..584b980ce 100644 --- a/src/Ombi.Api.MusicBrainz/Ombi.Api.MusicBrainz.csproj +++ b/src/Ombi.Api.MusicBrainz/Ombi.Api.MusicBrainz.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Notifications/Ombi.Api.Notifications.csproj b/src/Ombi.Api.Notifications/Ombi.Api.Notifications.csproj index 312aa49f2..f84a8add6 100644 --- a/src/Ombi.Api.Notifications/Ombi.Api.Notifications.csproj +++ b/src/Ombi.Api.Notifications/Ombi.Api.Notifications.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Plex/Ombi.Api.Plex.csproj b/src/Ombi.Api.Plex/Ombi.Api.Plex.csproj index 20c8a9aef..4945a2fb2 100644 --- a/src/Ombi.Api.Plex/Ombi.Api.Plex.csproj +++ b/src/Ombi.Api.Plex/Ombi.Api.Plex.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.Pushbullet/Ombi.Api.Pushbullet.csproj b/src/Ombi.Api.Pushbullet/Ombi.Api.Pushbullet.csproj index 20c8a9aef..4945a2fb2 100644 --- a/src/Ombi.Api.Pushbullet/Ombi.Api.Pushbullet.csproj +++ b/src/Ombi.Api.Pushbullet/Ombi.Api.Pushbullet.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.Pushover/Ombi.Api.Pushover.csproj b/src/Ombi.Api.Pushover/Ombi.Api.Pushover.csproj index 7065a1e65..1285c073c 100644 --- a/src/Ombi.Api.Pushover/Ombi.Api.Pushover.csproj +++ b/src/Ombi.Api.Pushover/Ombi.Api.Pushover.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.Radarr/Ombi.Api.Radarr.csproj b/src/Ombi.Api.Radarr/Ombi.Api.Radarr.csproj index c8ace891e..f14df4f5f 100644 --- a/src/Ombi.Api.Radarr/Ombi.Api.Radarr.csproj +++ b/src/Ombi.Api.Radarr/Ombi.Api.Radarr.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 @@ -11,7 +11,7 @@ - + diff --git a/src/Ombi.Api.RottenTomatoes/Ombi.Api.RottenTomatoes.csproj b/src/Ombi.Api.RottenTomatoes/Ombi.Api.RottenTomatoes.csproj index 795629ea6..6353f4bf9 100644 --- a/src/Ombi.Api.RottenTomatoes/Ombi.Api.RottenTomatoes.csproj +++ b/src/Ombi.Api.RottenTomatoes/Ombi.Api.RottenTomatoes.csproj @@ -1,7 +1,7 @@ - + - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Service/Ombi.Api.Service.csproj b/src/Ombi.Api.Service/Ombi.Api.Service.csproj index 0b83f88e0..a344de142 100644 --- a/src/Ombi.Api.Service/Ombi.Api.Service.csproj +++ b/src/Ombi.Api.Service/Ombi.Api.Service.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 @@ -13,7 +13,7 @@ - + diff --git a/src/Ombi.Api.SickRage/Ombi.Api.SickRage.csproj b/src/Ombi.Api.SickRage/Ombi.Api.SickRage.csproj index 320c51076..6353f4bf9 100644 --- a/src/Ombi.Api.SickRage/Ombi.Api.SickRage.csproj +++ b/src/Ombi.Api.SickRage/Ombi.Api.SickRage.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Slack/Ombi.Api.Slack.csproj b/src/Ombi.Api.Slack/Ombi.Api.Slack.csproj index 20c8a9aef..4945a2fb2 100644 --- a/src/Ombi.Api.Slack/Ombi.Api.Slack.csproj +++ b/src/Ombi.Api.Slack/Ombi.Api.Slack.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.Sonarr/Ombi.Api.Sonarr.csproj b/src/Ombi.Api.Sonarr/Ombi.Api.Sonarr.csproj index 20c8a9aef..4945a2fb2 100644 --- a/src/Ombi.Api.Sonarr/Ombi.Api.Sonarr.csproj +++ b/src/Ombi.Api.Sonarr/Ombi.Api.Sonarr.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.Telegram/Ombi.Api.Telegram.csproj b/src/Ombi.Api.Telegram/Ombi.Api.Telegram.csproj index 320c51076..6353f4bf9 100644 --- a/src/Ombi.Api.Telegram/Ombi.Api.Telegram.csproj +++ b/src/Ombi.Api.Telegram/Ombi.Api.Telegram.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Trakt/Ombi.Api.Trakt.csproj b/src/Ombi.Api.Trakt/Ombi.Api.Trakt.csproj index f499f594e..e07f40c60 100644 --- a/src/Ombi.Api.Trakt/Ombi.Api.Trakt.csproj +++ b/src/Ombi.Api.Trakt/Ombi.Api.Trakt.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.TvMaze/Ombi.Api.TvMaze.csproj b/src/Ombi.Api.TvMaze/Ombi.Api.TvMaze.csproj index 3008c9230..f167146af 100644 --- a/src/Ombi.Api.TvMaze/Ombi.Api.TvMaze.csproj +++ b/src/Ombi.Api.TvMaze/Ombi.Api.TvMaze.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api.Twilio/Ombi.Api.Twilio.csproj b/src/Ombi.Api.Twilio/Ombi.Api.Twilio.csproj index a5bb9ea19..8e12c7c67 100644 --- a/src/Ombi.Api.Twilio/Ombi.Api.Twilio.csproj +++ b/src/Ombi.Api.Twilio/Ombi.Api.Twilio.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Api.Webhook/Ombi.Api.Webhook.csproj b/src/Ombi.Api.Webhook/Ombi.Api.Webhook.csproj index 109e3e3f1..7748aad45 100644 --- a/src/Ombi.Api.Webhook/Ombi.Api.Webhook.csproj +++ b/src/Ombi.Api.Webhook/Ombi.Api.Webhook.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Api/ApiHelper.cs b/src/Ombi.Api/ApiHelper.cs index fa9d3e7ab..f88525869 100644 --- a/src/Ombi.Api/ApiHelper.cs +++ b/src/Ombi.Api/ApiHelper.cs @@ -66,6 +66,8 @@ namespace Ombi.Api startingTag = builder.Query.Contains("?") ? "&" : "?"; } + value = Uri.EscapeDataString(value); + builder.Query = hasQuery ? $"{builder.Query}{startingTag}{parameter}={value}" : $"{startingTag}{parameter}={value}"; diff --git a/src/Ombi.Api/Ombi.Api.csproj b/src/Ombi.Api/Ombi.Api.csproj index 02969e665..83c3ee62e 100644 --- a/src/Ombi.Api/Ombi.Api.csproj +++ b/src/Ombi.Api/Ombi.Api.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 @@ -11,8 +11,8 @@ - - + + diff --git a/src/Ombi.Core.Tests/Ombi.Core.Tests.csproj b/src/Ombi.Core.Tests/Ombi.Core.Tests.csproj index fcbdab967..4e01e32cd 100644 --- a/src/Ombi.Core.Tests/Ombi.Core.Tests.csproj +++ b/src/Ombi.Core.Tests/Ombi.Core.Tests.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 true true Debug;Release;NonUiBuild @@ -9,7 +9,7 @@ - + diff --git a/src/Ombi.Core.Tests/Senders/MassEmailSenderTests.cs b/src/Ombi.Core.Tests/Senders/MassEmailSenderTests.cs new file mode 100644 index 000000000..5c5cedabe --- /dev/null +++ b/src/Ombi.Core.Tests/Senders/MassEmailSenderTests.cs @@ -0,0 +1,228 @@ +using Microsoft.Extensions.Logging; +using MockQueryable.Moq; +using Moq; +using Moq.AutoMock; +using NUnit.Framework; +using Ombi.Core.Authentication; +using Ombi.Core.Models; +using Ombi.Core.Senders; +using Ombi.Notifications; +using Ombi.Notifications.Models; +using Ombi.Settings.Settings.Models.Notifications; +using Ombi.Store.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Ombi.Core.Tests.Senders +{ + [TestFixture] + public class MassEmailSenderTests + { + + private MassEmailSender _subject; + private AutoMocker _mocker; + + [SetUp] + public void Setup() + { + _mocker = new AutoMocker(); + _subject = _mocker.CreateInstance(); + } + + [Test] + public async Task SendMassEmail_SingleUser() + { + var model = new MassEmailModel + { + Body = "Test", + Subject = "Subject", + Users = new List + { + new OmbiUser + { + Id = "a" + } + } + }; + + _mocker.Setup>(x => x.Users).Returns(new List + { + new OmbiUser + { + Id = "a", + Email = "Test@test.com" + } + }.AsQueryable().BuildMock().Object); + + var result = await _subject.SendMassEmail(model); + + _mocker.Verify(x => x.SendAdHoc(It.Is(m => m.Subject == model.Subject + && m.Message == model.Body + && m.To == "Test@test.com"), It.IsAny()), Times.Once); + } + + [Test] + public async Task SendMassEmail_MultipleUsers() + { + var model = new MassEmailModel + { + Body = "Test", + Subject = "Subject", + Users = new List + { + new OmbiUser + { + Id = "a" + }, + new OmbiUser + { + Id = "b" + } + } + }; + + _mocker.Setup>(x => x.Users).Returns(new List + { + new OmbiUser + { + Id = "a", + Email = "Test@test.com" + }, + new OmbiUser + { + Id = "b", + Email = "b@test.com" + } + }.AsQueryable().BuildMock().Object); + + var result = await _subject.SendMassEmail(model); + + _mocker.Verify(x => x.SendAdHoc(It.Is(m => m.Subject == model.Subject + && m.Message == model.Body + && m.To == "Test@test.com"), It.IsAny()), Times.Once); + _mocker.Verify(x => x.SendAdHoc(It.Is(m => m.Subject == model.Subject + && m.Message == model.Body + && m.To == "b@test.com"), It.IsAny()), Times.Once); + } + + [Test] + public async Task SendMassEmail_UserNoEmail() + { + var model = new MassEmailModel + { + Body = "Test", + Subject = "Subject", + Users = new List + { + new OmbiUser + { + Id = "a" + } + } + }; + + _mocker.Setup>(x => x.Users).Returns(new List + { + new OmbiUser + { + Id = "a", + } + }.AsQueryable().BuildMock().Object); + + var result = await _subject.SendMassEmail(model); + _mocker.Verify>( + x => x.Log( + LogLevel.Information, + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>()), + Times.Once); + + _mocker.Verify(x => x.SendAdHoc(It.IsAny(), It.IsAny()), Times.Never); + } + + [Test] + public async Task SendMassEmail_Bcc() + { + var model = new MassEmailModel + { + Body = "Test", + Subject = "Subject", + Bcc = true, + Users = new List + { + new OmbiUser + { + Id = "a" + }, + new OmbiUser + { + Id = "b" + } + } + }; + + _mocker.Setup>(x => x.Users).Returns(new List + { + new OmbiUser + { + Id = "a", + Email = "Test@test.com" + }, + new OmbiUser + { + Id = "b", + Email = "b@test.com" + } + }.AsQueryable().BuildMock().Object); + + var result = await _subject.SendMassEmail(model); + + _mocker.Verify(x => x.SendAdHoc(It.Is(m => m.Subject == model.Subject + && m.Message == model.Body + && m.Other["bcc"] == "Test@test.com,b@test.com"), It.IsAny()), Times.Once); + } + + [Test] + public async Task SendMassEmail_Bcc_NoEmails() + { + var model = new MassEmailModel + { + Body = "Test", + Subject = "Subject", + Bcc = true, + Users = new List + { + new OmbiUser + { + Id = "a" + }, + new OmbiUser + { + Id = "b" + } + } + }; + + _mocker.Setup>(x => x.Users).Returns(new List + { + new OmbiUser + { + Id = "a", + }, + new OmbiUser + { + Id = "b", + } + }.AsQueryable().BuildMock().Object); + + var result = await _subject.SendMassEmail(model); + + _mocker.Verify(x => x.SendAdHoc(It.IsAny(), It.IsAny()), Times.Never); + } + + } +} diff --git a/src/Ombi.Core/Engine/BaseMediaEngine.cs b/src/Ombi.Core/Engine/BaseMediaEngine.cs index 91f8a58b0..277144ab1 100644 --- a/src/Ombi.Core/Engine/BaseMediaEngine.cs +++ b/src/Ombi.Core/Engine/BaseMediaEngine.cs @@ -78,6 +78,32 @@ namespace Ombi.Core.Engine return _dbTv; } + protected async Task CheckCanManageRequest(BaseRequest request) { + var errorResult = new RequestEngineResult { + Result = false, + ErrorCode = ErrorCode.NoPermissions + }; + var successResult = new RequestEngineResult { Result = true }; + + // Admins can always manage requests + var isAdmin = await IsInRole(OmbiRoles.PowerUser) || await IsInRole(OmbiRoles.Admin); + if (isAdmin) { + return successResult; + } + + // Users with 'ManageOwnRequests' can only manage their own requests + var canManageOwnRequests = await IsInRole(OmbiRoles.ManageOwnRequests); + if (!canManageOwnRequests) { + return errorResult; + } + var isRequestedBySameUser = ( await GetUser() ).Id == request.RequestedUser?.Id; + if (isRequestedBySameUser) { + return successResult; + } + + return errorResult; + } + public RequestCountModel RequestCount() { var movieQuery = MovieRepository.GetAll(); diff --git a/src/Ombi.Core/Engine/IMusicRequestEngine.cs b/src/Ombi.Core/Engine/IMusicRequestEngine.cs index 4dbb3b16a..fcdb06496 100644 --- a/src/Ombi.Core/Engine/IMusicRequestEngine.cs +++ b/src/Ombi.Core/Engine/IMusicRequestEngine.cs @@ -18,7 +18,7 @@ namespace Ombi.Core.Engine Task GetTotal(); Task MarkAvailable(int modelId); Task MarkUnavailable(int modelId); - Task RemoveAlbumRequest(int requestId); + Task RemoveAlbumRequest(int requestId); Task RequestAlbum(MusicAlbumRequestViewModel model); Task> SearchAlbumRequest(string search); Task UserHasRequest(string userId); diff --git a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs index dfcd1b1da..7cc64bee2 100644 --- a/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/IMovieRequestEngine.cs @@ -14,7 +14,7 @@ namespace Ombi.Core.Engine.Interfaces Task> SearchMovieRequest(string search); Task RequestCollection(int collectionId, CancellationToken cancellationToken); - Task RemoveMovieRequest(int requestId); + Task RemoveMovieRequest(int requestId); Task RemoveAllMovieRequests(); Task GetRequest(int requestId); Task UpdateMovieRequest(MovieRequests request); diff --git a/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs b/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs index c93403b3e..6fdf52c56 100644 --- a/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs +++ b/src/Ombi.Core/Engine/Interfaces/ITvRequestEngine.cs @@ -20,7 +20,7 @@ namespace Ombi.Core.Engine.Interfaces Task UpdateTvRequest(TvRequests request); Task> GetAllChldren(int tvId); Task UpdateChildRequest(ChildRequests request); - Task RemoveTvChild(int requestId); + Task RemoveTvChild(int requestId); Task ApproveChildRequest(int id); Task> GetRequestsLite(); Task UpdateQualityProfile(int requestId, int profileId); diff --git a/src/Ombi.Core/Engine/Interfaces/ITvSearchEngineV2.cs b/src/Ombi.Core/Engine/Interfaces/ITvSearchEngineV2.cs index 25a3c2621..2e01e739e 100644 --- a/src/Ombi.Core/Engine/Interfaces/ITvSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/Interfaces/ITvSearchEngineV2.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using Ombi.Api.TheMovieDb.Models; using Ombi.Core.Models.Search; using Ombi.Core.Models.Search.V2; @@ -10,6 +11,7 @@ namespace Ombi.Core { Task GetShowInformation(string tvdbid, CancellationToken token); Task GetShowByRequest(int requestId, CancellationToken token); + Task GetTvByActor(int actorId, string langCode); Task> GetStreamInformation(int movieDbId, CancellationToken cancellationToken); Task> Popular(int currentlyLoaded, int amountToLoad, string langCustomCode = null); Task> Anticipated(int currentlyLoaded, int amountToLoad); diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs index 63aa0d376..0d0234fc6 100644 --- a/src/Ombi.Core/Engine/MovieRequestEngine.cs +++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs @@ -654,11 +654,20 @@ namespace Ombi.Core.Engine /// /// The request identifier. /// - public async Task RemoveMovieRequest(int requestId) + public async Task RemoveMovieRequest(int requestId) { var request = await MovieRepository.GetAll().FirstOrDefaultAsync(x => x.Id == requestId); + + var result = await CheckCanManageRequest(request); + if (result.IsError) + return result; + await MovieRepository.Delete(request); await _mediaCacheService.Purge(); + return new RequestEngineResult + { + Result = true, + }; } public async Task RemoveAllMovieRequests() diff --git a/src/Ombi.Core/Engine/MusicRequestEngine.cs b/src/Ombi.Core/Engine/MusicRequestEngine.cs index d0a9cc5d7..b9aa183d2 100644 --- a/src/Ombi.Core/Engine/MusicRequestEngine.cs +++ b/src/Ombi.Core/Engine/MusicRequestEngine.cs @@ -404,10 +404,20 @@ namespace Ombi.Core.Engine /// /// The request identifier. /// - public async Task RemoveAlbumRequest(int requestId) + public async Task RemoveAlbumRequest(int requestId) { var request = await MusicRepository.GetAll().FirstOrDefaultAsync(x => x.Id == requestId); + + var result = await CheckCanManageRequest(request); + if (result.IsError) + return result; + await MusicRepository.Delete(request); + + return new RequestEngineResult + { + Result = true, + }; } public async Task UserHasRequest(string userId) diff --git a/src/Ombi.Core/Engine/RequestEngineResult.cs b/src/Ombi.Core/Engine/RequestEngineResult.cs index 08c61b7ae..a2f4f93f4 100644 --- a/src/Ombi.Core/Engine/RequestEngineResult.cs +++ b/src/Ombi.Core/Engine/RequestEngineResult.cs @@ -7,7 +7,7 @@ namespace Ombi.Core.Engine { public bool Result { get; set; } public string Message { get; set; } - public bool IsError => !string.IsNullOrEmpty(ErrorMessage); + public bool IsError => ( !string.IsNullOrEmpty(ErrorMessage) || ErrorCode != null ); public string ErrorMessage { get; set; } public ErrorCode? ErrorCode { get; set; } public int RequestId { get; set; } diff --git a/src/Ombi.Core/Engine/TvRequestEngine.cs b/src/Ombi.Core/Engine/TvRequestEngine.cs index fd306f951..c05a23a48 100644 --- a/src/Ombi.Core/Engine/TvRequestEngine.cs +++ b/src/Ombi.Core/Engine/TvRequestEngine.cs @@ -749,10 +749,14 @@ namespace Ombi.Core.Engine return request; } - public async Task RemoveTvChild(int requestId) + public async Task RemoveTvChild(int requestId) { var request = await TvRepository.GetChild().FirstOrDefaultAsync(x => x.Id == requestId); + var result = await CheckCanManageRequest(request); + if (result.IsError) + return result; + TvRepository.Db.ChildRequests.Remove(request); var all = TvRepository.Db.TvRequests.Include(x => x.ChildRequests); var parent = all.FirstOrDefault(x => x.Id == request.ParentRequestId); @@ -766,6 +770,11 @@ namespace Ombi.Core.Engine await TvRepository.Db.SaveChangesAsync(); await _mediaCacheService.Purge(); + + return new RequestEngineResult + { + Result = true, + }; } public async Task RemoveTvRequest(int requestId) diff --git a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs index e865c6465..7c69e4d5d 100644 --- a/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/V2/MovieSearchEngineV2.cs @@ -323,6 +323,7 @@ namespace Ombi.Core.Engine.V2 public async Task GetMoviesByActor(int actorId, string langCode) { + langCode = await DefaultLanguageCode(langCode); var result = await Cache.GetOrAddAsync(nameof(GetMoviesByActor) + actorId + langCode, () => MovieApi.GetActorMovieCredits(actorId, langCode), DateTimeOffset.Now.AddHours(12)); // Later we run this through the rules engine diff --git a/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs b/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs index 26cba7c14..2fcff7439 100644 --- a/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs +++ b/src/Ombi.Core/Engine/V2/TvSearchEngineV2.cs @@ -147,6 +147,13 @@ namespace Ombi.Core.Engine.V2 return await processed; } + public async Task GetTvByActor(int actorId, string langCode) + { + langCode = await DefaultLanguageCode(langCode); + var result = await Cache.GetOrAddAsync(nameof(GetTvByActor) + actorId + langCode, + () => _movieApi.GetActorTvCredits(actorId, langCode), DateTimeOffset.Now.AddHours(12)); + return result; + } public async Task> GetStreamInformation(int movieDbId, CancellationToken cancellationToken) { diff --git a/src/Ombi.Core/Models/MassEmailModel.cs b/src/Ombi.Core/Models/MassEmailModel.cs index ad09f0cb9..e175c0886 100644 --- a/src/Ombi.Core/Models/MassEmailModel.cs +++ b/src/Ombi.Core/Models/MassEmailModel.cs @@ -35,6 +35,8 @@ namespace Ombi.Core.Models public string Subject { get; set; } public string Body { get; set; } + public bool Bcc { get; set; } + public List Users { get; set; } } } \ No newline at end of file diff --git a/src/Ombi.Core/Ombi.Core.csproj b/src/Ombi.Core/Ombi.Core.csproj index 857de0bab..359792e0d 100644 --- a/src/Ombi.Core/Ombi.Core.csproj +++ b/src/Ombi.Core/Ombi.Core.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 @@ -13,8 +13,8 @@ - - + + diff --git a/src/Ombi.Core/Senders/MassEmailSender.cs b/src/Ombi.Core/Senders/MassEmailSender.cs index 604224b34..106a63f49 100644 --- a/src/Ombi.Core/Senders/MassEmailSender.cs +++ b/src/Ombi.Core/Senders/MassEmailSender.cs @@ -25,7 +25,9 @@ // ************************************************************************/ #endregion +using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; @@ -64,6 +66,63 @@ namespace Ombi.Core.Senders var customization = await _customizationService.GetSettingsAsync(); var email = await _emailService.GetSettingsAsync(); var messagesSent = new List(); + if (model.Bcc) + { + await SendBccMails(model, customization, email, messagesSent); + } + else + { + await SendIndividualEmails(model, customization, email, messagesSent); + } + + await Task.WhenAll(messagesSent); + + return true; + } + + private async Task SendBccMails(MassEmailModel model, CustomizationSettings customization, EmailNotificationSettings email, List messagesSent) + { + var resolver = new NotificationMessageResolver(); + var curlys = new NotificationMessageCurlys(); + + var validUsers = new List(); + foreach (var user in model.Users) + { + var fullUser = await _userManager.Users.FirstOrDefaultAsync(x => x.Id == user.Id); + if (!fullUser.Email.HasValue()) + { + _log.LogInformation("User {0} has no email, cannot send mass email to this user", fullUser.UserName); + continue; + } + + validUsers.Add(fullUser); + } + + if (!validUsers.Any()) + { + return; + } + + var firstUser = validUsers.FirstOrDefault(); + + var bccAddress = string.Join(',', validUsers.Select(x => x.Email)); + curlys.Setup(firstUser, customization); + var template = new NotificationTemplates() { Message = model.Body, Subject = model.Subject }; + var content = resolver.ParseMessage(template, curlys); + var msg = new NotificationMessage + { + Message = content.Message, + Subject = content.Subject, + Other = new Dictionary { { "bcc", bccAddress } } + }; + + messagesSent.Add(_email.SendAdHoc(msg, email)); + } + + private async Task SendIndividualEmails(MassEmailModel model, CustomizationSettings customization, EmailNotificationSettings email, List messagesSent) + { + var resolver = new NotificationMessageResolver(); + var curlys = new NotificationMessageCurlys(); foreach (var user in model.Users) { var fullUser = await _userManager.Users.FirstOrDefaultAsync(x => x.Id == user.Id); @@ -72,8 +131,6 @@ namespace Ombi.Core.Senders _log.LogInformation("User {0} has no email, cannot send mass email to this user", fullUser.UserName); continue; } - var resolver = new NotificationMessageResolver(); - var curlys = new NotificationMessageCurlys(); curlys.Setup(fullUser, customization); var template = new NotificationTemplates() { Message = model.Body, Subject = model.Subject }; var content = resolver.ParseMessage(template, curlys); @@ -83,13 +140,19 @@ namespace Ombi.Core.Senders To = fullUser.Email, Subject = content.Subject }; - messagesSent.Add(_email.SendAdHoc(msg, email)); + messagesSent.Add(DelayEmail(msg, email)); _log.LogInformation("Sent mass email to user {0} @ {1}", fullUser.UserName, fullUser.Email); } + } - await Task.WhenAll(messagesSent); - - return true; + /// + /// This will add a 2 second delay, this is to help with concurrent connection limits + /// + /// + private async Task DelayEmail(NotificationMessage msg, EmailNotificationSettings email) + { + await Task.Delay(2000); + await _email.SendAdHoc(msg, email); } } } \ No newline at end of file diff --git a/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj b/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj index 9d6efcd69..e65f2d5a2 100644 --- a/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj +++ b/src/Ombi.DependencyInjection/Ombi.DependencyInjection.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 @@ -11,10 +11,10 @@ - + - - + + diff --git a/src/Ombi.HealthChecks/Ombi.HealthChecks.csproj b/src/Ombi.HealthChecks/Ombi.HealthChecks.csproj index 1abcc9a8d..e228dd0d2 100644 --- a/src/Ombi.HealthChecks/Ombi.HealthChecks.csproj +++ b/src/Ombi.HealthChecks/Ombi.HealthChecks.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj b/src/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj index 53725b2b0..370440d1c 100644 --- a/src/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj +++ b/src/Ombi.Helpers.Tests/Ombi.Helpers.Tests.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false @@ -10,7 +10,7 @@ - + diff --git a/src/Ombi.Helpers/LinqHelpers.cs b/src/Ombi.Helpers/LinqHelpers.cs index af8d44633..4e8012653 100644 --- a/src/Ombi.Helpers/LinqHelpers.cs +++ b/src/Ombi.Helpers/LinqHelpers.cs @@ -6,16 +6,6 @@ namespace Ombi.Helpers { public static class LinqHelpers { - public static IEnumerable DistinctBy(this IEnumerable source, Func keySelector) - { - HashSet knownKeys = new HashSet(); - foreach (TSource source1 in source) - { - if (knownKeys.Add(keySelector(source1))) - yield return source1; - } - } - public static HashSet ToHashSet( this IEnumerable source, IEqualityComparer comparer = null) diff --git a/src/Ombi.Helpers/MediaCacheService.cs b/src/Ombi.Helpers/MediaCacheService.cs index d99090b62..8d244f4b3 100644 --- a/src/Ombi.Helpers/MediaCacheService.cs +++ b/src/Ombi.Helpers/MediaCacheService.cs @@ -53,17 +53,18 @@ namespace Ombi.Helpers _memoryCache.Set(CacheKey, mediaServiceCache); } - public async Task Purge() + public Task Purge() { var keys = _memoryCache.Get>(CacheKey); if (keys == null) { - return; + return Task.CompletedTask; } foreach (var key in keys) { base.Remove(key); } + return Task.CompletedTask; } } diff --git a/src/Ombi.Helpers/Ombi.Helpers.csproj b/src/Ombi.Helpers/Ombi.Helpers.csproj index 2c32cc1bc..afc881d94 100644 --- a/src/Ombi.Helpers/Ombi.Helpers.csproj +++ b/src/Ombi.Helpers/Ombi.Helpers.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 @@ -13,8 +13,8 @@ - - + + diff --git a/src/Ombi.Hubs/Ombi.Hubs.csproj b/src/Ombi.Hubs/Ombi.Hubs.csproj index 613221552..fc65e2dc2 100644 --- a/src/Ombi.Hubs/Ombi.Hubs.csproj +++ b/src/Ombi.Hubs/Ombi.Hubs.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Mapping/Ombi.Mapping.csproj b/src/Ombi.Mapping/Ombi.Mapping.csproj index f6a5194d9..9ad1f1135 100644 --- a/src/Ombi.Mapping/Ombi.Mapping.csproj +++ b/src/Ombi.Mapping/Ombi.Mapping.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Notifications.Templates/EmailBasicTemplate.cs b/src/Ombi.Notifications.Templates/EmailBasicTemplate.cs index 15ec9b286..455c2d182 100644 --- a/src/Ombi.Notifications.Templates/EmailBasicTemplate.cs +++ b/src/Ombi.Notifications.Templates/EmailBasicTemplate.cs @@ -13,7 +13,7 @@ namespace Ombi.Notifications.Templates if (string.IsNullOrEmpty(_templateLocation)) { #if DEBUG - _templateLocation = Path.Combine(Directory.GetCurrentDirectory(), "bin", "Debug", "net5.0", "Templates", + _templateLocation = Path.Combine(Directory.GetCurrentDirectory(), "bin", "Debug", "net6.0", "Templates", "BasicTemplate.html"); #else _templateLocation = Path.Combine(Directory.GetCurrentDirectory(), "Templates","BasicTemplate.html"); diff --git a/src/Ombi.Notifications.Templates/NewsletterTemplate.cs b/src/Ombi.Notifications.Templates/NewsletterTemplate.cs index f2f0cbf12..ef31dfc4c 100644 --- a/src/Ombi.Notifications.Templates/NewsletterTemplate.cs +++ b/src/Ombi.Notifications.Templates/NewsletterTemplate.cs @@ -13,7 +13,7 @@ namespace Ombi.Notifications.Templates if (string.IsNullOrEmpty(_templateLocation)) { #if DEBUG - _templateLocation = Path.Combine(Directory.GetCurrentDirectory(), "bin", "Debug", "net5.0", "Templates", "NewsletterTemplate.html"); + _templateLocation = Path.Combine(Directory.GetCurrentDirectory(), "bin", "Debug", "net6.0", "Templates", "NewsletterTemplate.html"); #else _templateLocation = Path.Combine(Directory.GetCurrentDirectory(), "Templates", "NewsletterTemplate.html"); #endif diff --git a/src/Ombi.Notifications.Templates/Ombi.Notifications.Templates.csproj b/src/Ombi.Notifications.Templates/Ombi.Notifications.Templates.csproj index 47f701083..33088a591 100644 --- a/src/Ombi.Notifications.Templates/Ombi.Notifications.Templates.csproj +++ b/src/Ombi.Notifications.Templates/Ombi.Notifications.Templates.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Notifications.Tests/Ombi.Notifications.Tests.csproj b/src/Ombi.Notifications.Tests/Ombi.Notifications.Tests.csproj index 495df8cdc..b3edbcf6d 100644 --- a/src/Ombi.Notifications.Tests/Ombi.Notifications.Tests.csproj +++ b/src/Ombi.Notifications.Tests/Ombi.Notifications.Tests.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Debug;Release;NonUiBuild @@ -10,7 +10,7 @@ - + diff --git a/src/Ombi.Notifications/GenericEmailProvider.cs b/src/Ombi.Notifications/GenericEmailProvider.cs index 15f17af92..fdeb1f49c 100644 --- a/src/Ombi.Notifications/GenericEmailProvider.cs +++ b/src/Ombi.Notifications/GenericEmailProvider.cs @@ -64,7 +64,20 @@ namespace Ombi.Notifications MessageId = messageId }; message.From.Add(new MailboxAddress(string.IsNullOrEmpty(settings.SenderName) ? settings.SenderAddress : settings.SenderName, settings.SenderAddress)); - message.To.Add(new MailboxAddress(model.To, model.To)); + if (model.To.HasValue()) + { + message.To.Add(new MailboxAddress(model.To, model.To)); + } + + // Check for BCC + if (model.Other.TryGetValue("bcc", out var bcc)) + { + var bccList = bcc.Split(',', StringSplitOptions.RemoveEmptyEntries); + foreach (var item in bccList) + { + message.Bcc.Add(new MailboxAddress(item, item)); + } + } using (var client = new SmtpClient()) { diff --git a/src/Ombi.Notifications/Ombi.Notifications.csproj b/src/Ombi.Notifications/Ombi.Notifications.csproj index ab65285b3..6b497c23e 100644 --- a/src/Ombi.Notifications/Ombi.Notifications.csproj +++ b/src/Ombi.Notifications/Ombi.Notifications.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj index 1203d731d..fd23ee60b 100644 --- a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj +++ b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Debug;Release;NonUiBuild @@ -11,7 +11,7 @@ - + diff --git a/src/Ombi.Schedule/Jobs/Ombi/OmbiAutomaticUpdater.cs b/src/Ombi.Schedule/Jobs/Ombi/OmbiAutomaticUpdater.cs index c2cf42441..4489a045e 100644 --- a/src/Ombi.Schedule/Jobs/Ombi/OmbiAutomaticUpdater.cs +++ b/src/Ombi.Schedule/Jobs/Ombi/OmbiAutomaticUpdater.cs @@ -321,7 +321,9 @@ namespace Ombi.Schedule.Jobs.Ombi public async Task DownloadAsync(string requestUri, string filename) { Logger.LogDebug(LoggingEvents.Updater, "Starting the DownloadAsync"); +#pragma warning disable SYSLIB0014 // Type or member is obsolete using (var client = new WebClient()) +#pragma warning restore SYSLIB0014 // Type or member is obsolete { await client.DownloadFileTaskAsync(requestUri, filename); } diff --git a/src/Ombi.Schedule/Ombi.Schedule.csproj b/src/Ombi.Schedule/Ombi.Schedule.csproj index 51cf46f82..ed1a7d9a1 100644 --- a/src/Ombi.Schedule/Ombi.Schedule.csproj +++ b/src/Ombi.Schedule/Ombi.Schedule.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 @@ -11,10 +11,9 @@ - - + diff --git a/src/Ombi.Settings.Tests/Ombi.Settings.Tests.csproj b/src/Ombi.Settings.Tests/Ombi.Settings.Tests.csproj index d30b780c6..5f93b4b68 100644 --- a/src/Ombi.Settings.Tests/Ombi.Settings.Tests.csproj +++ b/src/Ombi.Settings.Tests/Ombi.Settings.Tests.csproj @@ -1,6 +1,6 @@  - net5.0 + net6.0 false @@ -10,7 +10,7 @@ - + diff --git a/src/Ombi.Settings/Ombi.Settings.csproj b/src/Ombi.Settings/Ombi.Settings.csproj index 377970b59..b39c123e2 100644 --- a/src/Ombi.Settings/Ombi.Settings.csproj +++ b/src/Ombi.Settings/Ombi.Settings.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 @@ -11,7 +11,7 @@ - + diff --git a/src/Ombi.Store/Ombi.Store.csproj b/src/Ombi.Store/Ombi.Store.csproj index 99e12530f..f35da548f 100644 --- a/src/Ombi.Store/Ombi.Store.csproj +++ b/src/Ombi.Store/Ombi.Store.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 3.0.0.0 3.0.0.0 @@ -12,14 +12,14 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + diff --git a/src/Ombi.Test.Common/Ombi.Test.Common.csproj b/src/Ombi.Test.Common/Ombi.Test.Common.csproj index deeccf52b..71b05f59c 100644 --- a/src/Ombi.Test.Common/Ombi.Test.Common.csproj +++ b/src/Ombi.Test.Common/Ombi.Test.Common.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 8.0 Debug;Release;NonUiBuild diff --git a/src/Ombi.Tests/Ombi.Tests.csproj b/src/Ombi.Tests/Ombi.Tests.csproj index 9153b12d1..c38756445 100644 --- a/src/Ombi.Tests/Ombi.Tests.csproj +++ b/src/Ombi.Tests/Ombi.Tests.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false @@ -9,12 +9,12 @@ - + - + diff --git a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs index 6d0859cef..eadfb3a3a 100644 --- a/src/Ombi.TheMovieDbApi/IMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/IMovieDbApi.cs @@ -31,6 +31,7 @@ namespace Ombi.Api.TheMovieDb Task GetTVInfo(string themoviedbid, string langCode = "en"); Task> SearchByActor(string searchTerm, string langCode); Task GetActorMovieCredits(int actorId, string langCode); + Task GetActorTvCredits(int actorId, string langCode); Task> MultiSearch(string searchTerm, string languageCode, CancellationToken cancellationToken); Task> DiscoverMovies(string langCode, int keywordId); Task GetFullMovieInfo(int movieId, CancellationToken cancellationToken, string langCode); diff --git a/src/Ombi.TheMovieDbApi/Ombi.Api.TheMovieDb.csproj b/src/Ombi.TheMovieDbApi/Ombi.Api.TheMovieDb.csproj index 6311e948c..41ac19686 100644 --- a/src/Ombi.TheMovieDbApi/Ombi.Api.TheMovieDb.csproj +++ b/src/Ombi.TheMovieDbApi/Ombi.Api.TheMovieDb.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Ombi.Api.TheMovieDb 3.0.0.0 3.0.0.0 diff --git a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs index aa46b0c8e..0391c184a 100644 --- a/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs +++ b/src/Ombi.TheMovieDbApi/TheMovieDbApi.cs @@ -139,6 +139,16 @@ namespace Ombi.Api.TheMovieDb var result = await Api.Request(request); return result; } + + public async Task GetActorTvCredits(int actorId, string langCode) + { + var request = new Request($"person/{actorId}/tv_credits", BaseUri, HttpMethod.Get); + request.AddQueryString("api_key", ApiToken); + request.AddQueryString("language", langCode); + + var result = await Api.Request(request); + return result; + } public async Task> SearchTv(string searchTerm, string year = default) { diff --git a/src/Ombi.Updater/Ombi.Updater.csproj b/src/Ombi.Updater/Ombi.Updater.csproj index 6c74dbe74..d31229b62 100644 --- a/src/Ombi.Updater/Ombi.Updater.csproj +++ b/src/Ombi.Updater/Ombi.Updater.csproj @@ -3,7 +3,7 @@ Exe win10-x64;win10-x86;osx-x64;ubuntu-x64;debian.8-x64;centos.7-x64;linux-x64;linux-arm;linux-arm64; - net5.0 + net6.0 3.0.0.0 3.0.0.0 @@ -13,14 +13,14 @@ - - - - - - - - + + + + + + + + diff --git a/src/Ombi/.vscode/settings.json b/src/Ombi/.vscode/settings.json index 89d2dbd93..fd36c353d 100644 --- a/src/Ombi/.vscode/settings.json +++ b/src/Ombi/.vscode/settings.json @@ -10,13 +10,13 @@ "cSpell.words": [ "usermanagement" ], - "discord.enabled": true, "conventionalCommits.scopes": [ "discover", "request-limits", "notifications", "settings", "user-management", - "newsletter" + "newsletter", + "mass-email" ] } diff --git a/src/Ombi/ClientApp/src/app/app.module.ts b/src/Ombi/ClientApp/src/app/app.module.ts index b4e78087c..082ce80d2 100644 --- a/src/Ombi/ClientApp/src/app/app.module.ts +++ b/src/Ombi/ClientApp/src/app/app.module.ts @@ -65,6 +65,9 @@ import { TooltipModule } from "primeng/tooltip"; import { TranslateHttpLoader } from "@ngx-translate/http-loader"; import { UnauthorizedInterceptor } from "./auth/unauthorized.interceptor"; import { environment } from "../environments/environment"; +import { MatPaginatorIntl } from "@angular/material/paginator"; +import { TranslateService } from "@ngx-translate/core"; +import { MatPaginatorI18n } from "./localization/MatPaginatorI18n"; const routes: Routes = [ { path: "*", component: PageNotFoundComponent }, @@ -212,6 +215,10 @@ export function JwtTokenGetter() { useClass: UnauthorizedInterceptor, multi: true }, + { + provide: MatPaginatorIntl, deps: [TranslateService], + useFactory: (translateService: TranslateService) => new MatPaginatorI18n(translateService).getPaginatorIntl() + }, ], bootstrap: [AppComponent], }) diff --git a/src/Ombi/ClientApp/src/app/discover/components/actor/discover-actor.component.html b/src/Ombi/ClientApp/src/app/discover/components/actor/discover-actor.component.html index a7f6a7847..67f243503 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/actor/discover-actor.component.html +++ b/src/Ombi/ClientApp/src/app/discover/components/actor/discover-actor.component.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/Ombi/ClientApp/src/app/discover/components/actor/discover-actor.component.ts b/src/Ombi/ClientApp/src/app/discover/components/actor/discover-actor.component.ts index 8cdb90436..290042d87 100644 --- a/src/Ombi/ClientApp/src/app/discover/components/actor/discover-actor.component.ts +++ b/src/Ombi/ClientApp/src/app/discover/components/actor/discover-actor.component.ts @@ -1,10 +1,12 @@ import { Component } from "@angular/core"; import { ActivatedRoute } from "@angular/router"; import { SearchV2Service } from "../../../services"; -import { IActorCredits } from "../../../interfaces/ISearchTvResultV2"; +import { IActorCredits, IActorCast } from "../../../interfaces/ISearchTvResultV2"; import { IDiscoverCardResult } from "../../interfaces"; import { RequestType } from "../../../interfaces"; import { AuthService } from "../../../auth/auth.service"; +import { forkJoin } from "rxjs"; +import { isEqual } from "lodash"; @Component({ templateUrl: "./discover-actor.component.html", @@ -12,7 +14,6 @@ import { AuthService } from "../../../auth/auth.service"; }) export class DiscoverActorComponent { public actorId: number; - public actorCredits: IActorCredits; public loadingFlag: boolean; public isAdmin: boolean; @@ -24,24 +25,32 @@ export class DiscoverActorComponent { this.route.params.subscribe((params: any) => { this.actorId = params.actorId; this.isAdmin = this.auth.isAdmin(); - this.loading(); - this.searchService.getMoviesByActor(this.actorId).subscribe(res => { - this.actorCredits = res; - this.createModel(); - }); + this.search(); }); } - private createModel() { - this.finishLoading(); + private search() { this.discoverResults = []; - this.actorCredits.cast.forEach(m => { + this.loading(); + + forkJoin([ + this.searchService.getMoviesByActor(this.actorId), + this.searchService.getTvByActor(this.actorId) + ]).subscribe(([movie, tv]) => { + this.pushDiscoverResults(movie.cast, RequestType.movie); + this.pushDiscoverResults(tv.cast, RequestType.tvShow); + this.finishLoading(); + }); + } + + pushDiscoverResults(cast: IActorCast[], type: RequestType) { + cast.forEach(m => { this.discoverResults.push({ available: false, posterPath: m.poster_path ? `https://image.tmdb.org/t/p/w300/${m.poster_path}` : "../../../images/default_movie_poster.png", requested: false, title: m.title, - type: RequestType.movie, + type: type, id: m.id, url: null, rating: 0, diff --git a/src/Ombi/ClientApp/src/app/errors/not-found.component.ts b/src/Ombi/ClientApp/src/app/errors/not-found.component.ts index f102d0449..25269ecd1 100644 --- a/src/Ombi/ClientApp/src/app/errors/not-found.component.ts +++ b/src/Ombi/ClientApp/src/app/errors/not-found.component.ts @@ -1,6 +1,6 @@ import { Component } from "@angular/core"; @Component({ - template: "

Page not found

", + template: "

{{ 'ErrorPages.NotFound' | translate }}

", }) export class PageNotFoundComponent { } diff --git a/src/Ombi/ClientApp/src/app/interfaces/IUser.ts b/src/Ombi/ClientApp/src/app/interfaces/IUser.ts index 2db5a5de2..97882e783 100644 --- a/src/Ombi/ClientApp/src/app/interfaces/IUser.ts +++ b/src/Ombi/ClientApp/src/app/interfaces/IUser.ts @@ -121,6 +121,7 @@ export interface IMassEmailModel { subject: string; body: string; users: IUser[]; + bcc: boolean; } export interface INotificationPreferences { diff --git a/src/Ombi/ClientApp/src/app/issues/components/details/details.component.html b/src/Ombi/ClientApp/src/app/issues/components/details/details.component.html index bc0e8a794..42a84171b 100644 --- a/src/Ombi/ClientApp/src/app/issues/components/details/details.component.html +++ b/src/Ombi/ClientApp/src/app/issues/components/details/details.component.html @@ -1,6 +1,6 @@
-

Issues for {{details.title}}

+

{{ 'Issues.IssuesForTitle' | translate: { title: details.title} }}

{{'Issues.Requested' | translate}} diff --git a/src/Ombi/ClientApp/src/app/localization/MatPaginatorI18n.ts b/src/Ombi/ClientApp/src/app/localization/MatPaginatorI18n.ts new file mode 100644 index 000000000..71a86b7bd --- /dev/null +++ b/src/Ombi/ClientApp/src/app/localization/MatPaginatorI18n.ts @@ -0,0 +1,34 @@ +import { MatPaginatorIntl } from '@angular/material/paginator'; +import { TranslateService } from '@ngx-translate/core'; + +export class MatPaginatorI18n { + + constructor(private translate: TranslateService) { } + + getPaginatorIntl(): MatPaginatorIntl { + const paginatorIntl = new MatPaginatorIntl(); + paginatorIntl.itemsPerPageLabel = this.translate.instant('Paginator.itemsPerPageLabel'); + paginatorIntl.nextPageLabel = this.translate.instant('Paginator.nextPageLabel'); + paginatorIntl.previousPageLabel = this.translate.instant('Paginator.previousPageLabel'); + paginatorIntl.firstPageLabel = this.translate.instant('Paginator.firstPageLabel'); + paginatorIntl.lastPageLabel = this.translate.instant('Paginator.lastPageLabel'); + paginatorIntl.getRangeLabel = this.getRangeLabel.bind(this); + return paginatorIntl; + } + + private getRangeLabel(page: number, pageSize: number, length: number): string { + if (length == 0 || pageSize == 0) { + return this.translate.instant('Paginator.rangePageLabel1', { length }); + } + + length = Math.max(length, 0); + + const startIndex = page * pageSize; + + // If the start index exceeds the list length, do not try and fix the end index to the end. + const endIndex = + startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize; + + return this.translate.instant('Paginator.rangePageLabel2', { startIndex: startIndex + 1, endIndex, length }); + } +} \ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.html b/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.html index 4e088bd69..3cfe6383a 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.html +++ b/src/Ombi/ClientApp/src/app/media-details/components/movie/movie-details.component.html @@ -143,7 +143,7 @@
- Trailers + {{'MediaDetails.Trailers' | translate}} diff --git a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.html b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.html index 1aafc30bf..1fa528159 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.html +++ b/src/Ombi/ClientApp/src/app/media-details/components/movie/panels/movie-information-panel.component.html @@ -104,7 +104,7 @@
- {{'MediaDetails.Genres' | translate }} + {{'MediaDetails.GenresLabel' | translate }}
diff --git a/src/Ombi/ClientApp/src/app/media-details/components/tv/panels/tv-information-panel/tv-information-panel.component.html b/src/Ombi/ClientApp/src/app/media-details/components/tv/panels/tv-information-panel/tv-information-panel.component.html index 9d1d927bd..e0d6a793b 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/tv/panels/tv-information-panel/tv-information-panel.component.html +++ b/src/Ombi/ClientApp/src/app/media-details/components/tv/panels/tv-information-panel/tv-information-panel.component.html @@ -58,7 +58,7 @@
- {{'MediaDetails.Genres' | translate }} + {{'MediaDetails.GenresLabel' | translate }}
@@ -70,7 +70,7 @@
- {{'MediaDetails.Keywords' | translate }}: + {{'MediaDetails.Keywords' | translate }} {{keyword.name}} diff --git a/src/Ombi/ClientApp/src/app/media-details/components/tv/panels/tv-requests/tv-requests-panel.component.html b/src/Ombi/ClientApp/src/app/media-details/components/tv/panels/tv-requests/tv-requests-panel.component.html index 663226aa5..7f29ff2b2 100644 --- a/src/Ombi/ClientApp/src/app/media-details/components/tv/panels/tv-requests/tv-requests-panel.component.html +++ b/src/Ombi/ClientApp/src/app/media-details/components/tv/panels/tv-requests/tv-requests-panel.component.html @@ -5,8 +5,9 @@
{{ request.requestStatus | translate }}
- {{'Requests.RequestedBy' | translate}} '{{request.requestedUser.userAlias}}' on - {{request.requestedDate | amLocal | amUserLocale | amDateFormat: 'LL' }} + {{'Requests.RequestedByOn' | translate: { + user: request.requestedUser.userAlias, + date: request.requestedDate | amLocal | amUserLocale | amDateFormat: 'LL' } }} - {{request.deniedReason}} diff --git a/src/Ombi/ClientApp/src/app/media-details/media-details.component.scss b/src/Ombi/ClientApp/src/app/media-details/media-details.component.scss index 3b9fd4a15..119035062 100644 --- a/src/Ombi/ClientApp/src/app/media-details/media-details.component.scss +++ b/src/Ombi/ClientApp/src/app/media-details/media-details.component.scss @@ -323,8 +323,7 @@ } .media-row .mat-raised-button{ - padding:2px 1.5em;; - width:170px; + padding:2px 1.5em; margin-top:10px; margin-left:10px; } diff --git a/src/Ombi/ClientApp/src/app/requests-list/components/albums-grid/albums-grid.component.html b/src/Ombi/ClientApp/src/app/requests-list/components/albums-grid/albums-grid.component.html index 88d942be2..977b55a17 100644 --- a/src/Ombi/ClientApp/src/app/requests-list/components/albums-grid/albums-grid.component.html +++ b/src/Ombi/ClientApp/src/app/requests-list/components/albums-grid/albums-grid.component.html @@ -60,7 +60,7 @@ - + diff --git a/src/Ombi/ClientApp/src/app/requests-list/components/albums-grid/albums-grid.component.ts b/src/Ombi/ClientApp/src/app/requests-list/components/albums-grid/albums-grid.component.ts index 633ddf1c2..d0529e018 100644 --- a/src/Ombi/ClientApp/src/app/requests-list/components/albums-grid/albums-grid.component.ts +++ b/src/Ombi/ClientApp/src/app/requests-list/components/albums-grid/albums-grid.component.ts @@ -25,6 +25,8 @@ export class AlbumsGridComponent implements OnInit, AfterViewInit { public defaultSort: string = "requestedDate"; public defaultOrder: string = "desc"; public currentFilter: RequestFilterType = RequestFilterType.All; + public manageOwnRequests: boolean; + public userName: string; public RequestFilter = RequestFilterType; @@ -42,10 +44,12 @@ export class AlbumsGridComponent implements OnInit, AfterViewInit { constructor(private requestService: RequestServiceV2, private ref: ChangeDetectorRef, private auth: AuthService, private storageService: StorageService) { + this.userName = auth.claims().name; } public ngOnInit() { this.isAdmin = this.auth.hasRole("admin") || this.auth.hasRole("poweruser"); + this.manageOwnRequests = this.auth.hasRole("ManageOwnRequests") const defaultCount = this.storageService.get(this.storageKeyGridCount); const defaultSort = this.storageService.get(this.storageKey); @@ -117,16 +121,17 @@ export class AlbumsGridComponent implements OnInit, AfterViewInit { public openOptions(request: IAlbumRequest) { const filter = () => { - this.dataSource = this.dataSource.filter((req) => { - return req.id !== request.id; - }) + this.dataSource = this.dataSource.filter((req) => { + return req.id !== request.id; + }); }; const onChange = () => { this.ref.detectChanges(); }; - this.onOpenOptions.emit({ request: request, filter: filter, onChange: onChange }); + const data = { request: request, filter: filter, onChange: onChange, manageOwnRequests: this.manageOwnRequests, isAdmin: this.isAdmin }; + this.onOpenOptions.emit(data); } public switchFilter(type: RequestFilterType) { diff --git a/src/Ombi/ClientApp/src/app/requests-list/components/movies-grid/movies-grid.component.html b/src/Ombi/ClientApp/src/app/requests-list/components/movies-grid/movies-grid.component.html index 0e6e31521..61baa3eaa 100644 --- a/src/Ombi/ClientApp/src/app/requests-list/components/movies-grid/movies-grid.component.html +++ b/src/Ombi/ClientApp/src/app/requests-list/components/movies-grid/movies-grid.component.html @@ -76,7 +76,7 @@ - + diff --git a/src/Ombi/ClientApp/src/app/requests-list/components/movies-grid/movies-grid.component.ts b/src/Ombi/ClientApp/src/app/requests-list/components/movies-grid/movies-grid.component.ts index c033238b1..cad5a6c60 100644 --- a/src/Ombi/ClientApp/src/app/requests-list/components/movies-grid/movies-grid.component.ts +++ b/src/Ombi/ClientApp/src/app/requests-list/components/movies-grid/movies-grid.component.ts @@ -31,6 +31,7 @@ export class MoviesGridComponent implements OnInit, AfterViewInit { public defaultOrder: string = "desc"; public currentFilter: RequestFilterType = RequestFilterType.All; public selection = new SelectionModel(true, []); + public userName: string; public RequestFilter = RequestFilterType; @@ -46,10 +47,11 @@ export class MoviesGridComponent implements OnInit, AfterViewInit { @ViewChild(MatSort) sort: MatSort; constructor(private requestService: RequestServiceV2, private ref: ChangeDetectorRef, - private auth: AuthService, private storageService: StorageService, - private requestServiceV1: RequestService, private notification: NotificationService, - private translateService: TranslateService) { + private auth: AuthService, private storageService: StorageService, + private requestServiceV1: RequestService, private notification: NotificationService, + private translateService: TranslateService) { + this.userName = auth.claims().name; } public ngOnInit() { diff --git a/src/Ombi/ClientApp/src/app/requests-list/components/options/request-options.component.ts b/src/Ombi/ClientApp/src/app/requests-list/components/options/request-options.component.ts index 625efe31c..aa98943ca 100644 --- a/src/Ombi/ClientApp/src/app/requests-list/components/options/request-options.component.ts +++ b/src/Ombi/ClientApp/src/app/requests-list/components/options/request-options.component.ts @@ -1,8 +1,10 @@ import { Component, Inject } from '@angular/core'; import { MAT_BOTTOM_SHEET_DATA, MatBottomSheetRef } from '@angular/material/bottom-sheet'; -import { RequestService } from '../../../services'; -import { RequestType } from '../../../interfaces'; +import { MessageService, RequestService } from '../../../services'; +import { IRequestEngineResult, RequestType } from '../../../interfaces'; import { UpdateType } from '../../models/UpdateType'; +import { TranslateService } from '@ngx-translate/core'; +import { Observable } from 'rxjs'; @Component({ selector: 'request-options', @@ -13,21 +15,31 @@ export class RequestOptionsComponent { public RequestType = RequestType; constructor(@Inject(MAT_BOTTOM_SHEET_DATA) public data: any, - private requestService: RequestService, private bottomSheetRef: MatBottomSheetRef) { } + private requestService: RequestService, + private messageService: MessageService, + private bottomSheetRef: MatBottomSheetRef, + private translate: TranslateService) { } public async delete() { + var request: Observable; if (this.data.type === RequestType.movie) { - await this.requestService.removeMovieRequestAsync(this.data.id); + request = this.requestService.removeMovieRequestAsync(this.data.id); } if (this.data.type === RequestType.tvShow) { - await this.requestService.deleteChild(this.data.id).toPromise(); + request = this.requestService.deleteChild(this.data.id); } if (this.data.type === RequestType.album) { - await this.requestService.removeAlbumRequest(this.data.id).toPromise(); + request = this.requestService.removeAlbumRequest(this.data.id); } - - this.bottomSheetRef.dismiss({type: UpdateType.Delete}); - return; + request.subscribe(result => { + if (result.result) { + this.messageService.send(this.translate.instant("Requests.SuccessfullyDeleted")); + this.bottomSheetRef.dismiss({type: UpdateType.Delete}); + return; + } else { + this.messageService.sendRequestEngineResultError(result); + } + }); } public async approve() { diff --git a/src/Ombi/ClientApp/src/app/requests/movierequests.component.html b/src/Ombi/ClientApp/src/app/requests/movierequests.component.html index 03c932fd8..4e7ad3628 100644 --- a/src/Ombi/ClientApp/src/app/requests/movierequests.component.html +++ b/src/Ombi/ClientApp/src/app/requests/movierequests.component.html @@ -1,6 +1,6 @@
- @@ -28,23 +35,21 @@
- - + +
-
- - -
+
+ Select All +
-
- - -
+
+ {{u.user.userName}} ({{u.user.emailAddress}}) +
- +
diff --git a/src/Ombi/ClientApp/src/app/settings/massemail/massemail.component.ts b/src/Ombi/ClientApp/src/app/settings/massemail/massemail.component.ts index 17beb5405..1ed2fe995 100644 --- a/src/Ombi/ClientApp/src/app/settings/massemail/massemail.component.ts +++ b/src/Ombi/ClientApp/src/app/settings/massemail/massemail.component.ts @@ -12,6 +12,7 @@ export class MassEmailComponent implements OnInit { public users: IMassEmailUserModel[] = []; public message: string; public subject: string; + public bcc: boolean; public missingSubject = false; @@ -26,17 +27,19 @@ export class MassEmailComponent implements OnInit { public ngOnInit(): void { this.identityService.getUsers().subscribe(x => { x.forEach(u => { - this.users.push({ - user: u, - selected: false, - }); + if (u.emailAddress) { + this.users.push({ + user: u, + selected: false, + }); + } }); }); this.settingsService.getEmailSettingsEnabled().subscribe(x => this.emailEnabled = x); } - public selectAllUsers() { - this.users.forEach(u => u.selected = !u.selected); + public selectAllUsers(event: any) { + this.users.forEach(u => u.selected = event.checked); } public send() { @@ -44,10 +47,10 @@ export class MassEmailComponent implements OnInit { this.missingSubject = true; return; } - if(!this.emailEnabled) { - this.notification.error("You have not yet setup your email notifications, do that first!"); - return; - } + // if(!this.emailEnabled) { + // this.notification.error("You have not yet setup your email notifications, do that first!"); + // return; + // } this.missingSubject = false; // Where(x => x.selected).Select(x => x.user) const selectedUsers = this.users.filter(u => { @@ -63,6 +66,7 @@ export class MassEmailComponent implements OnInit { users: selectedUsers, subject: this.subject, body: this.message, + bcc: this.bcc, }; this.notification.info("Sending","Sending mass email... Please wait"); this.notificationMessageService.sendMassEmail(model).subscribe(x => { diff --git a/src/Ombi/ClientApp/src/app/shared/chat-box/chat-box.component.html b/src/Ombi/ClientApp/src/app/shared/chat-box/chat-box.component.html index 201c10a9f..39e87c48b 100644 --- a/src/Ombi/ClientApp/src/app/shared/chat-box/chat-box.component.html +++ b/src/Ombi/ClientApp/src/app/shared/chat-box/chat-box.component.html @@ -1,7 +1,7 @@
-

Users

+

{{ "Issues.UserManagement" | translate }}

{{user}}

@@ -19,7 +19,7 @@
- - + +
\ No newline at end of file diff --git a/src/Ombi/ClientApp/src/app/shared/components/genre-select/genre-select.component.html b/src/Ombi/ClientApp/src/app/shared/components/genre-select/genre-select.component.html index 4e5bf394a..b28f7de02 100644 --- a/src/Ombi/ClientApp/src/app/shared/components/genre-select/genre-select.component.html +++ b/src/Ombi/ClientApp/src/app/shared/components/genre-select/genre-select.component.html @@ -10,7 +10,7 @@ cancel
cancel cancel -

Unsubscribed!

+

{{ 'UserPreferences.Unsubscribed' | translate }}

\ No newline at end of file diff --git a/src/Ombi/Controllers/V1/MusicRequestController.cs b/src/Ombi/Controllers/V1/MusicRequestController.cs index df9d2f406..289c7cca1 100644 --- a/src/Ombi/Controllers/V1/MusicRequestController.cs +++ b/src/Ombi/Controllers/V1/MusicRequestController.cs @@ -113,9 +113,9 @@ namespace Ombi.Controllers.V1 /// [HttpDelete("{requestId:int}")] [Authorize(Roles = "Admin,PowerUser,ManageOwnRequests")] - public async Task DeleteRequest(int requestId) + public async Task DeleteRequest(int requestId) { - await _engine.RemoveAlbumRequest(requestId); + return await _engine.RemoveAlbumRequest(requestId); } /// diff --git a/src/Ombi/Controllers/V1/RequestController.cs b/src/Ombi/Controllers/V1/RequestController.cs index 961969b6f..cc686b506 100644 --- a/src/Ombi/Controllers/V1/RequestController.cs +++ b/src/Ombi/Controllers/V1/RequestController.cs @@ -128,9 +128,9 @@ namespace Ombi.Controllers.V1 /// [HttpDelete("movie/{requestId:int}")] [Authorize(Roles = "Admin,PowerUser,ManageOwnRequests")] - public async Task DeleteRequest(int requestId) + public async Task DeleteRequest(int requestId) { - await MovieRequestEngine.RemoveMovieRequest(requestId); + return await MovieRequestEngine.RemoveMovieRequest(requestId); } /// @@ -324,7 +324,7 @@ namespace Ombi.Controllers.V1 /// The request identifier. /// [HttpDelete("tv/{requestId:int}")] - [Authorize(Roles = "Admin,PowerUser,ManageOwnRequests")] + [Authorize(Roles = "Admin,PowerUser")] public async Task DeleteTvRequest(int requestId) { await TvRequestEngine.RemoveTvRequest(requestId); @@ -437,10 +437,9 @@ namespace Ombi.Controllers.V1 /// [Authorize(Roles = "Admin,PowerUser,ManageOwnRequests")] [HttpDelete("tv/child/{requestId:int}")] - public async Task DeleteChildRequest(int requestId) + public async Task DeleteChildRequest(int requestId) { - await TvRequestEngine.RemoveTvChild(requestId); - return true; + return await TvRequestEngine.RemoveTvChild(requestId); } diff --git a/src/Ombi/Controllers/V2/SearchController.cs b/src/Ombi/Controllers/V2/SearchController.cs index 0b58244b3..ac5905c33 100644 --- a/src/Ombi/Controllers/V2/SearchController.cs +++ b/src/Ombi/Controllers/V2/SearchController.cs @@ -52,7 +52,7 @@ namespace Ombi.Controllers.V2 [HttpPost("multi/{searchTerm}")] public async Task> MultiSearch(string searchTerm, [FromBody] MultiSearchFilter filter) { - return await _multiSearchEngine.MultiSearch(searchTerm, filter, Request.HttpContext.RequestAborted); + return await _multiSearchEngine.MultiSearch(Uri.UnescapeDataString(searchTerm), filter, Request.HttpContext.RequestAborted); } /// @@ -395,6 +395,19 @@ namespace Ombi.Controllers.V2 { return await _movieEngineV2.GetMoviesByActor(actorId, null); } + + /// + /// Returns all the tv shows that is by the actor id + /// + /// TheMovieDb Actor ID + /// + [HttpGet("actor/{actorId}/tv")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesDefaultResponseType] + public async Task GetTvByActor(int actorId) + { + return await _tvEngineV2.GetTvByActor(actorId, null); + } [HttpGet("artist/{artistId}")] diff --git a/src/Ombi/Extensions/DatabaseExtensions.cs b/src/Ombi/Extensions/DatabaseExtensions.cs index 70bd8c70e..a96011f1c 100644 --- a/src/Ombi/Extensions/DatabaseExtensions.cs +++ b/src/Ombi/Extensions/DatabaseExtensions.cs @@ -120,9 +120,9 @@ namespace Ombi.Extensions public static void ConfigureMySql(DbContextOptionsBuilder options, PerDatabaseConfiguration config) { - options.UseMySql(config.ConnectionString, b => + options.UseMySql(config.ConnectionString, ServerVersion.AutoDetect(config.ConnectionString), b => { - b.CharSetBehavior(Pomelo.EntityFrameworkCore.MySql.Infrastructure.CharSetBehavior.NeverAppend); + //b.CharSetBehavior(Pomelo.EntityFrameworkCore.MySql.Infrastructure.CharSetBehavior.NeverAppend); // ##ISSUE, link to migrations? b.EnableRetryOnFailure(); }); } diff --git a/src/Ombi/Ombi.csproj b/src/Ombi/Ombi.csproj index 063dc65db..1f10c1058 100644 --- a/src/Ombi/Ombi.csproj +++ b/src/Ombi/Ombi.csproj @@ -1,6 +1,6 @@  - net5.0 + net6.0 win10-x64;win10-x86;osx-x64;linux-x64;linux-arm;linux-arm64; false Latest @@ -62,27 +62,27 @@ - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + - - + + - + - - + + diff --git a/src/Ombi/Program.cs b/src/Ombi/Program.cs index 7f7a875d1..ff7723703 100644 --- a/src/Ombi/Program.cs +++ b/src/Ombi/Program.cs @@ -68,7 +68,9 @@ namespace Ombi var services = new ServiceCollection(); services.ConfigureDatabases(null); +#pragma warning disable ASP0000 // Do not call 'IServiceCollection.BuildServiceProvider' in 'ConfigureServices' using var provider = services.BuildServiceProvider(); +#pragma warning restore ASP0000 // Do not call 'IServiceCollection.BuildServiceProvider' in 'ConfigureServices' var settingsDb = provider.GetRequiredService(); var ombiDb = provider.GetRequiredService(); diff --git a/src/Ombi/Startup.cs b/src/Ombi/Startup.cs index 95fd6447f..a37c1d230 100644 --- a/src/Ombi/Startup.cs +++ b/src/Ombi/Startup.cs @@ -109,7 +109,7 @@ namespace Ombi .AllowCredentials(); })); - services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest); + services.AddMvc(); services.AddSignalR(); services.AddSpaStaticFiles(configuration => configuration.RootPath = "ClientApp/dist"); diff --git a/src/Ombi/wwwroot/translations/bg.json b/src/Ombi/wwwroot/translations/bg.json index 01a16bcce..8b48635d6 100644 --- a/src/Ombi/wwwroot/translations/bg.json +++ b/src/Ombi/wwwroot/translations/bg.json @@ -55,6 +55,9 @@ "OfflineParagraph": "Медийният сървър в момента е извън линия.", "CheckPageForUpdates": "Проверете тази страница за последни новини на сайта." }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Открийте", "Search": "Търсене", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Избраните елементи са одобрени успешно" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Проблеми", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Нерешени проблеми", "InProgressTitle": "Проблеми в процес на изпълнение", "ResolvedTitle": "Решени проблеми", @@ -255,6 +263,7 @@ "Delete": "Изтриване на проблем", "DeletedIssue": "Проблемът е изтрит", "Chat": "Чат", + "EnterYourMessage": "Enter Your Message", "Requested": "Заявено", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Отказано", + "Trailers": "Trailers", "RecommendationsTitle": "Препоръчани", "SimilarTitle": "Подобни", "VideosTitle": "Видеоклипове", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Моля, изберете потребител", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Повтаряне на заявка", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/da.json b/src/Ombi/wwwroot/translations/da.json index 6515ab2d7..ddd151c11 100644 --- a/src/Ombi/wwwroot/translations/da.json +++ b/src/Ombi/wwwroot/translations/da.json @@ -55,6 +55,9 @@ "OfflineParagraph": "Medieserveren er offline.", "CheckPageForUpdates": "Tjek denne side for løbende opdateringer." }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Discover", "Search": "Søg", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Problemer", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Afventende problemer", "InProgressTitle": "Igangværende probemer", "ResolvedTitle": "Løste problemer", @@ -255,6 +263,7 @@ "Delete": "Delete issue", "DeletedIssue": "Issue has been deleted", "Chat": "Chat", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Afvist", + "Trailers": "Trailers", "RecommendationsTitle": "Recommendations", "SimilarTitle": "Lignende", "VideosTitle": "Videos", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/de.json b/src/Ombi/wwwroot/translations/de.json index ce334e480..07a4f00cb 100644 --- a/src/Ombi/wwwroot/translations/de.json +++ b/src/Ombi/wwwroot/translations/de.json @@ -55,6 +55,9 @@ "OfflineParagraph": "Der Mediaserver ist derzeit offline.", "CheckPageForUpdates": "Überprüfe diese Seite für kontinuierliche Website-Updates." }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Entdecken", "Search": "Suche", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Probleme", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Ausstehende Probleme", "InProgressTitle": "Probleme in bearbeitung", "ResolvedTitle": "Behobene Probleme", @@ -255,6 +263,7 @@ "Delete": "Delete issue", "DeletedIssue": "Issue has been deleted", "Chat": "Chat", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Abgelehnt", + "Trailers": "Trailers", "RecommendationsTitle": "Empfehlungen", "SimilarTitle": "Ähnliche", "VideosTitle": "Videos", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/en.json b/src/Ombi/wwwroot/translations/en.json index 73cff9ace..201950163 100644 --- a/src/Ombi/wwwroot/translations/en.json +++ b/src/Ombi/wwwroot/translations/en.json @@ -55,6 +55,9 @@ "OfflineParagraph": "The media server is currently offline.", "CheckPageForUpdates": "Check this page for continuous site updates." }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Discover", "Search": "Search", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Issues", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Pending Issues", "InProgressTitle": "In Progress Issues", "ResolvedTitle": "Resolved Issues", @@ -255,6 +263,7 @@ "Delete": "Delete issue", "DeletedIssue": "Issue has been deleted", "Chat":"Chat", + "EnterYourMessage":"Enter Your Message", "Requested":"Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Denied", + "Trailers": "Trailers", "RecommendationsTitle": "Recommendations", "SimilarTitle": "Similar", "VideosTitle": "Videos", @@ -317,7 +327,8 @@ "RootFolderOverride":"Root Folder Override:", "QualityOverride":"Quality Override:", "Network":"Network:", - "Genres":"Genres:", + "GenresLabel":"Genres:", + "Genres":"Genres", "FirstAired":"First Aired:", "TheatricalRelease":"Release:", "DigitalRelease":"Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,6 +417,15 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/es.json b/src/Ombi/wwwroot/translations/es.json index 0a61ca8af..8f36043e7 100644 --- a/src/Ombi/wwwroot/translations/es.json +++ b/src/Ombi/wwwroot/translations/es.json @@ -55,6 +55,9 @@ "OfflineParagraph": "El servidor de medios está fuera de línea.", "CheckPageForUpdates": "Consulta esta página para ver las últimas novedades." }, + "ErrorPages": { + "NotFound": "Página no encontrada" + }, "NavigationBar": { "Discover": "Descubre", "Search": "Buscar", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Por favor, elija el tipo de medio que está buscando:", "YearOfRelease": "Año de lanzamiento", + "SearchGenre": "Buscar por género", + "SearchKeyword": "Buscar palabra clave", + "SearchProvider": "Proveedor de búsqueda", "KeywordSearchingDisclaimer": "Por favor, ten en cuenta que la búsqueda de palabras clave es poco confiable debido a la inconsistencia en la base de datos de TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Los elementos seleccionados ha sido aprobados correctamente" }, "SuccessfullyApproved": "Se ha aprobado con éxito", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "La solicitud está disponible", "NowUnavailable": "La solicitud no está disponible", "SuccessfullyReprocessed": "La solicitud ha sido procesada correctamente", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Problemas", + "IssuesForTitle": "Problemas de {{title}}", "PendingTitle": "Problemas pendientes", "InProgressTitle": "Problemas en curso", "ResolvedTitle": "Problemas resueltos", @@ -255,6 +263,7 @@ "Delete": "Borrar problema", "DeletedIssue": "El problema ha sido borrado", "Chat": "Chat", + "EnterYourMessage": "Ingrese Su Mensaje", "Requested": "Solicitado", "UserOnDate": "{{user}} en {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Denegado", + "Trailers": "Trailer", "RecommendationsTitle": "Recomendaciones", "SimilarTitle": "Similar", "VideosTitle": "Vídeos", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Géneros:", + "Genres": "Géneros", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Solicitado por {{user}} el {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "No suscrito!" }, "UserTypeLabel": { "1": "Usuario local", @@ -404,5 +417,14 @@ "3": "Usuario de Emby", "4": "Emby Connect User", "5": "Usuario de Jellyfin" + }, + "Paginator": { + "itemsPerPageLabel": "Elementos por página:", + "nextPageLabel": "Página siguiente", + "previousPageLabel": "Página anterior", + "firstPageLabel": "Primera página", + "lastPageLabel": "Última página", + "rangePageLabel1": "0 de {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} de {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/fr.json b/src/Ombi/wwwroot/translations/fr.json index e3f6ba8bb..16aafcec3 100644 --- a/src/Ombi/wwwroot/translations/fr.json +++ b/src/Ombi/wwwroot/translations/fr.json @@ -4,8 +4,8 @@ "UsernamePlaceholder": "Nom d’utilisateur", "PasswordPlaceholder": "Mot de passe", "RememberMe": "Se souvenir de moi", - "SignInWith": "Se Connecter avec {{appName}}", - "SignInWithPlex": "Se Connecter avec Plex", + "SignInWith": "Se connecter avec {{appName}}", + "SignInWithPlex": "Se connecter avec Plex", "ForgottenPassword": "Mot de passe oublié ?", "Errors": { "IncorrectCredentials": "Nom d'utilisateur ou mot de passe incorrect" @@ -31,7 +31,7 @@ "PartlyAvailable": "Partiellement disponible", "ViewDetails": "Voir les détails", "Errors": { - "Validation": "Veuillez vérifier les valeurs entrées" + "Validation": "Veuillez vérifier les valeurs saisies" }, "Cancel": "Annuler", "Submit": "Envoyer", @@ -55,6 +55,9 @@ "OfflineParagraph": "Le serveur média est actuellement hors-ligne.", "CheckPageForUpdates": "Consultez cette page pour voir les mises à jour du site." }, + "ErrorPages": { + "NotFound": "Page non trouvée" + }, "NavigationBar": { "Discover": "Découvrir", "Search": "Rechercher", @@ -62,14 +65,14 @@ "UserManagement": "Utilisateurs", "Issues": "Problèmes", "Vote": "Vote", - "Donate": "Faire un don !", + "Donate": "Faire un don", "DonateLibraryMaintainer": "Faire un don au mainteneur de la bibliothèque", "DonateTooltip": "C’est pour convaincre ma femme de me laisser passer mon temps libre à développer Ombi 😁", "UpdateAvailableTooltip": "Mise à jour disponible !", "Settings": "Paramètres", "Welcome": "Bienvenue {{username}}", "UpdateDetails": "Mettre à jour les informations", - "Logout": "Déconnexion", + "Logout": "Se déconnecter", "OpenMobileApp": "Ouvrir l'application", "RecentlyAdded": "Ajouts récents", "ChangeTheme": "Changer de thème", @@ -89,7 +92,7 @@ }, "Search": { "Title": "Rechercher", - "Paragraph": "Vous voulez regarder quelque chose qui n'est pas disponible actuellement ? Pas de problème, recherchez-le ci-dessous et demandez-le !", + "Paragraph": "Vous voulez regarder quelque chose qui n'est pas disponible actuellement ? Pas de problème, recherchez-le en bas et demandez-le !", "MoviesTab": "Films", "TvTab": "Séries", "MusicTab": "Musique", @@ -118,9 +121,9 @@ "Popular": "Populaire", "Trending": "Tendances", "MostWatched": "Les plus visionnées", - "MostAnticipated": "Les plus attendus", + "MostAnticipated": "Les plus attendues", "Results": "Résultats", - "AirDate": "Date de diffusion:", + "AirDate": "Date de diffusion :", "AllSeasons": "Toutes les saisons", "FirstSeason": "Première saison", "LatestSeason": "Dernière saison", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Veuillez choisir le type de média que vous recherchez :", "YearOfRelease": "Année de sortie", + "SearchGenre": "Rechercher un genre", + "SearchKeyword": "Rechercher un mot-clé", + "SearchProvider": "Rechercher un fournisseur", "KeywordSearchingDisclaimer": "Veuillez noter que la recherche de mots-clés n'est pas très fiable en raison de données incohérentes dans TheMovieDb" }, "Requests": { @@ -145,17 +151,17 @@ "Status": "Statut", "RequestStatus": "Statut de la demande", "Denied": " Refusé :", - "TheatricalRelease": "Sortie en salle: {{date}}", + "TheatricalRelease": "Sortie en salle : {{date}}", "ReleaseDate": "Sortie : {{date}}", "TheatricalReleaseSort": "Sortie en salle", - "DigitalRelease": "Sortie numérique: {{date}}", + "DigitalRelease": "Sortie numérique : {{date}}", "RequestDate": "Date de la demande", "QualityOverride": "Remplacement de la qualité :", "RootFolderOverride": "Remplacement du répertoire racine :", "ChangeRootFolder": "Répertoire racine", "ChangeQualityProfile": "Profil de qualité", - "MarkUnavailable": "Marquer comme non disponible", - "MarkAvailable": "Marquer comme disponible", + "MarkUnavailable": "Marquer indisponible", + "MarkAvailable": "Marquer disponible", "Remove": "Supprimer", "Deny": "Refuser", "DenyReason": "Motif de refus", @@ -198,6 +204,7 @@ "Approved": "Éléments sélectionnés approuvés avec succès" }, "SuccessfullyApproved": "Approuvée avec succès", + "SuccessfullyDeleted": "Demande supprimée avec succès", "NowAvailable": "La demande est maintenant disponible", "NowUnavailable": "La demande est maintenant indisponible", "SuccessfullyReprocessed": "La demande a été retraitée avec succès", @@ -215,14 +222,15 @@ "ChildRequestDoesNotExist": "La demande enfant n'existe pas", "NoPermissionsRequestMovie": "Vous n'avez pas la permission de demander un film", "NoPermissionsRequestTV": "Vous n'avez pas la permission de demander une série TV", - "NoPermissionsRequestAlbum": "Vous n'avez pas la permission de demander un album", - "MovieRequestQuotaExceeded": "Vous avez dépassé votre quota de demande de films !", - "TvRequestQuotaExceeded": "Vous avez dépassé votre quota de demande d'épisodes !", - "AlbumRequestQuotaExceeded": "Vous avez dépassé votre quota de demande d'albums !" + "NoPermissionsRequestAlbum": "Vous n'avez pas le droit de demander un album", + "MovieRequestQuotaExceeded": "Vous avez dépassé votre quota de demandes de films !", + "TvRequestQuotaExceeded": "Vous avez dépassé votre quota de demandes d'épisodes !", + "AlbumRequestQuotaExceeded": "Vous avez dépassé votre quota de demandes d'albums !" } }, "Issues": { "Title": "Problèmes", + "IssuesForTitle": "Problèmes pour {{title}}", "PendingTitle": "Problèmes en attente", "InProgressTitle": "Problèmes en cours", "ResolvedTitle": "Problèmes résolus", @@ -236,7 +244,7 @@ "MarkInProgress": "Marquer en cours de traitement", "MarkResolved": "Marquer comme résolu", "SendMessageButton": "Envoyer", - "Subject": "Sujet", + "Subject": "Objet", "Comments": "Commentaires", "WriteMessagePlaceholder": "Écrivez votre message ici...", "ReportedBy": "Signalé par", @@ -255,6 +263,7 @@ "Delete": "Supprimer le problème", "DeletedIssue": "Problème supprimé", "Chat": "Discuter", + "EnterYourMessage": "Saisissez votre message", "Requested": "Demandé", "UserOnDate": "{{user}} le {{date}}" }, @@ -268,9 +277,9 @@ "Keywords": "Mots-clés" }, "UserManagment": { - "TvRemaining": "Séries : {{remaining}}/{{total}} restant(s)", - "MovieRemaining": "Films : {{remaining}}/{{total}} restant(s)", - "MusicRemaining": "Musique : {{remaining}}/{{total}} restant(s)", + "TvRemaining": "Séries : {{remaining}}/{{total}} restante(s)", + "MovieRemaining": "Films : {{remaining}}/{{total}} restante(s)", + "MusicRemaining": "Musique : {{remaining}}/{{total}} restante(s)", "TvDue": "Séries : {{date}}", "MovieDue": "Film : {{date}}", "MusicDue": "Musique : {{date}}" @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Refusé", + "Trailers": "Bandes-annonces", "RecommendationsTitle": "Recommandations", "SimilarTitle": "Similaires", "VideosTitle": "Vidéos", @@ -317,7 +327,8 @@ "RootFolderOverride": "Remplacement du répertoire racine :", "QualityOverride": "Remplacement de la qualité :", "Network": "Diffuseur :", - "Genres": "Genres :", + "GenresLabel": "Genres :", + "Genres": "Genres", "FirstAired": "Première diffusion :", "TheatricalRelease": "Sortie :", "DigitalRelease": "Sortie numérique :", @@ -326,7 +337,7 @@ "Minutes": "{{runtime}} Minutes", "Revenue": "Recettes :", "Budget": "Budget :", - "Keywords": "Mots-clés / Tags :", + "Keywords": "Mots-clés/Tags :", "Casts": { "CastTitle": "Casting" }, @@ -343,6 +354,7 @@ "PleaseSelectUser": "Veuillez sélectionner un utilisateur", "StreamingOn": "En streaming sur :", "RequestedBy": "Demandé par :", + "RequestedByOn": "Demandé par {{user}} le {{date}}", "RequestDate": "Date de la demande :", "DeniedReason": "Motif de refus :", "ReProcessRequest": "Refaire une demande", @@ -367,23 +379,23 @@ "Studio": "Studio", "Network": "Diffuseur", "UnknownNetwork": "Inconnu", - "RequestStatus": "Statut de la Demande", + "RequestStatus": "Statut de la demande", "Director": "Réalisateur", - "InCinemas": "En Salles", - "FirstAired": "Première Diffusion", + "InCinemas": "En salles", + "FirstAired": "Première diffusion", "Writer": "Scénariste", - "ExecProducer": "Producteur Exécutif" + "ExecProducer": "Producteur exécutif" }, "NoSearch": "Désolé, rien ne correspond à votre recherche !" }, "UserPreferences": { "Welcome": "Bienvenue {{username}} !", "OmbiLanguage": "Langue", - "DarkMode": "Mode Sombre", + "DarkMode": "Mode sombre", "Updated": "Mise à jour réussie", "StreamingCountry": "Pays de diffusion", - "StreamingCountryDescription": "C'est le code du pays pour lequel nous afficherons des informations de diffusion. Si vous êtes en France, veuillez sélectionner la France et vous aurez des informations de streaming en relation avec la France.", - "LanguageDescription": "C'est la langue dans laquelle vous souhaitez que l'interface Ombi soit affichée.", + "StreamingCountryDescription": "C'est le code du pays dont nous afficherons les informations de diffusion. Si vous êtes en France, veuillez sélectionner la France et vous aurez des informations de streaming pour la France.", + "LanguageDescription": "C'est la langue dans laquelle vous souhaitez que le site d'Ombi soit affichée.", "MobileQRCode": "QR Code mobile", "LegacyApp": "Lancer l'ancienne application", "NoQrCode": "Veuillez contacter votre administrateur pour activer les QR codes", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "Confirmation du nouveau mot de passe", "Security": "Sécurité", "Profile": "Profil", - "UpdatedYourInformation": "Informations mises à jour" + "UpdatedYourInformation": "Informations mises à jour", + "Unsubscribed": "Désabonné !" }, "UserTypeLabel": { "1": "Utilisateur local", @@ -404,5 +417,14 @@ "3": "Utilisateur Emby", "4": "Utilisateur Emby Connect", "5": "Utilisateur Jellyfin" + }, + "Paginator": { + "itemsPerPageLabel": "Éléments par page :", + "nextPageLabel": "Page suivante", + "previousPageLabel": "Page précédente", + "firstPageLabel": "Première page", + "lastPageLabel": "Dernière page", + "rangePageLabel1": "0 sur {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} sur {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/hu.json b/src/Ombi/wwwroot/translations/hu.json index bdde3f7e0..b3ecc2de7 100644 --- a/src/Ombi/wwwroot/translations/hu.json +++ b/src/Ombi/wwwroot/translations/hu.json @@ -55,6 +55,9 @@ "OfflineParagraph": "A médiaszerver jelenleg nem elérhető.", "CheckPageForUpdates": "Látogasd meg ezt az oldalt a frissítésekhez." }, + "ErrorPages": { + "NotFound": "Az oldal nem található" + }, "NavigationBar": { "Discover": "Felfedezés", "Search": "Keresés", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Kérlek válaszd ki, milyen típusú médiát keresel:", "YearOfRelease": "Megjelenés éve", + "SearchGenre": "Műfaj keresése", + "SearchKeyword": "Keresés kulcsszóra", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "A kijelölt elemek jóváhagyásra kerultek" }, "SuccessfullyApproved": "Sikeresen jóváhagyva", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Kérés elérhető", "NowUnavailable": "Kérés nem elérhető", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Problémák", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Várakozó problémák", "InProgressTitle": "Folyamatban lévő problémák", "ResolvedTitle": "Megoldott problémák", @@ -255,6 +263,7 @@ "Delete": "Delete issue", "DeletedIssue": "Issue has been deleted", "Chat": "Csevegő", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Megtagadva", + "Trailers": "Trailers", "RecommendationsTitle": "Recommendations", "SimilarTitle": "Hasonló", "VideosTitle": "Videók", @@ -317,7 +327,8 @@ "RootFolderOverride": "Gyökér mappa felülírása:", "QualityOverride": "Minőség felülírása:", "Network": "Hálózat:", - "Genres": "Műfaj:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "Első sugárzás ideje:", "TheatricalRelease": "Kiadás:", "DigitalRelease": "Digitális megjelenés:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Válassz egy felhasználót", "StreamingOn": "Streaming On:", "RequestedBy": "Kérte:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Kérés ideje:", "DeniedReason": "Elutasítás oka:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "Új jelszó megerősítése", "Security": "Security", "Profile": "Profil", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Helyi felhasználó", @@ -404,5 +417,14 @@ "3": "Emby felhasználó", "4": "Emby Connect User", "5": "Jellyfin felhasználó" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/it.json b/src/Ombi/wwwroot/translations/it.json index 74feb48a0..2dff8cb3e 100644 --- a/src/Ombi/wwwroot/translations/it.json +++ b/src/Ombi/wwwroot/translations/it.json @@ -14,8 +14,8 @@ "Common": { "ContinueButton": "Continua", "Available": "Disponibile", - "Approved": "Approved", - "Pending": "Pending", + "Approved": "Approvato", + "Pending": "In Sospeso", "PartiallyAvailable": "Parzialmente disponibile", "Monitored": "Monitorato", "NotAvailable": "Non disponibile", @@ -24,7 +24,7 @@ "RequestDenied": "Richiesta negata", "NotRequested": "Non richiesta", "Requested": "Richiesta", - "Search": "Search", + "Search": "Cerca", "Request": "Richiesta", "Denied": "Negata", "Approve": "Approva", @@ -35,9 +35,9 @@ }, "Cancel": "Annulla", "Submit": "Invia", - "Update": "Update", - "tvShow": "TV Show", - "movie": "Movie", + "Update": "Aggiorna", + "tvShow": "Serie TV", + "movie": "Film", "album": "Album" }, "PasswordReset": { @@ -55,6 +55,9 @@ "OfflineParagraph": "Il server dei media è attualmente offline.", "CheckPageForUpdates": "Controlla questa pagina per aggiornamenti continui del sito." }, + "ErrorPages": { + "NotFound": "Pagina non trovata" + }, "NavigationBar": { "Discover": "Scopri", "Search": "Cerca", @@ -93,15 +96,15 @@ "MoviesTab": "Film", "TvTab": "Serie TV", "MusicTab": "Musica", - "AdvancedSearch": "You can fill in any of the below to discover new media. All of the results are sorted by popularity", - "AdvancedSearchHeader": "Advanced Search", + "AdvancedSearch": "Puoi compilare uno dei seguenti per scoprire nuovi media. Tutti i risultati sono ordinati per popolarità", + "AdvancedSearchHeader": "Ricerca Avanzata", "Suggestions": "Suggerimenti", "NoResults": "Spiacenti, non abbiamo trovato nulla!", "DigitalDate": "Uscita in digitale: {{date}}", "TheatricalRelease": "Uscita nei cinema: {{date}}", "ViewOnPlex": "Guarda su Plex", "ViewOnEmby": "Guarda su Emby", - "ViewOnJellyfin": "Play On Jellyfin", + "ViewOnJellyfin": "Riproduci Su Jellyfin", "RequestAdded": "La richiesta per {{title}} è stata aggiunta con successo", "Similar": "Simili", "Refine": "Affina", @@ -129,9 +132,12 @@ "Season": "Stagione {{seasonNumber}}", "SelectAllInSeason": "Seleziona tutto nella stagione {{seasonNumber}}" }, - "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", - "YearOfRelease": "Year of Release", - "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" + "AdvancedSearchInstructions": "Sei pregato di scegliere che tipo di media stai cercando:", + "YearOfRelease": "Anno di Rilascio", + "SearchGenre": "Cerca per genere", + "SearchKeyword": "Termini di ricerca", + "SearchProvider": "Provider di ricerca", + "KeywordSearchingDisclaimer": "Sei pregato di notare che la Ricerca per Parola chiave è molto a fortuna a causa di dati non coerenti nel TheMovieDb" }, "Requests": { "Title": "Richieste", @@ -159,7 +165,7 @@ "Remove": "Rimuovi", "Deny": "Nega", "DenyReason": "Nega Motivo", - "DeniedReason": "Denied Reason", + "DeniedReason": "Motivo di Negazione", "Season": "Stagione", "GridTitle": "Titolo", "AirDate": "Data di trasmissione", @@ -194,40 +200,42 @@ "Delete": "Elimina Richiesta", "Approve": "Approva Richiesta", "ChangeAvailability": "Segna come Disponibile", - "Deleted": "Successfully deleted selected items", - "Approved": "Successfully approved selected items" + "Deleted": "Elementi selezionati eliminati correttamente", + "Approved": "Elementi selezionati approvati correttamente" }, - "SuccessfullyApproved": "Successfully Approved", - "NowAvailable": "Request is now available", - "NowUnavailable": "Request is now unavailable", - "SuccessfullyReprocessed": "Successfully Re-processed the request", - "DeniedRequest": "Denied Request", - "RequestCollection": "Request Collection", - "CollectionSuccesfullyAdded": "The collection {{name}} has been successfully added!", - "NeedToSelectEpisodes": "You need to select some episodes!", - "RequestAddedSuccessfully": "Request for {{title}} has been added successfully", + "SuccessfullyApproved": "Approvato Correttamente", + "SuccessfullyDeleted": "Richiesta eliminata correttamente", + "NowAvailable": "Richiesta ora disponibile", + "NowUnavailable": "Richiesta ora non disponibile", + "SuccessfullyReprocessed": "Richiesta ri-elaborata correttamente", + "DeniedRequest": "Richiesta Negata", + "RequestCollection": "Richiedi Raccolta", + "CollectionSuccesfullyAdded": "La raccolta {{name}} è stata aggiunta correttamente!", + "NeedToSelectEpisodes": "Devi selezionare degli episodi!", + "RequestAddedSuccessfully": "La richiesta per {{title}} è stata aggiunta correttamente", "ErrorCodes": { - "AlreadyRequested": "This has already been requested", - "EpisodesAlreadyRequested": "We already have episodes requested from this series", - "NoPermissionsOnBehalf": "You do not have the correct permissions to request on behalf of users!", - "NoPermissions": "You do not have the correct permissions!", - "RequestDoesNotExist": "Request does not exist", - "ChildRequestDoesNotExist": "Child Request does not exist", - "NoPermissionsRequestMovie": "You do not have permissions to Request a Movie", - "NoPermissionsRequestTV": "You do not have permissions to Request a TV Show", - "NoPermissionsRequestAlbum": "You do not have permissions to Request an Album", - "MovieRequestQuotaExceeded": "You have exceeded your Movie request quota!", - "TvRequestQuotaExceeded": "You have exceeded your Episode request quota!", - "AlbumRequestQuotaExceeded": "You have exceeded your Album request quota!" + "AlreadyRequested": "Questo è già stato richiesto", + "EpisodesAlreadyRequested": "Abbiamo già degli episodi richiesti da questa serie", + "NoPermissionsOnBehalf": "Non hai le autorizzazioni corrette per richiedere per conto degli utenti!", + "NoPermissions": "Non hai le autorizzazioni corrette!", + "RequestDoesNotExist": "La richiesta non esiste", + "ChildRequestDoesNotExist": "La Richiesta per Bambini non esiste", + "NoPermissionsRequestMovie": "Non hai le autorizzazioni per Richiedere un Film", + "NoPermissionsRequestTV": "Non hai le autorizzazioni per Richiedere una Serie TV", + "NoPermissionsRequestAlbum": "Non hai le autorizzazioni per Richiedere un Album", + "MovieRequestQuotaExceeded": "Hai superato la tua quota di richieste di Film!", + "TvRequestQuotaExceeded": "Hai superato la tua quota di richieste di Episodi!", + "AlbumRequestQuotaExceeded": "Hai superato la tua quota di richieste di Album!" } }, "Issues": { "Title": "Problemi", + "IssuesForTitle": "Problemi per {{title}}", "PendingTitle": "Problemi In Attesa", "InProgressTitle": "Problemi In Corso", "ResolvedTitle": "Problemi Risolti", "ColumnTitle": "Titolo", - "Count": "Count", + "Count": "Conteggio", "Category": "Categoria", "Status": "Stato", "Details": "Dettagli", @@ -255,8 +263,9 @@ "Delete": "Elimina problema", "DeletedIssue": "Il problema è stato eliminato", "Chat": "Chat", - "Requested": "Requested", - "UserOnDate": "{{user}} on {{date}}" + "EnterYourMessage": "Scrivi qualcosa...", + "Requested": "Richiesto", + "UserOnDate": "{{user}} il {{date}}" }, "Filter": { "ClearFilter": "Rimuovi filtro", @@ -265,7 +274,7 @@ "Approved": "Approvato", "PendingApproval": "In attesa di approvazione", "WatchProviders": "Watch Providers", - "Keywords": "Keywords" + "Keywords": "Parole Chiave" }, "UserManagment": { "TvRemaining": "TV: {{remaining}}/{{total}} rimanenti", @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Rifiutato", + "Trailers": "Trailer", "RecommendationsTitle": "Raccomandazioni", "SimilarTitle": "Simili", "VideosTitle": "Video", @@ -291,42 +301,43 @@ "ViewCollection": "Visualizza Raccolta", "NotEnoughInfo": "Sfortunatamente ancora non ci sono abbastanza informazioni su questo show!", "AdvancedOptions": "Opzioni Avanzate", - "AutoApproveOptions": "You can configure the request here, once requested it will be send to your DVR application and will be auto approved! Please note, this is optional, just press Request to skip!", - "AutoApproveOptionsTv": "You can configure the request here, once requested it will be send to your DVR application and will be auto approved! If the request is already in Sonarr, we will not change the root folder or quality profile if you set it! Please note, this is optional, just press Request to skip!", - "AutoApproveOptionsTvShort": "You can configure the request here, once requested it will be send to your DVR application! If the request is already in Sonarr, we will not change the root folder or quality profile if you set it! Please note, this is optional, just press Request to skip!", + "AutoApproveOptions": "Puoi configurare qui la richiesta, una volta effettuata, sarà inviata alla tua applicazione DVR e sarà approvata automaticamente! Sei pregato di notare che, è facoltativo, basta premere Richiedi per saltare!", + "AutoApproveOptionsTv": "Puoi configurare qui la richiesta, una volta effettuata, sarà inviata alla tua applicazione DVR e sarà approvata automaticamente! Se la richiesta è già su Sonarr, non modificheremo la cartella di root o il profilo di qualità se la imposti! Sei pregato di notare che, è opzionale, basta premere Richiedi per saltare!", + "AutoApproveOptionsTvShort": "Puoi configurare qui la richiesta, una volta effettuata, sarà inviata alla tua applicazione DVR! Se la richiesta è già su Sonarr, non modificheremo la cartella di root o il profilo di qualità se la imposti! Sei pregato di notare che, è opzionale, basta premere Richiedi per saltare!", "QualityProfilesSelect": "Seleziona Un Profilo di Qualità", "RootFolderSelect": "Seleziona Una Cartella di Root", - "LanguageProfileSelect": "Select A Language Profile", - "Status": "Status:", + "LanguageProfileSelect": "Seleziona Un Profilo della Lingua", + "Status": "Stato:", "StatusValues": { - "Rumored": "Rumored", - "Planned": "Planned", - "In Production": "In Production", - "Post Production": "Post Production", - "Released": "Released", - "Running": "Running", - "Returning Series": "Returning Series", - "Ended": "Ended", - "Canceled": "Canceled" + "Rumored": "Rumor", + "Planned": "Pianificato", + "In Production": "In Produzione", + "Post Production": "Post Produzione", + "Released": "Rilasciato", + "Running": "In Corso", + "Returning Series": "Serie Rinnovate", + "Ended": "Terminata", + "Canceled": "Annullata" }, - "Seasons": "Seasons:", - "Episodes": "Episodes:", - "Availability": "Availability:", + "Seasons": "Stagioni:", + "Episodes": "Episodi:", + "Availability": "Disponibilità:", "RequestStatus": "Stato Richiesta", - "Quality": "Quality:", - "RootFolderOverride": "Root Folder Override:", - "QualityOverride": "Quality Override:", - "Network": "Network:", - "Genres": "Genres:", - "FirstAired": "First Aired:", - "TheatricalRelease": "Release:", - "DigitalRelease": "Digital Release:", - "Votes": "Votes:", - "Runtime": "Runtime:", + "Quality": "Qualità:", + "RootFolderOverride": "Sovrascrizione Cartella di Root:", + "QualityOverride": "Sovrascrizione Qualità:", + "Network": "Rete:", + "GenresLabel": "Generi:", + "Genres": "Generi", + "FirstAired": "Prima Trasmissione:", + "TheatricalRelease": "Uscita:", + "DigitalRelease": "Uscita Digitale:", + "Votes": "Voti:", + "Runtime": "Durata:", "Minutes": "{{runtime}} Minuti", - "Revenue": "Revenue:", + "Revenue": "Entrate:", "Budget": "Budget:", - "Keywords": "Keywords/Tags:", + "Keywords": "Parole Chiave/Tag:", "Casts": { "CastTitle": "Trasmetti" }, @@ -334,31 +345,32 @@ "AllSeasonsTooltip": "Questo richiederà ogni stagione per questo show", "FirstSeasonTooltip": "Questo richiederà solo la Prima Stagione per questo show", "LatestSeasonTooltip": "Questo richiederà solo l'Ultima Stagione per questo show", - "NoEpisodes": "There unfortunately is no episode data for this show yet!", - "SeasonNumber": "Season {{number}}" + "NoEpisodes": "Sfortunatamente, non c'è ancora alcun dato dell'episodio per questa serie!", + "SeasonNumber": "Stagione {{number}}" }, - "SonarrConfiguration": "Sonarr Configuration", - "RadarrConfiguration": "Radarr Configuration", - "RequestOnBehalf": "Request on behalf of", - "PleaseSelectUser": "Please select a user", - "StreamingOn": "Streaming On:", - "RequestedBy": "Requested By:", - "RequestDate": "Request Date:", - "DeniedReason": "Denied Reason:", - "ReProcessRequest": "Re-Process Request", + "SonarrConfiguration": "Configurazione di Sonarr", + "RadarrConfiguration": "Configurazione di Radarr", + "RequestOnBehalf": "Richiesta per conto di", + "PleaseSelectUser": "Sei pregato di selezionare un utente", + "StreamingOn": "In Streaming Su:", + "RequestedBy": "Richiesto Da:", + "RequestedByOn": "Richiesto da {{user}} il {{date}}", + "RequestDate": "Data di Richiesta:", + "DeniedReason": "Motivo di Negazione:", + "ReProcessRequest": "Ri-Elabora Richiesta", "Music": { - "Type": "Type:", - "Country": "Country:", - "StartDate": "Start Date:", - "EndDate": "EndDate:" + "Type": "Tipo:", + "Country": "Paese:", + "StartDate": "Data Iniziale:", + "EndDate": "Data Finale:" } }, "Discovery": { "PopularTab": "Popolare", "TrendingTab": "Tendenze", "UpcomingTab": "In arrivo", - "SeasonalTab": "Seasonal", - "RecentlyRequestedTab": "Recently Requested", + "SeasonalTab": "Stagionale", + "RecentlyRequestedTab": "Richiesto Recentemente", "Movies": "Film", "Combined": "Combinato", "Tv": "TV", @@ -374,35 +386,45 @@ "Writer": "Scrittore", "ExecProducer": "Produttore Esecutivo" }, - "NoSearch": "Sorry, nothing matches your search!" + "NoSearch": "Spiacenti, nessun risultato corrisponde alla tua ricerca!" }, "UserPreferences": { "Welcome": "Benvenuto {{username}}!", "OmbiLanguage": "Lingua", "DarkMode": "Modalità Scura", - "Updated": "Successfully Updated", - "StreamingCountry": "Streaming Country", - "StreamingCountryDescription": "This is the country code that we will display streaming information for. If you are in the US please select US and you will have US related streaming information.", - "LanguageDescription": "This is the language you would like the Ombi interface to be displayed in.", - "MobileQRCode": "Mobile QR Code", - "LegacyApp": "Launch Legacy App", - "NoQrCode": "Please contact your administrator to enable QR codes", - "UserType": "User Type:", - "ChangeDetails": "Change Details", - "NeedCurrentPassword": "You need your current password to make any changes here", - "CurrentPassword": "Current Password", - "EmailAddress": "Email Address", - "NewPassword": "New Password", - "NewPasswordConfirm": "New Password Confirm", - "Security": "Security", - "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "Updated": "Aggiornate Correttamente", + "StreamingCountry": "Paese di Streaming", + "StreamingCountryDescription": "Questo è il codice del paese per cui mostreremo le informazioni di streaming. Se sei negli USA, sei pregato di selezionare US e riceverai le informazioni di streaming correlate agli USA.", + "LanguageDescription": "Questa è la lingua in cui vorresti fosse visualizzata l'interfaccia di Ombi.", + "MobileQRCode": "Codice QR Mobile", + "LegacyApp": "Avvia l'App Legacy", + "NoQrCode": "Sei pregato di contattare il tuo amministratore per abilitare i codici QR", + "UserType": "Tipo di Utente:", + "ChangeDetails": "Modifica i Dettagli", + "NeedCurrentPassword": "Necessiti la tua password corrente per effettuare qualsiasi modifica qui", + "CurrentPassword": "Password Corrente", + "EmailAddress": "Indirizzo Email", + "NewPassword": "Nuova Password", + "NewPasswordConfirm": "Conferma Nuova Password", + "Security": "Sicurezza", + "Profile": "Profilo", + "UpdatedYourInformation": "Le tue informazioni sono state aggiornate", + "Unsubscribed": "Disiscritto!" }, "UserTypeLabel": { - "1": "Local User", - "2": "Plex User", - "3": "Emby User", - "4": "Emby Connect User", - "5": "Jellyfin User" + "1": "Utente Locale", + "2": "Utente di Plex", + "3": "Utente di Emby", + "4": "Connetti Utente di Emby", + "5": "Utente di Jellyfin" + }, + "Paginator": { + "itemsPerPageLabel": "Righe per pagina:", + "nextPageLabel": "Pagina successiva", + "previousPageLabel": "Pagina precedente", + "firstPageLabel": "Prima pagina", + "lastPageLabel": "Ultima pagina", + "rangePageLabel1": "0 su {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} su {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/nl.json b/src/Ombi/wwwroot/translations/nl.json index da6ce4cc5..a7b663a23 100644 --- a/src/Ombi/wwwroot/translations/nl.json +++ b/src/Ombi/wwwroot/translations/nl.json @@ -55,6 +55,9 @@ "OfflineParagraph": "De mediaserver is momenteel offline.", "CheckPageForUpdates": "Controleer deze pagina voor updates." }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Ontdekken", "Search": "Zoeken", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Problemen", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Onopgeloste Problemen", "InProgressTitle": "Problemen in Behandeling", "ResolvedTitle": "Opgeloste Problemen", @@ -255,6 +263,7 @@ "Delete": "Delete issue", "DeletedIssue": "Issue has been deleted", "Chat": "Chat", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Afgewezen", + "Trailers": "Trailers", "RecommendationsTitle": "Aanbevelingen", "SimilarTitle": "Vergelijkbaar", "VideosTitle": "Video's", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/no.json b/src/Ombi/wwwroot/translations/no.json index c889a4f8f..b1264643d 100644 --- a/src/Ombi/wwwroot/translations/no.json +++ b/src/Ombi/wwwroot/translations/no.json @@ -55,6 +55,9 @@ "OfflineParagraph": "Medieserveren er for øyeblikket utilgjengelig.", "CheckPageForUpdates": "Sjekk denne siden for kontinuerlige oppdateringer." }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Discover", "Search": "Søk", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Mangler", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Ventende løsninger", "InProgressTitle": "Mangler under behandling", "ResolvedTitle": "Løste mangler", @@ -255,6 +263,7 @@ "Delete": "Delete issue", "DeletedIssue": "Issue has been deleted", "Chat": "Chat", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Avslått", + "Trailers": "Trailers", "RecommendationsTitle": "Recommendations", "SimilarTitle": "Lignende", "VideosTitle": "Videos", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/pl.json b/src/Ombi/wwwroot/translations/pl.json index 3affb1ef9..1db34df8b 100644 --- a/src/Ombi/wwwroot/translations/pl.json +++ b/src/Ombi/wwwroot/translations/pl.json @@ -55,6 +55,9 @@ "OfflineParagraph": "Serwer multimediów jest aktualnie offline.", "CheckPageForUpdates": "Tutaj znajdziesz aktualizacje dotyczące tej strony." }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Odkryj", "Search": "Szukaj", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Problemy", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Oczekujące problemy", "InProgressTitle": "Problemy w trakcie", "ResolvedTitle": "Problemy rozwiązane", @@ -255,6 +263,7 @@ "Delete": "Delete issue", "DeletedIssue": "Issue has been deleted", "Chat": "Chat", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Odrzucone", + "Trailers": "Trailers", "RecommendationsTitle": "Rekomendacje", "SimilarTitle": "Podobne", "VideosTitle": "Wideo", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/pt.json b/src/Ombi/wwwroot/translations/pt.json index cd2a3d80a..78a62b0b0 100644 --- a/src/Ombi/wwwroot/translations/pt.json +++ b/src/Ombi/wwwroot/translations/pt.json @@ -14,8 +14,8 @@ "Common": { "ContinueButton": "Continuar", "Available": "Disponível", - "Approved": "Approved", - "Pending": "Pending", + "Approved": "Aprovado", + "Pending": "Pendente", "PartiallyAvailable": "Parcialmente Disponível", "Monitored": "Monitorado", "NotAvailable": "Não Disponível", @@ -24,7 +24,7 @@ "RequestDenied": "Solicitação Negada", "NotRequested": "Não Solicitado", "Requested": "Solicitado", - "Search": "Search", + "Search": "Buscar", "Request": "Solicitar", "Denied": "Negado", "Approve": "Aprovar", @@ -35,10 +35,10 @@ }, "Cancel": "Cancelar", "Submit": "Submeter", - "Update": "Update", - "tvShow": "TV Show", - "movie": "Movie", - "album": "Album" + "Update": "Atualizar", + "tvShow": "Series", + "movie": "Filmes", + "album": "Álbum" }, "PasswordReset": { "EmailAddressPlaceholder": "Endereço de e-mail", @@ -55,8 +55,11 @@ "OfflineParagraph": "O servidor de mídia está atualmente offline.", "CheckPageForUpdates": "Verifique esta página para acompanhar as atualizações do site." }, + "ErrorPages": { + "NotFound": "Pagina não encontrada" + }, "NavigationBar": { - "Discover": "Discover", + "Discover": "Explorar", "Search": "Pesquisar", "Requests": "Solicitações", "UserManagement": "User Management", @@ -64,7 +67,7 @@ "Vote": "Votar", "Donate": "Doações!", "DonateLibraryMaintainer": "Doar para o Dono da Biblioteca", - "DonateTooltip": "This is how I convince my wife to let me spend my spare time developing Ombi 😁", + "DonateTooltip": "É assim que convenço minha esposa a me deixar passar o meu tempo livre desenvolvendo o Ombi 😁", "UpdateAvailableTooltip": "Atualização Disponível!", "Settings": "Configurações", "Welcome": "Bem-vindo(a), {{username}}", @@ -72,20 +75,20 @@ "Logout": "Desconectar", "OpenMobileApp": "Abrir Aplicativo do Celular", "RecentlyAdded": "Recentemente Adicionado", - "ChangeTheme": "Change Theme", - "Calendar": "Calendar", - "UserPreferences": "Preferences", + "ChangeTheme": "Trocar Tema", + "Calendar": "Calendário", + "UserPreferences": "Preferências", "FeatureSuggestion": "Feature Suggestion", - "FeatureSuggestionTooltip": "Have a great new idea? Suggest it here!", + "FeatureSuggestionTooltip": "Teve uma ótima idéia? Sugira aqui!", "Filter": { - "Movies": "Movies", - "TvShows": "TV Shows", - "Music": "Music", - "People": "People" + "Movies": "Filmes", + "TvShows": "Séries", + "Music": "Músicas", + "People": "Pessoas" }, - "MorningWelcome": "Good morning!", - "AfternoonWelcome": "Good afternoon!", - "EveningWelcome": "Good evening!" + "MorningWelcome": "Bom dia!", + "AfternoonWelcome": "Boa tarde!", + "EveningWelcome": "Boa noite!" }, "Search": { "Title": "Pesquisar", @@ -93,15 +96,15 @@ "MoviesTab": "Filmes", "TvTab": "Séries", "MusicTab": "Músicas", - "AdvancedSearch": "You can fill in any of the below to discover new media. All of the results are sorted by popularity", - "AdvancedSearchHeader": "Advanced Search", + "AdvancedSearch": "Você pode preencher qualquer um dos abaixo para descobrir novas mídias. Todos os resultados são classificados por popularidade", + "AdvancedSearchHeader": "Pesquisa avançada", "Suggestions": "Sugestões", "NoResults": "Desculpe, não encontramos nenhum resultado!", "DigitalDate": "Lançamento Digital: {{date}}", "TheatricalRelease": "Lançamento nos Cinemas: {{date}}", "ViewOnPlex": "View On Plex", "ViewOnEmby": "View On Emby", - "ViewOnJellyfin": "Play On Jellyfin", + "ViewOnJellyfin": "Assistir no Jellyfin", "RequestAdded": "O pedido de {{title}} foi adicionado com sucesso", "Similar": "Semelhantes", "Refine": "Corrigir", @@ -126,30 +129,33 @@ "LatestSeason": "Última Temporada", "Select": "Selecionar...", "SubmitRequest": "Enviar solicitação", - "Season": "Season {{seasonNumber}}", + "Season": "Temporada: {{seasonNumber}}", "SelectAllInSeason": "Selecione Tudo na Temporada {{seasonNumber}}" }, - "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", - "YearOfRelease": "Year of Release", - "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" + "AdvancedSearchInstructions": "Por favor, escolha o tipo de mídia que você está procurando:", + "YearOfRelease": "Ano de lançamento", + "SearchGenre": "Pesquisa por gênero", + "SearchKeyword": "Pesquisar palavras-chave", + "SearchProvider": "Provedores de pesquisa", + "KeywordSearchingDisclaimer": "Por favor, note que a busca por palavra-chave é muito acertada e perdida devido aos dados inconsistentes no TheMovieDb" }, "Requests": { "Title": "Solicitações", "Paragraph": "Abaixo, você pode ver o seu e todos os outros pedidos, bem como o seu download e status de aprovação.", "MoviesTab": "Filmes", - "ArtistName": "Artist", - "AlbumName": "Album Name", + "ArtistName": "Artistas", + "AlbumName": "Nome do álbum", "TvTab": "Séries", "MusicTab": "Músicas", - "RequestedBy": "Requested By", + "RequestedBy": "Solicitado por", "Status": "Status", - "RequestStatus": "Request status", + "RequestStatus": "Status da solicitação", "Denied": " Negados:", "TheatricalRelease": "Lançamento nos Cinemas: {{date}}", "ReleaseDate": "Lançado: {{date}}", "TheatricalReleaseSort": "Lançamento nos Cinemas", "DigitalRelease": "Lançamento Digital: {{date}}", - "RequestDate": "Request Date", + "RequestDate": "Data da Solicitação", "QualityOverride": "Substituição de Qualidade:", "RootFolderOverride": "Substituição da Pasta Raiz:", "ChangeRootFolder": "Pasta Raiz", @@ -158,9 +164,9 @@ "MarkAvailable": "Marcar como Disponível", "Remove": "Remover", "Deny": "Negar", - "DenyReason": "Deny Reason", - "DeniedReason": "Denied Reason", - "Season": "Season", + "DenyReason": "Razão da rejeição", + "DeniedReason": "Razão da rejeição", + "Season": "Temporada", "GridTitle": "Título", "AirDate": "AirDate", "GridStatus": "Status", @@ -181,23 +187,24 @@ "NextMinutes": "Outra solicitação será adicionada em {{time}} minutos", "NextMinute": "Outra solicitação será adicionada em {{time}} minuto" }, - "AllRequests": "All Requests", - "PendingRequests": "Pending Requests", - "ProcessingRequests": "Processing Requests", - "AvailableRequests": "Available Requests", - "DeniedRequests": "Denied Requests", - "RequestsToDisplay": "Requests to display", - "RequestsTitle": "Title", - "Details": "Details", - "Options": "Options", + "AllRequests": "Todas solicitações", + "PendingRequests": "Solicitações pendentes", + "ProcessingRequests": "Solicitações em andamento", + "AvailableRequests": "Solicitação Disponíveis", + "DeniedRequests": "Solicitações Negadas", + "RequestsToDisplay": "Itens por página", + "RequestsTitle": "Título", + "Details": "Detalhes", + "Options": "Opções", "RequestPanel": { - "Delete": "Delete Request", + "Delete": "Apagar Solicitação", "Approve": "Approve Request", "ChangeAvailability": "Mark Available", "Deleted": "Successfully deleted selected items", "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Problemas", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Problemas pendentes", "InProgressTitle": "Problemas em resolução", "ResolvedTitle": "Problemas Resolvidos", @@ -255,6 +263,7 @@ "Delete": "Delete issue", "DeletedIssue": "Issue has been deleted", "Chat": "Chat", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,12 +290,13 @@ }, "MediaDetails": { "Denied": "Denied", + "Trailers": "Trailers", "RecommendationsTitle": "Recommendations", "SimilarTitle": "Similar", - "VideosTitle": "Videos", - "AlbumsTitle": "Albums", - "RequestAllAlbums": "Request All Albums", - "ClearSelection": "Clear Selection", + "VideosTitle": "Vídeos", + "AlbumsTitle": "Álbuns", + "RequestAllAlbums": "Solicitar Todos Álbuns", + "ClearSelection": "Limpar Seleção", "RequestSelectedAlbums": "Request Selected Albums", "ViewCollection": "View Collection", "NotEnoughInfo": "Unfortunately there is not enough information about this show yet!", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/ru.json b/src/Ombi/wwwroot/translations/ru.json index 3b0659f2d..41752b984 100644 --- a/src/Ombi/wwwroot/translations/ru.json +++ b/src/Ombi/wwwroot/translations/ru.json @@ -55,6 +55,9 @@ "OfflineParagraph": "Медиа-сервер в настоящее время не в сети.", "CheckPageForUpdates": "Проверьте эту страницу для получения последних новостей сайта." }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Discover", "Search": "Поиск", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Проблемы", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Проблемы в ожидании", "InProgressTitle": "Проблемы в процессе", "ResolvedTitle": "Решенные проблемы", @@ -255,6 +263,7 @@ "Delete": "Delete issue", "DeletedIssue": "Issue has been deleted", "Chat": "Chat", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Отказано", + "Trailers": "Trailers", "RecommendationsTitle": "Recommendations", "SimilarTitle": "Похожие", "VideosTitle": "Videos", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/sk.json b/src/Ombi/wwwroot/translations/sk.json index 774445f95..069c68061 100644 --- a/src/Ombi/wwwroot/translations/sk.json +++ b/src/Ombi/wwwroot/translations/sk.json @@ -55,6 +55,9 @@ "OfflineParagraph": "Mediálny server je momentálne offline.", "CheckPageForUpdates": "Prezrite túto stránku pre aktualizácie." }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Objaviť", "Search": "Hľadať", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Problémy", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Nevyriešené problémy", "InProgressTitle": "Riešené problémy", "ResolvedTitle": "Vyiešené problémy", @@ -255,6 +263,7 @@ "Delete": "Odstrániť problém", "DeletedIssue": "Problém bol odstránený", "Chat": "Chat", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Zamietnuté", + "Trailers": "Trailers", "RecommendationsTitle": "Odporúčania", "SimilarTitle": "Podobné", "VideosTitle": "Videá", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/sv.json b/src/Ombi/wwwroot/translations/sv.json index a77e67ee5..8496dc079 100644 --- a/src/Ombi/wwwroot/translations/sv.json +++ b/src/Ombi/wwwroot/translations/sv.json @@ -55,6 +55,9 @@ "OfflineParagraph": "Medieservern är för närvarande offline.", "CheckPageForUpdates": "Håll utkik här för uppdateringar på denna sida." }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Upptäck", "Search": "Sök", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "Problem", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "Väntande problem", "InProgressTitle": "Pågående problem", "ResolvedTitle": "Lösta problem", @@ -255,6 +263,7 @@ "Delete": "Ta bort problem", "DeletedIssue": "Problemet har tagits bort", "Chat": "Chat", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Nekad", + "Trailers": "Trailers", "RecommendationsTitle": "Rekommendationer", "SimilarTitle": "Liknande", "VideosTitle": "Videor", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/src/Ombi/wwwroot/translations/zh.json b/src/Ombi/wwwroot/translations/zh.json index 8e173c559..ba302c6ce 100644 --- a/src/Ombi/wwwroot/translations/zh.json +++ b/src/Ombi/wwwroot/translations/zh.json @@ -4,8 +4,8 @@ "UsernamePlaceholder": "帳戶名稱", "PasswordPlaceholder": "密碼", "RememberMe": "記住我", - "SignInWith": "Sign in with {{appName}}", - "SignInWithPlex": "Sign in with Plex", + "SignInWith": "使用 {{appName}} 登錄", + "SignInWithPlex": "使用Plex登入", "ForgottenPassword": "忘記密碼了嗎?", "Errors": { "IncorrectCredentials": "用戶名或密碼錯誤" @@ -14,8 +14,8 @@ "Common": { "ContinueButton": "繼續", "Available": "已收錄", - "Approved": "Approved", - "Pending": "Pending", + "Approved": "已通過審核", + "Pending": "等待中", "PartiallyAvailable": "部分已收錄", "Monitored": "監控中", "NotAvailable": "未收錄", @@ -24,20 +24,20 @@ "RequestDenied": "請求被拒絕", "NotRequested": "未申請", "Requested": "已申請", - "Search": "Search", + "Search": "搜索", "Request": "請求內容", "Denied": "拒絕", "Approve": "確認", "PartlyAvailable": "部分已收錄", - "ViewDetails": "View Details", + "ViewDetails": "檢視詳細資料", "Errors": { "Validation": "請檢查您輸入的數值" }, - "Cancel": "Cancel", - "Submit": "Submit", - "Update": "Update", - "tvShow": "TV Show", - "movie": "Movie", + "Cancel": "取消", + "Submit": "递交", + "Update": "更新", + "tvShow": "電視節目", + "movie": "電影", "album": "Album" }, "PasswordReset": { @@ -55,6 +55,9 @@ "OfflineParagraph": "服務器當前離線。", "CheckPageForUpdates": "檢查此頁面以獲取持續的站點更新。" }, + "ErrorPages": { + "NotFound": "Page not found" + }, "NavigationBar": { "Discover": "Discover", "Search": "搜索", @@ -131,6 +134,9 @@ }, "AdvancedSearchInstructions": "Please choose what type of media you are searching for:", "YearOfRelease": "Year of Release", + "SearchGenre": "Search Genre", + "SearchKeyword": "Search Keyword", + "SearchProvider": "Search Provider", "KeywordSearchingDisclaimer": "Please note that Keyword Searching is very hit and miss due to the inconsistent data in TheMovieDb" }, "Requests": { @@ -198,6 +204,7 @@ "Approved": "Successfully approved selected items" }, "SuccessfullyApproved": "Successfully Approved", + "SuccessfullyDeleted": "Request successfully deleted", "NowAvailable": "Request is now available", "NowUnavailable": "Request is now unavailable", "SuccessfullyReprocessed": "Successfully Re-processed the request", @@ -223,6 +230,7 @@ }, "Issues": { "Title": "問題", + "IssuesForTitle": "Issues for {{title}}", "PendingTitle": "未決問題", "InProgressTitle": "進行中的問題", "ResolvedTitle": "已解決的問題", @@ -255,6 +263,7 @@ "Delete": "Delete issue", "DeletedIssue": "Issue has been deleted", "Chat": "Chat", + "EnterYourMessage": "Enter Your Message", "Requested": "Requested", "UserOnDate": "{{user}} on {{date}}" }, @@ -281,6 +290,7 @@ }, "MediaDetails": { "Denied": "Denied", + "Trailers": "Trailers", "RecommendationsTitle": "Recommendations", "SimilarTitle": "Similar", "VideosTitle": "Videos", @@ -317,7 +327,8 @@ "RootFolderOverride": "Root Folder Override:", "QualityOverride": "Quality Override:", "Network": "Network:", - "Genres": "Genres:", + "GenresLabel": "Genres:", + "Genres": "Genres", "FirstAired": "First Aired:", "TheatricalRelease": "Release:", "DigitalRelease": "Digital Release:", @@ -343,6 +354,7 @@ "PleaseSelectUser": "Please select a user", "StreamingOn": "Streaming On:", "RequestedBy": "Requested By:", + "RequestedByOn": "Requested By {{user}} on {{date}}", "RequestDate": "Request Date:", "DeniedReason": "Denied Reason:", "ReProcessRequest": "Re-Process Request", @@ -396,7 +408,8 @@ "NewPasswordConfirm": "New Password Confirm", "Security": "Security", "Profile": "Profile", - "UpdatedYourInformation": "Updated your information" + "UpdatedYourInformation": "Updated your information", + "Unsubscribed": "Unsubscribed!" }, "UserTypeLabel": { "1": "Local User", @@ -404,5 +417,14 @@ "3": "Emby User", "4": "Emby Connect User", "5": "Jellyfin User" + }, + "Paginator": { + "itemsPerPageLabel": "Items per page:", + "nextPageLabel": "Next page", + "previousPageLabel": "Previous page", + "firstPageLabel": "First page", + "lastPageLabel": "Last page", + "rangePageLabel1": "0 of {{length}}", + "rangePageLabel2": "{{startIndex}} – {{endIndex}} of {{length}}" } } diff --git a/tests/cypress/tests/requests/requests.spec.ts b/tests/cypress/tests/requests/requests.spec.ts index 23c5ccb09..fc1a7489c 100644 --- a/tests/cypress/tests/requests/requests.spec.ts +++ b/tests/cypress/tests/requests/requests.spec.ts @@ -39,7 +39,7 @@ describe("Requests Tests", () => { row.optionsDelete.click(); cy.wait('@deleteRequest').then((intercept) => { - expect(intercept.response.body).is.true; + expect(intercept.response.body.result).is.true; }) row.title.should('not.exist'); diff --git a/version.json b/version.json index 5f5439527..05584383f 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "4.3.2" + "version": "4.6.4" } \ No newline at end of file