diff --git a/.nuget/packages/AppLimit.CloudComputing.SharpBox.1.1.0.457.nupkg b/.nuget/packages/AppLimit.CloudComputing.SharpBox.1.1.0.457.nupkg deleted file mode 100644 index a0fac19f22..0000000000 Binary files a/.nuget/packages/AppLimit.CloudComputing.SharpBox.1.1.0.457.nupkg and /dev/null differ diff --git a/.nuget/packages/AppLimit.CloudComputing.SharpBox.1.2.0.1.nupkg b/.nuget/packages/AppLimit.CloudComputing.SharpBox.1.2.0.1.nupkg new file mode 100644 index 0000000000..ae19042011 Binary files /dev/null and b/.nuget/packages/AppLimit.CloudComputing.SharpBox.1.2.0.1.nupkg differ diff --git a/.nuget/packages/Microsoft.Graph.Core.1.5.0.2.nupkg b/.nuget/packages/Microsoft.Graph.Core.1.5.0.2.nupkg deleted file mode 100644 index e23092d2db..0000000000 Binary files a/.nuget/packages/Microsoft.Graph.Core.1.5.0.2.nupkg and /dev/null differ diff --git a/.nuget/packages/Microsoft.Graph.Core.1.6.0.nupkg b/.nuget/packages/Microsoft.Graph.Core.1.6.0.nupkg new file mode 100644 index 0000000000..abfaa5913a Binary files /dev/null and b/.nuget/packages/Microsoft.Graph.Core.1.6.0.nupkg differ diff --git a/.nuget/packages/Microsoft.OneDriveSDK.2.0.7.6.nupkg b/.nuget/packages/Microsoft.OneDriveSDK.2.0.7.6.nupkg deleted file mode 100644 index 9302cb6b3b..0000000000 Binary files a/.nuget/packages/Microsoft.OneDriveSDK.2.0.7.6.nupkg and /dev/null differ diff --git a/.nuget/packages/Microsoft.OneDriveSDK.2.1.0.nupkg b/.nuget/packages/Microsoft.OneDriveSDK.2.1.0.nupkg new file mode 100644 index 0000000000..eadb74e7f1 Binary files /dev/null and b/.nuget/packages/Microsoft.OneDriveSDK.2.1.0.nupkg differ diff --git a/.nuget/packages/Openstack.net.1.7.9.nupkg b/.nuget/packages/Openstack.net.1.7.9.nupkg deleted file mode 100644 index 1aca2f32f6..0000000000 Binary files a/.nuget/packages/Openstack.net.1.7.9.nupkg and /dev/null differ diff --git a/.nuget/packages/Openstack.net.1.8.0.nupkg b/.nuget/packages/Openstack.net.1.8.0.nupkg new file mode 100644 index 0000000000..70b055d1a0 Binary files /dev/null and b/.nuget/packages/Openstack.net.1.8.0.nupkg differ diff --git a/.nuget/packages/Rackspace.0.2.1.nupkg b/.nuget/packages/Rackspace.0.2.1.nupkg deleted file mode 100644 index deaf8824e3..0000000000 Binary files a/.nuget/packages/Rackspace.0.2.1.nupkg and /dev/null differ diff --git a/.nuget/packages/Rackspace.1.0.0.nupkg b/.nuget/packages/Rackspace.1.0.0.nupkg new file mode 100644 index 0000000000..78c3fc1367 Binary files /dev/null and b/.nuget/packages/Rackspace.1.0.0.nupkg differ diff --git a/.nuget/packages/SimpleRESTServicesNET50.1.3.0.2.nupkg b/.nuget/packages/SimpleRESTServicesNET50.1.3.0.2.nupkg deleted file mode 100644 index 2cdfd43d50..0000000000 Binary files a/.nuget/packages/SimpleRESTServicesNET50.1.3.0.2.nupkg and /dev/null differ diff --git a/.nuget/packages/SimpleRESTServicesNET60.1.4.0.nupkg b/.nuget/packages/SimpleRESTServicesNET60.1.4.0.nupkg new file mode 100644 index 0000000000..9178037188 Binary files /dev/null and b/.nuget/packages/SimpleRESTServicesNET60.1.4.0.nupkg differ diff --git a/ASC.Tests.sln b/ASC.Tests.sln index ba730f6e00..ccff448ba7 100644 --- a/ASC.Tests.sln +++ b/ASC.Tests.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30413.136 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Files.Tests", "products\ASC.Files\Tests\ASC.Files.Tests.csproj", "{EFB99A37-EF25-4A0F-8D7A-786402B1554C}" EndProject @@ -73,7 +73,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Webhooks.Tests", "commo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Webhooks.Service", "common\services\ASC.Webhooks.Service\ASC.Webhooks.Service.csproj", "{23310CB9-1A14-4ED5-BF81-8BD38277FEFE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ASC.Web.Api.Tests", "common\Tests\ASC.Web.Api.Tests\ASC.Web.Api.Tests.csproj", "{14823E93-C749-4069-9E0A-95E63DE0B254}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Web.Api.Tests", "common\Tests\ASC.Web.Api.Tests\ASC.Web.Api.Tests.csproj", "{14823E93-C749-4069-9E0A-95E63DE0B254}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Data.Backup.Core", "common\ASC.Data.Backup.Core\ASC.Data.Backup.Core.csproj", "{5E948877-52BD-42B9-95A9-0FF37931D0A5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Data.Encryption", "common\ASC.Data.Encryption\ASC.Data.Encryption.csproj", "{9E572FE2-8C3C-46B2-A314-532F7198B3EB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.AuditTrail", "common\services\ASC.AuditTrail\ASC.AuditTrail.csproj", "{B53587B7-58F6-48A9-B122-69BEA3E2572A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -209,10 +215,6 @@ Global {8FAD3D1B-3ADC-470C-9933-CAE1B95A8599}.Debug|Any CPU.Build.0 = Debug|Any CPU {8FAD3D1B-3ADC-470C-9933-CAE1B95A8599}.Release|Any CPU.ActiveCfg = Release|Any CPU {8FAD3D1B-3ADC-470C-9933-CAE1B95A8599}.Release|Any CPU.Build.0 = Release|Any CPU - {14823E93-C749-4069-9E0A-95E63DE0B254}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {14823E93-C749-4069-9E0A-95E63DE0B254}.Debug|Any CPU.Build.0 = Debug|Any CPU - {14823E93-C749-4069-9E0A-95E63DE0B254}.Release|Any CPU.ActiveCfg = Release|Any CPU - {14823E93-C749-4069-9E0A-95E63DE0B254}.Release|Any CPU.Build.0 = Release|Any CPU {A0475D4F-29B7-490C-85C2-8AFD60118B35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A0475D4F-29B7-490C-85C2-8AFD60118B35}.Debug|Any CPU.Build.0 = Debug|Any CPU {A0475D4F-29B7-490C-85C2-8AFD60118B35}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -224,7 +226,23 @@ Global {23310CB9-1A14-4ED5-BF81-8BD38277FEFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23310CB9-1A14-4ED5-BF81-8BD38277FEFE}.Debug|Any CPU.Build.0 = Debug|Any CPU {23310CB9-1A14-4ED5-BF81-8BD38277FEFE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {23310CB9-1A14-4ED5-BF81-8BD38277FEFE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection + {14823E93-C749-4069-9E0A-95E63DE0B254}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14823E93-C749-4069-9E0A-95E63DE0B254}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14823E93-C749-4069-9E0A-95E63DE0B254}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14823E93-C749-4069-9E0A-95E63DE0B254}.Release|Any CPU.Build.0 = Release|Any CPU + {5E948877-52BD-42B9-95A9-0FF37931D0A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5E948877-52BD-42B9-95A9-0FF37931D0A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E948877-52BD-42B9-95A9-0FF37931D0A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5E948877-52BD-42B9-95A9-0FF37931D0A5}.Release|Any CPU.Build.0 = Release|Any CPU + {9E572FE2-8C3C-46B2-A314-532F7198B3EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E572FE2-8C3C-46B2-A314-532F7198B3EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E572FE2-8C3C-46B2-A314-532F7198B3EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E572FE2-8C3C-46B2-A314-532F7198B3EB}.Release|Any CPU.Build.0 = Release|Any CPU + {B53587B7-58F6-48A9-B122-69BEA3E2572A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B53587B7-58F6-48A9-B122-69BEA3E2572A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B53587B7-58F6-48A9-B122-69BEA3E2572A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B53587B7-58F6-48A9-B122-69BEA3E2572A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection diff --git a/README.md b/README.md index b3bd3eff6d..05b97c68e9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Platform for building your own scalable online office with ONLYOFFICE modules ## Overview -App Server is a platform for building your own online office by connecting ONLYOFFICE modules packed as separate apps. +App Server is a platform for building your own online office by connecting ONLYOFFICE modules packaged as separate apps. ## How to install [coming soon] @@ -35,4 +35,4 @@ Components source code - [https://github.com/ONLYOFFICE/AppComponents](https://g ## User feedback and support -If you have any problems or question about App Server, use the issues section here, in this repository. +If you have any problems or questions about App Server, use the issues section here, in this repository. diff --git a/build/build.backend.bat b/build/build.backend.bat index d84130726f..a0b36d3589 100644 --- a/build/build.backend.bat +++ b/build/build.backend.bat @@ -1,6 +1,7 @@ +@echo off + PUSHD %~dp0.. dotnet build ASC.Web.slnf /fl1 /flp1:LogFile=build/ASC.Web.log;Verbosity=Normal -@echo off echo. echo Install nodejs projects dependencies... echo. @@ -15,6 +16,8 @@ if %errorlevel% == 0 ( echo. +POPD + if "%1"=="nopause" goto start pause :start \ No newline at end of file diff --git a/build/build.bat b/build/build.bat index a6afe940db..868b4eb304 100644 --- a/build/build.bat +++ b/build/build.bat @@ -1,18 +1,27 @@ +@echo off + +echo "##########################################################" +echo "######### Start build and deploy #######################" +echo "##########################################################" + +echo. + PUSHD %~dp0 call runasadmin.bat "%~dpnx0" + if %errorlevel% == 0 ( -call start\stop.bat - -PUSHD %~dp0.. +call start\stop.bat nopause echo "FRONT-END (for start run command 'yarn start' inside the root folder)" -call build\build.frontend.bat +call build.frontend.bat nopause echo "BACK-END" -call build\build.backend.bat +call build.backend.bat nopause -start /b call build\start\start.bat +call start\start.bat nopause + +echo. pause ) \ No newline at end of file diff --git a/build/build.frontend.bat b/build/build.frontend.bat index 209e69cc35..40c1091a69 100644 --- a/build/build.frontend.bat +++ b/build/build.frontend.bat @@ -1,4 +1,6 @@ PUSHD %~dp0.. REM call yarn wipe -call yarn install \ No newline at end of file +call yarn install + +POPD \ No newline at end of file diff --git a/build/build.static.bat b/build/build.static.bat index f0a4cfebf8..6d6b2c4df8 100644 --- a/build/build.static.bat +++ b/build/build.static.bat @@ -48,15 +48,24 @@ powershell -Command "(gc build\deploy\nginx\sites-enabled\onlyoffice-studio.conf REM restart nginx echo service nginx stop -call sc stop nginx +call sc stop nginx > nul REM sleep 5 seconds call ping 127.0.0.1 -n 6 > nul echo service nginx start -call sc start nginx +call sc start nginx > nul + +if NOT %errorlevel% == 0 ( + echo Couldn't restarte Onlyoffice%%~nf service ) +) + +echo. + +POPD + if "%1"=="nopause" goto start pause :start \ No newline at end of file diff --git a/build/buildAndDeploy.PERSONAL.bat b/build/buildAndDeploy.PERSONAL.bat index aa1b1e7b1e..d89a6d053a 100644 --- a/build/buildAndDeploy.PERSONAL.bat +++ b/build/buildAndDeploy.PERSONAL.bat @@ -1,3 +1,9 @@ +echo "##########################################################" +echo "######### Start build and deploy Personal ##############" +echo "##########################################################" + +echo. + PUSHD %~dp0 call runasadmin.bat "%~dpnx0" if %errorlevel% == 0 ( diff --git a/build/buildAndDeploy.bat b/build/buildAndDeploy.bat index 64927a481c..d47fe076f8 100644 --- a/build/buildAndDeploy.bat +++ b/build/buildAndDeploy.bat @@ -1,4 +1,11 @@ @echo off + +echo "##########################################################" +echo "######### Start build and deploy #######################" +echo "##########################################################" + +echo. + PUSHD %~dp0 setlocal EnableDelayedExpansion @@ -8,15 +15,15 @@ if %errorlevel% == 0 ( call start\stop.bat nopause -PUSHD %~dp0.. - echo "FRONT-END static" -call build\build.static.bat nopause +call build.static.bat nopause echo "BACK-END" -call build\build.backend.bat nopause +call build.backend.bat nopause -call build\start\start.bat nopause +call start\start.bat nopause + +echo. pause ) \ No newline at end of file diff --git a/build/install/common/systemd/build.sh b/build/install/common/systemd/build.sh index 9757bb7344..0c091776e8 100644 --- a/build/install/common/systemd/build.sh +++ b/build/install/common/systemd/build.sh @@ -36,7 +36,7 @@ BASE_DIR="/var/www/${PRODUCT}" PATH_TO_CONF="/etc/onlyoffice/${PRODUCT}" STORAGE_ROOT="${PATH_TO_CONF}/data" LOG_DIR="/var/log/onlyoffice/${PRODUCT}" -DOTNET_RUN="/usr/bin/dotnet" +DOTNET_RUN="/usr/share/dotnet/dotnet" APP_URLS="http://0.0.0.0" ENVIRONMENT=" --ENVIRONMENT=production" diff --git a/build/install/docker/Dockerfile.app b/build/install/docker/Dockerfile.app index aaf9b4df1c..f03fa17119 100644 --- a/build/install/docker/Dockerfile.app +++ b/build/install/docker/Dockerfile.app @@ -201,7 +201,7 @@ WORKDIR ${BUILD_PATH}/products/ASC.Files/service/ COPY --chown=onlyoffice:onlyoffice docker-entrypoint.sh . COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Files.Service/service/ . -CMD ["ASC.Files.Service.dll", "ASC.Files.Service", "core:products:folder=/var/www/products/", "core:products:subfolder=server"] +CMD ["ASC.Files.Service.dll", "ASC.Files.Service", "core:products:folder=/var/www/products/", "core:products:subfolder=server", "disable_elastic=true"] ## ASC.Mail ## FROM builder AS mail diff --git a/build/install/docker/docker-entrypoint.sh b/build/install/docker/docker-entrypoint.sh index 67da7c3c5c..3e6bcbb6f1 100755 --- a/build/install/docker/docker-entrypoint.sh +++ b/build/install/docker/docker-entrypoint.sh @@ -1,5 +1,5 @@ #!/bin/bash - +PARAMETERS=${PARAMETERS:-""} # read parameters if [ -n "$1" ]; then DOTNET_RUN="${1}"; @@ -22,7 +22,6 @@ echo "#-------------------------------------#" PRODUCT=${PRODUCT:-"onlyoffice"} BASE_DIR="/app/${PRODUCT}" -PARAMETERS="" PROXY_HOST=${PROXY_HOST:-"proxy"} SHEME=${SHEME:-"http"} SERVICE_PORT=${SERVICE_PORT:-"5050"} diff --git a/build/install/docker/hooks/push b/build/install/docker/hooks/push index 8691ce2aca..8e1d23b25c 100644 --- a/build/install/docker/hooks/push +++ b/build/install/docker/hooks/push @@ -1,3 +1,18 @@ #!/bin/bash export DOCKER_TAG=$DOCKER_TAG +BASE_NAME="appserver" +BUILD_NUMBER="$(date "+%Y%m%d%H")" +docker-compose -f build.yml push + +# Get docker images name to array +arrayImagesName=($(docker image ls | grep "$DOCKER_TAG" | grep "$STATUS" | grep "$BASE_NAME" | awk '{print $1}' )) + +# Modify docker image tag +for i in ${!arrayImagesName[@]}; do + echo " Modify ${arrayImagesName[$i]}:$DOCKER_TAG " + docker image tag ${arrayImagesName[$i]}:$DOCKER_TAG ${arrayImagesName[$i]}:$DOCKER_TAG-$BUILD_NUMBER +done + +# Push the same images with a new tag +DOCKER_TAG=$DOCKER_TAG-$BUILD_NUMBER docker-compose -f build.yml push diff --git a/build/runasadmin.bat b/build/runasadmin.bat index 73b0a1958d..6298efa01b 100644 --- a/build/runasadmin.bat +++ b/build/runasadmin.bat @@ -23,6 +23,5 @@ if '%errorlevel%' NEQ '0' ( exit /B 1 :gotAdmin - pushd "%CD%" CD /D "%~dp0" :-------------------------------------- \ No newline at end of file diff --git a/build/start/command.ps1 b/build/start/command.ps1 new file mode 100644 index 0000000000..8eef959102 --- /dev/null +++ b/build/start/command.ps1 @@ -0,0 +1,33 @@ +$PSversionMajor = $PSVersionTable.PSVersion | sort-object major | ForEach-Object {$_.major} +$PSversionMinor = $PSVersionTable.PSVersion | sort-object minor | ForEach-Object {$_.minor} + +if ($PSversionMajor -lt 7 -or $PSversionMinor -lt 2) { + Write-Error "Powershell version must be greater than or equal to 7.2. Press Enter to exit." + Pause + exit +} + +$WorkDir = "$(Split-Path -Parent $PSScriptRoot)\run"; +$CommandName = "$($args[0])"; + +#Write-Output "Starting $($CommandName) services at time: $(Get-Date -Format HH:mm:ss)" +#Write-Output "" + +Get-ChildItem -Path $WorkDir | ForEach-Object -ThrottleLimit 20 -Parallel { + $ServiceName = "Onlyoffice$([System.IO.Path]::GetFileNameWithoutExtension($_))"; + + switch ( $Using:CommandName ) + { + "start" { Start-Service -InputObject $(Get-Service -Name "$ServiceName") } + "stop" { Stop-Service -InputObject $(Get-Service -Name "$ServiceName") } + "restart" { Restart-Service -InputObject $(Get-Service -Name "$ServiceName") } + } + + if( $? ) + { + Write-Output "$ServiceName $($Using:CommandName) service has been done" + } +} + +#Write-Output "" +#Write-Output "End $($CommandName) services at time: $(Get-Date -Format HH:mm:ss)" \ No newline at end of file diff --git a/build/start/restart.bat b/build/start/restart.bat index 256665750f..7a3bbff722 100644 --- a/build/start/restart.bat +++ b/build/start/restart.bat @@ -3,11 +3,10 @@ PUSHD %~dp0.. call runasadmin.bat "%~dpnx0" +POPD + if %errorlevel% == 0 ( - for /R "run\" %%f in (*.bat) do ( - call sc stop "Onlyoffice%%~nf" - call sc start "Onlyoffice%%~nf" - ) + pwsh %~dp0/command.ps1 "restart" ) echo. diff --git a/build/start/start.bat b/build/start/start.bat index 9ecf6aa69e..66ddb75db4 100644 --- a/build/start/start.bat +++ b/build/start/start.bat @@ -3,10 +3,10 @@ PUSHD %~dp0.. call runasadmin.bat "%~dpnx0" +POPD + if %errorlevel% == 0 ( - for /R "run\" %%f in (*.bat) do ( - call sc start "Onlyoffice%%~nf" - ) + pwsh %~dp0/command.ps1 "start" ) echo. diff --git a/build/start/stop.bat b/build/start/stop.bat index b28a9c758f..61fccbb9e9 100644 --- a/build/start/stop.bat +++ b/build/start/stop.bat @@ -3,10 +3,10 @@ PUSHD %~dp0.. call runasadmin.bat "%~dpnx0" +POPD + if %errorlevel% == 0 ( - for /R "run\" %%f in (*.bat) do ( - call sc stop "Onlyoffice%%~nf" - ) + pwsh %~dp0/command.ps1 "stop" ) echo. diff --git a/common/ASC.Api.Core/ASC.Api.Core.csproj b/common/ASC.Api.Core/ASC.Api.Core.csproj index 1b20d86a76..447154f6e7 100644 --- a/common/ASC.Api.Core/ASC.Api.Core.csproj +++ b/common/ASC.Api.Core/ASC.Api.Core.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false @@ -17,7 +17,7 @@ - + diff --git a/common/ASC.Api.Core/Core/BaseStartup.cs b/common/ASC.Api.Core/Core/BaseStartup.cs index 843496bc93..27f17952cf 100644 --- a/common/ASC.Api.Core/Core/BaseStartup.cs +++ b/common/ASC.Api.Core/Core/BaseStartup.cs @@ -29,15 +29,15 @@ using Microsoft.AspNetCore.Mvc.Authorization; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - +using Microsoft.Extensions.Hosting; + using NLog; using NLog.Extensions.Logging; namespace ASC.Api.Core -{ - public abstract class BaseStartup - { +{ + public abstract class BaseStartup + { public IConfiguration Configuration { get; } public IHostEnvironment HostEnvironment { get; } public virtual JsonConverter[] Converters { get; } @@ -52,14 +52,14 @@ namespace ASC.Api.Core { Configuration = configuration; HostEnvironment = hostEnvironment; - DIHelper = new DIHelper(); + DIHelper = new DIHelper(); if (bool.TryParse(Configuration["core:products"], out var loadProducts)) { LoadProducts = loadProducts; - } + } } - public virtual void ConfigureServices(IServiceCollection services) + public virtual void ConfigureServices(IServiceCollection services) { services.AddCustomHealthCheck(Configuration); services.AddHttpContextAccessor(); @@ -69,20 +69,20 @@ namespace ASC.Api.Core services.AddSession(); DIHelper.Configure(services); - + Action jsonOptions = options => - { - options.JsonSerializerOptions.WriteIndented = false; - options.JsonSerializerOptions.IgnoreNullValues = true; - options.JsonSerializerOptions.Converters.Add(new ApiDateTimeConverter()); + { + options.JsonSerializerOptions.WriteIndented = false; + options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; + options.JsonSerializerOptions.Converters.Add(new ApiDateTimeConverter()); - if (Converters != null) - { - foreach (var c in Converters) - { - options.JsonSerializerOptions.Converters.Add(c); - } - } + if (Converters != null) + { + foreach (var c in Converters) + { + options.JsonSerializerOptions.Converters.Add(c); + } + } }; services.AddControllers() @@ -110,19 +110,19 @@ namespace ASC.Api.Core } var builder = services.AddMvcCore(config => - { + { config.Conventions.Add(new ControllerNameAttributeConvention()); - var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build(); + var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build(); - config.Filters.Add(new AuthorizeFilter(policy)); - config.Filters.Add(new TypeFilterAttribute(typeof(TenantStatusFilter))); - config.Filters.Add(new TypeFilterAttribute(typeof(PaymentFilter))); - config.Filters.Add(new TypeFilterAttribute(typeof(IpSecurityFilter))); - config.Filters.Add(new TypeFilterAttribute(typeof(ProductSecurityFilter))); + config.Filters.Add(new AuthorizeFilter(policy)); + config.Filters.Add(new TypeFilterAttribute(typeof(TenantStatusFilter))); + config.Filters.Add(new TypeFilterAttribute(typeof(PaymentFilter))); + config.Filters.Add(new TypeFilterAttribute(typeof(IpSecurityFilter))); + config.Filters.Add(new TypeFilterAttribute(typeof(ProductSecurityFilter))); config.Filters.Add(new CustomResponseFilterAttribute()); config.Filters.Add(new CustomExceptionFilterAttribute()); - config.Filters.Add(new TypeFilterAttribute(typeof(FormatFilter))); + config.Filters.Add(new TypeFilterAttribute(typeof(FormatFilter))); config.Filters.Add(new TypeFilterAttribute(typeof(WebhooksGlobalFilterAttribute))); config.OutputFormatters.RemoveType(); @@ -149,7 +149,7 @@ namespace ASC.Api.Core }); app.UseRouting(); - + if (AddAndUseSession) app.UseSession(); @@ -182,7 +182,7 @@ namespace ASC.Api.Core { builder.Register(Configuration, LoadProducts, LoadConsumers); } - } + } public static class LogNLogConfigureExtenstion { diff --git a/common/ASC.Common/ASC.Common.csproj b/common/ASC.Common/ASC.Common.csproj index dc67329783..e589ba8664 100644 --- a/common/ASC.Common/ASC.Common.csproj +++ b/common/ASC.Common/ASC.Common.csproj @@ -1,7 +1,7 @@  9.0.30729 - net5.0 + net6.0 ASC.Common @@ -39,13 +39,12 @@ - + - - - - - + + + + - diff --git a/common/ASC.Common/Security/Cryptography/InstanceCrypto.cs b/common/ASC.Common/Security/Cryptography/InstanceCrypto.cs index 4fc1f342a8..2d2cf242b6 100644 --- a/common/ASC.Common/Security/Cryptography/InstanceCrypto.cs +++ b/common/ASC.Common/Security/Cryptography/InstanceCrypto.cs @@ -50,12 +50,14 @@ namespace ASC.Security.Cryptography public byte[] Encrypt(byte[] data) { - var hasher = Rijndael.Create(); + var hasher = Aes.Create(); hasher.Key = EKey(); hasher.IV = new byte[hasher.BlockSize >> 3]; + using var ms = new MemoryStream(); using var ss = new CryptoStream(ms, hasher.CreateEncryptor(), CryptoStreamMode.Write); - ss.Write(data, 0, data.Length); + using var plainTextStream = new MemoryStream(data); + plainTextStream.CopyTo(ss); ss.FlushFinalBlock(); hasher.Clear(); return ms.ToArray(); @@ -63,23 +65,24 @@ namespace ASC.Security.Cryptography public string Decrypt(string data) { - return Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(data))); + return Decrypt(Convert.FromBase64String(data)); } - public byte[] Decrypt(byte[] data) + public string Decrypt(byte[] data) { - var hasher = Rijndael.Create(); + var hasher = Aes.Create(); hasher.Key = EKey(); hasher.IV = new byte[hasher.BlockSize >> 3]; - using var ms = new MemoryStream(data); - using var ss = new CryptoStream(ms, hasher.CreateDecryptor(), CryptoStreamMode.Read); - var buffer = new byte[data.Length]; - var size = ss.Read(buffer, 0, buffer.Length); - hasher.Clear(); - var newBuffer = new byte[size]; - Array.Copy(buffer, newBuffer, size); - return newBuffer; + using (MemoryStream msDecrypt = new MemoryStream(data)) + using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, hasher.CreateDecryptor(), CryptoStreamMode.Read)) + using (StreamReader srDecrypt = new StreamReader(csDecrypt)) + { + + // Read the decrypted bytes from the decrypting stream + // and place them in a string. + return srDecrypt.ReadToEnd(); + } } private byte[] EKey() diff --git a/common/ASC.Core.Common/ASC.Core.Common.csproj b/common/ASC.Core.Common/ASC.Core.Common.csproj index 81eeea64fb..03472ef3f8 100644 --- a/common/ASC.Core.Common/ASC.Core.Common.csproj +++ b/common/ASC.Core.Common/ASC.Core.Common.csproj @@ -2,7 +2,7 @@ 9.0.30729 {A51D0454-4AFA-46DE-89D4-B03D37E1816C} - net5.0 + net6.0 ASC.Core.Common @@ -51,14 +51,13 @@ - all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/common/ASC.Core.Common/Billing/BillingClient.cs b/common/ASC.Core.Common/Billing/BillingClient.cs index f50815148f..297c40b75e 100644 --- a/common/ASC.Core.Common/Billing/BillingClient.cs +++ b/common/ASC.Core.Common/Billing/BillingClient.cs @@ -28,7 +28,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Net; +using System.Net.Http; using System.Runtime.Serialization; using System.Security.Cryptography; using System.ServiceModel; @@ -218,16 +218,17 @@ namespace ASC.Core.Billing { var url = _billingDomain + method; - var request = WebRequest.Create(url); - request.Method = "POST"; - request.Timeout = 60000; - request.ContentType = "application/json"; - + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(url); + request.Method = HttpMethod.Post; if (!string.IsNullOrEmpty(_billingKey)) { request.Headers.Add("Authorization", CreateAuthToken(_billingKey, _billingSecret)); } + using var httpClient = new HttpClient(); + httpClient.Timeout = TimeSpan.FromMilliseconds(60000); + var data = new Dictionary>(); if (!string.IsNullOrEmpty(portalId)) { @@ -244,35 +245,22 @@ namespace ASC.Core.Billing data[parameter.Item1].Add(parameter.Item2); } } - var body = JsonSerializer.Serialize(data); - var bytes = Encoding.UTF8.GetBytes(body ?? ""); - request.ContentLength = bytes.Length; - using (var stream = request.GetRequestStream()) - { - stream.Write(bytes, 0, bytes.Length); - } + var body = JsonSerializer.Serialize(data); + request.Content = new StringContent(body, Encoding.UTF8, "application/json"); string result; - try + using (var response = httpClient.Send(request)) + using (var stream = response.Content.ReadAsStream()) { - using (var response = request.GetResponse()) - using (var stream = response.GetResponseStream()) + if (stream == null) { - if (stream == null) - { - throw new BillingNotConfiguredException("Billing response is null"); - } - using (var readStream = new StreamReader(stream)) - { - result = readStream.ReadToEnd(); - } + throw new BillingNotConfiguredException("Billing response is null"); + } + using (var readStream = new StreamReader(stream)) + { + result = readStream.ReadToEnd(); } - } - catch (WebException) - { - request.Abort(); - throw; } if (string.IsNullOrEmpty(result)) diff --git a/common/ASC.Core.Common/Billing/CouponManager.cs b/common/ASC.Core.Common/Billing/CouponManager.cs index dae8278791..6c801e33f0 100644 --- a/common/ASC.Core.Common/Billing/CouponManager.cs +++ b/common/ASC.Core.Common/Billing/CouponManager.cs @@ -155,7 +155,7 @@ namespace ASC.Core.Common.Billing { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; const string applicationJson = "application/json"; - var httpClient = new HttpClient { BaseAddress = BaseAddress, Timeout = TimeSpan.FromMinutes(3) }; + using var httpClient = new HttpClient { BaseAddress = BaseAddress, Timeout = TimeSpan.FromMinutes(3) }; httpClient.DefaultRequestHeaders.TryAddWithoutValidation("accept", applicationJson); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", applicationJson); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("X-Avangate-Authentication", CreateAuthHeader()); diff --git a/common/ASC.Core.Common/Billing/TariffService.cs b/common/ASC.Core.Common/Billing/TariffService.cs index 25a50a18b1..5deee5f5c1 100644 --- a/common/ASC.Core.Common/Billing/TariffService.cs +++ b/common/ASC.Core.Common/Billing/TariffService.cs @@ -330,7 +330,7 @@ namespace ASC.Core.Billing if (BillingClient.Configured) { try -{ + { var quotas = QuotaService.GetTenantQuotas(); var client = GetBillingClient(); foreach (var pi in client.GetPayments(GetPortalId(tenantId))) @@ -483,7 +483,7 @@ namespace ASC.Core.Billing var r = CoreDbContext.Tariffs .Where(r => r.Tenant == tenant) .OrderByDescending(r => r.Id) - .SingleOrDefault(); + .FirstOrDefault(); if (r == null) return Tariff.CreateDefault(); diff --git a/common/ASC.Core.Common/Configuration/AmiPublicDnsSyncService.cs b/common/ASC.Core.Common/Configuration/AmiPublicDnsSyncService.cs index 75772bd9e7..37f3747262 100644 --- a/common/ASC.Core.Common/Configuration/AmiPublicDnsSyncService.cs +++ b/common/ASC.Core.Common/Configuration/AmiPublicDnsSyncService.cs @@ -28,6 +28,7 @@ using System; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using System.Text.RegularExpressions; using ASC.Common.Module; @@ -77,17 +78,22 @@ namespace ASC.Core.Configuration private static string GetAmiPublicDnsName() { try - { - var request = WebRequest.Create("http://169.254.169.254/latest/meta-data/public-hostname"); - request.Timeout = 5000; - using var responce = request.GetResponse(); - using var stream = responce.GetResponseStream(); + { + var request = new HttpRequestMessage(); + request.RequestUri = new Uri("http://169.254.169.254/latest/meta-data/public-hostname"); + request.Method = HttpMethod.Get; + + using var httpClient = new HttpClient(); + httpClient.Timeout = TimeSpan.FromMilliseconds(5000); + + using var responce = httpClient.Send(request); + using var stream = responce.Content.ReadAsStream(); using var reader = new StreamReader(stream); return reader.ReadToEnd(); } - catch (WebException ex) + catch (HttpRequestException ex) { - if (ex.Status == WebExceptionStatus.ProtocolError) + if (ex.StatusCode == HttpStatusCode.NotFound || ex.StatusCode == HttpStatusCode.Conflict) { throw; } diff --git a/common/ASC.Core.Common/Context/Impl/PaymentManager.cs b/common/ASC.Core.Common/Context/Impl/PaymentManager.cs index 1001c9da25..33b679222d 100644 --- a/common/ASC.Core.Common/Context/Impl/PaymentManager.cs +++ b/common/ASC.Core.Common/Context/Impl/PaymentManager.cs @@ -27,8 +27,7 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.IO; -using System.Net; +using System.Net.Http; using System.Security.Cryptography; using System.Text; using System.Threading; @@ -40,8 +39,6 @@ using ASC.Core.Billing; using Microsoft.AspNetCore.WebUtilities; using Microsoft.Extensions.Configuration; -using Newtonsoft.Json; - namespace ASC.Core { @@ -110,21 +107,15 @@ namespace ASC.Core var now = DateTime.UtcNow; var actionUrl = "/partnerapi/ActivateKey?code=" + HttpUtility.UrlEncode(key) + "&portal=" + HttpUtility.UrlEncode(TenantManager.GetCurrentTenant().TenantAlias); - using var webClient = new WebClient(); - webClient.Headers.Add("Authorization", GetPartnerAuthHeader(actionUrl)); - try - { - webClient.DownloadData(partnerUrl + actionUrl); - } - catch (WebException we) - { - var error = GetException(we); - if (error != null) - { - throw error; - } - throw; - } + + var request = new HttpRequestMessage(); + request.Headers.Add("Authorization", GetPartnerAuthHeader(actionUrl)); + request.RequestUri = new Uri(partnerUrl + actionUrl); + + using var httpClient = new HttpClient(); + + using var response = httpClient.Send(request); + tariffService.ClearCache(TenantManager.GetCurrentTenant().TenantId); var timeout = DateTime.UtcNow - now - TimeSpan.FromSeconds(5); @@ -145,27 +136,5 @@ namespace ASC.Core return string.Format("ASC :{0}:{1}", now, hash); } - private static Exception GetException(WebException we) - { - var response = (HttpWebResponse)we.Response; - if (response.StatusCode == HttpStatusCode.InternalServerError) - { - using var stream = response.GetResponseStream(); - using var reader = new StreamReader(stream, Encoding.UTF8); - var result = reader.ReadToEnd(); - var excInfo = JsonConvert.DeserializeObject(result); - return (Exception)Activator.CreateInstance(Type.GetType(excInfo.exceptionType, true), excInfo.exceptionMessage); - } - return null; - } - - - private class ExceptionJson - { - public string message = null; - public string exceptionMessage = null; - public string exceptionType = null; - public string stackTrace = null; - } } } diff --git a/common/ASC.Core.Common/EF/Model/Audit/LoginEvents.cs b/common/ASC.Core.Common/EF/Model/Audit/LoginEvents.cs index cbe59fc5c2..780087c8a1 100644 --- a/common/ASC.Core.Common/EF/Model/Audit/LoginEvents.cs +++ b/common/ASC.Core.Common/EF/Model/Audit/LoginEvents.cs @@ -1,5 +1,4 @@ -using System.ComponentModel.DataAnnotations.Schema; - + using Microsoft.EntityFrameworkCore; namespace ASC.Core.Common.EF.Model diff --git a/common/ASC.Core.Common/EF/Model/CRM/VoipNumber.cs b/common/ASC.Core.Common/EF/Model/CRM/VoipNumber.cs index 5b0478ce8c..00137b57d7 100644 --- a/common/ASC.Core.Common/EF/Model/CRM/VoipNumber.cs +++ b/common/ASC.Core.Common/EF/Model/CRM/VoipNumber.cs @@ -1,5 +1,4 @@ -using System.ComponentModel.DataAnnotations.Schema; - + using Microsoft.EntityFrameworkCore; namespace ASC.Core.Common.EF.Model diff --git a/common/ASC.Core.Common/EF/Model/Mail/ServerServer.cs b/common/ASC.Core.Common/EF/Model/Mail/ServerServer.cs index 025d4c3c88..1e01690a1f 100644 --- a/common/ASC.Core.Common/EF/Model/Mail/ServerServer.cs +++ b/common/ASC.Core.Common/EF/Model/Mail/ServerServer.cs @@ -1,5 +1,4 @@ -using System.ComponentModel.DataAnnotations.Schema; - + using Microsoft.EntityFrameworkCore; namespace ASC.Core.Common.EF.Model.Mail diff --git a/common/ASC.Core.Common/EF/Model/Resource/ResReserve.cs b/common/ASC.Core.Common/EF/Model/Resource/ResReserve.cs index df2b280536..f95d709a7c 100644 --- a/common/ASC.Core.Common/EF/Model/Resource/ResReserve.cs +++ b/common/ASC.Core.Common/EF/Model/Resource/ResReserve.cs @@ -1,5 +1,4 @@ -using System.ComponentModel.DataAnnotations.Schema; - + using Microsoft.EntityFrameworkCore; namespace ASC.Core.Common.EF.Model.Resource diff --git a/common/ASC.Core.Common/EF/Model/Tenant/DbTenantVersion.cs b/common/ASC.Core.Common/EF/Model/Tenant/DbTenantVersion.cs index 2ab0967974..e6df882bf8 100644 --- a/common/ASC.Core.Common/EF/Model/Tenant/DbTenantVersion.cs +++ b/common/ASC.Core.Common/EF/Model/Tenant/DbTenantVersion.cs @@ -1,5 +1,4 @@ -using System.ComponentModel.DataAnnotations.Schema; - + using Microsoft.EntityFrameworkCore; namespace ASC.Core.Common.EF.Model diff --git a/common/ASC.Core.Common/EF/Model/Tenant/TenantIpRestrictions.cs b/common/ASC.Core.Common/EF/Model/Tenant/TenantIpRestrictions.cs index c7ab5b25d1..f0ae57ac1d 100644 --- a/common/ASC.Core.Common/EF/Model/Tenant/TenantIpRestrictions.cs +++ b/common/ASC.Core.Common/EF/Model/Tenant/TenantIpRestrictions.cs @@ -1,5 +1,4 @@ -using System.ComponentModel.DataAnnotations.Schema; - + using Microsoft.EntityFrameworkCore; namespace ASC.Core.Common.EF.Model diff --git a/common/ASC.Core.Common/EF/Model/User/UserPhoto.cs b/common/ASC.Core.Common/EF/Model/User/UserPhoto.cs index 8ba7b9f441..87a63a75bd 100644 --- a/common/ASC.Core.Common/EF/Model/User/UserPhoto.cs +++ b/common/ASC.Core.Common/EF/Model/User/UserPhoto.cs @@ -1,8 +1,7 @@ using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; using ASC.Core.Common.EF.Model; + using Microsoft.EntityFrameworkCore; namespace ASC.Core.Common.EF { diff --git a/common/ASC.Core.Common/Encryption/EncryptionSettings.cs b/common/ASC.Core.Common/Encryption/EncryptionSettings.cs index 9763b49c03..cdac5e98a1 100644 --- a/common/ASC.Core.Common/Encryption/EncryptionSettings.cs +++ b/common/ASC.Core.Common/Encryption/EncryptionSettings.cs @@ -142,11 +142,8 @@ namespace ASC.Core.Encryption var array = new byte[length]; var array2 = new char[length]; var num = 0; - - using (var rng = new RNGCryptoServiceProvider()) - { - rng.GetBytes(array); - } + + array = RandomNumberGenerator.GetBytes(length); for (var i = 0; i < length; i++) { diff --git a/common/ASC.Core.Common/Notify/Signalr/SignalrServiceClient.cs b/common/ASC.Core.Common/Notify/Signalr/SignalrServiceClient.cs index 9634222310..b7000b5c1a 100644 --- a/common/ASC.Core.Common/Notify/Signalr/SignalrServiceClient.cs +++ b/common/ASC.Core.Common/Notify/Signalr/SignalrServiceClient.cs @@ -26,8 +26,9 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; -using System.Net; +using System.Net.Http; using System.Security.Cryptography; using System.ServiceModel; using System.Text; @@ -362,14 +363,24 @@ namespace ASC.Core.Notify.Signalr private string MakeRequest(string method, object data) { if (!IsAvailable()) return ""; - - using var webClient = new WebClient(); + + var request = new HttpRequestMessage(); + request.Headers.Add("Authorization", CreateAuthToken()); + request.Method = HttpMethod.Post; + request.RequestUri = new Uri(GetMethod(method)); + var jsonData = JsonConvert.SerializeObject(data); - Log.DebugFormat("Method:{0}, Data:{1}", method, jsonData); - webClient.Encoding = Encoding.UTF8; - webClient.Headers.Add("Authorization", CreateAuthToken()); - webClient.Headers[HttpRequestHeader.ContentType] = "application/json"; - return webClient.UploadString(GetMethod(method), jsonData); + Log.DebugFormat("Method:{0}, Data:{1}", method, jsonData); + + request.Content = new StringContent(jsonData, Encoding.UTF8, "application/json"); + + using (var httpClient = new HttpClient()) + using (var response = httpClient.Send(request)) + using (var stream = response.Content.ReadAsStream()) + using (var streamReader = new StreamReader(stream)) + { + return streamReader.ReadToEnd(); + } } private T MakeRequest(string method, object data) diff --git a/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs b/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs index e40176ae3c..4b184ebe98 100644 --- a/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs +++ b/common/ASC.Core.Common/Notify/Telegram/TelegramHelper.cs @@ -138,7 +138,7 @@ namespace ASC.Core.Common.Notify var buf = id.Concat(d).ToArray(); - using var sha = new SHA256CryptoServiceProvider(); + using var sha = SHA256.Create(); return Convert.ToBase64String(sha.ComputeHash(buf)) .Replace('+', '-').Replace('/', '_').Replace("=", ""); // make base64 url safe } diff --git a/common/ASC.Core.Common/Security/Crypto.cs b/common/ASC.Core.Common/Security/Crypto.cs index 82ade75c1c..2f71b74967 100644 --- a/common/ASC.Core.Common/Security/Crypto.cs +++ b/common/ASC.Core.Common/Security/Crypto.cs @@ -58,68 +58,56 @@ namespace ASC.Core public static string GetV(string data, int keyno, bool reverse) { - var hasher = Rijndael.Create(); + var hasher = Aes.Create(); hasher.Key = keyno == 1 ? GetSK1(false) : GetSK2(false); hasher.IV = new byte[hasher.BlockSize >> 3]; - string result; if (reverse) - { + { using var ms = new MemoryStream(); using var ss = new CryptoStream(ms, hasher.CreateEncryptor(), CryptoStreamMode.Write); - var buffer = Encoding.Unicode.GetBytes(data); - ss.Write(buffer, 0, buffer.Length); + using var plainTextStream = new MemoryStream(Convert.FromBase64String(data)); + plainTextStream.CopyTo(ss); ss.FlushFinalBlock(); hasher.Clear(); - result = Convert.ToBase64String(ms.ToArray()); + return Convert.ToBase64String(ms.ToArray()); } else { - var bytes = Convert.FromBase64String(data); - using var ms = new MemoryStream(bytes); + using var ms = new MemoryStream(Convert.FromBase64String(data)); using var ss = new CryptoStream(ms, hasher.CreateDecryptor(), CryptoStreamMode.Read); - var buffer = new byte[bytes.Length]; - var size = ss.Read(buffer, 0, buffer.Length); + using var plainTextStream = new MemoryStream(); + ss.CopyTo(plainTextStream); hasher.Clear(); - var newBuffer = new byte[size]; - Array.Copy(buffer, newBuffer, size); - result = Encoding.Unicode.GetString(newBuffer); + return Encoding.Unicode.GetString(plainTextStream.ToArray()); } - - return result; } internal static byte[] GetV(byte[] data, int keyno, bool reverse) { - var hasher = Rijndael.Create(); + var hasher = Aes.Create(); hasher.Key = keyno == 1 ? GetSK1(false) : GetSK2(false); hasher.IV = new byte[hasher.BlockSize >> 3]; - byte[] result; if (reverse) { using var ms = new MemoryStream(); using var ss = new CryptoStream(ms, hasher.CreateEncryptor(), CryptoStreamMode.Write); - var buffer = data; - ss.Write(buffer, 0, buffer.Length); + using var plainTextStream = new MemoryStream(data); + plainTextStream.CopyTo(ss); ss.FlushFinalBlock(); hasher.Clear(); - result = ms.ToArray(); + return ms.ToArray(); } else { - var bytes = data; - using var ms = new MemoryStream(bytes); + using var ms = new MemoryStream(data); using var ss = new CryptoStream(ms, hasher.CreateDecryptor(), CryptoStreamMode.Read); - var buffer = new byte[bytes.Length]; - var size = ss.Read(buffer, 0, buffer.Length); + using var plainTextStream = new MemoryStream(); + ss.CopyTo(plainTextStream); hasher.Clear(); - var newBuffer = new byte[size]; - Array.Copy(buffer, newBuffer, size); - result = newBuffer; + return plainTextStream.ToArray(); } - - return result; } } } \ No newline at end of file diff --git a/common/ASC.Data.Backup.Core/ASC.Data.Backup.Core.csproj b/common/ASC.Data.Backup.Core/ASC.Data.Backup.Core.csproj index 2a644df0dd..d8ca0f0d76 100644 --- a/common/ASC.Data.Backup.Core/ASC.Data.Backup.Core.csproj +++ b/common/ASC.Data.Backup.Core/ASC.Data.Backup.Core.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 Library NU1701 @@ -13,8 +13,6 @@ - - true @@ -22,10 +20,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/common/ASC.Data.Backup.Core/Tasks/KeyHelper.cs b/common/ASC.Data.Backup.Core/Tasks/KeyHelper.cs index 7647abc75e..e0666604c1 100644 --- a/common/ASC.Data.Backup.Core/Tasks/KeyHelper.cs +++ b/common/ASC.Data.Backup.Core/Tasks/KeyHelper.cs @@ -24,8 +24,6 @@ */ -using System.IO; - using ASC.Common.Utils; using ASC.Data.Backup.Tasks.Modules; diff --git a/common/ASC.Data.Backup.Core/Utils/ConfigurationProvider.cs b/common/ASC.Data.Backup.Core/Utils/ConfigurationProvider.cs index 1e1c4d52f1..7770775cf6 100644 --- a/common/ASC.Data.Backup.Core/Utils/ConfigurationProvider.cs +++ b/common/ASC.Data.Backup.Core/Utils/ConfigurationProvider.cs @@ -24,8 +24,8 @@ */ -using System.Configuration; - +using System.Configuration; + namespace ASC.Data.Backup.Utils { internal static class ConfigurationProvider diff --git a/common/ASC.Data.Encryption/ASC.Data.Encryption.csproj b/common/ASC.Data.Encryption/ASC.Data.Encryption.csproj index b8c0a6882f..e5cd8e0c70 100644 --- a/common/ASC.Data.Encryption/ASC.Data.Encryption.csproj +++ b/common/ASC.Data.Encryption/ASC.Data.Encryption.csproj @@ -1,7 +1,7 @@ - net5.0 + net6.0 false diff --git a/common/ASC.Data.Encryption/Metadata.cs b/common/ASC.Data.Encryption/Metadata.cs index d198e1c294..5dfc16e51e 100644 --- a/common/ASC.Data.Encryption/Metadata.cs +++ b/common/ASC.Data.Encryption/Metadata.cs @@ -186,16 +186,15 @@ namespace ASC.Data.Encryption } public SymmetricAlgorithm GetCryptographyAlgorithm() - { - return new RijndaelManaged - { - KeySize = keySize, - BlockSize = blockSize, - Key = Key, - IV = IV, - Padding = PaddingMode.PKCS7, - Mode = CipherMode.CBC - }; + { + var aes = Aes.Create(); + aes.KeySize = keySize; + aes.BlockSize = blockSize; + aes.Key = Key; + aes.IV = IV; + aes.Padding = PaddingMode.PKCS7; + aes.Mode = CipherMode.CBC; + return aes; } public void ComputeAndWriteHmacHash(Stream stream) @@ -245,10 +244,7 @@ namespace ASC.Data.Encryption { var random = new byte[length]; - using (var rng = new RNGCryptoServiceProvider()) - { - rng.GetBytes(random); - } + random = RandomNumberGenerator.GetBytes(length); return random; } @@ -269,7 +265,7 @@ namespace ASC.Data.Encryption { var hmacKey = new byte[hmacKeyLength]; - using (var sha512 = new SHA512Managed()) + using (var sha512 = SHA512.Create()) { hmacKey = sha512.ComputeHash(Key); } diff --git a/common/ASC.Data.Reassigns/ASC.Data.Reassigns.csproj b/common/ASC.Data.Reassigns/ASC.Data.Reassigns.csproj index 2b83567119..c1a8ad2ff4 100644 --- a/common/ASC.Data.Reassigns/ASC.Data.Reassigns.csproj +++ b/common/ASC.Data.Reassigns/ASC.Data.Reassigns.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 @@ -10,10 +10,6 @@ 1701;1702;NU1701; - - - - diff --git a/common/ASC.Data.Storage/ASC.Data.Storage.csproj b/common/ASC.Data.Storage/ASC.Data.Storage.csproj index 1f4b46a239..a6e77e865c 100644 --- a/common/ASC.Data.Storage/ASC.Data.Storage.csproj +++ b/common/ASC.Data.Storage/ASC.Data.Storage.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false @@ -42,9 +42,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + diff --git a/common/ASC.Data.Storage/DiscStorage/DiscDataHandler.cs b/common/ASC.Data.Storage/DiscStorage/DiscDataHandler.cs index 9c2aceaa12..b0a76d3f89 100644 --- a/common/ASC.Data.Storage/DiscStorage/DiscDataHandler.cs +++ b/common/ASC.Data.Storage/DiscStorage/DiscDataHandler.cs @@ -83,7 +83,6 @@ namespace ASC.Data.Storage.DiscStorage { await context.Response.SendFileAsync(path); } - context.Response.ContentType = MimeMapping.GetMimeMapping(path); //TODO //context.Response.Cache.SetVaryByCustom("*"); diff --git a/common/ASC.Data.Storage/DiscStorage/MappedPath.cs b/common/ASC.Data.Storage/DiscStorage/MappedPath.cs index 0156727572..07cc391b88 100644 --- a/common/ASC.Data.Storage/DiscStorage/MappedPath.cs +++ b/common/ASC.Data.Storage/DiscStorage/MappedPath.cs @@ -25,7 +25,6 @@ using System.Collections.Generic; -using System.IO; using ASC.Common.Utils; diff --git a/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs b/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs index 9699ec06cb..74d64519b6 100644 --- a/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs +++ b/common/ASC.Data.Storage/GoogleCloud/GoogleCloudStorage.cs @@ -31,7 +31,6 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; -using System.Net; using System.Net.Http; using System.Text; using System.Threading; @@ -71,7 +70,7 @@ namespace ASC.Data.Storage.GoogleCloud private Uri _bucketSSlRoot; private bool _lowerCasing = true; - + public GoogleCloudStorage( TempStream tempStream, TenantManager tenantManager, @@ -760,32 +759,17 @@ namespace ASC.Data.Storage.GoogleCloud var totalBytes = "*"; - var BufferSize = 2 * 4096; - if (chunkLength != defaultChunkSize) totalBytes = Convert.ToString((chunkNumber - 1) * defaultChunkSize + chunkLength); var contentRangeHeader = string.Format("bytes {0}-{1}/{2}", bytesRangeStart, bytesRangeEnd, totalBytes); - var request = HttpWebRequest.CreateHttp(uploadUri); - - request.Method = HttpMethod.Put.ToString(); - request.ContentLength = chunkLength; + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(uploadUri); + request.Method = HttpMethod.Put; request.Headers.Add("Content-Range", contentRangeHeader); + request.Content = new StreamContent(stream); - using (var rs = request.GetRequestStream()) - { - var buffer = new byte[BufferSize]; - - int readed; - - while ((readed = stream.Read(buffer, 0, BufferSize)) != 0) - { - rs.Write(buffer, 0, readed); - } - - stream.Close(); - } long MAX_RETRIES = 100; int millisecondsTimeout; @@ -798,16 +782,15 @@ namespace ASC.Data.Storage.GoogleCloud try { - var response = request.GetResponse(); - var status = ((HttpWebResponse)response).StatusCode; + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + var status = response.StatusCode; break; } - catch (WebException ex) + catch (HttpRequestException ex) { - var response = (HttpWebResponse)ex.Response; - - var status = (int)response.StatusCode; + var status = (int)ex.StatusCode; if (status == 408 || status == 500 || status == 502 || status == 503 || status == 504) { diff --git a/common/ASC.Data.Storage/WebPath.cs b/common/ASC.Data.Storage/WebPath.cs index 6091e4aada..4c89ff377f 100644 --- a/common/ASC.Data.Storage/WebPath.cs +++ b/common/ASC.Data.Storage/WebPath.cs @@ -30,6 +30,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using ASC.Common; using ASC.Common.Logging; @@ -237,10 +238,13 @@ namespace ASC.Data.Storage { try { - var request = (HttpWebRequest)WebRequest.Create(path); - request.Method = "HEAD"; - using var resp = (HttpWebResponse)request.GetResponse(); - return resp.StatusCode == HttpStatusCode.OK; + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(path); + request.Method = HttpMethod.Head; + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + + return response.StatusCode == HttpStatusCode.OK; } catch (Exception) { diff --git a/common/ASC.FederatedLogin/ASC.FederatedLogin.csproj b/common/ASC.FederatedLogin/ASC.FederatedLogin.csproj index a9a523be3d..8176a612b4 100644 --- a/common/ASC.FederatedLogin/ASC.FederatedLogin.csproj +++ b/common/ASC.FederatedLogin/ASC.FederatedLogin.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 NU1701 diff --git a/common/ASC.FederatedLogin/Helpers/OAuth20TokenHelper.cs b/common/ASC.FederatedLogin/Helpers/OAuth20TokenHelper.cs index 740e474379..1f2ec7bfa4 100644 --- a/common/ASC.FederatedLogin/Helpers/OAuth20TokenHelper.cs +++ b/common/ASC.FederatedLogin/Helpers/OAuth20TokenHelper.cs @@ -49,7 +49,7 @@ namespace ASC.FederatedLogin.Helpers ConsumerFactory = consumerFactory; } - public string RequestCode(string scope = null, Dictionary additionalArgs = null) where T : Consumer, IOAuthProvider, new() + public string RequestCode(string scope = null, IDictionary additionalArgs = null, IDictionary additionalStateArgs = null) where T : Consumer, IOAuthProvider, new() { var loginProvider = ConsumerFactory.Get(); var requestUrl = loginProvider.CodeUrl; @@ -67,7 +67,20 @@ namespace ASC.FederatedLogin.Helpers if (!string.IsNullOrEmpty(scope)) query += $"&scope={HttpUtility.UrlEncode(scope)}"; var u = HttpContextAccessor.HttpContext.Request.GetUrlRewriter(); - var state = HttpUtility.UrlEncode(new UriBuilder(u.Scheme, u.Host, u.Port, $"thirdparty/{loginProvider.Name.ToLower()}/code").Uri.AbsoluteUri); + + var stateUriBuilder = new UriBuilder(u.Scheme, u.Host, u.Port, $"thirdparty/{loginProvider.Name.ToLower()}/code"); + + if (additionalStateArgs != null && additionalStateArgs.Any()) + { + var stateQuery = ""; + stateQuery = additionalStateArgs.Keys + .Where(a => a != null) + .Aggregate(stateQuery, (current, a) => a != null ? $"{current}&{a.Trim()}={additionalStateArgs[a] ?? "".Trim()}" : null); + + stateUriBuilder.Query = stateQuery.Substring(1); + } + + var state = HttpUtility.UrlEncode(stateUriBuilder.Uri.AbsoluteUri); query += $"&state={state}"; if (additionalArgs != null) diff --git a/common/ASC.FederatedLogin/Helpers/RequestHelper.cs b/common/ASC.FederatedLogin/Helpers/RequestHelper.cs index 0e490a3610..395b2ceb00 100644 --- a/common/ASC.FederatedLogin/Helpers/RequestHelper.cs +++ b/common/ASC.FederatedLogin/Helpers/RequestHelper.cs @@ -27,7 +27,7 @@ using System; using System.Collections.Generic; using System.IO; -using System.Net; +using System.Net.Http; using System.Text; namespace ASC.FederatedLogin.Helpers @@ -38,9 +38,13 @@ namespace ASC.FederatedLogin.Helpers { if (string.IsNullOrEmpty(uri)) throw new ArgumentNullException("uri"); - var request = WebRequest.Create(uri); - request.Method = method; - request.Timeout = timeout; + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(uri); + request.Method = new HttpMethod(method); + + using var httpClient = new HttpClient(); + httpClient.Timeout = TimeSpan.FromMilliseconds(timeout); + if (headers != null) { foreach (var key in headers.Keys) @@ -49,33 +53,22 @@ namespace ASC.FederatedLogin.Helpers } } - - if (!string.IsNullOrEmpty(contentType)) - { - request.ContentType = contentType; - } - var bytes = Encoding.UTF8.GetBytes(body ?? ""); - if (request.Method != "GET" && bytes.Length > 0) + if (request.Method != HttpMethod.Get && bytes.Length > 0) { - request.ContentLength = bytes.Length; - using var stream = request.GetRequestStream(); - stream.Write(bytes, 0, bytes.Length); + request.Content = new ByteArrayContent(bytes, 0, bytes.Length); + if (!string.IsNullOrEmpty(contentType)) + { + request.Headers.Add("Content-Type", contentType); + } } - try - { - using var response = request.GetResponse(); - using var stream = response.GetResponseStream(); - if (stream == null) return null; - using var readStream = new StreamReader(stream); - return readStream.ReadToEnd(); - } - catch (WebException) - { - request.Abort(); - throw; - } + using var response = httpClient.Send(request); + using var stream = response.Content.ReadAsStream(); + if (stream == null) return null; + using var readStream = new StreamReader(stream); + return readStream.ReadToEnd(); + } } } \ No newline at end of file diff --git a/common/ASC.FederatedLogin/Login.cs b/common/ASC.FederatedLogin/Login.cs index cb5993ddbe..ad3eb527ee 100644 --- a/common/ASC.FederatedLogin/Login.cs +++ b/common/ASC.FederatedLogin/Login.cs @@ -26,6 +26,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; using System.Text.Json; using System.Threading; @@ -104,10 +105,22 @@ namespace ASC.FederatedLogin { try { - var profile = ProviderManager.Process(Auth, context, _params); + var desktop = _params.ContainsKey("desktop") && _params["desktop"] == "true"; + IDictionary additionalStateArgs = null; + + if (desktop) + { + additionalStateArgs = context.Request.Query.ToDictionary(r => r.Key, r => r.Value.FirstOrDefault()); + if (!additionalStateArgs.ContainsKey("desktop")) + { + additionalStateArgs.Add("desktop", "true"); + } + } + + var profile = ProviderManager.Process(Auth, context, null, additionalStateArgs); if (profile != null) { - await SendClientData(context, profile); + await SendJsCallback(context, profile); } } catch (ThreadAbortException) @@ -116,7 +129,7 @@ namespace ASC.FederatedLogin } catch (Exception ex) { - await SendClientData(context, LoginProfile.FromError(Signature, InstanceCrypto, ex)); + await SendJsCallback(context, LoginProfile.FromError(Signature, InstanceCrypto, ex)); } } else @@ -179,48 +192,16 @@ namespace ASC.FederatedLogin get { return false; } } - private async Task SendClientData(HttpContext context, LoginProfile profile) - { - switch (Mode) - { - case LoginMode.Redirect: - await RedirectToReturnUrl(context, profile); - break; - case LoginMode.Popup: - await SendJsCallback(context, profile); - break; - } - } - private async Task SendJsCallback(HttpContext context, LoginProfile profile) { //Render a page context.Response.ContentType = "text/html"; - await context.Response.WriteAsync(JsCallbackHelper.GetCallbackPage().Replace("%PROFILE%", profile.ToJson()).Replace("%CALLBACK%", Callback)); - } - - private async Task RedirectToReturnUrl(HttpContext context, LoginProfile profile) - { - var useMinimalProfile = Minimal; - if (useMinimalProfile) - profile = profile.GetMinimalProfile(); //Only id and provider - - if (context.Session != null && !useMinimalProfile) - { - //Store in session - context.Response.Redirect(new Uri(ReturnUrl, UriKind.Absolute).AddProfileSession(profile, context).ToString(), true); - } - else if (MemoryCache != null && !useMinimalProfile) - { - context.Response.Redirect(new Uri(ReturnUrl, UriKind.Absolute).AddProfileCache(profile, MemoryCache).ToString(), true); - } - else - { - context.Response.Redirect(new Uri(ReturnUrl, UriKind.Absolute).AddProfile(profile).ToString(), true); - } - - await context.Response.CompleteAsync(); - return; + await context.Response.WriteAsync( + JsCallbackHelper.GetCallbackPage() + .Replace("%PROFILE%", $"\"{profile.Serialized}\"") + .Replace("%CALLBACK%", Callback) + .Replace("%DESKTOP%", (Mode == LoginMode.Redirect).ToString().ToLowerInvariant()) + ); } } diff --git a/common/ASC.FederatedLogin/LoginProviders/BaseLoginProvider.cs b/common/ASC.FederatedLogin/LoginProviders/BaseLoginProvider.cs index b8a7e7cf63..89cefcaaed 100644 --- a/common/ASC.FederatedLogin/LoginProviders/BaseLoginProvider.cs +++ b/common/ASC.FederatedLogin/LoginProviders/BaseLoginProvider.cs @@ -113,11 +113,11 @@ namespace ASC.FederatedLogin.LoginProviders InstanceCrypto = instanceCrypto; } - public virtual LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params) + public virtual LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params, IDictionary additionalStateArgs = null) { try { - var token = Auth(context, Scopes, out var redirect); + var token = Auth(context, Scopes, out var redirect, @params, additionalStateArgs); if (redirect) { @@ -136,7 +136,7 @@ namespace ASC.FederatedLogin.LoginProviders } } - protected virtual OAuth20Token Auth(HttpContext context, string scopes, out bool redirect, Dictionary additionalArgs = null) + protected virtual OAuth20Token Auth(HttpContext context, string scopes, out bool redirect, IDictionary additionalArgs = null, IDictionary additionalStateArgs = null) { var error = context.Request.Query["error"]; if (!string.IsNullOrEmpty(error)) @@ -151,7 +151,7 @@ namespace ASC.FederatedLogin.LoginProviders var code = context.Request.Query["code"]; if (string.IsNullOrEmpty(code)) { - context.Response.Redirect(OAuth20TokenHelper.RequestCode(scopes, additionalArgs)); + context.Response.Redirect(OAuth20TokenHelper.RequestCode(scopes, additionalArgs, additionalStateArgs)); redirect = true; return null; } diff --git a/common/ASC.FederatedLogin/LoginProviders/GosUslugiLoginProvider.cs b/common/ASC.FederatedLogin/LoginProviders/GosUslugiLoginProvider.cs index f7ea25bd23..a9e477a798 100644 --- a/common/ASC.FederatedLogin/LoginProviders/GosUslugiLoginProvider.cs +++ b/common/ASC.FederatedLogin/LoginProviders/GosUslugiLoginProvider.cs @@ -114,7 +114,7 @@ namespace ASC.FederatedLogin.LoginProviders } - public override LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params) + public override LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params, IDictionary additionalStateArgs = null) { try { @@ -142,7 +142,7 @@ namespace ASC.FederatedLogin.LoginProviders } } - protected override OAuth20Token Auth(HttpContext context, string scopes, out bool redirect, Dictionary additionalArgs = null) + protected override OAuth20Token Auth(HttpContext context, string scopes, out bool redirect, IDictionary additionalArgs = null, IDictionary additionalStateArgs = null) { var error = context.Request.Query["error"]; if (!string.IsNullOrEmpty(error)) diff --git a/common/ASC.FederatedLogin/LoginProviders/ILoginProvider.cs b/common/ASC.FederatedLogin/LoginProviders/ILoginProvider.cs index 99cd36eb69..c8229872ac 100644 --- a/common/ASC.FederatedLogin/LoginProviders/ILoginProvider.cs +++ b/common/ASC.FederatedLogin/LoginProviders/ILoginProvider.cs @@ -34,7 +34,7 @@ namespace ASC.FederatedLogin.LoginProviders { public interface ILoginProvider : IOAuthProvider { - LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params); + LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params, IDictionary additionalStateArgs); LoginProfile GetLoginProfile(string accessToken); } diff --git a/common/ASC.FederatedLogin/LoginProviders/MailRuLoginProvider.cs b/common/ASC.FederatedLogin/LoginProviders/MailRuLoginProvider.cs index 438677a5ae..6f73b71e5d 100644 --- a/common/ASC.FederatedLogin/LoginProviders/MailRuLoginProvider.cs +++ b/common/ASC.FederatedLogin/LoginProviders/MailRuLoginProvider.cs @@ -97,7 +97,7 @@ namespace ASC.FederatedLogin.LoginProviders { } - public override LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params) + public override LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params, IDictionary additionalStateArgs = null) { try { diff --git a/common/ASC.FederatedLogin/LoginProviders/OpenIdLoginProvider.cs b/common/ASC.FederatedLogin/LoginProviders/OpenIdLoginProvider.cs index 90d82882d8..285710cfdb 100644 --- a/common/ASC.FederatedLogin/LoginProviders/OpenIdLoginProvider.cs +++ b/common/ASC.FederatedLogin/LoginProviders/OpenIdLoginProvider.cs @@ -53,7 +53,7 @@ namespace ASC.FederatedLogin.LoginProviders ConsumerFactory = consumerFactory; } - public LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params) + public LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params, IDictionary additionalStateArgs = null) { var response = Openid.GetResponse(); if (response == null) diff --git a/common/ASC.FederatedLogin/LoginProviders/ProviderManager.cs b/common/ASC.FederatedLogin/LoginProviders/ProviderManager.cs index b7abd411b1..97953837bc 100644 --- a/common/ASC.FederatedLogin/LoginProviders/ProviderManager.cs +++ b/common/ASC.FederatedLogin/LoginProviders/ProviderManager.cs @@ -71,9 +71,9 @@ namespace ASC.FederatedLogin.LoginProviders : ConsumerFactory.GetByKey(providerType) as ILoginProvider; } - public LoginProfile Process(string providerType, HttpContext context, IDictionary @params) + public LoginProfile Process(string providerType, HttpContext context, IDictionary @params, IDictionary additionalStateArgs = null) { - return GetLoginProvider(providerType).ProcessAuthoriztion(context, @params); + return GetLoginProvider(providerType).ProcessAuthoriztion(context, @params, additionalStateArgs); } public LoginProfile GetLoginProfile(string providerType, string accessToken) diff --git a/common/ASC.FederatedLogin/LoginProviders/VKLoginProvider.cs b/common/ASC.FederatedLogin/LoginProviders/VKLoginProvider.cs index a14708cbec..1a4f6b9516 100644 --- a/common/ASC.FederatedLogin/LoginProviders/VKLoginProvider.cs +++ b/common/ASC.FederatedLogin/LoginProviders/VKLoginProvider.cs @@ -102,7 +102,7 @@ namespace ASC.FederatedLogin.LoginProviders } - public override LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params) + public override LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params, IDictionary additionalStateArgs = null) { try { @@ -111,7 +111,7 @@ namespace ASC.FederatedLogin.LoginProviders { { "revoke", "1" } } - : null); + : null, additionalStateArgs); if (redirect) { diff --git a/common/ASC.FederatedLogin/LoginProviders/YandexLoginProvider.cs b/common/ASC.FederatedLogin/LoginProviders/YandexLoginProvider.cs index 363d05969a..96a96c4840 100644 --- a/common/ASC.FederatedLogin/LoginProviders/YandexLoginProvider.cs +++ b/common/ASC.FederatedLogin/LoginProviders/YandexLoginProvider.cs @@ -94,7 +94,7 @@ namespace ASC.FederatedLogin.LoginProviders { } - public override LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params) + public override LoginProfile ProcessAuthoriztion(HttpContext context, IDictionary @params, IDictionary additionalStateArgs = null) { try { @@ -103,7 +103,7 @@ namespace ASC.FederatedLogin.LoginProviders { { "force_confirm", "true" } } - : null); + : null, additionalStateArgs); if (redirect) { return null; diff --git a/common/ASC.FederatedLogin/Profile/LoginProfile.cs b/common/ASC.FederatedLogin/Profile/LoginProfile.cs index bcdf9130c4..9a1f6911f8 100644 --- a/common/ASC.FederatedLogin/Profile/LoginProfile.cs +++ b/common/ASC.FederatedLogin/Profile/LoginProfile.cs @@ -373,7 +373,7 @@ namespace ASC.FederatedLogin.Profile internal void FromTransport(string transportstring) { - var serialized = Encoding.UTF8.GetString(InstanceCrypto.Decrypt(WebEncoders.Base64UrlDecode(transportstring))); + var serialized = InstanceCrypto.Decrypt(WebEncoders.Base64UrlDecode(transportstring)); FromSerializedString(serialized); } diff --git a/common/ASC.FederatedLogin/callback.htm b/common/ASC.FederatedLogin/callback.htm index dbe2cb1830..5e4ef63381 100644 --- a/common/ASC.FederatedLogin/callback.htm +++ b/common/ASC.FederatedLogin/callback.htm @@ -2,12 +2,17 @@ diff --git a/common/ASC.Feed/ASC.Feed.csproj b/common/ASC.Feed/ASC.Feed.csproj index c451286886..50c014837d 100644 --- a/common/ASC.Feed/ASC.Feed.csproj +++ b/common/ASC.Feed/ASC.Feed.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Library diff --git a/common/ASC.IPSecurity/ASC.IPSecurity.csproj b/common/ASC.IPSecurity/ASC.IPSecurity.csproj index a4add3431c..292cea489d 100644 --- a/common/ASC.IPSecurity/ASC.IPSecurity.csproj +++ b/common/ASC.IPSecurity/ASC.IPSecurity.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Library diff --git a/common/ASC.MessagingSystem/ASC.MessagingSystem.csproj b/common/ASC.MessagingSystem/ASC.MessagingSystem.csproj index 1e594deac4..0f8062e382 100644 --- a/common/ASC.MessagingSystem/ASC.MessagingSystem.csproj +++ b/common/ASC.MessagingSystem/ASC.MessagingSystem.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Library diff --git a/common/ASC.Notify.Textile/ASC.Notify.Textile.csproj b/common/ASC.Notify.Textile/ASC.Notify.Textile.csproj index 4c84426fc0..cd9275d33f 100644 --- a/common/ASC.Notify.Textile/ASC.Notify.Textile.csproj +++ b/common/ASC.Notify.Textile/ASC.Notify.Textile.csproj @@ -1,6 +1,6 @@  - net5.0 + net6.0 ASC.Notify.Textile Ascensio System SIA ASC.Notify.Textile diff --git a/common/ASC.Textile/ASC.Textile.csproj b/common/ASC.Textile/ASC.Textile.csproj index 7e64ad84c6..eb75aeae25 100644 --- a/common/ASC.Textile/ASC.Textile.csproj +++ b/common/ASC.Textile/ASC.Textile.csproj @@ -1,7 +1,7 @@  9.0.30729 - net5.0 + net6.0 diff --git a/common/ASC.VoipService/ASC.VoipService.csproj b/common/ASC.VoipService/ASC.VoipService.csproj index dc32faf033..0d3f8982d8 100644 --- a/common/ASC.VoipService/ASC.VoipService.csproj +++ b/common/ASC.VoipService/ASC.VoipService.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Library diff --git a/common/ASC.VoipService/Twilio/TwilioResponseHelper.cs b/common/ASC.VoipService/Twilio/TwilioResponseHelper.cs index 6078d13d4b..e19a13c3ba 100644 --- a/common/ASC.VoipService/Twilio/TwilioResponseHelper.cs +++ b/common/ASC.VoipService/Twilio/TwilioResponseHelper.cs @@ -77,7 +77,7 @@ namespace ASC.VoipService.Twilio { if (!string.IsNullOrEmpty(settings.GreetingAudio)) { - response.Play(Uri.EscapeUriString(settings.GreetingAudio)); + response.Play(Uri.EscapeDataString(settings.GreetingAudio)); } response.Enqueue(settings.Queue.Name, GetEcho("Enqueue", agent != null), "POST", @@ -129,7 +129,7 @@ namespace ASC.VoipService.Twilio if (!string.IsNullOrEmpty(queue.WaitUrl)) { var gather = new Gather(method: "POST", action: GetEcho("gatherQueue")); - gather.Play(Uri.EscapeUriString(queue.WaitUrl)); + gather.Play(Uri.EscapeDataString(queue.WaitUrl)); response.Gather(gather); } else @@ -156,7 +156,7 @@ namespace ASC.VoipService.Twilio { if (to == "hold") { - return new VoiceResponse().Play(Uri.EscapeUriString(settings.HoldAudio), 0); + return new VoiceResponse().Play(Uri.EscapeDataString(settings.HoldAudio), 0); } @@ -199,7 +199,7 @@ namespace ASC.VoipService.Twilio { return string.IsNullOrEmpty(settings.VoiceMail) ? response.Say("") - : response.Play(Uri.EscapeUriString(settings.VoiceMail)).Record(method: "POST", action: GetEcho("voiceMail"), maxLength: 30); + : response.Play(Uri.EscapeDataString(settings.VoiceMail)).Record(method: "POST", action: GetEcho("voiceMail"), maxLength: 30); } public string GetEcho(string action, bool user = true) diff --git a/common/ASC.Webhooks.Core/ASC.Webhooks.Core.csproj b/common/ASC.Webhooks.Core/ASC.Webhooks.Core.csproj index 24eb52e07c..757b905bcd 100644 --- a/common/ASC.Webhooks.Core/ASC.Webhooks.Core.csproj +++ b/common/ASC.Webhooks.Core/ASC.Webhooks.Core.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false $(DefaultItemExcludes); false diff --git a/common/Tests/ASC.Common.Tests/ASC.Common.Tests.csproj b/common/Tests/ASC.Common.Tests/ASC.Common.Tests.csproj index 66983e4f89..d6737b9aa7 100644 --- a/common/Tests/ASC.Common.Tests/ASC.Common.Tests.csproj +++ b/common/Tests/ASC.Common.Tests/ASC.Common.Tests.csproj @@ -1,7 +1,7 @@ - net5.0 + net6.0 diff --git a/common/Tests/ASC.Core.Common.Tests/ASC.Core.Common.Tests.csproj b/common/Tests/ASC.Core.Common.Tests/ASC.Core.Common.Tests.csproj index b7686f9437..aed8b57891 100644 --- a/common/Tests/ASC.Core.Common.Tests/ASC.Core.Common.Tests.csproj +++ b/common/Tests/ASC.Core.Common.Tests/ASC.Core.Common.Tests.csproj @@ -1,7 +1,7 @@ - net5.0 + net6.0 diff --git a/common/Tests/ASC.Notify.Textile.Tests/ASC.Notify.Textile.Tests.csproj b/common/Tests/ASC.Notify.Textile.Tests/ASC.Notify.Textile.Tests.csproj index 75ddef871c..b4f237d098 100644 --- a/common/Tests/ASC.Notify.Textile.Tests/ASC.Notify.Textile.Tests.csproj +++ b/common/Tests/ASC.Notify.Textile.Tests/ASC.Notify.Textile.Tests.csproj @@ -1,7 +1,7 @@ - net5.0 + net6.0 diff --git a/common/Tests/ASC.Web.Api.Tests/ASC.Web.Api.Tests.csproj b/common/Tests/ASC.Web.Api.Tests/ASC.Web.Api.Tests.csproj index 2b3f8ab9e7..ad20bfb09e 100644 --- a/common/Tests/ASC.Web.Api.Tests/ASC.Web.Api.Tests.csproj +++ b/common/Tests/ASC.Web.Api.Tests/ASC.Web.Api.Tests.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false diff --git a/common/Tests/ASC.Webhooks.Tests/ASC.Webhooks.Tests.csproj b/common/Tests/ASC.Webhooks.Tests/ASC.Webhooks.Tests.csproj index 057cdacd62..76510b0ef5 100644 --- a/common/Tests/ASC.Webhooks.Tests/ASC.Webhooks.Tests.csproj +++ b/common/Tests/ASC.Webhooks.Tests/ASC.Webhooks.Tests.csproj @@ -1,18 +1,18 @@  - net5.0 + net6.0 false - - + + - - - + + + diff --git a/common/Tests/Frontend.Translations.Tests/Frontend.Translations.Tests.csproj b/common/Tests/Frontend.Translations.Tests/Frontend.Translations.Tests.csproj index 8c2f652f43..d9fc2f3069 100644 --- a/common/Tests/Frontend.Translations.Tests/Frontend.Translations.Tests.csproj +++ b/common/Tests/Frontend.Translations.Tests/Frontend.Translations.Tests.csproj @@ -1,7 +1,7 @@ - net5.0 + net6.0 false diff --git a/common/Tests/Frontend.Translations.Tests/LocalesTest.cs b/common/Tests/Frontend.Translations.Tests/LocalesTest.cs index 499749d709..cc3115448d 100644 --- a/common/Tests/Frontend.Translations.Tests/LocalesTest.cs +++ b/common/Tests/Frontend.Translations.Tests/LocalesTest.cs @@ -428,8 +428,9 @@ namespace Frontend.Translations.Tests .Select(item => item.Key); var allJsTranslationKeys = JavaScriptFiles + .Where(f => !f.Path.Contains("Banner.js")) // skip Banner.js (translations from firebase) .SelectMany(j => j.TranslationKeys) - .Select(k => k.Replace("Common:", "").Replace("Translations:", "")) + .Select(k => k.Replace("Common:", "").Replace("Translations:", "").Replace("Home:", "")) .Distinct(); var notFoundJsKeys = allJsTranslationKeys.Except(allEnKeys); @@ -811,6 +812,83 @@ namespace Frontend.Translations.Tests Assert.AreEqual(0, NotTranslatedToasts.Count, message); } + [Test] + public void WrongTranslationVariablesTest() + { + var message = $"Next keys have wrong variables:\r\n\r\n"; + var regVariables = new Regex("\\{\\{([^\\{].?[^\\}]+)\\}\\}", RegexOptions.Compiled | RegexOptions.Multiline); + + var groupedByLng = TranslationFiles + .GroupBy(t => t.Language) + .Select(g => new + { + Language = g.Key, + TranslationsWithVariables = g.ToList() + .SelectMany(t => t.Translations) + .Where(k => k.Value.IndexOf("{{") != -1) + .Select(t => new + { + t.Key, + t.Value, + Variables = regVariables.Matches(t.Value) + .Select(m => m.Groups[1]?.Value?.Trim().Replace(", lowercase", "")) + .ToList() + }) + .ToList() + }) + .ToList(); + + var enWithVariables = groupedByLng + .Where(t => t.Language == "en") + .SelectMany(t => t.TranslationsWithVariables) + .ToList(); + + var otherLanguagesWithVariables = groupedByLng + .Where(t => t.Language != "en") + .ToList(); + + var i = 0; + var errorsCount = 0; + + foreach (var lng in otherLanguagesWithVariables) + { + foreach (var t in lng.TranslationsWithVariables) + { + var enKey = enWithVariables + .Where(en => en.Key == t.Key) + .FirstOrDefault(); + + if (enKey == null) + { + // wrong + message += $"{++i}. lng='{lng.Language}' key='{t.Key}' has no 'en' language variant (!!!useless key!!!)\r\n\r\n"; + errorsCount++; + continue; + } + + if (enKey.Variables.Count != t.Variables.Count) + { + // wrong + message += $"{++i}. lng='{lng.Language}' key='{t.Key}' has less variables then 'en' language have " + + $"(en={enKey.Variables.Count}|{lng.Language}={t.Variables.Count})\r\n" + + $"'en': '{enKey.Value}'\r\n'{lng.Language}': '{t.Value}'\r\n\r\n"; + errorsCount++; + } + + if (!t.Variables.All(v => enKey.Variables.Contains(v))) + { + // wrong + errorsCount++; + message += $"{++i}. lng='{lng.Language}' key='{t.Key}' has not equals variables of 'en' language have\r\n\r\n" + + $"Have to be:\r\n'{enKey.Value}'\r\n\r\n{string.Join("\r\n", enKey.Variables)}\r\n\r\n" + + $"But in real:\r\n'{t.Value}'\r\n\r\n{string.Join("\r\n", t.Variables)} \r\n\r\n"; + } + } + } + + Assert.AreEqual(0, errorsCount, message); + } + /*[Test] public void TempTest() { diff --git a/common/Tools/AutoMigrationCreator/AutoMigrationCreator.csproj b/common/Tools/AutoMigrationCreator/AutoMigrationCreator.csproj index bab2eda847..259264f214 100644 --- a/common/Tools/AutoMigrationCreator/AutoMigrationCreator.csproj +++ b/common/Tools/AutoMigrationCreator/AutoMigrationCreator.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 AutoMigrationCreator.Program @@ -13,11 +13,11 @@ - - - all + + + all - + diff --git a/common/Tools/AutoMigrationCreator/Utils/EFCoreDesignTimeServices.cs b/common/Tools/AutoMigrationCreator/Utils/EFCoreDesignTimeServices.cs index 8381759842..d0e773251a 100644 --- a/common/Tools/AutoMigrationCreator/Utils/EFCoreDesignTimeServices.cs +++ b/common/Tools/AutoMigrationCreator/Utils/EFCoreDesignTimeServices.cs @@ -1,6 +1,9 @@ using ASC.Core.Common.EF; using Microsoft.EntityFrameworkCore.Design; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations.Design; +using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.DependencyInjection; namespace AutoMigrationCreator @@ -12,6 +15,10 @@ namespace AutoMigrationCreator var serviceCollection = new ServiceCollection(); serviceCollection.AddEntityFrameworkDesignTimeServices(); serviceCollection.AddDbContextDesignTimeServices(context); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(context.GetService()); var designTimeServices = serviceCollection.BuildServiceProvider(); diff --git a/common/services/ASC.ApiSystem/ASC.ApiSystem.csproj b/common/services/ASC.ApiSystem/ASC.ApiSystem.csproj index 98cce9756e..1211611882 100644 --- a/common/services/ASC.ApiSystem/ASC.ApiSystem.csproj +++ b/common/services/ASC.ApiSystem/ASC.ApiSystem.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 ASC.ApiSystem Ascensio System SIA ASC.ApiSystem @@ -17,10 +17,9 @@ - + - - + diff --git a/common/services/ASC.ApiSystem/Classes/CommonMethods.cs b/common/services/ASC.ApiSystem/Classes/CommonMethods.cs index 377bd9d215..e5d5eea92a 100644 --- a/common/services/ASC.ApiSystem/Classes/CommonMethods.cs +++ b/common/services/ASC.ApiSystem/Classes/CommonMethods.cs @@ -28,7 +28,8 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; -using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; using System.Text; using System.Text.RegularExpressions; @@ -168,18 +169,16 @@ namespace ASC.ApiSystem.Controllers Log.DebugFormat("congratulations skiped"); return false; } - - var webRequest = (HttpWebRequest)WebRequest.Create(url); - webRequest.Method = WebRequestMethods.Http.Post; - webRequest.Accept = "application/x-www-form-urlencoded"; - webRequest.ContentLength = 0; + + var request = new HttpRequestMessage(); + request.Method = HttpMethod.Post; + request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/x-www-form-urlencoded")); try - { - using var response = webRequest.GetResponse(); - - using var stream = response.GetResponseStream(); - + { + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using var stream = response.Content.ReadAsStream(); using var reader = new StreamReader(stream, Encoding.UTF8); var result = reader.ReadToEnd(); @@ -305,18 +304,17 @@ namespace ASC.ApiSystem.Controllers { var data = string.Format("secret={0}&remoteip={1}&response={2}", Configuration["recaptcha:private-key"], ip, response); var url = Configuration["recaptcha:verify-url"] ?? "https://www.recaptcha.net/recaptcha/api/siteverify"; + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(url); + request.Method = HttpMethod.Post; + request.Content = new StringContent(data, Encoding.UTF8, "application/x-www-form-urlencoded"); + + using var httpClient = new HttpClient(); + using var httpClientResponse = httpClient.Send(request); + using var stream = httpClientResponse.Content.ReadAsStream(); + using var reader = new StreamReader(stream); - var webRequest = (HttpWebRequest)WebRequest.Create(url); - webRequest.Method = WebRequestMethods.Http.Post; - webRequest.ContentType = "application/x-www-form-urlencoded"; - webRequest.ContentLength = data.Length; - using (var writer = new StreamWriter(webRequest.GetRequestStream())) - { - writer.Write(data); - } - - using var webResponse = webRequest.GetResponse(); - using var reader = new StreamReader(webResponse.GetResponseStream()); var resp = reader.ReadToEnd(); var resObj = JObject.Parse(resp); diff --git a/common/services/ASC.ApiSystem/Controllers/CalDavController.cs b/common/services/ASC.ApiSystem/Controllers/CalDavController.cs index 74f8e7c35b..0bd087230b 100644 --- a/common/services/ASC.ApiSystem/Controllers/CalDavController.cs +++ b/common/services/ASC.ApiSystem/Controllers/CalDavController.cs @@ -26,9 +26,11 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; using System.Web; using ASC.ApiSystem.Classes; @@ -336,25 +338,20 @@ namespace ASC.ApiSystem.Controllers string.IsNullOrEmpty(query) ? "" : "?" + query); Log.Info(string.Format("CalDav: SendToApi: {0}", url)); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(url); + request.Method = new HttpMethod(httpMethod); + request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json")); - var webRequest = (HttpWebRequest)WebRequest.Create(url); - webRequest.Method = httpMethod; - webRequest.Accept = "application/json"; - webRequest.ContentType = "application/x-www-form-urlencoded"; - webRequest.ContentLength = 0; + using var httpClient = new HttpClient(); if (data != null) { - webRequest.ContentLength = data.Length; - - using var writer = new StreamWriter(webRequest.GetRequestStream()); - - writer.Write(data); + request.Content = new StringContent(data, Encoding.UTF8, "application/x-www-form-urlencoded"); } - using (webRequest.GetResponse()) - { - } + httpClient.Send(request); } #endregion diff --git a/common/services/ASC.ApiSystem/Program.cs b/common/services/ASC.ApiSystem/Program.cs index 98546afb26..e28b91f1e8 100644 --- a/common/services/ASC.ApiSystem/Program.cs +++ b/common/services/ASC.ApiSystem/Program.cs @@ -46,7 +46,6 @@ namespace ASC.ApiSystem public async static Task Main(string[] args) { var host = CreateHostBuilder(args).Build(); - await host.RunAsync(); } diff --git a/common/services/ASC.ApiSystem/Startup.cs b/common/services/ASC.ApiSystem/Startup.cs index 304870b7d0..e254403228 100644 --- a/common/services/ASC.ApiSystem/Startup.cs +++ b/common/services/ASC.ApiSystem/Startup.cs @@ -24,6 +24,8 @@ */ +using System.Text.Json.Serialization; + using ASC.Api.Core; using ASC.ApiSystem.Classes; using ASC.ApiSystem.Controllers; @@ -66,7 +68,7 @@ namespace ASC.ApiSystem .AddJsonOptions(options => { options.JsonSerializerOptions.WriteIndented = false; - options.JsonSerializerOptions.IgnoreNullValues = true; + options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; }); services.AddMemoryCache(); diff --git a/common/services/ASC.AuditTrail/ASC.AuditTrail.csproj b/common/services/ASC.AuditTrail/ASC.AuditTrail.csproj index c59abe326f..b01f2130f5 100644 --- a/common/services/ASC.AuditTrail/ASC.AuditTrail.csproj +++ b/common/services/ASC.AuditTrail/ASC.AuditTrail.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 diff --git a/common/services/ASC.ClearEvents/ASC.ClearEvents.csproj b/common/services/ASC.ClearEvents/ASC.ClearEvents.csproj index 59b1d652ba..b335630620 100644 --- a/common/services/ASC.ClearEvents/ASC.ClearEvents.csproj +++ b/common/services/ASC.ClearEvents/ASC.ClearEvents.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Exe false @@ -33,10 +33,9 @@ - + - - + diff --git a/common/services/ASC.Data.Backup/ASC.Data.Backup.csproj b/common/services/ASC.Data.Backup/ASC.Data.Backup.csproj index f0214f7d2e..a497937491 100644 --- a/common/services/ASC.Data.Backup/ASC.Data.Backup.csproj +++ b/common/services/ASC.Data.Backup/ASC.Data.Backup.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Exe false @@ -21,6 +21,10 @@ + + + + diff --git a/common/services/ASC.Data.Backup/Program.cs b/common/services/ASC.Data.Backup/Program.cs index 5d9bd9d502..ef4dcd44eb 100644 --- a/common/services/ASC.Data.Backup/Program.cs +++ b/common/services/ASC.Data.Backup/Program.cs @@ -24,7 +24,7 @@ namespace ASC.Data.Backup await host.RunAsync(); } - public static IHostBuilder CreateHostBuilder(string[] args) => + public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseSystemd() .UseWindowsService() diff --git a/common/services/ASC.Data.Storage.Encryption/ASC.Data.Storage.Encryption.csproj b/common/services/ASC.Data.Storage.Encryption/ASC.Data.Storage.Encryption.csproj index c722846633..06320b6789 100644 --- a/common/services/ASC.Data.Storage.Encryption/ASC.Data.Storage.Encryption.csproj +++ b/common/services/ASC.Data.Storage.Encryption/ASC.Data.Storage.Encryption.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Exe false @@ -19,16 +19,15 @@ - - - + + + true + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + diff --git a/common/services/ASC.Data.Storage.Migration/ASC.Data.Storage.Migration.csproj b/common/services/ASC.Data.Storage.Migration/ASC.Data.Storage.Migration.csproj index ea3fa428d2..cbae83f112 100644 --- a/common/services/ASC.Data.Storage.Migration/ASC.Data.Storage.Migration.csproj +++ b/common/services/ASC.Data.Storage.Migration/ASC.Data.Storage.Migration.csproj @@ -1,16 +1,15 @@  - net5.0 + net6.0 false false false - - - + + diff --git a/common/services/ASC.ElasticSearch/ASC.ElasticSearch.csproj b/common/services/ASC.ElasticSearch/ASC.ElasticSearch.csproj index 7e47645f2f..0fe01f7cfc 100644 --- a/common/services/ASC.ElasticSearch/ASC.ElasticSearch.csproj +++ b/common/services/ASC.ElasticSearch/ASC.ElasticSearch.csproj @@ -2,7 +2,7 @@ 9.0.30729 {AE1A0E06-6CD4-4E1D-8209-22BBBD6D5652} - net5.0 + net6.0 ASC.ElasticSearch diff --git a/common/services/ASC.Feed.Aggregator/ASC.Feed.Aggregator.csproj b/common/services/ASC.Feed.Aggregator/ASC.Feed.Aggregator.csproj index 35ab84eecf..a8ee5a8e4d 100644 --- a/common/services/ASC.Feed.Aggregator/ASC.Feed.Aggregator.csproj +++ b/common/services/ASC.Feed.Aggregator/ASC.Feed.Aggregator.csproj @@ -2,7 +2,7 @@ Library - net5.0 + net6.0 diff --git a/common/services/ASC.Notify/ASC.Notify.csproj b/common/services/ASC.Notify/ASC.Notify.csproj index 25ed405b44..cdb92b566b 100644 --- a/common/services/ASC.Notify/ASC.Notify.csproj +++ b/common/services/ASC.Notify/ASC.Notify.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Exe false @@ -16,9 +16,8 @@ - - - + + diff --git a/common/services/ASC.Radicale/ASC.Radicale.csproj b/common/services/ASC.Radicale/ASC.Radicale.csproj index 69ce39049e..b9fe6acdfc 100644 --- a/common/services/ASC.Radicale/ASC.Radicale.csproj +++ b/common/services/ASC.Radicale/ASC.Radicale.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Exe false @@ -13,7 +13,7 @@ - + @@ -21,8 +21,7 @@ - - + diff --git a/common/services/ASC.Socket.IO.Svc/ASC.Socket.IO.Svc.csproj b/common/services/ASC.Socket.IO.Svc/ASC.Socket.IO.Svc.csproj index f8d3bde4be..7cdc10fa69 100644 --- a/common/services/ASC.Socket.IO.Svc/ASC.Socket.IO.Svc.csproj +++ b/common/services/ASC.Socket.IO.Svc/ASC.Socket.IO.Svc.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Exe false @@ -18,10 +18,9 @@ - - - - + + + diff --git a/common/services/ASC.SsoAuth.Svc/ASC.SsoAuth.Svc.csproj b/common/services/ASC.SsoAuth.Svc/ASC.SsoAuth.Svc.csproj index f7b6dd8d28..b8311a3464 100644 --- a/common/services/ASC.SsoAuth.Svc/ASC.SsoAuth.Svc.csproj +++ b/common/services/ASC.SsoAuth.Svc/ASC.SsoAuth.Svc.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Exe false @@ -19,9 +19,8 @@ - - - + + diff --git a/common/services/ASC.Studio.Notify/ASC.Studio.Notify.csproj b/common/services/ASC.Studio.Notify/ASC.Studio.Notify.csproj index acef449757..6958d850d8 100644 --- a/common/services/ASC.Studio.Notify/ASC.Studio.Notify.csproj +++ b/common/services/ASC.Studio.Notify/ASC.Studio.Notify.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 false false false @@ -14,9 +14,8 @@ - - - + + diff --git a/common/services/ASC.TelegramService/ASC.TelegramService.csproj b/common/services/ASC.TelegramService/ASC.TelegramService.csproj index d1c6cebff9..93585acbd2 100644 --- a/common/services/ASC.TelegramService/ASC.TelegramService.csproj +++ b/common/services/ASC.TelegramService/ASC.TelegramService.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Exe false @@ -16,10 +16,8 @@ - - - - + + diff --git a/common/services/ASC.Thumbnails.Svc/ASC.Thumbnails.Svc.csproj b/common/services/ASC.Thumbnails.Svc/ASC.Thumbnails.Svc.csproj index 4fa06ab8e4..7366c400fe 100644 --- a/common/services/ASC.Thumbnails.Svc/ASC.Thumbnails.Svc.csproj +++ b/common/services/ASC.Thumbnails.Svc/ASC.Thumbnails.Svc.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Exe false @@ -25,9 +25,8 @@ - - - + + \ No newline at end of file diff --git a/common/services/ASC.UrlShortener.Svc/ASC.UrlShortener.Svc.csproj b/common/services/ASC.UrlShortener.Svc/ASC.UrlShortener.Svc.csproj index a5b393d469..e0798a28ef 100644 --- a/common/services/ASC.UrlShortener.Svc/ASC.UrlShortener.Svc.csproj +++ b/common/services/ASC.UrlShortener.Svc/ASC.UrlShortener.Svc.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 Exe false @@ -16,9 +16,8 @@ - - - + + diff --git a/common/services/ASC.Webhooks.Service/ASC.Webhooks.Service.csproj b/common/services/ASC.Webhooks.Service/ASC.Webhooks.Service.csproj index 4ae4602c68..2096dea798 100644 --- a/common/services/ASC.Webhooks.Service/ASC.Webhooks.Service.csproj +++ b/common/services/ASC.Webhooks.Service/ASC.Webhooks.Service.csproj @@ -1,14 +1,13 @@  - net5.0 + net6.0 false - - - + + diff --git a/config/nginx/onlyoffice.conf b/config/nginx/onlyoffice.conf index 44f9023fb6..83808f3a3e 100644 --- a/config/nginx/onlyoffice.conf +++ b/config/nginx/onlyoffice.conf @@ -25,6 +25,7 @@ map $request_uri $header_x_frame_options { map $request_uri $cache_control { default "no-cache, no-store, must-revalidate"; ~*\/(api\/2\.0.*|storage|login\.ashx|products\/.+\/httphandlers\/filehandler\.ashx|ChunkedUploader.ashx|apisystem|sh|remoteEntry\.js|debuginfo\.md) "no-cache, no-store, must-revalidate"; + ~*\/(locales.*\.json) "public, no-transform"; ~*\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf|md|css|js)$ "public, no-transform"; } diff --git a/lerna.json b/lerna.json index 5ef065cbbf..3507f9b042 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.0", + "version": "1.0.1", "npmClient": "yarn", "packages": [ "packages/asc-web-components", diff --git a/packages/asc-web-common/api/files/index.js b/packages/asc-web-common/api/files/index.js index 1cbe89cd14..579fa359a4 100644 --- a/packages/asc-web-common/api/files/index.js +++ b/packages/asc-web-common/api/files/index.js @@ -48,6 +48,10 @@ export function getFolderPath(folderId) { } export function getFolder(folderId, filter) { + if (folderId && typeof folderId === "string") { + folderId = encodeURIComponent(folderId.replace(/\\\\/g, "\\")); + } + const params = filter && filter instanceof FilesFilter ? `${folderId}?${filter.toApiUrlParams()}` @@ -60,26 +64,28 @@ export function getFolder(folderId, filter) { return request(options); } -// const getFolderNameByType = (folderType) => { -// switch (folderType) { -// case FolderType.USER: -// return "@my"; -// case FolderType.SHARE: -// return "@share"; -// case FolderType.COMMON: -// return "@common"; -// case FolderType.Projects: -// return "@projects"; -// case FolderType.Favorites: -// return "@favorites"; -// case FolderType.Recent: -// return "@recent"; -// case FolderType.TRASH: -// return "@trash"; -// default: -// return ""; -// } -// }; //TODO: need get from settings +const getFolderClassNameByType = (folderType) => { + switch (folderType) { + case FolderType.USER: + return "tree-node-my"; + case FolderType.SHARE: + return "tree-node-share"; + case FolderType.COMMON: + return "tree-node-common"; + case FolderType.Projects: + return "tree-node-projects"; + case FolderType.Favorites: + return "tree-node-favorites"; + case FolderType.Recent: + return "tree-node-recent"; + case FolderType.Privacy: + return "tree-node-privacy"; + case FolderType.TRASH: + return "tree-node-trash"; + default: + return ""; + } +}; const sortInDisplayOrder = (folders) => { const sorted = []; @@ -141,7 +147,7 @@ export function getFoldersTree() { const folders = sortInDisplayOrder(response); return folders.map((data, index) => { const type = +data.current.rootFolderType; - //const name = getFolderNameByType(type); + const name = getFolderClassNameByType(type); const isRecycleBinFolder = type === FolderType.TRASH; return { id: data.current.id, @@ -149,7 +155,7 @@ export function getFoldersTree() { parentId: data.current.parentId, title: data.current.title, rootFolderType: type, - //rootFolderName: name, + folderClassName: name, // folders: !isRecycleBinFolder // ? data.folders.map((folder) => { // return { diff --git a/packages/asc-web-common/api/groups/index.js b/packages/asc-web-common/api/groups/index.js index b86b719e62..d4bf115865 100644 --- a/packages/asc-web-common/api/groups/index.js +++ b/packages/asc-web-common/api/groups/index.js @@ -9,6 +9,8 @@ export function getGroupList(fake = false, searchValue) { : request({ method: "get", url: `/group${params}`, + }).then((groups) => { + return groups.sort((a, b) => a.name.localeCompare(b.name)); }); } diff --git a/packages/asc-web-common/api/people/index.js b/packages/asc-web-common/api/people/index.js index ed914355e5..20d2c291a9 100644 --- a/packages/asc-web-common/api/people/index.js +++ b/packages/asc-web-common/api/people/index.js @@ -2,6 +2,7 @@ import { request } from "../client"; //import axios from "axios"; import Filter from "./filter"; import * as fakePeople from "./fake"; +import { Encoder } from "../../utils/encoder"; export function getUserList(filter = Filter.getDefault(), fake = false) { if (fake) { @@ -18,6 +19,14 @@ export function getUserList(filter = Filter.getDefault(), fake = false) { return request({ method: "get", url: `/people${params}`, + }).then((res) => { + res.items = res.items.map((user) => { + if (user && user.displayName) { + user.displayName = Encoder.htmlDecode(user.displayName); + } + return user; + }); + return res; }); } @@ -26,6 +35,11 @@ export function getUser(userName = null) { method: "get", url: `/people/${userName || "@self"}.json`, skipUnauthorized: true, + }).then((user) => { + if (user && user.displayName) { + user.displayName = Encoder.htmlDecode(user.displayName); + } + return user; }); } export function getUserPhoto(userId) { @@ -44,7 +58,12 @@ export function createUser(data, confirmKey = null) { if (confirmKey) options.headers = { confirm: confirmKey }; - return request(options); + return request(options).then((user) => { + if (user && user.displayName) { + user.displayName = Encoder.htmlDecode(user.displayName); + } + return user; + }); } export function changePassword(userId, passwordHash, key) { @@ -82,6 +101,11 @@ export function updateUser(data) { method: "put", url: `/people/${data.id}`, data, + }).then((user) => { + if (user && user.displayName) { + user.displayName = Encoder.htmlDecode(user.displayName); + } + return user; }); } @@ -156,6 +180,11 @@ export function updateUserCulture(id, cultureName) { method: "put", url: `/people/${id}/culture`, data: { cultureName }, + }).then((user) => { + if (user && user.displayName) { + user.displayName = Encoder.htmlDecode(user.displayName); + } + return user; }); } diff --git a/packages/asc-web-common/components/MediaViewer/sub-components/image-viewer.js b/packages/asc-web-common/components/MediaViewer/sub-components/image-viewer.js index 578be05e68..bdca80f25e 100644 --- a/packages/asc-web-common/components/MediaViewer/sub-components/image-viewer.js +++ b/packages/asc-web-common/components/MediaViewer/sub-components/image-viewer.js @@ -13,6 +13,7 @@ import MediaDownloadIcon from "../../../../../public/images/media.download.react import commonIconsStyles from "@appserver/components/utils/common-icons-style"; import MediaScrollButton from "./scroll-button"; import ControlBtn from "./control-btn"; +import equal from "fast-deep-equal/react"; const StyledMediaZoomInIcon = styled(MediaZoomInIcon)` ${commonIconsStyles} @@ -228,6 +229,9 @@ class ImageViewer extends React.Component { document.getElementsByClassName("iconContainer reset")[0].click(); } + shouldComponentUpdate(nextProps) { + return !equal(this.props, nextProps); + } render() { const { className, diff --git a/packages/asc-web-common/components/PageLayout/i18n.js b/packages/asc-web-common/components/PageLayout/i18n.js index e5e693d54f..94069a6694 100644 --- a/packages/asc-web-common/components/PageLayout/i18n.js +++ b/packages/asc-web-common/components/PageLayout/i18n.js @@ -10,7 +10,7 @@ i18n .init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/packages/asc-web-common/components/PageLayout/sub-components/article-body.js b/packages/asc-web-common/components/PageLayout/sub-components/article-body.js index 0be5f8e943..c0e9bab7b1 100644 --- a/packages/asc-web-common/components/PageLayout/sub-components/article-body.js +++ b/packages/asc-web-common/components/PageLayout/sub-components/article-body.js @@ -9,8 +9,8 @@ import { isMobile } from "react-device-detect"; const StyledArticleBody = styled.div` ${(props) => props.displayBorder && `outline: 1px dotted;`} flex-grow: 1; - height: 100%; + ${(props) => (props.isDesktop ? "height:auto" : "height:100%")}; .custom-scrollbar { width: calc(100% + 24px) !important; } diff --git a/packages/asc-web-common/components/PageLayout/sub-components/section-body.js b/packages/asc-web-common/components/PageLayout/sub-components/section-body.js index f59fdd652c..0f627b5f13 100644 --- a/packages/asc-web-common/components/PageLayout/sub-components/section-body.js +++ b/packages/asc-web-common/components/PageLayout/sub-components/section-body.js @@ -18,6 +18,9 @@ const paddingStyles = css` `; const commonStyles = css` flex-grow: 1; + + ${(props) => (props.isDesktop ? "height: auto" : "height: 100%")}; + ${(props) => !props.withScroll && `height: 100%;`} border-left: none; @@ -134,6 +137,7 @@ class SectionBody extends React.Component { viewAs, withScroll, isLoaded, + isDesktop, } = this.props; const focusProps = autoFocus @@ -151,6 +155,7 @@ class SectionBody extends React.Component { viewAs={viewAs} pinned={pinned} isLoaded={isLoaded} + isDesktop={isDesktop} className="section-body" > {withScroll ? ( @@ -184,6 +189,7 @@ class SectionBody extends React.Component { withScroll={withScroll} pinned={pinned} isLoaded={isLoaded} + isDesktop={isDesktop} > {withScroll ? ( !isMobile ? ( @@ -236,7 +242,10 @@ SectionBody.defaultProps = { }; export default inject(({ auth }) => { + const { settingsStore } = auth; + const { isDesktopClient: isDesktop } = settingsStore; return { isLoaded: auth.isLoaded, + isDesktop, }; })(observer(SectionBody)); diff --git a/packages/asc-web-common/components/PageLayout/sub-components/section-paging.js b/packages/asc-web-common/components/PageLayout/sub-components/section-paging.js index d13cf2aa6c..f644af01dc 100644 --- a/packages/asc-web-common/components/PageLayout/sub-components/section-paging.js +++ b/packages/asc-web-common/components/PageLayout/sub-components/section-paging.js @@ -7,10 +7,6 @@ const StyledSectionPaging = styled.div` `; class SectionPaging extends React.Component { - shouldComponentUpdate(nextProps) { - return !equal(this.props, nextProps); - } - render() { return ; } diff --git a/packages/asc-web-common/package.json b/packages/asc-web-common/package.json index 6d3f4958a1..f62d4ce4f5 100644 --- a/packages/asc-web-common/package.json +++ b/packages/asc-web-common/package.json @@ -1,6 +1,6 @@ { "name": "@appserver/common", - "version": "1.0.0", + "version": "1.0.1", "private": true, "scripts": { "build": "echo 'skip it'", diff --git a/packages/asc-web-common/store/AuthStore.js b/packages/asc-web-common/store/AuthStore.js index febf93cf55..64979ea5e4 100644 --- a/packages/asc-web-common/store/AuthStore.js +++ b/packages/asc-web-common/store/AuthStore.js @@ -19,7 +19,6 @@ class AuthStore { tfaStore = null; isLoading = false; - isAuthenticated = false; version = null; skipModules = false; providers = []; @@ -42,8 +41,6 @@ class AuthStore { await this.userStore.init(); - if (this.userStore.user) this.setIsAuthenticated(true); - const requests = []; requests.push(this.settingsStore.init()); @@ -179,6 +176,8 @@ class AuthStore { await this.tfaStore.loginWithCode(userName, passwordHash, code); setWithCredentialsStatus(true); + this.reset(); + this.init(); return Promise.resolve(this.settingsStore.defaultPage); @@ -192,23 +191,27 @@ class AuthStore { setWithCredentialsStatus(true); + this.reset(); + this.init(); - return Promise.resolve(true); + return Promise.resolve(this.settingsStore.defaultPage); } catch (e) { return Promise.reject(e); } }; - reset = () => { + reset = (skipUser = false) => { this.isInit = false; this.skipModules = false; - this.userStore = new UserStore(); + if (!skipUser) { + this.userStore = new UserStore(); + } this.moduleStore = new ModuleStore(); this.settingsStore = new SettingsStore(); }; - logout = async (withoutRedirect) => { + logout = async (redirectToLogin = true) => { await api.user.logout(); //console.log("Logout response ", response); @@ -219,22 +222,24 @@ class AuthStore { isDesktop && logoutDesktop(); - this.reset(); - - this.init(); - - if (!withoutRedirect) { + if (redirectToLogin) { if (personal) { - window.location.replace("/"); + return window.location.replace("/"); } else { - history.push(combineUrl(proxyURL, "/login")); + this.reset(true); + this.userStore.setUser(null); + this.init(); + return history.push(combineUrl(proxyURL, "/login")); } + } else { + this.reset(); + this.init(); } }; - setIsAuthenticated = (isAuthenticated) => { - this.isAuthenticated = isAuthenticated; - }; + get isAuthenticated() { + return this.userStore.isAuthenticated; + } getEncryptionAccess = (fileId) => { return api.files diff --git a/packages/asc-web-common/store/UserStore.js b/packages/asc-web-common/store/UserStore.js index d6ad2d5a67..b21cbfcf6c 100644 --- a/packages/asc-web-common/store/UserStore.js +++ b/packages/asc-web-common/store/UserStore.js @@ -1,4 +1,4 @@ -import { action, makeObservable, observable } from "mobx"; +import { makeAutoObservable } from "mobx"; import api from "../api"; class UserStore { @@ -8,29 +8,20 @@ class UserStore { userIsUpdate = false; constructor() { - makeObservable(this, { - user: observable, - isLoading: observable, - isLoaded: observable, - userIsUpdate: observable, - getCurrentUser: action, - setIsLoading: action, - setIsLoaded: action, - setUser: action, - setUserIsUpdate: action, - }); + makeAutoObservable(this); } - getCurrentUser = async () => { + loadCurrentUser = async () => { const user = await api.people.getUser(); - this.setUser(user); }; init = async () => { + if (this.isLoaded) return; + this.setIsLoading(true); - await this.getCurrentUser(); + await this.loadCurrentUser(); this.setIsLoading(false); this.setIsLoaded(true); @@ -61,6 +52,10 @@ class UserStore { //console.log("setUserIsUpdate"); this.userIsUpdate = isUpdate; }; + + get isAuthenticated() { + return !!this.user; + } } export default UserStore; diff --git a/packages/asc-web-common/utils/encoder.js b/packages/asc-web-common/utils/encoder.js new file mode 100644 index 0000000000..1f9b6f7ee6 --- /dev/null +++ b/packages/asc-web-common/utils/encoder.js @@ -0,0 +1,1147 @@ +/** + * Encoder + */ +export const Encoder = { + EncodeType: "entity", + isEmpty: function (val) { + if (val) { + return val === null || val.length == 0 || /^\s+$/.test(val); + } else { + return true; + } + }, + HTML2Numerical: function (s) { + var arr1 = new Array( + " ", + "¡", + "¢", + "£", + "¤", + "¥", + "¦", + "§", + "¨", + "©", + "ª", + "«", + "¬", + "­", + "®", + "¯", + "°", + "±", + "²", + "³", + "´", + "µ", + "¶", + "·", + "¸", + "¹", + "º", + "»", + "¼", + "½", + "¾", + "¿", + "à", + "á", + "â", + "ã", + "Ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "Ö", + "×", + "ø", + "ù", + "ú", + "û", + "Ü", + "ý", + "þ", + "ß", + "à", + "á", + "â", + "ã", + "ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "ö", + "÷", + "Ø", + "ù", + "ú", + "û", + "ü", + "ý", + "þ", + "ÿ", + """, + "&", + "<", + ">", + "œ", + "œ", + "š", + "š", + "ÿ", + "ˆ", + "˜", + " ", + " ", + " ", + "‌", + "‍", + "‎", + "‏", + "–", + "—", + "‘", + "’", + "‚", + "“", + "”", + "„", + "†", + "†", + "‰", + "‹", + "›", + "€", + "ƒ", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "ς", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "ϑ", + "ϒ", + "ϖ", + "•", + "…", + "′", + "′", + "‾", + "⁄", + "℘", + "ℑ", + "ℜ", + "™", + "ℵ", + "←", + "↑", + "→", + "↓", + "↔", + "↵", + "←", + "↑", + "→", + "↓", + "↔", + "∀", + "∂", + "∃", + "∅", + "∇", + "∈", + "∉", + "∋", + "∏", + "∑", + "−", + "∗", + "√", + "∝", + "∞", + "∠", + "∧", + "∨", + "∩", + "∪", + "∫", + "∴", + "∼", + "≅", + "≈", + "≠", + "≡", + "≤", + "≥", + "⊂", + "⊃", + "⊄", + "⊆", + "⊇", + "⊕", + "⊗", + "⊥", + "⋅", + "⌈", + "⌉", + "⌊", + "⌋", + "⟨", + "⟩", + "◊", + "♠", + "♣", + "♥", + "♦" + ); + var arr2 = new Array( + " ", + "¡", + "¢", + "£", + "¤", + "¥", + "¦", + "§", + "¨", + "©", + "ª", + "«", + "¬", + "­", + "®", + "¯", + "°", + "±", + "²", + "³", + "´", + "µ", + "¶", + "·", + "¸", + "¹", + "º", + "»", + "¼", + "½", + "¾", + "¿", + "À", + "Á", + "Â", + "Ã", + "Ä", + "Å", + "Æ", + "Ç", + "È", + "É", + "Ê", + "Ë", + "Ì", + "Í", + "Î", + "Ï", + "Ð", + "Ñ", + "Ò", + "Ó", + "Ô", + "Õ", + "Ö", + "×", + "Ø", + "Ù", + "Ú", + "Û", + "Ü", + "Ý", + "Þ", + "ß", + "à", + "á", + "â", + "ã", + "ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "ö", + "÷", + "ø", + "ù", + "ú", + "û", + "ü", + "ý", + "þ", + "ÿ", + """, + "&", + "<", + ">", + "Œ", + "œ", + "Š", + "š", + "Ÿ", + "ˆ", + "˜", + " ", + " ", + " ", + "‌", + "‍", + "‎", + "‏", + "–", + "—", + "‘", + "’", + "‚", + "“", + "”", + "„", + "†", + "‡", + "‰", + "‹", + "›", + "€", + "ƒ", + "Α", + "Β", + "Γ", + "Δ", + "Ε", + "Ζ", + "Η", + "Θ", + "Ι", + "Κ", + "Λ", + "Μ", + "Ν", + "Ξ", + "Ο", + "Π", + "Ρ", + "Σ", + "Τ", + "Υ", + "Φ", + "Χ", + "Ψ", + "Ω", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "ς", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "ϑ", + "ϒ", + "ϖ", + "•", + "…", + "′", + "″", + "‾", + "⁄", + "℘", + "ℑ", + "ℜ", + "™", + "ℵ", + "←", + "↑", + "→", + "↓", + "↔", + "↵", + "⇐", + "⇑", + "⇒", + "⇓", + "⇔", + "∀", + "∂", + "∃", + "∅", + "∇", + "∈", + "∉", + "∋", + "∏", + "∑", + "−", + "∗", + "√", + "∝", + "∞", + "∠", + "∧", + "∨", + "∩", + "∪", + "∫", + "∴", + "∼", + "≅", + "≈", + "≠", + "≡", + "≤", + "≥", + "⊂", + "⊃", + "⊄", + "⊆", + "⊇", + "⊕", + "⊗", + "⊥", + "⋅", + "⌈", + "⌉", + "⌊", + "⌋", + "〈", + "〉", + "◊", + "♠", + "♣", + "♥", + "♦" + ); + return this.swapArrayVals(s, arr1, arr2); + }, + NumericalToHTML: function (s) { + var arr1 = new Array( + " ", + "¡", + "¢", + "£", + "¤", + "¥", + "¦", + "§", + "¨", + "©", + "ª", + "«", + "¬", + "­", + "®", + "¯", + "°", + "±", + "²", + "³", + "´", + "µ", + "¶", + "·", + "¸", + "¹", + "º", + "»", + "¼", + "½", + "¾", + "¿", + "À", + "Á", + "Â", + "Ã", + "Ä", + "Å", + "Æ", + "Ç", + "È", + "É", + "Ê", + "Ë", + "Ì", + "Í", + "Î", + "Ï", + "Ð", + "Ñ", + "Ò", + "Ó", + "Ô", + "Õ", + "Ö", + "×", + "Ø", + "Ù", + "Ú", + "Û", + "Ü", + "Ý", + "Þ", + "ß", + "à", + "á", + "â", + "ã", + "ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "ö", + "÷", + "ø", + "ù", + "ú", + "û", + "ü", + "ý", + "þ", + "ÿ", + """, + "&", + "<", + ">", + "Œ", + "œ", + "Š", + "š", + "Ÿ", + "ˆ", + "˜", + " ", + " ", + " ", + "‌", + "‍", + "‎", + "‏", + "–", + "—", + "‘", + "’", + "‚", + "“", + "”", + "„", + "†", + "‡", + "‰", + "‹", + "›", + "€", + "ƒ", + "Α", + "Β", + "Γ", + "Δ", + "Ε", + "Ζ", + "Η", + "Θ", + "Ι", + "Κ", + "Λ", + "Μ", + "Ν", + "Ξ", + "Ο", + "Π", + "Ρ", + "Σ", + "Τ", + "Υ", + "Φ", + "Χ", + "Ψ", + "Ω", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "ς", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "ϑ", + "ϒ", + "ϖ", + "•", + "…", + "′", + "″", + "‾", + "⁄", + "℘", + "ℑ", + "ℜ", + "™", + "ℵ", + "←", + "↑", + "→", + "↓", + "↔", + "↵", + "⇐", + "⇑", + "⇒", + "⇓", + "⇔", + "∀", + "∂", + "∃", + "∅", + "∇", + "∈", + "∉", + "∋", + "∏", + "∑", + "−", + "∗", + "√", + "∝", + "∞", + "∠", + "∧", + "∨", + "∩", + "∪", + "∫", + "∴", + "∼", + "≅", + "≈", + "≠", + "≡", + "≤", + "≥", + "⊂", + "⊃", + "⊄", + "⊆", + "⊇", + "⊕", + "⊗", + "⊥", + "⋅", + "⌈", + "⌉", + "⌊", + "⌋", + "〈", + "〉", + "◊", + "♠", + "♣", + "♥", + "♦" + ); + var arr2 = new Array( + " ", + "¡", + "¢", + "£", + "¤", + "¥", + "¦", + "§", + "¨", + "©", + "ª", + "«", + "¬", + "­", + "®", + "¯", + "°", + "±", + "²", + "³", + "´", + "µ", + "¶", + "·", + "¸", + "¹", + "º", + "»", + "¼", + "½", + "¾", + "¿", + "à", + "á", + "â", + "ã", + "Ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "Ö", + "×", + "ø", + "ù", + "ú", + "û", + "Ü", + "ý", + "þ", + "ß", + "à", + "á", + "â", + "ã", + "ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "ö", + "÷", + "Ø", + "ù", + "ú", + "û", + "ü", + "ý", + "þ", + "ÿ", + """, + "&", + "<", + ">", + "œ", + "œ", + "š", + "š", + "ÿ", + "ˆ", + "˜", + " ", + " ", + " ", + "‌", + "‍", + "‎", + "‏", + "–", + "—", + "‘", + "’", + "‚", + "“", + "”", + "„", + "†", + "†", + "‰", + "‹", + "›", + "€", + "ƒ", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "ς", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "ϑ", + "ϒ", + "ϖ", + "•", + "…", + "′", + "′", + "‾", + "⁄", + "℘", + "ℑ", + "ℜ", + "™", + "ℵ", + "←", + "↑", + "→", + "↓", + "↔", + "↵", + "←", + "↑", + "→", + "↓", + "↔", + "∀", + "∂", + "∃", + "∅", + "∇", + "∈", + "∉", + "∋", + "∏", + "∑", + "−", + "∗", + "√", + "∝", + "∞", + "∠", + "∧", + "∨", + "∩", + "∪", + "∫", + "∴", + "∼", + "≅", + "≈", + "≠", + "≡", + "≤", + "≥", + "⊂", + "⊃", + "⊄", + "⊆", + "⊇", + "⊕", + "⊗", + "⊥", + "⋅", + "⌈", + "⌉", + "⌊", + "⌋", + "⟨", + "⟩", + "◊", + "♠", + "♣", + "♥", + "♦" + ); + return this.swapArrayVals(s, arr1, arr2); + }, + numEncode: function (s) { + if (this.isEmpty(s)) return ""; + var e = ""; + for (var i = 0; i < s.length; i++) { + var c = s.charAt(i); + if (c < " " || c > "~") { + c = "&#" + c.charCodeAt() + ";"; + } + e += c; + } + return e; + }, + htmlDecode: function (s) { + var c, + m, + d = s; + if (this.isEmpty(d)) return ""; + d = this.HTML2Numerical(d); + const arr = d.match(/&#[0-9]{1,5};/g); + if (arr != null) { + for (var x = 0; x < arr.length; x++) { + m = arr[x]; + c = m.substring(2, m.length - 1); + if (c >= -32768 && c <= 65535) { + d = d.replace(m, String.fromCharCode(c)); + } else { + d = d.replace(m, ""); + } + } + } + return d; + }, + htmlEncode: function (s, dbl) { + if (this.isEmpty(s)) return ""; + dbl = dbl | false; + if (dbl) { + if (this.EncodeType == "numerical") { + s = s.replace(/&/g, "&"); + } else { + s = s.replace(/&/g, "&"); + } + } + s = this.XSSEncode(s, false); + if (this.EncodeType == "numerical" || !dbl) { + s = this.HTML2Numerical(s); + } + s = this.numEncode(s); + if (!dbl) { + s = s.replace(/&#/g, "##AMPHASH##"); + if (this.EncodeType == "numerical") { + s = s.replace(/&/g, "&"); + } else { + s = s.replace(/&/g, "&"); + } + s = s.replace(/##AMPHASH##/g, "&#"); + } + s = s.replace(/&#\d*([^\d;]|$)/g, "$1"); + if (!dbl) { + s = this.correctEncoding(s); + } + if (this.EncodeType == "entity") { + s = this.NumericalToHTML(s); + } + return s; + }, + XSSEncode: function (s, en) { + if (!this.isEmpty(s)) { + en = en || true; + if (en) { + s = s.replace(/\'/g, "'"); + s = s.replace(/\"/g, """); + s = s.replace(//g, ">"); + } else { + s = s.replace(/\'/g, "'"); + s = s.replace(/\"/g, """); + s = s.replace(//g, ">"); + } + return s; + } else { + return ""; + } + }, + hasEncoded: function (s) { + if (/&#[0-9]{1,5};/g.test(s)) { + return true; + } else if (/&[A-Z]{2,6};/gi.test(s)) { + return true; + } else { + return false; + } + }, + stripUnicode: function (s) { + return s.replace(/[^\x20-\x7E]/g, ""); + }, + correctEncoding: function (s) { + return s.replace(/(&)(amp;)+/, "$1"); + }, + swapArrayVals: function (s, arr1, arr2) { + if (this.isEmpty(s)) return ""; + var re; + if (arr1 && arr2) { + if (arr1.length == arr2.length) { + for (var x = 0, i = arr1.length; x < i; x++) { + re = new RegExp(arr1[x], "g"); + s = s.replace(re, arr2[x]); + } + } + } + return s; + }, +}; diff --git a/packages/asc-web-common/utils/index.js b/packages/asc-web-common/utils/index.js index 712f7f1dfb..e5baaec7fa 100644 --- a/packages/asc-web-common/utils/index.js +++ b/packages/asc-web-common/utils/index.js @@ -22,14 +22,12 @@ export function getObjectByLocation(location) { if (!location.search || !location.search.length) return null; const searchUrl = location.search.substring(1); - const object = JSON.parse( - '{"' + - decodeURIComponent(searchUrl) - .replace(/"/g, '\\"') - .replace(/&/g, '","') - .replace(/=/g, '":"') + - '"}' - ); + const decodedString = decodeURIComponent(searchUrl) + .replace(/"/g, '\\"') + .replace(/&/g, '","') + .replace(/=/g, '":"') + .replace(/\\/g, "\\\\"); + const object = JSON.parse(`{"${decodedString}"}`); return object; } diff --git a/packages/asc-web-common/utils/sw-helper.js b/packages/asc-web-common/utils/sw-helper.js index 7a0154dab8..23122a73ee 100644 --- a/packages/asc-web-common/utils/sw-helper.js +++ b/packages/asc-web-common/utils/sw-helper.js @@ -15,7 +15,7 @@ i18n .init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/packages/asc-web-components/avatar-editor/index.js b/packages/asc-web-components/avatar-editor/index.js index 5447358c93..35148d8a03 100644 --- a/packages/asc-web-components/avatar-editor/index.js +++ b/packages/asc-web-components/avatar-editor/index.js @@ -72,32 +72,14 @@ class AvatarEditor extends React.Component { }; onSaveButtonClick = () => { + this.props.onSave && this.props.onSave(); this.avatarEditorBodyRef.current.onSaveImage(); - //this.saveAvatar(); }; onCancelButtonClick = () => { this.props.onCancel(); }; - saveAvatar = () => { - if (!this.state.existImage) { - this.props.onSave(this.state.existImage); - return; - } - - this.props.onSave( - this.state.existImage, - { - x: this.state.x, - y: this.state.y, - width: this.state.width, - height: this.state.height, - }, - this.state.croppedImage - ); - }; - onClose = () => { this.setState({ visible: false }); this.props.onClose(); @@ -156,7 +138,6 @@ class AvatarEditor extends React.Component { onLoadFileError={this.onLoadFileError} onLoadFile={this.onLoadFile} deleteImage={this.onDeleteImage} - saveAvatar={this.saveAvatar} maxSize={maxSize * 1000000} // megabytes to bytes accept={accept} image={image} @@ -189,7 +170,6 @@ class AvatarEditor extends React.Component { onLoadFileError={this.onLoadFileError} onLoadFile={this.onLoadFile} deleteImage={this.onDeleteImage} - saveAvatar={this.saveAvatar} maxSize={maxSize * 1000000} // megabytes to bytes accept={accept} image={image} diff --git a/packages/asc-web-components/campaigns-banner/index.js b/packages/asc-web-components/campaigns-banner/index.js index f744c3e312..2f06e733db 100644 --- a/packages/asc-web-components/campaigns-banner/index.js +++ b/packages/asc-web-components/campaigns-banner/index.js @@ -7,7 +7,7 @@ import Text from "../text"; import Loaders from "@appserver/common/components/Loaders"; const onButtonClick = (url) => { - window.location = url; + window.open(url, "_blank"); }; const CampaignsBanner = (props) => { diff --git a/packages/asc-web-components/empty-screen-container/styled-empty-screen-container.js b/packages/asc-web-components/empty-screen-container/styled-empty-screen-container.js index 5e1d262987..0819fb2ec9 100644 --- a/packages/asc-web-components/empty-screen-container/styled-empty-screen-container.js +++ b/packages/asc-web-components/empty-screen-container/styled-empty-screen-container.js @@ -5,6 +5,7 @@ import NoUserSelect from "../utils/commonStyles"; const EmptyContentBody = styled.div` margin: 0 auto; padding: 64px 0; + grid-template-columns: 150px 1fr; display: grid; grid-template-areas: diff --git a/packages/asc-web-components/package.json b/packages/asc-web-components/package.json index d2d3fec258..eb14612fc4 100644 --- a/packages/asc-web-components/package.json +++ b/packages/asc-web-components/package.json @@ -1,6 +1,6 @@ { "name": "@appserver/components", - "version": "1.0.0", + "version": "1.0.1", "private": true, "scripts": { "build": "echo 'skip it'", diff --git a/packages/asc-web-components/search-input/index.js b/packages/asc-web-components/search-input/index.js index 81ad472441..fabb6d786a 100644 --- a/packages/asc-web-components/search-input/index.js +++ b/packages/asc-web-components/search-input/index.js @@ -86,8 +86,8 @@ class SearchInput extends React.Component { } isIconFill={true} iconSize={clearButtonSize} - iconColor="#A3A9AE" - hoverColor="#A3A9AE" + iconColor={this.props.iconColor} + hoverColor={this.props.hoverIconColor} onIconClick={ !!this.state.inputValue || this.props.showClearButton ? this.clearSearch @@ -132,6 +132,8 @@ SearchInput.propTypes = { children: PropTypes.any, /** Accepts css style */ style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]), + iconColor: PropTypes.string, + hoverIconColor: PropTypes.string, }; SearchInput.defaultProps = { @@ -142,6 +144,8 @@ SearchInput.defaultProps = { isDisabled: false, refreshTimeout: 1000, showClearButton: false, + iconColor: "#D0D5DA", + hoverIconColor: "#D0D5DA", }; export default SearchInput; diff --git a/packages/asc-web-components/table-container/StyledTableContainer.js b/packages/asc-web-components/table-container/StyledTableContainer.js index ba38bd0ca5..58ab976482 100644 --- a/packages/asc-web-components/table-container/StyledTableContainer.js +++ b/packages/asc-web-components/table-container/StyledTableContainer.js @@ -26,6 +26,9 @@ const StyledTableContainer = styled.div` margin: 14px 8px 0 auto; z-index: 1; border-right: 2px solid #d0d5da; + &:hover { + border-color: #657077; + } } .table-container_group-menu, @@ -177,6 +180,9 @@ const StyledTableHeaderCell = styled.div` height: 38px; display: flex; align-items: center; + &:hover { + color: #657077; + } } `; diff --git a/packages/asc-web-components/table-container/TableHeaderCell.js b/packages/asc-web-components/table-container/TableHeaderCell.js index ce6f53af0b..b976f936fd 100644 --- a/packages/asc-web-components/table-container/TableHeaderCell.js +++ b/packages/asc-web-components/table-container/TableHeaderCell.js @@ -54,6 +54,7 @@ const TableHeaderCell = ({ iconName="/static/images/sort.desc.react.svg" className="header-container-text-icon" size="small" + hoverColor="#657077" color={isActive ? globalColors.grayMain : globalColors.gray} /> diff --git a/packages/asc-web-components/view-selector/index.js b/packages/asc-web-components/view-selector/index.js index 66d8cbf49e..57fe389f6f 100644 --- a/packages/asc-web-components/view-selector/index.js +++ b/packages/asc-web-components/view-selector/index.js @@ -24,6 +24,7 @@ const ViewSelector = ({ }; const lastIndx = viewSettings && viewSettings.length - 1; + const loadingSVG = () => ; return ( - + ); })} diff --git a/packages/browserslist-config-asc/package.json b/packages/browserslist-config-asc/package.json index 369daa62a5..3bf1d06b66 100644 --- a/packages/browserslist-config-asc/package.json +++ b/packages/browserslist-config-asc/package.json @@ -1,6 +1,6 @@ { "name": "@appserver/browserslist-config-asc", - "version": "1.0.0", + "version": "1.0.1", "description": "Shared browserslist for AppServer libraries and apps", "main": "browserlist.config.js", "scripts": { diff --git a/packages/debug-info/package.json b/packages/debug-info/package.json index 86acc6550a..aa9874d1f8 100644 --- a/packages/debug-info/package.json +++ b/packages/debug-info/package.json @@ -1,6 +1,6 @@ { "name": "@appserver/debug-info", - "version": "1.0.0", + "version": "1.0.1", "private": true, "description": "Command line tool for generating debug info by commit history", "main": "src/index.js", diff --git a/products/ASC.CRM/BackgroundTasks/ASC.CRM.BackgroundTasks.csproj b/products/ASC.CRM/BackgroundTasks/ASC.CRM.BackgroundTasks.csproj index faa74ad106..dab536c2bf 100644 --- a/products/ASC.CRM/BackgroundTasks/ASC.CRM.BackgroundTasks.csproj +++ b/products/ASC.CRM/BackgroundTasks/ASC.CRM.BackgroundTasks.csproj @@ -1,6 +1,6 @@ - net5.0 + net6.0 false diff --git a/products/ASC.CRM/BackgroundTasks/Program.cs b/products/ASC.CRM/BackgroundTasks/Program.cs index dfbbcf9da2..197b3b3e0a 100644 --- a/products/ASC.CRM/BackgroundTasks/Program.cs +++ b/products/ASC.CRM/BackgroundTasks/Program.cs @@ -1,91 +1,91 @@ -using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; using ASC.Api.Core; -using ASC.Common; -using ASC.Common.Caching; -using ASC.Common.DependencyInjection; -using ASC.Common.Utils; -using ASC.ElasticSearch; -using ASC.Web.CRM.Core.Search; +using ASC.Common; +using ASC.Common.Caching; +using ASC.Common.DependencyInjection; +using ASC.Common.Utils; +using ASC.ElasticSearch; +using ASC.Web.CRM.Core.Search; -using Autofac; -using Autofac.Extensions.DependencyInjection; +using Autofac; +using Autofac.Extensions.DependencyInjection; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - - -namespace ASC.CRM.BackgroundTasks -{ - class Program - { - public async static Task Main(string[] args) - { - var host = CreateHostBuilder(args).Build(); - - await host.RunAsync(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .UseSystemd() - .UseWindowsService() - .UseServiceProviderFactory(new AutofacServiceProviderFactory()) - .ConfigureAppConfiguration((hostContext, config) => - { - var buided = config.Build(); - var path = buided["pathToConf"]; - if (!Path.IsPathRooted(path)) - { - path = Path.GetFullPath(CrossPlatform.PathCombine(hostContext.HostingEnvironment.ContentRootPath, path)); - } - config.SetBasePath(path); - var env = hostContext.Configuration.GetValue("ENVIRONMENT", "Production"); - config - .AddInMemoryCollection(new Dictionary - { - {"pathToConf", path } - } - ) - .AddJsonFile("appsettings.json") - .AddJsonFile($"appsettings.{env}.json", true) - .AddJsonFile($"appsettings.services.json", true) - .AddJsonFile("storage.json") +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + + +namespace ASC.CRM.BackgroundTasks +{ + class Program + { + public async static Task Main(string[] args) + { + var host = CreateHostBuilder(args).Build(); + + await host.RunAsync(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .UseSystemd() + .UseWindowsService() + .UseServiceProviderFactory(new AutofacServiceProviderFactory()) + .ConfigureAppConfiguration((hostContext, config) => + { + var buided = config.Build(); + var path = buided["pathToConf"]; + if (!Path.IsPathRooted(path)) + { + path = Path.GetFullPath(CrossPlatform.PathCombine(hostContext.HostingEnvironment.ContentRootPath, path)); + } + config.SetBasePath(path); + var env = hostContext.Configuration.GetValue("ENVIRONMENT", "Production"); + config + .AddInMemoryCollection(new Dictionary + { + {"pathToConf", path } + } + ) + .AddJsonFile("appsettings.json") + .AddJsonFile($"appsettings.{env}.json", true) + .AddJsonFile($"appsettings.services.json", true) + .AddJsonFile("storage.json") .AddJsonFile("notify.json") - .AddJsonFile($"notify.{env}.json", true) - .AddJsonFile("kafka.json") - .AddJsonFile($"kafka.{env}.json", true) - .AddEnvironmentVariables() - .AddCommandLine(args); - }) - .ConfigureServices((hostContext, services) => - { - services.AddMemoryCache(); - - var diHelper = new DIHelper(services); - - diHelper.TryAdd(typeof(ICacheNotify<>), typeof(KafkaCache<>)); - + .AddJsonFile($"notify.{env}.json", true) + .AddJsonFile("kafka.json") + .AddJsonFile($"kafka.{env}.json", true) + .AddEnvironmentVariables() + .AddCommandLine(args); + }) + .ConfigureServices((hostContext, services) => + { + services.AddMemoryCache(); + + var diHelper = new DIHelper(services); + + diHelper.TryAdd(typeof(ICacheNotify<>), typeof(KafkaCache<>)); + diHelper.RegisterProducts(hostContext.Configuration, hostContext.HostingEnvironment.ContentRootPath); - services.AddHostedService(); - diHelper.TryAdd(); - diHelper.TryAdd(); - diHelper.TryAdd(); - diHelper.TryAdd(); - diHelper.TryAdd(); - diHelper.TryAdd(); - diHelper.TryAdd(); - diHelper.TryAdd(); - diHelper.TryAdd(); - }) - .ConfigureContainer((context, builder) => - { - builder.Register(context.Configuration, true, false, "search.json"); + services.AddHostedService(); + diHelper.TryAdd(); + diHelper.TryAdd(); + diHelper.TryAdd(); + diHelper.TryAdd(); + diHelper.TryAdd(); + diHelper.TryAdd(); + diHelper.TryAdd(); + diHelper.TryAdd(); + diHelper.TryAdd(); }) - .ConfigureNLogLogging(); - } -} + .ConfigureContainer((context, builder) => + { + builder.Register(context.Configuration, true, false, "search.json"); + }) + .ConfigureNLogLogging(); + } +} \ No newline at end of file diff --git a/products/ASC.CRM/Client/package.json b/products/ASC.CRM/Client/package.json index 583f5c158d..a66167b429 100644 --- a/products/ASC.CRM/Client/package.json +++ b/products/ASC.CRM/Client/package.json @@ -1,6 +1,6 @@ { "name": "@appserver/crm", - "version": "1.0.0", + "version": "1.0.1", "private": true, "homepage": "/products/crm", "scripts": { diff --git a/products/ASC.CRM/Client/src/i18n.js b/products/ASC.CRM/Client/src/i18n.js index db1337a1ee..cfd53fe032 100644 --- a/products/ASC.CRM/Client/src/i18n.js +++ b/products/ASC.CRM/Client/src/i18n.js @@ -11,7 +11,7 @@ i18n .init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.CRM/Server/ASC.CRM.csproj b/products/ASC.CRM/Server/ASC.CRM.csproj index d43f97aa5f..5f55544984 100644 --- a/products/ASC.CRM/Server/ASC.CRM.csproj +++ b/products/ASC.CRM/Server/ASC.CRM.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false false false @@ -36,15 +36,13 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + diff --git a/products/ASC.CRM/Server/Api/CasesController.cs b/products/ASC.CRM/Server/Api/CasesController.cs index a3bcee3ee9..0d03f636b6 100644 --- a/products/ASC.CRM/Server/Api/CasesController.cs +++ b/products/ASC.CRM/Server/Api/CasesController.cs @@ -43,7 +43,6 @@ using ASC.MessagingSystem; using ASC.Web.Api.Routing; using ASC.Web.Core.Users; using ASC.Web.CRM.Services.NotifyService; -using ASC.Web.Files.Services.WCFService; using AutoMapper; diff --git a/products/ASC.CRM/Server/Api/ReportsController.cs b/products/ASC.CRM/Server/Api/ReportsController.cs index 10cb534b6a..de5af50b27 100644 --- a/products/ASC.CRM/Server/Api/ReportsController.cs +++ b/products/ASC.CRM/Server/Api/ReportsController.cs @@ -35,7 +35,6 @@ using ASC.Core.Common.Settings; using ASC.CRM.ApiModels; using ASC.CRM.Core; using ASC.CRM.Core.Dao; -using ASC.CRM.Core.Enums; using ASC.Web.Api.Routing; using ASC.Web.CRM.Classes; using ASC.Web.Files.Services.DocumentService; diff --git a/products/ASC.CRM/Server/Api/TasksController.cs b/products/ASC.CRM/Server/Api/TasksController.cs index 831cf2ce02..7c4775c80d 100644 --- a/products/ASC.CRM/Server/Api/TasksController.cs +++ b/products/ASC.CRM/Server/Api/TasksController.cs @@ -18,8 +18,9 @@ using ASC.Web.CRM.Services.NotifyService; using AutoMapper; -using Microsoft.AspNetCore.Mvc; - +using Microsoft.AspNetCore.Mvc; + + namespace ASC.CRM.Api { public class TasksController : BaseApiController diff --git a/products/ASC.CRM/Server/Api/UtilsController.cs b/products/ASC.CRM/Server/Api/UtilsController.cs index 764a3a9d11..cb8a780de1 100644 --- a/products/ASC.CRM/Server/Api/UtilsController.cs +++ b/products/ASC.CRM/Server/Api/UtilsController.cs @@ -36,7 +36,6 @@ using ASC.Core.Common.Settings; using ASC.CRM.ApiModels; using ASC.CRM.Core; using ASC.CRM.Core.Dao; -using ASC.CRM.Core.EF; using ASC.CRM.Core.Entities; using ASC.CRM.Core.Enums; using ASC.CRM.Resources; diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchCasesRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchCasesRequestDto.cs index ac44fe2cbd..942c35c6d6 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchCasesRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchCasesRequestDto.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; namespace ASC.CRM.ApiModels { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchContactsRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchContactsRequestDto.cs index be08662eec..b288a6b28d 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchContactsRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchContactsRequestDto.cs @@ -1,13 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Collections.Generic; using ASC.Api.Core; using ASC.CRM.Core.Enums; -using Microsoft.AspNetCore.Mvc; - namespace ASC.CRM.ApiModels { public class AddTagToBatchContactsRequestDto diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchDealsRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchDealsRequestDto.cs index c1dee8a13b..f1152506c7 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchDealsRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchDealsRequestDto.cs @@ -1,13 +1,9 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using ASC.Api.Core; using ASC.CRM.Core.Enums; -using Microsoft.AspNetCore.Mvc; - namespace ASC.CRM.ApiModels { public class AddTagToBatchDealsRequestDto diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchRequestDto.cs index abf7b63938..77dd4f60b8 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/AddTagToBatchRequestDto.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; namespace ASC.CRM.ApiModels { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateContactInfoRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateContactInfoRequestDto.cs index ec564cb878..6bd506ab19 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateContactInfoRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateContactInfoRequestDto.cs @@ -1,12 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - + using ASC.CRM.Core.Enums; -using Microsoft.AspNetCore.Mvc; - namespace ASC.CRM.ApiModels { public class CreateContactInfoRequestDto diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateCurrencyRateRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateCurrencyRateRequestDto.cs index fc84f8940c..f1825d245a 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateCurrencyRateRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateCurrencyRateRequestDto.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; - -namespace ASC.CRM.ApiModels +namespace ASC.CRM.ApiModels { public class CreateCurrencyRateRequestDto { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateInvoiceConverterDataRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateInvoiceConverterDataRequestDto.cs index fefa92b478..6ff8f117a5 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateInvoiceConverterDataRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateInvoiceConverterDataRequestDto.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; - -namespace ASC.CRM.ApiModels +namespace ASC.CRM.ApiModels { public class CreateInvoiceConverterDataRequestDto { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateListItemCategoryRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateListItemCategoryRequestDto.cs index 8b54f8c141..93ff525265 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateListItemCategoryRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateListItemCategoryRequestDto.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; - -namespace ASC.CRM.ApiModels +namespace ASC.CRM.ApiModels { public class CreateListItemCategoryRequestDto { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateMakeCallRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateMakeCallRequestDto.cs index 218e4176a1..ff073f5e5c 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateMakeCallRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateMakeCallRequestDto.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; - -namespace ASC.CRM.ApiModels +namespace ASC.CRM.ApiModels { public class CreateMakeCallRequestDto { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateContactStatusRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateContactStatusRequestDto.cs index 161babd855..384fe05094 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateContactStatusRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateContactStatusRequestDto.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; - -namespace ASC.CRM.ApiModels +namespace ASC.CRM.ApiModels { public class CreateOrUpdateContactStatusRequestDto { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateContactTypeRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateContactTypeRequestDto.cs index a84fd6913c..9fce1bbabf 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateContactTypeRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateContactTypeRequestDto.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; - -namespace ASC.CRM.ApiModels +namespace ASC.CRM.ApiModels { public class CreateOrUpdateContactTypeRequestDto { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateCustomFieldValueRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateCustomFieldValueRequestDto.cs index 25db3a2975..b44f14cba2 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateCustomFieldValueRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateCustomFieldValueRequestDto.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; - -namespace ASC.CRM.ApiModels +namespace ASC.CRM.ApiModels { public class CreateOrUpdateCustomFieldValueRequestDto { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateDealMilestoneRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateDealMilestoneRequestDto.cs index eb0e083665..8090f32bbb 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateDealMilestoneRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateDealMilestoneRequestDto.cs @@ -1,12 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - + using ASC.CRM.Core.Enums; -using Microsoft.AspNetCore.Mvc; - namespace ASC.CRM.ApiModels { public class CreateOrUpdateDealMilestoneRequestDto diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateTaskRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateTaskRequestDto.cs index d40db53d0b..2b512cd91b 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateTaskRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateTaskRequestDto.cs @@ -1,12 +1,7 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using ASC.Api.Core; -using Microsoft.AspNetCore.Mvc; - namespace ASC.CRM.ApiModels { public class CreateOrUpdateTaskRequestDto diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateTaskTemplateRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateTaskTemplateRequestDto.cs index 49c58164c3..867aec01f0 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateTaskTemplateRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateOrUpdateTaskTemplateRequestDto.cs @@ -1,9 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; namespace ASC.CRM.ApiModels { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateTaskGroupRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateTaskGroupRequestDto.cs index 43f8b649e5..d7c26f00c7 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateTaskGroupRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateTaskGroupRequestDto.cs @@ -1,12 +1,7 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using ASC.Api.Core; -using Microsoft.AspNetCore.Mvc; - namespace ASC.CRM.ApiModels { public class CreateTaskGroupRequestDto diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateVoipCallRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateVoipCallRequestDto.cs index 5029e7243d..4f9f6d960b 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateVoipCallRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/CreateVoipCallRequestDto.cs @@ -1,12 +1,7 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using ASC.VoipService; -using Microsoft.AspNetCore.Mvc; - namespace ASC.CRM.ApiModels { public class CreateVoipCallRequestDto diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/GenerateReportRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/GenerateReportRequestDto.cs index be6ffd8a0d..94db44c657 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/GenerateReportRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/GenerateReportRequestDto.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace ASC.CRM.ApiModels +namespace ASC.CRM.ApiModels { public class GenerateReportRequestDto { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/GetMailSMTPToContactsPreviewRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/GetMailSMTPToContactsPreviewRequestDto.cs index 0f9b11ac14..a5eff9bd54 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/GetMailSMTPToContactsPreviewRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/GetMailSMTPToContactsPreviewRequestDto.cs @@ -1,9 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; namespace ASC.CRM.ApiModels { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/ProcessUploadFakeRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/ProcessUploadFakeRequestDto.cs index 4b63b62377..3664b60f3d 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/ProcessUploadFakeRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/ProcessUploadFakeRequestDto.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; - -namespace ASC.CRM.ApiModels +namespace ASC.CRM.ApiModels { public class ProcessUploadFakeRequestDto { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/RelationshipEventCreateTextFileRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/RelationshipEventCreateTextFileRequestDto.cs index 293ab34b42..699a21dc1c 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/RelationshipEventCreateTextFileRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/RelationshipEventCreateTextFileRequestDto.cs @@ -1,9 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; namespace ASC.CRM.ApiModels { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/ReportDataRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/ReportDataRequestDto.cs index a8f6273ebb..a0ba954afa 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/ReportDataRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/ReportDataRequestDto.cs @@ -1,10 +1,6 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using ASC.CRM.Core.Enums; -using Microsoft.AspNetCore.Mvc; namespace ASC.CRM.ApiModels { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/SetCurrencyRatesRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/SetCurrencyRatesRequestDto.cs index 2508988f8b..b9eedce7a0 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/SetCurrencyRatesRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/SetCurrencyRatesRequestDto.cs @@ -1,10 +1,7 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using ASC.CRM.Core; -using Microsoft.AspNetCore.Mvc; namespace ASC.CRM.ApiModels { diff --git a/products/ASC.CRM/Server/ApiModels/RequestsDto/StartImportFromCSVRequestDto.cs b/products/ASC.CRM/Server/ApiModels/RequestsDto/StartImportFromCSVRequestDto.cs index d585e4014c..8c5bf0219b 100644 --- a/products/ASC.CRM/Server/ApiModels/RequestsDto/StartImportFromCSVRequestDto.cs +++ b/products/ASC.CRM/Server/ApiModels/RequestsDto/StartImportFromCSVRequestDto.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using Microsoft.AspNetCore.Mvc; - -namespace ASC.CRM.ApiModels +namespace ASC.CRM.ApiModels { public class StartImportFromCSVRequestDto { diff --git a/products/ASC.CRM/Server/ApiModels/ResponsesDto/ContactInfoDto.cs b/products/ASC.CRM/Server/ApiModels/ResponsesDto/ContactInfoDto.cs index 85f3261a9a..93d11905cf 100644 --- a/products/ASC.CRM/Server/ApiModels/ResponsesDto/ContactInfoDto.cs +++ b/products/ASC.CRM/Server/ApiModels/ResponsesDto/ContactInfoDto.cs @@ -33,8 +33,6 @@ using ASC.CRM.Classes; using ASC.CRM.Core; using ASC.CRM.Core.Enums; -using AutoMapper; - namespace ASC.CRM.ApiModels { /// diff --git a/products/ASC.CRM/Server/ApiModels/ResponsesDto/CurrencyInfoDto.cs b/products/ASC.CRM/Server/ApiModels/ResponsesDto/CurrencyInfoDto.cs index 10bbaaf3ba..30de91bd3c 100644 --- a/products/ASC.CRM/Server/ApiModels/ResponsesDto/CurrencyInfoDto.cs +++ b/products/ASC.CRM/Server/ApiModels/ResponsesDto/CurrencyInfoDto.cs @@ -28,11 +28,7 @@ using System; using ASC.Common.Mapping; -using ASC.Core.Common.EF; using ASC.CRM.Core; -using ASC.Web.Core.Calendars; - -using AutoMapper; namespace ASC.CRM.ApiModels { diff --git a/products/ASC.CRM/Server/ApiModels/ResponsesDto/TaskDto.cs b/products/ASC.CRM/Server/ApiModels/ResponsesDto/TaskDto.cs index 0d9dde56c2..69c095f77a 100644 --- a/products/ASC.CRM/Server/ApiModels/ResponsesDto/TaskDto.cs +++ b/products/ASC.CRM/Server/ApiModels/ResponsesDto/TaskDto.cs @@ -29,12 +29,13 @@ using System; using ASC.Api.Core; using ASC.Common.Mapping; -using ASC.CRM.Core.Entities; +using ASC.CRM.Core.Entities; using ASC.CRM.Mapping; using ASC.Web.Api.Models; -using AutoMapper; - +using AutoMapper; + + namespace ASC.CRM.ApiModels { /// diff --git a/products/ASC.CRM/Server/Classes/ContactPhotoManager.cs b/products/ASC.CRM/Server/Classes/ContactPhotoManager.cs index 78324513f0..4d3264e78f 100644 --- a/products/ASC.CRM/Server/Classes/ContactPhotoManager.cs +++ b/products/ASC.CRM/Server/Classes/ContactPhotoManager.cs @@ -25,25 +25,26 @@ using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; +using System.Collections.Generic; using System.IO; using System.Linq; -using System.Net; - -using ASC.Common; -using ASC.Common.Caching; -using ASC.Common.Logging; -using ASC.Common.Threading; +using System.Net.Http; + +using ASC.Common; +using ASC.Common.Caching; +using ASC.Common.Logging; +using ASC.Common.Threading; using ASC.CRM.Resources; -using ASC.Data.Storage; -using ASC.Web.Core; -using ASC.Web.Core.Utility.Skins; +using ASC.Data.Storage; +using ASC.Web.Core; +using ASC.Web.Core.Utility.Skins; using ASC.Web.CRM.Configuration; -using Microsoft.Extensions.Options; - +using Microsoft.Extensions.Options; + +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; + namespace ASC.Web.CRM.Classes { public class ResizeWorkerItem : DistributedTask @@ -274,19 +275,19 @@ namespace ASC.Web.CRM.Classes { var data = resizeWorkerItem.ImageData; using (var stream = new MemoryStream(data)) - using (var img = new Bitmap(stream)) + using (var img = Image.Load(stream, out var format)) { - var imgFormat = img.RawFormat; - if (fotoSize != img.Size) + var imgFormat = format; + if (fotoSize != img.Size()) { using (var img2 = CommonPhotoManager.DoThumbnail(img, fotoSize, false, false, false)) { - data = CommonPhotoManager.SaveToBytes(img2, Global.GetImgFormatName(imgFormat)); + data = CommonPhotoManager.SaveToBytes(img2, imgFormat); } } else { - data = Global.SaveToBytes(img); + data = CommonPhotoManager.SaveToBytes(img, imgFormat); } var fileExtension = String.Concat("." + Global.GetImgFormatName(imgFormat)); @@ -540,14 +541,15 @@ namespace ASC.Web.CRM.Classes public PhotoData UploadPhoto(String imageUrl, int contactID, bool uploadOnly, bool checkFormat = true) { - var request = (HttpWebRequest)WebRequest.Create(imageUrl); - using (var response = request.GetResponse()) + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(imageUrl); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using (var inputStream = response.Content.ReadAsStream()) { - using (var inputStream = response.GetResponseStream()) - { - var imageData = ToByteArray(inputStream, (int)response.ContentLength); - return UploadPhoto(imageData, contactID, uploadOnly, checkFormat); - } + var imageData = ToByteArray(inputStream, (int)inputStream.Length); + return UploadPhoto(imageData, contactID, uploadOnly, checkFormat); } } @@ -575,18 +577,19 @@ namespace ASC.Web.CRM.Classes public PhotoData UploadPhotoToTemp(String imageUrl, String tmpDirName, bool checkFormat = true) { - var request = (HttpWebRequest)WebRequest.Create(imageUrl); - using (var response = request.GetResponse()) + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(imageUrl); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using (var inputStream = response.Content.ReadAsStream()) { - using (var inputStream = response.GetResponseStream()) + var imageData = ToByteArray(inputStream, (int)inputStream.Length); + if (string.IsNullOrEmpty(tmpDirName)) { - var imageData = ToByteArray(inputStream, (int)response.ContentLength); - if (string.IsNullOrEmpty(tmpDirName)) - { - tmpDirName = Guid.NewGuid().ToString(); - } - return UploadPhotoToTemp(imageData, tmpDirName, checkFormat); + tmpDirName = Guid.NewGuid().ToString(); } + return UploadPhotoToTemp(imageData, tmpDirName, checkFormat); } } @@ -608,14 +611,11 @@ namespace ASC.Web.CRM.Classes return ResizeToBigSize(imageData, tmpDirName); } - public ImageFormat CheckImgFormat(byte[] imageData) + public IImageFormat CheckImgFormat(byte[] imageData) { - using (var stream = new MemoryStream(imageData)) - using (var img = new Bitmap(stream)) + using (var img = Image.Load(imageData, out var format)) { - var format = img.RawFormat; - - if (!format.Equals(ImageFormat.Png) && !format.Equals(ImageFormat.Jpeg)) + if (!format.Name.Equals("PNG") && !format.Equals("JPEG")) throw new Exception(CRMJSResource.ErrorMessage_NotImageSupportFormat); return format; diff --git a/products/ASC.CRM/Server/Classes/Global.cs b/products/ASC.CRM/Server/Classes/Global.cs index 498feadc42..5bc7022eb3 100644 --- a/products/ASC.CRM/Server/Classes/Global.cs +++ b/products/ASC.CRM/Server/Classes/Global.cs @@ -25,8 +25,6 @@ using System; -using System.Drawing; -using System.Drawing.Imaging; using System.Globalization; using System.IO; using System.Text; @@ -44,6 +42,9 @@ using ASC.Web.Studio.Core; using Microsoft.Extensions.Configuration; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; + namespace ASC.Web.CRM.Classes { [Scope] @@ -215,25 +216,9 @@ namespace ASC.Web.CRM.Classes return br.ToArray(); } - public static string GetImgFormatName(ImageFormat format) + public static string GetImgFormatName(IImageFormat format) { - if (format.Equals(ImageFormat.Bmp)) return "bmp"; - if (format.Equals(ImageFormat.Emf)) return "emf"; - if (format.Equals(ImageFormat.Exif)) return "exif"; - if (format.Equals(ImageFormat.Gif)) return "gif"; - if (format.Equals(ImageFormat.Icon)) return "icon"; - if (format.Equals(ImageFormat.Jpeg)) return "jpeg"; - if (format.Equals(ImageFormat.MemoryBmp)) return "MemoryBMP"; - if (format.Equals(ImageFormat.Png)) return "png"; - if (format.Equals(ImageFormat.Tiff)) return "tiff"; - if (format.Equals(ImageFormat.Wmf)) return "wmf"; - - return "jpg"; - } - - public static byte[] SaveToBytes(Image img) - { - return CommonPhotoManager.SaveToBytes(img, GetImgFormatName(img.RawFormat)); + return format.Name.ToLower(); } private static readonly string[] Formats = new[] diff --git a/products/ASC.CRM/Server/Classes/OrganisationLogoManager.cs b/products/ASC.CRM/Server/Classes/OrganisationLogoManager.cs index bbb932eb0e..74aad3924c 100644 --- a/products/ASC.CRM/Server/Classes/OrganisationLogoManager.cs +++ b/products/ASC.CRM/Server/Classes/OrganisationLogoManager.cs @@ -25,8 +25,6 @@ using System; -using System.Drawing; -using System.Drawing.Imaging; using System.IO; using ASC.Common; @@ -39,6 +37,9 @@ using ASC.Web.CRM.Configuration; using Microsoft.Extensions.Options; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; + namespace ASC.Web.CRM.Classes { [Scope] @@ -91,19 +92,19 @@ namespace ASC.Web.CRM.Classes { var data = imageData; using (var stream = new MemoryStream(data)) - using (var img = new Bitmap(stream)) + using (var img = Image.Load(stream, out var format)) { - var imgFormat = img.RawFormat; - if (fotoSize != img.Size) + var imgFormat = format; + if (fotoSize != img.Size()) { using (var img2 = CommonPhotoManager.DoThumbnail(img, fotoSize, false, false, false)) { - data = CommonPhotoManager.SaveToBytes(img2, Global.GetImgFormatName(imgFormat)); + data = CommonPhotoManager.SaveToBytes(img2, imgFormat); } } else { - data = Global.SaveToBytes(img); + data = CommonPhotoManager.SaveToBytes(img, imgFormat); } using (var fileStream = new MemoryStream(data)) @@ -188,7 +189,7 @@ namespace ASC.Web.CRM.Classes } } - public String UploadLogo(byte[] imageData, ImageFormat imageFormat) + public String UploadLogo(byte[] imageData, IImageFormat imageFormat) { var photoPath = BuildFilePath("." + Global.GetImgFormatName(imageFormat)); diff --git a/products/ASC.CRM/Server/Classes/PathProvider.cs b/products/ASC.CRM/Server/Classes/PathProvider.cs index 57cbf7f00a..f97f1faea7 100644 --- a/products/ASC.CRM/Server/Classes/PathProvider.cs +++ b/products/ASC.CRM/Server/Classes/PathProvider.cs @@ -29,11 +29,8 @@ using System; using ASC.Common; -using ASC.Data.Storage; using ASC.Web.Studio.Utility; -using Microsoft.AspNetCore.Http; - #endregion namespace ASC.Web.CRM diff --git a/products/ASC.CRM/Server/Core/Dao/SearchDao.cs b/products/ASC.CRM/Server/Core/Dao/SearchDao.cs index 9bef73446c..85f10363a2 100644 --- a/products/ASC.CRM/Server/Core/Dao/SearchDao.cs +++ b/products/ASC.CRM/Server/Core/Dao/SearchDao.cs @@ -1,3 +1,4 @@ + /* * * (c) Copyright Ascensio System Limited 2010-2018 @@ -49,8 +50,8 @@ using ASC.Web.CRM.Core.Search; using AutoMapper; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; - +using Microsoft.Extensions.Options; + namespace ASC.CRM.Core.Dao { [Scope] diff --git a/products/ASC.CRM/Server/Core/Dao/TaskDao.cs b/products/ASC.CRM/Server/Core/Dao/TaskDao.cs index ac7bffe529..65c9a5c1e2 100644 --- a/products/ASC.CRM/Server/Core/Dao/TaskDao.cs +++ b/products/ASC.CRM/Server/Core/Dao/TaskDao.cs @@ -46,8 +46,8 @@ using ASC.Web.CRM.Core.Search; using AutoMapper; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; - +using Microsoft.Extensions.Options; + namespace ASC.CRM.Core.Dao { [Scope] diff --git a/products/ASC.CRM/Server/Core/Entities/ContactInfo.cs b/products/ASC.CRM/Server/Core/Entities/ContactInfo.cs index ddcb50f367..71dd225682 100644 --- a/products/ASC.CRM/Server/Core/Entities/ContactInfo.cs +++ b/products/ASC.CRM/Server/Core/Entities/ContactInfo.cs @@ -27,7 +27,6 @@ using System; using ASC.Common.Mapping; -using ASC.CRM.ApiModels; using ASC.CRM.Classes; using ASC.CRM.Core.EF; using ASC.CRM.Core.Enums; diff --git a/products/ASC.CRM/Server/Core/Search/BundleSearch.cs b/products/ASC.CRM/Server/Core/Search/BundleSearch.cs index 63781fa021..09c7e2daf9 100644 --- a/products/ASC.CRM/Server/Core/Search/BundleSearch.cs +++ b/products/ASC.CRM/Server/Core/Search/BundleSearch.cs @@ -29,7 +29,6 @@ using System.Linq; using ASC.Common; using ASC.CRM.Core.EF; -using ASC.CRM.Core.Enums; using ASC.ElasticSearch; namespace ASC.Web.CRM.Core.Search diff --git a/products/ASC.CRM/Server/Core/Security/CRMSecurityObjectProvider.cs b/products/ASC.CRM/Server/Core/Security/CRMSecurityObjectProvider.cs index 7afa441282..03deedf6be 100644 --- a/products/ASC.CRM/Server/Core/Security/CRMSecurityObjectProvider.cs +++ b/products/ASC.CRM/Server/Core/Security/CRMSecurityObjectProvider.cs @@ -32,9 +32,9 @@ using System.Collections.Generic; using ASC.Common.Security; using ASC.Common.Security.Authorizing; using ASC.CRM.Core.Entities; -using ASC.CRM.Core.Enums; +using ASC.CRM.Core.Enums; #endregion - + namespace ASC.CRM.Core { public class CrmSecurityObjectProvider : ISecurityObjectProvider diff --git a/products/ASC.CRM/Server/Core/Security/CRMSecutiry.cs b/products/ASC.CRM/Server/Core/Security/CRMSecutiry.cs index 487a326667..290b9953eb 100644 --- a/products/ASC.CRM/Server/Core/Security/CRMSecutiry.cs +++ b/products/ASC.CRM/Server/Core/Security/CRMSecutiry.cs @@ -38,7 +38,7 @@ using ASC.CRM.Core.Dao; using ASC.CRM.Core.Entities; using ASC.CRM.Core.Enums; using ASC.CRM.Resources; -using ASC.Files.Core; +using ASC.Files.Core; using ASC.Files.Core.Security; using ASC.Web.Core; using ASC.Web.Core.Users; @@ -48,9 +48,9 @@ using ASC.Web.CRM.Configuration; using Autofac; using Action = ASC.Common.Security.Authorizing.Action; -using Constants = ASC.Core.Users.Constants; -using SecurityContext = ASC.Core.SecurityContext; - +using Constants = ASC.Core.Users.Constants; +using SecurityContext = ASC.Core.SecurityContext; + namespace ASC.CRM.Core { [Scope] diff --git a/products/ASC.CRM/Server/Mapping/TypeConverter/TaskDtoTypeConverter.cs b/products/ASC.CRM/Server/Mapping/TypeConverter/TaskDtoTypeConverter.cs index 66ec0c4aea..8d17be88a2 100644 --- a/products/ASC.CRM/Server/Mapping/TypeConverter/TaskDtoTypeConverter.cs +++ b/products/ASC.CRM/Server/Mapping/TypeConverter/TaskDtoTypeConverter.cs @@ -30,12 +30,12 @@ using ASC.Common; using ASC.CRM.ApiModels; using ASC.CRM.Core; using ASC.CRM.Core.Dao; -using ASC.CRM.Core.Entities; +using ASC.CRM.Core.Entities; using ASC.CRM.Core.Enums; using ASC.Web.Api.Models; -using AutoMapper; - +using AutoMapper; + namespace ASC.CRM.Mapping { [Scope] diff --git a/products/ASC.CRM/Server/Services/NotifyService/NotifyClient.cs b/products/ASC.CRM/Server/Services/NotifyService/NotifyClient.cs index f010d39d95..7cee5ecc14 100644 --- a/products/ASC.CRM/Server/Services/NotifyService/NotifyClient.cs +++ b/products/ASC.CRM/Server/Services/NotifyService/NotifyClient.cs @@ -47,8 +47,8 @@ using ASC.Notify.Patterns; using ASC.Notify.Recipients; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; - +using Microsoft.Extensions.Options; + namespace ASC.Web.CRM.Services.NotifyService { [Scope] diff --git a/products/ASC.CRM/Server/Utils/CurrencyProvider.cs b/products/ASC.CRM/Server/Utils/CurrencyProvider.cs index 0807d1eec3..a0823e282b 100644 --- a/products/ASC.CRM/Server/Utils/CurrencyProvider.cs +++ b/products/ASC.CRM/Server/Utils/CurrencyProvider.cs @@ -29,17 +29,15 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; -using System.Net; -using System.Text.RegularExpressions; - -using ASC.Common; -using ASC.Common.Logging; -using ASC.Core.Common.Settings; +using System.Net.Http; +using System.Text.RegularExpressions; + +using ASC.Common; +using ASC.Common.Logging; +using ASC.Core.Common.Settings; using ASC.CRM.Core; using ASC.CRM.Core.Dao; -using Autofac; - using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; @@ -331,20 +329,23 @@ namespace ASC.Web.CRM.Classes var destinationURI = new Uri(String.Format("https://themoneyconverter.com/{0}/{0}.aspx", currency)); - var request = (HttpWebRequest)WebRequest.Create(destinationURI); - request.Method = "GET"; - request.AllowAutoRedirect = true; - request.MaximumAutomaticRedirections = 2; - request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"; - request.UseDefaultCredentials = true; + var request = new HttpRequestMessage(); + request.RequestUri = destinationURI; + request.Method = HttpMethod.Get; + request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0"); - using (var response = (HttpWebResponse)request.GetResponse()) - using (var responseStream = new StreamReader(response.GetResponseStream())) + var handler = new HttpClientHandler(); + handler.AllowAutoRedirect = true; + handler.MaxAutomaticRedirections = 2; + handler.UseDefaultCredentials = true; + + var httpClient = new HttpClient(handler); + using var response = httpClient.Send(request); + using (var responseStream = new StreamReader(response.Content.ReadAsStream())) { var data = responseStream.ReadToEnd(); File.WriteAllText(filepath, data); - } } catch (Exception error) diff --git a/products/ASC.CRM/Server/Utils/ExportToCSV.cs b/products/ASC.CRM/Server/Utils/ExportToCSV.cs index 09c4fbe7e0..ad2fd70f9b 100644 --- a/products/ASC.CRM/Server/Utils/ExportToCSV.cs +++ b/products/ASC.CRM/Server/Utils/ExportToCSV.cs @@ -58,8 +58,8 @@ using ASC.Web.Studio.Utility; using ICSharpCode.SharpZipLib.Zip; -using Microsoft.Extensions.Options; - +using Microsoft.Extensions.Options; + namespace ASC.Web.CRM.Classes { [Transient] diff --git a/products/ASC.CRM/Server/Utils/Import/CSV/ImportTasks.cs b/products/ASC.CRM/Server/Utils/Import/CSV/ImportTasks.cs index 208b1c1a0d..524482846b 100644 --- a/products/ASC.CRM/Server/Utils/Import/CSV/ImportTasks.cs +++ b/products/ASC.CRM/Server/Utils/Import/CSV/ImportTasks.cs @@ -33,15 +33,15 @@ using System.Linq; using ASC.Core.Tenants; using ASC.Core.Users; using ASC.CRM.Core.Dao; -using ASC.CRM.Core.Entities; +using ASC.CRM.Core.Entities; using ASC.CRM.Core.Enums; using ASC.CRM.Resources; using ASC.Web.Core.Users; -using LumenWorks.Framework.IO.Csv; - +using LumenWorks.Framework.IO.Csv; + #endregion - + namespace ASC.Web.CRM.Classes { public partial class ImportDataOperation diff --git a/products/ASC.CRM/Server/Utils/PdfCreator.cs b/products/ASC.CRM/Server/Utils/PdfCreator.cs index 639716f077..d45abb0c69 100644 --- a/products/ASC.CRM/Server/Utils/PdfCreator.cs +++ b/products/ASC.CRM/Server/Utils/PdfCreator.cs @@ -27,22 +27,24 @@ using System; using System.Globalization; using System.IO; -using System.Net; +using System.Net.Http; using System.Text; -using System.Xml; - -using ASC.Common; -using ASC.Common.Logging; +using System.Xml; + +using ASC.Common; +using ASC.Common.Logging; using ASC.CRM.Core.Dao; using ASC.CRM.Core.Entities; using ASC.CRM.Resources; using ASC.Files.Core; -using ASC.Web.Files.Services.DocumentService; - -using ICSharpCode.SharpZipLib.Zip; - +using ASC.Web.Files.Services.DocumentService; + +using ICSharpCode.SharpZipLib.Zip; + using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; + +using SixLabors.ImageSharp; namespace ASC.Web.CRM.Classes { @@ -125,13 +127,13 @@ namespace ASC.Web.CRM.Classes file.Title = string.Format("{0}{1}", invoice.Number, FormatPdf); file.FolderID = _daoFactory.GetFileDao().GetRoot(); - var request = WebRequest.Create(urlToFile); + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(urlToFile); - using (var response = request.GetResponse()) - using (var stream = response.GetResponseStream()) + using (var httpClient = new HttpClient()) + using (var response = httpClient.Send(request)) + using (var stream = response.Content.ReadAsStream()) { - file.ContentLength = response.ContentLength; - _logger.DebugFormat("PdfCreator. CreateAndSaveFile. Invoice ID = {0}. SaveFile", invoiceId); file = _daoFactory.GetFileDao().SaveFile(file, stream); } @@ -244,27 +246,27 @@ namespace ASC.Web.CRM.Classes { File file = null; - var request = (HttpWebRequest)WebRequest.Create(url); + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(url); - using (var response = request.GetResponse()) + using var httpClient = new HttpClient(); + + using (var stream = httpClient.Send(request).Content.ReadAsStream()) { - using (var stream = response.GetResponseStream()) + if (stream != null) { - if (stream != null) + var document = _serviceProvider.GetService>(); + + document.Title = string.Format("{0}{1}", data.Number, FormatPdf); + document.FolderID = _daoFactory.GetFileDao().GetRoot(); + document.ContentLength = stream.Length; + + if (data.GetInvoiceFile(daoFactory) != null) { - var document = _serviceProvider.GetService>(); - - document.Title = string.Format("{0}{1}", data.Number, FormatPdf); - document.FolderID = _daoFactory.GetFileDao().GetRoot(); - document.ContentLength = response.ContentLength; - - if (data.GetInvoiceFile(daoFactory) != null) - { - document.ID = data.FileID; - } - - file = _daoFactory.GetFileDao().SaveFile(document, stream); + document.ID = data.FileID; } + + file = _daoFactory.GetFileDao().SaveFile(document, stream); } } @@ -389,8 +391,7 @@ namespace ASC.Web.CRM.Classes } else { - using (var stream = new MemoryStream(logo)) - using (var img = System.Drawing.Image.FromStream(stream)) + using (var img = Image.Load(logo)) { var cx = img.Width * 9525; //1px = 9525emu var cy = img.Height * 9525; //1px = 9525emu diff --git a/products/ASC.CRM/Server/Utils/ReportHelper.cs b/products/ASC.CRM/Server/Utils/ReportHelper.cs index a01547114e..6cf7eed67d 100644 --- a/products/ASC.CRM/Server/Utils/ReportHelper.cs +++ b/products/ASC.CRM/Server/Utils/ReportHelper.cs @@ -26,7 +26,7 @@ using System; using System.Collections.Generic; -using System.Net; +using System.Net.Http; using System.Text.Json; using ASC.Common; @@ -221,11 +221,12 @@ namespace ASC.Web.CRM.Classes .Replace("${reportData}", JsonSerializer.Serialize(data)); } - private void SaveReportFile(ReportState state, string url) + private async void SaveReportFile(ReportState state, string url) { - var data = new WebClient().DownloadData(url); + using var httpClient = new HttpClient(); + var responseData = await httpClient.GetByteArrayAsync(url); - using (var stream = new System.IO.MemoryStream(data)) + using (var stream = new System.IO.MemoryStream(responseData)) { var document = _serviceProvider.GetService>(); diff --git a/products/ASC.Calendar/Client/package.json b/products/ASC.Calendar/Client/package.json index 526e573c51..58fdc394f5 100644 --- a/products/ASC.Calendar/Client/package.json +++ b/products/ASC.Calendar/Client/package.json @@ -1,6 +1,6 @@ { "name": "@appserver/calendar", - "version": "1.0.0", + "version": "1.0.1", "private": true, "homepage": "/products/calendar", "scripts": { diff --git a/products/ASC.Calendar/Client/src/i18n.js b/products/ASC.Calendar/Client/src/i18n.js index db1337a1ee..cfd53fe032 100644 --- a/products/ASC.Calendar/Client/src/i18n.js +++ b/products/ASC.Calendar/Client/src/i18n.js @@ -11,7 +11,7 @@ i18n .init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.Calendar/Server/ASC.Calendar.csproj b/products/ASC.Calendar/Server/ASC.Calendar.csproj index f975745201..4b66ffcc18 100644 --- a/products/ASC.Calendar/Server/ASC.Calendar.csproj +++ b/products/ASC.Calendar/Server/ASC.Calendar.csproj @@ -1,7 +1,7 @@ - net5.0 + net6.0 false false false @@ -19,15 +19,15 @@ - - - - + + - + + true + diff --git a/products/ASC.Calendar/Server/AccessRights.cs b/products/ASC.Calendar/Server/AccessRights.cs index eea7575140..e1de71538e 100644 --- a/products/ASC.Calendar/Server/AccessRights.cs +++ b/products/ASC.Calendar/Server/AccessRights.cs @@ -25,9 +25,7 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; + using Action = ASC.Common.Security.Authorizing.Action; namespace ASC.Calendar diff --git a/products/ASC.Calendar/Server/BusinessObjects/Calendar.cs b/products/ASC.Calendar/Server/BusinessObjects/Calendar.cs index 37527671d5..1075f46948 100644 --- a/products/ASC.Calendar/Server/BusinessObjects/Calendar.cs +++ b/products/ASC.Calendar/Server/BusinessObjects/Calendar.cs @@ -27,7 +27,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Runtime.Serialization; using ASC.Core; using ASC.Api.Core; @@ -35,8 +34,6 @@ using ASC.Common.Security; using ASC.Common.Security.Authorizing; using ASC.Web.Core.Calendars; using ASC.Calendar.Models; -using System.Net; -using System.IO; using ASC.Calendar.iCalParser; using ASC.Common.Utils; diff --git a/products/ASC.Calendar/Server/BusinessObjects/DataProvider.cs b/products/ASC.Calendar/Server/BusinessObjects/DataProvider.cs index c35b01356b..a346f49277 100644 --- a/products/ASC.Calendar/Server/BusinessObjects/DataProvider.cs +++ b/products/ASC.Calendar/Server/BusinessObjects/DataProvider.cs @@ -26,11 +26,11 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Net; +using System.Net.Http; using System.Text; using System.Web; + using ASC.Api.Core; using ASC.Calendar.Core.Dao; using ASC.Calendar.Core.Dao.Models; @@ -44,6 +44,7 @@ using ASC.Core.Common.EF; using ASC.Core.Users; using ASC.Security.Cryptography; using ASC.Web.Core.Calendars; + using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; @@ -798,15 +799,17 @@ namespace ASC.Calendar.BusinessObjects try { - var webRequest = (HttpWebRequest)WebRequest.Create(requestUrl); - webRequest.Method = "DELETE"; - webRequest.ContentType = "text/xml; charset=utf-8"; + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(requestUrl); + request.Method = HttpMethod.Delete; var authorization = isShared ? GetSystemAuthorization() : GetUserAuthorization(email); - webRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); - using (var webResponse = webRequest.GetResponse()) - using (var reader = new StreamReader(webResponse.GetResponseStream())){} + request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); + request.Headers.Add("Content-Type", "text/xml; charset=utf-8"); + + using var httpClient = new HttpClient(); + httpClient.Send(request); } catch (Exception ex) { diff --git a/products/ASC.Calendar/Server/BusinessObjects/Event.cs b/products/ASC.Calendar/Server/BusinessObjects/Event.cs index 25525c501f..d424f93965 100644 --- a/products/ASC.Calendar/Server/BusinessObjects/Event.cs +++ b/products/ASC.Calendar/Server/BusinessObjects/Event.cs @@ -26,19 +26,16 @@ using System; using System.Collections.Generic; -using System.Runtime.Serialization; using ASC.Common.Security; using ASC.Common.Security.Authorizing; -using ASC.Calendar.Models; using ASC.Web.Core.Calendars; -using ASC.Core.Tenants; using ASC.Core; using ASC.Common.Utils; using ASC.Calendar.iCalParser; namespace ASC.Calendar.BusinessObjects -{ - +{ + [AllDayLongUTCAttribute] public class Event : BaseEvent, ISecurityObject { diff --git a/products/ASC.Calendar/Server/BusinessObjects/Todo.cs b/products/ASC.Calendar/Server/BusinessObjects/Todo.cs index cd5ba92eac..89aefc785e 100644 --- a/products/ASC.Calendar/Server/BusinessObjects/Todo.cs +++ b/products/ASC.Calendar/Server/BusinessObjects/Todo.cs @@ -26,12 +26,9 @@ using System; using System.Collections.Generic; -using System.Runtime.Serialization; using ASC.Common.Security; using ASC.Common.Security.Authorizing; -using ASC.Calendar.Models; using ASC.Web.Core.Calendars; -using ASC.Core.Tenants; using ASC.Core; using ASC.Common.Utils; using ASC.Calendar.iCalParser; diff --git a/products/ASC.Calendar/Server/BusinessObjects/UserViewSettings.cs b/products/ASC.Calendar/Server/BusinessObjects/UserViewSettings.cs index e2667af8d7..8e7bb104ce 100644 --- a/products/ASC.Calendar/Server/BusinessObjects/UserViewSettings.cs +++ b/products/ASC.Calendar/Server/BusinessObjects/UserViewSettings.cs @@ -25,9 +25,7 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; + using ASC.Web.Core.Calendars; namespace ASC.Calendar.BusinessObjects diff --git a/products/ASC.Calendar/Server/Controllers/CalendarController.cs b/products/ASC.Calendar/Server/Controllers/CalendarController.cs index 583472b381..e5f7941219 100644 --- a/products/ASC.Calendar/Server/Controllers/CalendarController.cs +++ b/products/ASC.Calendar/Server/Controllers/CalendarController.cs @@ -30,6 +30,7 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using System.Security; using System.Text; using System.Text.Json; @@ -46,23 +47,23 @@ using ASC.Calendar.ExternalCalendars; using ASC.Calendar.iCalParser; using ASC.Calendar.Models; using ASC.Calendar.Notification; -using ASC.Common; -using ASC.Common.Logging; -using ASC.Common.Security; -using ASC.Common.Utils; -using ASC.Common.Web; -using ASC.Core; -using ASC.Core.Tenants; -using ASC.Core.Users; -using ASC.Security.Cryptography; +using ASC.Common; +using ASC.Common.Logging; +using ASC.Common.Security; +using ASC.Common.Utils; +using ASC.Common.Web; +using ASC.Core; +using ASC.Core.Tenants; +using ASC.Core.Users; +using ASC.Security.Cryptography; using ASC.Web.Api.Routing; using ASC.Web.Core.Calendars; -using ASC.Web.Core.Users; -using ASC.Web.Studio.Core; -using ASC.Web.Studio.Utility; +using ASC.Web.Core.Users; +using ASC.Web.Studio.Core; +using ASC.Web.Studio.Utility; -using Ical.Net.CalendarComponents; -using Ical.Net.DataTypes; +using Ical.Net.CalendarComponents; +using Ical.Net.DataTypes; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -82,35 +83,35 @@ namespace ASC.Calendar.Controllers private static List updatedEvents = new List(); private ProductEntryPoint ProductEntryPoint { get; } - public Tenant Tenant { get { return ApiContext.Tenant; } } - public ApiContext ApiContext { get; } - public AuthContext AuthContext { get; } - public UserManager UserManager { get; } - public DataProvider DataProvider { get; } - public ILog Log { get; } + private Tenant Tenant { get { return ApiContext.Tenant; } } + private ApiContext ApiContext { get; } + private AuthContext AuthContext { get; } + private UserManager UserManager { get; } + private DataProvider DataProvider { get; } + private ILog Log { get; } private TenantManager TenantManager { get; } - public TimeZoneConverter TimeZoneConverter { get; } - public CalendarWrapperHelper CalendarWrapperHelper { get; } - public DisplayUserSettingsHelper DisplayUserSettingsHelper { get; } + private TimeZoneConverter TimeZoneConverter { get; } + private CalendarWrapperHelper CalendarWrapperHelper { get; } + private DisplayUserSettingsHelper DisplayUserSettingsHelper { get; } private AuthorizationManager AuthorizationManager { get; } private AuthManager Authentication { get; } private CalendarNotifyClient CalendarNotifyClient { get; } - public DDayICalParser DDayICalParser { get; } - public new HttpContext HttpContext { get; set; } - public PermissionContext PermissionContext { get; } - public EventHistoryWrapperHelper EventHistoryWrapperHelper { get; } - public EventWrapperHelper EventWrapperHelper { get; } - public EventHistoryHelper EventHistoryHelper { get; } - public PublicItemCollectionHelper PublicItemCollectionHelper { get; } - public TodoWrapperHelper TodoWrapperHelper { get; } - public Signature Signature { get; } - public SecurityContext SecurityContext { get; } - public ExportDataCache ExportDataCache { get; } - public SubscriptionWrapperHelper SubscriptionWrapperHelper { get; } - public EmailValidationKeyProvider EmailValidationKeyProvider { get; } - public SetupInfo SetupInfo { get; } - public InstanceCrypto InstanceCrypto { get; } - public CalendarManager CalendarManager { get; } + private DDayICalParser DDayICalParser { get; } + private new HttpContext HttpContext { get; set; } + private PermissionContext PermissionContext { get; } + private EventHistoryWrapperHelper EventHistoryWrapperHelper { get; } + private EventWrapperHelper EventWrapperHelper { get; } + private EventHistoryHelper EventHistoryHelper { get; } + private PublicItemCollectionHelper PublicItemCollectionHelper { get; } + private TodoWrapperHelper TodoWrapperHelper { get; } + private Signature Signature { get; } + private SecurityContext SecurityContext { get; } + private ExportDataCache ExportDataCache { get; } + private SubscriptionWrapperHelper SubscriptionWrapperHelper { get; } + private EmailValidationKeyProvider EmailValidationKeyProvider { get; } + private SetupInfo SetupInfo { get; } + private InstanceCrypto InstanceCrypto { get; } + private CalendarManager CalendarManager { get; } public CalendarController( @@ -312,10 +313,10 @@ namespace ASC.Calendar.Controllers //internal var calendars = DataProvider.LoadCalendarsForUser(SecurityContext.CurrentAccount.ID, out newCalendarsCount); - result.AddRange(calendars.ConvertAll(c => CalendarWrapperHelper.Get(c))); - - - //external + result.AddRange(calendars.ConvertAll(c => CalendarWrapperHelper.Get(c))); + + + //external var extCalendars = CalendarManager.GetCalendarsForUser(SecurityContext.CurrentAccount.ID, UserManager); var viewSettings = DataProvider.GetUserViewSettings(SecurityContext.CurrentAccount.ID, extCalendars.ConvertAll(c => c.Id)); @@ -338,16 +339,16 @@ namespace ASC.Calendar.Controllers else result.ForEach(c => c.Events = c.UserCalendar.GetEventWrappers(SecurityContext.CurrentAccount.ID, startDate, endDate, EventWrapperHelper)); - result.AddRange(extCalendarsWrappers); - - //TODO for personal + result.AddRange(extCalendarsWrappers); + + //TODO for personal /* //remove all subscription except ical streams result.RemoveAll(c => c.IsSubscription && !c.IsiCalStream); result.ForEach(c => c.Events = c.UserCalendar.GetEventWrappers(SecurityContext.CurrentAccount.ID, startDate, endDate)); - */ - + */ + var days = new List(); foreach (var cal in result) { @@ -397,7 +398,7 @@ namespace ASC.Calendar.Controllers .FindAll(c => c.IsAcceptedSubscription); - extCalendarsWrappers.ForEach(c => + extCalendarsWrappers.ForEach(c => { c.Events = c.UserCalendar.GetEventWrappers(SecurityContext.CurrentAccount.ID, startDate, endDate, EventWrapperHelper); c.Todos = c.UserCalendar.GetTodoWrappers(SecurityContext.CurrentAccount.ID, startDate, endDate, TodoWrapperHelper); @@ -473,11 +474,11 @@ namespace ASC.Calendar.Controllers // var path = UrlPath.ResolveUrl(() => new CalendarApi().GetCalendariCalStream(calendarId, sig)); - var path = "api/2.0/calendar/" + calendarId + "/ical/" + sig; - + var path = "api/2.0/calendar/" + calendarId + "/ical/" + sig; + var result = new Uri(HttpContext.Request.GetUrlRewriter(), VirtualPathUtility.ToAbsolute("~/" + path)).ToString(); - return new{result}; + return new { result }; } /// @@ -529,7 +530,7 @@ namespace ASC.Calendar.Controllers todoCal = CreateCalendar(todoCalModel); if (todoCal != null) - { + { try { var dataCaldavGuid = DataProvider.GetCalDavGuid(todoCal.Id); @@ -588,7 +589,7 @@ namespace ASC.Calendar.Controllers todoCalendars[0].calDavGuid.ToString(), myUri, curCaldavUserName, - userName + userName ); } return sharedCalUrl; @@ -608,8 +609,8 @@ namespace ASC.Calendar.Controllers if (SecurityContext.IsAuthenticated) { - var sharedCalendar = GetCalendarById(calendarId); - + var sharedCalendar = GetCalendarById(calendarId); + var currentCaldavUserName = userName + "@" + caldavHost; var sharedCalUrl = new Uri(new Uri(calDavServerUrl), "/caldav/" + currentCaldavUserName + "/" + calendarId + "-shared").ToString(); @@ -719,7 +720,7 @@ namespace ASC.Calendar.Controllers var team = caldavCalendarModel.Team; try - { + { var myUri = HttpContext.Request.GetUrlRewriter(); var caldavHost = myUri.Host; @@ -891,7 +892,7 @@ namespace ASC.Calendar.Controllers } } } - catch(Exception ex) + catch (Exception ex) { Log.Error(String.Format("Error: {0}", ex.Message)); } @@ -902,7 +903,7 @@ namespace ASC.Calendar.Controllers { SecurityContext.AuthenticateMeWithoutCookie(currentUserId); } - } + } } } catch (Exception ex) @@ -1011,8 +1012,8 @@ namespace ASC.Calendar.Controllers var calendarIcs = GetCalendariCalString(icalendar.Id, true); var tenant = TenantManager.GetCurrentTenant(); - var caldavTask = isShared - ? new Task(() => CreateCaldavSharedEvents(calDavGuid.ToString(), calendarIcs, myUri, email,icalendar, SecurityContext.CurrentAccount, tenant.TenantId)) + var caldavTask = isShared + ? new Task(() => CreateCaldavSharedEvents(calDavGuid.ToString(), calendarIcs, myUri, email, icalendar, SecurityContext.CurrentAccount, tenant.TenantId)) : new Task(() => CreateCaldavEvents(calDavGuid.ToString(), myUri, email, icalendar, calendarIcs, tenant.TenantId)); caldavTask.Start(); @@ -1025,16 +1026,18 @@ namespace ASC.Calendar.Controllers private string GetUserCaldavCalendar(string calUrl, string encoded) { var authorization = DataProvider.GetUserAuthorization(encoded); - - var webRequest = (HttpWebRequest)WebRequest.Create(calUrl); - webRequest.Method = "GET"; - webRequest.ContentType = "text/calendar; charset=utf-8"; - webRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); + + var request = new HttpRequestMessage(); + request.Method = HttpMethod.Get; + request.RequestUri = new Uri(calUrl); + request.Headers.Add("Content-Type", "text/xml; charset=utf-8"); + request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); try - { - using (var webResponse = webRequest.GetResponse()) - using (var reader = new StreamReader(webResponse.GetResponseStream())) + { + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using (var reader = new StreamReader(response.Content.ReadAsStream())) { string ics = reader.ReadToEnd(); if (!string.IsNullOrEmpty(ics)) @@ -1045,15 +1048,11 @@ namespace ASC.Calendar.Controllers } } - catch (WebException exception) + catch (HttpRequestException exception) { - if (exception.Status == WebExceptionStatus.ProtocolError && exception.Response != null) + if (exception.StatusCode == HttpStatusCode.NotFound) { - var resp = (HttpWebResponse)exception.Response; - if (resp.StatusCode == HttpStatusCode.NotFound) - { - return "NotFound"; - } + return "NotFound"; } Log.Info("ERROR. Get calendar CalDav url: " + exception.Message); return ""; @@ -1082,29 +1081,25 @@ namespace ASC.Calendar.Controllers "" + "" + name + "" + "" + color + "" + - "" + description + ""; - + "" + description + ""; + var requestUrl = calDavServerUrl + "/" + HttpUtility.UrlEncode(currentUserName) + "/" + calDavGuid + (isSharedCalendar ? "-shared" : ""); try - { - var webRequest = (HttpWebRequest)WebRequest.Create(requestUrl); - webRequest.Method = "MKCOL"; - webRequest.ContentType = "text/plain;charset=UTF-8"; + { + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(requestUrl); + request.Method = new HttpMethod("MKCOL"); var authorization = isSharedCalendar ? DataProvider.GetSystemAuthorization() : DataProvider.GetUserAuthorization(email); - webRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); + request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); - var encoding = new UTF8Encoding(); - byte[] bytes = encoding.GetBytes(data); - webRequest.ContentLength = bytes.Length; - using (Stream writeStream = webRequest.GetRequestStream()) - { - writeStream.Write(bytes, 0, bytes.Length); - } + request.Content = new StringContent(data, Encoding.UTF8, "text/xml"); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); - using (var webResponse = webRequest.GetResponse()) - using (var reader = new StreamReader(webResponse.GetResponseStream())) + using (var reader = new StreamReader(response.Content.ReadAsStream())) { reader.ReadToEnd(); return calDavServerUrl + "/" + currentUserName + "/" + calDavGuid + (isSharedCalendar ? "-shared" : ""); @@ -1178,7 +1173,7 @@ namespace ASC.Calendar.Controllers var icalFormat = GetCalendariCalString(calendarId); if (icalFormat != null) { - resp = new FileStreamResult(new MemoryStream(Encoding.UTF8.GetBytes(icalFormat)), "text/calendar"); + resp = new FileStreamResult(new MemoryStream(Encoding.UTF8.GetBytes(icalFormat)), "text/calendar"); resp.FileDownloadName = calendarId + ".ics"; } } @@ -1269,10 +1264,13 @@ namespace ASC.Calendar.Controllers if (!string.IsNullOrEmpty(calendar.ICalUrl)) { try - { - var req = (HttpWebRequest)WebRequest.Create(calendar.ICalUrl); - using (var resp = req.GetResponse()) - using (var stream = resp.GetResponseStream()) + { + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(calendar.ICalUrl); + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + + using (var stream = response.Content.ReadAsStream()) { var ms = new MemoryStream(); stream.CopyTo(ms); @@ -1331,10 +1329,13 @@ namespace ASC.Calendar.Controllers if (!string.IsNullOrEmpty(iCalUrl)) { try - { - var req = (HttpWebRequest)WebRequest.Create(iCalUrl); - using (var resp = req.GetResponse()) - using (var stream = resp.GetResponseStream()) + { + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(iCalUrl); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using (var stream = response.Content.ReadAsStream()) { var ms = new MemoryStream(); stream.CopyTo(ms); @@ -1462,8 +1463,8 @@ namespace ASC.Calendar.Controllers var replaceSharingEventThread = new Thread(() => { - TenantManager.SetCurrentTenant(currentTenantId); - + TenantManager.SetCurrentTenant(currentTenantId); + foreach (var sharingOption in oldSharingList) { if (!sharingOption.IsGroup) @@ -1627,8 +1628,8 @@ namespace ASC.Calendar.Controllers var replaceSharingEventThread = new Thread(() => { - TenantManager.SetCurrentTenant(currentTenantId); - + TenantManager.SetCurrentTenant(currentTenantId); + foreach (var sharingOption in sharingList) { if (!sharingOption.IsGroup) @@ -1718,7 +1719,7 @@ namespace ASC.Calendar.Controllers { string[] split = evt.Uid.Split(new Char[] { '@' }); var myUri = HttpContext.Request.GetUrlRewriter(); - var email = UserManager.GetUsers(SecurityContext.CurrentAccount.ID).Email; + var email = UserManager.GetUsers(SecurityContext.CurrentAccount.ID).Email; var fullAccess = CheckPermissions(evt, CalendarAccessRights.FullAccessAction, true); deleteEvent(fullAccess ? split[0] + "_write" : split[0], SharedEventsCalendar.CalendarId, email, myUri, SecurityContext.CurrentAccount.ID != evt.OwnerId); @@ -1728,8 +1729,8 @@ namespace ASC.Calendar.Controllers } private void deleteEvent(string uid, string calendarId, string email, Uri myUri, bool isShared = false) - { - + { + try { var сaldavGuid = ""; @@ -1756,30 +1757,23 @@ namespace ASC.Calendar.Controllers var requestUrl = calDavServerUrl + "/" + HttpUtility.UrlEncode(currentUserName) + "/" + (isShared ? сaldavGuid + "-shared" : сaldavGuid) + "/" + uid + ".ics"; try - { - var webRequest = (HttpWebRequest)WebRequest.Create(requestUrl); - webRequest.Method = "DELETE"; - + { + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(requestUrl); + request.Method = HttpMethod.Delete; + var authorization = isShared ? DataProvider.GetSystemAuthorization() : DataProvider.GetUserAuthorization(email); - webRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); + request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); - using (var webResponse = webRequest.GetResponse()) - using (var reader = new StreamReader(webResponse.GetResponseStream())) { } + using var httpClient = new HttpClient(); + httpClient.Send(request); } - catch (WebException ex) + catch (HttpRequestException ex) { - if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null) - { - var resp = (HttpWebResponse)ex.Response; - if (resp.StatusCode == HttpStatusCode.NotFound || resp.StatusCode == HttpStatusCode.Conflict) - Log.Debug("ERROR: " + ex.Message); - else - Log.Error("ERROR: " + ex.Message); - } + if (ex.StatusCode == HttpStatusCode.NotFound || ex.StatusCode == HttpStatusCode.Conflict) + Log.Debug("ERROR: " + ex.Message); else - { Log.Error("ERROR: " + ex.Message); - } } catch (Exception ex) { @@ -2124,7 +2118,7 @@ namespace ASC.Calendar.Controllers } }); - updateCaldavThread.Start(); + updateCaldavThread.Start(); } catch (Exception e) { @@ -2265,8 +2259,8 @@ namespace ASC.Calendar.Controllers var calDavGuid = calendarObj != null ? calendarObj.calDavGuid : ""; var myUri = HttpContext.Request.GetUrlRewriter(); - var currentUserEmail = UserManager.GetUsers(AuthContext.CurrentAccount.ID).Email.ToLower(); - + var currentUserEmail = UserManager.GetUsers(AuthContext.CurrentAccount.ID).Email.ToLower(); + var isFullAccess = PermissionContext.PermissionResolver.Check(AuthContext.CurrentAccount, evt, null, CalendarAccessRights.FullAccessAction); var isShared = false; @@ -2578,8 +2572,8 @@ namespace ASC.Calendar.Controllers try { var calDavGuid = cal != null ? cal.calDavGuid : ""; - var currentUserEmail = UserManager.GetUsers(AuthContext.CurrentAccount.ID).Email.ToLower(); - + var currentUserEmail = UserManager.GetUsers(AuthContext.CurrentAccount.ID).Email.ToLower(); + var calendarObj = DataProvider.GetCalendarById(Convert.ToInt32(cal.Id)); var calendarObjViewSettings = calendarObj != null && calendarObj.ViewSettings != null ? calendarObj.ViewSettings.FirstOrDefault() : null; var targetCalendar = DDayICalParser.ConvertCalendar(calendarObj != null ? calendarObj.GetUserCalendar(calendarObjViewSettings) : null); @@ -2846,8 +2840,8 @@ namespace ASC.Calendar.Controllers var calDavGuid = calendarObj != null ? calendarObj.calDavGuid : ""; var myUri = HttpContext.Request.GetUrlRewriter(); - var currentUserEmail = UserManager.GetUsers(AuthContext.CurrentAccount.ID).Email.ToLower(); - + var currentUserEmail = UserManager.GetUsers(AuthContext.CurrentAccount.ID).Email.ToLower(); + var updateCaldavThread = new Thread(() => updateCaldavEvent(old_ics, split[0], true, calDavGuid, myUri, currentUserEmail)); updateCaldavThread.Start(); } @@ -3287,8 +3281,8 @@ namespace ASC.Calendar.Controllers return EventHistoryWrapperHelper.Get(history, canEdit, canNotify, cal, fullHistory); } private bool CheckIsOrganizer(EventHistory history) - { - + { + var canNotify = false; //TODO @@ -3442,80 +3436,80 @@ namespace ASC.Calendar.Controllers } else { - if (EventHistoryHelper.Contains(tmpCalendar, eventHistory)) continue; - - eventHistory = DataProvider.AddEventHistory(eventHistory.CalendarId, eventHistory.EventUid, - eventHistory.EventId, ics); - - var mergedCalendar = EventHistoryHelper.GetMerged(eventHistory); - - if (mergedCalendar == null || mergedCalendar.Events == null || !mergedCalendar.Events.Any()) continue; - - var mergedEvent = mergedCalendar.Events.First(); - - rrule = GetRRuleString(mergedEvent); - - var utcStartDate = mergedEvent.IsAllDay ? mergedEvent.Start.Value : DDayICalParser.ToUtc(mergedEvent.Start); - var utcEndDate = mergedEvent.IsAllDay ? mergedEvent.End.Value : DDayICalParser.ToUtc(mergedEvent.End); - - var existCalendar = DataProvider.GetCalendarById(calendarId); - if (!eventObj.IsAllDay && eventObj.Created != null && !eventObj.Start.IsUtc) - { - var offset = existCalendar.TimeZone.GetUtcOffset(eventObj.Created.Value); - - var _utcStartDate = eventObj.Start.Subtract(offset).Value; - var _utcEndDate = eventObj.End.Subtract(offset).Value; - - utcStartDate = _utcStartDate; - utcEndDate = _utcEndDate; - } - - if (mergedEvent.IsAllDay && utcStartDate.Date < utcEndDate.Date) - utcEndDate = utcEndDate.AddDays(-1); - - var targetEvent = DataProvider.GetEventById(eventHistory.EventId); - var permissions = PublicItemCollectionHelper.GetForEvent(targetEvent); - var sharingOptions = permissions.Items - .Where(x => x.SharingOption.Id != AccessOption.OwnerOption.Id) - .Select(x => new SharingParam - { - Id = x.Id, - actionId = x.SharingOption.Id, - isGroup = x.IsGroup - }).ToList(); - - try - { - var uid = eventObj.Uid; - string[] split = uid.Split(new Char[] { '@' }); - - var calDavGuid = existCalendar != null ? existCalendar.calDavGuid : ""; - var myUri = HttpContext.Request.GetUrlRewriter(); ; - var currentUserEmail = UserManager.GetUsers(SecurityContext.CurrentAccount.ID).Email.ToLower(); - - var updateCaldavThread = new Thread(() => updateCaldavEvent(ics, split[0], true, calDavGuid, myUri, currentUserEmail, DateTime.Now, tmpCalendar.TimeZones[0], existCalendar.TimeZone)); - updateCaldavThread.Start(); - } - catch (Exception e) - { - Log.Error(e.Message); - } - - //updateEvent(ics, split[0], calendarId.ToString(), true, DateTime.Now, tmpCalendar.TimeZones[0], existCalendar.TimeZone); - - CreateEvent(eventHistory.CalendarId, - mergedEvent.Summary, - mergedEvent.Description, - utcStartDate, - utcEndDate, - RecurrenceRule.Parse(rrule), - EventAlertType.Default, - mergedEvent.IsAllDay, - sharingOptions, - mergedEvent.Uid, - DDayICalParser.ConvertEventStatus(mergedEvent.Status), eventObj.Created != null ? eventObj.Created.Value : DateTime.Now); - - counter++; + if (EventHistoryHelper.Contains(tmpCalendar, eventHistory)) continue; + + eventHistory = DataProvider.AddEventHistory(eventHistory.CalendarId, eventHistory.EventUid, + eventHistory.EventId, ics); + + var mergedCalendar = EventHistoryHelper.GetMerged(eventHistory); + + if (mergedCalendar == null || mergedCalendar.Events == null || !mergedCalendar.Events.Any()) continue; + + var mergedEvent = mergedCalendar.Events.First(); + + rrule = GetRRuleString(mergedEvent); + + var utcStartDate = mergedEvent.IsAllDay ? mergedEvent.Start.Value : DDayICalParser.ToUtc(mergedEvent.Start); + var utcEndDate = mergedEvent.IsAllDay ? mergedEvent.End.Value : DDayICalParser.ToUtc(mergedEvent.End); + + var existCalendar = DataProvider.GetCalendarById(calendarId); + if (!eventObj.IsAllDay && eventObj.Created != null && !eventObj.Start.IsUtc) + { + var offset = existCalendar.TimeZone.GetUtcOffset(eventObj.Created.Value); + + var _utcStartDate = eventObj.Start.Subtract(offset).Value; + var _utcEndDate = eventObj.End.Subtract(offset).Value; + + utcStartDate = _utcStartDate; + utcEndDate = _utcEndDate; + } + + if (mergedEvent.IsAllDay && utcStartDate.Date < utcEndDate.Date) + utcEndDate = utcEndDate.AddDays(-1); + + var targetEvent = DataProvider.GetEventById(eventHistory.EventId); + var permissions = PublicItemCollectionHelper.GetForEvent(targetEvent); + var sharingOptions = permissions.Items + .Where(x => x.SharingOption.Id != AccessOption.OwnerOption.Id) + .Select(x => new SharingParam + { + Id = x.Id, + actionId = x.SharingOption.Id, + isGroup = x.IsGroup + }).ToList(); + + try + { + var uid = eventObj.Uid; + string[] split = uid.Split(new Char[] { '@' }); + + var calDavGuid = existCalendar != null ? existCalendar.calDavGuid : ""; + var myUri = HttpContext.Request.GetUrlRewriter(); ; + var currentUserEmail = UserManager.GetUsers(SecurityContext.CurrentAccount.ID).Email.ToLower(); + + var updateCaldavThread = new Thread(() => updateCaldavEvent(ics, split[0], true, calDavGuid, myUri, currentUserEmail, DateTime.Now, tmpCalendar.TimeZones[0], existCalendar.TimeZone)); + updateCaldavThread.Start(); + } + catch (Exception e) + { + Log.Error(e.Message); + } + + //updateEvent(ics, split[0], calendarId.ToString(), true, DateTime.Now, tmpCalendar.TimeZones[0], existCalendar.TimeZone); + + CreateEvent(eventHistory.CalendarId, + mergedEvent.Summary, + mergedEvent.Description, + utcStartDate, + utcEndDate, + RecurrenceRule.Parse(rrule), + EventAlertType.Default, + mergedEvent.IsAllDay, + sharingOptions, + mergedEvent.Uid, + DDayICalParser.ConvertEventStatus(mergedEvent.Status), eventObj.Created != null ? eventObj.Created.Value : DateTime.Now); + + counter++; } } } @@ -3904,12 +3898,12 @@ namespace ASC.Calendar.Controllers } private void CreateCaldavSharedEvents( - string calendarId, - string calendarIcs, - Uri myUri, - string currentUserEmail, - BaseCalendar icalendar, - Common.Security.Authentication.IAccount currentUser, + string calendarId, + string calendarIcs, + Uri myUri, + string currentUserEmail, + BaseCalendar icalendar, + Common.Security.Authentication.IAccount currentUser, int tenantId ) { @@ -3936,9 +3930,9 @@ namespace ASC.Calendar.Controllers foreach (var e in events) { Event evt = null; - evt = DataProvider.GetEventOnlyByUid(e.Uid); - - + evt = DataProvider.GetEventOnlyByUid(e.Uid); + + isFullAccess = calendarId != BirthdayReminderCalendar.CalendarId && calendarId != "crm_calendar" ? evt != null ? PermissionContext.PermissionResolver.Check(currentUser, evt, null, CalendarAccessRights.FullAccessAction) : isFullAccess : isFullAccess; @@ -4015,7 +4009,7 @@ namespace ASC.Calendar.Controllers if (indexOfChar != -1) { ics = ics.Remove(indexOfChar, indexOfCharEND + 14 - indexOfChar); - if (ics.IndexOf("BEGIN:VTIMEZONE") > -1) + if (ics.IndexOf("BEGIN:VTIMEZONE") > -1) updateCaldavEvent(ics, uid, true, guid, myUri, userEmail); } @@ -4064,39 +4058,25 @@ namespace ASC.Calendar.Controllers try - { - var webRequest = (HttpWebRequest)WebRequest.Create(requestUrl); - webRequest.Method = "PUT"; - webRequest.ContentType = "text/calendar; charset=utf-8"; + { + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(requestUrl); + request.Method = HttpMethod.Put; var authorization = isShared ? DataProvider.GetSystemAuthorization() : DataProvider.GetUserAuthorization(userEmail); - webRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); + request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); - var encoding = new UTF8Encoding(); - byte[] bytes = encoding.GetBytes(ics); - webRequest.ContentLength = bytes.Length; - using (var writeStream = webRequest.GetRequestStream()) - { - writeStream.Write(bytes, 0, bytes.Length); - } + request.Content = new StringContent(ics, Encoding.UTF8, "text/calendar"); - using (var webResponse = webRequest.GetResponse()) - using (var reader = new StreamReader(webResponse.GetResponseStream())) { } + using var httpClient = new HttpClient(); + httpClient.Send(request); } - catch (WebException ex) + catch (HttpRequestException ex) { - if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null) - { - var resp = (HttpWebResponse)ex.Response; - if (resp.StatusCode == HttpStatusCode.NotFound || resp.StatusCode == HttpStatusCode.Conflict) - Log.Debug("ERROR: " + ex.Message); - else - Log.Error("ERROR: " + ex.Message); - } + if (ex.StatusCode == HttpStatusCode.NotFound || ex.StatusCode == HttpStatusCode.Conflict) + Log.Debug("ERROR: " + ex.Message); else - { Log.Error("ERROR: " + ex.Message); - } } catch (Exception ex) { @@ -4201,183 +4181,186 @@ namespace ASC.Calendar.Controllers try { SecurityContext.AuthenticateMeWithoutCookie(ownerId); - - var webRequest = (HttpWebRequest)WebRequest.Create(eventURl); - webRequest.Method = "GET"; - webRequest.ContentType = "text/calendar; charset=utf-8"; - - var _email = UserManager.GetUsers(ownerId).Email; + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(eventURl); + request.Method = HttpMethod.Get; + + var _email = UserManager.GetUsers(ownerId).Email; var authorization = sharedPostfixIndex != -1 ? DataProvider.GetSystemAuthorization() : DataProvider.GetUserAuthorization(_email); - webRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); + request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); + request.Headers.Add("Content-Type", "text/calendar; charset=utf-8"); - Log.Info(String.Format("UpdateCalDavEvent eventURl: {0}", eventURl)); - - using (var webResponse = webRequest.GetResponse()) - using (var reader = new StreamReader(webResponse.GetResponseStream())) + Log.Info(String.Format("UpdateCalDavEvent eventURl: {0}", eventURl)); + + string ics = ""; + + using (var httpClient = new HttpClient()) + using (var response = httpClient.Send(request)) + using (var reader = new StreamReader(response.Content.ReadAsStream())) { - string ics = reader.ReadToEnd(); - Log.Info(String.Format("UpdateCalDavEvent: {0}", ics)); - var existEvent = DataProvider.GetEventIdByUid(eventGuid + "%", calendarId); - var existCalendar = DataProvider.GetCalendarById(calendarId); - - var calendars = DDayICalParser.DeserializeCalendar(ics); - var _calendar = calendars == null ? null : calendars.FirstOrDefault(); - var eventObj = _calendar == null || _calendar.Events == null ? null : _calendar.Events.FirstOrDefault(); - if (eventObj != null && existCalendar.IsTodo == 0) - { - var name = eventObj.Summary; - var description = eventObj.Description ?? " "; - - var alarm = eventObj.Alarms == null ? null : eventObj.Alarms.FirstOrDefault(); - var alertType = EventAlertType.Default; - if (alarm != null) - { - if (alarm.Trigger.Duration != null) - { - var alarmMinutes = alarm.Trigger.Duration.Value.Minutes; - var alarmHours = alarm.Trigger.Duration.Value.Hours; - var alarmDays = alarm.Trigger.Duration.Value.Days; - switch (alarmMinutes) - { - case -5: - alertType = EventAlertType.FiveMinutes; - break; - case -15: - alertType = EventAlertType.FifteenMinutes; - break; - case -30: - alertType = EventAlertType.HalfHour; - break; - } - switch (alarmHours) - { - case -1: - alertType = EventAlertType.Hour; - break; - case -2: - alertType = EventAlertType.TwoHours; - break; - } - if (alarmDays == -1) - alertType = EventAlertType.Day; - } - } - - var utcStartDate = eventObj.IsAllDay ? eventObj.Start.Value : DDayICalParser.ToUtc(eventObj.Start); - var utcEndDate = eventObj.IsAllDay ? eventObj.End.Value : DDayICalParser.ToUtc(eventObj.End); - - if (existEvent != null && existCalendar != null && !eventObj.IsAllDay) - { - var offset = existCalendar.TimeZone.GetUtcOffset(existEvent.UtcUpdateDate); - if (!eventObj.End.IsUtc && !eventObj.Start.IsUtc) - { - utcStartDate = eventObj.Start.Subtract(offset).Value; - utcEndDate = eventObj.End.Subtract(offset).Value; - } - else - { - var createOffset = existCalendar.TimeZone.GetUtcOffset(eventObj.Created.Value); - var startOffset = existCalendar.TimeZone.GetUtcOffset(eventObj.Start.Value); - var endOffset = existCalendar.TimeZone.GetUtcOffset(eventObj.End.Value); - - if (createOffset != startOffset) - { - var _utcStartDate = eventObj.Start.Subtract(createOffset).Add(startOffset).Value; - utcStartDate = _utcStartDate; - } - if (createOffset != endOffset) - { - var _utcEndDate = eventObj.End.Subtract(createOffset).Add(endOffset).Value; - utcEndDate = _utcEndDate; - } - } - } - - - bool isAllDayLong = eventObj.IsAllDay; - - var rrule = RecurrenceRule.Parse(GetRRuleString(eventObj)); - var status = DDayICalParser.ConvertEventStatus(eventObj.Status); - - if (existEvent != null) - { - var eventId = int.Parse(existEvent.Id); - - var cal = new Ical.Net.Calendar(); - - var permissions = PublicItemCollectionHelper.GetForEvent(existEvent); - var sharingOptions = permissions.Items - .Where(x => x.SharingOption.Id != AccessOption.OwnerOption.Id) - .Select(x => new SharingParam - { - Id = x.Id, - actionId = x.SharingOption.Id, - isGroup = x.IsGroup - }).ToList(); - eventObj.Start = new CalDateTime(DateTime.SpecifyKind(utcStartDate, DateTimeKind.Utc), TimeZoneInfo.Utc.Id); - eventObj.End = new CalDateTime(DateTime.SpecifyKind(utcEndDate, DateTimeKind.Utc), TimeZoneInfo.Utc.Id); - eventObj.Created = new CalDateTime(DateTime.SpecifyKind(eventObj.Created != null ? eventObj.Created.Value : DateTime.Now, DateTimeKind.Utc), TimeZoneInfo.Utc.Id); - - - cal.Events.Add(eventObj); - var eventModel = new EventModel - { - EventId = eventId, - CalendarId = calendarId.ToString(), - Ics = DDayICalParser.SerializeCalendar(cal), - AlertType = alertType, - SharingOptions = sharingOptions, - FromCalDavServer = true, - OwnerId = ownerId.ToString() - }; - UpdateEvent(eventModel); - } - else - { - var eventModel = new EventModel - { - Ics = ics, - AlertType = alertType, - SharingOptions = null, - EventUid = null - }; - AddEvent(calendarId, eventModel); - } - } - var todoObj = _calendar == null || _calendar.Todos == null ? null : _calendar.Todos.FirstOrDefault(); - if (todoObj != null && existCalendar.IsTodo == 1) - { - var todoName = todoObj.Summary; - var todoDescription = todoObj.Description ?? " "; - var todoUtcStartDate = todoObj.Start != null ? DDayICalParser.ToUtc(todoObj.Start) : DateTime.MinValue; - var todoCompleted = todoObj.Completed != null ? DDayICalParser.ToUtc(todoObj.Completed) : DateTime.MinValue; - - var existTodo = DataProvider.GetTodoIdByUid(eventGuid + "%", calendarId); - - if (existTodo != null) - { - var todoId = int.Parse(existTodo.Id); - - - UpdateTodo( - calendarId, - todoName, - todoDescription, - todoUtcStartDate, - existTodo.Uid, - todoCompleted); - } - else - { - CreateTodo(calendarId, - todoName, - todoDescription, - todoUtcStartDate, - eventGuid, - todoCompleted); - } - } - } + ics = reader.ReadToEnd(); + } + Log.Info(String.Format("UpdateCalDavEvent: {0}", ics)); + var existEvent = DataProvider.GetEventIdByUid(eventGuid + "%", calendarId); + var existCalendar = DataProvider.GetCalendarById(calendarId); + + var calendars = DDayICalParser.DeserializeCalendar(ics); + var _calendar = calendars == null ? null : calendars.FirstOrDefault(); + var eventObj = _calendar == null || _calendar.Events == null ? null : _calendar.Events.FirstOrDefault(); + if (eventObj != null && existCalendar.IsTodo == 0) + { + var name = eventObj.Summary; + var description = eventObj.Description ?? " "; + + var alarm = eventObj.Alarms == null ? null : eventObj.Alarms.FirstOrDefault(); + var alertType = EventAlertType.Default; + if (alarm != null) + { + if (alarm.Trigger.Duration != null) + { + var alarmMinutes = alarm.Trigger.Duration.Value.Minutes; + var alarmHours = alarm.Trigger.Duration.Value.Hours; + var alarmDays = alarm.Trigger.Duration.Value.Days; + switch (alarmMinutes) + { + case -5: + alertType = EventAlertType.FiveMinutes; + break; + case -15: + alertType = EventAlertType.FifteenMinutes; + break; + case -30: + alertType = EventAlertType.HalfHour; + break; + } + switch (alarmHours) + { + case -1: + alertType = EventAlertType.Hour; + break; + case -2: + alertType = EventAlertType.TwoHours; + break; + } + if (alarmDays == -1) + alertType = EventAlertType.Day; + } + } + + var utcStartDate = eventObj.IsAllDay ? eventObj.Start.Value : DDayICalParser.ToUtc(eventObj.Start); + var utcEndDate = eventObj.IsAllDay ? eventObj.End.Value : DDayICalParser.ToUtc(eventObj.End); + + if (existEvent != null && existCalendar != null && !eventObj.IsAllDay) + { + var offset = existCalendar.TimeZone.GetUtcOffset(existEvent.UtcUpdateDate); + if (!eventObj.End.IsUtc && !eventObj.Start.IsUtc) + { + utcStartDate = eventObj.Start.Subtract(offset).Value; + utcEndDate = eventObj.End.Subtract(offset).Value; + } + else + { + var createOffset = existCalendar.TimeZone.GetUtcOffset(eventObj.Created.Value); + var startOffset = existCalendar.TimeZone.GetUtcOffset(eventObj.Start.Value); + var endOffset = existCalendar.TimeZone.GetUtcOffset(eventObj.End.Value); + + if (createOffset != startOffset) + { + var _utcStartDate = eventObj.Start.Subtract(createOffset).Add(startOffset).Value; + utcStartDate = _utcStartDate; + } + if (createOffset != endOffset) + { + var _utcEndDate = eventObj.End.Subtract(createOffset).Add(endOffset).Value; + utcEndDate = _utcEndDate; + } + } + } + + + bool isAllDayLong = eventObj.IsAllDay; + + var rrule = RecurrenceRule.Parse(GetRRuleString(eventObj)); + var status = DDayICalParser.ConvertEventStatus(eventObj.Status); + + if (existEvent != null) + { + var eventId = int.Parse(existEvent.Id); + + var cal = new Ical.Net.Calendar(); + + var permissions = PublicItemCollectionHelper.GetForEvent(existEvent); + var sharingOptions = permissions.Items + .Where(x => x.SharingOption.Id != AccessOption.OwnerOption.Id) + .Select(x => new SharingParam + { + Id = x.Id, + actionId = x.SharingOption.Id, + isGroup = x.IsGroup + }).ToList(); + eventObj.Start = new CalDateTime(DateTime.SpecifyKind(utcStartDate, DateTimeKind.Utc), TimeZoneInfo.Utc.Id); + eventObj.End = new CalDateTime(DateTime.SpecifyKind(utcEndDate, DateTimeKind.Utc), TimeZoneInfo.Utc.Id); + eventObj.Created = new CalDateTime(DateTime.SpecifyKind(eventObj.Created != null ? eventObj.Created.Value : DateTime.Now, DateTimeKind.Utc), TimeZoneInfo.Utc.Id); + + + cal.Events.Add(eventObj); + var eventModel = new EventModel + { + EventId = eventId, + CalendarId = calendarId.ToString(), + Ics = DDayICalParser.SerializeCalendar(cal), + AlertType = alertType, + SharingOptions = sharingOptions, + FromCalDavServer = true, + OwnerId = ownerId.ToString() + }; + UpdateEvent(eventModel); + } + else + { + var eventModel = new EventModel + { + Ics = ics, + AlertType = alertType, + SharingOptions = null, + EventUid = null + }; + AddEvent(calendarId, eventModel); + } + } + var todoObj = _calendar == null || _calendar.Todos == null ? null : _calendar.Todos.FirstOrDefault(); + if (todoObj != null && existCalendar.IsTodo == 1) + { + var todoName = todoObj.Summary; + var todoDescription = todoObj.Description ?? " "; + var todoUtcStartDate = todoObj.Start != null ? DDayICalParser.ToUtc(todoObj.Start) : DateTime.MinValue; + var todoCompleted = todoObj.Completed != null ? DDayICalParser.ToUtc(todoObj.Completed) : DateTime.MinValue; + + var existTodo = DataProvider.GetTodoIdByUid(eventGuid + "%", calendarId); + + if (existTodo != null) + { + var todoId = int.Parse(existTodo.Id); + + + UpdateTodo( + calendarId, + todoName, + todoDescription, + todoUtcStartDate, + existTodo.Uid, + todoCompleted); + } + else + { + CreateTodo(calendarId, + todoName, + todoDescription, + todoUtcStartDate, + eventGuid, + todoCompleted); + } + } } finally { @@ -4388,20 +4371,12 @@ namespace ASC.Calendar.Controllers } } } - catch (WebException ex) + catch (HttpRequestException ex) { - if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null) - { - var resp = (HttpWebResponse)ex.Response; - if (resp.StatusCode == HttpStatusCode.NotFound || resp.StatusCode == HttpStatusCode.Conflict) - Log.Debug("ERROR: " + ex.Message); - else - Log.Error("ERROR: " + ex.Message); - } + if (ex.StatusCode == HttpStatusCode.NotFound || ex.StatusCode == HttpStatusCode.Conflict) + Log.Debug("ERROR: " + ex.Message); else - { Log.Error("ERROR: " + ex.Message); - } } catch (Exception ex) { @@ -4470,10 +4445,10 @@ namespace ASC.Calendar.Controllers } } private void CreateCaldavEvents( - string calDavGuid, - Uri myUri, - string currentUserEmail, - BaseCalendar icalendar, + string calDavGuid, + Uri myUri, + string currentUserEmail, + BaseCalendar icalendar, string calendarIcs, int tenantId ) @@ -4565,24 +4540,19 @@ namespace ASC.Calendar.Controllers ""; try - { - var webRequest = (HttpWebRequest)WebRequest.Create(requestUrl); - webRequest.Method = "PROPPATCH"; - webRequest.ContentType = "text/calendar; charset=utf-8"; + { + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(requestUrl); + request.Method = new HttpMethod("PROPPATCH"); var authorization = isSharedCalendar ? DataProvider.GetSystemAuthorization() : DataProvider.GetUserAuthorization(email); - webRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); + request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(authorization))); + request.Content = new StringContent(data, Encoding.UTF8, "text/calendar"); + + using var httpClient = new HttpClient(); + var response = httpClient.Send(request); - var encoding = new UTF8Encoding(); - byte[] bytes = encoding.GetBytes(data); - webRequest.ContentLength = bytes.Length; - using (var writeStream = webRequest.GetRequestStream()) - { - writeStream.Write(bytes, 0, bytes.Length); - } - - using (var webResponse = webRequest.GetResponse()) - using (var reader = new StreamReader(webResponse.GetResponseStream())) + using (var reader = new StreamReader(response.Content.ReadAsStream())) { return requestUrl; } @@ -4709,29 +4679,21 @@ namespace ASC.Calendar.Controllers ".ics"; try - { - var webRequest = (HttpWebRequest)WebRequest.Create(requestDeleteUrl); - webRequest.Method = "DELETE"; - webRequest.Headers.Add("Authorization", "Basic " + encoded); - using (var webResponse = webRequest.GetResponse()) - using (var reader = new StreamReader(webResponse.GetResponseStream())) - { - } + { + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(requestDeleteUrl); + request.Method = HttpMethod.Delete; + request.Headers.Add("Authorization", "Basic " + encoded); + + using var httpClient = new HttpClient(); + httpClient.Send(request); } - catch (WebException ex) + catch (HttpRequestException ex) { - if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null) - { - var resp = (HttpWebResponse)ex.Response; - if (resp.StatusCode == HttpStatusCode.NotFound || resp.StatusCode == HttpStatusCode.Conflict) - Log.Debug("ERROR: " + ex.Message); - else - Log.Error("ERROR: " + ex.Message); - } + if (ex.StatusCode == HttpStatusCode.NotFound || ex.StatusCode == HttpStatusCode.Conflict) + Log.Debug("ERROR: " + ex.Message); else - { Log.Error("ERROR: " + ex.Message); - } } catch (Exception ex) { @@ -4782,29 +4744,21 @@ namespace ASC.Calendar.Controllers updatedEvents.Add(guid); try - { - var webRequest = (HttpWebRequest)WebRequest.Create(requestDeleteUrl); - webRequest.Method = "DELETE"; - webRequest.Headers.Add("Authorization", "Basic " + encoded); - using (var webResponse = webRequest.GetResponse()) - using (var reader = new StreamReader(webResponse.GetResponseStream())) - { - } + { + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(requestDeleteUrl); + request.Method = HttpMethod.Delete; + request.Headers.Add("Authorization", "Basic " + encoded); + + using var httpClient = new HttpClient(); + httpClient.Send(request); } - catch (WebException ex) + catch (HttpRequestException ex) { - if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null) - { - var resp = (HttpWebResponse)ex.Response; - if (resp.StatusCode == HttpStatusCode.NotFound || resp.StatusCode == HttpStatusCode.Conflict) - Log.Debug("ERROR: " + ex.Message); - else - Log.Error("ERROR: " + ex.Message); - } + if (ex.StatusCode == HttpStatusCode.NotFound || ex.StatusCode == HttpStatusCode.Conflict) + Log.Debug("ERROR: " + ex.Message); else - { Log.Error("ERROR: " + ex.Message); - } } catch (Exception ex) { @@ -4815,6 +4769,6 @@ namespace ASC.Calendar.Controllers updateCaldavEvent(oldIcs, eventUid, true, calendarId, myUri, userSharingInfo.Email, updateDate, calendarVTimeZone, calendarTimeZone, false, true); } - } - } + } + } } \ No newline at end of file diff --git a/products/ASC.Calendar/Server/Core/ExportDataCache.cs b/products/ASC.Calendar/Server/Core/ExportDataCache.cs index 1066b1b287..39412c30ef 100644 --- a/products/ASC.Calendar/Server/Core/ExportDataCache.cs +++ b/products/ASC.Calendar/Server/Core/ExportDataCache.cs @@ -1,12 +1,8 @@ -using ASC.Api.Core; -using ASC.Common; +using ASC.Common; using ASC.Common.Caching; using ASC.Core; -using ASC.Web.Studio.Utility; + using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; namespace ASC.Calendar.Core { diff --git a/products/ASC.Calendar/Server/ExternalCalendars/BirthdayReminderCalendar.cs b/products/ASC.Calendar/Server/ExternalCalendars/BirthdayReminderCalendar.cs index 2cd221655a..9a2c7a0545 100644 --- a/products/ASC.Calendar/Server/ExternalCalendars/BirthdayReminderCalendar.cs +++ b/products/ASC.Calendar/Server/ExternalCalendars/BirthdayReminderCalendar.cs @@ -30,7 +30,6 @@ using System.Linq; using ASC.Web.Core.Calendars; using ASC.Core; using ASC.Core.Users; -using ASC.Api.Core; using ASC.Web.Core.Users; using ASC.Common.Utils; using System.Runtime.Serialization; diff --git a/products/ASC.Calendar/Server/Models/CaldavCalendarModel.cs b/products/ASC.Calendar/Server/Models/CaldavCalendarModel.cs index fba4bc9927..70597c0e19 100644 --- a/products/ASC.Calendar/Server/Models/CaldavCalendarModel.cs +++ b/products/ASC.Calendar/Server/Models/CaldavCalendarModel.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Collections.Generic; namespace ASC.Calendar.Models { diff --git a/products/ASC.Calendar/Server/Models/CaldavEventModel.cs b/products/ASC.Calendar/Server/Models/CaldavEventModel.cs index caffa6fdb5..61feffc0c6 100644 --- a/products/ASC.Calendar/Server/Models/CaldavEventModel.cs +++ b/products/ASC.Calendar/Server/Models/CaldavEventModel.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Collections.Generic; namespace ASC.Calendar.Models { diff --git a/products/ASC.Calendar/Server/Models/CalendarModel.cs b/products/ASC.Calendar/Server/Models/CalendarModel.cs index 615b9f42d2..c9e6323303 100644 --- a/products/ASC.Calendar/Server/Models/CalendarModel.cs +++ b/products/ASC.Calendar/Server/Models/CalendarModel.cs @@ -1,10 +1,10 @@ using ASC.Web.Core.Calendars; + using System; using System.Collections.Generic; -using System.Linq; using System.Runtime.Serialization; using System.Text.Json.Serialization; -using System.Threading.Tasks; + using static ASC.Calendar.Controllers.CalendarController; namespace ASC.Calendar.Models diff --git a/products/ASC.Calendar/Server/Models/CalendarWrapper.cs b/products/ASC.Calendar/Server/Models/CalendarWrapper.cs index 2fc017a1ae..d448203088 100644 --- a/products/ASC.Calendar/Server/Models/CalendarWrapper.cs +++ b/products/ASC.Calendar/Server/Models/CalendarWrapper.cs @@ -34,8 +34,6 @@ using ASC.Web.Core.Users; using ASC.Web.Core.Calendars; using ASC.Calendar.ExternalCalendars; using ASC.Common.Security; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using ASC.Common; using System.Text.Json.Serialization; diff --git a/products/ASC.Calendar/Server/Models/CreateTodoModel.cs b/products/ASC.Calendar/Server/Models/CreateTodoModel.cs index 78d23c9fa7..ef9fe31594 100644 --- a/products/ASC.Calendar/Server/Models/CreateTodoModel.cs +++ b/products/ASC.Calendar/Server/Models/CreateTodoModel.cs @@ -1,12 +1,5 @@ -using ASC.Api.Core; -using ASC.Web.Core.Calendars; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.Serialization; +using System.Runtime.Serialization; using System.Text.Json.Serialization; -using System.Threading.Tasks; -using static ASC.Calendar.Controllers.CalendarController; namespace ASC.Calendar.Models { diff --git a/products/ASC.Calendar/Server/Models/EventAlertWrapper.cs b/products/ASC.Calendar/Server/Models/EventAlertWrapper.cs index 2728d9a7f2..623da6912f 100644 --- a/products/ASC.Calendar/Server/Models/EventAlertWrapper.cs +++ b/products/ASC.Calendar/Server/Models/EventAlertWrapper.cs @@ -24,16 +24,13 @@ */ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Runtime.Serialization; + using ASC.Web.Core.Calendars; namespace ASC.Calendar.Models { - + [DataContract(Name = "alert", Namespace = "")] public class EventAlertWrapper { diff --git a/products/ASC.Calendar/Server/Models/EventDeleteModel.cs b/products/ASC.Calendar/Server/Models/EventDeleteModel.cs index 8c91db9cf5..0b6dabd35e 100644 --- a/products/ASC.Calendar/Server/Models/EventDeleteModel.cs +++ b/products/ASC.Calendar/Server/Models/EventDeleteModel.cs @@ -1,11 +1,9 @@ using ASC.Api.Core; -using ASC.Web.Core.Calendars; + using System; -using System.Collections.Generic; -using System.Linq; using System.Runtime.Serialization; using System.Text.Json.Serialization; -using System.Threading.Tasks; + using static ASC.Calendar.Controllers.CalendarController; namespace ASC.Calendar.Models diff --git a/products/ASC.Calendar/Server/Models/EventHistoryWrapper.cs b/products/ASC.Calendar/Server/Models/EventHistoryWrapper.cs index 037b7d27be..eee01381bd 100644 --- a/products/ASC.Calendar/Server/Models/EventHistoryWrapper.cs +++ b/products/ASC.Calendar/Server/Models/EventHistoryWrapper.cs @@ -24,7 +24,6 @@ */ -using System; using System.Linq; using System.Runtime.Serialization; using System.Text.Json.Serialization; diff --git a/products/ASC.Calendar/Server/Models/EventModel.cs b/products/ASC.Calendar/Server/Models/EventModel.cs index 19ef0f1164..4f0b3c1a43 100644 --- a/products/ASC.Calendar/Server/Models/EventModel.cs +++ b/products/ASC.Calendar/Server/Models/EventModel.cs @@ -1,11 +1,10 @@ using ASC.Api.Core; using ASC.Web.Core.Calendars; -using System; + using System.Collections.Generic; -using System.Linq; using System.Runtime.Serialization; using System.Text.Json.Serialization; -using System.Threading.Tasks; + using static ASC.Calendar.Controllers.CalendarController; namespace ASC.Calendar.Models diff --git a/products/ASC.Calendar/Server/Models/EventWrapper.cs b/products/ASC.Calendar/Server/Models/EventWrapper.cs index b4829c0fe7..96a942a087 100644 --- a/products/ASC.Calendar/Server/Models/EventWrapper.cs +++ b/products/ASC.Calendar/Server/Models/EventWrapper.cs @@ -30,13 +30,10 @@ using System.Runtime.Serialization; using ASC.Calendar.ExternalCalendars; using ASC.Common.Security; using ASC.Core; -using ASC.Core.Common; using ASC.Web.Core.Users; using ASC.Core.Users; using ASC.Api.Core; using ASC.Web.Core.Calendars; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using ASC.Common.Utils; using ASC.Common; using ASC.Calendar.iCalParser; diff --git a/products/ASC.Calendar/Server/Models/OutsideEventModel.cs b/products/ASC.Calendar/Server/Models/OutsideEventModel.cs index f6949895ba..cf80b7f984 100644 --- a/products/ASC.Calendar/Server/Models/OutsideEventModel.cs +++ b/products/ASC.Calendar/Server/Models/OutsideEventModel.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace ASC.Calendar.Models +namespace ASC.Calendar.Models { public class OutsideEventModel { diff --git a/products/ASC.Calendar/Server/Models/Permissions.cs b/products/ASC.Calendar/Server/Models/Permissions.cs index 570a290c57..f951687a4a 100644 --- a/products/ASC.Calendar/Server/Models/Permissions.cs +++ b/products/ASC.Calendar/Server/Models/Permissions.cs @@ -26,14 +26,12 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Runtime.Serialization; using System.Text.Json.Serialization; namespace ASC.Calendar.Models { - + [DataContract(Name = "permissions", Namespace = "")] public class Permissions { diff --git a/products/ASC.Calendar/Server/Models/PublicItemCollection.cs b/products/ASC.Calendar/Server/Models/PublicItemCollection.cs index 473643a988..3d04903da2 100644 --- a/products/ASC.Calendar/Server/Models/PublicItemCollection.cs +++ b/products/ASC.Calendar/Server/Models/PublicItemCollection.cs @@ -24,17 +24,10 @@ */ -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Runtime.Serialization; using ASC.Core; -using ASC.Calendar.BusinessObjects; using ASC.Web.Core.Calendars; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using ASC.Api.Core; using ASC.Common; using System.Text.Json.Serialization; diff --git a/products/ASC.Calendar/Server/Models/PublicItemWrapper.cs b/products/ASC.Calendar/Server/Models/PublicItemWrapper.cs index ea4aedbaad..7da6fef1a6 100644 --- a/products/ASC.Calendar/Server/Models/PublicItemWrapper.cs +++ b/products/ASC.Calendar/Server/Models/PublicItemWrapper.cs @@ -28,10 +28,7 @@ using System; using System.Runtime.Serialization; using ASC.Core; using ASC.Core.Users; -using ASC.Common.Security.Authentication; using ASC.Common.Security.Authorizing; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using ASC.Common.Utils; using ASC.Web.Core.Users; using ASC.Common; diff --git a/products/ASC.Calendar/Server/Models/TimeZoneWrapper.cs b/products/ASC.Calendar/Server/Models/TimeZoneWrapper.cs index 69cd42e644..a6276c9e9e 100644 --- a/products/ASC.Calendar/Server/Models/TimeZoneWrapper.cs +++ b/products/ASC.Calendar/Server/Models/TimeZoneWrapper.cs @@ -25,13 +25,8 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Runtime.Serialization; using ASC.Common.Utils; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using ASC.Common; namespace ASC.Calendar.Models diff --git a/products/ASC.Calendar/Server/Models/TodoWrapper.cs b/products/ASC.Calendar/Server/Models/TodoWrapper.cs index 98b52a5542..77640d06ac 100644 --- a/products/ASC.Calendar/Server/Models/TodoWrapper.cs +++ b/products/ASC.Calendar/Server/Models/TodoWrapper.cs @@ -32,8 +32,6 @@ using ASC.Core.Users; using ASC.Api.Core; using ASC.Web.Core.Users; using ASC.Web.Core.Calendars; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using ASC.Common; namespace ASC.Calendar.Models diff --git a/products/ASC.Calendar/Server/Models/СalendarUrlModel.cs b/products/ASC.Calendar/Server/Models/СalendarUrlModel.cs index 52c8e19ed5..9b3811658b 100644 --- a/products/ASC.Calendar/Server/Models/СalendarUrlModel.cs +++ b/products/ASC.Calendar/Server/Models/СalendarUrlModel.cs @@ -1,11 +1,4 @@ -using ASC.Api.Core; -using ASC.Web.Core.Calendars; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.Serialization; -using System.Threading.Tasks; -using static ASC.Calendar.Controllers.CalendarController; +using System.Runtime.Serialization; namespace ASC.Calendar.Models { diff --git a/products/ASC.Calendar/Server/Notification/CalendarNotifySource.cs b/products/ASC.Calendar/Server/Notification/CalendarNotifySource.cs index d47cd90c58..6dd4b8f1e6 100644 --- a/products/ASC.Calendar/Server/Notification/CalendarNotifySource.cs +++ b/products/ASC.Calendar/Server/Notification/CalendarNotifySource.cs @@ -25,28 +25,25 @@ using System; -using ASC.Api.Core; -using ASC.Calendar.BusinessObjects; + using ASC.Common; -using ASC.Common.Logging; using ASC.Core; -using ASC.Core.Billing; using ASC.Core.Notify; -using ASC.Core.Tenants; using ASC.Core.Users; using ASC.Notify; using ASC.Notify.Model; using ASC.Notify.Patterns; using ASC.Notify.Recipients; -using ASC.Web.Core.Calendars; using ASC.Web.Core.Users; using ASC.Web.Studio.Utility; + using Microsoft.Extensions.DependencyInjection; + using NotifyContext = ASC.Notify.Context; namespace ASC.Calendar.Notification { - + [Scope] public class CalendarNotifyClient { diff --git a/products/ASC.Calendar/Server/Notification/CalendarSubscriptionManager.cs b/products/ASC.Calendar/Server/Notification/CalendarSubscriptionManager.cs index 7fe5c6cdb9..131c70eb7f 100644 --- a/products/ASC.Calendar/Server/Notification/CalendarSubscriptionManager.cs +++ b/products/ASC.Calendar/Server/Notification/CalendarSubscriptionManager.cs @@ -23,11 +23,6 @@ * */ - -using System; -using System.Collections.Generic; -using ASC.Web.Core.Subscriptions; - namespace ASC.Calendar.Notification { /* diff --git a/products/ASC.Calendar/Server/iCalParser/DDayICalParser.cs b/products/ASC.Calendar/Server/iCalParser/DDayICalParser.cs index 0a62acece1..b06ed9a4cd 100644 --- a/products/ASC.Calendar/Server/iCalParser/DDayICalParser.cs +++ b/products/ASC.Calendar/Server/iCalParser/DDayICalParser.cs @@ -27,13 +27,13 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using ASC.Calendar.BusinessObjects; + using ASC.Common; using ASC.Common.Logging; using ASC.Common.Utils; using ASC.Core; using ASC.Web.Core.Calendars; + using Microsoft.Extensions.Options; namespace ASC.Calendar.iCalParser diff --git a/products/ASC.Calendar/Server/iCalParser/Token.cs b/products/ASC.Calendar/Server/iCalParser/Token.cs index fba8b5962f..d448f30de3 100644 --- a/products/ASC.Calendar/Server/iCalParser/Token.cs +++ b/products/ASC.Calendar/Server/iCalParser/Token.cs @@ -28,7 +28,6 @@ using System; using System.Collections; using System.Text; using System.Text.RegularExpressions; -using System.Web; using System.Globalization; namespace ASC.Calendar.iCalParser diff --git a/products/ASC.Calendar/Server/iCalParser/iCalEvent.cs b/products/ASC.Calendar/Server/iCalParser/iCalEvent.cs index b3bfdadda6..e473554880 100644 --- a/products/ASC.Calendar/Server/iCalParser/iCalEvent.cs +++ b/products/ASC.Calendar/Server/iCalParser/iCalEvent.cs @@ -25,9 +25,7 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; + using ASC.Web.Core.Calendars; namespace ASC.Calendar.iCalParser diff --git a/products/ASC.Calendar/Server/iCalParser/iCalendar.cs b/products/ASC.Calendar/Server/iCalParser/iCalendar.cs index 26a5614673..d15296ce43 100644 --- a/products/ASC.Calendar/Server/iCalParser/iCalendar.cs +++ b/products/ASC.Calendar/Server/iCalParser/iCalendar.cs @@ -26,22 +26,22 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; -using System.Text; +using System.Net.Http; using System.Text.RegularExpressions; + using ASC.Calendar.Resources; using ASC.Common.Utils; -using ASC.Web.Core.Calendars; -using System.IO; -using System.Net; using ASC.Core; +using ASC.Web.Core.Calendars; namespace ASC.Calendar.iCalParser { public class iCalendar : BaseCalendar { - private TenantManager TenantManager { get; } - + private TenantManager TenantManager { get; } + public iCalendar GetFromStream(TextReader reader) { var emitter = new iCalendarEmitter(AuthContext, TimeZoneConverter, TenantManager); @@ -69,9 +69,12 @@ namespace ASC.Calendar.iCalParser url = new Regex("webcal").Replace(url, "http", 1); } - var req = (HttpWebRequest)WebRequest.Create(url); - using (var resp = req.GetResponse()) - using (var stream = resp.GetResponseStream()) + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(url); + + using var httpClient = new HttpClient(); + using (var response = httpClient.Send(request)) + using (var stream = response.Content.ReadAsStream()) { var ms = new MemoryStream(); stream.CopyTo(ms); @@ -98,9 +101,9 @@ namespace ASC.Calendar.iCalParser } - public List Events { get; set; } - - + public List Events { get; set; } + + public iCalendar( AuthContext authContext, TimeZoneConverter timeZoneConverter, diff --git a/products/ASC.Calendar/Server/iCalParser/iCalendarCache.cs b/products/ASC.Calendar/Server/iCalParser/iCalendarCache.cs index 9a29722695..94f8b9bbc3 100644 --- a/products/ASC.Calendar/Server/iCalParser/iCalendarCache.cs +++ b/products/ASC.Calendar/Server/iCalParser/iCalendarCache.cs @@ -25,9 +25,6 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.IO; using ASC.Core; using ASC.Common.Utils; diff --git a/products/ASC.Calendar/Server/iCalParser/iCalendarEmitter.cs b/products/ASC.Calendar/Server/iCalParser/iCalendarEmitter.cs index 6ed18338d8..b16d11f30b 100644 --- a/products/ASC.Calendar/Server/iCalParser/iCalendarEmitter.cs +++ b/products/ASC.Calendar/Server/iCalParser/iCalendarEmitter.cs @@ -29,7 +29,6 @@ using System.Collections.Generic; using System.Linq; using ASC.Common.Utils; using ASC.Web.Core.Calendars; -using System.Globalization; using ASC.Core; namespace ASC.Calendar.iCalParser diff --git a/products/ASC.Files/Client/package.json b/products/ASC.Files/Client/package.json index 1f6fab5a94..7a8553e3f3 100644 --- a/products/ASC.Files/Client/package.json +++ b/products/ASC.Files/Client/package.json @@ -1,6 +1,6 @@ { "name": "@appserver/files", - "version": "1.0.0", + "version": "1.0.1", "private": true, "homepage": "/products/files", "scripts": { diff --git a/products/ASC.Files/Client/public/locales/de/Article.json b/products/ASC.Files/Client/public/locales/de/Article.json index e788783171..7f9d987358 100644 --- a/products/ASC.Files/Client/public/locales/de/Article.json +++ b/products/ASC.Files/Client/public/locales/de/Article.json @@ -1,8 +1,8 @@ -{ - "NewDocument": "Neues Dokument", - "NewFolder": "Neuer Ordner", - "NewPresentation": "Neue Präsentation", - "NewSpreadsheet": "Neue Tabellenkalkulation", - "UploadFiles": "Dateien hochladen", - "UploadFolder": "Ordner hochladen" +{ + "NewDocument": "Neues Dokument", + "NewFolder": "Neuer Ordner", + "NewPresentation": "Neue Präsentation", + "NewSpreadsheet": "Neue Tabellenkalkulation", + "UploadFiles": "Dateien hochladen", + "UploadFolder": "Ordner hochladen" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/de/ChangeOwnerPanel.json b/products/ASC.Files/Client/public/locales/de/ChangeOwnerPanel.json index 545bac5baa..df3a25c7b5 100644 --- a/products/ASC.Files/Client/public/locales/de/ChangeOwnerPanel.json +++ b/products/ASC.Files/Client/public/locales/de/ChangeOwnerPanel.json @@ -1,4 +1,4 @@ { "ChangeOwner": "Besitzer ({{fileName}}) ändern", - "ChangeOwnerDescription": "Wenn die Änderungen in Kraft treten, bekommt der aktuelle Besitzer dieselbe Rechte wie alle Mitglieder seiner Gruppe" + "ChangeOwnerDescription": "Nach dem Besitzerwechsel erhält der aktuelle Besitzer die gleiche Zugriffsebene wie die anderen Mitglieder seiner Gruppe" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/de/ConflictResolveDialog.json b/products/ASC.Files/Client/public/locales/de/ConflictResolveDialog.json index 9e26dfeeb6..3e5f578d11 100644 --- a/products/ASC.Files/Client/public/locales/de/ConflictResolveDialog.json +++ b/products/ASC.Files/Client/public/locales/de/ConflictResolveDialog.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "ConflictResolveDescription": "Die Datei {{file}} existiert bereits im Ordner {{folder}}", + "ConflictResolveDescriptionFiles": "im Ordner '{{folder}}' sind bereits {{filesCount}} Dokumente mit dem gleichen Namen vorhanden", + "ConflictResolveSelectAction": "Bitte wählen Sie die Aktion aus:", + "ConflictResolveTitle": "Bestätigung überschreiben", + "CreateDescription": "Es werden zwei verschiedene Dateien in dem Ordner vorhanden sein.", + "CreateTitle": "als Kopie speichern", + "OverwriteDescription": "Die Datei wird mit einer neuen Version ersetzt.", + "OverwriteTitle": "Überschreiben mit Versions-Update", + "SkipDescription": "Es wird keine Datei kopiert. Die Originaldatei wird im Zielordner beibehalten.", + "SkipTitle": "Überspringen" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/de/ConvertDialog.json b/products/ASC.Files/Client/public/locales/de/ConvertDialog.json index 8c5e589377..9ad33c3b3e 100644 --- a/products/ASC.Files/Client/public/locales/de/ConvertDialog.json +++ b/products/ASC.Files/Client/public/locales/de/ConvertDialog.json @@ -1,6 +1,8 @@ { - "ConversionMessage": "Alle hochladenden Dokumente werden ins Format Office Open XML (DOCX, XLSX oder PPTX) für schnellere Bearbeitung.", + "ConversionFileMessage": "Die Datei wird in OOXML (DOCX, XLSX oder PPTX) für schnellere Arbeit konviertiert.", + "ConversionMessage": "Alle hochgeladenden Dokumente werden ins Office Open XML Format (DOCX, XLSX oder PPTX) für eine schnellere Bearbeitung konvertiert.", "ConversionTitle": "Das Dokument wird hochgeladen", + "ConvertAndOpenTitle": "Dokument umwandeln und öffnen", "HideMessage": "Diese Nachricht nicht mehr anzeigen.", "SaveOriginalFormatMessage": "Kopie dieser Datei im Originalformat speichern" } diff --git a/products/ASC.Files/Client/public/locales/de/DeleteDialog.json b/products/ASC.Files/Client/public/locales/de/DeleteDialog.json index 9e26dfeeb6..8970956b19 100644 --- a/products/ASC.Files/Client/public/locales/de/DeleteDialog.json +++ b/products/ASC.Files/Client/public/locales/de/DeleteDialog.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "MoveToTrashButton": "In den Papierkorb verschieben", + "MoveToTrashItemsNote": "Wenn Sie freigegebene Elemente löschen, können andere Benutzer nicht mehr auf sie zugreifen.", + "MoveToTrashItemsTitle": "Elemente in den Papierkorb verschieben?", + "MoveToTrashOneFileNote": "Wenn Sie eine freigegebene Datei löschen, können andere Benutzer nicht mehr auf sie zugreifen.", + "MoveToTrashOneFileTitle": "Datei in den Papierkorb verschieben?", + "MoveToTrashOneFolderNote": "Wenn Sie einen gemeinsamen Ordner löschen, können andere Benutzer nicht mehr darauf zugreifen.", + "MoveToTrashOneFolderTitle": "Ordner in den Papierkorb verschieben?", + "UnsubscribeButton": "Abbestellen", + "UnsubscribeNote": "Sind Sie sicher, dass Sie die ausgewählten Elemente aus der Liste abbestellen möchten?", + "UnsubscribeTitle": "Abbestellungsbestätigung" +} diff --git a/products/ASC.Files/Client/public/locales/de/DownloadDialog.json b/products/ASC.Files/Client/public/locales/de/DownloadDialog.json index d1841252d7..7c0e546dc5 100644 --- a/products/ASC.Files/Client/public/locales/de/DownloadDialog.json +++ b/products/ASC.Files/Client/public/locales/de/DownloadDialog.json @@ -1,5 +1,5 @@ { - "ChooseFormatText": "Wählen Sie Formate für Herunterladen von Dateien aus", + "ChooseFormatText": "Wählen Sie ein Format für das Herunterladen von Dateien aus", "ConvertInto": "Konvertieren in", "ConvertMessage": "Wenn Sie das Dateiformat ändern, können Sie möglicherweise einige Daten verloren.", "ConvertToZip": "Dateien werden in eine ZIP-Datei archiviert", diff --git a/products/ASC.Files/Client/public/locales/de/EmbeddingPanel.json b/products/ASC.Files/Client/public/locales/de/EmbeddingPanel.json index 4629895b01..783872d352 100644 --- a/products/ASC.Files/Client/public/locales/de/EmbeddingPanel.json +++ b/products/ASC.Files/Client/public/locales/de/EmbeddingPanel.json @@ -1,6 +1,6 @@ { "Auto": "auto", - "CodeCopySuccess": "Der Code ist in die Zwischenablage kopiert.", + "CodeCopySuccess": "Der Code wurde in die Zwischenablage kopiert.", "EmbedCode": "Code einbetten", "EmbeddingDocument": "Einbetten des Dokuments", "Height": "Höhe", diff --git a/products/ASC.Files/Client/public/locales/de/EmptyTrashDialog.json b/products/ASC.Files/Client/public/locales/de/EmptyTrashDialog.json index 9125c1a722..ad54113c23 100644 --- a/products/ASC.Files/Client/public/locales/de/EmptyTrashDialog.json +++ b/products/ASC.Files/Client/public/locales/de/EmptyTrashDialog.json @@ -1,3 +1,6 @@ { + "DeleteForeverButton": "permanent löschen", + "DeleteForeverNote": "Alle Objekte aus dem Papierkorb werden für immer gelöscht. Sie können sie nicht wiederherstellen.", + "DeleteForeverTitle": "löschen? (dies kann nicht rückgängig gemacht werden)", "SuccessEmptyTrash": "Papierkorb wurde geleert" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/de/Home.json b/products/ASC.Files/Client/public/locales/de/Home.json index 0bb979b4d5..cbe217ca51 100644 --- a/products/ASC.Files/Client/public/locales/de/Home.json +++ b/products/ASC.Files/Client/public/locales/de/Home.json @@ -1,80 +1,83 @@ -{ - "All": "Alle", - "AllFiles": "Alle Dateien", - "Archives": "Archive", - "BackToParentFolderButton": "Zurück zum übergeordneten Ordner", - "ByAuthor": "Verfasser", - "ByCreationDate": "Erstellt", - "ByLastModifiedDate": "Verändert", - "ByTitle": "Titel", - "CommonEmptyContainerDescription": "In gemeinsamen Dokumenten finden Sie Dateien, auf denen alle Benutzer Zugriff haben. Nur Portaladministratoren können dort Dateien erstellen. Benutzern kann den vollständigen Zugriff auf einen bestimmten Ordner innerhalb des Abschnitts bekommen. Dann können sie Dateien in diesem Ordner erstellen / hochladen.", - "ContainsSpecCharacter": "Der Titel darf diese Symbole nicht beinhalten: *+:\"<>?|/", - "Convert": "Konvertierung", - "CopyItem": "{{title}} kopiert", - "CopyItems": "Elemente kopiert: {{qty}}", - "CreateWithEmptyTitle": "Der Titel des Orderns oder Datei darf nicht leer sein", - "Document": "Dokument", - "Duplicate": "Kopie erstellen", - "EmptyFile": "Leere Datei", - "EmptyFilterDescriptionText": "Keine Dateien oder Ordner entsprechen diesem Filter. Versuchen Sie einen anderen Filter oder entfernen Sie diesen, um alle Dateien zu sehen.", - "EmptyFilterSubheadingText": "Hier gibt es keine Dateien, die diesem Filter entsprechen", - "EmptyFolderHeader": "Keine Dateien in diesem Ordner", - "EmptyRecycleBin": "Papierkorb leeren", - "FavoritesEmptyContainerDescription": "Benutzen Sie das Kontext-Menü, um Dateien als Favoriten zu kennzeichnen oder sie aus dieser Liste zu entfernen.", - "FileCreated": "Neue Datei {{itemTitle}}.{{exst}} wurde erstellt", - "FileRemoved": "Die Datei wurde in den Papierkorb verschoben", - "Filter": "Filter", - "FinalizeVersion": "Version abschließen", - "Folder": "Ordner", - "FolderCreated": "Neuer Ordner {{itemTitle}} wurde erstellt", - "FolderRemoved": "Ordner wurde in den Papierkorb verschoben", - "GoToMyButton": "Meine Dokumente öffnen", - "Images": "Bilder", - "LinkForPortalUsers": "Link für Portalbenutzer", - "MarkAsFavorite": "Als Favorit kennzeichnen", - "MarkedAsFavorite": "Zu Favoriten hinzugefügt", - "Media": "Medien", - "MoveItem": "{{title}} verschoben", - "MoveItems": "Elemente verschoben: {{qty}}", - "MoveTo": "Verschieben", - "MyEmptyContainerDescription": "Von Ihnen erstellte oder hochgeladene Dokumente werden im Abschnitt \"Meine Dokumente\" gespeichert. Sie können diese bearbeiten, freigeben und mit Ihrem Team an diesen zusammenarbeiten.", - "NewDocument": "Neues Dokument", - "NewFolder": "Neuer Ordner", - "NewPresentation": "Neue Präsentation", - "NewSpreadsheet": "Neue Tabellenkalkulation", - "NoSubfolders": "Keine Unterordner", - "Open": "Öffnen", - "OpenLocation": "Ordner öffnen", - "Presentation": "Präsentation", - "Preview": "Vorschau", - "PrivateRoomDescriptionEncrypted": "Verschlüsselte Bearbeitung und Zusammenarbeit in Echtzeit.", - "PrivateRoomDescriptionSafest": "Der sicherste Speicher für DOCX-, XLSX- und PPTX-Dateien.", - "PrivateRoomDescriptionSecure": "Sichere Freigabe für Teammitglieder.", - "PrivateRoomDescriptionUnbreakable": "Unzerbrechlicher AES-256-Algorithmus", - "PrivateRoomHeader": "Willkommen im Privatraum von ONLYOFFICE, wo jedes von Ihnen eingegebene Zeichen verschlüsselt wird", - "PrivateRoomSupport": "Privaträume sind über {{organizationName}}-App für Desktop verfügbar. <3>Informationen", - "RecentEmptyContainerDescription": "Im Bereich \"Zuletzt verwendet\" finden Sie Dateien, die Sie kürzlich öffneten.", - "RemovedFromFavorites": "Aus Favoriten entfernt", - "RemoveFromFavorites": "Aus Favoriten entfernen", - "Rename": "Umbenennen", - "SendByEmail": "Per E-Mail senden", - "Share": "Freigeben", - "SharedEmptyContainerDescription": "\"Für mich freigegeben\" ist der Bereich mit geteilten Dateien. Wenn Sie die letzten Änderungen nicht gesehen haben, werden diese als neue gekennzeichnet. Im Kontextmenü können Sie die Dateien aus der Liste entfernen.", - "SharingSettings": "Freigabeeinstellungen", - "ShowVersionHistory": "Versionshistorie anzeigen", - "Spreadsheet": "Tabellenkalkulation", - "SubheadingEmptyText": "In dieser Sektion gibt es keine Dateien zum Anzeigen.", - "TitleCreated": "Erstellt", - "TitleDocuments": "Dateien", - "TitleModified": "Aktualisiert", - "TitleSubfolders": "Ordner", - "TitleUploaded": "Hochgeladen", - "TooltipElementCopyMessage": "Kopieren {{element}}", - "TooltipElementsCopyMessage": "Kopieren {{element}} Element(e)", - "TooltipElementsMoveMessage": "{{element}} Element(e) verschieben", - "TrashEmptyContainerDescription": "Alle gelöschten Dateien werden in den Papierkorb verschoben. Sie können diese später wiederherstellen oder dauerhaft löschen.", - "UnblockVersion": "Entsperren/Einchecken", - "UploadToFolder": "In den Ordner hochladen", - "ViewList": "Liste", - "ViewTiles": "Kacheln" -} +{ + "All": "Alle", + "AllFiles": "Alle Dateien", + "Archives": "Archive", + "BackToParentFolderButton": "Zurück zum übergeordneten Ordner", + "ByAuthor": "Verfasser", + "ByCreationDate": "Erstellt", + "ByLastModifiedDate": "Verändert", + "ByTitle": "Titel", + "CommonEmptyContainerDescription": "In gemeinsamen Dokumenten finden Sie Dateien, auf denen alle Benutzer Zugriff haben. Nur Portaladministratoren können dort Dateien erstellen. Benutzern kann der vollständigen Zugriff auf einen bestimmten Ordner innerhalb des Abschnitts erteilt werden. Dann können Sie Dateien in diesem Ordner erstellen / hochladen.", + "ContainsSpecCharacter": "Der Titel darf diese Symbole nicht beinhalten: *+:\"<>?|/", + "Convert": "Konvertierung", + "CopyItem": "{{title}} kopiert", + "CopyItems": "Elemente kopiert: {{qty}}", + "CreateWithEmptyTitle": "Der Titel des Orderns oder Datei darf nicht leer sein", + "Document": "Dokument", + "Duplicate": "Kopie erstellen", + "EmptyFile": "Leere Datei", + "EmptyFilterDescriptionText": "Keine Dateien oder Ordner entsprechen diesem Filter. Versuchen Sie einen anderen Filter oder entfernen Sie diesen, um alle Dateien zu sehen.", + "EmptyFilterSubheadingText": "Hier gibt es keine Dateien, die diesem Filter entsprechen", + "EmptyFolderHeader": "Keine Dateien in diesem Ordner", + "EmptyRecycleBin": "Papierkorb leeren", + "FavoritesEmptyContainerDescription": "Benutzen Sie das Kontext-Menü, um Dateien als Favoriten zu kennzeichnen oder sie aus dieser Liste zu entfernen.", + "FileRemoved": "Die Datei wurde in den Papierkorb verschoben", + "FileRenamed": "Das Dokument wurde von '{{oldTitle}}' in '{{newTitle}}' umbenannt", + "Filter": "Filter", + "FinalizeVersion": "Version abschließen", + "Folder": "Ordner", + "FolderRemoved": "Ordner wurde in den Papierkorb verschoben", + "FolderRenamed": "Der Ordner wurde von '{{folderTitle}}' in '{{newFoldedTitle}}' umbenannt", + "GoToMyButton": "Meine Dokumente öffnen", + "Images": "Bilder", + "LinkForPortalUsers": "Link für Portalbenutzer", + "MarkAsFavorite": "Als Favorit kennzeichnen", + "MarkedAsFavorite": "Zu Favoriten hinzugefügt", + "MarkRead": "Als gelesen kennzeichnen", + "Media": "Medien", + "MoveItem": "{{title}} verschoben", + "MoveItems": "Elemente verschoben: {{qty}}", + "MoveTo": "Verschieben", + "MyEmptyContainerDescription": "Von Ihnen erstellte oder hochgeladene Dokumente werden im Abschnitt \"Meine Dokumente\" gespeichert. Sie können diese bearbeiten, freigeben und mit Ihrem Team an diesen zusammenarbeiten.", + "New": "Erstellen", + "NewDocument": "Neues Dokument", + "NewFolder": "Neuer Ordner", + "NewPresentation": "Neue Präsentation", + "NewSpreadsheet": "Neue Tabellenkalkulation", + "NoSubfolders": "Keine Unterordner", + "Open": "Öffnen", + "OpenLocation": "Ordner öffnen", + "Presentation": "Präsentation", + "Preview": "Vorschau", + "PrivateRoomDescriptionEncrypted": "Verschlüsselte Bearbeitung und Zusammenarbeit in Echtzeit.", + "PrivateRoomDescriptionSafest": "Der sicherste Speicher für DOCX-, XLSX- und PPTX-Dateien.", + "PrivateRoomDescriptionSecure": "Sichere Freigabe für Teammitglieder.", + "PrivateRoomDescriptionUnbreakable": "Unzerbrechlicher AES-256-Algorithmus", + "PrivateRoomHeader": "Willkommen im Privatraum von ONLYOFFICE, wo jedes von Ihnen eingegebene Zeichen verschlüsselt wird", + "PrivateRoomSupport": "Privaträume sind über {{organizationName}}-App für Desktop verfügbar. <3>Informationen", + "RecentEmptyContainerDescription": "Im Bereich \"Zuletzt verwendet\" finden Sie Dateien, die Sie kürzlich öffneten.", + "RemovedFromFavorites": "Aus Favoriten entfernt", + "RemoveFromFavorites": "Aus Favoriten entfernen", + "RemoveFromList": "Aus Liste entfernen", + "Rename": "Umbenennen", + "SendByEmail": "Per E-Mail senden", + "Share": "Freigeben", + "SharedEmptyContainerDescription": "\"Für mich freigegeben\" ist der Bereich mit geteilten Dateien. Wenn Sie die letzten Änderungen nicht gesehen haben, werden diese als neue gekennzeichnet. Im Kontextmenü können Sie die Dateien aus der Liste entfernen.", + "SharingSettings": "Freigabeeinstellungen", + "ShowVersionHistory": "Versionshistorie anzeigen", + "Spreadsheet": "Tabellenkalkulation", + "SubheadingEmptyText": "In dieser Sektion gibt es keine Dateien zum Anzeigen.", + "TitleCreated": "Erstellt", + "TitleDocuments": "Dateien", + "TitleModified": "Aktualisiert", + "TitleSubfolders": "Ordner", + "TitleUploaded": "Hochgeladen", + "TooltipElementCopyMessage": "Kopieren {{element}}", + "TooltipElementsCopyMessage": "Kopieren {{element}} Element(e)", + "TooltipElementsMoveMessage": "{{element}} Element(e) verschieben", + "TrashEmptyContainerDescription": "Alle gelöschten Dateien werden in den Papierkorb verschoben. Sie können diese später wiederherstellen oder dauerhaft löschen.", + "UnblockVersion": "Entsperren/Einchecken", + "UploadToFolder": "In den Ordner hochladen", + "ViewList": "Liste", + "ViewTiles": "Kacheln" +} diff --git a/products/ASC.Files/Client/public/locales/de/PrivacyPage.json b/products/ASC.Files/Client/public/locales/de/PrivacyPage.json new file mode 100644 index 0000000000..f9a5198fb6 --- /dev/null +++ b/products/ASC.Files/Client/public/locales/de/PrivacyPage.json @@ -0,0 +1,10 @@ +{ + "PrivacyButton": "ONLYOFFICE Desktop Editoren öffnen", + "PrivacyClick": "Klicken Sie auf <1>ONLYOFFICE Desktop Editoren öffnen in der Dialogbox, um mit verschlüsselten Dokumenten zu arbeiten", + "PrivacyDescriptionConnect": "Sie können diese Datei aus der Desktop-App öffnen, wenn Ihre Cloud verbunden ist", + "PrivacyDescriptionEditors": "Wenn Sie ONLYOFFICE Desktop Editoren installiert haben, können aber sie auf dieser Seite nicht öffnen, blockiert Ihr Browser die App", + "PrivacyDialog": "Wenn Sie keine Dialogbox sehen, klicken Sie auf die Schaltfläche unten", + "PrivacyEditors": "Haben Sie ONLYOFFICE Desktop Editoren nicht?", + "PrivacyHeader": "Dieses Dokument ist verschlüsselt", + "PrivacyInstall": "Jetzt installieren" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/de/Settings.json b/products/ASC.Files/Client/public/locales/de/Settings.json index 722b3198b5..55169f05e4 100644 --- a/products/ASC.Files/Client/public/locales/de/Settings.json +++ b/products/ASC.Files/Client/public/locales/de/Settings.json @@ -1,21 +1,21 @@ -{ - "CommonSettings": "Allgemeine Einstellungen", - "ConnectAccounts": "Konten verbinden", - "ConnectAccountsSubTitle": "Keine Konten wurden verbunden", - "ConnectAdminDescription": "Für erfolgreiche Verbindung geben Sie die notwendigen Daten <1>auf dieser Seite ein.", - "ConnectDescription": "Sie können folgende Konten mit ONLYOFFICE verbinden. Dokumente aus diesen Konten werden im Bereich \"Meine Dokumente\" für Bearbeitung verfügbar.", - "ConnectedCloud": "Cloud verbinden", - "ConnectMakeShared": "Freigeben und in den Ordner \"Gemeinsame Dokumente\" verschieben", - "ConnextOtherAccount": "Anderes Konto", - "DisplayFavorites": "Favoriten anzeigen", - "DisplayNotification": "Benachrichtigung beim Verschieben in den Papierkorb anzeigen", - "DisplayRecent": "Neuste anzeigen", - "DisplayTemplates": "Vorlagen anzeigen", - "IntermediateVersion": "Alle gespeicherten Zwischenversionen aufbewahren", - "KeepIntermediateVersion": "Zwischenversionen bei der Bearbeitung aufbewahren", - "OriginalCopy": "Dateikopie auch im Originalformat speichern", - "StoringFileVersion": "Speicherung von Dateiversionen", - "ThirdPartyBtn": "Erlaubt Benutzern Drittanbieterdienste zu verbinden", - "ThirdPartySettings": "Verbundene Cloud-Konten", - "UpdateOrCreate": "Die Version dieser Datei mit demselben Namen erneuern. Ansonsten wird eine Kopie erstellt." +{ + "CommonSettings": "Allgemeine Einstellungen", + "ConnectAccounts": "Konten verbinden", + "ConnectAccountsSubTitle": "Keine Konten wurden verbunden", + "ConnectAdminDescription": "Für erfolgreiche Verbindung geben Sie die notwendigen Daten <1>auf dieser Seite ein.", + "ConnectDescription": "Sie können folgende Konten mit ONLYOFFICE verbinden. Dokumente aus diesen Konten werden im Bereich \"Meine Dokumente\" für Bearbeitung verfügbar.", + "ConnectedCloud": "Cloud verbinden", + "ConnectMakeShared": "Freigeben und in den Ordner \"Gemeinsame Dokumente\" verschieben", + "ConnextOtherAccount": "Anderes Konto", + "DisplayFavorites": "Favoriten anzeigen", + "DisplayNotification": "Benachrichtigung beim Verschieben in den Papierkorb anzeigen", + "DisplayRecent": "Neuste anzeigen", + "DisplayTemplates": "Vorlagen anzeigen", + "IntermediateVersion": "Alle gespeicherten Zwischenversionen aufbewahren", + "KeepIntermediateVersion": "Zwischenversionen bei der Bearbeitung aufbewahren", + "OriginalCopy": "Dateikopie auch im Originalformat speichern", + "StoringFileVersion": "Speicherung von Dateiversionen", + "ThirdPartyBtn": "Erlaube Benutzern Drittanbieterdienste zu verbinden", + "ThirdPartySettings": "Verbundene Cloud-Konten", + "UpdateOrCreate": "Die Version dieser Datei mit demselben Namen erneuern. Ansonsten wird eine Kopie erstellt." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/de/SharingPanel.json b/products/ASC.Files/Client/public/locales/de/SharingPanel.json index 68e32513d9..09ed9a657a 100644 --- a/products/ASC.Files/Client/public/locales/de/SharingPanel.json +++ b/products/ASC.Files/Client/public/locales/de/SharingPanel.json @@ -13,11 +13,10 @@ "InternalLink": "Interner Link", "LinkText": "Benutzer hinzufügen", "Notify users": "Benutzer benachrichtigen", - "Owner": "Besitzer", "ReadOnly": "Schreibgeschützt", "ShareEmailBody": "Ihnen wurde Zugriff auf das Dokument {{itemName}} erteilt. Zum Öffnen klicken Sie auf den Link: {{shareLink}}", "ShareEmailSubject": "Ihnen wurde Zugriff auf das Dokument {{itemName}} erteilt", "ShareEveryone": "Alle", "ShareVia": "Freigeben über", "SharingSettingsTitle": "Freigabeeinstellungen" -} \ No newline at end of file +} diff --git a/products/ASC.Files/Client/public/locales/de/Translations.json b/products/ASC.Files/Client/public/locales/de/Translations.json index 6b4540f519..2ed692d436 100644 --- a/products/ASC.Files/Client/public/locales/de/Translations.json +++ b/products/ASC.Files/Client/public/locales/de/Translations.json @@ -1,39 +1,41 @@ -{ - "ArchivingData": "Archivieren der Daten", - "ConnectingAccount": "Konto wird verbunden", - "Copy": "Kopieren", - "CopyOperation": "Kopieren", - "DeleteFromTrash": "Die ausgewählten Elemente wurden aus dem Papierkorb gelöscht", - "DeleteOperation": "Löschen", - "DeleteSelectedElem": "Die ausgewählten Elemente wurden gelöscht", - "DeleteThirdParty": "Drittanbieterdienst deaktivieren", - "DownloadAs": "Herunterladen als", - "EncryptedFileSaving": "Die verschlüsselte Datei wird gespeichert", - "Files": "Dateien", - "Folders": "Ordner", - "LinkCopySuccess": "Link kopiert", - "Move": "Verschieben", - "MoveToOperation": "Wird verschoben", - "OwnerChange": "Besitzer ändern", - "Presentations": "Präsentationen", - "Restore": "Wiederherstellen", - "Spreadsheets": "Tabellenkalkulationen", - "FolderTitleBoxNet": "Box-Verzeichnis", - "FolderTitleDocuSign": "DocuSign Konto", - "FolderTitleDropBox": "Dropbox-Verzeichnis", - "FolderTitleGoogle": "Google-Verzeichnis", - "FolderTitlekDrive": "kDrive Verzeichnis", - "FolderTitleSharePoint": "SharePoint-Verzeichnis", - "FolderTitleSkyDrive": "OneDrive-Verzeichnis", - "FolderTitleWebDav": "WebDAV Verzeichnis", - "FolderTitleYandex": "Yandex Verzeichnis", - "TypeTitleBoxNet": "Box", - "TypeTitleDocuSign": "DocuSign", - "TypeTitleDropBox": "Dropbox", - "TypeTitleGoogle": "Google Drive", - "TypeTitlekDrive": "kDrive", - "TypeTitleSharePoint": "SharePoint", - "TypeTitleSkyDrive": "OneDrive", - "TypeTitleWebDav": "WebDAV", - "TypeTitleYandex": "Yandex.Disk" -} +{ + "AddAccount": "Konto hinzufügen", + "ArchivingData": "Archivieren der Daten", + "ConnectingAccount": "Konto wird verbunden", + "Copy": "Kopieren", + "CopyOperation": "Kopieren", + "DeleteFromTrash": "Die ausgewählten Elemente wurden aus dem Papierkorb gelöscht", + "DeleteOperation": "Löschen", + "DeleteSelectedElem": "Die ausgewählten Elemente wurden gelöscht", + "DeleteThirdParty": "Drittanbieterdienst deaktivieren", + "DownloadAs": "Herunterladen als", + "EncryptedFileSaving": "Die verschlüsselte Datei wird gespeichert", + "Files": "Dateien", + "Folders": "Ordner", + "FolderTitleBoxNet": "Box-Verzeichnis", + "FolderTitleDocuSign": "DocuSign Konto", + "FolderTitleDropBox": "Dropbox-Verzeichnis", + "FolderTitleGoogle": "Google-Verzeichnis", + "FolderTitlekDrive": "kDrive Verzeichnis", + "FolderTitleSharePoint": "SharePoint-Verzeichnis", + "FolderTitleSkyDrive": "OneDrive-Verzeichnis", + "FolderTitleWebDav": "WebDAV Verzeichnis", + "FolderTitleYandex": "Yandex Verzeichnis", + "LinkCopySuccess": "Der Link wurde in die Zwischenablage kopiert", + "Move": "Verschieben", + "MoveToOperation": "Wird verschoben", + "OwnerChange": "Besitzer ändern", + "Presentations": "Präsentationen", + "Restore": "Wiederherstellen", + "Spreadsheets": "Tabellenkalkulationen", + "ThirdPartyInfo": "Ändern Sie die Drittanbieterinformationen", + "TypeTitleBoxNet": "Box", + "TypeTitleDocuSign": "DocuSign", + "TypeTitleDropBox": "Dropbox", + "TypeTitleGoogle": "Google Drive", + "TypeTitlekDrive": "kDrive", + "TypeTitleSharePoint": "SharePoint", + "TypeTitleSkyDrive": "OneDrive", + "TypeTitleWebDav": "WebDAV", + "TypeTitleYandex": "Yandex.Disk" +} diff --git a/products/ASC.Files/Client/public/locales/en/ConflictResolveDialog.json b/products/ASC.Files/Client/public/locales/en/ConflictResolveDialog.json index 356173e3b2..7812c5da1c 100644 --- a/products/ASC.Files/Client/public/locales/en/ConflictResolveDialog.json +++ b/products/ASC.Files/Client/public/locales/en/ConflictResolveDialog.json @@ -1,12 +1,12 @@ -{ - "ConflictResolveDescription": "The file with the name {{file}} already exists in the folder {{folder}}.", - "ConflictResolveDescriptionFiles": "{{filesCount}} documents with the same name already exist in the folder '{{folder}}'.", - "ConflictResolveSelectAction": "Please select the action:", - "ConflictResolveTitle": "Overwrite confirmation", - "CreateDescription": "There will be two different files in the folder.", - "CreateTitle": "Create file copy", - "OverwriteDescription": "The file will be added to the file with the same name as a version.", - "OverwriteTitle": "Overwrite with version update", - "SkipDescription": "No file will be copied. The original file will be retained in the destination folder.", - "SkipTitle": "Skip" +{ + "ConflictResolveDescription": "The file with the name {{file}} already exists in the folder {{folder}}.", + "ConflictResolveDescriptionFiles": "{{filesCount}} documents with the same name already exist in the folder '{{folder}}'.", + "ConflictResolveSelectAction": "Please select the action:", + "ConflictResolveTitle": "Overwrite confirmation", + "CreateDescription": "There will be two different files in the folder.", + "CreateTitle": "Create file copy", + "OverwriteDescription": "The new file will replace the existing one as a new version.", + "OverwriteTitle": "Overwrite with version update", + "SkipDescription": "No file will be copied. The original file will be retained in the destination folder.", + "SkipTitle": "Skip" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/en/ConvertDialog.json b/products/ASC.Files/Client/public/locales/en/ConvertDialog.json index 27a193e3ac..de3b2aa494 100644 --- a/products/ASC.Files/Client/public/locales/en/ConvertDialog.json +++ b/products/ASC.Files/Client/public/locales/en/ConvertDialog.json @@ -1,6 +1,6 @@ { + "ConversionFileMessage": "The file will be converted to OOXML (docx, xlsx, or pptx) for faster viewing and editing.", "ConversionMessage": "All the documents you upload will be converted into Office Open XML format (docx, xlsx or pptx) for faster editing.", - "ConversionFileMessage": "The document file you open will be converted to the Office Open XML format for faster viewing and editing.", "ConversionTitle": "Document uploading", "ConvertAndOpenTitle": "Convert and open document", "HideMessage": "Do not show this message again", diff --git a/products/ASC.Files/Client/public/locales/en/DeleteDialog.json b/products/ASC.Files/Client/public/locales/en/DeleteDialog.json index 6db95969ca..228018d81e 100644 --- a/products/ASC.Files/Client/public/locales/en/DeleteDialog.json +++ b/products/ASC.Files/Client/public/locales/en/DeleteDialog.json @@ -8,6 +8,5 @@ "MoveToTrashOneFolderTitle": "Move folder to Trash?", "UnsubscribeButton": "Unsubscribe", "UnsubscribeNote": "Are you sure you want to unsubscribe from the selected items from the list?", - "UnsubscribeTitle": "Unsubscribe confirmation", - "ConfirmRemove": "Confirmation" + "UnsubscribeTitle": "Unsubscribe confirmation" } diff --git a/products/ASC.Files/Client/public/locales/en/Home.json b/products/ASC.Files/Client/public/locales/en/Home.json index dc952d67b4..5506ea9209 100644 --- a/products/ASC.Files/Client/public/locales/en/Home.json +++ b/products/ASC.Files/Client/public/locales/en/Home.json @@ -21,13 +21,11 @@ "EmptyFolderHeader": "No files in this folder", "EmptyRecycleBin": "Empty Trash", "FavoritesEmptyContainerDescription": "To mark files as favorites or remove them from this list, use the context menu.", - "FileCreated": "New file {{itemTitle}}.{{exst}} is created", "FileRemoved": "File moved to Trash", "FileRenamed": "The document '{{oldTitle}}' is renamed to '{{newTitle}}'", "Filter": "Filter", "FinalizeVersion": "Finalize version", "Folder": "Folder", - "FolderCreated": "New folder {{itemTitle}} is created", "FolderRemoved": "Folder moved to Trash", "FolderRenamed": "The folder '{{folderTitle}}' is renamed to '{{newFoldedTitle}}'", "GoToMyButton": "Go to My Documents", @@ -38,7 +36,7 @@ "MarkRead": "Mark as read", "Media": "Media", "MoveItem": "{{title}} moved", - "MoveItems": "{{qty}} elements has been moved", + "MoveItems": "{{qty}} elements have been moved", "MoveTo": "Move to", "MyEmptyContainerDescription": "Documents you create or upload are kept in 'My Documents' section. You can edit, share, and collaborate on them with your team.", "New": "New", diff --git a/products/ASC.Files/Client/public/locales/en/PrivacyPage.json b/products/ASC.Files/Client/public/locales/en/PrivacyPage.json index b0a83dcce3..893d2d189b 100644 --- a/products/ASC.Files/Client/public/locales/en/PrivacyPage.json +++ b/products/ASC.Files/Client/public/locales/en/PrivacyPage.json @@ -1,10 +1,10 @@ -{ - "PrivacyHeader": "This document is encrypted", - "PrivacyClick": "Click Open <1>ONLYOFFICE Desktop in the browser dialog to work with the encrypted documents", - "PrivacyDialog": "If you don’t see a dialog, click the button below", - "PrivacyButton": "Open ONLYOFFICE Desktop Editors", - "PrivacyEditors": "Don’t have ONLYOFFICE Desktop Editors", - "PrivacyInstall": "Install now", - "PrivacyDescriptionEditors": "If you have ONLYOFFICE Desktop Editors installed but can't open it from this page, your browser might be blocking it", - "PrivacyDescriptionConnect": "You can open this file from the desktop app's interface once your cloud is connected" -} +{ + "PrivacyButton": "Open ONLYOFFICE Desktop Editors", + "PrivacyClick": "Click Open <1>ONLYOFFICE Desktop in the browser dialog to work with the encrypted documents", + "PrivacyDescriptionConnect": "You can open this file from the desktop app's interface once your cloud is connected", + "PrivacyDescriptionEditors": "If you have ONLYOFFICE Desktop Editors installed but can't open it from this page, your browser might be blocking it", + "PrivacyDialog": "If you don’t see a dialog, click the button below", + "PrivacyEditors": "Don’t have ONLYOFFICE Desktop Editors?", + "PrivacyHeader": "This document is encrypted", + "PrivacyInstall": "Install now" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/en/SelectFile.json b/products/ASC.Files/Client/public/locales/en/SelectFile.json index 4390e4493a..da903c63f2 100644 --- a/products/ASC.Files/Client/public/locales/en/SelectFile.json +++ b/products/ASC.Files/Client/public/locales/en/SelectFile.json @@ -1,3 +1,3 @@ -{ - "SelectFile": "Select file" -} +{ + "SelectFile": "Select file" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/en/SelectFolder.json b/products/ASC.Files/Client/public/locales/en/SelectFolder.json index fd719cf546..706ea13ecd 100644 --- a/products/ASC.Files/Client/public/locales/en/SelectFolder.json +++ b/products/ASC.Files/Client/public/locales/en/SelectFolder.json @@ -1,3 +1,3 @@ -{ - "NotAvailableFolder": "No folders available" -} +{ + "NotAvailableFolder": "No folders available" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/en/Settings.json b/products/ASC.Files/Client/public/locales/en/Settings.json index 4d98693d08..81c58c3f12 100644 --- a/products/ASC.Files/Client/public/locales/en/Settings.json +++ b/products/ASC.Files/Client/public/locales/en/Settings.json @@ -1,21 +1,21 @@ -{ - "CommonSettings": "Common settings", - "ConnectAccounts": "Connect Accounts", - "ConnectAccountsSubTitle": "No connected accounts", - "ConnectAdminDescription": "For successful connection, enter the necessary data on <1>this page.", - "ConnectDescription": "You can connect the following accounts to the ONLYOFFICE Documents. The documents from these accounts will be available for editing in 'My Documents' section. ", - "ConnectedCloud": "Connected cloud", - "ConnectMakeShared": "Make shared and put into the 'Common' folder", - "ConnextOtherAccount": "Other account", - "DisplayFavorites": "Display Favorites", - "DisplayNotification": "Display notification when moving items to Trash", - "DisplayRecent": "Display Recent", - "DisplayTemplates": "Display Templates", - "IntermediateVersion": "Keep all saved intermediate versions", - "KeepIntermediateVersion": "Keep intermediate versions when editing", - "OriginalCopy": "Save the file copy in the original format as well", - "StoringFileVersion": "Storing file versions", - "ThirdPartyBtn": "Allow users to connect third-party storages", - "ThirdPartySettings": "Connected clouds", - "UpdateOrCreate": "Update the file version for the existing file with the same name. Otherwise, a copy of the file will be created." +{ + "CommonSettings": "Common settings", + "ConnectAccounts": "Connect Accounts", + "ConnectAccountsSubTitle": "No connected accounts", + "ConnectAdminDescription": "For successful connection, enter the necessary data on <1>this page.", + "ConnectDescription": "You can connect the following accounts to the ONLYOFFICE Documents. The documents from these accounts will be available for editing in 'My Documents' section. ", + "ConnectedCloud": "Connected cloud", + "ConnectMakeShared": "Make shared and put into the 'Common' folder", + "ConnextOtherAccount": "Other account", + "DisplayFavorites": "Display Favorites", + "DisplayNotification": "Display notification when moving items to Trash", + "DisplayRecent": "Display Recent", + "DisplayTemplates": "Display Templates", + "IntermediateVersion": "Keep all saved intermediate versions", + "KeepIntermediateVersion": "Keep intermediate versions when editing", + "OriginalCopy": "Save the file copy in the original format as well", + "StoringFileVersion": "Storing file versions", + "ThirdPartyBtn": "Allow users to connect third-party storages", + "ThirdPartySettings": "Connected clouds", + "UpdateOrCreate": "Update the file version for the existing file with the same name. Otherwise, a copy of the file will be created." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/en/SharingPanel.json b/products/ASC.Files/Client/public/locales/en/SharingPanel.json index 2616908dc5..f856c58d60 100644 --- a/products/ASC.Files/Client/public/locales/en/SharingPanel.json +++ b/products/ASC.Files/Client/public/locales/en/SharingPanel.json @@ -13,11 +13,10 @@ "InternalLink": "Internal link", "LinkText": "Add users", "Notify users": "Notify users", - "Owner": "Owner", "ReadOnly": "Read only", "ShareEmailBody": "You have been granted access to the {{itemName}} document. Click the link below to open the document right now: {{shareLink}}", "ShareEmailSubject": "You have been granted access to the {{itemName}} document", "ShareEveryone": "Everyone", "ShareVia": "Share via", "SharingSettingsTitle": "Sharing settings" -} \ No newline at end of file +} diff --git a/products/ASC.Files/Client/public/locales/en/Translations.json b/products/ASC.Files/Client/public/locales/en/Translations.json index fea2e92808..9dda14a976 100644 --- a/products/ASC.Files/Client/public/locales/en/Translations.json +++ b/products/ASC.Files/Client/public/locales/en/Translations.json @@ -1,44 +1,44 @@ -{ - "AddAccount": "Add account", - "ArchivingData": "Archiving data", - "ConnectingAccount": "Connecting account", - "Copy": "Copy", - "CopyOperation": "Copying", - "DeleteFromTrash": "Selected elements were successfully deleted from Trash", - "DeleteOperation": "Deleting", - "DeleteSelectedElem": "Selected elements were successfully deleted", - "DeleteThirdParty": "Delete third-party", - "DownloadAs": "Download as", - "EncryptedFileSaving": "Saving encrypted file", - "Files": "Files", - "Folders": "Folders", - "LinkCopySuccess": "Link copied", - "Move": "Move", - "MoveToOperation": "Moving", - "OwnerChange": "Change owner", - "Presentations": "Presentations", - "Restore": "Restore", - "Spreadsheets": "Spreadsheets", - "ThirdPartyInfo": "Change the third-party info", - "DownloadApps": "Download applications", - "SelectFolder": "Select folder", - "FolderTitleBoxNet": "Box directory", - "FolderTitleDocuSign": "DocuSign account", - "FolderTitleDropBox": "Dropbox directory", - "FolderTitleGoogle": "Google directory", - "FolderTitlekDrive": "kDrive directory", - "FolderTitleSharePoint": "SharePoint directory", - "FolderTitleSkyDrive": "OneDrive directory", - "FolderTitleWebDav": "WebDAV Directory", - "FolderTitleYandex": "Yandex Directory", - "TypeTitleBoxNet": "Box", - "TypeTitleDocuSign": "DocuSign", - "TypeTitleDropBox": "Dropbox", - "TypeTitleGoogle": "Google Drive", - "TypeTitlekDrive": "kDrive", - "TypeTitleSharePoint": "SharePoint", - "TypeTitleSkyDrive": "OneDrive", - "TypeTitleWebDav": "WebDAV", - "TypeTitleYandex": "Yandex.Disk", - "MediaLoadError": "Media file could not be loaded" -} +{ + "AddAccount": "Add account", + "ArchivingData": "Archiving data", + "ConnectingAccount": "Connecting account", + "Copy": "Copy", + "CopyOperation": "Copying", + "DeleteFromTrash": "Selected elements were successfully deleted from Trash", + "DeleteOperation": "Deleting", + "DeleteSelectedElem": "Selected elements were successfully deleted", + "DeleteThirdParty": "Delete third-party", + "DownloadApps": "Download applications", + "DownloadAs": "Download as", + "EncryptedFileSaving": "Saving encrypted file", + "Files": "Files", + "Folders": "Folders", + "FolderTitleBoxNet": "Box directory", + "FolderTitleDocuSign": "DocuSign account", + "FolderTitleDropBox": "Dropbox directory", + "FolderTitleGoogle": "Google directory", + "FolderTitlekDrive": "kDrive directory", + "FolderTitleSharePoint": "SharePoint directory", + "FolderTitleSkyDrive": "OneDrive directory", + "FolderTitleWebDav": "WebDAV Directory", + "FolderTitleYandex": "Yandex Directory", + "LinkCopySuccess": "Link has been copied to the clipboard", + "MediaLoadError": "Media file could not be loaded", + "Move": "Move", + "MoveToOperation": "Moving", + "OwnerChange": "Change owner", + "Presentations": "Presentations", + "Restore": "Restore", + "SelectFolder": "Select folder", + "Spreadsheets": "Spreadsheets", + "ThirdPartyInfo": "Change the third-party info", + "TypeTitleBoxNet": "Box", + "TypeTitleDocuSign": "DocuSign", + "TypeTitleDropBox": "Dropbox", + "TypeTitleGoogle": "Google Drive", + "TypeTitlekDrive": "kDrive", + "TypeTitleSharePoint": "SharePoint", + "TypeTitleSkyDrive": "OneDrive", + "TypeTitleWebDav": "WebDAV", + "TypeTitleYandex": "Yandex.Disk" +} diff --git a/products/ASC.Files/Client/public/locales/fr/Article.json b/products/ASC.Files/Client/public/locales/fr/Article.json index 9e26dfeeb6..f3c30c04b6 100644 --- a/products/ASC.Files/Client/public/locales/fr/Article.json +++ b/products/ASC.Files/Client/public/locales/fr/Article.json @@ -1 +1,8 @@ -{} \ No newline at end of file +{ + "NewDocument": "Nouveau document", + "NewFolder": "Nouveau dossier", + "NewPresentation": "Nouvelle présentation", + "NewSpreadsheet": "Nouvelle feuille de calcul", + "UploadFiles": "Télécharger les fichiers", + "UploadFolder": "Télécharger le dossier" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/ChangeOwnerPanel.json b/products/ASC.Files/Client/public/locales/fr/ChangeOwnerPanel.json index e28e54d338..04ca82b8d8 100644 --- a/products/ASC.Files/Client/public/locales/fr/ChangeOwnerPanel.json +++ b/products/ASC.Files/Client/public/locales/fr/ChangeOwnerPanel.json @@ -1,4 +1,4 @@ -{ - "ChangeOwner": "Changer le propriétaire ({{fileName}})", - "ChangeOwnerDescription": "Lors d'un changement de propriétaire, le propriétaire actuel devient membre du groupe." +{ + "ChangeOwner": "Changer le propriétaire ({{fileName}})", + "ChangeOwnerDescription": "Lors d'un changement de propriétaire, le propriétaire actuel devient membre du groupe." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/ConflictResolveDialog.json b/products/ASC.Files/Client/public/locales/fr/ConflictResolveDialog.json index 9e26dfeeb6..8524179a54 100644 --- a/products/ASC.Files/Client/public/locales/fr/ConflictResolveDialog.json +++ b/products/ASC.Files/Client/public/locales/fr/ConflictResolveDialog.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "ConflictResolveDescription": "Le fichier portant le nom {{file}} existe déjà dans le dossier {{folder}}.", + "ConflictResolveDescriptionFiles": "{{filesCount}} les documents portant le même nom existent déjà dans le dossier '{{folder}}'.", + "ConflictResolveSelectAction": "Veuillez sélectionner une action :", + "ConflictResolveTitle": "Confirmation de l'écrasement", + "CreateDescription": "Il y aura deux fichiers différents dans le dossier.", + "CreateTitle": "Créer une copie du fichier", + "OverwriteDescription": "Le nouveau fichier remplacera le fichier existant en tant que nouvelle version.", + "OverwriteTitle": "Écraser avec la mise à jour de la version", + "SkipDescription": "Aucun fichier ne sera copié. Le fichier d'origine sera conservé dans le dossier de destination.", + "SkipTitle": "Sauter" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/ConnectDialog.json b/products/ASC.Files/Client/public/locales/fr/ConnectDialog.json index 0c45105003..49b33e7250 100644 --- a/products/ASC.Files/Client/public/locales/fr/ConnectDialog.json +++ b/products/ASC.Files/Client/public/locales/fr/ConnectDialog.json @@ -1,4 +1,8 @@ -{ - "Account": "Compte", - "Login": "Identifiant" +{ + "Account": "Compte", + "ConnectFolderTitle": "Titre du dossier", + "ConnectionUrl": "URL de connexion", + "ConnectMakeShared": "Partager et mettre dans le dossier \"commun\".", + "Login": "Identifiant", + "Reconnect": "Reconnexion" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/ConvertDialog.json b/products/ASC.Files/Client/public/locales/fr/ConvertDialog.json index 0ccb0a06e1..4584db5c51 100644 --- a/products/ASC.Files/Client/public/locales/fr/ConvertDialog.json +++ b/products/ASC.Files/Client/public/locales/fr/ConvertDialog.json @@ -1,3 +1,8 @@ -{ - "ConversionMessage": "Tous les documents transférés seront convertis au format Office Open XML (docx, xlsx or pptx) pour garantir une édition rapide." -} \ No newline at end of file +{ + "ConversionFileMessage": "Le fichier sera converti en OOXML (docx, xlsx ou pptx) pour une visualisation et une édition plus rapides.", + "ConversionMessage": "Tous les documents transférés seront convertis au format Office Open XML (docx, xlsx or pptx) pour garantir une édition rapide.", + "ConversionTitle": "Téléversement du document", + "ConvertAndOpenTitle": "Convertir et ouvrir le document", + "HideMessage": "Ne plus afficher ce message", + "SaveOriginalFormatMessage": "Enregistrer la copie du fichier dans le format original" +} diff --git a/products/ASC.Files/Client/public/locales/fr/DeleteDialog.json b/products/ASC.Files/Client/public/locales/fr/DeleteDialog.json index 9e26dfeeb6..5d9492368d 100644 --- a/products/ASC.Files/Client/public/locales/fr/DeleteDialog.json +++ b/products/ASC.Files/Client/public/locales/fr/DeleteDialog.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "MoveToTrashButton": "Mettre dans la corbeille", + "MoveToTrashItemsNote": "Si vous supprimez des éléments partagés, les autres utilisateurs ne pourront plus y accéder.", + "MoveToTrashItemsTitle": "Déplacer les éléments vers la corbeille ?", + "MoveToTrashOneFileNote": "Si vous supprimez le fichier partagé avec quelqu'un, il deviendra indisponible pour les autres.", + "MoveToTrashOneFileTitle": "Déplacer le fichier vers la corbeille ?", + "MoveToTrashOneFolderNote": "Si vous supprimez un dossier partagé, les autres utilisateurs ne pourront plus y accéder.", + "MoveToTrashOneFolderTitle": "Déplacer le dossier vers la corbeille ?", + "UnsubscribeButton": "Se désabonner", + "UnsubscribeNote": "Êtes-vous sûr de vouloir vous désabonner des éléments sélectionnés dans la liste ?", + "UnsubscribeTitle": "Confirmation de désabonnement" +} diff --git a/products/ASC.Files/Client/public/locales/fr/DeleteThirdPartyDialog.json b/products/ASC.Files/Client/public/locales/fr/DeleteThirdPartyDialog.json index 9e26dfeeb6..afb131e750 100644 --- a/products/ASC.Files/Client/public/locales/fr/DeleteThirdPartyDialog.json +++ b/products/ASC.Files/Client/public/locales/fr/DeleteThirdPartyDialog.json @@ -1 +1,4 @@ -{} \ No newline at end of file +{ + "DeleteThirdPartyAlert": "Voulez-vous supprimer {{service}} du module \"Documents\" ? . Cela n'affectera en aucun cas votre compte : {{account}} .", + "SuccessDeleteThirdParty": "Le {{service}} tiers est supprimé." +} diff --git a/products/ASC.Files/Client/public/locales/fr/DownloadDialog.json b/products/ASC.Files/Client/public/locales/fr/DownloadDialog.json index 9e26dfeeb6..6f28bde6ec 100644 --- a/products/ASC.Files/Client/public/locales/fr/DownloadDialog.json +++ b/products/ASC.Files/Client/public/locales/fr/DownloadDialog.json @@ -1 +1,9 @@ -{} \ No newline at end of file +{ + "ChooseFormatText": "Choisissez le format de chaque fichier à télécharger", + "ConvertInto": "Convertir en", + "ConvertMessage": "Si vous choisissez de convertir le fichier dans un format différent de l'original, certaines données peuvent être perdues.", + "ConvertToZip": "Les fichiers seront compressés dans le fichier .zip", + "CustomFormat": "Format personnalisé", + "OriginalFormat": "Format d'origine", + "Other": "Autre" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/EmbeddingPanel.json b/products/ASC.Files/Client/public/locales/fr/EmbeddingPanel.json index 0330efbf66..27c94ca5a9 100644 --- a/products/ASC.Files/Client/public/locales/fr/EmbeddingPanel.json +++ b/products/ASC.Files/Client/public/locales/fr/EmbeddingPanel.json @@ -1,3 +1,8 @@ -{ - "Auto": "Auto" +{ + "Auto": "Auto", + "CodeCopySuccess": "Le code a été copié dans le presse-papiers", + "EmbedCode": "Code d'intégration", + "EmbeddingDocument": "Intégration de document", + "Height": "Hauteur", + "Width": "Largeur" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/EmptyTrashDialog.json b/products/ASC.Files/Client/public/locales/fr/EmptyTrashDialog.json index 9e26dfeeb6..bee109acc0 100644 --- a/products/ASC.Files/Client/public/locales/fr/EmptyTrashDialog.json +++ b/products/ASC.Files/Client/public/locales/fr/EmptyTrashDialog.json @@ -1 +1,6 @@ -{} \ No newline at end of file +{ + "DeleteForeverButton": "Supprimer définitivement", + "DeleteForeverNote": "Tous les fichiers de la Corbeille seront supprimés à jamais. Vous ne pourrez pas les restaurer.", + "DeleteForeverTitle": "Supprimer définitivement ?", + "SuccessEmptyTrash": "Corbeille vidée" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/Home.json b/products/ASC.Files/Client/public/locales/fr/Home.json index 0e4bf9222e..97ff905ab7 100644 --- a/products/ASC.Files/Client/public/locales/fr/Home.json +++ b/products/ASC.Files/Client/public/locales/fr/Home.json @@ -1,14 +1,83 @@ -{ - "All": "Tous", - "AllFiles": "Tous les fichiers", - "Archives": "Archives", - "BackToParentFolderButton": "Retour vers le dossier précédent", - "ByAuthor": "Auteur", - "CopyItem": "{{title}} copié", - "CopyItems": "{{qty}} éléments copiés", - "CreateWithEmptyTitle": "Impossible de créer un dossier ou un fichier sans titre", - "MarkedAsFavorite": "Ajouté aux favoris", - "MoveItem": "{{title}} déplacé", - "MoveItems": "{{qty}} éléments ont été déplacés", - "ViewList": "Liste" -} \ No newline at end of file +{ + "All": "Tout", + "AllFiles": "Tous les fichiers", + "Archives": "Archives", + "BackToParentFolderButton": "Retour vers le dossier précédent", + "ByAuthor": "Auteur", + "ByCreationDate": "Créé", + "ByLastModifiedDate": "Modifié", + "ByTitle": "Titre", + "CommonEmptyContainerDescription": "La section \"Documents Communs\" contient des fichiers partagés par l'administrateur du portail avec tous les utilisateurs. Seuls les administrateurs du portail peuvent y créer des fichiers. Les utilisateurs peuvent obtenir un accès complet à un certain dossier de la section. Ainsi, ils pourront créer/télécharger des fichiers dans ce même dossier. ", + "ContainsSpecCharacter": "Le titre ne peut contenir aucun des caractères suivants : *+ :\"<>?|/", + "Convert": "Convertir", + "CopyItem": "{{title}} copié", + "CopyItems": "{{qty}} éléments copiés", + "CreateWithEmptyTitle": "Impossible de créer un dossier ou un fichier sans titre", + "Document": "Document", + "Duplicate": "Créer une copie", + "EmptyFile": "Fichier vide", + "EmptyFilterDescriptionText": "Aucun fichier ou dossier ne correspond à ce filtre. Essayez un autre filtre ou effacez le filtre pour afficher tous les fichiers. ", + "EmptyFilterSubheadingText": "Aucun fichier à afficher pour ce filtre ici", + "EmptyFolderHeader": "Aucun fichier dans ce dossier", + "EmptyRecycleBin": "Vider la corbeille", + "FavoritesEmptyContainerDescription": "Pour marquer des fichiers comme favoris ou les supprimer de cette liste, utilisez le menu contextuel.", + "FileRemoved": "Fichier déplacé vers la corbeille", + "FileRenamed": "Le document '{{oldTitle}}' est renommé en '{{newTitle}}'", + "Filter": "Filtre", + "FinalizeVersion": "Finaliser la version", + "Folder": "Dossier", + "FolderRemoved": "Dossier déplacé vers la corbeille", + "FolderRenamed": "Le dossier '{{folderTitle}}' est renommé en '{{newFoldedTitle}}'", + "GoToMyButton": "Allez dans Mes documents", + "Images": "Images", + "LinkForPortalUsers": "Lien pour les utilisateurs du portail", + "MarkAsFavorite": "Marquer en tant que favori", + "MarkedAsFavorite": "Ajouté aux favoris", + "MarkRead": "Marquer comme lu(s)", + "Media": "Média", + "MoveItem": "{{title}} déplacé", + "MoveItems": "{{qty}} éléments ont été déplacés", + "MoveTo": "Déplacer vers", + "MyEmptyContainerDescription": "Les documents que vous créez ou téléchargez sont conservés dans la section \"Mes documents\". Vous pouvez les modifier, les partager et collaborer avec votre équipe.", + "New": "nouveau", + "NewDocument": "Nouveau document", + "NewFolder": "Nouveau dossier", + "NewPresentation": "Nouvelle présentation", + "NewSpreadsheet": "Nouvelle feuille de calcul", + "NoSubfolders": "Aucun sous-dossier", + "Open": "Ouvrir", + "OpenLocation": "Ouvrir un emplacement ", + "Presentation": "Présentation", + "Preview": "Aperçu", + "PrivateRoomDescriptionEncrypted": "Édition cryptée et collaboration en temps réel.", + "PrivateRoomDescriptionSafest": "Le stockage le plus sûr pour les docx, xlsx et pptx.", + "PrivateRoomDescriptionSecure": "Partage sécurisé avec des coéquipiers de confiance.", + "PrivateRoomDescriptionUnbreakable": "Algorithme stable AES-256.", + "PrivateRoomHeader": "Bienvenue dans la Salle Privée ONLYOFFICE où chaque symbole que vous tapez est crypté.", + "PrivateRoomSupport": "Le travail dans la Salle Privée est disponible via l'application de bureau {{organizationName}}. <3>Instructions", + "RecentEmptyContainerDescription": "La section \"Récents\" montre les derniers fichiers consultés ou modifiés.", + "RemovedFromFavorites": "Rétiré des favoris", + "RemoveFromFavorites": "Retirer des favoris", + "RemoveFromList": "Retirer de la liste", + "Rename": "Renommer", + "SendByEmail": "Envoyer par émail", + "Share": "Partager", + "SharedEmptyContainerDescription": "La section \"Partagés avec moi\" affiche les fichiers que vos coéquipiers ont partagés avec vous. Si vous n'avez pas vu les dernières modifications, ils sont marqués comme nouveaux. Vous pouvez supprimer les fichiers de la liste en utilisant le menu contextuel. ", + "SharingSettings": "Paramètres de partage", + "ShowVersionHistory": "Afficher l'historique des versions", + "Spreadsheet": "Feuille de calcul", + "SubheadingEmptyText": "Aucun fichier à afficher dans cette section", + "TitleCreated": "Créée", + "TitleDocuments": "Dcs", + "TitleModified": "Actualisé", + "TitleSubfolders": "Dossiers", + "TitleUploaded": "Téléchargé", + "TooltipElementCopyMessage": "Copier {{element}}", + "TooltipElementsCopyMessage": "Copier {{element}} des elements", + "TooltipElementsMoveMessage": "Déplacer les éléments {{element}}", + "TrashEmptyContainerDescription": "La Corbeille est l'endroit où sont déplacés tous les fichiers supprimés. Vous pouvez les restaurer ou les supprimer définitivement en vidant la Corbeille. ", + "UnblockVersion": "Débloquer/enregistrer", + "UploadToFolder": "Télécharger le dossier", + "ViewList": "Liste", + "ViewTiles": "Carreaux" +} diff --git a/products/ASC.Files/Client/public/locales/fr/NewFilesPanel.json b/products/ASC.Files/Client/public/locales/fr/NewFilesPanel.json index 9e26dfeeb6..10f9a7c969 100644 --- a/products/ASC.Files/Client/public/locales/fr/NewFilesPanel.json +++ b/products/ASC.Files/Client/public/locales/fr/NewFilesPanel.json @@ -1 +1,4 @@ -{} \ No newline at end of file +{ + "MarkAsRead": "tout marquer comme lu", + "NewFiles": "Nouveaux fichiers" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/OperationsPanel.json b/products/ASC.Files/Client/public/locales/fr/OperationsPanel.json index 9e26dfeeb6..32a5bc3910 100644 --- a/products/ASC.Files/Client/public/locales/fr/OperationsPanel.json +++ b/products/ASC.Files/Client/public/locales/fr/OperationsPanel.json @@ -1 +1,3 @@ -{} \ No newline at end of file +{ + "MoveToFolderMessage": "Vous ne pouvez pas déplacer le dossier vers son sous-dossier" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/PrivacyPage.json b/products/ASC.Files/Client/public/locales/fr/PrivacyPage.json new file mode 100644 index 0000000000..95f1053b0a --- /dev/null +++ b/products/ASC.Files/Client/public/locales/fr/PrivacyPage.json @@ -0,0 +1,10 @@ +{ + "PrivacyButton": "Ouvrir ONLYOFFICE Desktop Editors", + "PrivacyClick": "Cliquez sur Ouvrir <1>ONLYOFFICE Desktop dans la boîte de dialogue du navigateur pour travailler avec les documents chiffrés", + "PrivacyDescriptionConnect": "Vous pouvez ouvrir ce fichier à partir de l'interface de l'application de bureau une fois que votre cloud est connecté", + "PrivacyDescriptionEditors": "Si vous avez installé ONLYOFFICE Desktop Editors mais ne pouvez pas l'ouvrir à partir de cette page, il se peut que votre navigateur le bloque", + "PrivacyDialog": "Si vous ne voyez pas de dialogue, cliquez sur le bouton ci-dessous", + "PrivacyEditors": "Vous n'avez pas ONLYOFFICE Desktop Editors ?", + "PrivacyHeader": "Ce document est chiffré", + "PrivacyInstall": "Installer maintenant" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/Settings.json b/products/ASC.Files/Client/public/locales/fr/Settings.json index 273997362e..47ee9ad0d8 100644 --- a/products/ASC.Files/Client/public/locales/fr/Settings.json +++ b/products/ASC.Files/Client/public/locales/fr/Settings.json @@ -1,3 +1,21 @@ -{ - "ThirdPartyBtn": "Activer les paramètres de tiers liés aux stockages pour les utilisateurs" +{ + "CommonSettings": "Paramètres communs", + "ConnectAccounts": "Comptes connectés", + "ConnectAccountsSubTitle": "Pas de comptes connectés", + "ConnectAdminDescription": "Pour une connexion réussie, saisissez les données nécessaires sur <1>cette page.", + "ConnectDescription": "Vous pouvez connecter les comptes suivants aux documents ONLYOFFICE. Les documents de ces comptes seront disponibles pour être édités dans la section 'Mes documents'. ", + "ConnectedCloud": "Cloud connecté", + "ConnectMakeShared": "Rendre partagé et mettre dans le dossier 'communs'", + "ConnextOtherAccount": "Autre compte", + "DisplayFavorites": "Afficher les favoris", + "DisplayNotification": "Afficher une notification lors du déplacement d'éléments vers la corbeille", + "DisplayRecent": "Afficher les fichiers récents", + "DisplayTemplates": "Afficher les modèles", + "IntermediateVersion": "Garder toutes les versions intermédiaires sauvegardées", + "KeepIntermediateVersion": "Sauvegarder les versions intermédiaires lors de l'édition", + "OriginalCopy": "Sauvegarder également la copie du fichier dans le format original.", + "StoringFileVersion": "Stockage des versions de fichier", + "ThirdPartyBtn": "Activer les paramètres de tiers liés aux stockages pour les utilisateurs", + "ThirdPartySettings": "Cloud connectés", + "UpdateOrCreate": "Mettre à jour la version du fichier pour le fichier existant avec le même nom. Sinon, une copie du fichier sera créée." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/SharingPanel.json b/products/ASC.Files/Client/public/locales/fr/SharingPanel.json index 6c917e168e..190bf42f88 100644 --- a/products/ASC.Files/Client/public/locales/fr/SharingPanel.json +++ b/products/ASC.Files/Client/public/locales/fr/SharingPanel.json @@ -1,5 +1,22 @@ -{ - "AddGroupsForSharingButton": "Ajouter des groupes", - "AddShareMessage": "Ajouter un message", - "LinkText": "Ajouter des utilisateurs" -} \ No newline at end of file +{ + "AddGroupsForSharingButton": "Ajouter des groupes", + "AddShareMessage": "Ajouter un message", + "Comment": "Commentaire", + "CopyExternalLink": "Copier le lien externe", + "CopyInternalLink": "Copier le lien interne", + "CustomFilter": "Filtre personnalisé", + "DenyAccess": "Refuser l'accès", + "Embedding": "Intégration", + "EncryptedFileSharing": "Fichier {{title}} partagé avec succès", + "ExternalLink": "Lien externe", + "FormFilling": "Remplissage de formulaire", + "InternalLink": "Lien interne", + "LinkText": "Ajouter des utilisateurs", + "Notify users": "Informer les utilisateurs", + "ReadOnly": "Lecture seule", + "ShareEmailBody": "Vous avez été autorisé à accéder au document {{itemName}}. Cliquez sur le lien ci-dessous pour ouvrir le document maintenant : {{shareLink}}", + "ShareEmailSubject": "Vous avez été autorisé à accéder au document {{itemName}}", + "ShareEveryone": "Tous", + "ShareVia": "Partager via", + "SharingSettingsTitle": "Paramètres de partage" +} diff --git a/products/ASC.Files/Client/public/locales/fr/ThirdPartyMoveDialog.json b/products/ASC.Files/Client/public/locales/fr/ThirdPartyMoveDialog.json index 29f4bea1df..334f80c6a4 100644 --- a/products/ASC.Files/Client/public/locales/fr/ThirdPartyMoveDialog.json +++ b/products/ASC.Files/Client/public/locales/fr/ThirdPartyMoveDialog.json @@ -1,3 +1,5 @@ -{ - "MoveConfirmationAlert": "Êtes-vous sur de vouloir déplacer ces éléments ?" +{ + "MoveConfirmation": "Confirmation de déplacement", + "MoveConfirmationAlert": "Êtes-vous sur de vouloir déplacer ces éléments ?", + "MoveConfirmationMessage": "Vous êtes sur le point de déplacer des éléments du répertoire {{provider}}. Ils seront supprimés de votre compte {{provider}} et ne seront plus accessibles aux autres utilisateurs." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/Translations.json b/products/ASC.Files/Client/public/locales/fr/Translations.json index 6dd93d67bb..61bdb6a64d 100644 --- a/products/ASC.Files/Client/public/locales/fr/Translations.json +++ b/products/ASC.Files/Client/public/locales/fr/Translations.json @@ -1,20 +1,41 @@ -{ - "FolderTitleBoxNet": "Répertoire de Box", - "FolderTitleDocuSign": "Сompte DocuSign", - "FolderTitleDropBox": "Répertoire de Dropbox", - "FolderTitleGoogle": "Répertoire de Google", - "FolderTitlekDrive": "Répertoire kDrive", - "FolderTitleSharePoint": "Répertoire de SharePoint", - "FolderTitleSkyDrive": "Répertoire de OneDrive", - "FolderTitleWebDav": "Répertoire WebDAV", - "FolderTitleYandex": "WebDAV Yandex", - "TypeTitleBoxNet": "Box", - "TypeTitleDocuSign": "DocuSign", - "TypeTitleDropBox": "Dropbox", - "TypeTitleGoogle": "Google Drive", - "TypeTitlekDrive": "kDrive", - "TypeTitleSharePoint": "SharePoint", - "TypeTitleSkyDrive": "OneDrive", - "TypeTitleWebDav": "WebDAV", - "TypeTitleYandex": "Yandex.Disk" -} +{ + "AddAccount": "Ajouter un compte", + "ArchivingData": "Archivage des données", + "ConnectingAccount": "Connecter un compte", + "Copy": "Copier", + "CopyOperation": "copier", + "DeleteFromTrash": "Les éléments sélectionnés ont été supprimés avec succès de la corbeille", + "DeleteOperation": "Suppression", + "DeleteSelectedElem": "Les éléments sélectionnés ont été supprimés avec succès", + "DeleteThirdParty": "Supprimer un tiers", + "DownloadAs": "Télécharger comme", + "EncryptedFileSaving": "Enregistrement du fichier chiffré", + "Files": "Fichiers", + "Folders": "Dossiers", + "FolderTitleBoxNet": "Répertoire de Box", + "FolderTitleDocuSign": "Сompte DocuSign", + "FolderTitleDropBox": "Répertoire de Dropbox", + "FolderTitleGoogle": "Répertoire de Google", + "FolderTitlekDrive": "Répertoire kDrive", + "FolderTitleSharePoint": "Répertoire de SharePoint", + "FolderTitleSkyDrive": "Répertoire de OneDrive", + "FolderTitleWebDav": "Répertoire WebDAV", + "FolderTitleYandex": "WebDAV Yandex", + "LinkCopySuccess": "Le lien a été copié dans le Presse-papiers", + "Move": "Déplacer", + "MoveToOperation": "Déplacement", + "OwnerChange": "Changer le propriétaire", + "Presentations": "Présentations", + "Restore": "Restaurer", + "Spreadsheets": "Feuilles de calcul", + "ThirdPartyInfo": "Modifier les informations sur les tiers", + "TypeTitleBoxNet": "Box", + "TypeTitleDocuSign": "DocuSign", + "TypeTitleDropBox": "Dropbox", + "TypeTitleGoogle": "Google Drive", + "TypeTitlekDrive": "kDrive", + "TypeTitleSharePoint": "SharePoint", + "TypeTitleSkyDrive": "OneDrive", + "TypeTitleWebDav": "WebDAV", + "TypeTitleYandex": "Yandex.Disk" +} diff --git a/products/ASC.Files/Client/public/locales/fr/UploadPanel.json b/products/ASC.Files/Client/public/locales/fr/UploadPanel.json index 9e26dfeeb6..6d7220f1a7 100644 --- a/products/ASC.Files/Client/public/locales/fr/UploadPanel.json +++ b/products/ASC.Files/Client/public/locales/fr/UploadPanel.json @@ -1 +1,3 @@ -{} \ No newline at end of file +{ + "Uploads": "Téléchargements" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/fr/VersionHistory.json b/products/ASC.Files/Client/public/locales/fr/VersionHistory.json index 9e26dfeeb6..3fa2e65c86 100644 --- a/products/ASC.Files/Client/public/locales/fr/VersionHistory.json +++ b/products/ASC.Files/Client/public/locales/fr/VersionHistory.json @@ -1 +1,4 @@ -{} \ No newline at end of file +{ + "EditComment": "Modifier le commentaire", + "Version": "Version {{version}}" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/Article.json b/products/ASC.Files/Client/public/locales/it/Article.json index 83c66aca8e..4696deb6d4 100644 --- a/products/ASC.Files/Client/public/locales/it/Article.json +++ b/products/ASC.Files/Client/public/locales/it/Article.json @@ -1,8 +1,8 @@ -{ - "NewDocument": "Nuovo documento", - "NewFolder": "Nuova cartella", - "NewPresentation": "Nuova presentazione", - "NewSpreadsheet": "Nuovo foglio di calcolo elettronico", - "UploadFiles": "Caricamento file", - "UploadFolder": "Carica cartella" +{ + "NewDocument": "Nuovo documento", + "NewFolder": "Nuova cartella", + "NewPresentation": "Nuova presentazione", + "NewSpreadsheet": "Nuovo foglio di calcolo elettronico", + "UploadFiles": "Caricamento file", + "UploadFolder": "Carica cartella" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/ChangeOwnerPanel.json b/products/ASC.Files/Client/public/locales/it/ChangeOwnerPanel.json index 610d9af24b..fe948c2968 100644 --- a/products/ASC.Files/Client/public/locales/it/ChangeOwnerPanel.json +++ b/products/ASC.Files/Client/public/locales/it/ChangeOwnerPanel.json @@ -1,4 +1,4 @@ -{ - "ChangeOwner": "Cambia proprietario ({{fileName}})", - "ChangeOwnerDescription": "Dopo la modifica del proprietario, l'attuale proprietario ottiene lo stesso livello di accesso degli altri membri del proprio gruppo" +{ + "ChangeOwner": "Cambia proprietario ({{fileName}})", + "ChangeOwnerDescription": "Dopo la modifica del proprietario, l'attuale proprietario ottiene lo stesso livello di accesso degli altri membri del proprio gruppo" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/ConnectDialog.json b/products/ASC.Files/Client/public/locales/it/ConnectDialog.json index bd816e86b3..811890138c 100644 --- a/products/ASC.Files/Client/public/locales/it/ConnectDialog.json +++ b/products/ASC.Files/Client/public/locales/it/ConnectDialog.json @@ -1,8 +1,8 @@ -{ - "Account": "Account", - "ConnectFolderTitle": "Nome cartella", - "ConnectionUrl": "URL di connessione", - "ConnectMakeShared": "Condividi e metti nella cartella \"Comune\"", - "Login": "Accedi", - "Reconnect": "Riconnetti" +{ + "Account": "Account", + "ConnectFolderTitle": "Nome cartella", + "ConnectionUrl": "URL di connessione", + "ConnectMakeShared": "Condividi e metti nella cartella \"Comune\"", + "Login": "Accedi", + "Reconnect": "Riconnetti" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/ConvertDialog.json b/products/ASC.Files/Client/public/locales/it/ConvertDialog.json index 4e592eaa5d..12749c2d50 100644 --- a/products/ASC.Files/Client/public/locales/it/ConvertDialog.json +++ b/products/ASC.Files/Client/public/locales/it/ConvertDialog.json @@ -1,6 +1,6 @@ -{ - "ConversionMessage": "Tutti i documenti caricati verranno convertiti nel formato Office Open XML (docx, xlsx o pptx) per un editing più veloce.", - "ConversionTitle": "Caricamento documento in corso", - "HideMessage": "Non mostrare nuovamente questo messaggio", - "SaveOriginalFormatMessage": "Salva una copia del file in formato originale" -} +{ + "ConversionMessage": "Tutti i documenti caricati verranno convertiti nel formato Office Open XML (docx, xlsx o pptx) per un editing più veloce.", + "ConversionTitle": "Caricamento documento in corso", + "HideMessage": "Non mostrare nuovamente questo messaggio", + "SaveOriginalFormatMessage": "Salva una copia del file in formato originale" +} diff --git a/products/ASC.Files/Client/public/locales/it/DeleteThirdPartyDialog.json b/products/ASC.Files/Client/public/locales/it/DeleteThirdPartyDialog.json index 5dac6b809f..08da883f99 100644 --- a/products/ASC.Files/Client/public/locales/it/DeleteThirdPartyDialog.json +++ b/products/ASC.Files/Client/public/locales/it/DeleteThirdPartyDialog.json @@ -1,4 +1,4 @@ -{ - "DeleteThirdPartyAlert": "Desideri rimuovere {{service}} dal modulo \"Documenti\"? . Ciò non influirà in alcun modo sul tuo account: {{account}} .", - "SuccessDeleteThirdParty": "Il servizio di terze parti {{service}} è stato cancellato" +{ + "DeleteThirdPartyAlert": "Desideri rimuovere {{service}} dal modulo \"Documenti\"? . Ciò non influirà in alcun modo sul tuo account: {{account}} .", + "SuccessDeleteThirdParty": "Il servizio di terze parti {{service}} è stato cancellato" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/DownloadDialog.json b/products/ASC.Files/Client/public/locales/it/DownloadDialog.json index 1af2717b0c..f3b76bdd4f 100644 --- a/products/ASC.Files/Client/public/locales/it/DownloadDialog.json +++ b/products/ASC.Files/Client/public/locales/it/DownloadDialog.json @@ -1,9 +1,9 @@ -{ - "ChooseFormatText": "Scegli il formato per ogni file da scaricare", - "ConvertInto": "Converti in", - "ConvertMessage": "Se scegli di convertire il file in un formato diverso dall'originale, alcuni dati potrebbero andare persi.", - "ConvertToZip": "I file verranno compressi in un file .zip", - "CustomFormat": "Formato personalizzato", - "OriginalFormat": "Formato originale", - "Other": "Altro" +{ + "ChooseFormatText": "Scegli il formato per ogni file da scaricare", + "ConvertInto": "Converti in", + "ConvertMessage": "Se scegli di convertire il file in un formato diverso dall'originale, alcuni dati potrebbero andare persi.", + "ConvertToZip": "I file verranno compressi in un file .zip", + "CustomFormat": "Formato personalizzato", + "OriginalFormat": "Formato originale", + "Other": "Altro" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/EmbeddingPanel.json b/products/ASC.Files/Client/public/locales/it/EmbeddingPanel.json index faeeb85d0d..fd3a5deca7 100644 --- a/products/ASC.Files/Client/public/locales/it/EmbeddingPanel.json +++ b/products/ASC.Files/Client/public/locales/it/EmbeddingPanel.json @@ -1,8 +1,8 @@ -{ - "Auto": "Automatico", - "CodeCopySuccess": "Il codice è stato copiato negli appunti", - "EmbedCode": "Codice incorporato", - "EmbeddingDocument": "Incorpora documento", - "Height": "Altezza", - "Width": "Larghezza" +{ + "Auto": "Automatico", + "CodeCopySuccess": "Il codice è stato copiato negli appunti", + "EmbedCode": "Codice incorporato", + "EmbeddingDocument": "Incorpora documento", + "Height": "Altezza", + "Width": "Larghezza" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/EmptyTrashDialog.json b/products/ASC.Files/Client/public/locales/it/EmptyTrashDialog.json index f92937f606..f04c0d3099 100644 --- a/products/ASC.Files/Client/public/locales/it/EmptyTrashDialog.json +++ b/products/ASC.Files/Client/public/locales/it/EmptyTrashDialog.json @@ -1,3 +1,3 @@ -{ - "SuccessEmptyTrash": "Cestino svuotato" +{ + "SuccessEmptyTrash": "Cestino svuotato" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/Home.json b/products/ASC.Files/Client/public/locales/it/Home.json index 6c26c7e094..742d871ae7 100644 --- a/products/ASC.Files/Client/public/locales/it/Home.json +++ b/products/ASC.Files/Client/public/locales/it/Home.json @@ -1,80 +1,78 @@ -{ - "All": "Tutti", - "AllFiles": "Tutti i file", - "Archives": "Archivi", - "BackToParentFolderButton": "Vai alla cartella superiore", - "ByAuthor": "Autore", - "ByCreationDate": "Creato", - "ByLastModifiedDate": "Modificato", - "ByTitle": "Titolo", - "CommonEmptyContainerDescription": "La sezione \"Comune\" contiene i file condivisi con tutti gli utenti di tipo amministratore del portale. Solo gli amministratori del portale possono creare file nel posto \"Comune\". Agli utenti può essere concesso l'accesso completo a una determinata cartella all'interno della sezione. In questo modo potranno creare / caricare file in questa stessa cartella.", - "ContainsSpecCharacter": "Il titolo non può contenere nessuno dei seguenti caratteri: *+:\"<>?|/", - "Convert": "Converti", - "CopyItem": "{{title}} copiato", - "CopyItems": "{{qty}} elementi copiati", - "CreateWithEmptyTitle": "Non è possibile creare una cartella o un file con un titolo vuoto", - "Document": "Documento", - "Duplicate": "Crea una copia", - "EmptyFile": "File vuoto", - "EmptyFilterDescriptionText": "Nessun file o cartella corrisponde a questo filtro. Provane uno diverso o cancella il filtro per visualizzare tutti i file.", - "EmptyFilterSubheadingText": "Nessun file da visualizzare per con l'uso di filtro qui", - "EmptyFolderHeader": "Non ci sono file in questa cartella", - "EmptyRecycleBin": "Svuota cestino", - "FavoritesEmptyContainerDescription": "Non hai ancora preferiti. Per contrassegnare i file come preferiti o rimuoverli da questo elenco, utilizzare il menù contestuale.", - "FileCreated": "Nuovo file {{itemTitle}}.{{exst}} è stato creato", - "FileRemoved": "File spostato nel Cestino", - "Filter": "Filtro", - "FinalizeVersion": "Finalizza versione", - "Folder": "Cartella", - "FolderCreated": "Nuova cartella {{itemTitle}} è stata creata", - "FolderRemoved": "Cartella spostata nel cestino", - "GoToMyButton": "Vai ai Miei Documenti", - "Images": "Immagini", - "LinkForPortalUsers": "Collegamento per il portale degli utenti", - "MarkAsFavorite": "Segna come preferito", - "MarkedAsFavorite": "Aggiungi hai favoriti", - "Media": "Multimedia", - "MoveItem": "{{title}} spostato", - "MoveItems": "I seguenti elementi sono stati spostati: {{qty}}", - "MoveTo": "Sposta in", - "MyEmptyContainerDescription": "I documenti che crei o carichi vengono conservati nella sezione \"Miei Documenti\". Puoi modificarli, condividerli e collaborare con il tuo team.", - "NewDocument": "Nuovo documento", - "NewFolder": "Nuova cartella", - "NewPresentation": "Nuova presentazione", - "NewSpreadsheet": "Nuovo foglio di calcolo elettronico", - "NoSubfolders": "Non ci sono sottocartelle", - "Open": "Apri", - "OpenLocation": "Apri posizione", - "Presentation": "Presentazione", - "Preview": "Anteprima", - "PrivateRoomDescriptionEncrypted": "Modifica collaborativa in tempo reale con crittografia.", - "PrivateRoomDescriptionSafest": "L'archiviazione più sicura per docx, xlsx e pptx.", - "PrivateRoomDescriptionSecure": "Condivisione sicura con gli utenti del gruppo fidato.", - "PrivateRoomDescriptionUnbreakable": "L'algoritmo AES-256 attualmente è infrangibile.", - "PrivateRoomHeader": "Benvenuto nella stanza privata di ONLYOFFICE dove ogni simbolo digitato è crittografato", - "PrivateRoomSupport": "Il lavoro nella stanza privata è disponibile via {{organizationName}} tramite l'applicazione desktop. <3>Istruzioni", - "RecentEmptyContainerDescription": "La sezione \"Recenti\" mostra gli ultimi file visualizzati o modificati.", - "RemovedFromFavorites": "Rimosso dai favoriti", - "RemoveFromFavorites": "Rimuovi dai preferiti", - "Rename": "Rinomina", - "SendByEmail": "Invia per email", - "Share": "Condividi", - "SharedEmptyContainerDescription": "La sezione \"Condivisi con me\" mostra i file condivisi dai tuoi colleghi del gruppo. Se non hai visto le ultime modifiche, vengono contrassegnate come nuove. È possibile rimuovere i file dall'elenco utilizzando il menù contestuale.", - "SharingSettings": "Impostazioni di condivisione", - "ShowVersionHistory": "Visualizza lo storico delle versioni", - "Spreadsheet": "Foglio elettronico di calcolo", - "SubheadingEmptyText": "Nessun file da visualizzare in questa sezione", - "TitleCreated": "Creato", - "TitleDocuments": "Dcs", - "TitleModified": "Aggiornato", - "TitleSubfolders": "Trova dati", - "TitleUploaded": "Caricato", - "TooltipElementCopyMessage": "Copia {{element}}", - "TooltipElementsCopyMessage": "Copia {{element}} elementi", - "TooltipElementsMoveMessage": "Sposta {{element}} elementi", - "TrashEmptyContainerDescription": "Il cestino è dove vengono spostati tutti i file per poi procedere alla rimozione. Puoi ripristinarli o eliminarli definitivamente svuotando il cestino.", - "UnblockVersion": "Sblocca/Controlla", - "UploadToFolder": "Carica nella cartella", - "ViewList": "Lista", - "ViewTiles": "Selezioni" -} +{ + "All": "Tutti", + "AllFiles": "Tutti i file", + "Archives": "Archivi", + "BackToParentFolderButton": "Vai alla cartella superiore", + "ByAuthor": "Autore", + "ByCreationDate": "Creato", + "ByLastModifiedDate": "Modificato", + "ByTitle": "Titolo", + "CommonEmptyContainerDescription": "La sezione \"Comune\" contiene i file condivisi con tutti gli utenti di tipo amministratore del portale. Solo gli amministratori del portale possono creare file nel posto \"Comune\". Agli utenti può essere concesso l'accesso completo a una determinata cartella all'interno della sezione. In questo modo potranno creare / caricare file in questa stessa cartella.", + "ContainsSpecCharacter": "Il titolo non può contenere nessuno dei seguenti caratteri: *+:\"<>?|/", + "Convert": "Converti", + "CopyItem": "{{title}} copiato", + "CopyItems": "{{qty}} elementi copiati", + "CreateWithEmptyTitle": "Non è possibile creare una cartella o un file con un titolo vuoto", + "Document": "Documento", + "Duplicate": "Crea una copia", + "EmptyFile": "File vuoto", + "EmptyFilterDescriptionText": "Nessun file o cartella corrisponde a questo filtro. Provane uno diverso o cancella il filtro per visualizzare tutti i file.", + "EmptyFilterSubheadingText": "Nessun file da visualizzare per con l'uso di filtro qui", + "EmptyFolderHeader": "Non ci sono file in questa cartella", + "EmptyRecycleBin": "Svuota cestino", + "FavoritesEmptyContainerDescription": "Non hai ancora preferiti. Per contrassegnare i file come preferiti o rimuoverli da questo elenco, utilizzare il menù contestuale.", + "FileRemoved": "File spostato nel Cestino", + "Filter": "Filtro", + "FinalizeVersion": "Finalizza versione", + "Folder": "Cartella", + "FolderRemoved": "Cartella spostata nel cestino", + "GoToMyButton": "Vai ai Miei Documenti", + "Images": "Immagini", + "LinkForPortalUsers": "Collegamento per il portale degli utenti", + "MarkAsFavorite": "Segna come preferito", + "MarkedAsFavorite": "Aggiungi hai favoriti", + "Media": "Multimedia", + "MoveItem": "{{title}} spostato", + "MoveItems": "I seguenti elementi sono stati spostati: {{qty}}", + "MoveTo": "Sposta in", + "MyEmptyContainerDescription": "I documenti che crei o carichi vengono conservati nella sezione \"Miei Documenti\". Puoi modificarli, condividerli e collaborare con il tuo team.", + "NewDocument": "Nuovo documento", + "NewFolder": "Nuova cartella", + "NewPresentation": "Nuova presentazione", + "NewSpreadsheet": "Nuovo foglio di calcolo elettronico", + "NoSubfolders": "Non ci sono sottocartelle", + "Open": "Apri", + "OpenLocation": "Apri posizione", + "Presentation": "Presentazione", + "Preview": "Anteprima", + "PrivateRoomDescriptionEncrypted": "Modifica collaborativa in tempo reale con crittografia.", + "PrivateRoomDescriptionSafest": "L'archiviazione più sicura per docx, xlsx e pptx.", + "PrivateRoomDescriptionSecure": "Condivisione sicura con gli utenti del gruppo fidato.", + "PrivateRoomDescriptionUnbreakable": "L'algoritmo AES-256 attualmente è infrangibile.", + "PrivateRoomHeader": "Benvenuto nella stanza privata di ONLYOFFICE dove ogni simbolo digitato è crittografato", + "PrivateRoomSupport": "Il lavoro nella stanza privata è disponibile via {{organizationName}} tramite l'applicazione desktop. <3>Istruzioni", + "RecentEmptyContainerDescription": "La sezione \"Recenti\" mostra gli ultimi file visualizzati o modificati.", + "RemovedFromFavorites": "Rimosso dai favoriti", + "RemoveFromFavorites": "Rimuovi dai preferiti", + "Rename": "Rinomina", + "SendByEmail": "Invia per email", + "Share": "Condividi", + "SharedEmptyContainerDescription": "La sezione \"Condivisi con me\" mostra i file condivisi dai tuoi colleghi del gruppo. Se non hai visto le ultime modifiche, vengono contrassegnate come nuove. È possibile rimuovere i file dall'elenco utilizzando il menù contestuale.", + "SharingSettings": "Impostazioni di condivisione", + "ShowVersionHistory": "Visualizza lo storico delle versioni", + "Spreadsheet": "Foglio elettronico di calcolo", + "SubheadingEmptyText": "Nessun file da visualizzare in questa sezione", + "TitleCreated": "Creato", + "TitleDocuments": "Dcs", + "TitleModified": "Aggiornato", + "TitleSubfolders": "Trova dati", + "TitleUploaded": "Caricato", + "TooltipElementCopyMessage": "Copia {{element}}", + "TooltipElementsCopyMessage": "Copia {{element}} elementi", + "TooltipElementsMoveMessage": "Sposta {{element}} elementi", + "TrashEmptyContainerDescription": "Il cestino è dove vengono spostati tutti i file per poi procedere alla rimozione. Puoi ripristinarli o eliminarli definitivamente svuotando il cestino.", + "UnblockVersion": "Sblocca/Controlla", + "UploadToFolder": "Carica nella cartella", + "ViewList": "Lista", + "ViewTiles": "Selezioni" +} diff --git a/products/ASC.Files/Client/public/locales/it/NewFilesPanel.json b/products/ASC.Files/Client/public/locales/it/NewFilesPanel.json index dc1fc24eb2..a559188c8b 100644 --- a/products/ASC.Files/Client/public/locales/it/NewFilesPanel.json +++ b/products/ASC.Files/Client/public/locales/it/NewFilesPanel.json @@ -1,4 +1,4 @@ -{ - "MarkAsRead": "Segna tutto come letto", - "NewFiles": "Nuovi file" +{ + "MarkAsRead": "Segna tutto come letto", + "NewFiles": "Nuovi file" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/OperationsPanel.json b/products/ASC.Files/Client/public/locales/it/OperationsPanel.json index 241d21cf21..3306936553 100644 --- a/products/ASC.Files/Client/public/locales/it/OperationsPanel.json +++ b/products/ASC.Files/Client/public/locales/it/OperationsPanel.json @@ -1,3 +1,3 @@ -{ - "MoveToFolderMessage": "Non puoi spostare la cartella nella sua sottocartella" +{ + "MoveToFolderMessage": "Non puoi spostare la cartella nella sua sottocartella" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/Settings.json b/products/ASC.Files/Client/public/locales/it/Settings.json index 884efbbf0c..e3909b7f94 100644 --- a/products/ASC.Files/Client/public/locales/it/Settings.json +++ b/products/ASC.Files/Client/public/locales/it/Settings.json @@ -1,21 +1,21 @@ -{ - "CommonSettings": "Impostazioni generali", - "ConnectAccounts": "Connetti Account", - "ConnectAccountsSubTitle": "Non ci sono account collegati", - "ConnectAdminDescription": "Per una connessione con successo, inserisci i dati necessari in <1>questa pagina.", - "ConnectDescription": "Puoi collegare i seguenti account ai documenti di ONLYOFFICE. I documenti di questi account saranno disponibili per la modifica nella sezione \"Miei Documenti\".", - "ConnectedCloud": "Connesso al cloud", - "ConnectMakeShared": "Condiviso e inserito nella cartella \"Comune\"", - "ConnextOtherAccount": "Altro account", - "DisplayFavorites": "Visualizza i preferiti", - "DisplayNotification": "Visualizza la notifica quando sposti gli elementi nel Cestino", - "DisplayRecent": "Visualizza i documenti recenti", - "DisplayTemplates": "Visualizza modelli documento", - "IntermediateVersion": "Mantieni tutte le versioni intermedie salvate", - "KeepIntermediateVersion": "Mantieni le versioni intermedie durante la modifica", - "OriginalCopy": "Salva anche la copia del file in formato originale", - "StoringFileVersion": "Memorizzazione delle versioni dei file", - "ThirdPartyBtn": "Consenti agli utenti di connettere archivi di terze parti", - "ThirdPartySettings": "Connesso hai vari servizi cloud", - "UpdateOrCreate": "Aggiorna la versione del file per il file esistente con lo stesso nome. In caso contrario, verrà creata una copia del file." +{ + "CommonSettings": "Impostazioni generali", + "ConnectAccounts": "Connetti Account", + "ConnectAccountsSubTitle": "Non ci sono account collegati", + "ConnectAdminDescription": "Per una connessione con successo, inserisci i dati necessari in <1>questa pagina.", + "ConnectDescription": "Puoi collegare i seguenti account ai documenti di ONLYOFFICE. I documenti di questi account saranno disponibili per la modifica nella sezione \"Miei Documenti\".", + "ConnectedCloud": "Connesso al cloud", + "ConnectMakeShared": "Condiviso e inserito nella cartella \"Comune\"", + "ConnextOtherAccount": "Altro account", + "DisplayFavorites": "Visualizza i preferiti", + "DisplayNotification": "Visualizza la notifica quando sposti gli elementi nel Cestino", + "DisplayRecent": "Visualizza i documenti recenti", + "DisplayTemplates": "Visualizza modelli documento", + "IntermediateVersion": "Mantieni tutte le versioni intermedie salvate", + "KeepIntermediateVersion": "Mantieni le versioni intermedie durante la modifica", + "OriginalCopy": "Salva anche la copia del file in formato originale", + "StoringFileVersion": "Memorizzazione delle versioni dei file", + "ThirdPartyBtn": "Consenti agli utenti di connettere archivi di terze parti", + "ThirdPartySettings": "Connesso hai vari servizi cloud", + "UpdateOrCreate": "Aggiorna la versione del file per il file esistente con lo stesso nome. In caso contrario, verrà creata una copia del file." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/SharingPanel.json b/products/ASC.Files/Client/public/locales/it/SharingPanel.json index f3d868986d..f1f1d83f60 100644 --- a/products/ASC.Files/Client/public/locales/it/SharingPanel.json +++ b/products/ASC.Files/Client/public/locales/it/SharingPanel.json @@ -1,23 +1,22 @@ -{ - "AddGroupsForSharingButton": "Aggiungi gruppi", - "AddShareMessage": "Aggiungi messaggio", - "Comment": "Commento", - "CopyExternalLink": "Copia collegamento esterno", - "CopyInternalLink": "Copia link interno", - "CustomFilter": "Filtro personalizzato", - "DenyAccess": "Accesso negato", - "Embedding": "Incorporamento", - "EncryptedFileSharing": "Il file {{title}} è stato condiviso con successo", - "ExternalLink": "Collegamento esterno", - "FormFilling": "Compilare il modulo", - "InternalLink": "Collegamento interno", - "LinkText": "Aggiungi utenti", - "Notify users": "Notifica utenti", - "Owner": "Proprietario", - "ReadOnly": "In sola lettura", - "ShareEmailBody": "Ti è stato concesso l'accesso al documento {{itemName}}. Fare clic sul collegamento sottostante per aprire subito il documento: {{shareLink}}", - "ShareEmailSubject": "Ti è stato concesso l'accesso al documento: {{itemName}}", - "ShareEveryone": "Tutti", - "ShareVia": "Condividi via", - "SharingSettingsTitle": "Impostazioni di condivisione" -} \ No newline at end of file +{ + "AddGroupsForSharingButton": "Aggiungi gruppi", + "AddShareMessage": "Aggiungi messaggio", + "Comment": "Commento", + "CopyExternalLink": "Copia collegamento esterno", + "CopyInternalLink": "Copia link interno", + "CustomFilter": "Filtro personalizzato", + "DenyAccess": "Accesso negato", + "Embedding": "Incorporamento", + "EncryptedFileSharing": "Il file {{title}} è stato condiviso con successo", + "ExternalLink": "Collegamento esterno", + "FormFilling": "Compilare il modulo", + "InternalLink": "Collegamento interno", + "LinkText": "Aggiungi utenti", + "Notify users": "Notifica utenti", + "ReadOnly": "In sola lettura", + "ShareEmailBody": "Ti è stato concesso l'accesso al documento {{itemName}}. Fare clic sul collegamento sottostante per aprire subito il documento: {{shareLink}}", + "ShareEmailSubject": "Ti è stato concesso l'accesso al documento: {{itemName}}", + "ShareEveryone": "Tutti", + "ShareVia": "Condividi via", + "SharingSettingsTitle": "Impostazioni di condivisione" +} diff --git a/products/ASC.Files/Client/public/locales/it/ThirdPartyMoveDialog.json b/products/ASC.Files/Client/public/locales/it/ThirdPartyMoveDialog.json index 936d17a444..5eddf89dbb 100644 --- a/products/ASC.Files/Client/public/locales/it/ThirdPartyMoveDialog.json +++ b/products/ASC.Files/Client/public/locales/it/ThirdPartyMoveDialog.json @@ -1,5 +1,5 @@ -{ - "MoveConfirmation": "Conferma di spostamento", - "MoveConfirmationAlert": "Sei sicuro/a di voler spostare gli elementi?", - "MoveConfirmationMessage": "Stai per spostare elementi dalla directory {{provider}}. Verranno eliminati dal tuo account {{provider}} e non saranno più accessibili ad altri utenti." +{ + "MoveConfirmation": "Conferma di spostamento", + "MoveConfirmationAlert": "Sei sicuro/a di voler spostare gli elementi?", + "MoveConfirmationMessage": "Stai per spostare elementi dalla directory {{provider}}. Verranno eliminati dal tuo account {{provider}} e non saranno più accessibili ad altri utenti." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/UploadPanel.json b/products/ASC.Files/Client/public/locales/it/UploadPanel.json index 59fdc57f3e..d435a15b11 100644 --- a/products/ASC.Files/Client/public/locales/it/UploadPanel.json +++ b/products/ASC.Files/Client/public/locales/it/UploadPanel.json @@ -1,3 +1,3 @@ -{ - "Uploads": "Caricati" +{ + "Uploads": "Caricati" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/it/VersionHistory.json b/products/ASC.Files/Client/public/locales/it/VersionHistory.json index 26247a2bcf..337b0060d5 100644 --- a/products/ASC.Files/Client/public/locales/it/VersionHistory.json +++ b/products/ASC.Files/Client/public/locales/it/VersionHistory.json @@ -1,4 +1,4 @@ -{ - "EditComment": "Modifica commento", - "Version": "Versione.{{version}}" +{ + "EditComment": "Modifica commento", + "Version": "Versione.{{version}}" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/Article.json b/products/ASC.Files/Client/public/locales/lo/Article.json index 6979ec0f71..dfc50351cb 100644 --- a/products/ASC.Files/Client/public/locales/lo/Article.json +++ b/products/ASC.Files/Client/public/locales/lo/Article.json @@ -1,8 +1,8 @@ -{ - "NewDocument": "ເອກະສານໃໝ່", - "NewFolder": "ແຟ້ມໃໝ່", - "NewPresentation": "ບົດນຳສະເໜີໃໝ່", - "NewSpreadsheet": "ຕາຕະລາງໃໝ່", - "UploadFiles": "ອັບໂຫລດຟາຍ", - "UploadFolder": "ອັບໂຫລດ ໂຟຣເດີ" +{ + "NewDocument": "ເອກະສານໃໝ່", + "NewFolder": "ແຟ້ມໃໝ່", + "NewPresentation": "ບົດນຳສະເໜີໃໝ່", + "NewSpreadsheet": "ຕາຕະລາງໃໝ່", + "UploadFiles": "ອັບໂຫລດຟາຍ", + "UploadFolder": "ອັບໂຫລດ ໂຟຣເດີ" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/ChangeOwnerPanel.json b/products/ASC.Files/Client/public/locales/lo/ChangeOwnerPanel.json index d7e748ed89..52e653382a 100644 --- a/products/ASC.Files/Client/public/locales/lo/ChangeOwnerPanel.json +++ b/products/ASC.Files/Client/public/locales/lo/ChangeOwnerPanel.json @@ -1,4 +1,4 @@ -{ - "ChangeOwner": "ປ່ຽນເຈົ້າຂອງ ({{ຊື່ເອກະສານ}})", - "ChangeOwnerDescription": "ຫລັງຈາກເຈົ້າຂອງປ່ຽນແລ້ວ, ເຈົ້າຂອງປະຈຸບັນໄດ້ຮັບສິດລະດັບດຽວກັນກັບສະມາຊິກຄົນອື່ນໆໃນກຸ່ມຂອງພວກເຂົາ" -} \ No newline at end of file +{ + "ChangeOwner": "ປ່ຽນເຈົ້າຂອງ ({{fileName}})", + "ChangeOwnerDescription": "ຫລັງຈາກເຈົ້າຂອງປ່ຽນແລ້ວ, ເຈົ້າຂອງປະຈຸບັນໄດ້ຮັບສິດລະດັບດຽວກັນກັບສະມາຊິກຄົນອື່ນໆໃນກຸ່ມຂອງພວກເຂົາ" +} diff --git a/products/ASC.Files/Client/public/locales/lo/ConnectDialog.json b/products/ASC.Files/Client/public/locales/lo/ConnectDialog.json index 1228194002..149fa50c45 100644 --- a/products/ASC.Files/Client/public/locales/lo/ConnectDialog.json +++ b/products/ASC.Files/Client/public/locales/lo/ConnectDialog.json @@ -1,8 +1,8 @@ -{ - "Account": "ບັນຊີ", - "ConnectFolderTitle": "ຊື່ແຟ້ມ", - "ConnectionUrl": "ເຊື່ອມຕໍ່ URL", - "ConnectMakeShared": "ແບ່ງປັນ ແລະ ໃສ່ລົງໃນແຟ້ມ 'ທົ່ວໄປ'", - "Login": "ເຂົ້າ​ສູ່​ລະ​ບົບ", - "Reconnect": "ເຊື່ອມຕໍ່ໃໝ່" +{ + "Account": "ບັນຊີ", + "ConnectFolderTitle": "ຊື່ແຟ້ມ", + "ConnectionUrl": "ເຊື່ອມຕໍ່ URL", + "ConnectMakeShared": "ແບ່ງປັນ ແລະ ໃສ່ລົງໃນແຟ້ມ 'ທົ່ວໄປ'", + "Login": "ເຂົ້າ​ສູ່​ລະ​ບົບ", + "Reconnect": "ເຊື່ອມຕໍ່ໃໝ່" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/ConvertDialog.json b/products/ASC.Files/Client/public/locales/lo/ConvertDialog.json index d94709b844..706f611c4a 100644 --- a/products/ASC.Files/Client/public/locales/lo/ConvertDialog.json +++ b/products/ASC.Files/Client/public/locales/lo/ConvertDialog.json @@ -1,6 +1,6 @@ -{ - "ConversionMessage": "ເອກະສານທັງໝົດທີ່ທ່ານອັບໂຫລດຈະຖືກປ່ຽນເປັນຮູບແບບ Office Open XML (docx, xlsx ຫຼື pptx) ເພື່ອໃຫ້ແກ້ໄຂໄວຂື້ນ.", - "ConversionTitle": "ການອັບໂຫລດເອກະສານ", - "HideMessage": "ບໍ່ສະແດງຂໍ້ຄວາມນີ້ອີກຄັ້ງ", - "SaveOriginalFormatMessage": "ບັນທຶກໄຟລ໌ສຳເນົາໃນຮູບແບບຕົ້ນສະບັບ" -} +{ + "ConversionMessage": "ເອກະສານທັງໝົດທີ່ທ່ານອັບໂຫລດຈະຖືກປ່ຽນເປັນຮູບແບບ Office Open XML (docx, xlsx ຫຼື pptx) ເພື່ອໃຫ້ແກ້ໄຂໄວຂື້ນ.", + "ConversionTitle": "ການອັບໂຫລດເອກະສານ", + "HideMessage": "ບໍ່ສະແດງຂໍ້ຄວາມນີ້ອີກຄັ້ງ", + "SaveOriginalFormatMessage": "ບັນທຶກໄຟລ໌ສຳເນົາໃນຮູບແບບຕົ້ນສະບັບ" +} diff --git a/products/ASC.Files/Client/public/locales/lo/DeleteThirdPartyDialog.json b/products/ASC.Files/Client/public/locales/lo/DeleteThirdPartyDialog.json index b92e376942..8ce87b2978 100644 --- a/products/ASC.Files/Client/public/locales/lo/DeleteThirdPartyDialog.json +++ b/products/ASC.Files/Client/public/locales/lo/DeleteThirdPartyDialog.json @@ -1,4 +1,4 @@ -{ - "DeleteThirdPartyAlert": "ລົບ {{service}} ອອກຈາກໂມດູນ 'ເອກະສານ'? ນີ້ຈະບໍ່ມີຜົນກະທົບຕໍ່ບັນຊີ {{account}} ຂອງທ່ານແຕ່ຢ່າງໃດ", - "SuccessDeleteThirdParty": "ລົບ {{service}} ຂອງບຸກຄົນທີສາມແລ້ວ" +{ + "DeleteThirdPartyAlert": "ລົບ {{service}} ອອກຈາກໂມດູນ 'ເອກະສານ'? ນີ້ຈະບໍ່ມີຜົນກະທົບຕໍ່ບັນຊີ {{account}} ຂອງທ່ານແຕ່ຢ່າງໃດ", + "SuccessDeleteThirdParty": "ລົບ {{service}} ຂອງບຸກຄົນທີສາມແລ້ວ" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/DownloadDialog.json b/products/ASC.Files/Client/public/locales/lo/DownloadDialog.json index 89e5d3cd2c..93ea355ba7 100644 --- a/products/ASC.Files/Client/public/locales/lo/DownloadDialog.json +++ b/products/ASC.Files/Client/public/locales/lo/DownloadDialog.json @@ -1,9 +1,9 @@ -{ - "ChooseFormatText": "ເລືອກຮູບແບບສຳລັບແຕ່ລະເອກະສານທີ່ຈະດາວໂຫລດ", - "ConvertInto": "ປ່ຽນເປັນ", - "ConvertMessage": "ຖ້າທ່ານເລືອກທີ່ຈະປ່ຽນໄຟລ໌ເປັນຮູບແບບທີ່ແຕກຕ່າງຈາກຕົ້ນສະບັບ, ຂໍ້ມູນບາງຢ່າງອາດຈະສູນເສຍໄປ.", - "ConvertToZip": "ໄຟລ໌ຕ່າງໆຈະຖືກບີບອັດເຂົ້າໃນແຟ້ມ.zip", - "CustomFormat": "ຮູບແບບທີ່ກຳນົດເອງ", - "OriginalFormat": "ຮູບແບບຕົ້ນສະບັບ", - "Other": "ອື່ນໆ" +{ + "ChooseFormatText": "ເລືອກຮູບແບບສຳລັບແຕ່ລະເອກະສານທີ່ຈະດາວໂຫລດ", + "ConvertInto": "ປ່ຽນເປັນ", + "ConvertMessage": "ຖ້າທ່ານເລືອກທີ່ຈະປ່ຽນໄຟລ໌ເປັນຮູບແບບທີ່ແຕກຕ່າງຈາກຕົ້ນສະບັບ, ຂໍ້ມູນບາງຢ່າງອາດຈະສູນເສຍໄປ.", + "ConvertToZip": "ໄຟລ໌ຕ່າງໆຈະຖືກບີບອັດເຂົ້າໃນແຟ້ມ.zip", + "CustomFormat": "ຮູບແບບທີ່ກຳນົດເອງ", + "OriginalFormat": "ຮູບແບບຕົ້ນສະບັບ", + "Other": "ອື່ນໆ" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/EmbeddingPanel.json b/products/ASC.Files/Client/public/locales/lo/EmbeddingPanel.json index 35e7694296..1e6a065686 100644 --- a/products/ASC.Files/Client/public/locales/lo/EmbeddingPanel.json +++ b/products/ASC.Files/Client/public/locales/lo/EmbeddingPanel.json @@ -1,8 +1,8 @@ -{ - "Auto": "ອັດຕະໂນມັດ", - "CodeCopySuccess": "ຄັດລອກໂຄ້ດໄປທີ່ກະດານຂ່າວແລ້ວ", - "EmbedCode": "ລະຫັດຝັງ", - "EmbeddingDocument": "ການຝັງເອກະສານ", - "Height": "ລວງສູງ,ຄວາມສູງ", - "Width": "ລວງກວ້າງ ,ຄວາມກ້ວາງ" +{ + "Auto": "ອັດຕະໂນມັດ", + "CodeCopySuccess": "ຄັດລອກໂຄ້ດໄປທີ່ກະດານຂ່າວແລ້ວ", + "EmbedCode": "ລະຫັດຝັງ", + "EmbeddingDocument": "ການຝັງເອກະສານ", + "Height": "ລວງສູງ,ຄວາມສູງ", + "Width": "ລວງກວ້າງ ,ຄວາມກ້ວາງ" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/EmptyTrashDialog.json b/products/ASC.Files/Client/public/locales/lo/EmptyTrashDialog.json deleted file mode 100644 index f5cb09c072..0000000000 --- a/products/ASC.Files/Client/public/locales/lo/EmptyTrashDialog.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "SuccessEmptyTrash": "ລ້າງຖັງຂີ້ເຫຍື້ອແລ້ວ" -} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/Home.json b/products/ASC.Files/Client/public/locales/lo/Home.json index 25062c3160..161f6f069f 100644 --- a/products/ASC.Files/Client/public/locales/lo/Home.json +++ b/products/ASC.Files/Client/public/locales/lo/Home.json @@ -1,80 +1,78 @@ -{ - "All": "ທັງໝົດ", - "AllFiles": "ເອກະສານທັງໝົດ", - "Archives": "ຮວບຮວມ", - "BackToParentFolderButton": "ກັບໄປທີ່ແຟ້ມຫຼັກ", - "ByAuthor": "ຜູ້ຂຽນ", - "ByCreationDate": "ສ້າງ", - "ByLastModifiedDate": "ແກ້ໄຂ", - "ByTitle": "ຫົວຂໍ້", - "CommonEmptyContainerDescription": "ສ່ວນ common 'ມີເອກະສານທີ່ແບ່ງປັນໃຫ້ຜູ້ຊົມໃຊ້ທັງໝົດ ໂດຍ Portal admin. ມີພຽງແຕ່ Portal ເປັນຜູ້ຮັບຮອງເທົ່ານັ້ນທີ່ສາມາດສ້າງເອກະສານຢູ່ບ່ອນນັ້ນ. ຜູ້ໃຊ້ສາມາດໄດ້ຮັບການອະນຸຍາດເຂົ້າເຖິງໂຟນເດີທີ່ແນ່ນອນພາຍໃນພາກສ່ວນໃດໜື່ງ. ວິທີນີ້ພວກເຂົາຈະສາມາດສ້າງ / ອັບໂຫລດເອກະສານໃນໂຟນເດີນັ້ນໄດ້.", - "ContainsSpecCharacter": "ຫົວຂໍ້ບໍ່ສາມາດມີຕົວອັກສອນຕໍ່ໄປນີ້: * +: \"<>? | /", - "Convert": "ປ່ຽນ", - "CopyItem": "{{title}} ຄັດລອກ", - "CopyItems": "{{qty}} ອົງປະກອບທີ່ຖືກຄັດລອກ", - "CreateWithEmptyTitle": "ບໍ່ສາມາດສ້າງແຟ້ມ ຫຼື ເອກະສານທີ່ມີຊື່ຫົວຂໍ້ວ່າງເປົ່າ", - "Document": "ເອກະສານ", - "Duplicate": "ສ້າງສຳເນົາ", - "EmptyFile": "ເອກະສານຫວ່າງເປົ່າ", - "EmptyFilterDescriptionText": "ບໍ່ມີໄຟລ໌ ຫລື ແຟ້ມໃດທີ່ກົງກັບຕົວກອງນີ້. ລອງໃຊ້ຕົວກັ່ນຕອງອື່ນ ຫຼື ລຶບລ້າງຂໍ້ມູນເພື່ອເບິ່ງເອກະສານທັງໝົດ.", - "EmptyFilterSubheadingText": "ບໍ່ມີເອກະສານທີ່ສະແດງສຳລັບຕົວກອງຢູ່ທີ່ນີ້", - "EmptyFolderHeader": "ບໍ່ມີເອກະສານຢູ່ໃນແຟ້ມນີ້", - "EmptyRecycleBin": "ຖັງຂີ້ເຫຍື້ອຫວ່າງເປົ່າ", - "FavoritesEmptyContainerDescription": "ຖ້າຕ້ອງການເຮັດເຄື່ອງໝາຍໄຟລ໌ເປັນລາຍການໂປດ ຫຼື ລົບອອກຈາກລາຍການນີ້ໃຫ້ໃຊ້ເມນູ context ", - "FileCreated": "ເອກະສານໃໝ່ {{itemTitle}}.{{exst}} ຖືກສ້າງຂື້ນ", - "FileRemoved": "ຍ້າຍແຟ້ມໄປທີ່ຖັງຂີ້ເຫຍື້ອ", - "Filter": "ຄັດກອງ", - "FinalizeVersion": "ສະບັບສຸດທ້າຍ", - "Folder": "ແຟ້ມ", - "FolderCreated": "ແຟ້ມໃໝ່ {{itemTitle}} ຖືກສ້າງຂຶ້ນ", - "FolderRemoved": "ຍ້າຍແຟ້ມໄປທີ່ຖັງຂີ້ເຫຍື້ອ", - "GoToMyButton": "ໄປທີ່ເອກະສານຂອງຂ້ອຍ", - "Images": "ຮູບພາບ", - "LinkForPortalUsers": "ການເຊື່ອມຕໍ່ສຳລັບຜູ້ໃຊ້ປະຕູ", - "MarkAsFavorite": "ຫມາຍດາວເອກະສານ", - "MarkedAsFavorite": "ເພີ່ມໃນລາຍການໂປດ", - "Media": "ຊື່ມວນຊົນ", - "MoveItem": "{{title}} ຍ້າຍ", - "MoveItems": "{{qty}} ອົງປະກອບຕ່າງໆໄດ້ຖືກຍ້າຍໄປແລ້ວ", - "MoveTo": "ຍ້າຍ​ໄປ", - "MyEmptyContainerDescription": "ເອກະສານທີ່ທ່ານສ້າງ ຫລື ອັບໂຫລດແມ່ນຖືກເກັບຢູ່ໃນສ່ວນ 'ເອກະສານຂອງຂ້ອຍ'. ທ່ານສາມາດແກ້ໄຂ, ແບ່ງປັນ ແລະ ເຮັດວຽກຮ່ວມກັບທີມງານຂອງທ່ານໄດ້.", - "NewDocument": "ເອກະສານໃໝ່", - "NewFolder": "ແຟ້ມໃໝ່", - "NewPresentation": "ບົດນຳສະເໜີໃໝ່", - "NewSpreadsheet": "ຕາຕະລາງໃໝ່", - "NoSubfolders": "ບໍ່ມີແຟ້ມຍ່ອຍ", - "Open": "ເປີດ", - "OpenLocation": "ເປີດສະຖານທີ່", - "Presentation": "ການນຳສະເໜີ", - "Preview": "ເບິ່ງຕົວຢ່າງ", - "PrivateRoomDescriptionEncrypted": "ການແກ້ໄຂເຂົ້າລະຫັດ ແລະ ການຮ່ວມມືໃນເວລາຈິງ.", - "PrivateRoomDescriptionSafest": "ບ່ອນເກັບຮັກສາທີ່ປອດໄພທີ່ສຸດສຳລັບ docx, xlsx ແລະ pptx.", - "PrivateRoomDescriptionSecure": "ແບ່ງປັນຢ່າງປອດໄພກັບເພື່ອນຮ່ວມທີມທີ່ໄວ້ໃຈໄດ້.", - "PrivateRoomDescriptionUnbreakable": "ສູດການຄິດໄລ່ AES-256 ບໍ່ສາມາດ ທຳລາຍໄດ້.", - "PrivateRoomHeader": "ຍິນດີຕ້ອນຮັບເຂົ້າສູ່ ONLYOFFICE ສ່ວນຕົວ ທີ່ທຸກໆສັນຍາລັກທີ່ທ່ານພິມຖືກເຂົ້າລະຫັດ", - "PrivateRoomSupport": "ເຮັດວຽກຢູ່ໃນຫ້ອງສ່ວນຕົວໄດ້ທາງ {{ຊື່ອົງກອນ}} desktop app. <3> ຄຳແນະນຳ ", - "RecentEmptyContainerDescription": "ສ່ວນ 'ລ້າສຸດ' ຈະສະແດງໃຫ້ທ່ານເຫັນໄຟລ໌ທີ່ຖືກເບິ່ງ ແລະ ແກ້ໄຂຄັ້ງສຸດທ້າຍ.", - "RemovedFromFavorites": "ລຶບອອກຈາກລາຍການທີ່ມັກແລ້ວ", - "RemoveFromFavorites": "ລຶບອອກຈາກລາຍການທີ່ມັກ", - "Rename": "ປ່ຽນຊື່", - "SendByEmail": "ສົ່ງຜ່ານອີເມວ", - "Share": "ແບ່ງປັນ", - "SharedEmptyContainerDescription": "ສ່ວນ 'ແບ່ງປັນກັບຂ້ອຍ' ສະແດງໄຟລ໌ທີ່ແບ່ງປັນໃຫ້ທ່ານໂດຍເພື່ອນຮ່ວມທີມ. ຖ້າທ່ານບໍ່ໄດ້ເຫັນການປ່ຽນແປງໃໝ່ຫຼ້າສຸດ, ມັນຈະຖືກໝາຍເປັນໃໝ່. ທ່ານສາມາດເອົາໄຟລ໌ອອກຈາກບັນຊີໂດຍໃຊ້ເມນູ", - "SharingSettings": "ຕັ້ງຄ່າການແບ່ງປັນ", - "ShowVersionHistory": "ສະແດງປະຫວັດສະບັບ", - "Spreadsheet": "Spreadsheet", - "SubheadingEmptyText": "ບໍ່ມີເອກະສານທີ່ຈະສະແດງໃນສ່ວນນີ້", - "TitleCreated": "ສ້າງ", - "TitleDocuments": "Dcs", - "TitleModified": "ອັບເດດແລ້ວ", - "TitleSubfolders": "Flds", - "TitleUploaded": "ອັບໂຫລດ", - "TooltipElementCopyMessage": "ຄັດລອກ {{ອົງປະກອບ}}", - "TooltipElementsCopyMessage": "ຄັດລອກ {{ອົງປະກອບ}} ອົງປະກອບ", - "TooltipElementsMoveMessage": "ຍ້າຍ {{ອົງປະກອບ}} ອົງປະກອບ", - "TrashEmptyContainerDescription": "ຖັງຂີ້ເຫຍື້ອແມ່ນບ່ອນທີ່ຍ້າຍໄຟລ໌ທີ່ຖືກລົບທັງໝົດທ່ານສາມາດກູ້ຄືນ ຫຼື ລົບອອກຢ່າງຖາວອນໂດຍການລ້າງຖັງຂີ້ເຫຍື້ອ", - "UnblockVersion": "ເລິກການບ໋ອກ/ເຊັກອິນ", - "UploadToFolder": "ອັບໂຫລດໄປຍັງໂຟຣເດີ", - "ViewList": "ລາຍການ", - "ViewTiles": "ຫົວຂໍ້" -} +{ + "All": "ທັງໝົດ", + "AllFiles": "ເອກະສານທັງໝົດ", + "Archives": "ຮວບຮວມ", + "BackToParentFolderButton": "ກັບໄປທີ່ແຟ້ມຫຼັກ", + "ByAuthor": "ຜູ້ຂຽນ", + "ByCreationDate": "ສ້າງ", + "ByLastModifiedDate": "ແກ້ໄຂ", + "ByTitle": "ຫົວຂໍ້", + "CommonEmptyContainerDescription": "ສ່ວນ common 'ມີເອກະສານທີ່ແບ່ງປັນໃຫ້ຜູ້ຊົມໃຊ້ທັງໝົດ ໂດຍ Portal admin. ມີພຽງແຕ່ Portal ເປັນຜູ້ຮັບຮອງເທົ່ານັ້ນທີ່ສາມາດສ້າງເອກະສານຢູ່ບ່ອນນັ້ນ. ຜູ້ໃຊ້ສາມາດໄດ້ຮັບການອະນຸຍາດເຂົ້າເຖິງໂຟນເດີທີ່ແນ່ນອນພາຍໃນພາກສ່ວນໃດໜື່ງ. ວິທີນີ້ພວກເຂົາຈະສາມາດສ້າງ / ອັບໂຫລດເອກະສານໃນໂຟນເດີນັ້ນໄດ້.", + "ContainsSpecCharacter": "ຫົວຂໍ້ບໍ່ສາມາດມີຕົວອັກສອນຕໍ່ໄປນີ້: * +: \"<>? | /", + "Convert": "ປ່ຽນ", + "CopyItem": "{{title}} ຄັດລອກ", + "CopyItems": "{{qty}} ອົງປະກອບທີ່ຖືກຄັດລອກ", + "CreateWithEmptyTitle": "ບໍ່ສາມາດສ້າງແຟ້ມ ຫຼື ເອກະສານທີ່ມີຊື່ຫົວຂໍ້ວ່າງເປົ່າ", + "Document": "ເອກະສານ", + "Duplicate": "ສ້າງສຳເນົາ", + "EmptyFile": "ເອກະສານຫວ່າງເປົ່າ", + "EmptyFilterDescriptionText": "ບໍ່ມີໄຟລ໌ ຫລື ແຟ້ມໃດທີ່ກົງກັບຕົວກອງນີ້. ລອງໃຊ້ຕົວກັ່ນຕອງອື່ນ ຫຼື ລຶບລ້າງຂໍ້ມູນເພື່ອເບິ່ງເອກະສານທັງໝົດ.", + "EmptyFilterSubheadingText": "ບໍ່ມີເອກະສານທີ່ສະແດງສຳລັບຕົວກອງຢູ່ທີ່ນີ້", + "EmptyFolderHeader": "ບໍ່ມີເອກະສານຢູ່ໃນແຟ້ມນີ້", + "EmptyRecycleBin": "ຖັງຂີ້ເຫຍື້ອຫວ່າງເປົ່າ", + "FavoritesEmptyContainerDescription": "ຖ້າຕ້ອງການເຮັດເຄື່ອງໝາຍໄຟລ໌ເປັນລາຍການໂປດ ຫຼື ລົບອອກຈາກລາຍການນີ້ໃຫ້ໃຊ້ເມນູ context ", + "FileRemoved": "ຍ້າຍແຟ້ມໄປທີ່ຖັງຂີ້ເຫຍື້ອ", + "Filter": "ຄັດກອງ", + "FinalizeVersion": "ສະບັບສຸດທ້າຍ", + "Folder": "ແຟ້ມ", + "FolderRemoved": "ຍ້າຍແຟ້ມໄປທີ່ຖັງຂີ້ເຫຍື້ອ", + "GoToMyButton": "ໄປທີ່ເອກະສານຂອງຂ້ອຍ", + "Images": "ຮູບພາບ", + "LinkForPortalUsers": "ການເຊື່ອມຕໍ່ສຳລັບຜູ້ໃຊ້ປະຕູ", + "MarkAsFavorite": "ຫມາຍດາວເອກະສານ", + "MarkedAsFavorite": "ເພີ່ມໃນລາຍການໂປດ", + "Media": "ຊື່ມວນຊົນ", + "MoveItem": "{{title}} ຍ້າຍ", + "MoveItems": "{{qty}} ອົງປະກອບຕ່າງໆໄດ້ຖືກຍ້າຍໄປແລ້ວ", + "MoveTo": "ຍ້າຍ​ໄປ", + "MyEmptyContainerDescription": "ເອກະສານທີ່ທ່ານສ້າງ ຫລື ອັບໂຫລດແມ່ນຖືກເກັບຢູ່ໃນສ່ວນ 'ເອກະສານຂອງຂ້ອຍ'. ທ່ານສາມາດແກ້ໄຂ, ແບ່ງປັນ ແລະ ເຮັດວຽກຮ່ວມກັບທີມງານຂອງທ່ານໄດ້.", + "NewDocument": "ເອກະສານໃໝ່", + "NewFolder": "ແຟ້ມໃໝ່", + "NewPresentation": "ບົດນຳສະເໜີໃໝ່", + "NewSpreadsheet": "ຕາຕະລາງໃໝ່", + "NoSubfolders": "ບໍ່ມີແຟ້ມຍ່ອຍ", + "Open": "ເປີດ", + "OpenLocation": "ເປີດສະຖານທີ່", + "Presentation": "ການນຳສະເໜີ", + "Preview": "ເບິ່ງຕົວຢ່າງ", + "PrivateRoomDescriptionEncrypted": "ການແກ້ໄຂເຂົ້າລະຫັດ ແລະ ການຮ່ວມມືໃນເວລາຈິງ.", + "PrivateRoomDescriptionSafest": "ບ່ອນເກັບຮັກສາທີ່ປອດໄພທີ່ສຸດສຳລັບ docx, xlsx ແລະ pptx.", + "PrivateRoomDescriptionSecure": "ແບ່ງປັນຢ່າງປອດໄພກັບເພື່ອນຮ່ວມທີມທີ່ໄວ້ໃຈໄດ້.", + "PrivateRoomDescriptionUnbreakable": "ສູດການຄິດໄລ່ AES-256 ບໍ່ສາມາດ ທຳລາຍໄດ້.", + "PrivateRoomHeader": "ຍິນດີຕ້ອນຮັບເຂົ້າສູ່ ONLYOFFICE ສ່ວນຕົວ ທີ່ທຸກໆສັນຍາລັກທີ່ທ່ານພິມຖືກເຂົ້າລະຫັດ", + "PrivateRoomSupport": "ເຮັດວຽກຢູ່ໃນຫ້ອງສ່ວນຕົວໄດ້ທາງ {{organizationName}} desktop app. <3> ຄຳແນະນຳ ", + "RecentEmptyContainerDescription": "ສ່ວນ 'ລ້າສຸດ' ຈະສະແດງໃຫ້ທ່ານເຫັນໄຟລ໌ທີ່ຖືກເບິ່ງ ແລະ ແກ້ໄຂຄັ້ງສຸດທ້າຍ.", + "RemovedFromFavorites": "ລຶບອອກຈາກລາຍການທີ່ມັກແລ້ວ", + "RemoveFromFavorites": "ລຶບອອກຈາກລາຍການທີ່ມັກ", + "Rename": "ປ່ຽນຊື່", + "SendByEmail": "ສົ່ງຜ່ານອີເມວ", + "Share": "ແບ່ງປັນ", + "SharedEmptyContainerDescription": "ສ່ວນ 'ແບ່ງປັນກັບຂ້ອຍ' ສະແດງໄຟລ໌ທີ່ແບ່ງປັນໃຫ້ທ່ານໂດຍເພື່ອນຮ່ວມທີມ. ຖ້າທ່ານບໍ່ໄດ້ເຫັນການປ່ຽນແປງໃໝ່ຫຼ້າສຸດ, ມັນຈະຖືກໝາຍເປັນໃໝ່. ທ່ານສາມາດເອົາໄຟລ໌ອອກຈາກບັນຊີໂດຍໃຊ້ເມນູ", + "SharingSettings": "ຕັ້ງຄ່າການແບ່ງປັນ", + "ShowVersionHistory": "ສະແດງປະຫວັດສະບັບ", + "Spreadsheet": "Spreadsheet", + "SubheadingEmptyText": "ບໍ່ມີເອກະສານທີ່ຈະສະແດງໃນສ່ວນນີ້", + "TitleCreated": "ສ້າງ", + "TitleDocuments": "Dcs", + "TitleModified": "ອັບເດດແລ້ວ", + "TitleSubfolders": "Flds", + "TitleUploaded": "ອັບໂຫລດ", + "TooltipElementCopyMessage": "ຄັດລອກ {{element}}", + "TooltipElementsCopyMessage": "ຄັດລອກ {{element}} ອົງປະກອບ", + "TooltipElementsMoveMessage": "ຍ້າຍ {{element}} ອົງປະກອບ", + "TrashEmptyContainerDescription": "ຖັງຂີ້ເຫຍື້ອແມ່ນບ່ອນທີ່ຍ້າຍໄຟລ໌ທີ່ຖືກລົບທັງໝົດທ່ານສາມາດກູ້ຄືນ ຫຼື ລົບອອກຢ່າງຖາວອນໂດຍການລ້າງຖັງຂີ້ເຫຍື້ອ", + "UnblockVersion": "ເລິກການບ໋ອກ/ເຊັກອິນ", + "UploadToFolder": "ອັບໂຫລດໄປຍັງໂຟຣເດີ", + "ViewList": "ລາຍການ", + "ViewTiles": "ຫົວຂໍ້" +} diff --git a/products/ASC.Files/Client/public/locales/lo/NewFilesPanel.json b/products/ASC.Files/Client/public/locales/lo/NewFilesPanel.json index d370b10a9e..faf6c14fef 100644 --- a/products/ASC.Files/Client/public/locales/lo/NewFilesPanel.json +++ b/products/ASC.Files/Client/public/locales/lo/NewFilesPanel.json @@ -1,4 +1,4 @@ -{ - "MarkAsRead": "ໝາຍທຸກຢ່າງທີ່ອ່ານແລ້ວ", - "NewFiles": "ເອກະສານໄໝ່" +{ + "MarkAsRead": "ໝາຍທຸກຢ່າງທີ່ອ່ານແລ້ວ", + "NewFiles": "ເອກະສານໄໝ່" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/OperationsPanel.json b/products/ASC.Files/Client/public/locales/lo/OperationsPanel.json index cbd5945669..8729c1961a 100644 --- a/products/ASC.Files/Client/public/locales/lo/OperationsPanel.json +++ b/products/ASC.Files/Client/public/locales/lo/OperationsPanel.json @@ -1,3 +1,3 @@ -{ - "MoveToFolderMessage": "ທ່ານບໍ່ສາມາດຍ້າຍໂຟຣເດີໄປທີ່ໂຟຣເດີຍ່ອຍຂອງມັນ" +{ + "MoveToFolderMessage": "ທ່ານບໍ່ສາມາດຍ້າຍໂຟຣເດີໄປທີ່ໂຟຣເດີຍ່ອຍຂອງມັນ" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/Settings.json b/products/ASC.Files/Client/public/locales/lo/Settings.json index caee89be59..8273b704f9 100644 --- a/products/ASC.Files/Client/public/locales/lo/Settings.json +++ b/products/ASC.Files/Client/public/locales/lo/Settings.json @@ -1,21 +1,21 @@ -{ - "CommonSettings": "ການຕັ້ງຄ່າທົ່ວໄປ", - "ConnectAccounts": "ເຊື່ອມຕໍ່ບັນຊີ", - "ConnectAccountsSubTitle": "ບໍ່ມີບັນຊີທີ່ເຊື່ອມຕໍ່", - "ConnectAdminDescription": "ສຳລັບການເຊື່ອມຕໍ່ທີ່ສຳເລັດ,ໃສ່ຂໍ້ມູນທີ່ຈຳເປັນໃນ <1> ໜ້ານີ້ .", - "ConnectDescription": "ທ່ານສາມາດເຊື່ອມຕໍ່ບັນຊີຕໍ່ໄປນີ້ກັບເອກະສານ ONLYOFFICE. ເອກະສານຈາກບັນຊີເຫຼົ່ານີ້ຈະມີໃຫ້ທ່ານສາມາດແກ້ໄຂໄດ້ຢູ່ທີ່ 'ເອກະສານຂອງຂ້ອຍ'.", - "ConnectedCloud": "ເຊື່ອມຕໍ່ຄຣາວ", - "ConnectMakeShared": "ແບ່ງປັນ ແລະ ໃສ່ລົງໃນແຟ້ມ 'ທົ່ວໄປ'", - "ConnextOtherAccount": "ບັນຊີອື່ນໆ ", - "DisplayFavorites": "ສະແດງລາຍການທີ່ມັກ", - "DisplayNotification": "ສະແດງແຈ້ງເຕືອນເມື່ອຍ້າຍລາຍການໄປຖັງຂີ້ເຫຍື້ອ", - "DisplayRecent": "ສະແດງລ່າສຸດ", - "DisplayTemplates": "ສະແດງແມ່ແບບ", - "IntermediateVersion": "ເກັບລຸ້ນກາງທີ່ບັນທຶກໄວ້ທັງໝົດ", - "KeepIntermediateVersion": "ເກັບລຸ້ນກາງເມື່ອແກ້ໄຂ", - "OriginalCopy": "ບັນທຶກໄຟລ໌ສຳເນົາໄວ້ໃນຮູບແບບຕົ້ນສະບັບເຊັ່ນດຽວກັນ", - "StoringFileVersion": "ການເກັບຮັກສາສະບັບເອກະສານ", - "ThirdPartyBtn": "ອະນຸຍາດໃຫ້ຜູ້ໃຊ້ເຊື່ອມຕໍ່ການຈັດເກັບຂອງພາກສ່ວນທີສາມ", - "ThirdPartySettings": "ເຊື່ອມຕໍ່ຄຣາວ.", - "UpdateOrCreate": "ປັບປຸງຮູບແບບເອກະສານ ສຳລັບເອກະສານທີ່ມີຢູ່ແລ້ວດ້ວຍຊື່ດຽວກັນ.ຖ້າບໍ່ດັ່ງນັ້ນ, ໄຟລຈະຖຶກສຳເນົາຂື້ນໃຫມ່ ." +{ + "CommonSettings": "ການຕັ້ງຄ່າທົ່ວໄປ", + "ConnectAccounts": "ເຊື່ອມຕໍ່ບັນຊີ", + "ConnectAccountsSubTitle": "ບໍ່ມີບັນຊີທີ່ເຊື່ອມຕໍ່", + "ConnectAdminDescription": "ສຳລັບການເຊື່ອມຕໍ່ທີ່ສຳເລັດ,ໃສ່ຂໍ້ມູນທີ່ຈຳເປັນໃນ <1> ໜ້ານີ້ .", + "ConnectDescription": "ທ່ານສາມາດເຊື່ອມຕໍ່ບັນຊີຕໍ່ໄປນີ້ກັບເອກະສານ ONLYOFFICE. ເອກະສານຈາກບັນຊີເຫຼົ່ານີ້ຈະມີໃຫ້ທ່ານສາມາດແກ້ໄຂໄດ້ຢູ່ທີ່ 'ເອກະສານຂອງຂ້ອຍ'.", + "ConnectedCloud": "ເຊື່ອມຕໍ່ຄຣາວ", + "ConnectMakeShared": "ແບ່ງປັນ ແລະ ໃສ່ລົງໃນແຟ້ມ 'ທົ່ວໄປ'", + "ConnextOtherAccount": "ບັນຊີອື່ນໆ ", + "DisplayFavorites": "ສະແດງລາຍການທີ່ມັກ", + "DisplayNotification": "ສະແດງແຈ້ງເຕືອນເມື່ອຍ້າຍລາຍການໄປຖັງຂີ້ເຫຍື້ອ", + "DisplayRecent": "ສະແດງລ່າສຸດ", + "DisplayTemplates": "ສະແດງແມ່ແບບ", + "IntermediateVersion": "ເກັບລຸ້ນກາງທີ່ບັນທຶກໄວ້ທັງໝົດ", + "KeepIntermediateVersion": "ເກັບລຸ້ນກາງເມື່ອແກ້ໄຂ", + "OriginalCopy": "ບັນທຶກໄຟລ໌ສຳເນົາໄວ້ໃນຮູບແບບຕົ້ນສະບັບເຊັ່ນດຽວກັນ", + "StoringFileVersion": "ການເກັບຮັກສາສະບັບເອກະສານ", + "ThirdPartyBtn": "ອະນຸຍາດໃຫ້ຜູ້ໃຊ້ເຊື່ອມຕໍ່ການຈັດເກັບຂອງພາກສ່ວນທີສາມ", + "ThirdPartySettings": "ເຊື່ອມຕໍ່ຄຣາວ.", + "UpdateOrCreate": "ປັບປຸງຮູບແບບເອກະສານ ສຳລັບເອກະສານທີ່ມີຢູ່ແລ້ວດ້ວຍຊື່ດຽວກັນ.ຖ້າບໍ່ດັ່ງນັ້ນ, ໄຟລຈະຖຶກສຳເນົາຂື້ນໃຫມ່ ." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/SharingPanel.json b/products/ASC.Files/Client/public/locales/lo/SharingPanel.json index 53c724af48..8cd4591084 100644 --- a/products/ASC.Files/Client/public/locales/lo/SharingPanel.json +++ b/products/ASC.Files/Client/public/locales/lo/SharingPanel.json @@ -1,23 +1,22 @@ -{ - "AddGroupsForSharingButton": "ເພີ່ມກຸ່ມ", - "AddShareMessage": "ເພີ່ມຂໍ້ຄວາມ", - "Comment": "ຄໍາເຫັນ", - "CopyExternalLink": "ຄັດລອກລິ້ງພາຍນອກ", - "CopyInternalLink": "ຄັດລອກລິ້ງພາຍໃນ", - "CustomFilter": "ຕົວກຣອງທີ່ກຳນົດເອງ", - "DenyAccess": "ປະຕິເສດການເຂົ້າເຖິງ", - "Embedding": "ການຝັງ", - "EncryptedFileSharing": "File {{title}} ແບ່ງປັນສໍາເລັດແລ້ວ", - "ExternalLink": "ລິງພາຍນອກ", - "FormFilling": "ການຕື່ມແບບຟອມ", - "InternalLink": "ລິ້ງພາຍໃນ", - "LinkText": "ເພີ່ມຜູ້ໃຊ້", - "Notify users": "ແຈ້ງເຕືອນຜູ້ໃຊ້", - "Owner": "ເຈົ້າຂອງ", - "ReadOnly": "ອ່ານຢ່າງດຽງວ", - "ShareEmailBody": "ທ່ານໄດ້ຮັບອະນຸຍາດເຂົ້າເຖິງເອກະສານ {{itemName}}. ກົດທີ່ລິ້ງດ້ານລຸ່ມເພື່ອເປີດເອກະສານດຽວນີ້: {{shareLink}}", - "ShareEmailSubject": "ທ່ານໄດ້ຮັບອະນຸຍາດເຂົ້າເຖິງເອກະສານ {{itemName}}", - "ShareEveryone": "ທຸກໆຄົນ", - "ShareVia": "ແບ່ງປັນຜ່ານ", - "SharingSettingsTitle": "ຕັ້ງຄ່າການແບ່ງປັນ" -} \ No newline at end of file +{ + "AddGroupsForSharingButton": "ເພີ່ມກຸ່ມ", + "AddShareMessage": "ເພີ່ມຂໍ້ຄວາມ", + "Comment": "ຄໍາເຫັນ", + "CopyExternalLink": "ຄັດລອກລິ້ງພາຍນອກ", + "CopyInternalLink": "ຄັດລອກລິ້ງພາຍໃນ", + "CustomFilter": "ຕົວກຣອງທີ່ກຳນົດເອງ", + "DenyAccess": "ປະຕິເສດການເຂົ້າເຖິງ", + "Embedding": "ການຝັງ", + "EncryptedFileSharing": "File {{title}} ແບ່ງປັນສໍາເລັດແລ້ວ", + "ExternalLink": "ລິງພາຍນອກ", + "FormFilling": "ການຕື່ມແບບຟອມ", + "InternalLink": "ລິ້ງພາຍໃນ", + "LinkText": "ເພີ່ມຜູ້ໃຊ້", + "Notify users": "ແຈ້ງເຕືອນຜູ້ໃຊ້", + "ReadOnly": "ອ່ານຢ່າງດຽງວ", + "ShareEmailBody": "ທ່ານໄດ້ຮັບອະນຸຍາດເຂົ້າເຖິງເອກະສານ {{itemName}}. ກົດທີ່ລິ້ງດ້ານລຸ່ມເພື່ອເປີດເອກະສານດຽວນີ້: {{shareLink}}", + "ShareEmailSubject": "ທ່ານໄດ້ຮັບອະນຸຍາດເຂົ້າເຖິງເອກະສານ {{itemName}}", + "ShareEveryone": "ທຸກໆຄົນ", + "ShareVia": "ແບ່ງປັນຜ່ານ", + "SharingSettingsTitle": "ຕັ້ງຄ່າການແບ່ງປັນ" +} diff --git a/products/ASC.Files/Client/public/locales/lo/ThirdPartyMoveDialog.json b/products/ASC.Files/Client/public/locales/lo/ThirdPartyMoveDialog.json index e800ee68c2..7119aaba74 100644 --- a/products/ASC.Files/Client/public/locales/lo/ThirdPartyMoveDialog.json +++ b/products/ASC.Files/Client/public/locales/lo/ThirdPartyMoveDialog.json @@ -1,5 +1,5 @@ -{ - "MoveConfirmation": "ຍ້າຍການຢືນຢັນ", - "MoveConfirmationAlert": "ທ່ານແນ່ໃຈບໍວ່າທ່ານຕ້ອງການຍ້າຍອົງປະກອບ?", - "MoveConfirmationMessage": "ທ່ານ ກຳລັງຈະຍ້າຍອົງປະກອບອອກຈາກໄດເລກະທໍລີ {{ຜູ້ໃຫ້ບໍລິການ}}. ພວກເຂົາຈະຖືກລຶບອອກຈາກບັນຊີ {{ຜູ້ໃຫ້ບໍລິການ}} ຂອງທ່ານແລະຈະບໍ່ສາມາດເຂົ້າເຖິງຜູ້ໃຊ້ອື່ນໄດ້ອີກຕໍ່ໄປ." -} \ No newline at end of file +{ + "MoveConfirmation": "ຍ້າຍການຢືນຢັນ", + "MoveConfirmationAlert": "ທ່ານແນ່ໃຈບໍວ່າທ່ານຕ້ອງການຍ້າຍອົງປະກອບ?", + "MoveConfirmationMessage": "ທ່ານ ກຳລັງຈະຍ້າຍອົງປະກອບອອກຈາກໄດເລກະທໍລີ {{provider}}. ພວກເຂົາຈະຖືກລຶບອອກຈາກບັນຊີ {{provider}} ຂອງທ່ານແລະຈະບໍ່ສາມາດເຂົ້າເຖິງຜູ້ໃຊ້ອື່ນໄດ້ອີກຕໍ່ໄປ." +} diff --git a/products/ASC.Files/Client/public/locales/lo/UploadPanel.json b/products/ASC.Files/Client/public/locales/lo/UploadPanel.json index f9ce3fd162..0cb2420dd0 100644 --- a/products/ASC.Files/Client/public/locales/lo/UploadPanel.json +++ b/products/ASC.Files/Client/public/locales/lo/UploadPanel.json @@ -1,3 +1,3 @@ -{ - "Uploads": "ອັບໂຫລດ" +{ + "Uploads": "ອັບໂຫລດ" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/lo/VersionHistory.json b/products/ASC.Files/Client/public/locales/lo/VersionHistory.json index 0b89fb0ac5..f8c2fb243f 100644 --- a/products/ASC.Files/Client/public/locales/lo/VersionHistory.json +++ b/products/ASC.Files/Client/public/locales/lo/VersionHistory.json @@ -1,4 +1,4 @@ -{ - "EditComment": "ແກ້ໄຂຄໍາເຫັນ", - "Version": "Ver.{{version}}" +{ + "EditComment": "ແກ້ໄຂຄໍາເຫັນ", + "Version": "Ver.{{version}}" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/Article.json b/products/ASC.Files/Client/public/locales/pt-BR/Article.json index 5d078c76b0..ba6c330c1b 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/Article.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/Article.json @@ -1,8 +1,8 @@ -{ - "NewDocument": "Novo Documento", - "NewFolder": "Nova pasta", - "NewPresentation": "Nova apresentação", - "NewSpreadsheet": "Nova planilha", - "UploadFiles": "Carregar arquivos", - "UploadFolder": "Carregar pasta" +{ + "NewDocument": "Novo Documento", + "NewFolder": "Nova pasta", + "NewPresentation": "Nova apresentação", + "NewSpreadsheet": "Nova planilha", + "UploadFiles": "Carregar arquivos", + "UploadFolder": "Carregar pasta" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/ChangeOwnerPanel.json b/products/ASC.Files/Client/public/locales/pt-BR/ChangeOwnerPanel.json index f04498bbd2..4315a90f0a 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/ChangeOwnerPanel.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/ChangeOwnerPanel.json @@ -1,4 +1,4 @@ -{ - "ChangeOwner": "Mudança de proprietário ({{fileName}})", - "ChangeOwnerDescription": "Após a mudança de proprietário, o proprietário atual obtém o mesmo nível de acesso que os outros membros de seu grupo" +{ + "ChangeOwner": "Mudança de proprietário ({{fileName}})", + "ChangeOwnerDescription": "Após a mudança de proprietário, o proprietário atual obtém o mesmo nível de acesso que os outros membros de seu grupo" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/ConflictResolveDialog.json b/products/ASC.Files/Client/public/locales/pt-BR/ConflictResolveDialog.json index 9e26dfeeb6..42f0aea311 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/ConflictResolveDialog.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/ConflictResolveDialog.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "ConflictResolveDescription": "O arquivo com o nome {{file}} já existe na pasta {{folder}}.", + "ConflictResolveDescriptionFiles": "{{filesCount}} Os documentos com o mesmo nome já existem na pasta '{{folder}}.", + "ConflictResolveSelectAction": "Selecione a ação:", + "ConflictResolveTitle": "Confirmação de substituição", + "CreateDescription": "Haverão dois arquivos diferentes na pasta.", + "CreateTitle": "Criar cópia do arquivo", + "OverwriteDescription": "O arquivo será adicionado ao arquivo com o mesmo nome como uma versão.", + "OverwriteTitle": "Substituir por versão atualizada", + "SkipDescription": "Nenhum arquivo será copiado. O arquivo original será mantido na pasta de destino.", + "SkipTitle": "Pular" +} diff --git a/products/ASC.Files/Client/public/locales/pt-BR/ConnectDialog.json b/products/ASC.Files/Client/public/locales/pt-BR/ConnectDialog.json index 648c3b09b5..68a865dfdb 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/ConnectDialog.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/ConnectDialog.json @@ -1,8 +1,8 @@ -{ - "Account": "Conta", - "ConnectFolderTitle": "Título da pasta", - "ConnectionUrl": "Url de conexão", - "ConnectMakeShared": "Compartilhar e colocar na pasta 'Comum'.", - "Login": "Login", - "Reconnect": "Reconectar" +{ + "Account": "Conta", + "ConnectFolderTitle": "Título da pasta", + "ConnectionUrl": "Url de conexão", + "ConnectMakeShared": "Compartilhar e colocar na pasta 'Comum'.", + "Login": "Login", + "Reconnect": "Reconectar" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/ConvertDialog.json b/products/ASC.Files/Client/public/locales/pt-BR/ConvertDialog.json index 90f5af1547..a8bbbd4317 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/ConvertDialog.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/ConvertDialog.json @@ -1,6 +1,8 @@ -{ - "ConversionMessage": "Todos os documentos que você carregar serão convertidos no formato Office Open XML (docx, xlsx ou pptx) para uma edição mais rápida.", - "ConversionTitle": "Carregando documento", - "HideMessage": "Não mostre esta mensagem novamente", - "SaveOriginalFormatMessage": "Salvar a cópia do arquivo no formato original" -} +{ + "ConversionFileMessage": "O arquivo será convertido em OOXML (docx, xlsx ou pptx) para visualização e edição mais rápidas.", + "ConversionMessage": "Todos os documentos que você carregar serão convertidos no formato Office Open XML (docx, xlsx ou pptx) para uma edição mais rápida.", + "ConversionTitle": "Carregando documento", + "ConvertAndOpenTitle": "Converter e abrir documento", + "HideMessage": "Não mostre esta mensagem novamente", + "SaveOriginalFormatMessage": "Salvar a cópia do arquivo no formato original" +} diff --git a/products/ASC.Files/Client/public/locales/pt-BR/DeleteDialog.json b/products/ASC.Files/Client/public/locales/pt-BR/DeleteDialog.json index 9e26dfeeb6..25334a58c0 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/DeleteDialog.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/DeleteDialog.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "MoveToTrashButton": "Mover para a lixeira", + "MoveToTrashItemsNote": "Se você excluir itens compartilhados, outros usuários não poderão acessá-los.", + "MoveToTrashItemsTitle": "Mover itens para o Lixo?", + "MoveToTrashOneFileNote": "Se você excluir um arquivo compartilhado, outros usuários não poderão acessá-lo.", + "MoveToTrashOneFileTitle": "Mover arquivo para o Lixo?", + "MoveToTrashOneFolderNote": "Se você excluir uma pasta compartilhada, outros usuários não poderão acessá-la.", + "MoveToTrashOneFolderTitle": "Mover pasta para o Lixo?", + "UnsubscribeButton": "Cancelar assinatura", + "UnsubscribeNote": "Você tem certeza de que deseja cancelar a inscrição dos itens selecionados da lista?", + "UnsubscribeTitle": "Cancelar a confirmação da inscrição" +} diff --git a/products/ASC.Files/Client/public/locales/pt-BR/DeleteThirdPartyDialog.json b/products/ASC.Files/Client/public/locales/pt-BR/DeleteThirdPartyDialog.json index 7acc2588ad..f6e13aac71 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/DeleteThirdPartyDialog.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/DeleteThirdPartyDialog.json @@ -1,4 +1,4 @@ -{ - "DeleteThirdPartyAlert": "Remover {{service}} do módulo 'Documentos'? Isto não afetará de forma alguma sua conta {{account}}.", - "SuccessDeleteThirdParty": "O {{serviço}} de terceiros é excluído" -} \ No newline at end of file +{ + "DeleteThirdPartyAlert": "Remover {{service}} do módulo 'Documentos'? Isto não afetará de forma alguma sua conta {{account}}.", + "SuccessDeleteThirdParty": "O {{service}} de terceiros é excluído" +} diff --git a/products/ASC.Files/Client/public/locales/pt-BR/DownloadDialog.json b/products/ASC.Files/Client/public/locales/pt-BR/DownloadDialog.json index d574d1df1d..a2c147a870 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/DownloadDialog.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/DownloadDialog.json @@ -1,9 +1,9 @@ -{ - "ChooseFormatText": "Escolha o formato para cada arquivo a ser baixado", - "ConvertInto": "Converter em", - "ConvertMessage": "Se você optar por converter o arquivo para um formato diferente do original, alguns dados poderão ser perdidos.", - "ConvertToZip": "Os arquivos serão compactados no arquivo .zip", - "CustomFormat": "Personalizar formato", - "OriginalFormat": "Formato Original", - "Other": "Outro" +{ + "ChooseFormatText": "Escolha o formato para cada arquivo a ser baixado", + "ConvertInto": "Converter em", + "ConvertMessage": "Se você optar por converter o arquivo para um formato diferente do original, alguns dados poderão ser perdidos.", + "ConvertToZip": "Os arquivos serão compactados no arquivo .zip", + "CustomFormat": "Personalizar formato", + "OriginalFormat": "Formato Original", + "Other": "Outro" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/EmbeddingPanel.json b/products/ASC.Files/Client/public/locales/pt-BR/EmbeddingPanel.json index 93248dcc47..af24a949c8 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/EmbeddingPanel.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/EmbeddingPanel.json @@ -1,8 +1,8 @@ -{ - "Auto": "Automático", - "CodeCopySuccess": "Código copiado para área de transferência", - "EmbedCode": "Código embutido", - "EmbeddingDocument": "Incorporando documento", - "Height": "Altura", - "Width": "Largura" +{ + "Auto": "Automático", + "CodeCopySuccess": "Código copiado para área de transferência", + "EmbedCode": "Código embutido", + "EmbeddingDocument": "Incorporando documento", + "Height": "Altura", + "Width": "Largura" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/EmptyTrashDialog.json b/products/ASC.Files/Client/public/locales/pt-BR/EmptyTrashDialog.json index 3c664f89c8..fc35fa6b40 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/EmptyTrashDialog.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/EmptyTrashDialog.json @@ -1,3 +1,6 @@ -{ - "SuccessEmptyTrash": "Lixo esvaziado" +{ + "DeleteForeverButton": "EXCLUIR definitivamente", + "DeleteForeverNote": "Todos os itens do Lixo serão apagados para sempre. Você não será capaz de restaurá-los.", + "DeleteForeverTitle": "Eliminar para sempre?", + "SuccessEmptyTrash": "Lixo esvaziado" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/Home.json b/products/ASC.Files/Client/public/locales/pt-BR/Home.json index 67afe115bc..f2311dd5d5 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/Home.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/Home.json @@ -1,80 +1,83 @@ -{ - "All": "Todos", - "AllFiles": "Todos os arquivos", - "Archives": "Arquivos", - "BackToParentFolderButton": "Voltar para pasta principal", - "ByAuthor": "Autor", - "ByCreationDate": "Criado", - "ByLastModifiedDate": "Modificado", - "ByTitle": "Titulo", - "CommonEmptyContainerDescription": "A seção 'Comum' contém arquivos compartilhados a todos os usuários pelo administrador do portal. Somente os administradores do portal podem criar arquivos lá. Os usuários podem ter acesso total a uma determinada pasta dentro da seção. Desta forma, eles poderão criar/enviar arquivos nesta mesma pasta.", - "ContainsSpecCharacter": "O título não pode conter nenhum dos seguintes caracteres: *+:\"<>?|/", - "Convert": "Converter", - "CopyItem": "{{title}} copiado", - "CopyItems": "{{qty}} elementos copiados", - "CreateWithEmptyTitle": "Não é possível criar uma pasta ou arquivo com um título vazio", - "Document": "Documento", - "Duplicate": "Criar uma cópia", - "EmptyFile": "Arquivo vazio", - "EmptyFilterDescriptionText": "Nenhum arquivo ou pasta corresponde a este filtro. Tente um filtro diferente ou transparente para visualizar todos os arquivos. ", - "EmptyFilterSubheadingText": "Não há arquivos a serem exibidos para este filtro aqui", - "EmptyFolderHeader": "Não há arquivos nesta pasta", - "EmptyRecycleBin": "Esvaziar lixeira", - "FavoritesEmptyContainerDescription": "Para marcar os arquivos como favoritos ou removê-los desta lista, use o menu de contexto.", - "FileCreated": "Novo arquivo {{itemTitle}}.{{exst}} é criado", - "FileRemoved": "Arquivo movido para a lixeira", - "Filter": "Filtro", - "FinalizeVersion": "Finalizar versão", - "Folder": "Pasta", - "FolderCreated": "Nova pasta {{itemTitle}} é criada", - "FolderRemoved": "Pasta movida para a lixeira", - "GoToMyButton": "Ir aos Meus Documentos", - "Images": "Imagens", - "LinkForPortalUsers": "Link para usuários do portal", - "MarkAsFavorite": "Marcar como favorito", - "MarkedAsFavorite": "Adicionado aos favoritos", - "Media": "Média", - "MoveItem": "{{title}} movido", - "MoveItems": "{{qty}} elementos foram movidos", - "MoveTo": "Mover para", - "MyEmptyContainerDescription": "Os documentos que você cria ou carrega são mantidos na seção 'Meus Documentos'. Você pode editar, compartilhar e colaborar neles com sua equipe.", - "NewDocument": "Novo Documento", - "NewFolder": "Nova pasta", - "NewPresentation": "Nova apresentação", - "NewSpreadsheet": "Nova planilha", - "NoSubfolders": "Nenhuma subpasta", - "Open": "Abrir", - "OpenLocation": "Abrir a localização", - "Presentation": "Apresentação", - "Preview": "Pré-visualizar", - "PrivateRoomDescriptionEncrypted": "Edição criptografada e colaboração em tempo real.", - "PrivateRoomDescriptionSafest": "O armazenamento mais seguro para docx, xlsx e pptx.", - "PrivateRoomDescriptionSecure": "Compartilhamento seguro com colegas de equipe de confiança.", - "PrivateRoomDescriptionUnbreakable": "Algoritmo inquebrável AES-256.", - "PrivateRoomHeader": "Bem-vindo à sala privada ONLYOFFICE onde cada símbolo que você digita é criptografado", - "PrivateRoomSupport": "O trabalho na Sala Privada está disponível através do aplicativo desktop {{{organizationName}}. <3>Instruções", - "RecentEmptyContainerDescription": "A seção 'Recente' mostra os arquivos visualizados ou editados pela última vez.", - "RemovedFromFavorites": "Removido dos favoritos", - "RemoveFromFavorites": "Remover dos Favoritos", - "Rename": "Renomear", - "SendByEmail": "Enviar por e-mail", - "Share": "Compartilhar", - "SharedEmptyContainerDescription": "A seção 'Compartilhado comigo' mostra arquivos compartilhados por colegas de equipe. Se você ainda não viu as últimas mudanças, elas são marcadas como novas. Você pode remover os arquivos da lista usando o menu de contexto. ", - "SharingSettings": "Configurações de compartilhamento", - "ShowVersionHistory": "Exibir histórico de versão", - "Spreadsheet": "Planilha", - "SubheadingEmptyText": "Não há arquivos a serem exibidos nesta seção", - "TitleCreated": "Criado", - "TitleDocuments": "Arquivos", - "TitleModified": "Atualizado", - "TitleSubfolders": "Pasta", - "TitleUploaded": "Carregado", - "TooltipElementCopyMessage": "Cópia {{element}}", - "TooltipElementsCopyMessage": "Cópia {{element}} elementos", - "TooltipElementsMoveMessage": "Mover {{element}} elementos", - "TrashEmptyContainerDescription": "Lixo é onde todos os arquivos excluídos são movidos. Você pode restaurá-los ou apagá-los permanentemente, esvaziando o Lixo. ", - "UnblockVersion": "Desbloqueio/Check-in", - "UploadToFolder": "Upload para pasta", - "ViewList": "Lista", - "ViewTiles": "Azulejos" -} +{ + "All": "Todos", + "AllFiles": "Todos os arquivos", + "Archives": "Arquivos", + "BackToParentFolderButton": "Voltar para pasta principal", + "ByAuthor": "Autor", + "ByCreationDate": "Criado", + "ByLastModifiedDate": "Modificado", + "ByTitle": "Titulo", + "CommonEmptyContainerDescription": "A seção 'Comum' contém arquivos compartilhados a todos os usuários pelo administrador do portal. Somente os administradores do portal podem criar arquivos lá. Os usuários podem ter acesso total a uma determinada pasta dentro da seção. Desta forma, eles poderão criar/enviar arquivos nesta mesma pasta.", + "ContainsSpecCharacter": "O título não pode conter nenhum dos seguintes caracteres: *+:\"<>?|/", + "Convert": "Converter", + "CopyItem": "{{title}} copiado", + "CopyItems": "{{qty}} elementos copiados", + "CreateWithEmptyTitle": "Não é possível criar uma pasta ou arquivo com um título vazio", + "Document": "Documento", + "Duplicate": "Criar uma cópia", + "EmptyFile": "Arquivo vazio", + "EmptyFilterDescriptionText": "Nenhum arquivo ou pasta corresponde a este filtro. Tente um filtro diferente ou transparente para visualizar todos os arquivos. ", + "EmptyFilterSubheadingText": "Não há arquivos a serem exibidos para este filtro aqui", + "EmptyFolderHeader": "Não há arquivos nesta pasta", + "EmptyRecycleBin": "Esvaziar lixeira", + "FavoritesEmptyContainerDescription": "Para marcar os arquivos como favoritos ou removê-los desta lista, use o menu de contexto.", + "FileRemoved": "Arquivo movido para a lixeira", + "FileRenamed": "O documento '{{oldTitle}}' é renomeado para '{{newTitle}}'.", + "Filter": "Filtro", + "FinalizeVersion": "Finalizar versão", + "Folder": "Pasta", + "FolderRemoved": "Pasta movida para a lixeira", + "FolderRenamed": "A pasta '{{folderTitle}}' é renomeada para '{{newFoldedTitle}}'.", + "GoToMyButton": "Ir aos Meus Documentos", + "Images": "Imagens", + "LinkForPortalUsers": "Link para usuários do portal", + "MarkAsFavorite": "Marcar como favorito", + "MarkedAsFavorite": "Adicionado aos favoritos", + "MarkRead": "Marcar como lido", + "Media": "Média", + "MoveItem": "{{title}} movido", + "MoveItems": "{{qty}} elementos foram movidos", + "MoveTo": "Mover para", + "MyEmptyContainerDescription": "Os documentos que você cria ou carrega são mantidos na seção 'Meus Documentos'. Você pode editar, compartilhar e colaborar neles com sua equipe.", + "New": "Novo", + "NewDocument": "Novo Documento", + "NewFolder": "Nova pasta", + "NewPresentation": "Nova apresentação", + "NewSpreadsheet": "Nova planilha", + "NoSubfolders": "Nenhuma subpasta", + "Open": "Abrir", + "OpenLocation": "Abrir a localização", + "Presentation": "Apresentação", + "Preview": "Pré-visualizar", + "PrivateRoomDescriptionEncrypted": "Edição criptografada e colaboração em tempo real.", + "PrivateRoomDescriptionSafest": "O armazenamento mais seguro para docx, xlsx e pptx.", + "PrivateRoomDescriptionSecure": "Compartilhamento seguro com colegas de equipe de confiança.", + "PrivateRoomDescriptionUnbreakable": "Algoritmo inquebrável AES-256.", + "PrivateRoomHeader": "Bem-vindo à sala privada ONLYOFFICE onde cada símbolo que você digita é criptografado", + "PrivateRoomSupport": "O trabalho na Sala Privada está disponível através do aplicativo desktop {{organizationName}}. <3>Instruções", + "RecentEmptyContainerDescription": "A seção 'Recente' mostra os arquivos visualizados ou editados pela última vez.", + "RemovedFromFavorites": "Removido dos favoritos", + "RemoveFromFavorites": "Remover dos Favoritos", + "RemoveFromList": "Remover da lista", + "Rename": "Renomear", + "SendByEmail": "Enviar por e-mail", + "Share": "Compartilhar", + "SharedEmptyContainerDescription": "A seção 'Compartilhado comigo' mostra arquivos compartilhados por colegas de equipe. Se você ainda não viu as últimas mudanças, elas são marcadas como novas. Você pode remover os arquivos da lista usando o menu de contexto. ", + "SharingSettings": "Configurações de compartilhamento", + "ShowVersionHistory": "Exibir histórico de versão", + "Spreadsheet": "Planilha", + "SubheadingEmptyText": "Não há arquivos a serem exibidos nesta seção", + "TitleCreated": "Criado", + "TitleDocuments": "Arquivos", + "TitleModified": "Atualizado", + "TitleSubfolders": "Pasta", + "TitleUploaded": "Carregado", + "TooltipElementCopyMessage": "Cópia {{element}}", + "TooltipElementsCopyMessage": "Cópia {{element}} elementos", + "TooltipElementsMoveMessage": "Mover {{element}} elementos", + "TrashEmptyContainerDescription": "Lixo é onde todos os arquivos excluídos são movidos. Você pode restaurá-los ou apagá-los permanentemente, esvaziando o Lixo. ", + "UnblockVersion": "Desbloqueio/Check-in", + "UploadToFolder": "Upload para pasta", + "ViewList": "Lista", + "ViewTiles": "Azulejos" +} diff --git a/products/ASC.Files/Client/public/locales/pt-BR/NewFilesPanel.json b/products/ASC.Files/Client/public/locales/pt-BR/NewFilesPanel.json index de2f27365c..4094481f7e 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/NewFilesPanel.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/NewFilesPanel.json @@ -1,4 +1,4 @@ -{ - "MarkAsRead": "Marcar tudo como lido", - "NewFiles": "Novos arquivos" +{ + "MarkAsRead": "Marcar tudo como lido", + "NewFiles": "Novos arquivos" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/OperationsPanel.json b/products/ASC.Files/Client/public/locales/pt-BR/OperationsPanel.json index 334d1a47c0..8712588ef6 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/OperationsPanel.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/OperationsPanel.json @@ -1,3 +1,3 @@ -{ - "MoveToFolderMessage": "Você não pode mover a pasta para sua subpasta" +{ + "MoveToFolderMessage": "Você não pode mover a pasta para sua subpasta" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/PrivacyPage.json b/products/ASC.Files/Client/public/locales/pt-BR/PrivacyPage.json new file mode 100644 index 0000000000..75acc4f982 --- /dev/null +++ b/products/ASC.Files/Client/public/locales/pt-BR/PrivacyPage.json @@ -0,0 +1,10 @@ +{ + "PrivacyButton": "Abra os editores de desktop do ONLYOFFICE", + "PrivacyClick": "Clique em Abrir <1> ONLYOFFICE Desktop na caixa de diálogo do navegador para trabalhar com os documentos criptografados", + "PrivacyDescriptionConnect": "Você pode abrir este arquivo a partir da interface de aplicativos de desktop, uma vez que sua nuvem está conectada", + "PrivacyDescriptionEditors": "Se você instalou o ONLYOFFICE Desktop Editors, mas não consegue abri-lo a partir desta página, seu navegador pode estar bloqueando-o", + "PrivacyDialog": "Se você não vir uma caixa de diálogo, clique no botão abaixo", + "PrivacyEditors": "Não tem editores de desktop ONLYOFFICE?", + "PrivacyHeader": "Este documento está criptografado", + "PrivacyInstall": "Instale agora" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/Settings.json b/products/ASC.Files/Client/public/locales/pt-BR/Settings.json index 5e009b57e8..e53eaf6b1c 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/Settings.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/Settings.json @@ -1,21 +1,21 @@ -{ - "CommonSettings": "Configurações comuns", - "ConnectAccounts": "Contas conectadas", - "ConnectAccountsSubTitle": "Sem contas conectadas", - "ConnectAdminDescription": "Para uma conexão bem sucedida, digite os dados necessários em <1> esta página.", - "ConnectDescription": "Você pode conectar as seguintes contas aos documentos do ONLYOFFICE. Os documentos dessas contas estarão disponíveis para edição na seção 'Meus Documentos'. ", - "ConnectedCloud": "Nuvem conectada", - "ConnectMakeShared": "Compartilhado e colocado em pasta 'Comum'.", - "ConnextOtherAccount": "Outra conta", - "DisplayFavorites": "Mostrar Favoritos", - "DisplayNotification": "Exibir notificação ao mover itens para a Lixeira", - "DisplayRecent": "Mostrar Recentes", - "DisplayTemplates": "Modelos de exibição", - "IntermediateVersion": "Manter todas as versões intermediárias salvas", - "KeepIntermediateVersion": "Manter versões intermediárias ao editar", - "OriginalCopy": "Salve a cópia do arquivo no formato original também", - "StoringFileVersion": "Armazenamento de versões de arquivo", - "ThirdPartyBtn": "Habilitar configurações de terceiros para usuários", - "ThirdPartySettings": "Nuvens conectadas", - "UpdateOrCreate": "Atualizar a versão de arquivo para o arquivo existente com o mesmo nome. Caso contrário, será criada uma cópia do arquivo." +{ + "CommonSettings": "Configurações comuns", + "ConnectAccounts": "Contas conectadas", + "ConnectAccountsSubTitle": "Sem contas conectadas", + "ConnectAdminDescription": "Para uma conexão bem sucedida, digite os dados necessários em <1> esta página.", + "ConnectDescription": "Você pode conectar as seguintes contas aos documentos do ONLYOFFICE. Os documentos dessas contas estarão disponíveis para edição na seção 'Meus Documentos'. ", + "ConnectedCloud": "Nuvem conectada", + "ConnectMakeShared": "Compartilhado e colocado em pasta 'Comum'.", + "ConnextOtherAccount": "Outra conta", + "DisplayFavorites": "Mostrar Favoritos", + "DisplayNotification": "Exibir notificação ao mover itens para a Lixeira", + "DisplayRecent": "Mostrar Recentes", + "DisplayTemplates": "Modelos de exibição", + "IntermediateVersion": "Manter todas as versões intermediárias salvas", + "KeepIntermediateVersion": "Manter versões intermediárias ao editar", + "OriginalCopy": "Salve a cópia do arquivo no formato original também", + "StoringFileVersion": "Armazenamento de versões de arquivo", + "ThirdPartyBtn": "Habilitar configurações de terceiros para usuários", + "ThirdPartySettings": "Nuvens conectadas", + "UpdateOrCreate": "Atualizar a versão de arquivo para o arquivo existente com o mesmo nome. Caso contrário, será criada uma cópia do arquivo." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/SharingPanel.json b/products/ASC.Files/Client/public/locales/pt-BR/SharingPanel.json index bf0c9459aa..9e39efeefe 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/SharingPanel.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/SharingPanel.json @@ -1,23 +1,22 @@ -{ - "AddGroupsForSharingButton": "Adicionar Grupos", - "AddShareMessage": "Adicionar mensagem", - "Comment": "Comentário", - "CopyExternalLink": "Copiar link externo", - "CopyInternalLink": "Copiar link interno", - "CustomFilter": "Filtro personalizado", - "DenyAccess": "Negar acesso", - "Embedding": "Embutir", - "EncryptedFileSharing": "Arquivo {{title}} compartilhado com sucesso", - "ExternalLink": "Link externo", - "FormFilling": "Preenchimento de formulário", - "InternalLink": "Link interno", - "LinkText": "Adicionar Usuários", - "Notify users": "Notificar os usuários", - "Owner": "Proprietário", - "ReadOnly": "Somente leitura", - "ShareEmailBody": "Foi-lhe concedido acesso ao documento {{itemNome}}. Clique no link abaixo para abrir o documento agora mesmo: {{{shareLink}}}", - "ShareEmailSubject": "Você obteve acesso ao documento {{itemNome}}.", - "ShareEveryone": "Todos", - "ShareVia": "Compartilhar via", - "SharingSettingsTitle": "Configurações de compartilhamento" -} \ No newline at end of file +{ + "AddGroupsForSharingButton": "Adicionar Grupos", + "AddShareMessage": "Adicionar mensagem", + "Comment": "Comentário", + "CopyExternalLink": "Copiar link externo", + "CopyInternalLink": "Copiar link interno", + "CustomFilter": "Filtro personalizado", + "DenyAccess": "Negar acesso", + "Embedding": "Embutir", + "EncryptedFileSharing": "Arquivo {{title}} compartilhado com sucesso", + "ExternalLink": "Link externo", + "FormFilling": "Preenchimento de formulário", + "InternalLink": "Link interno", + "LinkText": "Adicionar Usuários", + "Notify users": "Notificar os usuários", + "ReadOnly": "Somente leitura", + "ShareEmailBody": "Foi-lhe concedido acesso ao documento {{itemName}}. Clique no link abaixo para abrir o documento agora mesmo: {{shareLink}}", + "ShareEmailSubject": "Você obteve acesso ao documento {{itemName}}.", + "ShareEveryone": "Todos", + "ShareVia": "Compartilhar via", + "SharingSettingsTitle": "Configurações de compartilhamento" +} diff --git a/products/ASC.Files/Client/public/locales/pt-BR/ThirdPartyMoveDialog.json b/products/ASC.Files/Client/public/locales/pt-BR/ThirdPartyMoveDialog.json index 837c040003..06f07263d2 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/ThirdPartyMoveDialog.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/ThirdPartyMoveDialog.json @@ -1,5 +1,5 @@ -{ - "MoveConfirmation": "Mover confirmação", - "MoveConfirmationAlert": "Você tem certeza de que quer mover os elementos?", - "MoveConfirmationMessage": "Você está prestes a mover elementos do diretório {{{provider}}. Eles serão excluídos de sua conta {{{provider}} e não serão mais acessíveis a outros usuários." -} \ No newline at end of file +{ + "MoveConfirmation": "Mover confirmação", + "MoveConfirmationAlert": "Você tem certeza de que quer mover os elementos?", + "MoveConfirmationMessage": "Você está prestes a mover elementos do diretório {{provider}}. Eles serão excluídos de sua conta {{provider}} e não serão mais acessíveis a outros usuários." +} diff --git a/products/ASC.Files/Client/public/locales/pt-BR/Translations.json b/products/ASC.Files/Client/public/locales/pt-BR/Translations.json index 61905e9a5d..d5d80555eb 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/Translations.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/Translations.json @@ -1,20 +1,41 @@ -{ - "FolderTitleBoxNet": "Diretório da box", - "FolderTitleDocuSign": "Conta do DocuSign", - "FolderTitleDropBox": "Diretório da Dropbox", - "FolderTitleGoogle": "Diretório do Google", - "FolderTitlekDrive": "Diretório do kDrive", - "FolderTitleSharePoint": "Diretório do SharePoint", - "FolderTitleSkyDrive": "Diretório OneDrive", - "FolderTitleWebDav": "Diretório WebDAV", - "FolderTitleYandex": "Diretório Yandex", - "TypeTitleBoxNet": "Box", - "TypeTitleDocuSign": "DocuSign", - "TypeTitleDropBox": "Dropbox", - "TypeTitleGoogle": "Google Drive", - "TypeTitlekDrive": "kDrive", - "TypeTitleSharePoint": "SharePoint", - "TypeTitleSkyDrive": "OneDrive", - "TypeTitleWebDav": "WebDAV", - "TypeTitleYandex": "Yandex.Disk" -} +{ + "AddAccount": "Adicionar conta", + "ArchivingData": "Arquivando dados", + "ConnectingAccount": "Conectando conta", + "Copy": "Copiar", + "CopyOperation": "Copiando", + "DeleteFromTrash": "Os elementos selecionados foram excluídos com sucesso do Lixo", + "DeleteOperation": "Excluindo", + "DeleteSelectedElem": "Os elementos selecionados foram eliminados com sucesso", + "DeleteThirdParty": "Excluir terceiros", + "DownloadAs": "Baixar como", + "EncryptedFileSaving": "Salvando arquivo criptografado", + "Files": "Arquivos", + "Folders": "Pastas", + "FolderTitleBoxNet": "Diretório da box", + "FolderTitleDocuSign": "Conta do DocuSign", + "FolderTitleDropBox": "Diretório da Dropbox", + "FolderTitleGoogle": "Diretório do Google", + "FolderTitlekDrive": "Diretório do kDrive", + "FolderTitleSharePoint": "Diretório do SharePoint", + "FolderTitleSkyDrive": "Diretório OneDrive", + "FolderTitleWebDav": "Diretório WebDAV", + "FolderTitleYandex": "Diretório Yandex", + "LinkCopySuccess": "Link foi copiado para a área de trabalho", + "Move": "Mover", + "MoveToOperation": "Movendo", + "OwnerChange": "Alterar proprietário", + "Presentations": "Apresentações ", + "Restore": "Restaurar", + "Spreadsheets": "Planilhas", + "ThirdPartyInfo": "Alterar as informações de terceiros", + "TypeTitleBoxNet": "Box", + "TypeTitleDocuSign": "DocuSign", + "TypeTitleDropBox": "Dropbox", + "TypeTitleGoogle": "Google Drive", + "TypeTitlekDrive": "kDrive", + "TypeTitleSharePoint": "SharePoint", + "TypeTitleSkyDrive": "OneDrive", + "TypeTitleWebDav": "WebDAV", + "TypeTitleYandex": "Yandex.Disk" +} diff --git a/products/ASC.Files/Client/public/locales/pt-BR/UploadPanel.json b/products/ASC.Files/Client/public/locales/pt-BR/UploadPanel.json index 26c69a08f4..3964cfa04b 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/UploadPanel.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/UploadPanel.json @@ -1,3 +1,3 @@ -{ - "Uploads": "Uploads" +{ + "Uploads": "Uploads" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/pt-BR/VersionHistory.json b/products/ASC.Files/Client/public/locales/pt-BR/VersionHistory.json index ae1cf7146a..aa141b9b76 100644 --- a/products/ASC.Files/Client/public/locales/pt-BR/VersionHistory.json +++ b/products/ASC.Files/Client/public/locales/pt-BR/VersionHistory.json @@ -1,4 +1,4 @@ -{ - "EditComment": "Editar comentário", - "Version": "Ver.{{version}}" +{ + "EditComment": "Editar comentário", + "Version": "Ver.{{version}}" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/Article.json b/products/ASC.Files/Client/public/locales/ro/Article.json index 3cc4c2cb43..1b28b0aa7e 100644 --- a/products/ASC.Files/Client/public/locales/ro/Article.json +++ b/products/ASC.Files/Client/public/locales/ro/Article.json @@ -1,8 +1,8 @@ -{ - "NewDocument": "Document nou", - "NewFolder": "Dosar nou", - "NewPresentation": "Prezentare nouă", - "NewSpreadsheet": "Foaie de calcul nouă", - "UploadFiles": "Încarcă fișiere", - "UploadFolder": "Încarcă dosarul" +{ + "NewDocument": "Document nou", + "NewFolder": "Dosar nou", + "NewPresentation": "Prezentare nouă", + "NewSpreadsheet": "Foaie de calcul nouă", + "UploadFiles": "Încarcă fișiere", + "UploadFolder": "Încarcă dosarul" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/ChangeOwnerPanel.json b/products/ASC.Files/Client/public/locales/ro/ChangeOwnerPanel.json index e3ebcc5a0e..40e853e007 100644 --- a/products/ASC.Files/Client/public/locales/ro/ChangeOwnerPanel.json +++ b/products/ASC.Files/Client/public/locales/ro/ChangeOwnerPanel.json @@ -1,4 +1,4 @@ -{ - "ChangeOwner": "Schimbarea proprietarului ({{fileName}})", - "ChangeOwnerDescription": "După schimbarea proprietarului, drepturile și permisiunile proprietarului actual se stabilesc la același nivel ca și pentru alți membri ai grupului" +{ + "ChangeOwner": "Schimbarea proprietarului ({{fileName}})", + "ChangeOwnerDescription": "După schimbarea proprietarului, drepturile și permisiunile proprietarului actual se stabilesc la același nivel ca și pentru alți membri ai grupului" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/ConflictResolveDialog.json b/products/ASC.Files/Client/public/locales/ro/ConflictResolveDialog.json index 9e26dfeeb6..d99642ca4f 100644 --- a/products/ASC.Files/Client/public/locales/ro/ConflictResolveDialog.json +++ b/products/ASC.Files/Client/public/locales/ro/ConflictResolveDialog.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "ConflictResolveDescription": "Fișierul cu numele {{file}} există deja în dosarul {{folder}}.", + "ConflictResolveDescriptionFiles": "{{filesCount}} fișiere cu același nume exista deja în folderul'{{folder}}'.", + "ConflictResolveSelectAction": "Selectați acțiune:", + "ConflictResolveTitle": "Confirmarea suprascrierii", + "CreateDescription": "Două fișiere diferite vor fi salvate în dosarul.", + "CreateTitle": "Crearea copiei fișierului", + "OverwriteDescription": "Fișierul va fi ajutat ca o veriune a fișierului cu același nume.", + "OverwriteTitle": "Suprascriere la o versiune actualizată", + "SkipDescription": "Niciun fișier n-o să fie copiat. Fișierul de origine rămâne în dosarul de destinație.", + "SkipTitle": "Treci mai departe" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/ConnectDialog.json b/products/ASC.Files/Client/public/locales/ro/ConnectDialog.json index dc1c7ec353..8a50e0564f 100644 --- a/products/ASC.Files/Client/public/locales/ro/ConnectDialog.json +++ b/products/ASC.Files/Client/public/locales/ro/ConnectDialog.json @@ -1,8 +1,8 @@ -{ - "Account": "Cont", - "ConnectFolderTitle": "Titlul dosarului", - "ConnectionUrl": "Adresă URL de conectare", - "ConnectMakeShared": "Partajează și salvează în dosarul Comune", - "Login": "Login", - "Reconnect": "Reconectare" +{ + "Account": "Cont", + "ConnectFolderTitle": "Titlul dosarului", + "ConnectionUrl": "Adresă URL de conectare", + "ConnectMakeShared": "Partajează și salvează în dosarul Comune", + "Login": "Login", + "Reconnect": "Reconectare" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/ConvertDialog.json b/products/ASC.Files/Client/public/locales/ro/ConvertDialog.json index c4dc4fb8f3..7daa88b029 100644 --- a/products/ASC.Files/Client/public/locales/ro/ConvertDialog.json +++ b/products/ASC.Files/Client/public/locales/ro/ConvertDialog.json @@ -1,6 +1,8 @@ -{ - "ConversionMessage": "Toate documentele încărcate vor fi convertite în format Office Open XML (docx, xlsx sau pptx) pentru editarea mai rapidă.", - "ConversionTitle": "Încărcare document", - "HideMessage": "Nu afișa acest mesaj din nou", - "SaveOriginalFormatMessage": "Salvează copia în formatul original" -} +{ + "ConversionFileMessage": "Fișierul va fi convertit în formatul OOXML (docx, xlsx, or pptx) pentru o afișare și editatree mai rapidă.", + "ConversionMessage": "Toate documentele încărcate vor fi convertite în format Office Open XML (docx, xlsx sau pptx) pentru editarea mai rapidă.", + "ConversionTitle": "Încărcare document", + "ConvertAndOpenTitle": "Convertire și deschidere document", + "HideMessage": "Nu afișa acest mesaj din nou", + "SaveOriginalFormatMessage": "Salvează copia în formatul original" +} diff --git a/products/ASC.Files/Client/public/locales/ro/DeleteDialog.json b/products/ASC.Files/Client/public/locales/ro/DeleteDialog.json index 9e26dfeeb6..a0bf714121 100644 --- a/products/ASC.Files/Client/public/locales/ro/DeleteDialog.json +++ b/products/ASC.Files/Client/public/locales/ro/DeleteDialog.json @@ -1 +1,12 @@ -{} \ No newline at end of file +{ + "MoveToTrashButton": "Mutare la Coşul de gunoi", + "MoveToTrashItemsNote": "Dacă ștergeți elemente partajate, aceste nu mai fi accesibil pentru alți utilizatori.", + "MoveToTrashItemsTitle": "Doriți să mutați elementele în Coșul de gunoi?", + "MoveToTrashOneFileNote": "Dacă ștergeți un fișier partajat, acesta nu mai fi accesibil pentru alți utilizatori.", + "MoveToTrashOneFileTitle": "Doriți să mutați fișierul în Coșul de gunoi?", + "MoveToTrashOneFolderNote": "Dacă ștergeți un dosar partajat, acesta nu mai fi accesibil pentru alți utilizatori.", + "MoveToTrashOneFolderTitle": "Doriți să mutați dosarul în Coșul de gunoi?", + "UnsubscribeButton": "Dezabonare", + "UnsubscribeNote": "Sunteți sigur că doriți să vă dezabonați de la elementele selectate din lista?", + "UnsubscribeTitle": "Confirmare dezabonare" +} diff --git a/products/ASC.Files/Client/public/locales/ro/DeleteThirdPartyDialog.json b/products/ASC.Files/Client/public/locales/ro/DeleteThirdPartyDialog.json index 1695be3a9b..2a4a13fb20 100644 --- a/products/ASC.Files/Client/public/locales/ro/DeleteThirdPartyDialog.json +++ b/products/ASC.Files/Client/public/locales/ro/DeleteThirdPartyDialog.json @@ -1,4 +1,4 @@ -{ - "DeleteThirdPartyAlert": "Doriţi să ştergeţi {{service}} din modul Documente? Acest lucru nu va afecta contul dvs {{account}} în niciun fel.", - "SuccessDeleteThirdParty": "Serviciul de parte terță {{service}} este eliminat" +{ + "DeleteThirdPartyAlert": "Doriţi să ştergeţi {{service}} din modul Documente? Acest lucru nu va afecta contul dvs {{account}} în niciun fel.", + "SuccessDeleteThirdParty": "Serviciul de parte terță {{service}} este eliminat" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/DownloadDialog.json b/products/ASC.Files/Client/public/locales/ro/DownloadDialog.json index 47ea3811e6..fea734ae6d 100644 --- a/products/ASC.Files/Client/public/locales/ro/DownloadDialog.json +++ b/products/ASC.Files/Client/public/locales/ro/DownloadDialog.json @@ -1,9 +1,9 @@ -{ - "ChooseFormatText": "Selectați formatul pentru fiecare fișier de încărcat", - "ConvertInto": "Convertește în", - "ConvertMessage": "Dacă doriți să convertiți fișierul într-un alt format decât cel de origine, unele date se pot pierde.", - "ConvertToZip": "Fișiere vor fi comprimate în format .zip", - "CustomFormat": "Format particularizat", - "OriginalFormat": "Formatul original", - "Other": "Altă" +{ + "ChooseFormatText": "Selectați formatul pentru fiecare fișier de încărcat", + "ConvertInto": "Convertește în", + "ConvertMessage": "Dacă doriți să convertiți fișierul într-un alt format decât cel de origine, unele date se pot pierde.", + "ConvertToZip": "Fișiere vor fi comprimate în format .zip", + "CustomFormat": "Format particularizat", + "OriginalFormat": "Formatul original", + "Other": "Altă" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/EmbeddingPanel.json b/products/ASC.Files/Client/public/locales/ro/EmbeddingPanel.json index 731d82cb11..db2fb2190d 100644 --- a/products/ASC.Files/Client/public/locales/ro/EmbeddingPanel.json +++ b/products/ASC.Files/Client/public/locales/ro/EmbeddingPanel.json @@ -1,8 +1,8 @@ -{ - "Auto": "Automat", - "CodeCopySuccess": "Codul a fost copiat în clipboard", - "EmbedCode": "Editare cod", - "EmbeddingDocument": "Încadrarea documentului", - "Height": "Înălțime", - "Width": "Lățime" +{ + "Auto": "Automat", + "CodeCopySuccess": "Codul a fost copiat în clipboard", + "EmbedCode": "Editare cod", + "EmbeddingDocument": "Încadrarea documentului", + "Height": "Înălțime", + "Width": "Lățime" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/EmptyTrashDialog.json b/products/ASC.Files/Client/public/locales/ro/EmptyTrashDialog.json index 7f6fcbe6bc..0f135cbd81 100644 --- a/products/ASC.Files/Client/public/locales/ro/EmptyTrashDialog.json +++ b/products/ASC.Files/Client/public/locales/ro/EmptyTrashDialog.json @@ -1,3 +1,6 @@ -{ - "SuccessEmptyTrash": "Coșul de gunoi a fost golit" +{ + "DeleteForeverButton": "Șterge definitiv", + "DeleteForeverNote": "Toate fișierele din coșul de gunoi vor fi șterse definitiv. Va fi imposibil să le recuperați.", + "DeleteForeverTitle": "Sigur că doriți să ștergeți definitiv?", + "SuccessEmptyTrash": "Coșul de gunoi a fost golit" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/Home.json b/products/ASC.Files/Client/public/locales/ro/Home.json index d23b58f0c7..5505042506 100644 --- a/products/ASC.Files/Client/public/locales/ro/Home.json +++ b/products/ASC.Files/Client/public/locales/ro/Home.json @@ -1,80 +1,83 @@ -{ - "All": "Toate", - "AllFiles": "Toate fișierele", - "Archives": "Arhive", - "BackToParentFolderButton": "Revenire la folderul părinte", - "ByAuthor": "Autor", - "ByCreationDate": "A fost creat la", - "ByLastModifiedDate": "Modificat", - "ByTitle": "Titlu", - "CommonEmptyContainerDescription": "Secțiunea Comune conține fișiere partajate cu alți utilizatori de către administratorul portalului. Numai administratorii portalului pot crea fișiere acolo. Utilizatorii pot primi acces complet la un anumit dosar din secțiunea. În acest mod, utilizatorii pot crea/încărca fișiere în acest dosar.", - "ContainsSpecCharacter": "Numele nu poate conține niciun din caractere următoare: *+:\"<>?|/ ", - "Convert": "Convertește", - "CopyItem": "{{title}} copiat", - "CopyItems": "{{qty}} elemente copiate", - "CreateWithEmptyTitle": "Imposibil de creat un dosar sau un fișier fără nume ", - "Document": "Document", - "Duplicate": "Crează o copie", - "EmptyFile": "Fișier gol", - "EmptyFilterDescriptionText": "Niciun fișier sau dosar nu corespunde setărilor filtru. Aplicați un alt filtru sau îl eliminați ca să afișați toate fișiere.", - "EmptyFilterSubheadingText": "Niciun fișier corespunzător de afișat ", - "EmptyFolderHeader": "Niciun fișier în dosarul", - "EmptyRecycleBin": "Golire Coş de gunoi", - "FavoritesEmptyContainerDescription": "Marcați fișiere ca preferate sau le ștergeți din lista prin intermediu meniului contextual. ", - "FileCreated": "A fost creat un fișier nou {{itemTitle}}.{{exst}}", - "FileRemoved": "Fișierul mutat în Coșul de gunoi", - "Filter": "Filtrare", - "FinalizeVersion": "Finalizarea versiunii", - "Folder": "Dosar", - "FolderCreated": "A fost creat un dosar nou {{itemTitle}}", - "FolderRemoved": "Dosarul mutat în Coșul de gunoi", - "GoToMyButton": "Accesează Documentele mele", - "Images": "Imagini", - "LinkForPortalUsers": "Link-ul pentru utilizatorii portalului", - "MarkAsFavorite": "Marcare ca preferat", - "MarkedAsFavorite": "Adăugat la preferințe", - "Media": "Media", - "MoveItem": "{{title}} deplasat", - "MoveItems": "{{qty}} elemente au fost deplasate", - "MoveTo": "Mutare în", - "MyEmptyContainerDescription": "Documentele pe care le creați sau încărcați sunt stocate în Documentele mele. Puteți edita, partaja și colaborați asupra documentelor cu echipa dvs.", - "NewDocument": "Document nou", - "NewFolder": "Dosar nou", - "NewPresentation": "Prezentare nouă", - "NewSpreadsheet": "Foaie de calcul nouă", - "NoSubfolders": "Subdosar", - "Open": "Deschide", - "OpenLocation": "Accesează locația", - "Presentation": "Prezentare", - "Preview": "Previzualizare", - "PrivateRoomDescriptionEncrypted": "Editare criptă și colaborare în timp real. ", - "PrivateRoomDescriptionSafest": "Stocarea cea mai sigură pentru docx, xlsx și pptx.", - "PrivateRoomDescriptionSecure": "Partajare securizată cu membrii de echipă de încredere.", - "PrivateRoomDescriptionUnbreakable": "Algoritm stabil AES-256.", - "PrivateRoomHeader": "Bune ați venit la Sala Privată ONLYOFFICE unde fiecare simbol introdus este criptat.", - "PrivateRoomSupport": "Sala Privată este disponibilă prin intermediu aplicației de birou {{organizationName}}. <3>Instructions", - "RecentEmptyContainerDescription": "La secțiunea Recente puteți vedea fișierele recent vizualizate sau editate", - "RemovedFromFavorites": "Eliminat din Preferințe", - "RemoveFromFavorites": "Eliminare din Preferințe", - "Rename": "Redenumire", - "SendByEmail": "Trimite prin email", - "Share": "Partajează", - "SharedEmptyContainerDescription": "La secțiunea Partajate cu mine puteți vedea toate fișierele care au fost partajate cu dvs de colegii. Dacă încă nu ați văzut modificările recente, fișierele vor fi marcate ca noi. Puteți șterge fișiere din lista din meniul contextual.", - "SharingSettings": "Setări partajare", - "ShowVersionHistory": "Afișare istoricul versiunei", - "Spreadsheet": "Foaie de calcul", - "SubheadingEmptyText": "Niciun fișier de afișat în acestă secțiune", - "TitleCreated": "A fost creat la", - "TitleDocuments": "Documente", - "TitleModified": "Actualizat", - "TitleSubfolders": "Foldere", - "TitleUploaded": "Încarcat", - "TooltipElementCopyMessage": "Copiere {{element}}", - "TooltipElementsCopyMessage": "Copiere elemente {{element}}", - "TooltipElementsMoveMessage": "Mutare elemente {{element}}", - "TrashEmptyContainerDescription": "Toate fișierele eliminate sunt deplasate în coșul de gunoi. Puteți restabili sau șterge aceste fișiere permanent prin golirea Coșului de gunoi.", - "UnblockVersion": "Deblocare/Blocare", - "UploadToFolder": "Încarcă în dosarul", - "ViewList": "Listă", - "ViewTiles": "Cadre" -} +{ + "All": "Toate", + "AllFiles": "Toate fișierele", + "Archives": "Arhive", + "BackToParentFolderButton": "Revenire la folderul părinte", + "ByAuthor": "Autor", + "ByCreationDate": "A fost creat la", + "ByLastModifiedDate": "Modificat", + "ByTitle": "Titlu", + "CommonEmptyContainerDescription": "Secțiunea Comune conține fișiere partajate cu alți utilizatori de către administratorul portalului. Numai administratorii portalului pot crea fișiere acolo. Utilizatorii pot primi acces complet la un anumit dosar din secțiunea. În acest mod, utilizatorii pot crea/încărca fișiere în acest dosar.", + "ContainsSpecCharacter": "Numele nu poate conține niciun din caractere următoare: *+:\"<>?|/ ", + "Convert": "Convertește", + "CopyItem": "{{title}} copiat", + "CopyItems": "{{qty}} elemente copiate", + "CreateWithEmptyTitle": "Imposibil de creat un dosar sau un fișier fără nume ", + "Document": "Document", + "Duplicate": "Crează o copie", + "EmptyFile": "Fișier gol", + "EmptyFilterDescriptionText": "Niciun fișier sau dosar nu corespunde setărilor filtru. Aplicați un alt filtru sau îl eliminați ca să afișați toate fișiere.", + "EmptyFilterSubheadingText": "Niciun fișier corespunzător de afișat ", + "EmptyFolderHeader": "Niciun fișier în dosarul", + "EmptyRecycleBin": "Golire Coş de gunoi", + "FavoritesEmptyContainerDescription": "Marcați fișiere ca preferate sau le ștergeți din lista prin intermediu meniului contextual. ", + "FileRemoved": "Fișierul mutat în Coșul de gunoi", + "FileRenamed": "Documentul '{{oldTitle}}' este redenumit în '{{newTitle}}'", + "Filter": "Filtrare", + "FinalizeVersion": "Finalizarea versiunii", + "Folder": "Dosar", + "FolderRemoved": "Dosarul mutat în Coșul de gunoi", + "FolderRenamed": "Dosarul '{{folderTitle}}' este redenumit în '{{newFoldedTitle}}'", + "GoToMyButton": "Accesează Documentele mele", + "Images": "Imagini", + "LinkForPortalUsers": "Link-ul pentru utilizatorii portalului", + "MarkAsFavorite": "Marcare ca preferat", + "MarkedAsFavorite": "Adăugat la preferințe", + "MarkRead": "Marchează ca citit", + "Media": "Media", + "MoveItem": "{{title}} deplasat", + "MoveItems": "{{qty}} elemente au fost deplasate", + "MoveTo": "Mutare în", + "MyEmptyContainerDescription": "Documentele pe care le creați sau încărcați sunt stocate în Documentele mele. Puteți edita, partaja și colaborați asupra documentelor cu echipa dvs.", + "New": "Nou", + "NewDocument": "Document nou", + "NewFolder": "Dosar nou", + "NewPresentation": "Prezentare nouă", + "NewSpreadsheet": "Foaie de calcul nouă", + "NoSubfolders": "Subdosar", + "Open": "Deschide", + "OpenLocation": "Accesează locația", + "Presentation": "Prezentare", + "Preview": "Previzualizare", + "PrivateRoomDescriptionEncrypted": "Editare criptă și colaborare în timp real. ", + "PrivateRoomDescriptionSafest": "Stocarea cea mai sigură pentru docx, xlsx și pptx.", + "PrivateRoomDescriptionSecure": "Partajare securizată cu membrii de echipă de încredere.", + "PrivateRoomDescriptionUnbreakable": "Algoritm stabil AES-256.", + "PrivateRoomHeader": "Bune ați venit la Sala Privată ONLYOFFICE unde fiecare simbol introdus este criptat.", + "PrivateRoomSupport": "Sala Privată este disponibilă prin intermediu aplicației de birou {{organizationName}}. <3>Instructions", + "RecentEmptyContainerDescription": "La secțiunea Recente puteți vedea fișierele recent vizualizate sau editate", + "RemovedFromFavorites": "Eliminat din Preferințe", + "RemoveFromFavorites": "Eliminare din Preferințe", + "RemoveFromList": "Șterge din lista", + "Rename": "Redenumire", + "SendByEmail": "Trimite prin email", + "Share": "Partajează", + "SharedEmptyContainerDescription": "La secțiunea Partajate cu mine puteți vedea toate fișierele care au fost partajate cu dvs de colegii. Dacă încă nu ați văzut modificările recente, fișierele vor fi marcate ca noi. Puteți șterge fișiere din lista din meniul contextual.", + "SharingSettings": "Setări partajare", + "ShowVersionHistory": "Afișare istoricul versiunei", + "Spreadsheet": "Foaie de calcul", + "SubheadingEmptyText": "Niciun fișier de afișat în acestă secțiune", + "TitleCreated": "A fost creat la", + "TitleDocuments": "Documente", + "TitleModified": "Actualizat", + "TitleSubfolders": "Foldere", + "TitleUploaded": "Încarcat", + "TooltipElementCopyMessage": "Copiere {{element}}", + "TooltipElementsCopyMessage": "Copiere elemente {{element}}", + "TooltipElementsMoveMessage": "Mutare elemente {{element}}", + "TrashEmptyContainerDescription": "Toate fișierele eliminate sunt deplasate în coșul de gunoi. Puteți restabili sau șterge aceste fișiere permanent prin golirea Coșului de gunoi.", + "UnblockVersion": "Deblocare/Blocare", + "UploadToFolder": "Încarcă în dosarul", + "ViewList": "Listă", + "ViewTiles": "Cadre" +} diff --git a/products/ASC.Files/Client/public/locales/ro/NewFilesPanel.json b/products/ASC.Files/Client/public/locales/ro/NewFilesPanel.json index 581d0ceaad..c31d5e072c 100644 --- a/products/ASC.Files/Client/public/locales/ro/NewFilesPanel.json +++ b/products/ASC.Files/Client/public/locales/ro/NewFilesPanel.json @@ -1,4 +1,4 @@ -{ - "MarkAsRead": "Marchează ca citie", - "NewFiles": "Fișiere noi" +{ + "MarkAsRead": "Marchează ca citie", + "NewFiles": "Fișiere noi" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/OperationsPanel.json b/products/ASC.Files/Client/public/locales/ro/OperationsPanel.json index c663d07da1..c692c482dd 100644 --- a/products/ASC.Files/Client/public/locales/ro/OperationsPanel.json +++ b/products/ASC.Files/Client/public/locales/ro/OperationsPanel.json @@ -1,3 +1,3 @@ -{ - "MoveToFolderMessage": "Nu puteți muta dosarul în subdosarul propriu" +{ + "MoveToFolderMessage": "Nu puteți muta dosarul în subdosarul propriu" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/PrivacyPage.json b/products/ASC.Files/Client/public/locales/ro/PrivacyPage.json new file mode 100644 index 0000000000..b993ebda14 --- /dev/null +++ b/products/ASC.Files/Client/public/locales/ro/PrivacyPage.json @@ -0,0 +1,10 @@ +{ + "PrivacyButton": "Deschide ONLYOFFICE Desktop Editors", + "PrivacyClick": "Faceți clic pe Deschidere <1>ONLYOFFICE Desktop din fereastra de dialog a browserului ca să puteți lucra cu documentele criptate.", + "PrivacyDescriptionConnect": "Puteți deschide acest fișier din aplicația pentru desktop odată ce v-ați conectat la contul dvs cloud", + "PrivacyDescriptionEditors": "Dacă ați instalat ONLYOFFICE Desktop Editors dar nu puteți să-l deschideți de aici, este posibil că este blocat din browserul dvs.", + "PrivacyDialog": "Dacă nu vedeți o fereastră de dialog, faceți clic pe butonul de mai jos", + "PrivacyEditors": "Nu aveți ONLYOFFICE Desktop Editors?", + "PrivacyHeader": "Acest document este criptat", + "PrivacyInstall": "Instalează acum" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/Settings.json b/products/ASC.Files/Client/public/locales/ro/Settings.json index 7b8643802e..4325e4949d 100644 --- a/products/ASC.Files/Client/public/locales/ro/Settings.json +++ b/products/ASC.Files/Client/public/locales/ro/Settings.json @@ -1,21 +1,21 @@ -{ - "CommonSettings": "Setări Comune", - "ConnectAccounts": "Conturile conectate", - "ConnectAccountsSubTitle": "Nu v-ați conectat încă cu niciun cont", - "ConnectAdminDescription": "Pentru o conexiune de succes, introduceți datele necesare pe <1>această pagină.", - "ConnectDescription": "Nu puteți conecta aceste conturile la ONLYOFFICE Documents. Documentele din aceste conturi vor fi disponiile pentru editare la secțiunea Documentele mele.", - "ConnectedCloud": "Serviciul cloud conectat", - "ConnectMakeShared": "A fost partajat și salvat în dosarul Comune", - "ConnextOtherAccount": "Un alt cont", - "DisplayFavorites": "Afișare Preferințe", - "DisplayNotification": "Afișează notificare când elemente sunt mutate în Coșul de gunoi", - "DisplayRecent": "Afișează recente", - "DisplayTemplates": "Afișează Șabloane", - "IntermediateVersion": "Păstrați toate versiuni intermediare salvate", - "KeepIntermediateVersion": "Păstați versiuni intermediare în timpul editării", - "OriginalCopy": "Salvează copia și în formatul original", - "StoringFileVersion": "Stocarea versiunilor fișierelor", - "ThirdPartyBtn": "Permiteţi utilizatorilor să conecteze serviciile de stocare terțe", - "ThirdPartySettings": "Serviciile cloud conectate", - "UpdateOrCreate": "Actualizați versiunea fișierului pentru fișierul existent cu același nume. În caz contrar, copia fișerului nu va fi creată." +{ + "CommonSettings": "Setări Comune", + "ConnectAccounts": "Conturile conectate", + "ConnectAccountsSubTitle": "Nu v-ați conectat încă cu niciun cont", + "ConnectAdminDescription": "Pentru o conexiune de succes, introduceți datele necesare pe <1>această pagină.", + "ConnectDescription": "Nu puteți conecta aceste conturile la ONLYOFFICE Documents. Documentele din aceste conturi vor fi disponiile pentru editare la secțiunea Documentele mele.", + "ConnectedCloud": "Serviciul cloud conectat", + "ConnectMakeShared": "A fost partajat și salvat în dosarul Comune", + "ConnextOtherAccount": "Un alt cont", + "DisplayFavorites": "Afișare Preferințe", + "DisplayNotification": "Afișează notificare când elemente sunt mutate în Coșul de gunoi", + "DisplayRecent": "Afișează recente", + "DisplayTemplates": "Afișează Șabloane", + "IntermediateVersion": "Păstrați toate versiuni intermediare salvate", + "KeepIntermediateVersion": "Păstați versiuni intermediare în timpul editării", + "OriginalCopy": "Salvează copia și în formatul original", + "StoringFileVersion": "Stocarea versiunilor fișierelor", + "ThirdPartyBtn": "Permiteţi utilizatorilor să conecteze serviciile de stocare terțe", + "ThirdPartySettings": "Serviciile cloud conectate", + "UpdateOrCreate": "Actualizați versiunea fișierului pentru fișierul existent cu același nume. În caz contrar, copia fișerului nu va fi creată." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/SharingPanel.json b/products/ASC.Files/Client/public/locales/ro/SharingPanel.json index 845b7db753..e06bead54b 100644 --- a/products/ASC.Files/Client/public/locales/ro/SharingPanel.json +++ b/products/ASC.Files/Client/public/locales/ro/SharingPanel.json @@ -1,23 +1,22 @@ -{ - "AddGroupsForSharingButton": "Adăugați grupe", - "AddShareMessage": "Adăugați mesaj", - "Comment": "Comentariu", - "CopyExternalLink": "Copierea linkului extern", - "CopyInternalLink": "Copierea linkului intern", - "CustomFilter": "Filtru particularizat", - "DenyAccess": "Acces refuzat", - "Embedding": "Încadrare", - "EncryptedFileSharing": "Fișier {{title}} a fost partajat cu succes", - "ExternalLink": "Link extern", - "FormFilling": "Completare formular", - "InternalLink": "Link intern", - "LinkText": "Adăugați utilizatorii", - "Notify users": "Notifică utilizatorii", - "Owner": "Proprietar", - "ReadOnly": "Doar în citire", - "ShareEmailBody": "V-a fost acordat accesul la document {{itemName}}. Faceți clic pe link-ul de mai jos ca să descideți documentul chiar acum: {{shareLink}}", - "ShareEmailSubject": "V-a fost acordat accesul la document {{itemName}}", - "ShareEveryone": "Toți", - "ShareVia": "Partajare prin", - "SharingSettingsTitle": "Setări partajare" -} \ No newline at end of file +{ + "AddGroupsForSharingButton": "Adăugați grupe", + "AddShareMessage": "Adăugați mesaj", + "Comment": "Comentariu", + "CopyExternalLink": "Copierea linkului extern", + "CopyInternalLink": "Copierea linkului intern", + "CustomFilter": "Filtru particularizat", + "DenyAccess": "Acces refuzat", + "Embedding": "Încadrare", + "EncryptedFileSharing": "Fișier {{title}} a fost partajat cu succes", + "ExternalLink": "Link extern", + "FormFilling": "Completare formular", + "InternalLink": "Link intern", + "LinkText": "Adăugați utilizatorii", + "Notify users": "Notifică utilizatorii", + "ReadOnly": "Doar în citire", + "ShareEmailBody": "V-a fost acordat accesul la document {{itemName}}. Faceți clic pe link-ul de mai jos ca să descideți documentul chiar acum: {{shareLink}}", + "ShareEmailSubject": "V-a fost acordat accesul la document {{itemName}}", + "ShareEveryone": "Toți", + "ShareVia": "Partajare prin", + "SharingSettingsTitle": "Setări partajare" +} diff --git a/products/ASC.Files/Client/public/locales/ro/ThirdPartyMoveDialog.json b/products/ASC.Files/Client/public/locales/ro/ThirdPartyMoveDialog.json index 5f81106cf2..bf0e57c271 100644 --- a/products/ASC.Files/Client/public/locales/ro/ThirdPartyMoveDialog.json +++ b/products/ASC.Files/Client/public/locales/ro/ThirdPartyMoveDialog.json @@ -1,5 +1,5 @@ -{ - "MoveConfirmation": "Mutarea confirmării", - "MoveConfirmationAlert": "Sunteți siguri că doriți să deplasați aceste elemente?", - "MoveConfirmationMessage": "Sunteți pe calea de a muta elemente din directorul {{provider}}. Aceste elemente vor fi șterse din contul dvs {{provider}} și nu vor fi disponibile pentru alți utilizatori." +{ + "MoveConfirmation": "Mutarea confirmării", + "MoveConfirmationAlert": "Sunteți siguri că doriți să deplasați aceste elemente?", + "MoveConfirmationMessage": "Sunteți pe calea de a muta elemente din directorul {{provider}}. Aceste elemente vor fi șterse din contul dvs {{provider}} și nu vor fi disponibile pentru alți utilizatori." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/Translations.json b/products/ASC.Files/Client/public/locales/ro/Translations.json index 9e26dfeeb6..09b97da154 100644 --- a/products/ASC.Files/Client/public/locales/ro/Translations.json +++ b/products/ASC.Files/Client/public/locales/ro/Translations.json @@ -1 +1,23 @@ -{} \ No newline at end of file +{ + "AddAccount": "Adaugă cont", + "ArchivingData": "Se arhiveaza datele", + "ConnectingAccount": "Conectare cont", + "Copy": "Copiere", + "CopyOperation": "Copiază", + "DeleteFromTrash": "Elementele selectate au fost șterse cu succes din Coșul de gunoi", + "DeleteOperation": "Ștergere în curs de desfășurare", + "DeleteSelectedElem": "Elementele selectate au fost șterse cu succes", + "DeleteThirdParty": "Ștergere serviciu terță", + "DownloadAs": "Descărcare ca", + "EncryptedFileSaving": "Salvarea fișierului criptat", + "Files": "Fișiere", + "Folders": "Dosare", + "LinkCopySuccess": "Link-ul a fost copiat în clipboard", + "Move": "Mută", + "MoveToOperation": "Mutare", + "OwnerChange": "Schimbare proprietar", + "Presentations": "Prezentări", + "Restore": "Restabilire", + "Spreadsheets": "Foi de calcul", + "ThirdPartyInfo": "Modificarea informațiilor despre servicii terțe" +} diff --git a/products/ASC.Files/Client/public/locales/ro/UploadPanel.json b/products/ASC.Files/Client/public/locales/ro/UploadPanel.json index 6cd4a50d76..472c364ac9 100644 --- a/products/ASC.Files/Client/public/locales/ro/UploadPanel.json +++ b/products/ASC.Files/Client/public/locales/ro/UploadPanel.json @@ -1,3 +1,3 @@ -{ - "Uploads": "Încărcări" +{ + "Uploads": "Încărcări" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ro/VersionHistory.json b/products/ASC.Files/Client/public/locales/ro/VersionHistory.json index 7a60aa94b5..776a893709 100644 --- a/products/ASC.Files/Client/public/locales/ro/VersionHistory.json +++ b/products/ASC.Files/Client/public/locales/ro/VersionHistory.json @@ -1,4 +1,4 @@ -{ - "EditComment": "Editare comentariu", - "Version": "Ver.{{version}}" +{ + "EditComment": "Editare comentariu", + "Version": "Ver.{{version}}" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ru/ConflictResolveDialog.json b/products/ASC.Files/Client/public/locales/ru/ConflictResolveDialog.json index 934055b848..44f62ad23a 100644 --- a/products/ASC.Files/Client/public/locales/ru/ConflictResolveDialog.json +++ b/products/ASC.Files/Client/public/locales/ru/ConflictResolveDialog.json @@ -1,12 +1,12 @@ -{ - "ConflictResolveDescription": "Файл с именем {{file}} уже существует в папке {{folder}}.", - "ConflictResolveDescriptionFiles": "{{filesCount}} документов с одинаковыми именами уже существуют в папке '{{folder}}'.", - "ConflictResolveSelectAction": "Пожалуйста, выберите действие:", - "ConflictResolveTitle": "Подтверждение перезаписи", - "CreateDescription": "В папке будет два разных файла.", - "CreateTitle": "Создать копию файла", - "OverwriteDescription": "Файл будет добавлен к файлу с таким же именем как версия.", - "OverwriteTitle": "Перезаписать с обновлением версии", - "SkipDescription": "Файл не будет скопирован. В папке назначения останется исходный файл.", - "SkipTitle": "Пропустить" +{ + "ConflictResolveDescription": "Файл с именем {{file}} уже существует в папке {{folder}}.", + "ConflictResolveDescriptionFiles": "{{filesCount}} документов с одинаковыми именами уже существуют в папке '{{folder}}'.", + "ConflictResolveSelectAction": "Пожалуйста, выберите действие:", + "ConflictResolveTitle": "Подтверждение перезаписи", + "CreateDescription": "В папке будет два разных файла.", + "CreateTitle": "Создать копию файла", + "OverwriteDescription": "Новый файл заменит существующий файл как новая версия.", + "OverwriteTitle": "Перезаписать с обновлением версии", + "SkipDescription": "Файл не будет скопирован. В папке назначения останется исходный файл.", + "SkipTitle": "Пропустить" } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ru/ConvertDialog.json b/products/ASC.Files/Client/public/locales/ru/ConvertDialog.json index eb5169a25f..91ae79c595 100644 --- a/products/ASC.Files/Client/public/locales/ru/ConvertDialog.json +++ b/products/ASC.Files/Client/public/locales/ru/ConvertDialog.json @@ -1,6 +1,6 @@ { + "ConversionFileMessage": "Файл будет сконвертирован в формат OOXML (docx, xlsx или pptx) для быстрого просмотра и редактирования.", "ConversionMessage": "Все документы, которые Вы загружаете, будут сконвертированы в соответствующий формат Office Open XML (docx, xlsx или pptx) для быстрого редактирования.", - "ConversionFileMessage": "Файл документа, который Вы открываете, будет сконвертирован в формат Office Open XML для быстрого просмотра и редактирования.", "ConversionTitle": "Загрузка документа", "ConvertAndOpenTitle": "Конвертация и открытие документа", "HideMessage": "Больше не показывать это сообщение", diff --git a/products/ASC.Files/Client/public/locales/ru/DeleteDialog.json b/products/ASC.Files/Client/public/locales/ru/DeleteDialog.json index 80f8728df3..9afc7044a5 100644 --- a/products/ASC.Files/Client/public/locales/ru/DeleteDialog.json +++ b/products/ASC.Files/Client/public/locales/ru/DeleteDialog.json @@ -8,6 +8,5 @@ "MoveToTrashOneFolderTitle": "Переместить папку в корзину?", "UnsubscribeButton": "Отписаться", "UnsubscribeNote": "Вы действительно хотите отписаться от выделенных элементов из списка?", - "UnsubscribeTitle": "Подтверждение отписки", - "ConfirmRemove": "Подтверждение удаления" -} \ No newline at end of file + "UnsubscribeTitle": "Подтверждение отписки" +} diff --git a/products/ASC.Files/Client/public/locales/ru/DeleteThirdPartyDialog.json b/products/ASC.Files/Client/public/locales/ru/DeleteThirdPartyDialog.json index eafe6aa754..4a83f93c07 100644 --- a/products/ASC.Files/Client/public/locales/ru/DeleteThirdPartyDialog.json +++ b/products/ASC.Files/Client/public/locales/ru/DeleteThirdPartyDialog.json @@ -1,4 +1,4 @@ { - "DeleteThirdPartyAlert": "Вы действительно хотите удалить {{service}} из модуля 'Документы'? Это никак не повлияет на Ваш аккаунт.", + "DeleteThirdPartyAlert": "Вы действительно хотите удалить {{service}} из модуля 'Документы'? Это никак не повлияет на Ваш {{account}} аккаунт.", "SuccessDeleteThirdParty": "Сторонний ресурс {{service}} отключен" -} \ No newline at end of file +} diff --git a/products/ASC.Files/Client/public/locales/ru/Home.json b/products/ASC.Files/Client/public/locales/ru/Home.json index df5f60a9fd..95d378aead 100644 --- a/products/ASC.Files/Client/public/locales/ru/Home.json +++ b/products/ASC.Files/Client/public/locales/ru/Home.json @@ -21,13 +21,11 @@ "EmptyFolderHeader": "В этой папке нет файлов", "EmptyRecycleBin": "Очистить корзину", "FavoritesEmptyContainerDescription": "Чтобы добавить файлы в избранное или удалить их из этого списка, используйте контекстное меню.", - "FileCreated": "Создан новый файл {{itemTitle}}.{{exst}}", "FileRemoved": "Файл перемещен в корзину", "FileRenamed": "Документ '{{oldTitle}}' переименован в '{{newTitle}}'", "Filter": "Фильтр", "FinalizeVersion": "Сформировать версию", "Folder": "Папка", - "FolderCreated": "Создана новая папка {{itemTitle}}", "FolderRemoved": "Папка перемещена в корзину", "FolderRenamed": "Папка '{{folderTitle}}' переименована в '{{newFoldedTitle}}'", "GoToMyButton": "Перейти к моим документам", diff --git a/products/ASC.Files/Client/public/locales/ru/PrivacyPage.json b/products/ASC.Files/Client/public/locales/ru/PrivacyPage.json index 2df7098324..d58d182818 100644 --- a/products/ASC.Files/Client/public/locales/ru/PrivacyPage.json +++ b/products/ASC.Files/Client/public/locales/ru/PrivacyPage.json @@ -1,10 +1,10 @@ -{ - "PrivacyHeader": "Этот документ зашифрован", - "PrivacyClick": "Нажмите открыть <1>ONLYOFFICE Desktop в диалоговом окне браузера, чтобы работать с зашифрованными документами", - "PrivacyDialog": "Если вы не видите диалоговое окно, нажмите кнопку ниже", - "PrivacyButton": "Откройте ONLYOFFICE Desktop Editors", - "PrivacyEditors": "Не установлены ONLYOFFICE Desktop Editors", - "PrivacyInstall": "Установить сейчас", - "PrivacyDescriptionEditors": "Если у вас установлен ONLYOFFICE Desktop Editors, но вы не можете открыть его с этой страницы, возможно, ваш браузер блокирует его", - "PrivacyDescriptionConnect": "Вы можете открыть этот файл из интерфейса настольного приложения после подключения вашего облака" -} +{ + "PrivacyButton": "Открыть десктопные редакторы ONLYOFFICE", + "PrivacyClick": "Нажмите Открыть <1>десктопные редакторы ONLYOFFICE в диалоговом окне браузера для работы с зашифрованными документами", + "PrivacyDescriptionConnect": "Вы можете открыть этот файл из интерфейса десктопного приложения после подключения облака", + "PrivacyDescriptionEditors": "Если у вас установлены десктопные редакторы ONLYOFFICE, но не открываются с этой страницы, возможно, это блокируется браузером", + "PrivacyDialog": "Если вы не видите диалоговое окно, нажмите кнопку ниже", + "PrivacyEditors": "Нет десктопных редакторов ONLYOFFICE?", + "PrivacyHeader": "Этот документ зашифрован", + "PrivacyInstall": "Установить сейчас" +} \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ru/Settings.json b/products/ASC.Files/Client/public/locales/ru/Settings.json index d0baa78656..c02c5b82f2 100644 --- a/products/ASC.Files/Client/public/locales/ru/Settings.json +++ b/products/ASC.Files/Client/public/locales/ru/Settings.json @@ -1,21 +1,21 @@ -{ - "CommonSettings": "Общие настройки", - "ConnectAccounts": "Подключенные облака", - "ConnectAccountsSubTitle": "Вы еще не подключили сторонние облачные сервисы", - "ConnectAdminDescription": "Для успешного подключения введите нужные данные на <1>этой странице.", - "ConnectDescription": "Вы можете подключить следующие сервисы к вашему аккаунту ONLYOFFICE. Они будут отображаться в папке 'Мои документы' и Вы сможете редактировать и сохранять все свои документы в едином рабочем пространстве. ", - "ConnectedCloud": "Подключить облако", - "ConnectMakeShared": "Сделать доступным и поместить в папку 'Общие'", - "ConnextOtherAccount": "Другой аккаунт", - "DisplayFavorites": "Показывать избранное", - "DisplayNotification": "Показывать оповещение при перемещении элемента в корзину", - "DisplayRecent": "Показывать последние", - "DisplayTemplates": "Показывать шаблоны", - "IntermediateVersion": "Хранить все сохраненные промежуточные версии", - "KeepIntermediateVersion": "Хранить промежуточные версии при редактировании", - "OriginalCopy": "Сохранять также копию файла в исходном формате", - "StoringFileVersion": "Хранение версий файлов", - "ThirdPartyBtn": "Разрешить пользователям подключать сторонние хранилища", - "ThirdPartySettings": "Подключенные облака", - "UpdateOrCreate": "Обновлять версию файла для существующего файла с таким же именем. В противном случае будет создаваться копия файла." +{ + "CommonSettings": "Общие настройки", + "ConnectAccounts": "Подключенные облака", + "ConnectAccountsSubTitle": "Вы еще не подключили сторонние облачные сервисы", + "ConnectAdminDescription": "Для успешного подключения введите нужные данные на <1>этой странице.", + "ConnectDescription": "Вы можете подключить следующие сервисы к вашему аккаунту ONLYOFFICE. Они будут отображаться в папке 'Мои документы' и Вы сможете редактировать и сохранять все свои документы в едином рабочем пространстве. ", + "ConnectedCloud": "Подключить облако", + "ConnectMakeShared": "Сделать доступным и поместить в папку 'Общие'", + "ConnextOtherAccount": "Другой аккаунт", + "DisplayFavorites": "Показывать избранное", + "DisplayNotification": "Показывать оповещение при перемещении элемента в корзину", + "DisplayRecent": "Показывать последние", + "DisplayTemplates": "Показывать шаблоны", + "IntermediateVersion": "Хранить все сохраненные промежуточные версии", + "KeepIntermediateVersion": "Хранить промежуточные версии при редактировании", + "OriginalCopy": "Сохранять также копию файла в исходном формате", + "StoringFileVersion": "Хранение версий файлов", + "ThirdPartyBtn": "Разрешить пользователям подключать сторонние хранилища", + "ThirdPartySettings": "Подключенные облака", + "UpdateOrCreate": "Обновлять версию файла для существующего файла с таким же именем. В противном случае будет создаваться копия файла." } \ No newline at end of file diff --git a/products/ASC.Files/Client/public/locales/ru/SharingPanel.json b/products/ASC.Files/Client/public/locales/ru/SharingPanel.json index 4bdcdc0067..5953b26939 100644 --- a/products/ASC.Files/Client/public/locales/ru/SharingPanel.json +++ b/products/ASC.Files/Client/public/locales/ru/SharingPanel.json @@ -13,11 +13,10 @@ "InternalLink": "Внутренняя ссылка", "LinkText": "Добавить пользователей", "Notify users": "Уведомить пользователей", - "Owner": "Владелец", "ReadOnly": "Только чтение", "ShareEmailBody": "Вам предоставлен доступ к документу {{itemName}}. Нажмите на ссылку ниже, чтобы открыть документ прямо сейчас: {{shareLink}}", "ShareEmailSubject": "Вам предоставлен доступ к документу {{itemName}}", "ShareEveryone": "Все", "ShareVia": "Отправить по", "SharingSettingsTitle": "Настройки совместного доступа" -} \ No newline at end of file +} diff --git a/products/ASC.Files/Client/public/locales/ru/Translations.json b/products/ASC.Files/Client/public/locales/ru/Translations.json index e1412d9098..fcd1103678 100644 --- a/products/ASC.Files/Client/public/locales/ru/Translations.json +++ b/products/ASC.Files/Client/public/locales/ru/Translations.json @@ -1,44 +1,44 @@ -{ - "AddAccount": "Подключить", - "ArchivingData": "Архивирование данных", - "ConnectingAccount": "Подключение аккаунта", - "Copy": "Копировать", - "CopyOperation": "Копирование", - "DeleteFromTrash": "Выбранные элементы успешно удалены из корзины", - "DeleteOperation": "Удаление", - "DeleteSelectedElem": "Выбранные элементы успешно удалены", - "DeleteThirdParty": "Отключить сторонний ресурс", - "DownloadAs": "Скачать как", - "EncryptedFileSaving": "Сохранение зашифрованного файла", - "Files": "Файлы", - "Folders": "Папки", - "LinkCopySuccess": "Ссылка скопирована", - "Move": "Переместить", - "MoveToOperation": "Перемещение", - "OwnerChange": "Сменить владельца", - "Presentations": "Презентации", - "Restore": "Восстановить", - "Spreadsheets": "Таблицы", - "ThirdPartyInfo": "Изменить настройки подключения", - "DownloadApps": "Скачать приложения", - "SelectFolder": "Выбрать папку", - "FolderTitleBoxNet": "Каталог Box", - "FolderTitleDocuSign": "Аккаунт DocuSign", - "FolderTitleDropBox": "Каталог Dropbox", - "FolderTitleGoogle": "Каталог Google", - "FolderTitlekDrive": "Каталог kDrive", - "FolderTitleSharePoint": "Каталог SharePoint", - "FolderTitleSkyDrive": "Каталог OneDrive", - "FolderTitleWebDav": "Каталог WebDAV", - "FolderTitleYandex": "Каталог Яндекса", - "TypeTitleBoxNet": "Box", - "TypeTitleDocuSign": "DocuSign", - "TypeTitleDropBox": "Dropbox", - "TypeTitleGoogle": "Google Drive", - "TypeTitlekDrive": "kDrive", - "TypeTitleSharePoint": "SharePoint", - "TypeTitleSkyDrive": "OneDrive", - "TypeTitleWebDav": "WebDAV", - "TypeTitleYandex": "Яндекс.Диск", - "MediaLoadError": "Медиа файл не может быть загружен" -} +{ + "AddAccount": "Подключить", + "ArchivingData": "Архивирование данных", + "ConnectingAccount": "Подключение аккаунта", + "Copy": "Копировать", + "CopyOperation": "Копирование", + "DeleteFromTrash": "Выбранные элементы успешно удалены из корзины", + "DeleteOperation": "Удаление", + "DeleteSelectedElem": "Выбранные элементы успешно удалены", + "DeleteThirdParty": "Отключить сторонний ресурс", + "DownloadApps": "Скачать приложения", + "DownloadAs": "Скачать как", + "EncryptedFileSaving": "Сохранение зашифрованного файла", + "Files": "Файлы", + "Folders": "Папки", + "FolderTitleBoxNet": "Каталог Box", + "FolderTitleDocuSign": "Аккаунт DocuSign", + "FolderTitleDropBox": "Каталог Dropbox", + "FolderTitleGoogle": "Каталог Google", + "FolderTitlekDrive": "Каталог kDrive", + "FolderTitleSharePoint": "Каталог SharePoint", + "FolderTitleSkyDrive": "Каталог OneDrive", + "FolderTitleWebDav": "Каталог WebDAV", + "FolderTitleYandex": "Каталог Яндекса", + "LinkCopySuccess": "Ссылка скопирована в буфер обмена", + "MediaLoadError": "Медиа файл не может быть загружен", + "Move": "Переместить", + "MoveToOperation": "Перемещение", + "OwnerChange": "Сменить владельца", + "Presentations": "Презентации", + "Restore": "Восстановить", + "SelectFolder": "Выбрать папку", + "Spreadsheets": "Таблицы", + "ThirdPartyInfo": "Изменить настройки подключения", + "TypeTitleBoxNet": "Box", + "TypeTitleDocuSign": "DocuSign", + "TypeTitleDropBox": "Dropbox", + "TypeTitleGoogle": "Google Drive", + "TypeTitlekDrive": "kDrive", + "TypeTitleSharePoint": "SharePoint", + "TypeTitleSkyDrive": "OneDrive", + "TypeTitleWebDav": "WebDAV", + "TypeTitleYandex": "Яндекс.Диск" +} diff --git a/products/ASC.Files/Client/src/HOCs/withContextOptions.js b/products/ASC.Files/Client/src/HOCs/withContextOptions.js index 0ebb63952d..447e0e40d5 100644 --- a/products/ASC.Files/Client/src/HOCs/withContextOptions.js +++ b/products/ASC.Files/Client/src/HOCs/withContextOptions.js @@ -130,7 +130,7 @@ export default function withContextOptions(WrappedComponent) { ? combineUrl( AppServerConfig.proxyURL, config.homepage, - `/doceditor?fileId=${id}&action=view` + `/doceditor?fileId=${encodeURIComponent(id)}&action=view` ) : null; diff --git a/products/ASC.Files/Client/src/components/Article/Body/Banner.js b/products/ASC.Files/Client/src/components/Article/Body/Banner.js index 6f1a7c2347..a44a6a723e 100644 --- a/products/ASC.Files/Client/src/components/Article/Body/Banner.js +++ b/products/ASC.Files/Client/src/components/Article/Body/Banner.js @@ -66,7 +66,7 @@ const bannerHOC = (WrappedComponent) => (props) => { i18nConfig.use(Backend).init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", debug: false, defaultNS: "", diff --git a/products/ASC.Files/Client/src/components/Article/Body/TreeFolders.js b/products/ASC.Files/Client/src/components/Article/Body/TreeFolders.js index dab9d34a6a..9f62f2c87e 100644 --- a/products/ASC.Files/Client/src/components/Article/Body/TreeFolders.js +++ b/products/ASC.Files/Client/src/components/Article/Body/TreeFolders.js @@ -211,17 +211,19 @@ class TreeFolders extends React.Component { const provider = item.providerKey; const serviceFolder = !!item.providerKey; - let className = `tree-drag tree-id_${item.id}`; if (withoutProvider && provider) return; - if (dragging) className += " dragging"; + let value = ""; + if (dragging) value = `${item.id} dragging`; + if ((item.folders && item.folders.length > 0) || serviceFolder) { return ( { return ( } + className="tree-settings" > {isAdmin ? ( {!isMobile && ( f.checked); @@ -129,7 +131,7 @@ class DeleteDialogComponent extends React.Component { const title = isPrivacyFolder || isRecycleBinFolder || checkedSelections[0]?.providerKey - ? t("ConfirmRemove") + ? t("Common:Confirmation") : unsubscribe ? t("UnsubscribeTitle") : checkedSelections.length === 1 || isPrivacyFolder diff --git a/products/ASC.Files/Client/src/components/dialogs/EmptyTrashDialog/index.js b/products/ASC.Files/Client/src/components/dialogs/EmptyTrashDialog/index.js index 22f01e4ab9..c04f6228b6 100644 --- a/products/ASC.Files/Client/src/components/dialogs/EmptyTrashDialog/index.js +++ b/products/ASC.Files/Client/src/components/dialogs/EmptyTrashDialog/index.js @@ -21,7 +21,10 @@ const EmptyTrashDialogComponent = (props) => { const onEmptyTrash = () => { onClose(); - const translations = { deleteOperation: t("Translations:DeleteOperation") }; + const translations = { + deleteOperation: t("Translations:DeleteOperation"), + successOperation: t("SuccessEmptyTrash"), + }; emptyTrash(translations); }; diff --git a/products/ASC.Files/Client/src/components/panels/EmbeddingPanel/i18n.js b/products/ASC.Files/Client/src/components/panels/EmbeddingPanel/i18n.js index 92d138bc28..3618a5017c 100644 --- a/products/ASC.Files/Client/src/components/panels/EmbeddingPanel/i18n.js +++ b/products/ASC.Files/Client/src/components/panels/EmbeddingPanel/i18n.js @@ -9,7 +9,7 @@ const newInstance = i18n.createInstance(); newInstance.use(Backend).init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.Files/Client/src/components/panels/SelectFileDialog/i18n.js b/products/ASC.Files/Client/src/components/panels/SelectFileDialog/i18n.js index 9250e8c235..6552669daf 100644 --- a/products/ASC.Files/Client/src/components/panels/SelectFileDialog/i18n.js +++ b/products/ASC.Files/Client/src/components/panels/SelectFileDialog/i18n.js @@ -9,7 +9,7 @@ const newInstance = i18n.createInstance(); newInstance.use(Backend).init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.Files/Client/src/components/panels/SelectFolderDialog/i18n.js b/products/ASC.Files/Client/src/components/panels/SelectFolderDialog/i18n.js index 8b9d50dabb..76c3ea23ea 100644 --- a/products/ASC.Files/Client/src/components/panels/SelectFolderDialog/i18n.js +++ b/products/ASC.Files/Client/src/components/panels/SelectFolderDialog/i18n.js @@ -9,7 +9,7 @@ const newInstance = i18n.createInstance(); newInstance.use(Backend).init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.Files/Client/src/components/panels/SharingPanel/SharingRow.js b/products/ASC.Files/Client/src/components/panels/SharingPanel/SharingRow.js index 4dd68173b3..a4f7c98713 100644 --- a/products/ASC.Files/Client/src/components/panels/SharingPanel/SharingRow.js +++ b/products/ASC.Files/Client/src/components/panels/SharingPanel/SharingRow.js @@ -56,7 +56,7 @@ class SharingRow extends React.Component { body, }); - window.open(mailtoLink); + window.open(mailtoLink, "_self"); }; onShareTwitter = () => { @@ -69,7 +69,7 @@ class SharingRow extends React.Component { text: shareLink, }); - window.open(twitterLink); + window.open(twitterLink, "", "width=1000,height=670"); }; // onShareFacebook = () => { @@ -250,7 +250,7 @@ class SharingRow extends React.Component { ))} {isOwner ? ( - {t("Owner")} + {t("Common:Owner")} ) : id === isMyId ? ( { - const { shareDataItems } = this.state; + const { shareDataItems, isUpdated } = this.state; const { DenyAccess, ReadOnly } = ShareAccessRights; const rights = item.access !== DenyAccess ? DenyAccess : ReadOnly; @@ -80,6 +82,7 @@ class SharingPanelComponent extends React.Component { this.setState({ shareDataItems: newDataItems, showEmbeddingContent: false, + isUpdated: !isUpdated, }); }; @@ -96,6 +99,8 @@ class SharingPanelComponent extends React.Component { }; onSaveClick = () => { + + const { baseShareData, isNotifyUsers, @@ -176,8 +181,28 @@ class SharingPanelComponent extends React.Component { const ownerId = filesOwnerId !== owner.sharedTo.id ? owner.sharedTo.id : null; - setIsLoading(true); + this.setShareInfo(folderIds, fileIds, share, externalAccess, ownerId); + }; + + setShareInfo = (folderIds, fileIds, share, externalAccess, ownerId) => { + const { isNotifyUsers, message } = this.state; + + const { + selection, + isPrivacy, + replaceFileStream, + t, + uploadPanelVisible, + updateUploadedItem, + uploadSelection, + isDesktop, + setEncryptionAccess, + setShareFiles, + onSuccess, + } = this.props; + this.onClose(); + setShareFiles( folderIds, fileIds, @@ -229,8 +254,11 @@ class SharingPanelComponent extends React.Component { setIsLoading(false); }); }; + onNotifyUsersChange = () => - this.setState({ isNotifyUsers: !this.state.isNotifyUsers }); + this.setState({ + isNotifyUsers: !this.state.isNotifyUsers, + }); onShowUsersPanel = () => this.setState({ @@ -246,7 +274,7 @@ class SharingPanelComponent extends React.Component { if (elem.access !== +access) { elem.access = +access; - this.setState({ shareDataItems }); + this.setState({ shareDataItems, isUpdated: true }); } }; @@ -288,19 +316,30 @@ class SharingPanelComponent extends React.Component { }; getShareData = () => { + const returnValue = this.getData(); + const folderId = returnValue[0]; + const fileId = returnValue[1]; + + if (folderId.length !== 0 || fileId.length !== 0) { + this.setState( + { + isLoading: true, + }, + function () { + this.getShareUsers(folderId, fileId); + } + ); + } + }; + + getShareUsers = (folderId, fileId) => { const { getAccessOption, getExternalAccessOption, selection, - setIsLoading, getShareUsers, } = this.props; - const returnValue = this.getData(); - const folderId = returnValue[0]; - const fileId = returnValue[1]; - if (folderId.length !== 0 || fileId.length !== 0) { - !isMobile && setIsLoading(true); getShareUsers(folderId, fileId) .then((shareDataItems) => { const baseShareData = JSON.parse(JSON.stringify(shareDataItems)); @@ -324,8 +363,11 @@ class SharingPanelComponent extends React.Component { toastr.error(err); this.onClose(); }) - .finally(() => !isMobile && setIsLoading(false)); - } + .finally(() => + this.setState({ + isLoading: false, + }) + ); }; getInternalLink = () => { @@ -441,7 +483,6 @@ class SharingPanelComponent extends React.Component { selection, groupsCaption, canShareOwnerChange, - isLoading, uploadPanelVisible, documentTitle, sharingPanelVisible, @@ -461,6 +502,8 @@ class SharingPanelComponent extends React.Component { accessOptions, externalAccessOptions, showEmbeddingContent, + isUpdated, + isLoading, } = this.state; const visible = sharingPanelVisible; @@ -528,7 +571,7 @@ class SharingPanelComponent extends React.Component { size="big" primary onClick={this.onSaveClick} - isDisabled={isLoading} + isDisabled={isLoading || !isUpdated} /> @@ -743,11 +786,9 @@ const SharingPanel = inject( setFolder, getShareUsers, setShareFiles, - setIsLoading, setSelection, getFileInfo, getFolderInfo, - isLoading, setBufferSelection, } = filesStore; const { isPrivacyFolder } = treeFoldersStore; @@ -774,13 +815,11 @@ const SharingPanel = inject( : selection.length ? selection : [bufferSelection], - isLoading, isPrivacy: isPrivacyFolder, isFolderActions, selectedUploadFile, canShareOwnerChange, - setIsLoading, setSharingPanelVisible, setIsFolderActions, setSelection, diff --git a/products/ASC.Files/Client/src/components/panels/UploadPanel/LoadingButton.js b/products/ASC.Files/Client/src/components/panels/UploadPanel/LoadingButton.js index 04a4c9cdf1..3d881cdc63 100644 --- a/products/ASC.Files/Client/src/components/panels/UploadPanel/LoadingButton.js +++ b/products/ASC.Files/Client/src/components/panels/UploadPanel/LoadingButton.js @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState, useEffect } from "react"; import styled, { css, keyframes } from "styled-components"; import globalColors from "@appserver/components/utils/globalColors"; @@ -32,7 +32,7 @@ const StyledCircle = styled.div` } ${(props) => - props.percent === 0 + props.percent === 0 || (props.isAnimation && props.inConversion) ? css` .circle__fill { animation: ${rotate360} 2s linear infinite; @@ -86,6 +86,19 @@ const StyledLoadingButton = styled.div` const LoadingButton = ({ id, className, style, ...rest }) => { const { percent, onClick, isConversion, inConversion } = rest; + const [isAnimation, setIsAnimation] = useState(true); + + const stopAnimation = () => { + setIsAnimation(false); + }; + + useEffect(() => { + const timer = setTimeout(stopAnimation, 5000); + + return function cleanup() { + clearTimeout(timer); + }; + }, [isAnimation]); return ( { style={style} onClick={onClick} > - +
diff --git a/products/ASC.Files/Client/src/helpers/i18n.js b/products/ASC.Files/Client/src/helpers/i18n.js index 46b2ed7fbd..a4c6b830c2 100644 --- a/products/ASC.Files/Client/src/helpers/i18n.js +++ b/products/ASC.Files/Client/src/helpers/i18n.js @@ -9,7 +9,7 @@ const newInstance = i18n.createInstance(); newInstance.use(Backend).init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.Files/Client/src/helpers/utils.js b/products/ASC.Files/Client/src/helpers/utils.js index 7ecc3c982a..e34278ed87 100644 --- a/products/ASC.Files/Client/src/helpers/utils.js +++ b/products/ASC.Files/Client/src/helpers/utils.js @@ -63,7 +63,7 @@ export const openDocEditor = async ( url = combineUrl( AppServerConfig.proxyURL, config.homepage, - `/doceditor?fileId=${id}` + `/doceditor?fileId=${encodeURIComponent(id)}` ); } diff --git a/products/ASC.Files/Client/src/i18n.js b/products/ASC.Files/Client/src/i18n.js index 1c91cfa4dd..49d44dee36 100644 --- a/products/ASC.Files/Client/src/i18n.js +++ b/products/ASC.Files/Client/src/i18n.js @@ -11,7 +11,7 @@ const lng = localStorage.getItem(LANGUAGE) || "en"; newInstance.use(Backend).init({ lng: lng, fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Body/RowsView/SimpleFilesRow.js b/products/ASC.Files/Client/src/pages/Home/Section/Body/RowsView/SimpleFilesRow.js index f580a1b7fd..c808a4139e 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Body/RowsView/SimpleFilesRow.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Body/RowsView/SimpleFilesRow.js @@ -136,7 +136,7 @@ const SimpleFilesRow = (props) => { ); return ( - + (!props.isRecycleBin ? 'pointer' : 'default')}; min-height: 57px; + box-sizing: border-box; width: 100%; border: 1px solid #d0d5da; border-radius: 3px; @@ -196,8 +197,13 @@ const StyledFileTileTop = styled.div` justify-content: space-between; align-items: baseline; background-color: #f8f9f9; +<<<<<<< HEAD padding: 13px; height: ${(props) => (props.checked || props.isActive ? '156px' : '156px')}; +======= + padding-top: 21px; + height: ${(props) => (props.checked || props.isActive ? "156px" : "156px")}; +>>>>>>> develop position: relative; border-bottom: ${(props) => props.checked || props.isActive ? '1px solid #D0D5DA' : '1px solid transparent'}; @@ -211,6 +217,11 @@ const StyledFileTileTop = styled.div` bottom: 0; margin: auto; z-index: 0; + + min-width: 208px; + } + + .temporary-icon > .injected-svg { margin-bottom: 16px; } `; @@ -219,7 +230,7 @@ const StyledFileTileBottom = styled.div` ${FlexBoxStyles} padding: 9px 10px; padding-right: 0; - min-height: 56px; + height: 56px; box-sizing: border-box; `; diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Body/TilesView/sub-components/TileContainer.js b/products/ASC.Files/Client/src/pages/Home/Section/Body/TilesView/sub-components/TileContainer.js index 4b165a9558..d832ecf2c7 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Body/TilesView/sub-components/TileContainer.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Body/TilesView/sub-components/TileContainer.js @@ -7,34 +7,36 @@ import AutoSizer from "react-virtualized-auto-sizer"; import Heading from "@appserver/components/heading"; import ContextMenu from "@appserver/components/context-menu"; import CustomScrollbarsVirtualList from "@appserver/components/scrollbar"; - import { tablet, desktop } from "@appserver/components/utils/device"; -const foldersStyle = css` - grid-gap: 19px 14px; - +const paddingCss = css` @media ${desktop} { - margin-left: -1px; - padding-right: 1px; + margin-left: 1px; + padding-right: 3px; } @media ${tablet} { - grid-gap: 17px 12px; margin-left: -1px; } `; -const filesStyle = css` - grid-gap: 14px 18px; +const foldersStyle = css` + grid-gap: 19px 16px; - @media ${desktop} { - padding-right: 5px; - } + ${paddingCss} @media ${tablet} { - grid-gap: 12px 14px; - margin-left: -1px; - padding-right: 2px; + grid-gap: 17px 12px; + } +`; + +const filesStyle = css` + grid-gap: 14px 16px; + + ${paddingCss} + + @media ${tablet} { + grid-gap: 12px; } `; @@ -59,10 +61,6 @@ const StyledTileContainer = styled.div` } &.folder { padding: 0; - - .drag-and-drop { - margin: 0px; - } } } @@ -74,16 +72,6 @@ const StyledTileContainer = styled.div` &.files { padding-top: 8px; } - - margin-left: -1px; - } - - @media (min-width: 1024px) { - .tile-item-wrapper { - &.file { - margin-left: 1px; - } - } } @media ${tablet} { diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Body/index.js b/products/ASC.Files/Client/src/pages/Home/Section/Body/index.js index 171ee3dc57..4d9f412677 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Body/index.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Body/index.js @@ -128,18 +128,10 @@ const SectionBodyContent = (props) => { document.body.classList.remove("drag-cursor"); const treeElem = e.target.closest(".tree-drag"); - const treeClassList = treeElem && treeElem.classList; - const isDragging = treeElem && treeClassList.contains("dragging"); - - let index = null; - for (let i in treeClassList) { - if (treeClassList[i] === "dragging") { - index = i - 1; - break; - } - } - - const treeValue = isDragging ? treeClassList[index].split("_")[1] : null; + const treeDataValue = treeElem?.dataset?.value; + const splitValue = treeDataValue && treeDataValue.split(" "); + const isDragging = splitValue && splitValue.includes("dragging"); + const treeValue = isDragging ? splitValue[0] : null; const elem = e.target.closest(".droppable"); const title = elem && elem.dataset.title; diff --git a/products/ASC.Files/Client/src/pages/Home/Section/Paging/index.js b/products/ASC.Files/Client/src/pages/Home/Section/Paging/index.js index 108b3a8d69..5c4c89df33 100644 --- a/products/ASC.Files/Client/src/pages/Home/Section/Paging/index.js +++ b/products/ASC.Files/Client/src/pages/Home/Section/Paging/index.js @@ -13,6 +13,7 @@ const SectionPagingContent = ({ selectedCount, selectedFolderId, tReady, + totalPages, }) => { const { t } = useTranslation("Home"); const onNextClick = useCallback( @@ -105,7 +106,6 @@ const SectionPagingContent = ({ const pageItems = useMemo(() => { if (filter.total < filter.pageCount) return []; - const totalPages = Math.ceil(filter.total / filter.pageCount); return [...Array(totalPages).keys()].map((item) => { return { key: item, @@ -115,7 +115,7 @@ const SectionPagingContent = ({ }), }; }); - }, [filter.total, filter.pageCount, t]); + }, [filter.total, filter.pageCount, t, totalPages]); const emptyPageSelection = { key: 0, @@ -168,11 +168,14 @@ const SectionPagingContent = ({ export default inject(({ filesStore, selectedFolderStore }) => { const { files, folders, fetchFiles, filter, setIsLoading } = filesStore; + const totalPages = Math.ceil(filter.total / filter.pageCount); + return { files, folders, selectedFolderId: selectedFolderStore.id, filter, + totalPages, setIsLoading, fetchFiles, diff --git a/products/ASC.Files/Client/src/pages/PrivateRoomsPage/i18n.js b/products/ASC.Files/Client/src/pages/PrivateRoomsPage/i18n.js index 8cf51d7dbe..00af388ea2 100644 --- a/products/ASC.Files/Client/src/pages/PrivateRoomsPage/i18n.js +++ b/products/ASC.Files/Client/src/pages/PrivateRoomsPage/i18n.js @@ -9,7 +9,7 @@ const newInstance = i18n.createInstance(); newInstance.use(Backend).init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.Files/Client/src/store/FilesActionsStore.js b/products/ASC.Files/Client/src/store/FilesActionsStore.js index ae2425ac4c..b2aceae2f0 100644 --- a/products/ASC.Files/Client/src/store/FilesActionsStore.js +++ b/products/ASC.Files/Client/src/store/FilesActionsStore.js @@ -56,19 +56,36 @@ class FilesActionStore { } }; - updateCurrentFolder = () => { + updateCurrentFolder = (selectionLength) => { const { clearSecondaryProgressData, } = this.uploadDataStore.secondaryProgressDataStore; + const { + filter, + fetchFiles, + isEmptyLastPageAfterOperation, + resetFilterPage, + } = this.filesStore; + + let newFilter; + + if (selectionLength && isEmptyLastPageAfterOperation(selectionLength)) { + newFilter = resetFilterPage(); + } + let updatedFolder = this.selectedFolderStore.id; if (this.dialogsStore.isFolderActions) { updatedFolder = this.selectedFolderStore.parentId; } - const { filter, fetchFiles } = this.filesStore; - fetchFiles(updatedFolder, filter, true, true).finally(() => { + fetchFiles( + updatedFolder, + newFilter ? newFilter : filter, + true, + true + ).finally(() => { this.dialogsStore.setIsFolderActions(false); return setTimeout(() => clearSecondaryProgressData(), TIMEOUT); }); @@ -131,7 +148,18 @@ class FilesActionStore { label: translations.deleteOperation, }; await this.uploadDataStore.loopFilesOperations(data, pbData); - this.updateCurrentFolder(); + this.updateCurrentFolder(selection.length); + if (isRecycleBinFolder) { + return toastr.success(translations.deleteFromTrash); + } + + if (selection.length > 1) { + return toastr.success(translations.deleteSelectedElem); + } + if (selection[0].fileExst) { + return toastr.success(translations.FileRemoved); + } + return toastr.success(translations.FolderRemoved); } ); } catch (err) { @@ -167,6 +195,7 @@ class FilesActionStore { label: translations.deleteOperation, }; await this.uploadDataStore.loopFilesOperations(data, pbData); + toastr.success(translations.successOperation); this.updateCurrentFolder(); }); } catch (err) { @@ -179,8 +208,6 @@ class FilesActionStore { } }; - downloadFilesOperation = () => {}; - downloadFiles = async (fileConvertIds, folderIds, label) => { const { setSecondaryProgressBarData, @@ -358,13 +385,15 @@ class FilesActionStore { label: translations.deleteOperation, }; + const selectionFilesLength = 1; + if (isFile) { this.isMediaOpen(); return deleteFile(itemId) .then(async (res) => { const data = res[0] ? res[0] : null; await this.uploadDataStore.loopFilesOperations(data, pbData); - this.updateCurrentFolder(); + this.updateCurrentFolder(selectionFilesLength); }) .then(() => toastr.success(translations.successRemoveFile)); } else { @@ -372,7 +401,7 @@ class FilesActionStore { .then(async (res) => { const data = res[0] ? res[0] : null; await this.uploadDataStore.loopFilesOperations(data, pbData); - this.updateCurrentFolder(); + this.updateCurrentFolder(selectionFilesLength); }) .then(() => toastr.success(translations.successRemoveFolder)); } @@ -525,6 +554,7 @@ class FilesActionStore { markAsRead = (folderIds, fileId, item) => { const { setSecondaryProgressBarData, + clearSecondaryProgressData, } = this.uploadDataStore.secondaryProgressDataStore; setSecondaryProgressBarData({ @@ -541,7 +571,8 @@ class FilesActionStore { await this.uploadDataStore.loopFilesOperations(data, pbData); }) .then(() => item && this.setNewBadgeCount(item)) - .catch((err) => toastr.error(err)); + .catch((err) => toastr.error(err)) + .finally(() => setTimeout(() => clearSecondaryProgressData(), TIMEOUT)); }; moveDragItems = (destFolderId, folderTitle, translations) => { @@ -751,6 +782,8 @@ class FilesActionStore { deleteOperation: t("Translations:DeleteOperation"), deleteFromTrash: t("Translations:DeleteFromTrash"), deleteSelectedElem: t("Translations:DeleteSelectedElem"), + FileRemoved: t("Home:FileRemoved"), + FolderRemoved: t("Home:FolderRemoved"), }; this.deleteAction(translations).catch((err) => diff --git a/products/ASC.Files/Client/src/store/FilesStore.js b/products/ASC.Files/Client/src/store/FilesStore.js index d0c3aa57dc..95dee4ade2 100644 --- a/products/ASC.Files/Client/src/store/FilesStore.js +++ b/products/ASC.Files/Client/src/store/FilesStore.js @@ -98,7 +98,7 @@ class FilesStore { }; setStartDrag = (startDrag) => { - this.selection = this.selection.filter((x) => !x.isThirdPartyFolder); // removed root thirdparty folders + this.selection = this.selection.filter((x) => !x.providerKey); // removed root thirdparty folders this.startDrag = startDrag; }; @@ -272,6 +272,26 @@ class FilesStore { ); }; + isEmptyLastPageAfterOperation = (newSelection) => { + const selection = + newSelection || this.selection?.length || [this.bufferSelection].length; + + return ( + selection && + this.filter.page > 0 && + !this.filter.hasNext() && + selection === this.files.length + this.folders.length + ); + }; + + resetFilterPage = () => { + let newFilter; + newFilter = this.filter.clone(); + newFilter.page--; + + return newFilter; + }; + fetchFiles = ( folderId, filter, @@ -310,6 +330,8 @@ class FilesStore { const isRecycleBinFolder = data.current.rootFolderType === FolderType.TRASH; + !isRecycleBinFolder && this.checkUpdateNode(data, folderId); + if (!isRecycleBinFolder && withSubfolders) { const path = data.pathParts.slice(0); const foldersCount = data.current.foldersCount; @@ -340,7 +362,7 @@ class FilesStore { const selectedFolder = { selectedFolder: { ...this.selectedFolderStore }, }; - this.createThumbnails(); + this.viewAs === "tile" && this.createThumbnails(); return Promise.resolve(selectedFolder); }) .catch((err) => { @@ -363,6 +385,37 @@ class FilesStore { return request(); }; + checkUpdateNode = async (data, folderId) => { + const { treeFolders, getSubfolders } = this.treeFoldersStore; + const { pathParts, current } = data; + + if (current.parentId === 0) return; + + const somePath = pathParts.slice(0); + const path = pathParts.slice(0); + let newItems = treeFolders; + + while (somePath.length !== 1) { + const folderItem = newItems.find((x) => x.id === somePath[0]); + newItems = folderItem?.folders + ? folderItem.folders + : somePath.length > 1 + ? [] + : null; + if (!newItems) { + return; + } + + somePath.shift(); + } + + if (!newItems.find((x) => x.id == folderId)) { + path.splice(pathParts.length - 1, 1); + const subfolders = await getSubfolders(current.parentId); + loopTreeFolders(path, treeFolders, subfolders, 0); + } + }; + isFileSelected = (fileId, parentId) => { const item = this.selection.find( (x) => x.id === fileId && x.parentId === parentId diff --git a/products/ASC.Files/Client/src/store/UploadDataStore.js b/products/ASC.Files/Client/src/store/UploadDataStore.js index 9a07c3baa2..4026466ea4 100644 --- a/products/ASC.Files/Client/src/store/UploadDataStore.js +++ b/products/ASC.Files/Client/src/store/UploadDataStore.js @@ -2,12 +2,12 @@ import { makeAutoObservable, runInAction } from "mobx"; import { TIMEOUT } from "../helpers/constants"; import { loopTreeFolders } from "../helpers/files-helpers"; import uniqueid from "lodash/uniqueId"; -import throttle from "lodash/throttle"; import sumBy from "lodash/sumBy"; import { ConflictResolveType } from "@appserver/common/constants"; import { getFolder, getFileInfo, + getFolderInfo, getProgress, uploadFile, convertFile, @@ -294,11 +294,13 @@ class UploadDataStore { if (data && data[0]) { let progress = data[0].progress; + let fileInfo = null; let error = null; while (progress < 100) { const res = await this.getConversationProgress(fileId); progress = res && res[0] && res[0].progress; + fileInfo = res && res[0].result; runInAction(() => { const file = this.files.find((file) => file.fileId === fileId); @@ -317,7 +319,8 @@ class UploadDataStore { file.inConversion = false; } }); - this.refreshFiles(toFolderId, false); + + //this.refreshFiles(toFolderId, false); break; } @@ -335,7 +338,9 @@ class UploadDataStore { } }); - this.refreshFiles(toFolderId, false); + this.settingsStore.storeOriginalFiles && this.refreshFiles(file); + file.fileInfo = fileInfo; + this.refreshFiles(file); const percent = this.getConversationPercent(index + 1); this.setConversionPercent(percent, !!error); } @@ -450,46 +455,129 @@ class UploadDataStore { } }; - refreshFiles = (folderId, needUpdateTree = true) => { - const { setTreeFolders } = this.treeFoldersStore; - if ( - this.selectedFolderStore.id === folderId && - window.location.pathname.indexOf("/history") === -1 - ) { - return this.filesStore.fetchFiles( - this.selectedFolderStore.id, - this.filesStore.filter.clone(), - false, - true + refreshFiles = async (currentFile) => { + const { + files, + setFiles, + folders, + setFolders, + filter, + setFilter, + } = this.filesStore; + if (window.location.pathname.indexOf("/history") === -1) { + const newFiles = files; + const newFolders = folders; + const path = currentFile.path || []; + const fileIndex = newFiles.findIndex( + (x) => x.id === currentFile.fileInfo.id ); - } else if (needUpdateTree) { - return getFolder(folderId, this.filesStore.filter.clone()).then( - (data) => { - const path = data.pathParts; - const newTreeFolders = this.treeFoldersStore.treeFolders; - const folders = data.folders; - const foldersCount = data.count; - loopTreeFolders(path, newTreeFolders, folders, foldersCount); - setTreeFolders(newTreeFolders); + + let folderInfo = null; + const index = path.findIndex((x) => x === this.selectedFolderStore.id); + const folderId = index !== -1 ? path[index + 1] : null; + if (folderId) folderInfo = await getFolderInfo(folderId); + + const newPath = []; + if (folderInfo || path[path.length - 1] === this.selectedFolderStore.id) { + let i = 0; + while (path[i] && path[i] !== folderId) { + newPath.push(path[i]); + i++; } + } + + if ( + newPath[newPath.length - 1] !== this.selectedFolderStore.id && + path.length + ) { + return; + } + + const addNewFile = () => { + if (folderInfo) { + const isFolderExist = newFolders.find((x) => x.id === folderInfo.id); + if (!isFolderExist && folderInfo) { + newFolders.unshift(folderInfo); + setFolders(newFolders); + const newFilter = filter; + newFilter.total = newFilter.total += 1; + setFilter(newFilter); + } + } else { + if (currentFile && currentFile.fileInfo) { + if (fileIndex === -1) { + newFiles.unshift(currentFile.fileInfo); + setFiles(newFiles); + const newFilter = filter; + newFilter.total = newFilter.total += 1; + setFilter(newFilter); + } else if (!this.settingsStore.storeOriginalFiles) { + newFiles[fileIndex] = currentFile.fileInfo; + setFiles(newFiles); + } + } + } + }; + + const isFiltered = + filter.filterType || + filter.authorType || + filter.search || + filter.page !== 0; + + if ((!currentFile && !folderInfo) || isFiltered) return; + if (folderInfo && this.selectedFolderStore.id === folderInfo.id) return; + + if (folderInfo) { + const folderIndex = folders.findIndex((f) => f.id === folderInfo.id); + if (folderIndex !== -1) { + folders[folderIndex] = folderInfo; + return; + } + } + + if (filter.total >= filter.pageCount) { + if (files.length) { + fileIndex === -1 && newFiles.pop(); + addNewFile(); + } else { + newFolders.pop(); + addNewFile(); + } + } else { + addNewFile(); + } + + if (!!folderInfo) { + const { + expandedKeys, + setExpandedKeys, + treeFolders, + } = this.treeFoldersStore; + + const newExpandedKeys = expandedKeys.filter( + (x) => x !== newPath[newPath.length - 1] + "" ); + + setExpandedKeys(newExpandedKeys); + + loopTreeFolders( + newPath, + treeFolders, + this.filesStore.folders.length === 1 ? this.filesStore.folders : [], + this.filesStore.folders.length + ); + } } }; - throttleRefreshFiles = throttle((toFolderId) => { - return this.refreshFiles(toFolderId).catch((err) => { - console.log("RefreshFiles failed", err); - return Promise.resolve(); - }); - }, 1000); - uploadFileChunks = async ( location, requestsDataArray, fileSize, indexOfFile, file, - t + path ) => { const length = requestsDataArray.length; for (let index = 0; index < length; index++) { @@ -506,6 +594,11 @@ class UploadDataStore { //console.log(`Uploaded chunk ${index}/${length}`, res); //let isLatestFile = indexOfFile === newFilesLength - 1; + + if (!res.data.data && res.data.message) { + return Promise.reject(res.data.message); + } + const fileId = res.data.data.id; const { uploaded } = res.data.data; @@ -543,8 +636,9 @@ class UploadDataStore { // All chuncks are uploaded const currentFile = this.files[indexOfFile]; + currentFile.path = path; if (!currentFile) return Promise.resolve(); - const { toFolderId, needConvert } = currentFile; + const { needConvert } = currentFile; if (needConvert) { runInAction(() => (currentFile.action = "convert")); @@ -556,7 +650,10 @@ class UploadDataStore { } return Promise.resolve(); } else { - return this.throttleRefreshFiles(toFolderId); + if (currentFile.action === "uploaded") { + this.refreshFiles(currentFile); + } + return Promise.resolve(); } }; @@ -646,6 +743,7 @@ class UploadDataStore { ) .then((res) => { const location = res.data.location; + const path = res.data.path; const requestsDataArray = []; @@ -659,9 +757,9 @@ class UploadDataStore { chunk++; } - return { location, requestsDataArray, fileSize }; + return { location, requestsDataArray, fileSize, path }; }) - .then(({ location, requestsDataArray, fileSize }) => { + .then(({ location, requestsDataArray, fileSize, path }) => { this.primaryProgressDataStore.setPrimaryProgressBarData({ icon: "upload", visible: true, @@ -678,7 +776,7 @@ class UploadDataStore { fileSize, indexOfFile, file, - t + path ); }) .catch((err) => { @@ -897,7 +995,13 @@ class UploadDataStore { moveToCopyTo = (destFolderId, pbData, isCopy) => { const { treeFolders, setTreeFolders } = this.treeFoldersStore; - const { fetchFiles, filter } = this.filesStore; + const { + fetchFiles, + filter, + isEmptyLastPageAfterOperation, + resetFilterPage, + } = this.filesStore; + const { clearSecondaryProgressData, setSecondaryProgressBarData, @@ -920,12 +1024,21 @@ class UploadDataStore { loopTreeFolders(path, newTreeFolders, folders, foldersCount); if (!isCopy || destFolderId === this.selectedFolderStore.id) { - this.filesStore - .fetchFiles(updatedFolder, this.filesStore.filter, true, true) - .finally(() => { + let newFilter; + + if (isEmptyLastPageAfterOperation()) { + newFilter = resetFilterPage(); + } + + fetchFiles( + updatedFolder, + newFilter ? newFilter : filter, + true, + true + ).finally(() => { setTimeout(() => clearSecondaryProgressData(), TIMEOUT); this.dialogsStore.setIsFolderActions(false); - }); + }); } else { setSecondaryProgressBarData({ icon: pbData.icon, diff --git a/products/ASC.Files/Core/ASC.Files.Core.csproj b/products/ASC.Files/Core/ASC.Files.Core.csproj index bca73ad854..a865c361b9 100644 --- a/products/ASC.Files/Core/ASC.Files.Core.csproj +++ b/products/ASC.Files/Core/ASC.Files.Core.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 Library NU1701 @@ -18,7 +18,7 @@ - + @@ -27,9 +27,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + - diff --git a/products/ASC.Files/Core/Core/Dao/Interfaces/IFileDao.cs b/products/ASC.Files/Core/Core/Dao/Interfaces/IFileDao.cs index 877ac4f98c..301ed55763 100644 --- a/products/ASC.Files/Core/Core/Dao/Interfaces/IFileDao.cs +++ b/products/ASC.Files/Core/Core/Dao/Interfaces/IFileDao.cs @@ -313,7 +313,9 @@ namespace ASC.Files.Core void SaveThumbnail(File file, Stream thumbnail); - Stream GetThumbnail(File file); + Stream GetThumbnail(File file); + + Task GetThumbnailAsync(File file); IEnumerable<(File, SmallShareRecord)> GetFeeds(int tenant, DateTime from, DateTime to); diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs index b25cbc647f..9b31953663 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/FileDao.cs @@ -1307,6 +1307,16 @@ namespace ASC.Files.Core.Data return storage.GetReadStream(string.Empty, path); } + public async Task GetThumbnailAsync(File file) + { + var thumnailName = ThumbnailTitle + "." + Global.ThumbnailExtension; + var path = GetUniqFilePath(file, thumnailName); + var storage = GlobalStore.GetStore(); + var isExist = await storage.IsFileAsync(string.Empty, path); + if (!isExist) throw new FileNotFoundException(); + return await storage.GetReadStreamAsync(string.Empty, path, 0); + } + #endregion private Func, Selector> GetFuncForSearch(object parentId, OrderBy orderBy, FilterType filterType, bool subjectGroup, Guid subjectID, string searchText, bool searchInContent, bool withSubfolders = false) diff --git a/products/ASC.Files/Core/Core/Dao/TeamlabDao/SecurityDao.cs b/products/ASC.Files/Core/Core/Dao/TeamlabDao/SecurityDao.cs index fd9ca2f26f..0f2e9d25b5 100644 --- a/products/ASC.Files/Core/Core/Dao/TeamlabDao/SecurityDao.cs +++ b/products/ASC.Files/Core/Core/Dao/TeamlabDao/SecurityDao.cs @@ -24,9 +24,9 @@ */ -using System; -using System.Collections.Generic; -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; using System.Linq.Expressions; using ASC.Common; @@ -40,7 +40,7 @@ using ASC.Files.Core.EF; using ASC.Files.Core.Security; using ASC.Web.Studio.Core; using ASC.Web.Studio.UserControls.Statistics; -using ASC.Web.Studio.Utility; +using ASC.Web.Studio.Utility; namespace ASC.Files.Core.Data { diff --git a/products/ASC.Files/Core/Core/EF/DbFilesSecurity.cs b/products/ASC.Files/Core/Core/EF/DbFilesSecurity.cs index 220dd07d20..39082baff4 100644 --- a/products/ASC.Files/Core/Core/EF/DbFilesSecurity.cs +++ b/products/ASC.Files/Core/Core/EF/DbFilesSecurity.cs @@ -4,8 +4,8 @@ using ASC.Core.Common.EF; using ASC.Core.Common.EF.Model; using ASC.Files.Core.Security; -using Microsoft.EntityFrameworkCore; - +using Microsoft.EntityFrameworkCore; + namespace ASC.Files.Core.EF { public class DbFilesSecurity : BaseEntity, IDbFile diff --git a/products/ASC.Files/Core/Core/Entries/FileEntry.cs b/products/ASC.Files/Core/Core/Entries/FileEntry.cs index d56d2cf444..7172fa396f 100644 --- a/products/ASC.Files/Core/Core/Entries/FileEntry.cs +++ b/products/ASC.Files/Core/Core/Entries/FileEntry.cs @@ -25,10 +25,10 @@ using System; -using System.Text.Json.Serialization; - -using ASC.Files.Core.Security; - +using System.Text.Json.Serialization; + +using ASC.Files.Core.Security; + namespace ASC.Files.Core { [Serializable] diff --git a/products/ASC.Files/Core/Core/ResponseStream.cs b/products/ASC.Files/Core/Core/ResponseStream.cs index 6e7249735a..b3a616422d 100644 --- a/products/ASC.Files/Core/Core/ResponseStream.cs +++ b/products/ASC.Files/Core/Core/ResponseStream.cs @@ -25,13 +25,12 @@ using System.IO; -using System.Net; +using System.Net.Http; namespace ASC.Web.Files.Core { public class ResponseStream : Stream { - private readonly WebResponse _webResponse; private readonly Stream _stream; private readonly long _length; @@ -41,11 +40,11 @@ namespace ASC.Web.Files.Core _length = length; } - public ResponseStream(WebResponse response) + public ResponseStream(HttpResponseMessage response) { - _stream = response.GetResponseStream(); - _length = response.ContentLength; - _webResponse = response; + _stream = response.Content.ReadAsStream(); + _length = _stream.Length; + Response = response; } public override bool CanRead @@ -77,8 +76,10 @@ namespace ASC.Web.Files.Core { get { return _stream.Position; } set { _stream.Position = value; } - } - + } + + private HttpResponseMessage Response { get; } + public override int Read(byte[] buffer, int offset, int count) { return _stream.Read(buffer, offset, count); @@ -103,18 +104,16 @@ namespace ASC.Web.Files.Core { if (disposing) { - _stream.Dispose(); - if (_webResponse != null) - _webResponse.Dispose(); + _stream.Dispose(); + Response.Dispose(); } base.Dispose(disposing); } public override void Close() { - _stream.Close(); - if (_webResponse != null) - _webResponse.Close(); + _stream.Close(); + base.Close(); } } } \ No newline at end of file diff --git a/products/ASC.Files/Core/Core/Security/FileSecurity.cs b/products/ASC.Files/Core/Core/Security/FileSecurity.cs index 20c5b58876..8da56a2d79 100644 --- a/products/ASC.Files/Core/Core/Security/FileSecurity.cs +++ b/products/ASC.Files/Core/Core/Security/FileSecurity.cs @@ -205,7 +205,8 @@ namespace ASC.Files.Core.Security private IEnumerable WhoCan(FileEntry entry, FilesSecurityActions action) { - var shares = GetShares(entry); + var copyshares = GetShares(entry); + IEnumerable shares = copyshares.ToList(); FileShareRecord defaultShareRecord; @@ -318,7 +319,7 @@ namespace ASC.Files.Core.Security return new[] { x.Subject }; }) .Distinct() - .Where(x => Can(entry, x, action)) + .Where(x => Can(entry, x, action, copyshares)) .ToList(); } @@ -342,9 +343,9 @@ namespace ASC.Files.Core.Security return Filter(entries.Cast>(), FilesSecurityActions.Edit, AuthContext.CurrentAccount.ID).Cast>(); } - private bool Can(FileEntry entry, Guid userId, FilesSecurityActions action) + private bool Can(FileEntry entry, Guid userId, FilesSecurityActions action, IEnumerable shares = null) { - return Filter(new[] { entry }, action, userId).Any(); + return Filter(new[] { entry }, action, userId, shares).Any(); } private List, bool>> Can(IEnumerable> entry, Guid userId, FilesSecurityActions action) @@ -353,7 +354,7 @@ namespace ASC.Files.Core.Security return entry.Select(r => new Tuple, bool>(r, filtres.Any(a => a.ID.Equals(r.ID)))).ToList(); } - private IEnumerable> Filter(IEnumerable> entries, FilesSecurityActions action, Guid userId) + private IEnumerable> Filter(IEnumerable> entries, FilesSecurityActions action, Guid userId, IEnumerable shares = null) { if (entries == null || !entries.Any()) return Enumerable.Empty>(); @@ -383,8 +384,7 @@ namespace ASC.Files.Core.Security if (entries.Any(filter)) { - var subjects = GetUserSubjects(userId); - List shares = null; + List subjects = null; foreach (var e in entries.Where(filter)) { if (!AuthManager.GetAccountByID(TenantManager.GetCurrentTenant().TenantId, userId).IsAuthenticated && userId != FileConstant.ShareLinkId) @@ -514,12 +514,19 @@ namespace ASC.Files.Core.Security // administrator in Common has all right result.Add(e); continue; - } + } - if (shares == null) - { - shares = GetShares(entries).Join(subjects, r => r.Subject, s => s, (r, s) => r).ToList(); - // shares ordered by level + if (subjects == null) + { + subjects = GetUserSubjects(userId); + if (shares == null) + { + shares = GetShares(entries); + // shares ordered by level + } + shares = shares + .Join(subjects, r => r.Subject, s => s, (r, s) => r) + .ToList(); } FileShareRecord ace; @@ -705,7 +712,7 @@ namespace ASC.Files.Core.Security var records = securityDao.GetShares(subjects); var result = new List(); - result.AddRange(GetSharesForMe(records.Where(r=> r.EntryId.GetType() == typeof(int)), subjects, filterType, subjectGroup, subjectID, searchText, searchInContent, withSubfolders)); + result.AddRange(GetSharesForMe(records.Where(r => r.EntryId.GetType() == typeof(int)), subjects, filterType, subjectGroup, subjectID, searchText, searchInContent, withSubfolders)); result.AddRange(GetSharesForMe(records.Where(r => r.EntryId.GetType() == typeof(string)), subjects, filterType, subjectGroup, subjectID, searchText, searchInContent, withSubfolders)); return result; } diff --git a/products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveStorage.cs b/products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveStorage.cs index 10d6e74c68..e4e9384062 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveStorage.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/GoogleDrive/GoogleDriveStorage.cs @@ -30,6 +30,7 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using System.Security; using System.Text; using System.Web; @@ -215,20 +216,22 @@ namespace ASC.Files.Thirdparty.GoogleDrive file.Id, HttpUtility.UrlEncode(requiredMimeType)); } - - var request = WebRequest.Create(GoogleLoginProvider.GoogleUrlFile + downloadArg); - request.Method = "GET"; - request.Headers.Add("Authorization", "Bearer " + AccessToken); - - var response = (HttpWebResponse)request.GetResponse(); - + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(GoogleLoginProvider.GoogleUrlFile + downloadArg); + request.Method = HttpMethod.Get; + request.Headers.Add("Authorization", "Bearer " + AccessToken); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + if (offset == 0 && file.Size.HasValue && file.Size > 0) { - return new ResponseStream(response.GetResponseStream(), file.Size.Value); + return new ResponseStream(response.Content.ReadAsStream(), file.Size.Value); } var tempBuffer = TempStream.Create(); - using (var str = response.GetResponseStream()) + using (var str = response.Content.ReadAsStream()) { if (str != null) { @@ -362,24 +365,21 @@ namespace ASC.Files.Thirdparty.GoogleDrive body = !string.IsNullOrEmpty(titleData + parentData) ? string.Format("{{{0}{1}}}", titleData, parentData) : ""; } - - var request = WebRequest.Create(GoogleLoginProvider.GoogleUrlFileUpload + fileId + "?uploadType=resumable"); - request.Method = method; - - var bytes = Encoding.UTF8.GetBytes(body); - request.ContentLength = bytes.Length; - request.ContentType = "application/json; charset=UTF-8"; + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(GoogleLoginProvider.GoogleUrlFileUpload + fileId + "?uploadType=resumable"); + request.Method = new HttpMethod(method); request.Headers.Add("X-Upload-Content-Type", MimeMapping.GetMimeMapping(driveFile.Name)); request.Headers.Add("X-Upload-Content-Length", contentLength.ToString(CultureInfo.InvariantCulture)); - request.Headers.Add("Authorization", "Bearer " + AccessToken); - - request.GetRequestStream().Write(bytes, 0, bytes.Length); - - var uploadSession = new ResumableUploadSession(driveFile.Id, folderId, contentLength); - using (var response = request.GetResponse()) - { - uploadSession.Location = response.Headers["Location"]; - } + request.Headers.Add("Authorization", "Bearer " + AccessToken); + request.Content = new StringContent(body, Encoding.UTF8, "application/json"); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + + var uploadSession = new ResumableUploadSession(driveFile.Id, folderId, contentLength); + + uploadSession.Location = response.Headers.Location.ToString(); uploadSession.Status = ResumableUploadSessionStatus.Started; return uploadSession; @@ -392,47 +392,38 @@ namespace ASC.Files.Thirdparty.GoogleDrive if (googleDriveSession.Status != ResumableUploadSessionStatus.Started) throw new InvalidOperationException("Can't upload chunk for given upload session."); - - var request = WebRequest.Create(googleDriveSession.Location); - request.Method = "PUT"; - request.ContentLength = chunkLength; + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(googleDriveSession.Location); + request.Method = HttpMethod.Put; request.Headers.Add("Authorization", "Bearer " + AccessToken); request.Headers.Add("Content-Range", string.Format("bytes {0}-{1}/{2}", googleDriveSession.BytesTransfered, googleDriveSession.BytesTransfered + chunkLength - 1, - googleDriveSession.BytesToTransfer)); + googleDriveSession.BytesToTransfer)); + request.Content = new StreamContent(stream); + using var httpClient = new HttpClient(); + HttpResponseMessage response = null; - using (var requestStream = request.GetRequestStream()) - { - stream.CopyTo(requestStream); - } - - HttpWebResponse response; try { - response = (HttpWebResponse)request.GetResponse(); + response = httpClient.Send(request); } - catch (WebException exception) - { - if (exception.Status == WebExceptionStatus.ProtocolError) + catch (HttpRequestException exception) // todo create catch + { + /*if (exception. != null && exception.Response.Headers.AllKeys.Contains("Range")) { - if (exception.Response != null && exception.Response.Headers.AllKeys.Contains("Range")) - { - response = (HttpWebResponse)exception.Response; - } - else if (exception.Message.Equals("Invalid status code: 308", StringComparison.InvariantCulture)) //response is null (unix) - { - response = null; - } - else - { - throw; - } + response = exception.Response; + } + else if (exception.Message.Equals("Invalid status code: 308", StringComparison.InvariantCulture)) //response is null (unix) + { + response = null; } else { throw; - } + }*/ + throw exception; } if (response == null || response.StatusCode != HttpStatusCode.Created && response.StatusCode != HttpStatusCode.OK) @@ -442,7 +433,7 @@ namespace ASC.Files.Thirdparty.GoogleDrive if (response != null) { - var locationHeader = response.Headers["Location"]; + var locationHeader = response.Headers.Location.ToString(); if (!string.IsNullOrEmpty(locationHeader)) { uplSession.Location = locationHeader; @@ -453,7 +444,7 @@ namespace ASC.Files.Thirdparty.GoogleDrive { googleDriveSession.Status = ResumableUploadSessionStatus.Completed; - using var responseStream = response.GetResponseStream(); + using var responseStream = response.Content.ReadAsStream(); if (responseStream == null) return; string responseString; using (var readStream = new StreamReader(responseStream)) @@ -464,11 +455,6 @@ namespace ASC.Files.Thirdparty.GoogleDrive googleDriveSession.FileId = responseJson.Value("id"); } - - if (response != null) - { - response.Close(); - } } public long GetMaxUploadSize() diff --git a/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs b/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs index c928ccd14d..36aea72403 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/IThirdPartyProviderDao.cs @@ -80,6 +80,11 @@ namespace ASC.Files.Thirdparty return null; } + public Task GetThumbnailAsync(File file) + { + return null; + } + public virtual Stream GetFileStream(File file) { return null; diff --git a/products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveStorage.cs b/products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveStorage.cs index 1159f0ac44..4eea2afd8d 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveStorage.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/OneDrive/OneDriveStorage.cs @@ -257,17 +257,18 @@ namespace ASC.Files.Thirdparty.OneDrive { Path = "/" + ApiVersion + "/drive/items/" + folderId + ":/" + fileName + ":/oneDrive.createUploadSession" }; - - var request = WebRequest.Create(uploadUriBuilder.Uri); - request.Method = "POST"; - request.ContentLength = 0; - - request.ContentType = "application/json; charset=UTF-8"; + + var request = new HttpRequestMessage(); + request.RequestUri = uploadUriBuilder.Uri; + request.Method = HttpMethod.Post; request.Headers.Add("Authorization", "Bearer " + AccessToken); - - var uploadSession = new ResumableUploadSession(onedriveFile.Id, folderId, contentLength); - using (var response = request.GetResponse()) - using (var responseStream = response.GetResponseStream()) + request.Headers.Add("Content-Type", "application/json; charset=UTF-8"); + + var uploadSession = new ResumableUploadSession(onedriveFile.Id, folderId, contentLength); + + using (var httpClient = new HttpClient()) + using (var response = httpClient.Send(request)) + using (var responseStream = response.Content.ReadAsStream()) { if (responseStream != null) { @@ -289,23 +290,21 @@ namespace ASC.Files.Thirdparty.OneDrive throw new ArgumentNullException("stream"); if (oneDriveSession.Status != ResumableUploadSessionStatus.Started) - throw new InvalidOperationException("Can't upload chunk for given upload session."); - - var request = WebRequest.Create(oneDriveSession.Location); - request.Method = "PUT"; - request.ContentLength = chunkLength; + throw new InvalidOperationException("Can't upload chunk for given upload session."); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(oneDriveSession.Location); + request.Method = HttpMethod.Put; request.Headers.Add("Authorization", "Bearer " + AccessToken); request.Headers.Add("Content-Range", string.Format("bytes {0}-{1}/{2}", oneDriveSession.BytesTransfered, oneDriveSession.BytesTransfered + chunkLength - 1, - oneDriveSession.BytesToTransfer)); - - using (var requestStream = request.GetRequestStream()) - { - stream.CopyTo(requestStream); - } - - using var response = (HttpWebResponse)request.GetResponse(); + oneDriveSession.BytesToTransfer)); + request.Content = new StreamContent(stream); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + if (response.StatusCode != HttpStatusCode.Created && response.StatusCode != HttpStatusCode.OK) { oneDriveSession.BytesTransfered += chunkLength; @@ -314,7 +313,7 @@ namespace ASC.Files.Thirdparty.OneDrive { oneDriveSession.Status = ResumableUploadSessionStatus.Completed; - using var responseStream = response.GetResponseStream(); + using var responseStream = response.Content.ReadAsStream(); if (responseStream == null) return; using var readStream = new StreamReader(responseStream); var responseString = readStream.ReadToEnd(); @@ -325,12 +324,13 @@ namespace ASC.Files.Thirdparty.OneDrive } public void CancelTransfer(ResumableUploadSession oneDriveSession) - { - var request = WebRequest.Create(oneDriveSession.Location); - request.Method = "DELETE"; - using (request.GetResponse()) - { - } + { + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(oneDriveSession.Location); + request.Method = HttpMethod.Delete; + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); } } diff --git a/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointErrorEntry.cs b/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointErrorEntry.cs index 6f737de1e1..c6f296b329 100644 --- a/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointErrorEntry.cs +++ b/products/ASC.Files/Core/Core/Thirdparty/SharePoint/SharePointErrorEntry.cs @@ -24,8 +24,10 @@ */ -using Microsoft.SharePoint.Client; - +using Microsoft.SharePoint.Client; + +using File = Microsoft.SharePoint.Client.File; + namespace ASC.Files.Thirdparty.SharePoint { public class SharePointFileErrorEntry : File diff --git a/products/ASC.Files/Core/Helpers/DocuSignHelper.cs b/products/ASC.Files/Core/Helpers/DocuSignHelper.cs index 8ce7b202f9..2246221241 100644 --- a/products/ASC.Files/Core/Helpers/DocuSignHelper.cs +++ b/products/ASC.Files/Core/Helpers/DocuSignHelper.cs @@ -48,7 +48,6 @@ using ASC.Web.Core.Files; using ASC.Web.Core.Users; using ASC.Web.Files.Classes; using ASC.Web.Files.HttpHandlers; -using ASC.Web.Files.Services.WCFService; using ASC.Web.Files.ThirdPartyApp; using ASC.Web.Files.Utils; using ASC.Web.Studio.Core; diff --git a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs index 424ea220b1..0a17496f97 100644 --- a/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs +++ b/products/ASC.Files/Core/HttpHandlers/FileHandler.ashx.cs @@ -30,14 +30,15 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; -using System.Text.Json; +using System.Net.Http; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using System.Web; - + using ASC.Common; using ASC.Common.Logging; -using ASC.Common.Utils; +using ASC.Common.Utils; using ASC.Common.Web; using ASC.Core; using ASC.Files.Core; @@ -48,23 +49,23 @@ using ASC.Security.Cryptography; using ASC.Web.Core; using ASC.Web.Core.Files; using ASC.Web.Files.Classes; -using ASC.Web.Files.Core.Compress; +using ASC.Web.Files.Core.Compress; using ASC.Web.Files.Helpers; using ASC.Web.Files.Services.DocumentService; using ASC.Web.Files.Services.FFmpegService; using ASC.Web.Files.Utils; using ASC.Web.Studio.Core; using ASC.Web.Studio.Utility; - + using JWT; - + using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; - + using Newtonsoft.Json.Linq; - + using FileShare = ASC.Files.Core.Security.FileShare; using MimeMapping = ASC.Common.Web.MimeMapping; using SecurityContext = ASC.Core.SecurityContext; @@ -81,13 +82,13 @@ namespace ASC.Web.Files } public async Task Invoke(HttpContext context) - { - using var scope = ServiceProvider.CreateScope(); - var fileHandlerService = scope.ServiceProvider.GetService(); + { + using var scope = ServiceProvider.CreateScope(); + var fileHandlerService = scope.ServiceProvider.GetService(); await fileHandlerService.Invoke(context).ConfigureAwait(false); } } - + [Scope] public class FileHandlerService { @@ -115,8 +116,8 @@ namespace ASC.Web.Files private FileShareLink FileShareLink { get; } private FileConverter FileConverter { get; } private FFmpegService FFmpegService { get; } - private IServiceProvider ServiceProvider { get; } - public TempStream TempStream { get; } + private IServiceProvider ServiceProvider { get; } + public TempStream TempStream { get; } private UserManager UserManager { get; } private ILog Logger { get; } @@ -144,7 +145,7 @@ namespace ASC.Web.Files FileShareLink fileShareLink, FileConverter fileConverter, FFmpegService fFmpegService, - IServiceProvider serviceProvider, + IServiceProvider serviceProvider, TempStream tempStream) { FilesLinkUtility = filesLinkUtility; @@ -167,8 +168,8 @@ namespace ASC.Web.Files FileShareLink = fileShareLink; FileConverter = fileConverter; FFmpegService = fFmpegService; - ServiceProvider = serviceProvider; - TempStream = tempStream; + ServiceProvider = serviceProvider; + TempStream = tempStream; UserManager = userManager; Logger = optionsMonitor.CurrentValue; } @@ -210,9 +211,9 @@ namespace ASC.Web.Files break; case "diff": await DifferenceFile(context).ConfigureAwait(false); - break; - case "thumb": - await ThumbnailFile(context).ConfigureAwait(false); + break; + case "thumb": + await ThumbnailFile(context).ConfigureAwait(false); break; case "track": await TrackFile(context).ConfigureAwait(false); @@ -236,9 +237,9 @@ namespace ASC.Web.Files return; } - var ext = CompressToArchive.GetExt(ServiceProvider, context.Request.Query["ext"]); - var store = GlobalStore.GetStore(); - var path = string.Format(@"{0}\{1}{2}", SecurityContext.CurrentAccount.ID, FileConstant.DownloadTitle, ext); + var ext = CompressToArchive.GetExt(ServiceProvider, context.Request.Query["ext"]); + var store = GlobalStore.GetStore(); + var path = string.Format(@"{0}\{1}{2}", SecurityContext.CurrentAccount.ID, FileConstant.DownloadTitle, ext); if (!store.IsFile(FileConstant.StorageDomainTmp, path)) { @@ -548,7 +549,7 @@ namespace ASC.Web.Files private async Task SendStreamByChunksAsync(HttpContext context, long toRead, string title, Stream fileStream, bool flushed) { //context.Response.Buffer = false; - context.Response.Headers.Add("Connection", "Keep-Alive"); + context.Response.Headers.Add("Connection", "Keep-Alive"); context.Response.ContentLength = toRead; context.Response.Headers.Add("Content-Disposition", ContentDispositionUtil.GetHeaderValue(title)); context.Response.ContentType = MimeMapping.GetMimeMapping(title); @@ -702,7 +703,7 @@ namespace ASC.Web.Files try { - await context.Response.Body.FlushAsync(); + await context.Response.Body.FlushAsync(); await context.Response.CompleteAsync(); //context.Response.SuppressContent = true; //context.ApplicationInstance.CompleteRequest(); @@ -929,8 +930,8 @@ namespace ASC.Web.Files context.Response.Headers.Add("Content-Disposition", ContentDispositionUtil.GetHeaderValue(".zip")); context.Response.ContentType = MimeMapping.GetMimeMapping(".zip"); - using var stream = fileDao.GetDifferenceStream(file); - context.Response.Headers.Add("Content-Length", stream.Length.ToString(CultureInfo.InvariantCulture)); + using var stream = fileDao.GetDifferenceStream(file); + context.Response.Headers.Add("Content-Length", stream.Length.ToString(CultureInfo.InvariantCulture)); await stream.CopyToAsync(context.Response.Body); } catch (Exception ex) @@ -951,8 +952,8 @@ namespace ASC.Web.Files { Logger.ErrorFormat("DifferenceFile", he); } - } - + } + private async Task ThumbnailFile(HttpContext context) { var q = context.Request.Query[FilesLinkUtility.FileId]; @@ -966,75 +967,75 @@ namespace ASC.Web.Files await ThumbnailFile(context, q.FirstOrDefault() ?? ""); } } - - private async Task ThumbnailFile(HttpContext context, T id) - { - try - { - var fileDao = DaoFactory.GetFileDao(); - var file = int.TryParse(context.Request.Query[FilesLinkUtility.Version], out var version) && version > 0 - ? fileDao.GetFile(id, version) - : fileDao.GetFile(id); - - if (file == null) - { - context.Response.StatusCode = (int)HttpStatusCode.NotFound; - return; - } - - if (!FileSecurity.CanRead(file)) - { - context.Response.StatusCode = (int)HttpStatusCode.Forbidden; - return; - } - - if (!string.IsNullOrEmpty(file.Error)) - { - await context.Response.WriteAsync(file.Error); - context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - return; - } - - if (file.ThumbnailStatus != Thumbnail.Created) - { - context.Response.StatusCode = (int)HttpStatusCode.NotFound; - return; - } - - context.Response.Headers.Add("Content-Disposition", ContentDispositionUtil.GetHeaderValue("." + Global.ThumbnailExtension)); - context.Response.ContentType = MimeMapping.GetMimeMapping("." + Global.ThumbnailExtension); - - using (var stream = fileDao.GetThumbnail(file)) - { - context.Response.Headers.Add("Content-Length", stream.Length.ToString(CultureInfo.InvariantCulture)); - await stream.CopyToAsync(context.Response.Body); - } - } - catch (FileNotFoundException ex) - { - Logger.Error("Error for: " + context.Request.Url(), ex); - context.Response.StatusCode = (int)HttpStatusCode.NotFound; - await context.Response.WriteAsync(ex.Message); - return; - } - catch (Exception ex) - { - Logger.Error("Error for: " + context.Request.Url(), ex); - context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; + + private async Task ThumbnailFile(HttpContext context, T id) + { + try + { + var fileDao = DaoFactory.GetFileDao(); + var file = int.TryParse(context.Request.Query[FilesLinkUtility.Version], out var version) && version > 0 + ? fileDao.GetFile(id, version) + : fileDao.GetFile(id); + + if (file == null) + { + context.Response.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + + if (!FileSecurity.CanRead(file)) + { + context.Response.StatusCode = (int)HttpStatusCode.Forbidden; + return; + } + + if (!string.IsNullOrEmpty(file.Error)) + { + await context.Response.WriteAsync(file.Error); + context.Response.StatusCode = (int)HttpStatusCode.BadRequest; + return; + } + + if (file.ThumbnailStatus != Thumbnail.Created) + { + context.Response.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + + context.Response.Headers.Add("Content-Disposition", ContentDispositionUtil.GetHeaderValue("." + Global.ThumbnailExtension)); + context.Response.ContentType = MimeMapping.GetMimeMapping("." + Global.ThumbnailExtension); + + using (var stream = await fileDao.GetThumbnailAsync(file)) + { + context.Response.Headers.Add("Content-Length", stream.Length.ToString(CultureInfo.InvariantCulture)); + await stream.CopyToAsync(context.Response.Body); + } + } + catch (FileNotFoundException ex) + { + Logger.Error("Error for: " + context.Request.Url(), ex); + context.Response.StatusCode = (int)HttpStatusCode.NotFound; await context.Response.WriteAsync(ex.Message); - return; - } - - try - { + return; + } + catch (Exception ex) + { + Logger.Error("Error for: " + context.Request.Url(), ex); + context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; + await context.Response.WriteAsync(ex.Message); + return; + } + + try + { await context.Response.Body.FlushAsync(); - await context.Response.CompleteAsync(); - } - catch (HttpException he) - { - Logger.ErrorFormat("Thumbnail", he); - } - } + await context.Response.CompleteAsync(); + } + catch (HttpException he) + { + Logger.ErrorFormat("Thumbnail", he); + } + } private static string GetEtag(File file) { @@ -1042,16 +1043,16 @@ namespace ASC.Web.Files } private async Task CreateFile(HttpContext context) - { - if (!SecurityContext.IsAuthenticated) - { - //var refererURL = context.Request.GetUrlRewriter().AbsoluteUri; - - //context.Session["refererURL"] = refererURL; - var authUrl = "~/Auth.aspx"; - context.Response.Redirect(authUrl, true); - return; - } + { + if (!SecurityContext.IsAuthenticated) + { + //var refererURL = context.Request.GetUrlRewriter().AbsoluteUri; + + //context.Session["refererURL"] = refererURL; + var authUrl = "~/Auth.aspx"; + context.Response.Redirect(authUrl, true); + return; + } var folderId = context.Request.Query[FilesLinkUtility.FolderId].FirstOrDefault(); if (string.IsNullOrEmpty(folderId)) @@ -1059,14 +1060,14 @@ namespace ASC.Web.Files await CreateFile(context, GlobalFolderHelper.FolderMy); } else - { - if (int.TryParse(folderId, out var id)) - { - await CreateFile(context, id); - } - else - { - await CreateFile(context, folderId); + { + if (int.TryParse(folderId, out var id)) + { + await CreateFile(context, id); + } + else + { + await CreateFile(context, folderId); } } } @@ -1175,30 +1176,35 @@ namespace ASC.Web.Files file.FolderID = folder.ID; file.Comment = FilesCommonResource.CommentCreate; - var req = WebRequest.Create(fileUri); + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(fileUri); // hack. http://ubuntuforums.org/showthread.php?t=1841740 if (WorkContext.IsMono) { ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; + } + + + + var fileDao = DaoFactory.GetFileDao(); + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using var fileStream = httpClient.Send(request).Content.ReadAsStream(); + + if (fileStream.CanSeek) + { + file.ContentLength = fileStream.Length; + return fileDao.SaveFile(file, fileStream); + } + else + { + using var buffered = TempStream.GetBuffered(fileStream); + file.ContentLength = buffered.Length; + return fileDao.SaveFile(file, buffered); } - var fileDao = DaoFactory.GetFileDao(); - using var fileStream = req.GetResponse().GetResponseStream(); - - if (fileStream.CanSeek) - { - file.ContentLength = fileStream.Length; - return fileDao.SaveFile(file, fileStream); - } - else - { - using var buffered = TempStream.GetBuffered(fileStream); - file.ContentLength = buffered.Length; - return fileDao.SaveFile(file, buffered); - } - - + } private void Redirect(HttpContext context) @@ -1256,8 +1262,8 @@ namespace ASC.Web.Files private async Task TrackFile(HttpContext context) { - var q = context.Request.Query[FilesLinkUtility.FileId]; - + var q = context.Request.Query[FilesLinkUtility.FileId]; + if (int.TryParse(q, out var id)) { await TrackFile(context, id); @@ -1266,7 +1272,7 @@ namespace ASC.Web.Files { await TrackFile(context, q.FirstOrDefault() ?? ""); } - } + } private async Task TrackFile(HttpContext context, T fileId) { @@ -1293,19 +1299,19 @@ namespace ASC.Web.Files if (string.IsNullOrEmpty(body)) { throw new ArgumentException("DocService request body is incorrect"); - } - - var options = new JsonSerializerOptions - { - AllowTrailingCommas = true, - PropertyNameCaseInsensitive = true + } + + var options = new JsonSerializerOptions + { + AllowTrailingCommas = true, + PropertyNameCaseInsensitive = true }; fileData = JsonSerializer.Deserialize(body, options); - } - catch (JsonException e) - { - Logger.Error("DocService track error read body", e); - throw new HttpException((int)HttpStatusCode.BadRequest, "DocService request is incorrect"); + } + catch (JsonException e) + { + Logger.Error("DocService track error read body", e); + throw new HttpException((int)HttpStatusCode.BadRequest, "DocService request is incorrect"); } catch (Exception e) { diff --git a/products/ASC.Files/Core/Model/FileShareParams.cs b/products/ASC.Files/Core/Model/FileShareParams.cs index d5c681f122..ae9b8db228 100644 --- a/products/ASC.Files/Core/Model/FileShareParams.cs +++ b/products/ASC.Files/Core/Model/FileShareParams.cs @@ -28,9 +28,9 @@ using System; using ASC.Common; using ASC.Core; -using ASC.Files.Core.Security; -using ASC.Web.Files.Services.WCFService; - +using ASC.Files.Core.Security; +using ASC.Web.Files.Services.WCFService; + namespace ASC.Api.Documents { /// diff --git a/products/ASC.Files/Core/Model/FileShareWrapper.cs b/products/ASC.Files/Core/Model/FileShareWrapper.cs index 4063c8c0da..117bd348ba 100644 --- a/products/ASC.Files/Core/Model/FileShareWrapper.cs +++ b/products/ASC.Files/Core/Model/FileShareWrapper.cs @@ -29,10 +29,10 @@ using System; using ASC.Common; using ASC.Core; using ASC.Files.Core; -using ASC.Files.Core.Security; +using ASC.Files.Core.Security; using ASC.Web.Api.Models; -using ASC.Web.Files.Services.WCFService; - +using ASC.Web.Files.Services.WCFService; + namespace ASC.Api.Documents { /// diff --git a/products/ASC.Files/Core/Model/GenerateSharedLinkModel.cs b/products/ASC.Files/Core/Model/GenerateSharedLinkModel.cs index 99b66435e1..cc25456a75 100644 --- a/products/ASC.Files/Core/Model/GenerateSharedLinkModel.cs +++ b/products/ASC.Files/Core/Model/GenerateSharedLinkModel.cs @@ -1,9 +1,7 @@ -using ASC.Files.Core.Security; - -namespace ASC.Files.Core.Model +namespace ASC.Files.Core.Model { public class GenerateSharedLinkModel { - public FileShare Share { get; set; } + public Security.FileShare Share { get; set; } } } diff --git a/products/ASC.Files/Core/Services/DocumentService/DocumentServiceConnector.cs b/products/ASC.Files/Core/Services/DocumentService/DocumentServiceConnector.cs index 6e46227267..6f09cae6b8 100644 --- a/products/ASC.Files/Core/Services/DocumentService/DocumentServiceConnector.cs +++ b/products/ASC.Files/Core/Services/DocumentService/DocumentServiceConnector.cs @@ -29,6 +29,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Net; +using System.Net.Http; using System.Web; using ASC.Common; @@ -264,9 +265,13 @@ namespace ASC.Web.Files.Services.DocumentService } try - { - var request = (HttpWebRequest)WebRequest.Create(convertedFileUri); - using var response = (HttpWebResponse)request.GetResponse(); + { + var request1 = new HttpRequestMessage(); + request1.RequestUri = new Uri(convertedFileUri); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request1); + if (response.StatusCode != HttpStatusCode.OK) { throw new Exception("Converted url is not available"); diff --git a/products/ASC.Files/Core/Services/DocumentService/DocumentServiceTracker.cs b/products/ASC.Files/Core/Services/DocumentService/DocumentServiceTracker.cs index 0727d70792..2cab654676 100644 --- a/products/ASC.Files/Core/Services/DocumentService/DocumentServiceTracker.cs +++ b/products/ASC.Files/Core/Services/DocumentService/DocumentServiceTracker.cs @@ -31,6 +31,7 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using System.Text; using System.Text.Json; using System.Threading; @@ -489,20 +490,24 @@ namespace ASC.Web.Files.Services.DocumentService if (fileData.MailMerge == null) throw new ArgumentException("MailMerge is null"); var message = fileData.MailMerge.Message; - Stream attach = null; + Stream attach = null; + using var httpClient = new HttpClient(); switch (fileData.MailMerge.Type) { case MailMergeType.AttachDocx: - case MailMergeType.AttachPdf: - var downloadRequest = (HttpWebRequest)WebRequest.Create(DocumentServiceConnector.ReplaceDocumentAdress(fileData.Url)); + case MailMergeType.AttachPdf: + var requestDownload = new HttpRequestMessage(); + requestDownload.RequestUri = new Uri(DocumentServiceConnector.ReplaceDocumentAdress(fileData.Url)); // hack. http://ubuntuforums.org/showthread.php?t=1841740 if (WorkContext.IsMono) { ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; - } - - using (var downloadStream = new ResponseStream(downloadRequest.GetResponse())) + } + + using (var responseDownload = httpClient.Send(requestDownload)) + using (var streamDownload = responseDownload.Content.ReadAsStream()) + using (var downloadStream = new ResponseStream(streamDownload, streamDownload.Length)) { const int bufferSize = 2048; var buffer = new byte[bufferSize]; @@ -529,17 +534,19 @@ namespace ASC.Web.Files.Services.DocumentService break; - case MailMergeType.Html: - var httpWebRequest = (HttpWebRequest)WebRequest.Create(DocumentServiceConnector.ReplaceDocumentAdress(fileData.Url)); + case MailMergeType.Html: + var httpRequest = new HttpRequestMessage(); + httpRequest.RequestUri = new Uri(DocumentServiceConnector.ReplaceDocumentAdress(fileData.Url)); // hack. http://ubuntuforums.org/showthread.php?t=1841740 if (WorkContext.IsMono) { ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; - } - - using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse()) - using (var stream = httpWebResponse.GetResponseStream()) + } + + + using (var httpResponse = httpClient.Send(httpRequest)) + using (var stream = httpResponse.Content.ReadAsStream()) if (stream != null) using (var reader = new StreamReader(stream, Encoding.GetEncoding(Encoding.UTF8.WebName))) { @@ -600,16 +607,20 @@ namespace ASC.Web.Files.Services.DocumentService userId, fileName); - var store = GlobalStore.GetStore(); - var req = (HttpWebRequest)WebRequest.Create(downloadUri); + var store = GlobalStore.GetStore(); + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(downloadUri); // hack. http://ubuntuforums.org/showthread.php?t=1841740 if (WorkContext.IsMono) { ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; - } - - using (var fileStream = new ResponseStream(req.GetResponse())) + } + + using (var httpClient = new HttpClient()) + using (var response = httpClient.Send(request)) + using (var stream = response.Content.ReadAsStream()) + using (var fileStream = new ResponseStream(stream, stream.Length)) { store.Save(FileConstant.StorageDomainTmp, path, fileStream); } @@ -629,16 +640,21 @@ namespace ASC.Web.Files.Services.DocumentService try { - var fileDao = DaoFactory.GetFileDao(); - var req = (HttpWebRequest)WebRequest.Create(differenceUrl); + var fileDao = DaoFactory.GetFileDao(); + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(differenceUrl); // hack. http://ubuntuforums.org/showthread.php?t=1841740 if (WorkContext.IsMono) { ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; - } + } + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using var stream = response.Content.ReadAsStream(); - using var differenceStream = new ResponseStream(req.GetResponse()); + using var differenceStream = new ResponseStream(stream, stream.Length); fileDao.SaveEditHistory(file, changes, differenceStream); } catch (Exception ex) diff --git a/products/ASC.Files/Core/Services/FFmpegService/FFmpeg.cs b/products/ASC.Files/Core/Services/FFmpegService/FFmpeg.cs index 579b9f3f59..63e2a93e70 100644 --- a/products/ASC.Files/Core/Services/FFmpegService/FFmpeg.cs +++ b/products/ASC.Files/Core/Services/FFmpegService/FFmpeg.cs @@ -94,7 +94,7 @@ namespace ASC.Web.Files.Services.FFmpegService private ProcessStartInfo PrepareFFmpeg(string inputFormat) { - if (!ConvertableMedia.Contains(inputFormat.TrimStart('.'))) throw new ArgumentException(); + if (!ConvertableMedia.Contains(inputFormat.TrimStart('.'))) throw new ArgumentException("input format"); var startInfo = new ProcessStartInfo(); diff --git a/products/ASC.Files/Core/Services/NotifyService/NotifyClient.cs b/products/ASC.Files/Core/Services/NotifyService/NotifyClient.cs index 091c505430..e2c13b3938 100644 --- a/products/ASC.Files/Core/Services/NotifyService/NotifyClient.cs +++ b/products/ASC.Files/Core/Services/NotifyService/NotifyClient.cs @@ -32,14 +32,14 @@ using ASC.Common; using ASC.Core; using ASC.Core.Common; using ASC.Files.Core.Resources; -using ASC.Files.Core.Security; +using ASC.Files.Core.Security; using ASC.Notify.Patterns; using ASC.Web.Core.Files; using ASC.Web.Files.Classes; using ASC.Web.Studio.Core.Notify; -using Microsoft.Extensions.DependencyInjection; - +using Microsoft.Extensions.DependencyInjection; + namespace ASC.Files.Core.Services.NotifyService { [Scope(Additional = typeof(NotifyClientExtension))] diff --git a/products/ASC.Files/Core/Services/WCFService/Wrappers/AceWrapper.cs b/products/ASC.Files/Core/Services/WCFService/Wrappers/AceWrapper.cs index 8552ee0e99..503a491f2e 100644 --- a/products/ASC.Files/Core/Services/WCFService/Wrappers/AceWrapper.cs +++ b/products/ASC.Files/Core/Services/WCFService/Wrappers/AceWrapper.cs @@ -29,9 +29,9 @@ using System.Collections.Generic; using System.Text.Json.Serialization; using ASC.Files.Core; -using ASC.Files.Core.Resources; -using ASC.Files.Core.Security; - +using ASC.Files.Core.Resources; +using ASC.Files.Core.Security; + namespace ASC.Web.Files.Services.WCFService { public class AceCollection diff --git a/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs b/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs index 5a91d1295d..839c78c43e 100644 --- a/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs +++ b/products/ASC.Files/Core/ThirdPartyApp/BoxApp.cs @@ -29,6 +29,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using System.Security; using System.Text; using System.Threading; @@ -307,9 +308,12 @@ namespace ASC.Web.Files.ThirdPartyApp { Logger.Error("BoxApp: Error convert", e); } - } - - var request = (HttpWebRequest)WebRequest.Create(BoxUrlUpload.Replace("{fileId}", fileId)); + } + + using var httpClient = new HttpClient(); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(BoxUrlUpload.Replace("{fileId}", fileId)); using (var tmpStream = new MemoryStream()) { @@ -326,8 +330,10 @@ namespace ASC.Web.Files.ThirdPartyApp } else { - var downloadRequest = (HttpWebRequest)WebRequest.Create(downloadUrl); - using var downloadStream = new ResponseStream(downloadRequest.GetResponse()); + var downloadRequest = new HttpRequestMessage(); + downloadRequest.RequestUri = new Uri(downloadUrl); + using var response = httpClient.Send(request); + using var downloadStream = new ResponseStream(response); downloadStream.CopyTo(tmpStream); } @@ -335,26 +341,19 @@ namespace ASC.Web.Files.ThirdPartyApp bytes = Encoding.UTF8.GetBytes(mediaPartEnd); tmpStream.Write(bytes, 0, bytes.Length); - request.Method = "POST"; - request.Headers.Add("Authorization", "Bearer " + token); - request.ContentType = "multipart/form-data; boundary=" + boundary; - request.ContentLength = tmpStream.Length; + request.Method = HttpMethod.Post; + request.Headers.Add("Authorization", "Bearer " + token); + request.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary); Logger.Debug("BoxApp: save file totalSize - " + tmpStream.Length); - const int bufferSize = 2048; - var buffer = new byte[bufferSize]; - int readed; - tmpStream.Seek(0, SeekOrigin.Begin); - while ((readed = tmpStream.Read(buffer, 0, bufferSize)) > 0) - { - request.GetRequestStream().Write(buffer, 0, readed); - } + tmpStream.Seek(0, SeekOrigin.Begin); + request.Content = new StreamContent(tmpStream); } try { - using var response = request.GetResponse(); - using var responseStream = response.GetResponseStream(); + using var response = httpClient.Send(request); + using var responseStream = response.Content.ReadAsStream(); string result = null; if (responseStream != null) { @@ -364,12 +363,10 @@ namespace ASC.Web.Files.ThirdPartyApp Logger.Debug("BoxApp: save file response - " + result); } - catch (WebException e) + catch (HttpRequestException e) { Logger.Error("BoxApp: Error save file", e); - request.Abort(); - var httpResponse = (HttpWebResponse)e.Response; - if (httpResponse.StatusCode == HttpStatusCode.Forbidden || httpResponse.StatusCode == HttpStatusCode.Unauthorized) + if (e.StatusCode == HttpStatusCode.Forbidden || e.StatusCode == HttpStatusCode.Unauthorized) { throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException, e); } @@ -468,12 +465,15 @@ namespace ASC.Web.Files.ThirdPartyApp Logger.Error("BoxApp: token is null"); throw new SecurityException("Access token is null"); } - - var request = (HttpWebRequest)WebRequest.Create(BoxUrlFile.Replace("{fileId}", fileId) + "/content"); - request.Method = "GET"; - request.Headers.Add("Authorization", "Bearer " + token); - - using var stream = new ResponseStream(request.GetResponse()); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(BoxUrlFile.Replace("{fileId}", fileId) + "/content"); + request.Method = HttpMethod.Get; + request.Headers.Add("Authorization", "Bearer " + token); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using var stream = new ResponseStream(response); stream.CopyTo(context.Response.Body); } catch (Exception ex) diff --git a/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs b/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs index ceb8ab6b85..929d38b689 100644 --- a/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs +++ b/products/ASC.Files/Core/ThirdPartyApp/GoogleDriveApp.cs @@ -29,6 +29,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using System.Security; using System.Text; using System.Threading; @@ -312,44 +313,33 @@ namespace ASC.Web.Files.ThirdPartyApp { Logger.Error("GoogleDriveApp: Error convert", e); } - } - - var request = (HttpWebRequest)WebRequest.Create(GoogleLoginProvider.GoogleUrlFileUpload + "/{fileId}?uploadType=media".Replace("{fileId}", fileId)); - request.Method = "PATCH"; - request.Headers.Add("Authorization", "Bearer " + token); - request.ContentType = MimeMapping.GetMimeMapping(currentType); + } + + using var httpClient = new HttpClient(); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(GoogleLoginProvider.GoogleUrlFileUpload + "/{fileId}?uploadType=media".Replace("{fileId}", fileId)); + request.Method = HttpMethod.Patch; + request.Headers.Add("Authorization", "Bearer " + token); + request.Headers.Add("Content-Type", MimeMapping.GetMimeMapping(currentType)); if (stream != null) { - request.ContentLength = stream.Length; - - const int bufferSize = 2048; - var buffer = new byte[bufferSize]; - int readed; - while ((readed = stream.Read(buffer, 0, bufferSize)) > 0) - { - request.GetRequestStream().Write(buffer, 0, readed); - } + request.Content = new StreamContent(stream); } else - { - var downloadRequest = (HttpWebRequest)WebRequest.Create(downloadUrl); - using var downloadStream = new ResponseStream(downloadRequest.GetResponse()); - request.ContentLength = downloadStream.Length; - - const int bufferSize = 2048; - var buffer = new byte[bufferSize]; - int readed; - while ((readed = downloadStream.Read(buffer, 0, bufferSize)) > 0) - { - request.GetRequestStream().Write(buffer, 0, readed); - } + { + var downloadRequest = new HttpRequestMessage(); + using var response = httpClient.Send(request); + using var downloadStream = new ResponseStream(response); + + request.Content = new StreamContent(downloadStream); } try { - using var response = request.GetResponse(); - using var responseStream = response.GetResponseStream(); + using var response = httpClient.Send(request); + using var responseStream = response.Content.ReadAsStream(); string result = null; if (responseStream != null) { @@ -359,12 +349,10 @@ namespace ASC.Web.Files.ThirdPartyApp Logger.Debug("GoogleDriveApp: save file stream response - " + result); } - catch (WebException e) + catch (HttpRequestException e) { Logger.Error("GoogleDriveApp: Error save file stream", e); - request.Abort(); - var httpResponse = (HttpWebResponse)e.Response; - if (httpResponse.StatusCode == HttpStatusCode.Forbidden || httpResponse.StatusCode == HttpStatusCode.Unauthorized) + if (e.StatusCode == HttpStatusCode.Forbidden || e.StatusCode == HttpStatusCode.Unauthorized) { throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException, e); } @@ -527,13 +515,15 @@ namespace ASC.Web.Files.ThirdPartyApp throw new Exception("downloadUrl is null"); } - Logger.Debug("GoogleDriveApp: get file stream downloadUrl - " + downloadUrl); - - var request = (HttpWebRequest)WebRequest.Create(downloadUrl); - request.Method = "GET"; - request.Headers.Add("Authorization", "Bearer " + token); - - using var response = request.GetResponse(); + Logger.Debug("GoogleDriveApp: get file stream downloadUrl - " + downloadUrl); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(downloadUrl); + request.Method = HttpMethod.Get; + request.Headers.Add("Authorization", "Bearer " + token); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); using var stream = new ResponseStream(response); stream.CopyTo(context.Response.Body); @@ -738,18 +728,24 @@ namespace ASC.Web.Files.ThirdPartyApp throw new Exception("downloadUrl is null"); } Logger.Debug("GoogleDriveApp: create from - " + contentUrl); - - var request = (HttpWebRequest)WebRequest.Create(contentUrl); - - using var content = new ResponseStream(request.GetResponse()); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(contentUrl); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using var content = new ResponseStream(response); return CreateFile(content, fileName, folderId, token); } private string CreateFile(Stream content, string fileName, string folderId, Token token) { - Logger.Debug("GoogleDriveApp: create file"); - - var request = (HttpWebRequest)WebRequest.Create(GoogleLoginProvider.GoogleUrlFileUpload + "?uploadType=multipart"); + Logger.Debug("GoogleDriveApp: create file"); + + using var httpClient = new HttpClient(); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(GoogleLoginProvider.GoogleUrlFileUpload + "?uploadType=multipart"); using (var tmpStream = new MemoryStream()) { @@ -771,26 +767,19 @@ namespace ASC.Web.Files.ThirdPartyApp bytes = Encoding.UTF8.GetBytes(mediaPartEnd); tmpStream.Write(bytes, 0, bytes.Length); - request.Method = "POST"; - request.Headers.Add("Authorization", "Bearer " + token); - request.ContentType = "multipart/related; boundary=" + boundary; - request.ContentLength = tmpStream.Length; + request.Method = HttpMethod.Post; + request.Headers.Add("Authorization", "Bearer " + token); + request.Headers.Add("Content-Type", "multipart/related; boundary=" + boundary); + Logger.Debug("GoogleDriveApp: create file totalSize - " + tmpStream.Length); - const int bufferSize = 2048; - var buffer = new byte[bufferSize]; - int readed; - tmpStream.Seek(0, SeekOrigin.Begin); - while ((readed = tmpStream.Read(buffer, 0, bufferSize)) > 0) - { - request.GetRequestStream().Write(buffer, 0, readed); - } + request.Content = new StreamContent(tmpStream); } try { - using var response = request.GetResponse(); - using var responseStream = response.GetResponseStream(); + using var response = httpClient.Send(request); + using var responseStream = response.Content.ReadAsStream(); string result = null; if (responseStream != null) { @@ -801,13 +790,11 @@ namespace ASC.Web.Files.ThirdPartyApp Logger.Debug("GoogleDriveApp: create file response - " + result); return result; } - catch (WebException e) + catch (HttpRequestException e) { Logger.Error("GoogleDriveApp: Error create file", e); - request.Abort(); - var httpResponse = (HttpWebResponse)e.Response; - if (httpResponse.StatusCode == HttpStatusCode.Forbidden || httpResponse.StatusCode == HttpStatusCode.Unauthorized) + if (e.StatusCode == HttpStatusCode.Forbidden || e.StatusCode == HttpStatusCode.Unauthorized) { throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException, e); } @@ -858,25 +845,27 @@ namespace ASC.Web.Files.ThirdPartyApp var downloadUrl = GoogleLoginProvider.GoogleUrlFile + string.Format("{0}/export?mimeType={1}", fileId, - HttpUtility.UrlEncode(requiredMimeType)); - - var request = (HttpWebRequest)WebRequest.Create(downloadUrl); - request.Method = "GET"; + HttpUtility.UrlEncode(requiredMimeType)); + + using var httpClient = new HttpClient(); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(downloadUrl); + request.Method = HttpMethod.Get; request.Headers.Add("Authorization", "Bearer " + token); Logger.Debug("GoogleDriveApp: download exportLink - " + downloadUrl); try - { - using var fileStream = new ResponseStream(request.GetResponse()); + { + using var response = httpClient.Send(request); + using var fileStream = new ResponseStream(response); driveFile = CreateFile(fileStream, fileName, folderId, token); } - catch (WebException e) + catch (HttpRequestException e) { Logger.Error("GoogleDriveApp: Error download exportLink", e); - request.Abort(); - var httpResponse = (HttpWebResponse)e.Response; - if (httpResponse.StatusCode == HttpStatusCode.Forbidden || httpResponse.StatusCode == HttpStatusCode.Unauthorized) + if (e.StatusCode == HttpStatusCode.Forbidden || e.StatusCode == HttpStatusCode.Unauthorized) { throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException, e); } diff --git a/products/ASC.Files/Core/Utils/EntryManager.cs b/products/ASC.Files/Core/Utils/EntryManager.cs index fa830e93c4..05f85564ba 100644 --- a/products/ASC.Files/Core/Utils/EntryManager.cs +++ b/products/ASC.Files/Core/Utils/EntryManager.cs @@ -29,6 +29,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using System.Security; using System.Text; using System.Threading; @@ -1008,9 +1009,12 @@ namespace ASC.Web.Files.Utils { ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; } - - var req = (HttpWebRequest)WebRequest.Create(downloadUri); - using var editedFileStream = new ResponseStream(req.GetResponse()); + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(downloadUri); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using var editedFileStream = new ResponseStream(response); editedFileStream.CopyTo(tmpStream); } tmpStream.Position = 0; diff --git a/products/ASC.Files/Core/Utils/FileConverter.cs b/products/ASC.Files/Core/Utils/FileConverter.cs index 0be94472cf..bff69bf781 100644 --- a/products/ASC.Files/Core/Utils/FileConverter.cs +++ b/products/ASC.Files/Core/Utils/FileConverter.cs @@ -30,8 +30,10 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using System.Security; using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading; using System.Web; @@ -404,7 +406,7 @@ namespace ASC.Web.Files.Utils var options = new JsonSerializerOptions() { - IgnoreNullValues = true, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, IgnoreReadOnlyProperties = true, WriteIndented = false }; @@ -682,8 +684,13 @@ namespace ASC.Web.Files.Utils if (WorkContext.IsMono && ServicePointManager.ServerCertificateValidationCallback == null) { ServicePointManager.ServerCertificateValidationCallback += (s, c, n, p) => true; //HACK: http://ubuntuforums.org/showthread.php?t=1841740 - } - return new ResponseStream(((HttpWebRequest)WebRequest.Create(convertUri)).GetResponse()); + } + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(convertUri); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + return new ResponseStream(response); } public FileOperationResult ExecSync(File file, string doc) @@ -845,8 +852,11 @@ namespace ASC.Web.Files.Utils newFile.ConvertedType = null; newFile.Comment = string.Format(FilesCommonResource.CommentConvert, file.Title); newFile.ThumbnailStatus = Thumbnail.Waiting; - - var req = (HttpWebRequest)WebRequest.Create(convertedFileUrl); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(convertedFileUrl); + + using var httpClient = new HttpClient(); if (WorkContext.IsMono && ServicePointManager.ServerCertificateValidationCallback == null) { @@ -854,25 +864,21 @@ namespace ASC.Web.Files.Utils } try - { - using var convertedFileStream = new ResponseStream(req.GetResponse()); + { + using var response = httpClient.Send(request); + using var convertedFileStream = new ResponseStream(response); newFile.ContentLength = convertedFileStream.Length; newFile = fileDao.SaveFile(newFile, convertedFileStream); } - catch (WebException e) + catch (HttpRequestException e) { - using var response = e.Response; - var httpResponse = (HttpWebResponse)response; - var errorString = string.Format("WebException: {0}", httpResponse.StatusCode); + var errorString = string.Format("HttpRequestException: {0}", e.StatusCode); - if (httpResponse.StatusCode != HttpStatusCode.NotFound) + if (e.StatusCode != HttpStatusCode.NotFound) { - using var responseStream = response.GetResponseStream(); - if (responseStream != null) + if (e.Message != null) { - using var readStream = new StreamReader(responseStream); - var text = readStream.ReadToEnd(); - errorString += string.Format(" Error message: {0}", text); + errorString += string.Format(" Error message: {0}", e.Message); } } diff --git a/products/ASC.Files/Core/Utils/FileSharing.cs b/products/ASC.Files/Core/Utils/FileSharing.cs index 8fb62d01da..4b4c118961 100644 --- a/products/ASC.Files/Core/Utils/FileSharing.cs +++ b/products/ASC.Files/Core/Utils/FileSharing.cs @@ -43,8 +43,8 @@ using ASC.Web.Files.Classes; using ASC.Web.Files.Services.DocumentService; using ASC.Web.Files.Services.WCFService; -using Microsoft.Extensions.Options; - +using Microsoft.Extensions.Options; + namespace ASC.Web.Files.Utils { [Scope] diff --git a/products/ASC.Files/Core/Utils/MailMergeTask.cs b/products/ASC.Files/Core/Utils/MailMergeTask.cs index 24806c7f6e..34d67a0845 100644 --- a/products/ASC.Files/Core/Utils/MailMergeTask.cs +++ b/products/ASC.Files/Core/Utils/MailMergeTask.cs @@ -27,6 +27,7 @@ using System; using System.IO; using System.Net; +using System.Net.Http; using System.Web; using ASC.Common; @@ -131,20 +132,13 @@ namespace ASC.Web.Files.Utils SetupInfo.WebApiBaseUrl, mailMergeTask.MessageId, mailMergeTask.AttachTitle); - - var request = (HttpWebRequest)WebRequest.Create(BaseCommonLinkUtility.GetFullAbsolutePath(apiUrlAttach)); - request.Method = "POST"; - request.ContentType = MimeMapping.GetMimeMapping(mailMergeTask.AttachTitle); - request.ContentLength = mailMergeTask.Attach.Length; - request.Headers.Add("Authorization", SecurityContext.AuthenticateMe(SecurityContext.CurrentAccount.ID)); - - const int bufferSize = 2048; - var buffer = new byte[bufferSize]; - int readed; - while ((readed = mailMergeTask.Attach.Read(buffer, 0, bufferSize)) > 0) - { - request.GetRequestStream().Write(buffer, 0, readed); - } + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(BaseCommonLinkUtility.GetFullAbsolutePath(apiUrlAttach)); + request.Method = HttpMethod.Post; + request.Headers.Add("Authorization", SecurityContext.AuthenticateMe(SecurityContext.CurrentAccount.ID)); + request.Headers.Add("Content-Type", MimeMapping.GetMimeMapping(mailMergeTask.AttachTitle)); + request.Content = new StreamContent(mailMergeTask.Attach); // hack. http://ubuntuforums.org/showthread.php?t=1841740 if (WorkContext.IsMono) @@ -152,11 +146,12 @@ namespace ASC.Web.Files.Utils ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; } - string responseAttachString; - using (var response = request.GetResponse()) - using (var stream = response.GetResponseStream()) + string responseAttachString; + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using (var stream = response.Content.ReadAsStream()) { - if (stream == null) throw new WebException("Could not get an answer"); + if (stream == null) throw new HttpRequestException("Could not get an answer"); using var reader = new StreamReader(stream); responseAttachString = reader.ReadToEnd(); } diff --git a/products/ASC.Files/Server/ASC.Files.csproj b/products/ASC.Files/Server/ASC.Files.csproj index 5adeb59e49..63b21a2e37 100644 --- a/products/ASC.Files/Server/ASC.Files.csproj +++ b/products/ASC.Files/Server/ASC.Files.csproj @@ -1,19 +1,14 @@  - 9.0.30729 - {77BA2F61-6155-4283-BB39-F8E42F46A0B0} - net5.0 - - - ASC.Files - Ascensio System SIA - ASC.Files - (c) Ascensio System SIA. All rights reserved - false - false - true - false - false + net6.0 + false + $(DefaultItemExcludes); + false + false + ASC.Files + Ascensio System SIA + ASC.Files + (c) Ascensio System SIA. All rights reserved false @@ -24,13 +19,8 @@ true - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + diff --git a/products/ASC.Files/Server/Helpers/FilesControllerHelper.cs b/products/ASC.Files/Server/Helpers/FilesControllerHelper.cs index a357ffd343..cc8e8bc792 100644 --- a/products/ASC.Files/Server/Helpers/FilesControllerHelper.cs +++ b/products/ASC.Files/Server/Helpers/FilesControllerHelper.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using System.Text; using System.Text.Json; using System.Text.RegularExpressions; @@ -255,15 +256,18 @@ namespace ASC.Files.Helpers } var createSessionUrl = FilesLinkUtility.GetInitiateUploadSessionUrl(TenantManager.GetCurrentTenant().TenantId, file.FolderID, file.ID, file.Title, file.ContentLength, encrypted, SecurityContext); - var request = (HttpWebRequest)WebRequest.Create(createSessionUrl); - request.Method = "POST"; - request.ContentLength = 0; + + using var httpClient = new HttpClient(); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(createSessionUrl); + request.Method = HttpMethod.Post; // hack for uploader.onlyoffice.com in api requests var rewriterHeader = ApiContext.HttpContextAccessor.HttpContext.Request.Headers[HttpRequestExtensions.UrlRewriterHeader]; if (!string.IsNullOrEmpty(rewriterHeader)) { - request.Headers[HttpRequestExtensions.UrlRewriterHeader] = rewriterHeader; + request.Headers.Add(HttpRequestExtensions.UrlRewriterHeader, rewriterHeader.ToString()); } // hack. http://ubuntuforums.org/showthread.php?t=1841740 @@ -272,8 +276,8 @@ namespace ASC.Files.Helpers ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true; } - using var response = request.GetResponse(); - using var responseStream = response.GetResponseStream(); + using var response = httpClient.Send(request); + using var responseStream = response.Content.ReadAsStream(); using var streamReader = new StreamReader(responseStream); return JObject.Parse(streamReader.ReadToEnd()); //result is json string } diff --git a/products/ASC.Files/Service/ASC.Files.Service.csproj b/products/ASC.Files/Service/ASC.Files.Service.csproj index 24de473c32..eb812ca123 100644 --- a/products/ASC.Files/Service/ASC.Files.Service.csproj +++ b/products/ASC.Files/Service/ASC.Files.Service.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 false false false @@ -14,9 +14,8 @@ - - - + + diff --git a/products/ASC.Files/Service/Program.cs b/products/ASC.Files/Service/Program.cs index cc9a815598..e4c4d7e261 100644 --- a/products/ASC.Files/Service/Program.cs +++ b/products/ASC.Files/Service/Program.cs @@ -74,8 +74,20 @@ namespace ASC.Files.Service diHelper.TryAdd(typeof(ICacheNotify<>), typeof(KafkaCache<>)); diHelper.RegisterProducts(hostContext.Configuration, hostContext.HostingEnvironment.ContentRootPath); - services.AddHostedService(); - diHelper.TryAdd(); + + if (!bool.TryParse(hostContext.Configuration["disable_elastic"], out var disableElastic)) + { + disableElastic = false; + } + + if (!disableElastic) + { + services.AddHostedService(); + diHelper.TryAdd(); + //diHelper.TryAdd(); + diHelper.TryAdd(); + diHelper.TryAdd(); + } services.AddHostedService(); diHelper.TryAdd(); @@ -83,9 +95,6 @@ namespace ASC.Files.Service services.AddHostedService(); diHelper.TryAdd(); - //diHelper.TryAdd(); - diHelper.TryAdd(); - diHelper.TryAdd(); }) .ConfigureContainer((context, builder) => { diff --git a/products/ASC.Files/Service/Thumbnail/Builder.cs b/products/ASC.Files/Service/Thumbnail/Builder.cs index e402ac4129..7770a93606 100644 --- a/products/ASC.Files/Service/Thumbnail/Builder.cs +++ b/products/ASC.Files/Service/Thumbnail/Builder.cs @@ -17,11 +17,10 @@ using System; using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; using System.IO; using System.Linq; using System.Net; +using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -37,8 +36,11 @@ using ASC.Web.Files.Core; using ASC.Web.Files.Services.DocumentService; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; - +using Microsoft.Extensions.Options; + +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats.Png; + namespace ASC.Files.ThumbnailBuilder { [Singletone] @@ -282,17 +284,20 @@ namespace ASC.Files.ThumbnailBuilder private void SaveThumbnail(IFileDao fileDao, File file, string thumbnailUrl) { - logger.DebugFormat("SaveThumbnail: FileId: {0}. ThumbnailUrl {1}.", file.ID, thumbnailUrl); - - var req = (HttpWebRequest)WebRequest.Create(thumbnailUrl); + logger.DebugFormat("SaveThumbnail: FileId: {0}. ThumbnailUrl {1}.", file.ID, thumbnailUrl); + + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(thumbnailUrl); //HACK: http://ubuntuforums.org/showthread.php?t=1841740 if (WorkContext.IsMono && ServicePointManager.ServerCertificateValidationCallback == null) { ServicePointManager.ServerCertificateValidationCallback += (s, c, n, p) => true; - } - - using (var stream = new ResponseStream(req.GetResponse())) + } + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using (var stream = new ResponseStream(response)) { Crop(fileDao, file, stream); } @@ -320,20 +325,21 @@ namespace ASC.Files.ThumbnailBuilder private void Crop(IFileDao fileDao, File file, Stream stream) { - using (var sourceBitmap = new Bitmap(stream)) + using (var sourceImg = Image.Load(stream)) { - using (var targetBitmap = GetImageThumbnail(sourceBitmap)) + using (var targetImg = GetImageThumbnail(sourceImg)) { using (var targetStream = new MemoryStream()) { - targetBitmap.Save(targetStream, System.Drawing.Imaging.ImageFormat.Png); + targetImg.Save(targetStream, PngFormat.Instance); fileDao.SaveThumbnail(file, targetStream); } } - } + } + GC.Collect(); } - private Image GetImageThumbnail(Bitmap sourceBitmap) + private Image GetImageThumbnail(Image sourceBitmap) { //bad for small or disproportionate images //return sourceBitmap.GetThumbnailImage(config.ThumbnaillWidth, config.ThumbnaillHeight, () => false, IntPtr.Zero); @@ -363,7 +369,7 @@ namespace ASC.Files.ThumbnailBuilder var targetThumbnailSettings = new UserPhotoThumbnailSettings(point, size); - return UserPhotoThumbnailManager.GetBitmap(sourceBitmap, targetSize, targetThumbnailSettings, InterpolationMode.Bilinear); + return UserPhotoThumbnailManager.GetImage(sourceBitmap, targetSize, targetThumbnailSettings); } } } diff --git a/products/ASC.Files/Tests/ASC.Files.Tests.csproj b/products/ASC.Files/Tests/ASC.Files.Tests.csproj index 3e854176d0..a238b46e80 100644 --- a/products/ASC.Files/Tests/ASC.Files.Tests.csproj +++ b/products/ASC.Files/Tests/ASC.Files.Tests.csproj @@ -1,9 +1,7 @@  - net5.0 - - false + net6.0 @@ -11,31 +9,31 @@ - + - + - + - - - - - + + + + + - + - + diff --git a/products/ASC.Mail/Client/package.json b/products/ASC.Mail/Client/package.json index 52396c44e9..94ddee094a 100644 --- a/products/ASC.Mail/Client/package.json +++ b/products/ASC.Mail/Client/package.json @@ -1,6 +1,6 @@ { "name": "@appserver/mail", - "version": "1.0.0", + "version": "1.0.1", "private": true, "homepage": "/products/mail", "scripts": { diff --git a/products/ASC.Mail/Client/src/i18n.js b/products/ASC.Mail/Client/src/i18n.js index db1337a1ee..cfd53fe032 100644 --- a/products/ASC.Mail/Client/src/i18n.js +++ b/products/ASC.Mail/Client/src/i18n.js @@ -11,7 +11,7 @@ i18n .init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.Mail/Server/ASC.Mail.csproj b/products/ASC.Mail/Server/ASC.Mail.csproj index 6782a57154..ac741f5d8a 100644 --- a/products/ASC.Mail/Server/ASC.Mail.csproj +++ b/products/ASC.Mail/Server/ASC.Mail.csproj @@ -1,16 +1,15 @@ - net5.0 + net6.0 false false false - - - + + diff --git a/products/ASC.People/Client/package.json b/products/ASC.People/Client/package.json index 3e3d6b25b3..6553646e3b 100644 --- a/products/ASC.People/Client/package.json +++ b/products/ASC.People/Client/package.json @@ -1,6 +1,6 @@ { "name": "@appserver/people", - "version": "1.0.0", + "version": "1.0.1", "private": true, "homepage": "/products/people", "scripts": { diff --git a/products/ASC.People/Client/public/locales/de/Article.json b/products/ASC.People/Client/public/locales/de/Article.json index f15448f000..5b2216b54b 100644 --- a/products/ASC.People/Client/public/locales/de/Article.json +++ b/products/ASC.People/Client/public/locales/de/Article.json @@ -1,4 +1,4 @@ -{ - "ImportPeople": "Benutzer importieren", - "SendInvitesAgain": "Erneut einladen" +{ + "ImportPeople": "Benutzer importieren", + "SendInvitesAgain": "Erneut einladen" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/de/BackupCodesDialog.json b/products/ASC.People/Client/public/locales/de/BackupCodesDialog.json new file mode 100644 index 0000000000..a4ba04b3a3 --- /dev/null +++ b/products/ASC.People/Client/public/locales/de/BackupCodesDialog.json @@ -0,0 +1,8 @@ +{ + "BackupCodesDescription": "Benutzen Sie Back-up-Codes, wenn Sie keinen Zugriff auf das Handy haben.", + "BackupCodesSecondDescription": "Man darf jeden Code nur einmal benutzen. Sie können neue Codes immer erhalten. Nur am letzten generierten Codes sind gültig.", + "BackupCodesTitle": "Back-up-Codes", + "CodesCounter": "Codes:", + "PrintButton": "Drucken", + "RequestNewButton": "Neu anfordern" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/de/ChangePhoneDialog.json b/products/ASC.People/Client/public/locales/de/ChangePhoneDialog.json index 439548a7ff..a15306534d 100644 --- a/products/ASC.People/Client/public/locales/de/ChangePhoneDialog.json +++ b/products/ASC.People/Client/public/locales/de/ChangePhoneDialog.json @@ -1,4 +1,5 @@ { + "ChangePhoneInstructionSent": "Die Anweisungen zum Telefonwechsel wurden erfolgreich gesendet", "MobilePhoneChangeTitle": "Mobiltelefon ändern", "MobilePhoneEraseDescription": "Die Hinweise zum Ändern der Mobilnummer des Benutzers werden an die E-Mail-Adresse gesendet" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/de/DeleteProfileEverDialog.json b/products/ASC.People/Client/public/locales/de/DeleteProfileEverDialog.json index 1aaff14c7c..a641a81cc9 100644 --- a/products/ASC.People/Client/public/locales/de/DeleteProfileEverDialog.json +++ b/products/ASC.People/Client/public/locales/de/DeleteProfileEverDialog.json @@ -1,6 +1,5 @@ { - "Confirmation": "Bestätigung", "DeleteUserConfirmation": "{{userCaption}} {{user}} wird gelöscht.", "DeleteUserDataConfirmation": "Freigegebene Dokumente dieses Benutzers werden gelöscht. Um dies zu vermeiden, weisen Sie Daten neu zu.", "SuccessfullyDeleteUserInfoMessage": "Der Benutzer wurde erfolgreich gelöscht" -} \ No newline at end of file +} diff --git a/products/ASC.People/Client/public/locales/de/Home.json b/products/ASC.People/Client/public/locales/de/Home.json index 4e29b7ab9e..4391218961 100644 --- a/products/ASC.People/Client/public/locales/de/Home.json +++ b/products/ASC.People/Client/public/locales/de/Home.json @@ -1,20 +1,20 @@ -{ - "Administrator": "Administrator", - "ChangeToGuest": "Zu {{guestCaption}} ändern", - "ChangeToUser": "Zu {{userCaption}} ändern", - "EmptyGroupDescription": "Sie können neue Teammitglieder manuell oder über den Link einladen.", - "EmptyGroupTitle": "Keine Teammitglieder hier", - "LblInviteAgain": "Erneut einladen", - "LblInvited": "Eingeladen", - "LblOther": "Sonstiges", - "LblSendEmail": "E-Mail senden", - "LblSendMessage": "Nachricht senden", - "LblSetActive": "Aktivieren", - "LblSetDisabled": "Deaktivieren", - "MakeInvitationLink": "Einladungslink erstellen", - "MessageEmailActivationInstuctionsSentOnEmail": "Anleitungen zur Änderung eines Passworts wurden an <1>{{email}} gesendt", - "NotFoundDescription": "Ändern oder entfernen Sie Filterungsoptionen, um alle Personen im Bereich zu sehen.", - "NotFoundTitle": "Keine Teammitglieder gefunden", - "SuccessfullyRemovedGroup": "Die Gruppe wurde erfolgreich entfernt", - "UserStatus": "Status" +{ + "Administrator": "Administrator", + "ChangeToGuest": "Zu {{guestCaption}} ändern", + "ChangeToUser": "Zu {{userCaption}} ändern", + "EmptyGroupDescription": "Sie können neue Teammitglieder manuell oder über den Link einladen.", + "EmptyGroupTitle": "Keine Teammitglieder hier", + "LblInviteAgain": "Erneut einladen", + "LblInvited": "Eingeladen", + "LblOther": "Sonstiges", + "LblSendEmail": "E-Mail senden", + "LblSendMessage": "Nachricht senden", + "LblSetActive": "Aktivieren", + "LblSetDisabled": "Deaktivieren", + "MakeInvitationLink": "Einladungslink erstellen", + "MessageEmailActivationInstuctionsSentOnEmail": "Anleitungen zur Änderung eines Passworts wurden an <1>{{email}} gesendt", + "NotFoundDescription": "Ändern oder entfernen Sie Filterungsoptionen, um alle Personen im Bereich zu sehen.", + "NotFoundTitle": "Keine Teammitglieder gefunden", + "SuccessfullyRemovedGroup": "Die Gruppe wurde erfolgreich entfernt", + "UserStatus": "Status" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/de/Profile.json b/products/ASC.People/Client/public/locales/de/Profile.json index 34f9a776b5..00d035e3d3 100644 --- a/products/ASC.People/Client/public/locales/de/Profile.json +++ b/products/ASC.People/Client/public/locales/de/Profile.json @@ -1,12 +1,21 @@ { "ChangeEmailSuccess": "E-Mail wurde erfolgreich geändert", "ChangesApplied": "Die Änderungen wurden übernommen", + "Connect": "Verbinden", "ContactInformation": "Kontaktdaten", + "CountCodesRemaining": "Codes übrig", + "Disconnect": "Trennen Sie die Verbindung", "EditPhoto": "Bild bearbeiten", "EditSubscriptionsBtn": "Abonnements bearbeiten", "EditUser": "Profil bearbeiten", "InviteAgainLbl": "Erneut einladen", + "LoginSettings": "Login-Einstellungen", "MessageEmailActivationInstuctionsSentOnEmail": "Die Hinweise für die Aktivierung wurden an {{ email }} versandt.", "PhoneLbl": "Telefon", - "Subscriptions": "Abonnements" -} + "ProviderSuccessfullyConnected": "Anbieter erfolgreich verbunden", + "ProviderSuccessfullyDisconnected": "Anbieter erfolgreich getrennt", + "ShowBackupCodes": "Back-up-Codes anzeigen", + "Subscriptions": "Abonnements", + "TfaLoginSettings": "Login-Einstellungen", + "TwoFactorDescription": "Zwei-Faktor-Authentifizierung über eine App für Generierung von Codes wurde für alle aktiviert." +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/de/ProfileAction.json b/products/ASC.People/Client/public/locales/de/ProfileAction.json index e7e84f3e22..88c7bc0dd2 100644 --- a/products/ASC.People/Client/public/locales/de/ProfileAction.json +++ b/products/ASC.People/Client/public/locales/de/ProfileAction.json @@ -7,10 +7,13 @@ "ChangeButton": "Ändern", "ChangesSavedSuccessfully": "Änderungen wurden gespeichert", "ContactInformation": "Kontaktdaten", + "CopiedResourceText": "Kopiert", "CustomCreation": "{{user}} (Erstellung)", "EditPhoto": "Bild bearbeiten", "EditUserDialogTitle": "Profil bearbeiten", "EmailPopupHelper": "Die Haupt-E-Mail-Adresse wird für Benachrichtigungen und Zugriffswiederherstellung benutzt. <1> Sie können in dieser Domain eine neue E-Mail für den Benutzer erstellen und ein Einmalkennwort für die erste Anmeldung festlegen.", + "ErrorInvalidUserLastName": "Ungültiger Nachname", + "ErrorInvalidUserFirstName": "Ungültiger Vorname", "FirstName": "Vorname", "Message": "Chat", "ProductsAndInstruments_Products": "Module", @@ -19,7 +22,5 @@ "TemporaryPassword": "Vorübergehendes Kennwort", "TermsOfUsePopupHelperLink": "Erfahren Sie mehr über die Nutzungsbedingungen", "UpdatingProcess": "Wird aktualisiert...", - "WriteComment": "Kommentar hinzufügen", - "ErrorInvalidUserLastName": "Ungültiger Nachname", - "ErrorInvalidUserFirstName": "Ungültiger Vorname" + "WriteComment": "Kommentar hinzufügen" } diff --git a/products/ASC.People/Client/public/locales/de/ResetApplicationDialog.json b/products/ASC.People/Client/public/locales/de/ResetApplicationDialog.json new file mode 100644 index 0000000000..ad76a5de0d --- /dev/null +++ b/products/ASC.People/Client/public/locales/de/ResetApplicationDialog.json @@ -0,0 +1,4 @@ +{ + "ResetApplicationDescription": "Die Konfiguration der Authentifiktionsanwendung wird zurückgesetzt.", + "ResetApplicationTitle": "Konfiguration der Anwendung zurücksetzen" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/de/Translations.json b/products/ASC.People/Client/public/locales/de/Translations.json index 3dd1dbf4f1..07dbbb928a 100644 --- a/products/ASC.People/Client/public/locales/de/Translations.json +++ b/products/ASC.People/Client/public/locales/de/Translations.json @@ -1,29 +1,30 @@ -{ - "AddMembers": "Mitglieder hinzufügen", - "Comments": "Kommentare", - "DeleteSelfProfile": "Profil löschen", - "DisabledEmployeeStatus": "Deaktiviert", - "DisableUserButton": "Deaktivieren", - "EmailChangeButton": "E-Mail-Adresse ändern", - "EnableUserButton": "Aktivieren", - "ErrorUnknownFileImageType": "Unbekannter Bilddateityp", - "FemaleSexStatus": "Weiblich", - "InviteLinkTitle": "Einladungslink", - "LDAPLbl": "LDAP", - "Location": "Standort", - "MaleSexStatus": "Männlich", - "maxSizeFileError": "Maximale Dateigröße überschritten", - "NotBeUndone": "Dies kann nicht rückgängig gemacht werden.", - "orDropFileHereLabel": "oder legen Sie eine Datei hier ab", - "PasswordChangeButton": "Kennwort ändern", - "PendingTitle": "Ausstehend", - "ReassignData": "Daten erneut zuweisen", - "RemoveData": "Persönliche Daten löschen", - "selectNewPhotoLabel": "Neues Foto auswählen", - "SendInviteAgain": "Einladung erneut senden", - "Sex": "Geschlecht", - "SocialProfiles": "Soziale Profile", - "SuccessChangeUserStatus": "Der Benutzerstatus war erfolgreich geändert", - "SuccessSentInvitation": "Die Einladung wurde erfolgreich gesendet", - "Birthdate": "Geburtsdatum" -} +{ + "AddMembers": "Mitglieder hinzufügen", + "Birthdate": "Geburtsdatum", + "Comments": "Kommentare", + "DeleteSelfProfile": "Profil löschen", + "DisabledEmployeeStatus": "Deaktiviert", + "DisableUserButton": "Deaktivieren", + "EmailChangeButton": "E-Mail-Adresse ändern", + "EnableUserButton": "Aktivieren", + "ErrorUnknownFileImageType": "Unbekannter Bilddateityp", + "FemaleSexStatus": "Weiblich", + "InviteLinkTitle": "Einladungslink", + "LDAPLbl": "LDAP", + "Location": "Standort", + "MaleSexStatus": "Männlich", + "maxSizeFileError": "Maximale Dateigröße überschritten", + "NotBeUndone": "Dies kann nicht rückgängig gemacht werden.", + "orDropFileHereLabel": "oder legen Sie eine Datei hier ab", + "PasswordChangeButton": "Kennwort ändern", + "PendingTitle": "Ausstehend", + "ReassignData": "Daten erneut zuweisen", + "RemoveData": "Persönliche Daten löschen", + "selectNewPhotoLabel": "Neues Foto auswählen", + "SendInviteAgain": "Einladung erneut senden", + "Sex": "Geschlecht", + "SocialProfiles": "Soziale Profile", + "SuccessChangeUserStatus": "Der Benutzerstatus war erfolgreich geändert", + "SuccessDeletePersonalData": "Alle persönlichen Daten wurden erfolgreich gelöscht", + "SuccessSentInvitation": "Die Einladung wurde erfolgreich gesendet" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/en/Article.json b/products/ASC.People/Client/public/locales/en/Article.json index 50a7cd909f..186f8344d3 100644 --- a/products/ASC.People/Client/public/locales/en/Article.json +++ b/products/ASC.People/Client/public/locales/en/Article.json @@ -1,4 +1,4 @@ -{ - "ImportPeople": "Import people", - "SendInvitesAgain": "Send invitations once again" +{ + "ImportPeople": "Import people", + "SendInvitesAgain": "Send invitations once again" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/en/BackupCodesDialog.json b/products/ASC.People/Client/public/locales/en/BackupCodesDialog.json index 19e7dd5566..f5d8df7dd3 100644 --- a/products/ASC.People/Client/public/locales/en/BackupCodesDialog.json +++ b/products/ASC.People/Client/public/locales/en/BackupCodesDialog.json @@ -1,8 +1,8 @@ -{ - "BackupCodesTitle": "Backup codes", - "BackupCodesDescription": "Backup codes allow you to confirm login when you don't have access to your phone.", - "BackupCodesSecondDescription": "Each code can be used only one time. You can get new codes anytime. Only codes which was generated last are valid.", - "CodesCounter": "codes:", - "PrintButton": "Print", - "RequestNewButton": "Request new" -} +{ + "BackupCodesDescription": "Use backup codes to sign in when you don't have access to your phone.", + "BackupCodesSecondDescription": "Each code can be used once. You can get new codes anytime. Only codes which were generated last are valid.", + "BackupCodesTitle": "Backup codes", + "CodesCounter": "codes:", + "PrintButton": "Print", + "RequestNewButton": "Request new" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/en/ChangeEmailDialog.json b/products/ASC.People/Client/public/locales/en/ChangeEmailDialog.json index ed0e06359c..15f389d56b 100644 --- a/products/ASC.People/Client/public/locales/en/ChangeEmailDialog.json +++ b/products/ASC.People/Client/public/locales/en/ChangeEmailDialog.json @@ -2,7 +2,7 @@ "DomainIpAddress": "Domains as IP address are not supported", "EmailActivationDescription": "The activation instructions will be sent to the entered email", "EmailChangeTitle": "Email change", - "EmptyEmail": "No one email parsed", + "EmptyEmail": "No email parsed", "EnterEmail": "Enter a new email address", "IncorrectDomain": "Incorrect domain", "IncorrectEmail": "Incorrect email", diff --git a/products/ASC.People/Client/public/locales/en/ChangePhoneDialog.json b/products/ASC.People/Client/public/locales/en/ChangePhoneDialog.json index 90ceee8a42..ca5828ee71 100644 --- a/products/ASC.People/Client/public/locales/en/ChangePhoneDialog.json +++ b/products/ASC.People/Client/public/locales/en/ChangePhoneDialog.json @@ -1,5 +1,5 @@ { + "ChangePhoneInstructionSent": "The phone change instructions have been successfully sent", "MobilePhoneChangeTitle": "Change mobile phone", - "MobilePhoneEraseDescription": "The instructions on how to change the user mobile number will be sent to the user email address", - "ChangePhoneInstructionSent": "The phone change instructions have been successfully sent" + "MobilePhoneEraseDescription": "The instructions on how to change the user mobile number will be sent to the user email address" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/en/DeleteProfileEverDialog.json b/products/ASC.People/Client/public/locales/en/DeleteProfileEverDialog.json index 53a51cde6f..2168fe324a 100644 --- a/products/ASC.People/Client/public/locales/en/DeleteProfileEverDialog.json +++ b/products/ASC.People/Client/public/locales/en/DeleteProfileEverDialog.json @@ -1,6 +1,5 @@ { - "Confirmation": "Confirmation", "DeleteUserConfirmation": "{{userCaption}} {{user}} will be deleted.", "DeleteUserDataConfirmation": "User documents shared with others will be deleted. To avoid this, reassign data.", "SuccessfullyDeleteUserInfoMessage": "The user has been successfully deleted" -} \ No newline at end of file +} diff --git a/products/ASC.People/Client/public/locales/en/DeleteSelfProfileDialog.json b/products/ASC.People/Client/public/locales/en/DeleteSelfProfileDialog.json index 9a819f8ebf..2ac340aa11 100644 --- a/products/ASC.People/Client/public/locales/en/DeleteSelfProfileDialog.json +++ b/products/ASC.People/Client/public/locales/en/DeleteSelfProfileDialog.json @@ -1,4 +1,4 @@ { "DeleteProfileInfo": "Send the profile deletion instructions to the email address", "DeleteProfileTitle": "Delete profile dialog" -} +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/en/Home.json b/products/ASC.People/Client/public/locales/en/Home.json index ad8b8f95ff..f3c4d6f6ef 100644 --- a/products/ASC.People/Client/public/locales/en/Home.json +++ b/products/ASC.People/Client/public/locales/en/Home.json @@ -1,20 +1,20 @@ -{ - "Administrator": "Administrator", - "ChangeToGuest": "Change to {{guestCaption}}", - "ChangeToUser": "Change to {{userCaption}}", - "EmptyGroupDescription": "You can add new team members manually or invite them via link.", - "EmptyGroupTitle": "No teammates here yet", - "LblInviteAgain": "Invite again", - "LblInvited": "Invited", - "LblOther": "Other", - "LblSendEmail": "Send email", - "LblSendMessage": "Send message", - "LblSetActive": "Set active", - "LblSetDisabled": "Set disabled", - "MakeInvitationLink": "Create invitation link", - "MessageEmailActivationInstuctionsSentOnEmail": "The email activation instructions have been sent to the <1>{{email}} email address", - "NotFoundDescription": "Try a different filter or clear it to view all people in the section.", - "NotFoundTitle": "No teammates found", - "SuccessfullyRemovedGroup": "Group has been removed successfully", - "UserStatus": "Status" +{ + "Administrator": "Administrator", + "ChangeToGuest": "Change to {{guestCaption}}", + "ChangeToUser": "Change to {{userCaption}}", + "EmptyGroupDescription": "You can add new team members manually or invite them via link.", + "EmptyGroupTitle": "No teammates here yet", + "LblInviteAgain": "Invite again", + "LblInvited": "Invited", + "LblOther": "Other", + "LblSendEmail": "Send email", + "LblSendMessage": "Send message", + "LblSetActive": "Set active", + "LblSetDisabled": "Set disabled", + "MakeInvitationLink": "Create invitation link", + "MessageEmailActivationInstuctionsSentOnEmail": "The email activation instructions have been sent to the <1>{{email}} email address", + "NotFoundDescription": "Try a different filter or clear it to view all people in the section.", + "NotFoundTitle": "No teammates found", + "SuccessfullyRemovedGroup": "Group has been removed successfully", + "UserStatus": "Status" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/en/Profile.json b/products/ASC.People/Client/public/locales/en/Profile.json index 87c10ea5f6..0481afc81a 100644 --- a/products/ASC.People/Client/public/locales/en/Profile.json +++ b/products/ASC.People/Client/public/locales/en/Profile.json @@ -1,22 +1,21 @@ -{ - "ChangeEmailSuccess": "Email has been changed successfully ", - "ChangesApplied": "Changes are applied", - "Connect": "Connect", - "ContactInformation": "Contact Information", - "Disconnect": "Disconnect", - "EditPhoto": "Edit photo", - "EditSubscriptionsBtn": "Edit subscriptions", - "EditUser": "Edit profile", - "InviteAgainLbl": "Invite again", - "LoginSettings": "Login settings", - "MessageEmailActivationInstuctionsSentOnEmail": "The email activation instructions have been sent to the {{ email }} email address", - "PhoneLbl": "Phone", - "ProviderSuccessfullyConnected": "Provider successfully connected", - "ProviderSuccessfullyDisconnected": "Provider successfully disconnected", - "Subscriptions": "Subscriptions", - - "TwoFactorDescription": "Two-factor authentication via code generating application was enabled for all users by cloud service administrator.", - "ShowBackupCodes": "Show backup codes", - "CountCodesRemaining": "codes remaining", - "TfaLoginSettings": "Login settings" -} +{ + "ChangeEmailSuccess": "Email has been changed successfully ", + "ChangesApplied": "Changes are applied", + "Connect": "Connect", + "ContactInformation": "Contact Information", + "CountCodesRemaining": "codes remaining", + "Disconnect": "Disconnect", + "EditPhoto": "Edit photo", + "EditSubscriptionsBtn": "Edit subscriptions", + "EditUser": "Edit profile", + "InviteAgainLbl": "Invite again", + "LoginSettings": "Login settings", + "MessageEmailActivationInstuctionsSentOnEmail": "The email activation instructions have been sent to the {{ email }} email address", + "PhoneLbl": "Phone", + "ProviderSuccessfullyConnected": "Provider successfully connected", + "ProviderSuccessfullyDisconnected": "Provider successfully disconnected", + "ShowBackupCodes": "Show backup codes", + "Subscriptions": "Subscriptions", + "TfaLoginSettings": "Login settings", + "TwoFactorDescription": "Two-factor authentication via a code-generating app was enabled for all users by the admin." +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/en/ProfileAction.json b/products/ASC.People/Client/public/locales/en/ProfileAction.json index adc9ca48f0..880c414782 100644 --- a/products/ASC.People/Client/public/locales/en/ProfileAction.json +++ b/products/ASC.People/Client/public/locales/en/ProfileAction.json @@ -12,6 +12,8 @@ "EditPhoto": "Edit Photo", "EditUserDialogTitle": "Edit profile", "EmailPopupHelper": "The main email is used for notifications and restoring access. <1> You can create a new email on this domain for the user and set a one-time password for the first login.", + "ErrorInvalidUserFirstName": "Invalid first name", + "ErrorInvalidUserLastName": "Invalid last name", "FirstName": "First Name", "Message": "Talk", "ProductsAndInstruments_Products": "Modules", @@ -20,7 +22,5 @@ "TemporaryPassword": "Temporary password", "TermsOfUsePopupHelperLink": "Read more about terms of use", "UpdatingProcess": "Updating...", - "WriteComment": "Add comment", - "ErrorInvalidUserLastName": "Invalid last name", - "ErrorInvalidUserFirstName": "Invalid first name" + "WriteComment": "Add comment" } diff --git a/products/ASC.People/Client/public/locales/en/ResetApplicationDialog.json b/products/ASC.People/Client/public/locales/en/ResetApplicationDialog.json index 1fdf2b217c..e64d199b32 100644 --- a/products/ASC.People/Client/public/locales/en/ResetApplicationDialog.json +++ b/products/ASC.People/Client/public/locales/en/ResetApplicationDialog.json @@ -1,4 +1,4 @@ -{ - "ResetApplicationTitle": "Reset application configuration", - "ResetApplicationDescription": "Authenticator application configuration will be reset." -} +{ + "ResetApplicationDescription": "Authenticator application configuration will be reset.", + "ResetApplicationTitle": "Reset application configuration" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/en/Translations.json b/products/ASC.People/Client/public/locales/en/Translations.json index a6fd9c6b20..2fc0b91030 100644 --- a/products/ASC.People/Client/public/locales/en/Translations.json +++ b/products/ASC.People/Client/public/locales/en/Translations.json @@ -1,30 +1,30 @@ -{ - "AddMembers": "Add members", - "Comments": "Comments", - "DeleteSelfProfile": "Delete profile", - "DisabledEmployeeStatus": "Disabled", - "DisableUserButton": "Disable", - "EmailChangeButton": "Change email", - "EnableUserButton": "Enable", - "ErrorUnknownFileImageType": "Unknown image file type", - "FemaleSexStatus": "Female", - "InviteLinkTitle": "Invitation link", - "LDAPLbl": "LDAP", - "Location": "Location", - "MaleSexStatus": "Male", - "maxSizeFileError": "Maximum file size exceeded", - "NotBeUndone": "Note: this action can't be undone.", - "orDropFileHereLabel": "or drop a file here", - "PasswordChangeButton": "Change password", - "PendingTitle": "Pending", - "ReassignData": "Reassign data", - "RemoveData": "Delete personal data", - "selectNewPhotoLabel": "Select new photo", - "SendInviteAgain": "Send invitation once again", - "Sex": "Sex", - "SocialProfiles": "Social profiles", - "SuccessChangeUserStatus": "The user status was successfully changed", - "SuccessSentInvitation": "The invitation was successfully sent", - "SuccessDeletePersonalData": "Personal data has been successfully deleted", - "Birthdate": "Date of birth" -} +{ + "AddMembers": "Add members", + "Birthdate": "Date of birth", + "Comments": "Comments", + "DeleteSelfProfile": "Delete profile", + "DisabledEmployeeStatus": "Disabled", + "DisableUserButton": "Disable", + "EmailChangeButton": "Change email", + "EnableUserButton": "Enable", + "ErrorUnknownFileImageType": "Unknown image file type", + "FemaleSexStatus": "Female", + "InviteLinkTitle": "Invitation link", + "LDAPLbl": "LDAP", + "Location": "Location", + "MaleSexStatus": "Male", + "maxSizeFileError": "Maximum file size exceeded", + "NotBeUndone": "Note: this action can't be undone.", + "orDropFileHereLabel": "or drop a file here", + "PasswordChangeButton": "Change password", + "PendingTitle": "Pending", + "ReassignData": "Reassign data", + "RemoveData": "Delete personal data", + "selectNewPhotoLabel": "Select new photo", + "SendInviteAgain": "Send invitation once again", + "Sex": "Sex", + "SocialProfiles": "Social profiles", + "SuccessChangeUserStatus": "The user status was successfully changed", + "SuccessDeletePersonalData": "Personal data has been successfully deleted", + "SuccessSentInvitation": "The invitation was successfully sent" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/Article.json b/products/ASC.People/Client/public/locales/fr/Article.json index 1211a8aa77..4e6d489856 100644 --- a/products/ASC.People/Client/public/locales/fr/Article.json +++ b/products/ASC.People/Client/public/locales/fr/Article.json @@ -1,3 +1,4 @@ -{ - "ImportPeople": "Importer une personne" +{ + "ImportPeople": "Importer une personne", + "SendInvitesAgain": "Envoyer les nouvelles invitations" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/BackupCodesDialog.json b/products/ASC.People/Client/public/locales/fr/BackupCodesDialog.json new file mode 100644 index 0000000000..7317129fc2 --- /dev/null +++ b/products/ASC.People/Client/public/locales/fr/BackupCodesDialog.json @@ -0,0 +1,8 @@ +{ + "BackupCodesDescription": "Utilisez des codes de sauvegarde pour vous connecter lorsque vous n'avez pas accès à votre téléphone.", + "BackupCodesSecondDescription": "Chaque code peut être utilisé une fois. Vous pouvez obtenir de nouveaux codes à tout moment. Seuls les codes générés en dernier sont valables.", + "BackupCodesTitle": "Codes de sauvegarde", + "CodesCounter": "Codes:", + "PrintButton": "Imprimer", + "RequestNewButton": "Demander de nouvelles" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/ChangeEmailDialog.json b/products/ASC.People/Client/public/locales/fr/ChangeEmailDialog.json index ef1f2cef8b..8af2d9264a 100644 --- a/products/ASC.People/Client/public/locales/fr/ChangeEmailDialog.json +++ b/products/ASC.People/Client/public/locales/fr/ChangeEmailDialog.json @@ -1,17 +1,17 @@ -{ - "DomainIpAddress": "Les domaines sous forme d'adresse IP ne sont pas pris en charge", - "EmailActivationDescription": "Les instructions d'activation seront envoyées à l'adresse indiquée", - "EmailChangeTitle": "Changement d'adresse email", - "EmptyEmail": "Aucun e-mail n'a été analysé", - "EnterEmail": "Entrer une nouvelle adresse email", - "IncorrectDomain": "Domaine incorrecte ", - "IncorrectEmail": "Adresse email non valide", - "IncorrectLocalPart": "Pièce locale incorrecte", - "LocalDomain": "Les domaines local ne sont pas supportés", - "ManyEmails": "Trop d'e-mails à analyser", - "MaxLengthExceeded": "La longueur maximale d'un nom d'utilisateur ou d'une autre partie locale est de 64 caractères.", - "PunycodeDomain": "Les domaines Punycode ne sont pas supportés", - "PunycodeLocalPart": "Une partie locale en Punycode n'est pas prise en charge", - "SameEmail": "Vous ne pouvez pas utiliser la même adresse e-mail", - "SpacesInLocalPart": "Le local ne peux pas contenir d'espace" +{ + "DomainIpAddress": "Les domaines sous forme d'adresse IP ne sont pas pris en charge", + "EmailActivationDescription": "Les instructions d'activation seront envoyées à l'adresse indiquée", + "EmailChangeTitle": "Changement d'adresse email", + "EmptyEmail": "Aucun e-mail n'a été analysé", + "EnterEmail": "Entrer une nouvelle adresse email", + "IncorrectDomain": "Domaine incorrecte ", + "IncorrectEmail": "Adresse email non valide", + "IncorrectLocalPart": "Pièce locale incorrecte", + "LocalDomain": "Les domaines local ne sont pas supportés", + "ManyEmails": "Trop d'e-mails à analyser", + "MaxLengthExceeded": "La longueur maximale d'un nom d'utilisateur ou d'une autre partie locale est de 64 caractères.", + "PunycodeDomain": "Les domaines Punycode ne sont pas supportés", + "PunycodeLocalPart": "Une partie locale en Punycode n'est pas prise en charge", + "SameEmail": "Vous ne pouvez pas utiliser la même adresse e-mail", + "SpacesInLocalPart": "Le local ne peux pas contenir d'espace" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/ChangePasswordDialog.json b/products/ASC.People/Client/public/locales/fr/ChangePasswordDialog.json index ee16f5f21a..e76eeac61f 100644 --- a/products/ASC.People/Client/public/locales/fr/ChangePasswordDialog.json +++ b/products/ASC.People/Client/public/locales/fr/ChangePasswordDialog.json @@ -1,4 +1,4 @@ -{ - "MessageSendPasswordChangeInstructionsOnEmail": "Envoyer le mot de passe.", - "PasswordChangeTitle": "Changement de mot de passe" +{ + "MessageSendPasswordChangeInstructionsOnEmail": "Envoyer le mot de passe.", + "PasswordChangeTitle": "Changement de mot de passe" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/ChangePhoneDialog.json b/products/ASC.People/Client/public/locales/fr/ChangePhoneDialog.json index 46ee127dd2..00d1374614 100644 --- a/products/ASC.People/Client/public/locales/fr/ChangePhoneDialog.json +++ b/products/ASC.People/Client/public/locales/fr/ChangePhoneDialog.json @@ -1,4 +1,5 @@ -{ - "MobilePhoneChangeTitle": "Changer le téléphone mobile", - "MobilePhoneEraseDescription": "Les instructions pour modifier le numéro de téléphone portable de l'utilisateur seront envoyées à l'adresse e-mail de l'utilisateur" +{ + "ChangePhoneInstructionSent": "Les instructions de changement de téléphone ont été envoyées avec succès", + "MobilePhoneChangeTitle": "Changer le téléphone mobile", + "MobilePhoneEraseDescription": "Les instructions pour modifier le numéro de téléphone portable de l'utilisateur seront envoyées à l'adresse e-mail de l'utilisateur" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/ChangeUserStatusDialog.json b/products/ASC.People/Client/public/locales/fr/ChangeUserStatusDialog.json index bc84699263..578f628343 100644 --- a/products/ASC.People/Client/public/locales/fr/ChangeUserStatusDialog.json +++ b/products/ASC.People/Client/public/locales/fr/ChangeUserStatusDialog.json @@ -1,8 +1,8 @@ -{ - "ChangeUsersActiveStatus": "Désactivé", - "ChangeUsersDisableStatus": "Activé", - "ChangeUsersStatusButton": "Modifier le statut de l'utilisateur", - "ChangeUserStatusDialog": "Les utilisateurs avec le statut '{{ status }}' seront désactivés", - "ChangeUserStatusDialogHeader": "Modifier le statut de l'utilisateur", - "ChangeUserStatusDialogMessage": "Vous ne pouvez pas changer le statut du propriétaire du portail ainsi que votre statut" +{ + "ChangeUsersActiveStatus": "Désactivé", + "ChangeUsersDisableStatus": "Activé", + "ChangeUsersStatusButton": "Modifier le statut de l'utilisateur", + "ChangeUserStatusDialog": "Les utilisateurs avec le statut '{{ status }}' seront désactivés", + "ChangeUserStatusDialogHeader": "Modifier le statut de l'utilisateur", + "ChangeUserStatusDialogMessage": "Vous ne pouvez pas changer le statut du propriétaire du portail ainsi que votre statut" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/ChangeUserTypeDialog.json b/products/ASC.People/Client/public/locales/fr/ChangeUserTypeDialog.json index 94e52caee0..4c5395e874 100644 --- a/products/ASC.People/Client/public/locales/fr/ChangeUserTypeDialog.json +++ b/products/ASC.People/Client/public/locales/fr/ChangeUserTypeDialog.json @@ -1,7 +1,7 @@ -{ - "ChangeUserTypeButton": "Modifier le type", - "ChangeUserTypeHeader": "Changer le type d'utilisateur", - "ChangeUserTypeMessage": "Les utilisateurs du type '{{ firstType }}' seront transférés vers le type '{{ secondType }}'.", - "ChangeUserTypeMessageWarning": "Vous ne pouvez pas changer le type pour le propriétaire du portail ainsi que pour vous même", - "SuccessChangeUserType": "Le type de l'utilisateur a été modifié avec succès" +{ + "ChangeUserTypeButton": "Modifier le type", + "ChangeUserTypeHeader": "Changer le type d'utilisateur", + "ChangeUserTypeMessage": "Les utilisateurs du type '{{ firstType }}' seront transférés vers le type '{{ secondType }}'.", + "ChangeUserTypeMessageWarning": "Vous ne pouvez pas changer le type pour le propriétaire du portail ainsi que pour vous même", + "SuccessChangeUserType": "Le type de l'utilisateur a été modifié avec succès" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/DataLossWarningDialog.json b/products/ASC.People/Client/public/locales/fr/DataLossWarningDialog.json index d245272829..059df50498 100644 --- a/products/ASC.People/Client/public/locales/fr/DataLossWarningDialog.json +++ b/products/ASC.People/Client/public/locales/fr/DataLossWarningDialog.json @@ -1,5 +1,5 @@ -{ - "DataLossWarningBody": "Vos changements pourraient ne pas être sauvegardés.", - "DataLossWarningHeader": "Quitter la page ?", - "DataLossWarningLeaveBtn": "Départ" +{ + "DataLossWarningBody": "Vos changements pourraient ne pas être sauvegardés.", + "DataLossWarningHeader": "Quitter la page ?", + "DataLossWarningLeaveBtn": "Départ" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/DeleteProfileEverDialog.json b/products/ASC.People/Client/public/locales/fr/DeleteProfileEverDialog.json index 9c6e6f1190..187a647ebf 100644 --- a/products/ASC.People/Client/public/locales/fr/DeleteProfileEverDialog.json +++ b/products/ASC.People/Client/public/locales/fr/DeleteProfileEverDialog.json @@ -1,6 +1,5 @@ -{ - "Confirmation": "Confirmation", - "DeleteUserConfirmation": "{{userCaption}} {{user}} sera supprimé.", - "DeleteUserDataConfirmation": "Les documents de l'utilisateur partagés avec d'autres seront supprimés. Pour éviter cela, réaffectez les données.", - "SuccessfullyDeleteUserInfoMessage": "L'utilisateur a été supprimé avec succès" -} \ No newline at end of file +{ + "DeleteUserConfirmation": "{{userCaption}} {{user}} sera supprimé.", + "DeleteUserDataConfirmation": "Les documents de l'utilisateur partagés avec d'autres seront supprimés. Pour éviter cela, réaffectez les données.", + "SuccessfullyDeleteUserInfoMessage": "L'utilisateur a été supprimé avec succès" +} diff --git a/products/ASC.People/Client/public/locales/fr/DeleteSelfProfileDialog.json b/products/ASC.People/Client/public/locales/fr/DeleteSelfProfileDialog.json index 09939707d1..f28e79de68 100644 --- a/products/ASC.People/Client/public/locales/fr/DeleteSelfProfileDialog.json +++ b/products/ASC.People/Client/public/locales/fr/DeleteSelfProfileDialog.json @@ -1,4 +1,4 @@ -{ - "DeleteProfileInfo": "Envoyer les instructions de suppression du profil à l'adresse email", - "DeleteProfileTitle": "Boîte de dialogue Supprimer le profil" +{ + "DeleteProfileInfo": "Envoyer les instructions de suppression du profil à l'adresse email", + "DeleteProfileTitle": "Boîte de dialogue Supprimer le profil" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/DeleteUsersDialog.json b/products/ASC.People/Client/public/locales/fr/DeleteUsersDialog.json index 555d7039e5..6bfd76fb1b 100644 --- a/products/ASC.People/Client/public/locales/fr/DeleteUsersDialog.json +++ b/products/ASC.People/Client/public/locales/fr/DeleteUsersDialog.json @@ -1,6 +1,6 @@ -{ - "DeleteGroupUsersMessage": "Les utilisateurs désactivés sélectionnés seront supprimés", - "DeleteGroupUsersMessageHeader": "Supprimer les utilisateurs du portail", - "DeleteGroupUsersSuccessMessage": "Les utilisateurs ont été supprimés avec succès.", - "DeleteUserDataConfirmation": "Les documents de l'utilisateur partagés avec d'autres seront supprimés. Pour éviter cela, réaffectez les données." +{ + "DeleteGroupUsersMessage": "Les utilisateurs désactivés sélectionnés seront supprimés", + "DeleteGroupUsersMessageHeader": "Supprimer les utilisateurs du portail", + "DeleteGroupUsersSuccessMessage": "Les utilisateurs ont été supprimés avec succès.", + "DeleteUserDataConfirmation": "Les documents de l'utilisateur partagés avec d'autres seront supprimés. Pour éviter cela, réaffectez les données." } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/GroupAction.json b/products/ASC.People/Client/public/locales/fr/GroupAction.json index 03b696c2c5..7d2f16844a 100644 --- a/products/ASC.People/Client/public/locales/fr/GroupAction.json +++ b/products/ASC.People/Client/public/locales/fr/GroupAction.json @@ -1,7 +1,8 @@ -{ - "CustomNewDepartment": "{{groupCaption}} (création)", - "GroupAction": "Action de groupe", - "Members": "Membres", - "SearchAddedMembers": "Rechercher les membres ajoutés", - "SuccessSaveGroup": "{{groupCaption}} '{{ groupName }}' a été sauvegardé avec succès" -} +{ + "CustomNewDepartment": "{{groupCaption}} (création)", + "GroupAction": "Action de groupe", + "Members": "Membres", + "SearchAddedMembers": "Rechercher les membres ajoutés", + "SelectAction": "Sélectionner", + "SuccessSaveGroup": "{{groupCaption}} '{{ groupName }}' a été sauvegardé avec succès" +} diff --git a/products/ASC.People/Client/public/locales/fr/GroupSelector.json b/products/ASC.People/Client/public/locales/fr/GroupSelector.json index f4e5dfa93e..a45a59df3c 100644 --- a/products/ASC.People/Client/public/locales/fr/GroupSelector.json +++ b/products/ASC.People/Client/public/locales/fr/GroupSelector.json @@ -1,6 +1,6 @@ -{ - "AddDepartmentsButtonLabel": "Ajouter un département", - "EmptyOptionsLabel": "Il n'y a pas de départements", - "EmptySearchOptionsLabel": "Pas de départements avec ce nom", - "SearchPlaceholder": "Chercher des groupes" +{ + "AddDepartmentsButtonLabel": "Ajouter un département", + "EmptyOptionsLabel": "Il n'y a pas de départements", + "EmptySearchOptionsLabel": "Pas de départements avec ce nom", + "SearchPlaceholder": "Chercher des groupes" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/Home.json b/products/ASC.People/Client/public/locales/fr/Home.json index 94ce758370..d622f4b473 100644 --- a/products/ASC.People/Client/public/locales/fr/Home.json +++ b/products/ASC.People/Client/public/locales/fr/Home.json @@ -1,20 +1,20 @@ -{ - "Administrator": "Administrateur", - "ChangeToGuest": "Modifier en {{guestCaption}}", - "ChangeToUser": "Modifier en {{userCaption}}", - "EmptyGroupDescription": "Vous pouvez ajouter des membres à l'équipe manuellement ou via un lien.", - "EmptyGroupTitle": "Pas encore de collaborateur ici", - "LblInviteAgain": "Inviter à nouveau", - "LblInvited": "Invité", - "LblOther": "Autre", - "LblSendEmail": "Envoyer message", - "LblSendMessage": "Envoyer message", - "LblSetActive": "Définir comme actif", - "LblSetDisabled": "Définir comme désactivé", - "MakeInvitationLink": "Créer un lien d'invitation", - "MessageEmailActivationInstuctionsSentOnEmail": "Les instructions d'activation ont été envoyées à l'adresse <1>{{email}}", - "NotFoundDescription": "Essayez un autre filtre ou désactivez-le pour afficher toutes les personnes de la section.", - "NotFoundTitle": "Aucun collaborateur trouvé ", - "SuccessfullyRemovedGroup": "Le groupe a été supprimé avec succès.", - "UserStatus": "Status" +{ + "Administrator": "Administrateur", + "ChangeToGuest": "Modifier en {{guestCaption}}", + "ChangeToUser": "Modifier en {{userCaption}}", + "EmptyGroupDescription": "Vous pouvez ajouter des membres à l'équipe manuellement ou via un lien.", + "EmptyGroupTitle": "Pas encore de collaborateur ici", + "LblInviteAgain": "Inviter à nouveau", + "LblInvited": "Invité", + "LblOther": "Autre", + "LblSendEmail": "Envoyer message", + "LblSendMessage": "Envoyer message", + "LblSetActive": "Définir comme actif", + "LblSetDisabled": "Définir comme désactivé", + "MakeInvitationLink": "Créer un lien d'invitation", + "MessageEmailActivationInstuctionsSentOnEmail": "Les instructions d'activation ont été envoyées à l'adresse <1>{{email}}", + "NotFoundDescription": "Essayez un autre filtre ou désactivez-le pour afficher toutes les personnes de la section.", + "NotFoundTitle": "Aucun collaborateur trouvé ", + "SuccessfullyRemovedGroup": "Le groupe a été supprimé avec succès.", + "UserStatus": "Status" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/InviteDialog.json b/products/ASC.People/Client/public/locales/fr/InviteDialog.json index 78529a4138..4fe91f8419 100644 --- a/products/ASC.People/Client/public/locales/fr/InviteDialog.json +++ b/products/ASC.People/Client/public/locales/fr/InviteDialog.json @@ -1,8 +1,8 @@ -{ - "CopyToClipboard": "Copier le lien", - "GetShortenLink": "Obtenir le lien raccourci", - "HelpAnswerLinkInviteSettings": "Partagez le lien pour inviter des collègues à rejoindre votre portail.", - "InviteLinkValidInterval": "Ce lien est valide pendant {{ count }} jours seulement.", - "InviteUsersAsCollaborators": "Ajouter les utilisateurs en tant que {{guestsCaption, lowercase}}", - "LinkCopySuccess": "Le lien a été copié" +{ + "CopyToClipboard": "Copier le lien", + "GetShortenLink": "Obtenir le lien raccourci", + "HelpAnswerLinkInviteSettings": "Partagez le lien pour inviter des collègues à rejoindre votre portail.", + "InviteLinkValidInterval": "Ce lien est valide pendant {{ count }} jours seulement.", + "InviteUsersAsCollaborators": "Ajouter les utilisateurs en tant que {{guestsCaption, lowercase}}", + "LinkCopySuccess": "Le lien a été copié" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/PeopleSelector.json b/products/ASC.People/Client/public/locales/fr/PeopleSelector.json index 6340bcb4b7..8d9d25d41b 100644 --- a/products/ASC.People/Client/public/locales/fr/PeopleSelector.json +++ b/products/ASC.People/Client/public/locales/fr/PeopleSelector.json @@ -1,6 +1,6 @@ -{ - "CustomAllGroups": "Tous {{ groupsCaption, lowercase }}", - "EmptySearchUsersResult": "Aucun utilisateur avec ce nom", - "EmptyUsers": "Il n'y a pas d'utilisateurs", - "SearchUsersPlaceholder": "Recherche d'utilisateurs" +{ + "CustomAllGroups": "Tous {{ groupsCaption, lowercase }}", + "EmptySearchUsersResult": "Aucun utilisateur avec ce nom", + "EmptyUsers": "Il n'y a pas d'utilisateurs", + "SearchUsersPlaceholder": "Recherche d'utilisateurs" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/Profile.json b/products/ASC.People/Client/public/locales/fr/Profile.json index 43b6701318..88234276d3 100644 --- a/products/ASC.People/Client/public/locales/fr/Profile.json +++ b/products/ASC.People/Client/public/locales/fr/Profile.json @@ -1,11 +1,21 @@ -{ - "ChangeEmailSuccess": "L'adresse E-mail a été modifiée avec succès.", - "ChangesApplied": "Changements appliqués", - "ContactInformation": "Informations de contact", - "EditPhoto": "Modifier la photo", - "EditSubscriptionsBtn": "Modifier les abonnements", - "InviteAgainLbl": "Inviter à nouveau", - "MessageEmailActivationInstuctionsSentOnEmail": "Les instructions d'activation ont été envoyées à l'adresse {{email}}", - "PhoneLbl": "Téléphone", - "Subscriptions": "Abonnements" -} +{ + "ChangeEmailSuccess": "L'adresse E-mail a été modifiée avec succès.", + "ChangesApplied": "Changements appliqués", + "Connect": "Connexion", + "ContactInformation": "Informations de contact", + "CountCodesRemaining": "Codes restants", + "Disconnect": "Déconnecter", + "EditPhoto": "Modifier la photo", + "EditSubscriptionsBtn": "Modifier les abonnements", + "EditUser": "Modifier le profil", + "InviteAgainLbl": "Inviter à nouveau", + "LoginSettings": "Paramètres de connexion", + "MessageEmailActivationInstuctionsSentOnEmail": "Les instructions d'activation ont été envoyées à l'adresse {{email}}", + "PhoneLbl": "Téléphone", + "ProviderSuccessfullyConnected": "Le fournisseur s'est connecté avec succès", + "ProviderSuccessfullyDisconnected": "Le fournisseur est déconnecté avec succès", + "ShowBackupCodes": "Montrer les codes de sauvegarde", + "Subscriptions": "Abonnements", + "TfaLoginSettings": "Paramètres de connexion", + "TwoFactorDescription": "L'authentification à deux facteurs via une application générant des codes a été activée pour tous les utilisateurs par l'administrateur." +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/ProfileAction.json b/products/ASC.People/Client/public/locales/fr/ProfileAction.json index de873977d0..37ebe71a8a 100644 --- a/products/ASC.People/Client/public/locales/fr/ProfileAction.json +++ b/products/ASC.People/Client/public/locales/fr/ProfileAction.json @@ -1,25 +1,26 @@ -{ - "ActivationLink": "Lien d'activation", - "AddContact": "Ajouter un contact", - "AddPhoto": "Ajouter une photo", - "Calendar": "Calendrier", - "CalendarSelectDate": "Sélectionner une date", - "ChangeButton": "Modifier", - "ChangesSavedSuccessfully": "Les modifications ont été appliquées avec succès", - "ContactInformation": "Informations de contact", - "CustomCreation": "{{user}} (création)", - "EditPhoto": "Modifier la photo", - "EditUserDialogTitle": "Modifier profil", - "EmailPopupHelper": "L'adresse mail principal est utilisée pour les notifications et pour la restauration de l'accès. <1> Vous pouvez créer une nouvelle adresse mail sur ce domaine pour cet utilisateur et définir un mot de passe à usage unique pour la première connexion.", - "FirstName": "Prénom", - "Message": "Chat", - "ProductsAndInstruments_Products": "Modules", - "ProfileAction": "Action sur le profil", - "ProfileTypePopupHelper": "Les invités ont l'accès limité aux certaines fonctions du portail et modules", - "TemporaryPassword": "Mot de passe temporaire", - "TermsOfUsePopupHelperLink": "Savoir plus à propos de termes d'utilisation ", - "UpdatingProcess": "Mis à jour...", - "WriteComment": "Ajouter un commentaire", - "ErrorInvalidUserLastName": "Prénom invalide", - "ErrorInvalidUserFirstName": "Nom invalide" -} +{ + "ActivationLink": "Lien d'activation", + "AddContact": "Ajouter un contact", + "AddPhoto": "Ajouter une photo", + "Calendar": "Calendrier", + "CalendarSelectDate": "Sélectionner une date", + "ChangeButton": "Modifier", + "ChangesSavedSuccessfully": "Les modifications ont été appliquées avec succès", + "ContactInformation": "Informations de contact", + "CopiedResourceText": "Copié", + "CustomCreation": "{{user}} (création)", + "EditPhoto": "Modifier la photo", + "EditUserDialogTitle": "Modifier profil", + "EmailPopupHelper": "L'adresse mail principal est utilisée pour les notifications et pour la restauration de l'accès. <1> Vous pouvez créer une nouvelle adresse mail sur ce domaine pour cet utilisateur et définir un mot de passe à usage unique pour la première connexion.", + "ErrorInvalidUserLastName": "Prénom invalide", + "ErrorInvalidUserFirstName": "Nom invalide", + "FirstName": "Prénom", + "Message": "Chat", + "ProductsAndInstruments_Products": "Modules", + "ProfileAction": "Action sur le profil", + "ProfileTypePopupHelper": "Les invités ont l'accès limité aux certaines fonctions du portail et modules", + "TemporaryPassword": "Mot de passe temporaire", + "TermsOfUsePopupHelperLink": "Savoir plus à propos de termes d'utilisation ", + "UpdatingProcess": "Mis à jour...", + "WriteComment": "Ajouter un commentaire" +} diff --git a/products/ASC.People/Client/public/locales/fr/Reassign.json b/products/ASC.People/Client/public/locales/fr/Reassign.json index bc4d23c7e5..a4b150edbb 100644 --- a/products/ASC.People/Client/public/locales/fr/Reassign.json +++ b/products/ASC.People/Client/public/locales/fr/Reassign.json @@ -1,3 +1,3 @@ -{ - "ReassignmentData": "Réattribution de données" +{ + "ReassignmentData": "Réattribution de données" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/ResetApplicationDialog.json b/products/ASC.People/Client/public/locales/fr/ResetApplicationDialog.json new file mode 100644 index 0000000000..4dcba3bf58 --- /dev/null +++ b/products/ASC.People/Client/public/locales/fr/ResetApplicationDialog.json @@ -0,0 +1,4 @@ +{ + "ResetApplicationDescription": "Les paramètres de l'application d'authentification seront réinitialisés.", + "ResetApplicationTitle": "Réinitialiser la configuration de l'application" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/SendInviteDialog.json b/products/ASC.People/Client/public/locales/fr/SendInviteDialog.json index bb4ab22712..e374475f30 100644 --- a/products/ASC.People/Client/public/locales/fr/SendInviteDialog.json +++ b/products/ASC.People/Client/public/locales/fr/SendInviteDialog.json @@ -1,4 +1,4 @@ -{ - "SendInviteAgainDialog": "L'invitation sera de nouveau envoyée aux utilisateurs sélectionnés dont le statut est «En attente».", - "SendInviteAgainDialogMessage": "Après que les utilisateurs acceptent l'invitation, leur status changera en \"Actif\"" +{ + "SendInviteAgainDialog": "L'invitation sera de nouveau envoyée aux utilisateurs sélectionnés dont le statut est «En attente».", + "SendInviteAgainDialogMessage": "Après que les utilisateurs acceptent l'invitation, leur status changera en \"Actif\"" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/fr/Translations.json b/products/ASC.People/Client/public/locales/fr/Translations.json index 78faea88a3..10929dfa08 100644 --- a/products/ASC.People/Client/public/locales/fr/Translations.json +++ b/products/ASC.People/Client/public/locales/fr/Translations.json @@ -1,3 +1,30 @@ -{ - "Birthdate": "Date de naissance" -} +{ + "AddMembers": "Ajouter des membres", + "Birthdate": "Date de naissance", + "Comments": "Commentaires", + "DeleteSelfProfile": "Supprimer le profil", + "DisabledEmployeeStatus": "Désactivé", + "DisableUserButton": "Désactiver", + "EmailChangeButton": "Modifier e-mail", + "EnableUserButton": "Activer ", + "ErrorUnknownFileImageType": "Type de fichier image inconnu", + "FemaleSexStatus": "Femme", + "InviteLinkTitle": "Lien d'invitation", + "LDAPLbl": "LDAP", + "Location": "Emplacement", + "MaleSexStatus": "Homme", + "maxSizeFileError": "La taille maximale du fichier est dépassée", + "NotBeUndone": "Attention : cette action ne peut pas être annulée.", + "orDropFileHereLabel": "ou déposez un fichier ici", + "PasswordChangeButton": "Modifier le mot de passe", + "PendingTitle": "En attente", + "ReassignData": "Réaffecter les données", + "RemoveData": "Supprimer les données personnelles", + "selectNewPhotoLabel": "Sélectionner une nouvelle photo", + "SendInviteAgain": "Envoyer une nouvelle invitation", + "Sex": "Sexe", + "SocialProfiles": "Profils sociaux", + "SuccessChangeUserStatus": "Le statut de l'utilisateur a été modifié avec succès", + "SuccessDeletePersonalData": "Les données personnelles ont été supprimées avec succès", + "SuccessSentInvitation": "L'invitation a été envoyée avec succès" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/Article.json b/products/ASC.People/Client/public/locales/it/Article.json index 79a9a74a06..71591ac960 100644 --- a/products/ASC.People/Client/public/locales/it/Article.json +++ b/products/ASC.People/Client/public/locales/it/Article.json @@ -1,3 +1,3 @@ -{ - "ImportPeople": "Importa persone" +{ + "ImportPeople": "Importa persone" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/ChangeEmailDialog.json b/products/ASC.People/Client/public/locales/it/ChangeEmailDialog.json index 847d14015b..938a61b052 100644 --- a/products/ASC.People/Client/public/locales/it/ChangeEmailDialog.json +++ b/products/ASC.People/Client/public/locales/it/ChangeEmailDialog.json @@ -1,17 +1,17 @@ -{ - "DomainIpAddress": "I domini come indirizzo IP non sono supportati", - "EmailActivationDescription": "Le istruzioni di attivazione verranno inviate all'indirizzo email specificato", - "EmailChangeTitle": "Modifica email", - "EmptyEmail": "Nessuna email analizzata", - "EnterEmail": "Inserisci un nuovo indirizzo email", - "IncorrectDomain": "Dominio incorretto", - "IncorrectEmail": "Indirizzo email incorretto", - "IncorrectLocalPart": "La parte locale è incorretta", - "LocalDomain": "I domini locali non sono supportati", - "ManyEmails": "Ci sono troppe email da analizzare", - "MaxLengthExceeded": "La lunghezza massima di un nome utente o di un'altra parte locale è di 64 caratteri.", - "PunycodeDomain": "I domini Punycode non sono supportati", - "PunycodeLocalPart": "La parte locale Punycode non è supportata", - "SameEmail": "Non puoi usare la stessa email", - "SpacesInLocalPart": "La parte locale non può contenere spazi" +{ + "DomainIpAddress": "I domini come indirizzo IP non sono supportati", + "EmailActivationDescription": "Le istruzioni di attivazione verranno inviate all'indirizzo email specificato", + "EmailChangeTitle": "Modifica email", + "EmptyEmail": "Nessuna email analizzata", + "EnterEmail": "Inserisci un nuovo indirizzo email", + "IncorrectDomain": "Dominio incorretto", + "IncorrectEmail": "Indirizzo email incorretto", + "IncorrectLocalPart": "La parte locale è incorretta", + "LocalDomain": "I domini locali non sono supportati", + "ManyEmails": "Ci sono troppe email da analizzare", + "MaxLengthExceeded": "La lunghezza massima di un nome utente o di un'altra parte locale è di 64 caratteri.", + "PunycodeDomain": "I domini Punycode non sono supportati", + "PunycodeLocalPart": "La parte locale Punycode non è supportata", + "SameEmail": "Non puoi usare la stessa email", + "SpacesInLocalPart": "La parte locale non può contenere spazi" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/ChangePasswordDialog.json b/products/ASC.People/Client/public/locales/it/ChangePasswordDialog.json index 9a4b980f82..ec33db8c88 100644 --- a/products/ASC.People/Client/public/locales/it/ChangePasswordDialog.json +++ b/products/ASC.People/Client/public/locales/it/ChangePasswordDialog.json @@ -1,4 +1,4 @@ -{ - "MessageSendPasswordChangeInstructionsOnEmail": "Invia le istruzioni per la modifica della password a <1>{{email}}", - "PasswordChangeTitle": "Modifica la password" +{ + "MessageSendPasswordChangeInstructionsOnEmail": "Invia le istruzioni per la modifica della password a <1>{{email}}", + "PasswordChangeTitle": "Modifica la password" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/ChangePhoneDialog.json b/products/ASC.People/Client/public/locales/it/ChangePhoneDialog.json index 657a90d333..855ac7708b 100644 --- a/products/ASC.People/Client/public/locales/it/ChangePhoneDialog.json +++ b/products/ASC.People/Client/public/locales/it/ChangePhoneDialog.json @@ -1,4 +1,4 @@ -{ - "MobilePhoneChangeTitle": "Modifica telefono cellulare", - "MobilePhoneEraseDescription": "Le istruzioni su come modificare il numero di cellulare dell'utente verranno inviate all'indirizzo di posta elettronica dell'utente" +{ + "MobilePhoneChangeTitle": "Modifica telefono cellulare", + "MobilePhoneEraseDescription": "Le istruzioni su come modificare il numero di cellulare dell'utente verranno inviate all'indirizzo di posta elettronica dell'utente" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/ChangeUserStatusDialog.json b/products/ASC.People/Client/public/locales/it/ChangeUserStatusDialog.json index 60b76414eb..ef356dd197 100644 --- a/products/ASC.People/Client/public/locales/it/ChangeUserStatusDialog.json +++ b/products/ASC.People/Client/public/locales/it/ChangeUserStatusDialog.json @@ -1,8 +1,8 @@ -{ - "ChangeUsersActiveStatus": "disattivato", - "ChangeUsersDisableStatus": "Attivato", - "ChangeUsersStatusButton": "Cambia lo stato dell'utente", - "ChangeUserStatusDialog": "Gli utenti con lo stato '{{ status }}' verranno disabilitati.", - "ChangeUserStatusDialogHeader": "Cambia stato di utente", - "ChangeUserStatusDialogMessage": "Non è possibile modificare lo stato per il proprietario del portale e per te stesso" +{ + "ChangeUsersActiveStatus": "disattivato", + "ChangeUsersDisableStatus": "Attivato", + "ChangeUsersStatusButton": "Cambia lo stato dell'utente", + "ChangeUserStatusDialog": "Gli utenti con lo stato '{{ status }}' verranno disabilitati.", + "ChangeUserStatusDialogHeader": "Cambia stato di utente", + "ChangeUserStatusDialogMessage": "Non è possibile modificare lo stato per il proprietario del portale e per te stesso" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/ChangeUserTypeDialog.json b/products/ASC.People/Client/public/locales/it/ChangeUserTypeDialog.json index 9d48df4f0b..bca7c549b0 100644 --- a/products/ASC.People/Client/public/locales/it/ChangeUserTypeDialog.json +++ b/products/ASC.People/Client/public/locales/it/ChangeUserTypeDialog.json @@ -1,7 +1,7 @@ -{ - "ChangeUserTypeButton": "Cambia tipo", - "ChangeUserTypeHeader": "Cambia tipo di utente", - "ChangeUserTypeMessage": "Gli utenti con il tipo '{{ firstType }}' verranno spostati nel tipo '{{ secondType }}'.", - "ChangeUserTypeMessageWarning": "Non puoi modificare il tipo per gli amministratori del portale e per te stesso", - "SuccessChangeUserType": "Il tipo di utente è stato cambiato con successo" +{ + "ChangeUserTypeButton": "Cambia tipo", + "ChangeUserTypeHeader": "Cambia tipo di utente", + "ChangeUserTypeMessage": "Gli utenti con il tipo '{{ firstType }}' verranno spostati nel tipo '{{ secondType }}'.", + "ChangeUserTypeMessageWarning": "Non puoi modificare il tipo per gli amministratori del portale e per te stesso", + "SuccessChangeUserType": "Il tipo di utente è stato cambiato con successo" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/DataLossWarningDialog.json b/products/ASC.People/Client/public/locales/it/DataLossWarningDialog.json index 0644546e56..099100aa09 100644 --- a/products/ASC.People/Client/public/locales/it/DataLossWarningDialog.json +++ b/products/ASC.People/Client/public/locales/it/DataLossWarningDialog.json @@ -1,5 +1,5 @@ -{ - "DataLossWarningBody": "Le tue modifiche apportate potrebbero non essere state salvate.", - "DataLossWarningHeader": "Vuoi lasciare la pagina?", - "DataLossWarningLeaveBtn": "Lascia" +{ + "DataLossWarningBody": "Le tue modifiche apportate potrebbero non essere state salvate.", + "DataLossWarningHeader": "Vuoi lasciare la pagina?", + "DataLossWarningLeaveBtn": "Lascia" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/DeleteProfileEverDialog.json b/products/ASC.People/Client/public/locales/it/DeleteProfileEverDialog.json index 1282159463..a4ba1416d6 100644 --- a/products/ASC.People/Client/public/locales/it/DeleteProfileEverDialog.json +++ b/products/ASC.People/Client/public/locales/it/DeleteProfileEverDialog.json @@ -1,6 +1,5 @@ -{ - "Confirmation": "Conferma", - "DeleteUserConfirmation": "{{userCaption}} {{user}} sarà cancellato.", - "DeleteUserDataConfirmation": "I documenti utente condivisi con altri verranno eliminati. Per evitare ciò si consiglia di riassegnare i dati.", - "SuccessfullyDeleteUserInfoMessage": "L'utente è stato cancellato con successo" -} \ No newline at end of file +{ + "DeleteUserConfirmation": "{{userCaption}} {{user}} sarà cancellato.", + "DeleteUserDataConfirmation": "I documenti utente condivisi con altri verranno eliminati. Per evitare ciò si consiglia di riassegnare i dati.", + "SuccessfullyDeleteUserInfoMessage": "L'utente è stato cancellato con successo" +} diff --git a/products/ASC.People/Client/public/locales/it/DeleteSelfProfileDialog.json b/products/ASC.People/Client/public/locales/it/DeleteSelfProfileDialog.json index 168d100d0d..b2e4493cc8 100644 --- a/products/ASC.People/Client/public/locales/it/DeleteSelfProfileDialog.json +++ b/products/ASC.People/Client/public/locales/it/DeleteSelfProfileDialog.json @@ -1,4 +1,4 @@ -{ - "DeleteProfileInfo": "Invia le istruzioni per l'eliminazione del profilo all'indirizzo email", - "DeleteProfileTitle": "Finestra di dialogo per l'eliminazione del profilo" +{ + "DeleteProfileInfo": "Invia le istruzioni per l'eliminazione del profilo all'indirizzo email", + "DeleteProfileTitle": "Finestra di dialogo per l'eliminazione del profilo" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/DeleteUsersDialog.json b/products/ASC.People/Client/public/locales/it/DeleteUsersDialog.json index 4a118ce4c3..03bfac1992 100644 --- a/products/ASC.People/Client/public/locales/it/DeleteUsersDialog.json +++ b/products/ASC.People/Client/public/locales/it/DeleteUsersDialog.json @@ -1,6 +1,6 @@ -{ - "DeleteGroupUsersMessage": "Gli utenti disabilitati selezionati verranno eliminati.", - "DeleteGroupUsersMessageHeader": "Elimina gli utenti dal portale", - "DeleteGroupUsersSuccessMessage": "Gli utenti sono stati eliminati con successo.", - "DeleteUserDataConfirmation": "I documenti utente condivisi verso altri utenti verranno eliminati. Per evitare ciò, si consiglia di riassegnare i dati." +{ + "DeleteGroupUsersMessage": "Gli utenti disabilitati selezionati verranno eliminati.", + "DeleteGroupUsersMessageHeader": "Elimina gli utenti dal portale", + "DeleteGroupUsersSuccessMessage": "Gli utenti sono stati eliminati con successo.", + "DeleteUserDataConfirmation": "I documenti utente condivisi verso altri utenti verranno eliminati. Per evitare ciò, si consiglia di riassegnare i dati." } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/GroupAction.json b/products/ASC.People/Client/public/locales/it/GroupAction.json index 46e0be1aaa..7dbf47a2a2 100644 --- a/products/ASC.People/Client/public/locales/it/GroupAction.json +++ b/products/ASC.People/Client/public/locales/it/GroupAction.json @@ -1,7 +1,7 @@ -{ - "CustomNewDepartment": "{{groupCaption}} (creazione)", - "GroupAction": "Azione di gruppo", - "Members": "Membri", - "SearchAddedMembers": "Cerca membri aggiunti", - "SuccessSaveGroup": "{{groupCaption}} '{{ groupName }}' è stato salvato con successo" -} +{ + "CustomNewDepartment": "{{groupCaption}} (creazione)", + "GroupAction": "Azione di gruppo", + "Members": "Membri", + "SearchAddedMembers": "Cerca membri aggiunti", + "SuccessSaveGroup": "{{groupCaption}} '{{ groupName }}' è stato salvato con successo" +} diff --git a/products/ASC.People/Client/public/locales/it/GroupSelector.json b/products/ASC.People/Client/public/locales/it/GroupSelector.json index 1b712f0369..53aff63a3f 100644 --- a/products/ASC.People/Client/public/locales/it/GroupSelector.json +++ b/products/ASC.People/Client/public/locales/it/GroupSelector.json @@ -1,6 +1,6 @@ -{ - "AddDepartmentsButtonLabel": "Aggiungi dipartimenti", - "EmptyOptionsLabel": "Non ci sono dipartimenti", - "EmptySearchOptionsLabel": "Non ci sono dipartimenti con questo nome", - "SearchPlaceholder": "Cerca gruppi" +{ + "AddDepartmentsButtonLabel": "Aggiungi dipartimenti", + "EmptyOptionsLabel": "Non ci sono dipartimenti", + "EmptySearchOptionsLabel": "Non ci sono dipartimenti con questo nome", + "SearchPlaceholder": "Cerca gruppi" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/Home.json b/products/ASC.People/Client/public/locales/it/Home.json index 17005073ba..2165da6383 100644 --- a/products/ASC.People/Client/public/locales/it/Home.json +++ b/products/ASC.People/Client/public/locales/it/Home.json @@ -1,20 +1,20 @@ -{ - "Administrator": "Amministratore", - "ChangeToGuest": "Cambia in {{guestCaption}}", - "ChangeToUser": "Cambia in {{userCaption}}", - "EmptyGroupDescription": "Puoi aggiungere nuovi membri del team manualmente o invitarli tramite collegamento (link).", - "EmptyGroupTitle": "Nessun utente del gruppo è stato qui ancora", - "LblInviteAgain": "Invita di nuovo", - "LblInvited": "Invitato", - "LblOther": "Altro", - "LblSendEmail": "Invia email", - "LblSendMessage": "Invia messaggio", - "LblSetActive": "Imposta attivo", - "LblSetDisabled": "Imposta disattivato", - "MakeInvitationLink": "Crea collegamento di invito", - "MessageEmailActivationInstuctionsSentOnEmail": "Le istruzioni per l'attivazione sono state inviate tramite posta elettronica all'indirizzo <1>{{email}}", - "NotFoundDescription": "Prova un filtro diverso o deselezionalo per visualizzare tutte le persone nella sezione.", - "NotFoundTitle": "Nessun utente del gruppo trovato", - "SuccessfullyRemovedGroup": "Il gruppo è stato cancellato con successo", - "UserStatus": "Stato" +{ + "Administrator": "Amministratore", + "ChangeToGuest": "Cambia in {{guestCaption}}", + "ChangeToUser": "Cambia in {{userCaption}}", + "EmptyGroupDescription": "Puoi aggiungere nuovi membri del team manualmente o invitarli tramite collegamento (link).", + "EmptyGroupTitle": "Nessun utente del gruppo è stato qui ancora", + "LblInviteAgain": "Invita di nuovo", + "LblInvited": "Invitato", + "LblOther": "Altro", + "LblSendEmail": "Invia email", + "LblSendMessage": "Invia messaggio", + "LblSetActive": "Imposta attivo", + "LblSetDisabled": "Imposta disattivato", + "MakeInvitationLink": "Crea collegamento di invito", + "MessageEmailActivationInstuctionsSentOnEmail": "Le istruzioni per l'attivazione sono state inviate tramite posta elettronica all'indirizzo <1>{{email}}", + "NotFoundDescription": "Prova un filtro diverso o deselezionalo per visualizzare tutte le persone nella sezione.", + "NotFoundTitle": "Nessun utente del gruppo trovato", + "SuccessfullyRemovedGroup": "Il gruppo è stato cancellato con successo", + "UserStatus": "Stato" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/InviteDialog.json b/products/ASC.People/Client/public/locales/it/InviteDialog.json index 7b5ff1088b..c42939bce3 100644 --- a/products/ASC.People/Client/public/locales/it/InviteDialog.json +++ b/products/ASC.People/Client/public/locales/it/InviteDialog.json @@ -1,8 +1,8 @@ -{ - "CopyToClipboard": "Copia collegamento", - "GetShortenLink": "Ottieni link accorciato", - "HelpAnswerLinkInviteSettings": "Condividi il link per invitare i colleghi al tuo portale.", - "InviteLinkValidInterval": "Questo collegamento è valido solo per {{ count }} giorni.", - "InviteUsersAsCollaborators": "Aggiungi utenti come {{guestsCaption, lowercase}}", - "LinkCopySuccess": "Il link di collegamento è stato copiato" +{ + "CopyToClipboard": "Copia collegamento", + "GetShortenLink": "Ottieni link accorciato", + "HelpAnswerLinkInviteSettings": "Condividi il link per invitare i colleghi al tuo portale.", + "InviteLinkValidInterval": "Questo collegamento è valido solo per {{ count }} giorni.", + "InviteUsersAsCollaborators": "Aggiungi utenti come {{guestsCaption, lowercase}}", + "LinkCopySuccess": "Il link di collegamento è stato copiato" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/PeopleSelector.json b/products/ASC.People/Client/public/locales/it/PeopleSelector.json index ce66b1b3cb..cedd19c4df 100644 --- a/products/ASC.People/Client/public/locales/it/PeopleSelector.json +++ b/products/ASC.People/Client/public/locales/it/PeopleSelector.json @@ -1,6 +1,6 @@ -{ - "CustomAllGroups": "Tutti {{ groupsCaption, lowercase }}", - "EmptySearchUsersResult": "Non ci sono utenti con tale nome", - "EmptyUsers": "Non ci sono utenti", - "SearchUsersPlaceholder": "Cerca utenti" +{ + "CustomAllGroups": "Tutti {{ groupsCaption, lowercase }}", + "EmptySearchUsersResult": "Non ci sono utenti con tale nome", + "EmptyUsers": "Non ci sono utenti", + "SearchUsersPlaceholder": "Cerca utenti" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/Profile.json b/products/ASC.People/Client/public/locales/it/Profile.json index 877ac19ec6..8d619e6e3f 100644 --- a/products/ASC.People/Client/public/locales/it/Profile.json +++ b/products/ASC.People/Client/public/locales/it/Profile.json @@ -1,11 +1,11 @@ -{ - "ChangeEmailSuccess": "L'indirizzo e-mail è stato modificato con successo", - "ChangesApplied": "Le modifiche sono state applicate", - "ContactInformation": "Informazioni di contatto", - "EditPhoto": "Modifica Foto", - "EditSubscriptionsBtn": "Modifica sottoscrizione", - "InviteAgainLbl": "Invita di nuovo", - "MessageEmailActivationInstuctionsSentOnEmail": "Le istruzioni per l'attivazione sono state inviate all'indirizzo email {{email}}", - "PhoneLbl": "Telefono", - "Subscriptions": "Sottoscrizione" -} +{ + "ChangeEmailSuccess": "L'indirizzo e-mail è stato modificato con successo", + "ChangesApplied": "Le modifiche sono state applicate", + "ContactInformation": "Informazioni di contatto", + "EditPhoto": "Modifica Foto", + "EditSubscriptionsBtn": "Modifica sottoscrizione", + "InviteAgainLbl": "Invita di nuovo", + "MessageEmailActivationInstuctionsSentOnEmail": "Le istruzioni per l'attivazione sono state inviate all'indirizzo email {{email}}", + "PhoneLbl": "Telefono", + "Subscriptions": "Sottoscrizione" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/ProfileAction.json b/products/ASC.People/Client/public/locales/it/ProfileAction.json index fb308743c6..551e929d4b 100644 --- a/products/ASC.People/Client/public/locales/it/ProfileAction.json +++ b/products/ASC.People/Client/public/locales/it/ProfileAction.json @@ -1,25 +1,25 @@ -{ - "ActivationLink": "Attivazione collegamento", - "AddContact": "Aggiungi contatto", - "AddPhoto": "Aggiungi foto", - "Calendar": "Calendario", - "CalendarSelectDate": "Seleziona la data", - "ChangeButton": "Cambia", - "ChangesSavedSuccessfully": "I cambiamenti sono stati salvati con successo", - "ContactInformation": "Informazioni di contatto", - "CustomCreation": "{{user}} (creazione)", - "EditPhoto": "Modifica Foto", - "EditUserDialogTitle": "Modifica profilo", - "EmailPopupHelper": "L'email principale viene utilizzata per le notifiche e il ripristino dell'accesso. <1> Puoi creare una nuova email su questo dominio per l'utente e impostare una password monouso per il primo accesso.", - "FirstName": "Nome", - "Message": "Parla", - "ProductsAndInstruments_Products": "Moduli", - "ProfileAction": "Azione del profilo", - "ProfileTypePopupHelper": "Gli ospiti hanno un tipo di accesso limitato a delle funzionalità, e nell'uso dei moduli di questo portale", - "TemporaryPassword": "Password temporanea", - "TermsOfUsePopupHelperLink": "Maggiori dettagli sui termini di utilizzo", - "UpdatingProcess": "Caricamento in corso...", - "WriteComment": "Aggiungi commento", - "ErrorInvalidUserLastName": "Cognome non valido", - "ErrorInvalidUserFirstName": "Nome non valido" -} +{ + "ActivationLink": "Attivazione collegamento", + "AddContact": "Aggiungi contatto", + "AddPhoto": "Aggiungi foto", + "Calendar": "Calendario", + "CalendarSelectDate": "Seleziona la data", + "ChangeButton": "Cambia", + "ChangesSavedSuccessfully": "I cambiamenti sono stati salvati con successo", + "ContactInformation": "Informazioni di contatto", + "CustomCreation": "{{user}} (creazione)", + "EditPhoto": "Modifica Foto", + "EditUserDialogTitle": "Modifica profilo", + "EmailPopupHelper": "L'email principale viene utilizzata per le notifiche e il ripristino dell'accesso. <1> Puoi creare una nuova email su questo dominio per l'utente e impostare una password monouso per il primo accesso.", + "ErrorInvalidUserLastName": "Cognome non valido", + "ErrorInvalidUserFirstName": "Nome non valido", + "FirstName": "Nome", + "Message": "Parla", + "ProductsAndInstruments_Products": "Moduli", + "ProfileAction": "Azione del profilo", + "ProfileTypePopupHelper": "Gli ospiti hanno un tipo di accesso limitato a delle funzionalità, e nell'uso dei moduli di questo portale", + "TemporaryPassword": "Password temporanea", + "TermsOfUsePopupHelperLink": "Maggiori dettagli sui termini di utilizzo", + "UpdatingProcess": "Caricamento in corso...", + "WriteComment": "Aggiungi commento" +} diff --git a/products/ASC.People/Client/public/locales/it/Reassign.json b/products/ASC.People/Client/public/locales/it/Reassign.json index c61d34c19d..4a743d3148 100644 --- a/products/ASC.People/Client/public/locales/it/Reassign.json +++ b/products/ASC.People/Client/public/locales/it/Reassign.json @@ -1,3 +1,3 @@ -{ - "ReassignmentData": "Riassegnazione dei dati" +{ + "ReassignmentData": "Riassegnazione dei dati" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/SendInviteDialog.json b/products/ASC.People/Client/public/locales/it/SendInviteDialog.json index 3b90841648..112544cc30 100644 --- a/products/ASC.People/Client/public/locales/it/SendInviteDialog.json +++ b/products/ASC.People/Client/public/locales/it/SendInviteDialog.json @@ -1,4 +1,4 @@ -{ - "SendInviteAgainDialog": "L'invito verrà nuovamente inviato agli utenti selezionati con lo stato \"In attesa\".", - "SendInviteAgainDialogMessage": "Dopo che gli utenti hanno accettato l'invito, il loro stato si cambierà su \"Attivo\"" +{ + "SendInviteAgainDialog": "L'invito verrà nuovamente inviato agli utenti selezionati con lo stato \"In attesa\".", + "SendInviteAgainDialogMessage": "Dopo che gli utenti hanno accettato l'invito, il loro stato si cambierà su \"Attivo\"" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/it/Translations.json b/products/ASC.People/Client/public/locales/it/Translations.json index 6c83541382..d5fb5f8cfc 100644 --- a/products/ASC.People/Client/public/locales/it/Translations.json +++ b/products/ASC.People/Client/public/locales/it/Translations.json @@ -1,3 +1,4 @@ -{ - "Birthdate": "Data di nascita" -} +{ + "Birthdate": "Data di nascita", + "LDAPLbl": "LDAP" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/Article.json b/products/ASC.People/Client/public/locales/lo/Article.json index bfefaff98e..a02822c327 100644 --- a/products/ASC.People/Client/public/locales/lo/Article.json +++ b/products/ASC.People/Client/public/locales/lo/Article.json @@ -1,3 +1,3 @@ -{ - "ImportPeople": "ນຳຄົນເຂົ້າ" +{ + "ImportPeople": "ນຳຄົນເຂົ້າ" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/ChangeEmailDialog.json b/products/ASC.People/Client/public/locales/lo/ChangeEmailDialog.json index 443497b3a9..76dee1795d 100644 --- a/products/ASC.People/Client/public/locales/lo/ChangeEmailDialog.json +++ b/products/ASC.People/Client/public/locales/lo/ChangeEmailDialog.json @@ -1,17 +1,17 @@ -{ - "DomainIpAddress": "ທີ່ຢູ່ IP ໂດເມນຍັງບໍ່ຮອງຮັບ", - "EmailActivationDescription": "ຄຳແນະນຳກ່ຽວກັບການເປີດໃຊ້ງານຈະຖືກສົ່ງໄປທີ່ອີເມວທີ່ປ້ອນເຂົ້າ", - "EmailChangeTitle": "ປ່ຽນອີເມວ", - "EmptyEmail": "ບໍ່ແບ່ງແຍກອີເມວ", - "EnterEmail": "ໃສ່ທີ່ຢູ່ອີເມວໃໝ່", - "IncorrectDomain": "Domain ບໍ່ຖືກຕ້ອງ", - "IncorrectEmail": "ອີເມວບໍ່ຖືກຕ້ອງ", - "IncorrectLocalPart": "ທ້ອງຖິ່ນບໍ່ຖືກຕ້ອງ", - "LocalDomain": "ໂດເມນທ້ອງຖິ່ນບໍ່ໄດ້ຮັບການສະໜັບສະໜູນ", - "ManyEmails": "ແບ່ງແຍກອີເມວຫຼາຍເກີນໄປ", - "MaxLengthExceeded": "ຄວາມຍາວສູງສຸດຂອງຊື່ຜູ້ໃຊ້ຫລືພາກສ່ວນພື້ນຖານອື່ນໆແມ່ນ 64 ໂຕອັກສອນ.", - "PunycodeDomain": "ບໍ່ຮອງຮັບໂດເມນ Punycode", - "PunycodeLocalPart": "ພື້ນທີ່ບໍ່ຮອງຮັບ Punycode", - "SameEmail": "ທີ່ບໍ່ສາມາດໃຊ້ອີເມວຊໍ່າກັນ", - "SpacesInLocalPart": "ພື່ນທີ່ທ້ອງຖິ້ນບໍ່ພຽງພໍ" +{ + "DomainIpAddress": "ທີ່ຢູ່ IP ໂດເມນຍັງບໍ່ຮອງຮັບ", + "EmailActivationDescription": "ຄຳແນະນຳກ່ຽວກັບການເປີດໃຊ້ງານຈະຖືກສົ່ງໄປທີ່ອີເມວທີ່ປ້ອນເຂົ້າ", + "EmailChangeTitle": "ປ່ຽນອີເມວ", + "EmptyEmail": "ບໍ່ແບ່ງແຍກອີເມວ", + "EnterEmail": "ໃສ່ທີ່ຢູ່ອີເມວໃໝ່", + "IncorrectDomain": "Domain ບໍ່ຖືກຕ້ອງ", + "IncorrectEmail": "ອີເມວບໍ່ຖືກຕ້ອງ", + "IncorrectLocalPart": "ທ້ອງຖິ່ນບໍ່ຖືກຕ້ອງ", + "LocalDomain": "ໂດເມນທ້ອງຖິ່ນບໍ່ໄດ້ຮັບການສະໜັບສະໜູນ", + "ManyEmails": "ແບ່ງແຍກອີເມວຫຼາຍເກີນໄປ", + "MaxLengthExceeded": "ຄວາມຍາວສູງສຸດຂອງຊື່ຜູ້ໃຊ້ຫລືພາກສ່ວນພື້ນຖານອື່ນໆແມ່ນ 64 ໂຕອັກສອນ.", + "PunycodeDomain": "ບໍ່ຮອງຮັບໂດເມນ Punycode", + "PunycodeLocalPart": "ພື້ນທີ່ບໍ່ຮອງຮັບ Punycode", + "SameEmail": "ທີ່ບໍ່ສາມາດໃຊ້ອີເມວຊໍ່າກັນ", + "SpacesInLocalPart": "ພື່ນທີ່ທ້ອງຖິ້ນບໍ່ພຽງພໍ" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/ChangePasswordDialog.json b/products/ASC.People/Client/public/locales/lo/ChangePasswordDialog.json index 6d3db31cb8..14af6bc698 100644 --- a/products/ASC.People/Client/public/locales/lo/ChangePasswordDialog.json +++ b/products/ASC.People/Client/public/locales/lo/ChangePasswordDialog.json @@ -1,4 +1,4 @@ -{ - "MessageSendPasswordChangeInstructionsOnEmail": "ສົ່ງຄຳແນະນຳກ່ຽວກັບການປ່ຽນລະຫັດຜ່ານໄປທີ່ <1>{{email}}", - "PasswordChangeTitle": "ປ່ຽນລະຫັດຜ່ານ" +{ + "MessageSendPasswordChangeInstructionsOnEmail": "ສົ່ງຄຳແນະນຳກ່ຽວກັບການປ່ຽນລະຫັດຜ່ານໄປທີ່ <1>{{email}}", + "PasswordChangeTitle": "ປ່ຽນລະຫັດຜ່ານ" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/ChangePhoneDialog.json b/products/ASC.People/Client/public/locales/lo/ChangePhoneDialog.json index d3b2d07654..1d335b7a39 100644 --- a/products/ASC.People/Client/public/locales/lo/ChangePhoneDialog.json +++ b/products/ASC.People/Client/public/locales/lo/ChangePhoneDialog.json @@ -1,4 +1,4 @@ -{ - "MobilePhoneChangeTitle": "ປ່ຽນໂທລະສັບມືຖື", - "MobilePhoneEraseDescription": "ຄຳແນະນຳກ່ຽວກັບວິທີປ່ຽນເລກໂທລະສັບມືຖືຂອງຜູ້ໃຊ້ຈະຖືກສົ່ງໄປທີ່ອີເມວຂອງຜູ້ໃຊ້" +{ + "MobilePhoneChangeTitle": "ປ່ຽນໂທລະສັບມືຖື", + "MobilePhoneEraseDescription": "ຄຳແນະນຳກ່ຽວກັບວິທີປ່ຽນເລກໂທລະສັບມືຖືຂອງຜູ້ໃຊ້ຈະຖືກສົ່ງໄປທີ່ອີເມວຂອງຜູ້ໃຊ້" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/ChangeUserStatusDialog.json b/products/ASC.People/Client/public/locales/lo/ChangeUserStatusDialog.json index 167a492ccc..16a07c4a99 100644 --- a/products/ASC.People/Client/public/locales/lo/ChangeUserStatusDialog.json +++ b/products/ASC.People/Client/public/locales/lo/ChangeUserStatusDialog.json @@ -1,8 +1,8 @@ -{ - "ChangeUsersActiveStatus": "ປິດການໃຊ້ງານ", - "ChangeUsersDisableStatus": "ເປີດໃຊ້ງານ", - "ChangeUsersStatusButton": "ປ່ຽນສະຖານະຜູ້ໃຊ້", - "ChangeUserStatusDialog": "ສະຖານະຂອງຜູ້ໃຊ້ທີ່ມີ '{{ສະຖານະ}}' ຈະຖືກປິດໃຊ້ງານ.", - "ChangeUserStatusDialogHeader": "ປ່ຽນສະຖານະຜູ້ໃຊ້", - "ChangeUserStatusDialogMessage": "ທ່ານບໍ່ສາມາດປ່ຽນສະຖານະພາບສຳລັບເຈົ້າຂອງ portal ແລະ ສຳລັບທ່ານເອງ" -} \ No newline at end of file +{ + "ChangeUsersActiveStatus": "ປິດການໃຊ້ງານ", + "ChangeUsersDisableStatus": "ເປີດໃຊ້ງານ", + "ChangeUsersStatusButton": "ປ່ຽນສະຖານະຜູ້ໃຊ້", + "ChangeUserStatusDialog": "ສະຖານະຂອງຜູ້ໃຊ້ທີ່ມີ '{{ status }}' ຈະຖືກປິດໃຊ້ງານ.", + "ChangeUserStatusDialogHeader": "ປ່ຽນສະຖານະຜູ້ໃຊ້", + "ChangeUserStatusDialogMessage": "ທ່ານບໍ່ສາມາດປ່ຽນສະຖານະພາບສຳລັບເຈົ້າຂອງ portal ແລະ ສຳລັບທ່ານເອງ" +} diff --git a/products/ASC.People/Client/public/locales/lo/ChangeUserTypeDialog.json b/products/ASC.People/Client/public/locales/lo/ChangeUserTypeDialog.json index 0a5ab2dcc4..bc5c343f77 100644 --- a/products/ASC.People/Client/public/locales/lo/ChangeUserTypeDialog.json +++ b/products/ASC.People/Client/public/locales/lo/ChangeUserTypeDialog.json @@ -1,7 +1,7 @@ -{ - "ChangeUserTypeButton": "ປ່ຽນປະເພດ", - "ChangeUserTypeHeader": "ປ່ຽນປະເພດຜູ້ໃຊ້", - "ChangeUserTypeMessage": "ຜູ້ໃຊ້ທີ່ມີປະເພດ '{{firstType}}' ຈະຖືກຍ້າຍໄປປະເພດ '{{secondType}}'.", - "ChangeUserTypeMessageWarning": "ທ່ານບໍ່ສາມາດປ່ຽນປະເພດ ສຳລັບຜູ້ບໍລິຫານ portal ແລ ະຕົວທ່ານເອງ", - "SuccessChangeUserType": "ປະເພດຜູ້ໃຊ້ຖືກປ່ຽນແປງສຳເລັດຜົນແລ້ວ." +{ + "ChangeUserTypeButton": "ປ່ຽນປະເພດ", + "ChangeUserTypeHeader": "ປ່ຽນປະເພດຜູ້ໃຊ້", + "ChangeUserTypeMessage": "ຜູ້ໃຊ້ທີ່ມີປະເພດ '{{firstType}}' ຈະຖືກຍ້າຍໄປປະເພດ '{{secondType}}'.", + "ChangeUserTypeMessageWarning": "ທ່ານບໍ່ສາມາດປ່ຽນປະເພດ ສຳລັບຜູ້ບໍລິຫານ portal ແລ ະຕົວທ່ານເອງ", + "SuccessChangeUserType": "ປະເພດຜູ້ໃຊ້ຖືກປ່ຽນແປງສຳເລັດຜົນແລ້ວ." } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/DataLossWarningDialog.json b/products/ASC.People/Client/public/locales/lo/DataLossWarningDialog.json index 4b2c2a66a2..b449920579 100644 --- a/products/ASC.People/Client/public/locales/lo/DataLossWarningDialog.json +++ b/products/ASC.People/Client/public/locales/lo/DataLossWarningDialog.json @@ -1,5 +1,5 @@ -{ - "DataLossWarningBody": "ການປ່ຽນແປງຂອງທ່ານອາດຈະບໍ່ຖືກບັນທຶກ.", - "DataLossWarningHeader": "ອອກຈາກຫນ້າບໍ່", - "DataLossWarningLeaveBtn": "ອອກ" +{ + "DataLossWarningBody": "ການປ່ຽນແປງຂອງທ່ານອາດຈະບໍ່ຖືກບັນທຶກ.", + "DataLossWarningHeader": "ອອກຈາກຫນ້າບໍ່", + "DataLossWarningLeaveBtn": "ອອກ" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/DeleteProfileEverDialog.json b/products/ASC.People/Client/public/locales/lo/DeleteProfileEverDialog.json index 177a358504..73155b110d 100644 --- a/products/ASC.People/Client/public/locales/lo/DeleteProfileEverDialog.json +++ b/products/ASC.People/Client/public/locales/lo/DeleteProfileEverDialog.json @@ -1,6 +1,5 @@ -{ - "Confirmation": "ການຢັ້ງຢືນຕົວຕົນ", - "DeleteUserConfirmation": "{{userCaption}} {{user}} ຈະຖືກລົບ", - "DeleteUserDataConfirmation": "ເອກະສານຂອງຜູ້ໃຊ້ທີ່ຖືກແບ່ງປັນກັບຄົນອື່ນຈະຖືກລຶບອອກ. ເພື່ອຫລີກລ້ຽງບັນຫານທີ່ຈະເກີດຂື້ນໃນການປ້ອນຂໍ້ມູນ", - "SuccessfullyDeleteUserInfoMessage": "ຜູ້ໃຊ້ຖືກລຶບອອກແລ້ວ" -} \ No newline at end of file +{ + "DeleteUserConfirmation": "{{userCaption}} {{user}} ຈະຖືກລົບ", + "DeleteUserDataConfirmation": "ເອກະສານຂອງຜູ້ໃຊ້ທີ່ຖືກແບ່ງປັນກັບຄົນອື່ນຈະຖືກລຶບອອກ. ເພື່ອຫລີກລ້ຽງບັນຫານທີ່ຈະເກີດຂື້ນໃນການປ້ອນຂໍ້ມູນ", + "SuccessfullyDeleteUserInfoMessage": "ຜູ້ໃຊ້ຖືກລຶບອອກແລ້ວ" +} diff --git a/products/ASC.People/Client/public/locales/lo/DeleteSelfProfileDialog.json b/products/ASC.People/Client/public/locales/lo/DeleteSelfProfileDialog.json index 184951ccd1..2f75db23b9 100644 --- a/products/ASC.People/Client/public/locales/lo/DeleteSelfProfileDialog.json +++ b/products/ASC.People/Client/public/locales/lo/DeleteSelfProfileDialog.json @@ -1,4 +1,4 @@ -{ - "DeleteProfileInfo": "ສົ່ງຄຳແນະນຳກ່ຽວກັບການລົບຂໍ້ມູນໄປທີ່ອີເມວ ", - "DeleteProfileTitle": "ລົບໂປຣໄຟລ໌ສົນທະນາ" +{ + "DeleteProfileInfo": "ສົ່ງຄຳແນະນຳກ່ຽວກັບການລົບຂໍ້ມູນໄປທີ່ອີເມວ ", + "DeleteProfileTitle": "ລົບໂປຣໄຟລ໌ສົນທະນາ" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/DeleteUsersDialog.json b/products/ASC.People/Client/public/locales/lo/DeleteUsersDialog.json index 65299306f2..81a83ae67a 100644 --- a/products/ASC.People/Client/public/locales/lo/DeleteUsersDialog.json +++ b/products/ASC.People/Client/public/locales/lo/DeleteUsersDialog.json @@ -1,6 +1,6 @@ -{ - "DeleteGroupUsersMessage": "ຜູ້ໃຊ້ທີ່ຖືກປິດການໃຊ້ງານທີ່ທ່ານເລືອກຈະຖືກລົບອອກ.", - "DeleteGroupUsersMessageHeader": "ລົບຜູ້ໃຊ້ອອກຈາກ Portal", - "DeleteGroupUsersSuccessMessage": "ຢູເຊີ້ນີ້ມີແລ້ວ", - "DeleteUserDataConfirmation": "ເອກະສານຜູ້ໃຊ້ທີ່ແບ່ງປັນໃຫ້ຜູ້ອື່ນຈະຖືກລຶບອອກ. ເພື່ອຫລີກລ້ຽງສິ່ງນີ້, ໃຫ້ຂໍ້ມູນຄືນໃຫມ່." +{ + "DeleteGroupUsersMessage": "ຜູ້ໃຊ້ທີ່ຖືກປິດການໃຊ້ງານທີ່ທ່ານເລືອກຈະຖືກລົບອອກ.", + "DeleteGroupUsersMessageHeader": "ລົບຜູ້ໃຊ້ອອກຈາກ Portal", + "DeleteGroupUsersSuccessMessage": "ຢູເຊີ້ນີ້ມີແລ້ວ", + "DeleteUserDataConfirmation": "ເອກະສານຜູ້ໃຊ້ທີ່ແບ່ງປັນໃຫ້ຜູ້ອື່ນຈະຖືກລຶບອອກ. ເພື່ອຫລີກລ້ຽງສິ່ງນີ້, ໃຫ້ຂໍ້ມູນຄືນໃຫມ່." } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/GroupAction.json b/products/ASC.People/Client/public/locales/lo/GroupAction.json index b7e425af66..5df8160824 100644 --- a/products/ASC.People/Client/public/locales/lo/GroupAction.json +++ b/products/ASC.People/Client/public/locales/lo/GroupAction.json @@ -1,7 +1,7 @@ -{ - "CustomNewDepartment": "{{ກຸ່ມສົນທະນາ}} (ສ້າງ)", - "GroupAction": "ກຸ່ມດຳເນີນການ", - "Members": "ສະມາຊິກ", - "SearchAddedMembers": "ຄົ້ນຫາສະມາຊິກເພີ່ມ", - "SuccessSaveGroup": "{{groupCaption}} '{{ groupName }}' ໄດ້ຖືກບັນທຶກ ສຳ ເລັດແລ້ວ" -} +{ + "CustomNewDepartment": "{{groupCaption}} (ສ້າງ)", + "GroupAction": "ກຸ່ມດຳເນີນການ", + "Members": "ສະມາຊິກ", + "SearchAddedMembers": "ຄົ້ນຫາສະມາຊິກເພີ່ມ", + "SuccessSaveGroup": "{{groupCaption}} '{{ groupName }}' ໄດ້ຖືກບັນທຶກ ສຳ ເລັດແລ້ວ" +} diff --git a/products/ASC.People/Client/public/locales/lo/GroupSelector.json b/products/ASC.People/Client/public/locales/lo/GroupSelector.json index 7c71c02540..ad02edfc86 100644 --- a/products/ASC.People/Client/public/locales/lo/GroupSelector.json +++ b/products/ASC.People/Client/public/locales/lo/GroupSelector.json @@ -1,6 +1,6 @@ -{ - "AddDepartmentsButtonLabel": "ເພີ່ມພະແນກ", - "EmptyOptionsLabel": "ບໍ່ມີພະແນກໃດ", - "EmptySearchOptionsLabel": "ບໍ່ມີພະແນກໃດທີ່ມີຊື່ດັ່ງນີ້", - "SearchPlaceholder": "ຄົ້ນຫາກຸ່ມ" +{ + "AddDepartmentsButtonLabel": "ເພີ່ມພະແນກ", + "EmptyOptionsLabel": "ບໍ່ມີພະແນກໃດ", + "EmptySearchOptionsLabel": "ບໍ່ມີພະແນກໃດທີ່ມີຊື່ດັ່ງນີ້", + "SearchPlaceholder": "ຄົ້ນຫາກຸ່ມ" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/Home.json b/products/ASC.People/Client/public/locales/lo/Home.json index bc36b20288..8ecf0a650b 100644 --- a/products/ASC.People/Client/public/locales/lo/Home.json +++ b/products/ASC.People/Client/public/locales/lo/Home.json @@ -1,20 +1,20 @@ -{ - "Administrator": "ຜູ້ຄຸມຄອງລະບົບ", - "ChangeToGuest": "ປ່ຽນເປັນ {{guestCaption}}", - "ChangeToUser": "ປ່ຽນເປັນ {{userCaption}}", - "EmptyGroupDescription": "ທ່ານສາມາດເພີ່ມສະມາຊິກທີມງານ ໃໝ່ ດ້ວຍຕົນເອງຫຼືເຊີນພວກເຂົາຜ່ານທາງລິງ.", - "EmptyGroupTitle": "ຍັງບໍ່ມີເພື່ອນຮ່ວມທີມຢູ່ນີ້", - "LblInviteAgain": "ເຊີນອີກຄັ້ງ", - "LblInvited": "ໄດ້ຮັບເຊີນແລ້ວ", - "LblOther": "ອື່ນໆ", - "LblSendEmail": "ສົ່ງອິເມວ", - "LblSendMessage": "ສົ່ງຂໍ້ຄວາມ", - "LblSetActive": "ຕັ້ງຄ່າໃຊ້ງານ", - "LblSetDisabled": "ປິດໃຊ້ງານ", - "MakeInvitationLink": "ສ້າງລິ້ງການເຊີນ", - "MessageEmailActivationInstuctionsSentOnEmail": "ຄຳແນະນຳກ່ຽວກັບການເປີດໃຊ້ອີເມວໄດ້ຖືກສົ່ງໄປທີ່ອີເມວ <1> {{ອີເມວ}} ທີ່ຢູ່ເມວ", - "NotFoundDescription": "ລອງໃຊ້ຕົວຄົ້ນຫາ ຫຼື ລ້າງເພື່ອເບິ່ງທຸກຄົນໃນສ່ວນນີ້", - "NotFoundTitle": "ບໍ່ພົບເພື່ອນຮ່ວມທີມ", - "SuccessfullyRemovedGroup": "ລົບກຸ່ມສຳເລັດແລ້ວ", - "UserStatus": "ສະຖານະ" -} \ No newline at end of file +{ + "Administrator": "ຜູ້ຄຸມຄອງລະບົບ", + "ChangeToGuest": "ປ່ຽນເປັນ {{guestCaption}}", + "ChangeToUser": "ປ່ຽນເປັນ {{userCaption}}", + "EmptyGroupDescription": "ທ່ານສາມາດເພີ່ມສະມາຊິກທີມງານ ໃໝ່ ດ້ວຍຕົນເອງຫຼືເຊີນພວກເຂົາຜ່ານທາງລິງ.", + "EmptyGroupTitle": "ຍັງບໍ່ມີເພື່ອນຮ່ວມທີມຢູ່ນີ້", + "LblInviteAgain": "ເຊີນອີກຄັ້ງ", + "LblInvited": "ໄດ້ຮັບເຊີນແລ້ວ", + "LblOther": "ອື່ນໆ", + "LblSendEmail": "ສົ່ງອິເມວ", + "LblSendMessage": "ສົ່ງຂໍ້ຄວາມ", + "LblSetActive": "ຕັ້ງຄ່າໃຊ້ງານ", + "LblSetDisabled": "ປິດໃຊ້ງານ", + "MakeInvitationLink": "ສ້າງລິ້ງການເຊີນ", + "MessageEmailActivationInstuctionsSentOnEmail": "ຄຳແນະນຳກ່ຽວກັບການເປີດໃຊ້ອີເມວໄດ້ຖືກສົ່ງໄປທີ່ອີເມວ <1> {{email}} ທີ່ຢູ່ເມວ", + "NotFoundDescription": "ລອງໃຊ້ຕົວຄົ້ນຫາ ຫຼື ລ້າງເພື່ອເບິ່ງທຸກຄົນໃນສ່ວນນີ້", + "NotFoundTitle": "ບໍ່ພົບເພື່ອນຮ່ວມທີມ", + "SuccessfullyRemovedGroup": "ລົບກຸ່ມສຳເລັດແລ້ວ", + "UserStatus": "ສະຖານະ" +} diff --git a/products/ASC.People/Client/public/locales/lo/InviteDialog.json b/products/ASC.People/Client/public/locales/lo/InviteDialog.json index b5ecb96c97..2a10553e88 100644 --- a/products/ASC.People/Client/public/locales/lo/InviteDialog.json +++ b/products/ASC.People/Client/public/locales/lo/InviteDialog.json @@ -1,8 +1,8 @@ -{ - "CopyToClipboard": "ຄັດລອກລິ້ງ", - "GetShortenLink": "ຮັບລິ້ງທີ່ສັ້ນລົງ", - "HelpAnswerLinkInviteSettings": "ແບ່ງປັນລິ້ງເພື່ອເຊີນເພື່ອນຮ່ວມງານເຂົ້າສູ້ portal.", - "InviteLinkValidInterval": "ລິ້ງນີ້ໃຊ້ສຳລັບ {{ count }} ມື້", - "InviteUsersAsCollaborators": "ເພີ່ມຜູ້ໃຊ້ເປັນ {{guestsCaption, lowercase}}", - "LinkCopySuccess": "ລິ້ງຖືກຄັດລອກແລ້ວ" +{ + "CopyToClipboard": "ຄັດລອກລິ້ງ", + "GetShortenLink": "ຮັບລິ້ງທີ່ສັ້ນລົງ", + "HelpAnswerLinkInviteSettings": "ແບ່ງປັນລິ້ງເພື່ອເຊີນເພື່ອນຮ່ວມງານເຂົ້າສູ້ portal.", + "InviteLinkValidInterval": "ລິ້ງນີ້ໃຊ້ສຳລັບ {{ count }} ມື້", + "InviteUsersAsCollaborators": "ເພີ່ມຜູ້ໃຊ້ເປັນ {{guestsCaption, lowercase}}", + "LinkCopySuccess": "ລິ້ງຖືກຄັດລອກແລ້ວ" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/PeopleSelector.json b/products/ASC.People/Client/public/locales/lo/PeopleSelector.json index b7d7d4aea3..2a868cc3d3 100644 --- a/products/ASC.People/Client/public/locales/lo/PeopleSelector.json +++ b/products/ASC.People/Client/public/locales/lo/PeopleSelector.json @@ -1,6 +1,6 @@ -{ - "CustomAllGroups": "ທັງໝົດ {{ groupsCaption, lowercase }}", - "EmptySearchUsersResult": "ບໍ່ມີຜູ້ໃຊ້ທີ່ມີຊື່ດັ່ງກ່າວ", - "EmptyUsers": "ບໍ່ມີຜູ້ໃຊ້", - "SearchUsersPlaceholder": "ຄົ້ນຫາບັນຊີ" +{ + "CustomAllGroups": "ທັງໝົດ {{ groupsCaption, lowercase }}", + "EmptySearchUsersResult": "ບໍ່ມີຜູ້ໃຊ້ທີ່ມີຊື່ດັ່ງກ່າວ", + "EmptyUsers": "ບໍ່ມີຜູ້ໃຊ້", + "SearchUsersPlaceholder": "ຄົ້ນຫາບັນຊີ" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/Profile.json b/products/ASC.People/Client/public/locales/lo/Profile.json index 42a9828a23..b31cb982ea 100644 --- a/products/ASC.People/Client/public/locales/lo/Profile.json +++ b/products/ASC.People/Client/public/locales/lo/Profile.json @@ -1,11 +1,11 @@ -{ - "ChangeEmailSuccess": "ອີເມວໄດ້ຖືກປ່ຽນແປງແລ້ວ", - "ChangesApplied": "ນຳໃຊ້ການປ່ຽນແປງ", - "ContactInformation": "ຂໍ້​ມູນ​ຕິດ​ຕໍ່", - "EditPhoto": "ແກ້ໄຂຮູບພາບ", - "EditSubscriptionsBtn": "ແກ້ໄຂການສະໝັກສະມາຊິກ", - "InviteAgainLbl": "ເຊີນອີກຄັ້ງ", - "MessageEmailActivationInstuctionsSentOnEmail": "ຄຳແນະນຳກ່ຽວກັບການເປີດໃຊ້ອີເມວໄດ້ຖືກສົ່ງໄປທີ່ {{ email }} ທີ່ຢູ່ອີເມວ", - "PhoneLbl": "ໂທລະສັບ", - "Subscriptions": "ການສະໝັກຮັບຂໍ້ມູນ" -} +{ + "ChangeEmailSuccess": "ອີເມວໄດ້ຖືກປ່ຽນແປງແລ້ວ", + "ChangesApplied": "ນຳໃຊ້ການປ່ຽນແປງ", + "ContactInformation": "ຂໍ້​ມູນ​ຕິດ​ຕໍ່", + "EditPhoto": "ແກ້ໄຂຮູບພາບ", + "EditSubscriptionsBtn": "ແກ້ໄຂການສະໝັກສະມາຊິກ", + "InviteAgainLbl": "ເຊີນອີກຄັ້ງ", + "MessageEmailActivationInstuctionsSentOnEmail": "ຄຳແນະນຳກ່ຽວກັບການເປີດໃຊ້ອີເມວໄດ້ຖືກສົ່ງໄປທີ່ {{ email }} ທີ່ຢູ່ອີເມວ", + "PhoneLbl": "ໂທລະສັບ", + "Subscriptions": "ການສະໝັກຮັບຂໍ້ມູນ" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/ProfileAction.json b/products/ASC.People/Client/public/locales/lo/ProfileAction.json index ff4733fd95..e816b3052c 100644 --- a/products/ASC.People/Client/public/locales/lo/ProfileAction.json +++ b/products/ASC.People/Client/public/locales/lo/ProfileAction.json @@ -1,23 +1,23 @@ -{ - "ActivationLink": "ການເປີດໃຊ້ງານລິ້ງ", - "AddContact": "ເພີ່ມຜູ້ຕິດຕໍ່", - "AddPhoto": "ເພີ່ມຮູບພາບ", - "Calendar": "ປະຕິທິນ", - "CalendarSelectDate": "ເລືອກວັນ", - "ChangeButton": "ການປ່ຽນແປງ", - "ChangesSavedSuccessfully": "ການປ່ຽນແປງຖືກບັນທຶກຮຽບຮ້ອຍແລ້ວ", - "ContactInformation": "ຂໍ້​ມູນ​ຕິດ​ຕໍ່", - "CustomCreation": "{{ຜູ້ໃຊ້}} (ການສ້າງ)", - "EditPhoto": "ແກ້ໄຂຮູບພາບ", - "EditUserDialogTitle": "ແກ້ໄຂໂປຣໄຟລ໌", - "EmailPopupHelper": "ອີເມວຫຼັກແມ່ນໃຊ້ ສຳ ລັບການແຈ້ງເຕືອນແລະການກູ້ຄືນການເຂົ້າເຖິງ.<1> ທ່ານສາມາດສ້າງອີເມວໃໝ່ໃນໂດເມນນີ້ສຳລັບຜູ້ໃຊ້ແລະຕັ້ງລະຫັດຜ່ານໜຶ່ງຄັ້ງສຳລັບການເຂົ້າສູ່ລະບົບຄັ້ງທຳອິດ.", - "FirstName": "ຊື່ແທ້", - "Message": "ເວົ້າ", - "ProductsAndInstruments_Products": "ໂມດູນ", - "ProfileAction": "ການດຳເນີນການໂປຣໄຟລ໌", - "ProfileTypePopupHelper": "ບຸກຄົນທົ່ວໄປຖືກຈຳກັດໃຫ້ເຂົ້າເຖິງຄຸນລັກສະນະບາງຢ່າງຂອງ Portal ແລະ ໂມດູນ", - "TemporaryPassword": "ລະຫັດຜ່ານຊົ່ວຄາວ", - "TermsOfUsePopupHelperLink": "ອ່ານເພີ່ມຕື່ມກ່ຽວກັບເງື່ອນໄຂການໃຊ້ງານ", - "UpdatingProcess": "ກຳລັງອັບເດດ...", - "WriteComment": "ເພີ່ມຄຳເຫັນ" -} +{ + "ActivationLink": "ການເປີດໃຊ້ງານລິ້ງ", + "AddContact": "ເພີ່ມຜູ້ຕິດຕໍ່", + "AddPhoto": "ເພີ່ມຮູບພາບ", + "Calendar": "ປະຕິທິນ", + "CalendarSelectDate": "ເລືອກວັນ", + "ChangeButton": "ການປ່ຽນແປງ", + "ChangesSavedSuccessfully": "ການປ່ຽນແປງຖືກບັນທຶກຮຽບຮ້ອຍແລ້ວ", + "ContactInformation": "ຂໍ້​ມູນ​ຕິດ​ຕໍ່", + "CustomCreation": "{{user}} (ການສ້າງ)", + "EditPhoto": "ແກ້ໄຂຮູບພາບ", + "EditUserDialogTitle": "ແກ້ໄຂໂປຣໄຟລ໌", + "EmailPopupHelper": "ອີເມວຫຼັກແມ່ນໃຊ້ ສຳ ລັບການແຈ້ງເຕືອນແລະການກູ້ຄືນການເຂົ້າເຖິງ.<1> ທ່ານສາມາດສ້າງອີເມວໃໝ່ໃນໂດເມນນີ້ສຳລັບຜູ້ໃຊ້ແລະຕັ້ງລະຫັດຜ່ານໜຶ່ງຄັ້ງສຳລັບການເຂົ້າສູ່ລະບົບຄັ້ງທຳອິດ.", + "FirstName": "ຊື່ແທ້", + "Message": "ເວົ້າ", + "ProductsAndInstruments_Products": "ໂມດູນ", + "ProfileAction": "ການດຳເນີນການໂປຣໄຟລ໌", + "ProfileTypePopupHelper": "ບຸກຄົນທົ່ວໄປຖືກຈຳກັດໃຫ້ເຂົ້າເຖິງຄຸນລັກສະນະບາງຢ່າງຂອງ Portal ແລະ ໂມດູນ", + "TemporaryPassword": "ລະຫັດຜ່ານຊົ່ວຄາວ", + "TermsOfUsePopupHelperLink": "ອ່ານເພີ່ມຕື່ມກ່ຽວກັບເງື່ອນໄຂການໃຊ້ງານ", + "UpdatingProcess": "ກຳລັງອັບເດດ...", + "WriteComment": "ເພີ່ມຄຳເຫັນ" +} diff --git a/products/ASC.People/Client/public/locales/lo/Reassign.json b/products/ASC.People/Client/public/locales/lo/Reassign.json index 5def9c042e..49124bf397 100644 --- a/products/ASC.People/Client/public/locales/lo/Reassign.json +++ b/products/ASC.People/Client/public/locales/lo/Reassign.json @@ -1,3 +1,3 @@ -{ - "ReassignmentData": "ການຈັດສັນຂໍ້ມູນຄືນ" +{ + "ReassignmentData": "ການຈັດສັນຂໍ້ມູນຄືນ" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/SendInviteDialog.json b/products/ASC.People/Client/public/locales/lo/SendInviteDialog.json index 7222081d96..ebbf0abca6 100644 --- a/products/ASC.People/Client/public/locales/lo/SendInviteDialog.json +++ b/products/ASC.People/Client/public/locales/lo/SendInviteDialog.json @@ -1,4 +1,4 @@ -{ - "SendInviteAgainDialog": "ຄຳເຊີນຈະຖືກສົ່ງອີກເທື່ອໜຶ່ງໃຫ້ກັບຜູ້ໃຊ້ທີ່ຖືກເລືອກດ້ວຍສະຖານະ \"ລໍຖ້າ\".", - "SendInviteAgainDialogMessage": "ຫຼັງຈາກຜູ້ໃຊ້ຍອມຮັບການເຊີນ, ສະຖານະພາບຂອງພວກເຂົາຈະຖືກປ່ຽນເປັນ 'ໃຊ້ງານຢູ່' " +{ + "SendInviteAgainDialog": "ຄຳເຊີນຈະຖືກສົ່ງອີກເທື່ອໜຶ່ງໃຫ້ກັບຜູ້ໃຊ້ທີ່ຖືກເລືອກດ້ວຍສະຖານະ \"ລໍຖ້າ\".", + "SendInviteAgainDialogMessage": "ຫຼັງຈາກຜູ້ໃຊ້ຍອມຮັບການເຊີນ, ສະຖານະພາບຂອງພວກເຂົາຈະຖືກປ່ຽນເປັນ 'ໃຊ້ງານຢູ່' " } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/lo/Translations.json b/products/ASC.People/Client/public/locales/lo/Translations.json index e27724e4f4..33d92f84e9 100644 --- a/products/ASC.People/Client/public/locales/lo/Translations.json +++ b/products/ASC.People/Client/public/locales/lo/Translations.json @@ -1,3 +1,3 @@ -{ - "Birthdate": "ວັນເກີດ" -} +{ + "Birthdate": "ວັນເກີດ" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/Article.json b/products/ASC.People/Client/public/locales/pt-BR/Article.json index 41a7d48791..485f75722f 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/Article.json +++ b/products/ASC.People/Client/public/locales/pt-BR/Article.json @@ -1,3 +1,4 @@ -{ - "ImportPeople": "Importar pessoas" +{ + "ImportPeople": "Importar pessoas", + "SendInvitesAgain": "Enviar convites novamente" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/BackupCodesDialog.json b/products/ASC.People/Client/public/locales/pt-BR/BackupCodesDialog.json new file mode 100644 index 0000000000..0ae85e7748 --- /dev/null +++ b/products/ASC.People/Client/public/locales/pt-BR/BackupCodesDialog.json @@ -0,0 +1,8 @@ +{ + "BackupCodesDescription": "Use códigos de backup para fazer login quando você não tiver acesso ao seu telefone.", + "BackupCodesSecondDescription": "Cada código pode ser usado uma vez. Você pode obter novos códigos a qualquer momento. Apenas os códigos gerados por último são válidos.", + "BackupCodesTitle": "Códigos de backup", + "CodesCounter": "códigos:", + "PrintButton": "Imprimir", + "RequestNewButton": "Solicitar novo" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/ChangeEmailDialog.json b/products/ASC.People/Client/public/locales/pt-BR/ChangeEmailDialog.json index 8b71d74ac7..d21b38ad05 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/ChangeEmailDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/ChangeEmailDialog.json @@ -1,17 +1,17 @@ -{ - "DomainIpAddress": "Os domínios como endereço IP não são suportados", - "EmailActivationDescription": "As instruções de ativação será enviado para o e-mail digitado", - "EmailChangeTitle": "Mudar e-mail", - "EmptyEmail": "Ninguém analisou o e-mail", - "EnterEmail": "Inserir um novo e-mail", - "IncorrectDomain": "Domínio incorreto", - "IncorrectEmail": "E-mail inválido", - "IncorrectLocalPart": "Parte local incorreta", - "LocalDomain": "Domínios locais não são suportados", - "ManyEmails": "Muitos e-mails analisados", - "MaxLengthExceeded": "O comprimento máximo de um nome de usuário ou outra parte local é de 64 caracteres.", - "PunycodeDomain": "Os domínios Punycode não são suportados", - "PunycodeLocalPart": "A peça local Punycode não é suportada", - "SameEmail": "Você não pode usar o mesmo e-mail", - "SpacesInLocalPart": "A parte local não pode conter espaços" +{ + "DomainIpAddress": "Os domínios como endereço IP não são suportados", + "EmailActivationDescription": "As instruções de ativação será enviado para o e-mail digitado", + "EmailChangeTitle": "Mudar e-mail", + "EmptyEmail": "Ninguém analisou o e-mail", + "EnterEmail": "Inserir um novo e-mail", + "IncorrectDomain": "Domínio incorreto", + "IncorrectEmail": "E-mail inválido", + "IncorrectLocalPart": "Parte local incorreta", + "LocalDomain": "Domínios locais não são suportados", + "ManyEmails": "Muitos e-mails analisados", + "MaxLengthExceeded": "O comprimento máximo de um nome de usuário ou outra parte local é de 64 caracteres.", + "PunycodeDomain": "Os domínios Punycode não são suportados", + "PunycodeLocalPart": "A peça local Punycode não é suportada", + "SameEmail": "Você não pode usar o mesmo e-mail", + "SpacesInLocalPart": "A parte local não pode conter espaços" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/ChangePasswordDialog.json b/products/ASC.People/Client/public/locales/pt-BR/ChangePasswordDialog.json index 3c02763778..f673b41fff 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/ChangePasswordDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/ChangePasswordDialog.json @@ -1,4 +1,4 @@ -{ - "MessageSendPasswordChangeInstructionsOnEmail": "Envie as instruções de mudança de senha para o <1>{{email}}", - "PasswordChangeTitle": "Alteração de senha" +{ + "MessageSendPasswordChangeInstructionsOnEmail": "Envie as instruções de mudança de senha para o <1>{{email}}", + "PasswordChangeTitle": "Alteração de senha" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/ChangePhoneDialog.json b/products/ASC.People/Client/public/locales/pt-BR/ChangePhoneDialog.json index 0db1d5983e..8ba71211ab 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/ChangePhoneDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/ChangePhoneDialog.json @@ -1,4 +1,5 @@ -{ - "MobilePhoneChangeTitle": "Alterar celular", - "MobilePhoneEraseDescription": "As instruções sobre como alterar o número de celular do usuário serão enviadas para o endereço de e-mail do usuário" +{ + "ChangePhoneInstructionSent": "As instruções de troca de telefone foram enviadas com sucesso", + "MobilePhoneChangeTitle": "Alterar celular", + "MobilePhoneEraseDescription": "As instruções sobre como alterar o número de celular do usuário serão enviadas para o endereço de e-mail do usuário" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/ChangeUserStatusDialog.json b/products/ASC.People/Client/public/locales/pt-BR/ChangeUserStatusDialog.json index d0afb7cf2a..84f4ff7260 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/ChangeUserStatusDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/ChangeUserStatusDialog.json @@ -1,8 +1,8 @@ -{ - "ChangeUsersActiveStatus": "Desabilitado", - "ChangeUsersDisableStatus": "Habilitado", - "ChangeUsersStatusButton": "Alterar status de usuário", - "ChangeUserStatusDialog": "Os usuários com o status '{{{ status }}}' serão desativados.", - "ChangeUserStatusDialogHeader": "Alterar status de usuário", - "ChangeUserStatusDialogMessage": "Você não pode mudar o status para o proprietário do portal e para você mesmo" -} \ No newline at end of file +{ + "ChangeUsersActiveStatus": "Desabilitado", + "ChangeUsersDisableStatus": "Habilitado", + "ChangeUsersStatusButton": "Alterar status de usuário", + "ChangeUserStatusDialog": "Os usuários com o status '{{ status }}' serão desativados.", + "ChangeUserStatusDialogHeader": "Alterar status de usuário", + "ChangeUserStatusDialogMessage": "Você não pode mudar o status para o proprietário do portal e para você mesmo" +} diff --git a/products/ASC.People/Client/public/locales/pt-BR/ChangeUserTypeDialog.json b/products/ASC.People/Client/public/locales/pt-BR/ChangeUserTypeDialog.json index 4b5ab98bc6..a8958b899a 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/ChangeUserTypeDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/ChangeUserTypeDialog.json @@ -1,7 +1,7 @@ -{ - "ChangeUserTypeButton": "Alterar Tipo", - "ChangeUserTypeHeader": "Alterar tipo do usuário", - "ChangeUserTypeMessage": "Os usuários com o tipo '{{{ firstType }}' serão movidos para o tipo '{{ secondType }}'.", - "ChangeUserTypeMessageWarning": "Você não pode mudar o tipo para os administradores do portal e para você", - "SuccessChangeUserType": "O tipo de usuário foi alterado com sucesso" -} \ No newline at end of file +{ + "ChangeUserTypeButton": "Alterar Tipo", + "ChangeUserTypeHeader": "Alterar tipo do usuário", + "ChangeUserTypeMessage": "Os usuários com o tipo '{{ firstType }}' serão movidos para o tipo '{{ secondType }}'.", + "ChangeUserTypeMessageWarning": "Você não pode mudar o tipo para os administradores do portal e para você", + "SuccessChangeUserType": "O tipo de usuário foi alterado com sucesso" +} diff --git a/products/ASC.People/Client/public/locales/pt-BR/DataLossWarningDialog.json b/products/ASC.People/Client/public/locales/pt-BR/DataLossWarningDialog.json index e130d1cf14..37f893e8e3 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/DataLossWarningDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/DataLossWarningDialog.json @@ -1,5 +1,5 @@ -{ - "DataLossWarningBody": "Suas mudanças não podem ser salvas.", - "DataLossWarningHeader": "Deixar a página?", - "DataLossWarningLeaveBtn": "Sair" +{ + "DataLossWarningBody": "Suas mudanças não podem ser salvas.", + "DataLossWarningHeader": "Deixar a página?", + "DataLossWarningLeaveBtn": "Sair" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/DeleteProfileEverDialog.json b/products/ASC.People/Client/public/locales/pt-BR/DeleteProfileEverDialog.json index fd8c6a1a41..fca0ce8e0d 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/DeleteProfileEverDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/DeleteProfileEverDialog.json @@ -1,6 +1,5 @@ -{ - "Confirmation": "Confirmação", - "DeleteUserConfirmation": "{{userCaption}} {{user}} será deletado.", - "DeleteUserDataConfirmation": "Os documentos de usuário compartilhados com outros serão excluídos. Para evitar isto, reatribuir dados.", - "SuccessfullyDeleteUserInfoMessage": "O usuário foi excluído com sucesso" -} \ No newline at end of file +{ + "DeleteUserConfirmation": "{{userCaption}} {{user}} será deletado.", + "DeleteUserDataConfirmation": "Os documentos de usuário compartilhados com outros serão excluídos. Para evitar isto, reatribuir dados.", + "SuccessfullyDeleteUserInfoMessage": "O usuário foi excluído com sucesso" +} diff --git a/products/ASC.People/Client/public/locales/pt-BR/DeleteSelfProfileDialog.json b/products/ASC.People/Client/public/locales/pt-BR/DeleteSelfProfileDialog.json index 03e9921f12..cf562b04f1 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/DeleteSelfProfileDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/DeleteSelfProfileDialog.json @@ -1,4 +1,4 @@ -{ - "DeleteProfileInfo": "Enviar as instruções de exclusão de perfil para o endereço de e-mail", - "DeleteProfileTitle": "Excluir diálogo do perfil" +{ + "DeleteProfileInfo": "Enviar as instruções de exclusão de perfil para o endereço de e-mail", + "DeleteProfileTitle": "Excluir diálogo do perfil" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/DeleteUsersDialog.json b/products/ASC.People/Client/public/locales/pt-BR/DeleteUsersDialog.json index dc26989057..6e16c82032 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/DeleteUsersDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/DeleteUsersDialog.json @@ -1,6 +1,6 @@ -{ - "DeleteGroupUsersMessage": "Os usuários deficientes que você selecionou serão excluídos.", - "DeleteGroupUsersMessageHeader": "Excluir os usuários do portal", - "DeleteGroupUsersSuccessMessage": "Os usuários foram excluídos com sucesso.", - "DeleteUserDataConfirmation": "Os documentos dos usuários compartilhados serão excluídos. Para evitar isto, reatribuir dados." +{ + "DeleteGroupUsersMessage": "Os usuários deficientes que você selecionou serão excluídos.", + "DeleteGroupUsersMessageHeader": "Excluir os usuários do portal", + "DeleteGroupUsersSuccessMessage": "Os usuários foram excluídos com sucesso.", + "DeleteUserDataConfirmation": "Os documentos dos usuários compartilhados serão excluídos. Para evitar isto, reatribuir dados." } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/GroupAction.json b/products/ASC.People/Client/public/locales/pt-BR/GroupAction.json index fdec267e97..0c317282e3 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/GroupAction.json +++ b/products/ASC.People/Client/public/locales/pt-BR/GroupAction.json @@ -1,7 +1,8 @@ -{ - "CustomNewDepartment": "{{groupCaption}} (criação)", - "GroupAction": "Ação em grupo", - "Members": "Membros", - "SearchAddedMembers": "Pesquisar membros adicionados", - "SuccessSaveGroup": "{{groupCaption}} '{{ groupName }}' foi salvo com sucesso" -} +{ + "CustomNewDepartment": "{{groupCaption}} (criação)", + "GroupAction": "Ação em grupo", + "Members": "Membros", + "SearchAddedMembers": "Pesquisar membros adicionados", + "SelectAction": "Selecionar", + "SuccessSaveGroup": "{{groupCaption}} '{{ groupName }}' foi salvo com sucesso" +} diff --git a/products/ASC.People/Client/public/locales/pt-BR/GroupSelector.json b/products/ASC.People/Client/public/locales/pt-BR/GroupSelector.json index aef83643f7..bb190607c4 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/GroupSelector.json +++ b/products/ASC.People/Client/public/locales/pt-BR/GroupSelector.json @@ -1,6 +1,6 @@ -{ - "AddDepartmentsButtonLabel": "Adicionar departamentos", - "EmptyOptionsLabel": "Não há departamentos", - "EmptySearchOptionsLabel": "Não há departamentos com tal nome", - "SearchPlaceholder": "Grupos de busca" +{ + "AddDepartmentsButtonLabel": "Adicionar departamentos", + "EmptyOptionsLabel": "Não há departamentos", + "EmptySearchOptionsLabel": "Não há departamentos com tal nome", + "SearchPlaceholder": "Grupos de busca" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/Home.json b/products/ASC.People/Client/public/locales/pt-BR/Home.json index b340375045..db890bf1e7 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/Home.json +++ b/products/ASC.People/Client/public/locales/pt-BR/Home.json @@ -1,20 +1,20 @@ -{ - "Administrator": "Administrador", - "ChangeToGuest": "Mudança para {{guestCaption}}", - "ChangeToUser": "Mude para {{userCaption}}", - "EmptyGroupDescription": "Você pode adicionar novos membros à equipe manualmente ou convidá-los através de um link.", - "EmptyGroupTitle": "Ainda não há colegas de equipe aqui", - "LblInviteAgain": "Convidar novamente", - "LblInvited": "Convidado", - "LblOther": "Outro", - "LblSendEmail": "Enviar e-mail", - "LblSendMessage": "Enviar mensagem", - "LblSetActive": "Ativar", - "LblSetDisabled": "Conjunto desativado", - "MakeInvitationLink": "Criar link para convite", - "MessageEmailActivationInstuctionsSentOnEmail": "As instruções de ativação de e-mail foram enviadas para o endereço de e-mail <1>{{{{email}}", - "NotFoundDescription": "Tente um filtro diferente ou limpe-o para ver todas as pessoas da seção.", - "NotFoundTitle": "Nenhum colega de equipe encontrado", - "SuccessfullyRemovedGroup": "O grupo foi removido com sucesso", - "UserStatus": "Status" -} \ No newline at end of file +{ + "Administrator": "Administrador", + "ChangeToGuest": "Mudança para {{guestCaption}}", + "ChangeToUser": "Mude para {{userCaption}}", + "EmptyGroupDescription": "Você pode adicionar novos membros à equipe manualmente ou convidá-los através de um link.", + "EmptyGroupTitle": "Ainda não há colegas de equipe aqui", + "LblInviteAgain": "Convidar novamente", + "LblInvited": "Convidado", + "LblOther": "Outro", + "LblSendEmail": "Enviar e-mail", + "LblSendMessage": "Enviar mensagem", + "LblSetActive": "Ativar", + "LblSetDisabled": "Conjunto desativado", + "MakeInvitationLink": "Criar link para convite", + "MessageEmailActivationInstuctionsSentOnEmail": "As instruções de ativação de e-mail foram enviadas para o endereço de e-mail <1>{{email}}", + "NotFoundDescription": "Tente um filtro diferente ou limpe-o para ver todas as pessoas da seção.", + "NotFoundTitle": "Nenhum colega de equipe encontrado", + "SuccessfullyRemovedGroup": "O grupo foi removido com sucesso", + "UserStatus": "Status" +} diff --git a/products/ASC.People/Client/public/locales/pt-BR/InviteDialog.json b/products/ASC.People/Client/public/locales/pt-BR/InviteDialog.json index c3d117529f..531289ff99 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/InviteDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/InviteDialog.json @@ -1,8 +1,8 @@ -{ - "CopyToClipboard": "Copiar o link", - "GetShortenLink": "Obter link abreviado", - "HelpAnswerLinkInviteSettings": "Compartilhe o link para convidar colegas para seu portal.", - "InviteLinkValidInterval": "Este link é válido somente por {{{count }} dias.", - "InviteUsersAsCollaborators": "Adicionar usuários como {{guestsCaption, lowercase}}", - "LinkCopySuccess": "O link foi copiado" -} \ No newline at end of file +{ + "CopyToClipboard": "Copiar o link", + "GetShortenLink": "Obter link abreviado", + "HelpAnswerLinkInviteSettings": "Compartilhe o link para convidar colegas para seu portal.", + "InviteLinkValidInterval": "Este link é válido somente por {{count}} dias.", + "InviteUsersAsCollaborators": "Adicionar usuários como {{guestsCaption, lowercase}}", + "LinkCopySuccess": "O link foi copiado" +} diff --git a/products/ASC.People/Client/public/locales/pt-BR/PeopleSelector.json b/products/ASC.People/Client/public/locales/pt-BR/PeopleSelector.json index 3feaa08e65..981aa21883 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/PeopleSelector.json +++ b/products/ASC.People/Client/public/locales/pt-BR/PeopleSelector.json @@ -1,6 +1,6 @@ -{ - "CustomAllGroups": "Todos {{ groupsCaption, lowercase }}", - "EmptySearchUsersResult": "Não há usuários com tal nome", - "EmptyUsers": "Não há usuários", - "SearchUsersPlaceholder": "Pesquisar usuários" +{ + "CustomAllGroups": "Todos {{ groupsCaption, lowercase }}", + "EmptySearchUsersResult": "Não há usuários com tal nome", + "EmptyUsers": "Não há usuários", + "SearchUsersPlaceholder": "Pesquisar usuários" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/Profile.json b/products/ASC.People/Client/public/locales/pt-BR/Profile.json index bf5061b465..8ee67158d1 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/Profile.json +++ b/products/ASC.People/Client/public/locales/pt-BR/Profile.json @@ -1,11 +1,21 @@ -{ - "ChangeEmailSuccess": "O e-mail foi alterado com sucesso", - "ChangesApplied": "Alterações são aplicadas", - "ContactInformation": "Informação de Contato", - "EditPhoto": "Editar Foto", - "EditSubscriptionsBtn": "Editar assinaturas", - "InviteAgainLbl": "Convidar novamente", - "MessageEmailActivationInstuctionsSentOnEmail": "As instruções de ativação de e-mail foram enviadas para o endereço de e-mail {{{ e-mail }}", - "PhoneLbl": "Telefone", - "Subscriptions": "Assinaturas" -} +{ + "ChangeEmailSuccess": "O e-mail foi alterado com sucesso", + "ChangesApplied": "Alterações são aplicadas", + "Connect": "Conectar", + "ContactInformation": "Informação de Contato", + "CountCodesRemaining": "códigos restantes", + "Disconnect": "Desconectar", + "EditPhoto": "Editar Foto", + "EditSubscriptionsBtn": "Editar assinaturas", + "EditUser": "Editar Perfil", + "InviteAgainLbl": "Convidar novamente", + "LoginSettings": "Ajustes de acesso", + "MessageEmailActivationInstuctionsSentOnEmail": "As instruções de ativação de e-mail foram enviadas para o endereço de e-mail {{email}}", + "PhoneLbl": "Telefone", + "ProviderSuccessfullyConnected": "Provedor conectado com sucesso", + "ProviderSuccessfullyDisconnected": "Provedor desconectado com sucesso", + "ShowBackupCodes": "Mostrar códigos de backup", + "Subscriptions": "Assinaturas", + "TfaLoginSettings": "Ajustes de acesso", + "TwoFactorDescription": "A autenticação de dois fatores por meio de um aplicativo de geração de código foi habilitada para todos os usuários pelo administrador." +} diff --git a/products/ASC.People/Client/public/locales/pt-BR/ProfileAction.json b/products/ASC.People/Client/public/locales/pt-BR/ProfileAction.json index 58ec6f113e..04e4578b61 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/ProfileAction.json +++ b/products/ASC.People/Client/public/locales/pt-BR/ProfileAction.json @@ -1,25 +1,26 @@ -{ - "ActivationLink": "Link de ativação", - "AddContact": "Adicionar contato", - "AddPhoto": "Adicionar foto", - "Calendar": "Calendário", - "CalendarSelectDate": "Selecione a data", - "ChangeButton": "Trocar", - "ChangesSavedSuccessfully": "Mudanças salvas com sucesso", - "ContactInformation": "Informação de Contato", - "CustomCreation": "{{user}} (criação)", - "EditPhoto": "Editar Foto", - "EditUserDialogTitle": "Editar Perfil", - "EmailPopupHelper": "O e-mail principal é utilizado para notificações e restabelecimento do acesso. <1> Você pode criar um novo e-mail neste domínio para o usuário e definir uma senha única para o primeiro login.", - "FirstName": "Primeiro nome", - "Message": "Bate-papo com outros usuários", - "ProductsAndInstruments_Products": "Módulos", - "ProfileAction": "Ação de perfil", - "ProfileTypePopupHelper": "Os hóspedes têm acesso limitado a alguns recursos e módulos do portal", - "TemporaryPassword": "Senha temporária", - "TermsOfUsePopupHelperLink": "Leia mais sobre os termos de uso", - "UpdatingProcess": "Atualizando...", - "WriteComment": "Adicionar comentário", - "ErrorInvalidUserLastName": "Sobrenome inválido", - "ErrorInvalidUserFirstName": "Primeiro nome inválido" -} +{ + "ActivationLink": "Link de ativação", + "AddContact": "Adicionar contato", + "AddPhoto": "Adicionar foto", + "Calendar": "Calendário", + "CalendarSelectDate": "Selecione a data", + "ChangeButton": "Trocar", + "ChangesSavedSuccessfully": "Mudanças salvas com sucesso", + "ContactInformation": "Informação de Contato", + "CopiedResourceText": "Copiado", + "CustomCreation": "{{user}} (criação)", + "EditPhoto": "Editar Foto", + "EditUserDialogTitle": "Editar Perfil", + "EmailPopupHelper": "O e-mail principal é utilizado para notificações e restabelecimento do acesso. <1> Você pode criar um novo e-mail neste domínio para o usuário e definir uma senha única para o primeiro login.", + "ErrorInvalidUserLastName": "Sobrenome inválido", + "ErrorInvalidUserFirstName": "Primeiro nome inválido", + "FirstName": "Primeiro nome", + "Message": "Bate-papo com outros usuários", + "ProductsAndInstruments_Products": "Módulos", + "ProfileAction": "Ação de perfil", + "ProfileTypePopupHelper": "Os hóspedes têm acesso limitado a alguns recursos e módulos do portal", + "TemporaryPassword": "Senha temporária", + "TermsOfUsePopupHelperLink": "Leia mais sobre os termos de uso", + "UpdatingProcess": "Atualizando...", + "WriteComment": "Adicionar comentário" +} diff --git a/products/ASC.People/Client/public/locales/pt-BR/Reassign.json b/products/ASC.People/Client/public/locales/pt-BR/Reassign.json index 2e53725664..1338474fcd 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/Reassign.json +++ b/products/ASC.People/Client/public/locales/pt-BR/Reassign.json @@ -1,3 +1,3 @@ -{ - "ReassignmentData": "Reatribuição de dados" +{ + "ReassignmentData": "Reatribuição de dados" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/ResetApplicationDialog.json b/products/ASC.People/Client/public/locales/pt-BR/ResetApplicationDialog.json new file mode 100644 index 0000000000..8a253f9e1a --- /dev/null +++ b/products/ASC.People/Client/public/locales/pt-BR/ResetApplicationDialog.json @@ -0,0 +1,4 @@ +{ + "ResetApplicationDescription": "A configuração da aplicação do autenticador será redefinida.", + "ResetApplicationTitle": "Redefinir a configuração da aplicação" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/SendInviteDialog.json b/products/ASC.People/Client/public/locales/pt-BR/SendInviteDialog.json index 4d12595a49..5a759fbbcb 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/SendInviteDialog.json +++ b/products/ASC.People/Client/public/locales/pt-BR/SendInviteDialog.json @@ -1,4 +1,4 @@ -{ - "SendInviteAgainDialog": "O convite será enviado novamente para os usuários selecionados com o status \"Pendente\".", - "SendInviteAgainDialogMessage": "Após os usuários aceitarem o convite, seu status será alterado para 'Ativo'." +{ + "SendInviteAgainDialog": "O convite será enviado novamente para os usuários selecionados com o status \"Pendente\".", + "SendInviteAgainDialogMessage": "Após os usuários aceitarem o convite, seu status será alterado para 'Ativo'." } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/pt-BR/Translations.json b/products/ASC.People/Client/public/locales/pt-BR/Translations.json index abb158e63d..02c48d6fb6 100644 --- a/products/ASC.People/Client/public/locales/pt-BR/Translations.json +++ b/products/ASC.People/Client/public/locales/pt-BR/Translations.json @@ -1,3 +1,30 @@ -{ - "Birthdate": "Data de Nascimento" -} +{ + "AddMembers": "Adicionar membros", + "Birthdate": "Data de Nascimento", + "Comments": "Comentários", + "DeleteSelfProfile": "Excluir perfil", + "DisabledEmployeeStatus": "Desabilitado", + "DisableUserButton": "Desabilitar", + "EmailChangeButton": "Alterar e-mail", + "EnableUserButton": "Habilitar", + "ErrorUnknownFileImageType": "Tipo desconhcido de arquivo de imagem", + "FemaleSexStatus": "Feminino", + "InviteLinkTitle": "Link de convite", + "LDAPLbl": "LDAP", + "Location": "Localização", + "MaleSexStatus": "Masculino", + "maxSizeFileError": "Tamanho máximo de arquivo excedido", + "NotBeUndone": "Nota: esta ação não pode ser desfeita.", + "orDropFileHereLabel": "ou solte um arquivo aqui", + "PasswordChangeButton": "Alterar Senha", + "PendingTitle": "Pendente", + "ReassignData": "Reatribuir dados", + "RemoveData": "Excluir dados pessoais", + "selectNewPhotoLabel": "Selecione uma nova foto", + "SendInviteAgain": "Enviar convite novamente", + "Sex": "Sexo", + "SocialProfiles": "Perfis Sociais", + "SuccessChangeUserStatus": "O status de usuário foi alterado com sucesso", + "SuccessDeletePersonalData": "Os dados pessoais foram excluídos com sucesso", + "SuccessSentInvitation": "O convite foi enviado com sucesso" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/Article.json b/products/ASC.People/Client/public/locales/ro/Article.json index d2fa9fc581..da04a96174 100644 --- a/products/ASC.People/Client/public/locales/ro/Article.json +++ b/products/ASC.People/Client/public/locales/ro/Article.json @@ -1,3 +1,4 @@ -{ - "ImportPeople": "Importarea persoanelor" +{ + "ImportPeople": "Importarea persoanelor", + "SendInvitesAgain": "Trimiteți invitațiile din nou" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/BackupCodesDialog.json b/products/ASC.People/Client/public/locales/ro/BackupCodesDialog.json new file mode 100644 index 0000000000..2cbab27c1c --- /dev/null +++ b/products/ASC.People/Client/public/locales/ro/BackupCodesDialog.json @@ -0,0 +1,8 @@ +{ + "BackupCodesDescription": "Utilizați coduri de rezervă când intrați în cont fără acces la telefonul dvs.", + "BackupCodesSecondDescription": "Fiecare cod poate fi utilizat o singură dată. Puteți obține oricând coduri noi. Numai codurile care au fost gererate ultima dată sunt valabile.", + "BackupCodesTitle": "Coduri de rezervă", + "CodesCounter": "coduri:", + "PrintButton": "Imprimare", + "RequestNewButton": "Solicitare unui nou" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/ChangeEmailDialog.json b/products/ASC.People/Client/public/locales/ro/ChangeEmailDialog.json index 51d02d31ca..5f1f40d29b 100644 --- a/products/ASC.People/Client/public/locales/ro/ChangeEmailDialog.json +++ b/products/ASC.People/Client/public/locales/ro/ChangeEmailDialog.json @@ -1,17 +1,17 @@ -{ - "DomainIpAddress": "Domenii sub forma unei adrese IP nu sunt acceptate", - "EmailActivationDescription": "Instructiunile de activare vor fi trimise la adresa de e-mail indicată", - "EmailChangeTitle": "Modificarea adresei e-mail", - "EmptyEmail": "Niciun e-mail nu a fost parsat", - "EnterEmail": "Introduceți noua adresă de e-mail", - "IncorrectDomain": "Domeniul nu este valabil", - "IncorrectEmail": "Adresa de e-mail nu este valabilă", - "IncorrectLocalPart": "Partea locală este incorectă", - "LocalDomain": "Domeniile locale nu sunt acceptate", - "ManyEmails": "Prea multe e-mailuri de analizat", - "MaxLengthExceeded": "Lungimea maximă a numelui de utilizator sau a unei alte părți locale este de 64 caractere.", - "PunycodeDomain": "Domeniile Punycode nu sunt acceptate", - "PunycodeLocalPart": "Partea locală Punycode nu este acceptată", - "SameEmail": "Nu puteți folosi una și aceeaşi adresă adresa e-mail ", - "SpacesInLocalPart": "Partea locală nu trebuie să conțină spații" +{ + "DomainIpAddress": "Domenii sub forma unei adrese IP nu sunt acceptate", + "EmailActivationDescription": "Instructiunile de activare vor fi trimise la adresa de e-mail indicată", + "EmailChangeTitle": "Modificarea adresei e-mail", + "EmptyEmail": "Niciun e-mail nu a fost parsat", + "EnterEmail": "Introduceți noua adresă de e-mail", + "IncorrectDomain": "Domeniul nu este valabil", + "IncorrectEmail": "Adresa de e-mail nu este valabilă", + "IncorrectLocalPart": "Partea locală este incorectă", + "LocalDomain": "Domeniile locale nu sunt acceptate", + "ManyEmails": "Prea multe e-mailuri de analizat", + "MaxLengthExceeded": "Lungimea maximă a numelui de utilizator sau a unei alte părți locale este de 64 caractere.", + "PunycodeDomain": "Domeniile Punycode nu sunt acceptate", + "PunycodeLocalPart": "Partea locală Punycode nu este acceptată", + "SameEmail": "Nu puteți folosi una și aceeaşi adresă adresa e-mail ", + "SpacesInLocalPart": "Partea locală nu trebuie să conțină spații" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/ChangePasswordDialog.json b/products/ASC.People/Client/public/locales/ro/ChangePasswordDialog.json index 2c9600f130..b86df85ab9 100644 --- a/products/ASC.People/Client/public/locales/ro/ChangePasswordDialog.json +++ b/products/ASC.People/Client/public/locales/ro/ChangePasswordDialog.json @@ -1,4 +1,4 @@ -{ - "MessageSendPasswordChangeInstructionsOnEmail": "Trimiteți instrucțiunile pentru schimbarea parolei la <1>{{email}}", - "PasswordChangeTitle": "Schimbarea parolei" +{ + "MessageSendPasswordChangeInstructionsOnEmail": "Trimiteți instrucțiunile pentru schimbarea parolei la <1>{{email}}", + "PasswordChangeTitle": "Schimbarea parolei" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/ChangePhoneDialog.json b/products/ASC.People/Client/public/locales/ro/ChangePhoneDialog.json index 8805a9b49d..6477c31956 100644 --- a/products/ASC.People/Client/public/locales/ro/ChangePhoneDialog.json +++ b/products/ASC.People/Client/public/locales/ro/ChangePhoneDialog.json @@ -1,4 +1,5 @@ -{ - "MobilePhoneChangeTitle": "Modificare telefon mobil", - "MobilePhoneEraseDescription": "Instrucțiunile privind modificarea numărului de telefon mobil at utilizatorului vir fi trimise la adresa de e-mail a utilizatorului" +{ + "ChangePhoneInstructionSent": "Instrucțiuni de schimbare a numărului de telefon au fost trimise cu succes", + "MobilePhoneChangeTitle": "Modificare telefon mobil", + "MobilePhoneEraseDescription": "Instrucțiunile privind modificarea numărului de telefon mobil at utilizatorului vir fi trimise la adresa de e-mail a utilizatorului" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/ChangeUserStatusDialog.json b/products/ASC.People/Client/public/locales/ro/ChangeUserStatusDialog.json index b46b07b6d3..61e8baeb54 100644 --- a/products/ASC.People/Client/public/locales/ro/ChangeUserStatusDialog.json +++ b/products/ASC.People/Client/public/locales/ro/ChangeUserStatusDialog.json @@ -1,8 +1,8 @@ -{ - "ChangeUsersActiveStatus": "dezactivat", - "ChangeUsersDisableStatus": "activat", - "ChangeUsersStatusButton": "Schimbați statutul utilizatorului", - "ChangeUserStatusDialog": "Utilizatorii cu statutul '{{ status }}' vor fi dezactivate.", - "ChangeUserStatusDialogHeader": "Schimbați statutul utilizatorului", - "ChangeUserStatusDialogMessage": "Nu puteți schimba statutul posesirului portalului și nici al dumneavoastră" +{ + "ChangeUsersActiveStatus": "dezactivat", + "ChangeUsersDisableStatus": "activat", + "ChangeUsersStatusButton": "Schimbați statutul utilizatorului", + "ChangeUserStatusDialog": "Utilizatorii cu statutul '{{ status }}' vor fi dezactivate.", + "ChangeUserStatusDialogHeader": "Schimbați statutul utilizatorului", + "ChangeUserStatusDialogMessage": "Nu puteți schimba statutul posesirului portalului și nici al dumneavoastră" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/ChangeUserTypeDialog.json b/products/ASC.People/Client/public/locales/ro/ChangeUserTypeDialog.json index 229aace050..e4fd0d38e4 100644 --- a/products/ASC.People/Client/public/locales/ro/ChangeUserTypeDialog.json +++ b/products/ASC.People/Client/public/locales/ro/ChangeUserTypeDialog.json @@ -1,7 +1,7 @@ -{ - "ChangeUserTypeButton": "Modificare tip", - "ChangeUserTypeHeader": "Schimbați tipul utilizatorului", - "ChangeUserTypeMessage": "Utilizatorii de tipul '{{ firstType }}' vor fi transferați la tipul '{{ secondType }}'.", - "ChangeUserTypeMessageWarning": "Nu puteți schimba tipul administratorului de portal și nici al dumneavoastră", - "SuccessChangeUserType": "Tipul utilizatorului a fost modificat cu succes" +{ + "ChangeUserTypeButton": "Modificare tip", + "ChangeUserTypeHeader": "Schimbați tipul utilizatorului", + "ChangeUserTypeMessage": "Utilizatorii de tipul '{{ firstType }}' vor fi transferați la tipul '{{ secondType }}'.", + "ChangeUserTypeMessageWarning": "Nu puteți schimba tipul administratorului de portal și nici al dumneavoastră", + "SuccessChangeUserType": "Tipul utilizatorului a fost modificat cu succes" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/DataLossWarningDialog.json b/products/ASC.People/Client/public/locales/ro/DataLossWarningDialog.json index b76904efea..b1cef6dbbc 100644 --- a/products/ASC.People/Client/public/locales/ro/DataLossWarningDialog.json +++ b/products/ASC.People/Client/public/locales/ro/DataLossWarningDialog.json @@ -1,5 +1,5 @@ -{ - "DataLossWarningBody": "Modificările pe care le-ați adus nu pot fi salvate.", - "DataLossWarningHeader": "Doriţi să părăsiţi pagina?", - "DataLossWarningLeaveBtn": "Părăsește" +{ + "DataLossWarningBody": "Modificările pe care le-ați adus nu pot fi salvate.", + "DataLossWarningHeader": "Doriţi să părăsiţi pagina?", + "DataLossWarningLeaveBtn": "Părăsește" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/DeleteProfileEverDialog.json b/products/ASC.People/Client/public/locales/ro/DeleteProfileEverDialog.json index 02856fabf5..75d12ac607 100644 --- a/products/ASC.People/Client/public/locales/ro/DeleteProfileEverDialog.json +++ b/products/ASC.People/Client/public/locales/ro/DeleteProfileEverDialog.json @@ -1,6 +1,5 @@ -{ - "Confirmation": "Confirmare", - "DeleteUserConfirmation": "{{userCaption}} {{user}} va fi șters.", - "DeleteUserDataConfirmation": "Documentele utilizatorului care au fost partajate cu alții vor fi șterse. Pentru a evita acest risc, reasignați datele.", - "SuccessfullyDeleteUserInfoMessage": "Utilizatorul a fost șters cu succes" -} \ No newline at end of file +{ + "DeleteUserConfirmation": "{{userCaption}} {{user}} va fi șters.", + "DeleteUserDataConfirmation": "Documentele utilizatorului care au fost partajate cu alții vor fi șterse. Pentru a evita acest risc, reasignați datele.", + "SuccessfullyDeleteUserInfoMessage": "Utilizatorul a fost șters cu succes" +} diff --git a/products/ASC.People/Client/public/locales/ro/DeleteSelfProfileDialog.json b/products/ASC.People/Client/public/locales/ro/DeleteSelfProfileDialog.json index a37cd72014..adcdc7ef77 100644 --- a/products/ASC.People/Client/public/locales/ro/DeleteSelfProfileDialog.json +++ b/products/ASC.People/Client/public/locales/ro/DeleteSelfProfileDialog.json @@ -1,4 +1,4 @@ -{ - "DeleteProfileInfo": "Trimiteți instrucțiunile pentru ștergerea profilului la adresa e-mail", - "DeleteProfileTitle": "Casetă de dialog Ștergere profil" +{ + "DeleteProfileInfo": "Trimiteți instrucțiunile pentru ștergerea profilului la adresa e-mail", + "DeleteProfileTitle": "Casetă de dialog Ștergere profil" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/DeleteUsersDialog.json b/products/ASC.People/Client/public/locales/ro/DeleteUsersDialog.json index 34f90f3905..65be5abb76 100644 --- a/products/ASC.People/Client/public/locales/ro/DeleteUsersDialog.json +++ b/products/ASC.People/Client/public/locales/ro/DeleteUsersDialog.json @@ -1,6 +1,6 @@ -{ - "DeleteGroupUsersMessage": "Utilizatorii inactivi pe care le-ați selecționat vor fi șterse.", - "DeleteGroupUsersMessageHeader": "Ștergerea utilizatorilor din portal", - "DeleteGroupUsersSuccessMessage": "Utilizatorii au fost șterse cu succes.", - "DeleteUserDataConfirmation": "Documentele utilizatorului care au fost partajate cu alții vor fi șterse. Pentru a evita acest risc, reasignați datele." +{ + "DeleteGroupUsersMessage": "Utilizatorii inactivi pe care le-ați selecționat vor fi șterse.", + "DeleteGroupUsersMessageHeader": "Ștergerea utilizatorilor din portal", + "DeleteGroupUsersSuccessMessage": "Utilizatorii au fost șterse cu succes.", + "DeleteUserDataConfirmation": "Documentele utilizatorului care au fost partajate cu alții vor fi șterse. Pentru a evita acest risc, reasignați datele." } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/GroupAction.json b/products/ASC.People/Client/public/locales/ro/GroupAction.json index 3f34cc0a16..a100f76ce6 100644 --- a/products/ASC.People/Client/public/locales/ro/GroupAction.json +++ b/products/ASC.People/Client/public/locales/ro/GroupAction.json @@ -1,7 +1,8 @@ -{ - "CustomNewDepartment": "{{groupCaption}} (creare)", - "GroupAction": "Acțiune de grup", - "Members": "Membrii", - "SearchAddedMembers": "Căutare după membrii adăugați", - "SuccessSaveGroup": "{{groupCaption}} '{{ groupName }}' a fost salvat cu succes" -} +{ + "CustomNewDepartment": "{{groupCaption}} (creare)", + "GroupAction": "Acțiune de grup", + "Members": "Membrii", + "SearchAddedMembers": "Căutare după membrii adăugați", + "SelectAction": "Selectare", + "SuccessSaveGroup": "{{groupCaption}} '{{ groupName }}' a fost salvat cu succes" +} diff --git a/products/ASC.People/Client/public/locales/ro/GroupSelector.json b/products/ASC.People/Client/public/locales/ro/GroupSelector.json index 0bda8a8fd2..225043b662 100644 --- a/products/ASC.People/Client/public/locales/ro/GroupSelector.json +++ b/products/ASC.People/Client/public/locales/ro/GroupSelector.json @@ -1,6 +1,6 @@ -{ - "AddDepartmentsButtonLabel": "Departament nou", - "EmptyOptionsLabel": "Departamente nu s-au găsit", - "EmptySearchOptionsLabel": "Departamente cu acest nume nu s-au găsit", - "SearchPlaceholder": "Căutare după grupe" +{ + "AddDepartmentsButtonLabel": "Departament nou", + "EmptyOptionsLabel": "Departamente nu s-au găsit", + "EmptySearchOptionsLabel": "Departamente cu acest nume nu s-au găsit", + "SearchPlaceholder": "Căutare după grupe" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/Home.json b/products/ASC.People/Client/public/locales/ro/Home.json index c9183a0d17..3e347044f5 100644 --- a/products/ASC.People/Client/public/locales/ro/Home.json +++ b/products/ASC.People/Client/public/locales/ro/Home.json @@ -1,20 +1,20 @@ -{ - "Administrator": "Administrator", - "ChangeToGuest": "Se schimbă în {{guestCaption}}", - "ChangeToUser": "Se schimbă în {{userCaption}}", - "EmptyGroupDescription": "Puteți adăuga manual membrii noi la o echip sau le invitați prin link.", - "EmptyGroupTitle": "Deocamdată nu aveți niciun membru al echipei", - "LblInviteAgain": "Invită din nou", - "LblInvited": "A fost invitat", - "LblOther": "Altă", - "LblSendEmail": "Trimite un e-mail", - "LblSendMessage": "Trimiteți mesajul", - "LblSetActive": "Setare la activ", - "LblSetDisabled": "Setare la inactiv", - "MakeInvitationLink": "Creează un link de invitație", - "MessageEmailActivationInstuctionsSentOnEmail": "Instrucțiunile de activare a adresei e-mail au fost trimise la <1>{{email}}", - "NotFoundDescription": "Aplicați un alt filtru sau îl eliminați ca să afișați toți utilizatorii din secțiunea.", - "NotFoundTitle": "Niciun membru al echipei nu s-a găsit", - "SuccessfullyRemovedGroup": "Grupul a fost șters cu succes", - "UserStatus": "Statutul" +{ + "Administrator": "Administrator", + "ChangeToGuest": "Se schimbă în {{guestCaption}}", + "ChangeToUser": "Se schimbă în {{userCaption}}", + "EmptyGroupDescription": "Puteți adăuga manual membrii noi la o echip sau le invitați prin link.", + "EmptyGroupTitle": "Deocamdată nu aveți niciun membru al echipei", + "LblInviteAgain": "Invită din nou", + "LblInvited": "A fost invitat", + "LblOther": "Altă", + "LblSendEmail": "Trimite un e-mail", + "LblSendMessage": "Trimiteți mesajul", + "LblSetActive": "Setare la activ", + "LblSetDisabled": "Setare la inactiv", + "MakeInvitationLink": "Creează un link de invitație", + "MessageEmailActivationInstuctionsSentOnEmail": "Instrucțiunile de activare a adresei e-mail au fost trimise la <1>{{email}}", + "NotFoundDescription": "Aplicați un alt filtru sau îl eliminați ca să afișați toți utilizatorii din secțiunea.", + "NotFoundTitle": "Niciun membru al echipei nu s-a găsit", + "SuccessfullyRemovedGroup": "Grupul a fost șters cu succes", + "UserStatus": "Statutul" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/InviteDialog.json b/products/ASC.People/Client/public/locales/ro/InviteDialog.json index 4b72d981cc..d7e6d9c605 100644 --- a/products/ASC.People/Client/public/locales/ro/InviteDialog.json +++ b/products/ASC.People/Client/public/locales/ro/InviteDialog.json @@ -1,8 +1,8 @@ -{ - "CopyToClipboard": "Copiază link-ul", - "GetShortenLink": "Obține link-ul prescurtat", - "HelpAnswerLinkInviteSettings": "Partajați acest link și invitați colegii la portalul dvs.", - "InviteLinkValidInterval": "Link-ul este valabil numai {{ count }} zile.", - "InviteUsersAsCollaborators": "Adaugă utilizatorii în calitate de {{guestsCaption, lowercase}}", - "LinkCopySuccess": "Link-ul a fost copiat" +{ + "CopyToClipboard": "Copiază link-ul", + "GetShortenLink": "Obține link-ul prescurtat", + "HelpAnswerLinkInviteSettings": "Partajați acest link și invitați colegii la portalul dvs.", + "InviteLinkValidInterval": "Link-ul este valabil numai {{ count }} zile.", + "InviteUsersAsCollaborators": "Adaugă utilizatorii în calitate de {{guestsCaption, lowercase}}", + "LinkCopySuccess": "Link-ul a fost copiat" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/PeopleSelector.json b/products/ASC.People/Client/public/locales/ro/PeopleSelector.json index fa7a66dd01..3715dcb22d 100644 --- a/products/ASC.People/Client/public/locales/ro/PeopleSelector.json +++ b/products/ASC.People/Client/public/locales/ro/PeopleSelector.json @@ -1,6 +1,6 @@ -{ - "CustomAllGroups": "Toate {{ groupsCaption, lowercase }}", - "EmptySearchUsersResult": "Utilizatorii cu acest nume nu s-au găsit", - "EmptyUsers": "Nu există nici un utilizator", - "SearchUsersPlaceholder": "Căutare după utilizatori" +{ + "CustomAllGroups": "Toate {{ groupsCaption, lowercase }}", + "EmptySearchUsersResult": "Utilizatorii cu acest nume nu s-au găsit", + "EmptyUsers": "Nu există nici un utilizator", + "SearchUsersPlaceholder": "Căutare după utilizatori" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/Profile.json b/products/ASC.People/Client/public/locales/ro/Profile.json index 197780cbbe..61fde2913d 100644 --- a/products/ASC.People/Client/public/locales/ro/Profile.json +++ b/products/ASC.People/Client/public/locales/ro/Profile.json @@ -1,11 +1,21 @@ -{ - "ChangeEmailSuccess": "Adresa e-mail a fost modificată cu succes", - "ChangesApplied": "Modificările au fost aplicate", - "ContactInformation": "Informații de contact", - "EditPhoto": "Editare foto", - "EditSubscriptionsBtn": "Modificare abonament", - "InviteAgainLbl": "Invită din nou", - "MessageEmailActivationInstuctionsSentOnEmail": "Instrucțiunile de activare a adresei e-mail au fost trimise la {{ email }}", - "PhoneLbl": "Telefon", - "Subscriptions": "Subscripții" -} +{ + "ChangeEmailSuccess": "Adresa e-mail a fost modificată cu succes", + "ChangesApplied": "Modificările au fost aplicate", + "Connect": "Adaugă cont", + "ContactInformation": "Informații de contact", + "CountCodesRemaining": "codurile rămase ", + "Disconnect": "Deconectare", + "EditPhoto": "Editare foto", + "EditSubscriptionsBtn": "Modificare abonament", + "EditUser": "Editare profil", + "InviteAgainLbl": "Invită din nou", + "LoginSettings": "Setări de conexiune", + "MessageEmailActivationInstuctionsSentOnEmail": "Instrucțiunile de activare a adresei e-mail au fost trimise la {{ email }}", + "PhoneLbl": "Telefon", + "ProviderSuccessfullyConnected": "Furnizorul a fost conectat cu succes", + "ProviderSuccessfullyDisconnected": "Furnizorul a fost deconectat cu succes", + "ShowBackupCodes": "Afișare coduri de rezervă", + "Subscriptions": "Subscripții", + "TfaLoginSettings": "Setări de conexiune", + "TwoFactorDescription": "Autentificarea cu doi factori prin aplicația de generare coduri a fost activată pentru toți utilizatorii de către administratorul." +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/ProfileAction.json b/products/ASC.People/Client/public/locales/ro/ProfileAction.json index 378f06dff4..a61b45fd6f 100644 --- a/products/ASC.People/Client/public/locales/ro/ProfileAction.json +++ b/products/ASC.People/Client/public/locales/ro/ProfileAction.json @@ -1,23 +1,24 @@ -{ - "ActivationLink": "Link-ul de activare", - "AddContact": "Contact nou", - "AddPhoto": "Adaugă o fotografie", - "Calendar": "Calendar", - "CalendarSelectDate": "Selectați data", - "ChangeButton": "Modifică", - "ChangesSavedSuccessfully": "Modificările au fost salvate cu succes", - "ContactInformation": "Informații de contact", - "CustomCreation": "{{user}} (creare)", - "EditPhoto": "Editare foto", - "EditUserDialogTitle": "Editare profil", - "EmailPopupHelper": "Adresa de email principală se folosește pentru trimiterea notificărilor și restabilirea accesului. <1> Puteți crea o nouă adresă de e-mail pentru utilizatorul pe acest domeniu și o parolă temporară unică cu care să conectează prima dată.", - "FirstName": "Prenume", - "Message": "Chat", - "ProductsAndInstruments_Products": "Module", - "ProfileAction": "Acțiuni cu profil", - "ProfileTypePopupHelper": "Invitații au acces limitat la unele funcții și module ale portalului", - "TemporaryPassword": "Parola temporară", - "TermsOfUsePopupHelperLink": "Află mai mult despre termenii si conditiile de utilizare ", - "UpdatingProcess": "În curs de actualizare...", - "WriteComment": "Adaugă comentariu" -} +{ + "ActivationLink": "Link-ul de activare", + "AddContact": "Contact nou", + "AddPhoto": "Adaugă o fotografie", + "Calendar": "Calendar", + "CalendarSelectDate": "Selectați data", + "ChangeButton": "Modifică", + "ChangesSavedSuccessfully": "Modificările au fost salvate cu succes", + "ContactInformation": "Informații de contact", + "CopiedResourceText": "Copiat", + "CustomCreation": "{{user}} (creare)", + "EditPhoto": "Editare foto", + "EditUserDialogTitle": "Editare profil", + "EmailPopupHelper": "Adresa de email principală se folosește pentru trimiterea notificărilor și restabilirea accesului. <1> Puteți crea o nouă adresă de e-mail pentru utilizatorul pe acest domeniu și o parolă temporară unică cu care să conectează prima dată.", + "FirstName": "Prenume", + "Message": "Chat", + "ProductsAndInstruments_Products": "Module", + "ProfileAction": "Acțiuni cu profil", + "ProfileTypePopupHelper": "Invitații au acces limitat la unele funcții și module ale portalului", + "TemporaryPassword": "Parola temporară", + "TermsOfUsePopupHelperLink": "Află mai mult despre termenii si conditiile de utilizare ", + "UpdatingProcess": "În curs de actualizare...", + "WriteComment": "Adaugă comentariu" +} diff --git a/products/ASC.People/Client/public/locales/ro/Reassign.json b/products/ASC.People/Client/public/locales/ro/Reassign.json index 7515bc422c..591d9500bf 100644 --- a/products/ASC.People/Client/public/locales/ro/Reassign.json +++ b/products/ASC.People/Client/public/locales/ro/Reassign.json @@ -1,3 +1,3 @@ -{ - "ReassignmentData": "Reasinarea datelor" +{ + "ReassignmentData": "Reasinarea datelor" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/ResetApplicationDialog.json b/products/ASC.People/Client/public/locales/ro/ResetApplicationDialog.json new file mode 100644 index 0000000000..2db08e9e05 --- /dev/null +++ b/products/ASC.People/Client/public/locales/ro/ResetApplicationDialog.json @@ -0,0 +1,4 @@ +{ + "ResetApplicationDescription": "Setările aplicației de autentificare vor fi resetate.", + "ResetApplicationTitle": "Resetarea aplicației" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/SendInviteDialog.json b/products/ASC.People/Client/public/locales/ro/SendInviteDialog.json index c312785fe0..e0fb58c011 100644 --- a/products/ASC.People/Client/public/locales/ro/SendInviteDialog.json +++ b/products/ASC.People/Client/public/locales/ro/SendInviteDialog.json @@ -1,4 +1,4 @@ -{ - "SendInviteAgainDialog": "Invitația va fi trimisă din nou utilizatorilor selecționate cu statutul În așteptare.", - "SendInviteAgainDialogMessage": "Odată ce utilizatorul acceptă invitația, statutul va schimba în Activ " +{ + "SendInviteAgainDialog": "Invitația va fi trimisă din nou utilizatorilor selecționate cu statutul În așteptare.", + "SendInviteAgainDialogMessage": "Odată ce utilizatorul acceptă invitația, statutul va schimba în Activ " } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ro/Translations.json b/products/ASC.People/Client/public/locales/ro/Translations.json index 276b97923f..1c71461260 100644 --- a/products/ASC.People/Client/public/locales/ro/Translations.json +++ b/products/ASC.People/Client/public/locales/ro/Translations.json @@ -1,3 +1,30 @@ -{ - "Birthdate": "Data de naștere" -} +{ + "AddMembers": "Adăugați membrii", + "Birthdate": "Data de naștere", + "Comments": "Comentarii", + "DeleteSelfProfile": "Ștergere profil", + "DisabledEmployeeStatus": "Dezactivat", + "DisableUserButton": "Dezactivează", + "EmailChangeButton": "Schimbare email", + "EnableUserButton": "Activează", + "ErrorUnknownFileImageType": "Tip de imagine necunoscut", + "FemaleSexStatus": "Femenin", + "InviteLinkTitle": "Link-ul de invitație", + "LDAPLbl": "LDAP", + "Location": "Locația", + "MaleSexStatus": "Masculin", + "maxSizeFileError": "Fişierul depăşeşte limita maximă de dimensiune", + "NotBeUndone": "Remarcă: această acțiune nu poate fi anulată.", + "orDropFileHereLabel": "sau plasați fișierul aici", + "PasswordChangeButton": "Schimbare parola", + "PendingTitle": "În așteptare", + "ReassignData": "Reasignarea datelor", + "RemoveData": "Șterge datele cu caracter personal", + "selectNewPhotoLabel": "Selectați o fotografie nouă", + "SendInviteAgain": "Trimiteți invitația din nou", + "Sex": "Sexul", + "SocialProfiles": "Profil din rețele sociale", + "SuccessChangeUserStatus": "Statutul utilizatorului a fost schimbat cu succes", + "SuccessDeletePersonalData": "Datele cu caracter personal au fost șterse cu succes", + "SuccessSentInvitation": "Invitația a fost trimisă cu succes" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ru/Article.json b/products/ASC.People/Client/public/locales/ru/Article.json index 66bfdeff0a..11e8ad47b4 100644 --- a/products/ASC.People/Client/public/locales/ru/Article.json +++ b/products/ASC.People/Client/public/locales/ru/Article.json @@ -1,4 +1,4 @@ -{ - "ImportPeople": "Импортировать людей", - "SendInvitesAgain": "Отправить приглашения ещё раз" +{ + "ImportPeople": "Импортировать людей", + "SendInvitesAgain": "Отправить приглашения ещё раз" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ru/BackupCodesDialog.json b/products/ASC.People/Client/public/locales/ru/BackupCodesDialog.json index 74793661a4..3b9e71909c 100644 --- a/products/ASC.People/Client/public/locales/ru/BackupCodesDialog.json +++ b/products/ASC.People/Client/public/locales/ru/BackupCodesDialog.json @@ -1,8 +1,8 @@ -{ - "BackupCodesTitle": "Резервные коды", - "BackupCodesDescription": "Резервные коды позволяют подтвердить вход, когда у вас нет доступа к телефону.", - "BackupCodesSecondDescription": "Каждый код можно использовать только один раз. Вы можете получить новые коды в любое время. Действительны только те коды, которые были сгенерированы последними.", - "CodesCounter": "кодов:", - "PrintButton": "Распечатать", - "RequestNewButton": "Запросить новые" -} +{ + "BackupCodesDescription": "Используйте резервные коды для входа, когда у вас нет доступа к телефону.", + "BackupCodesSecondDescription": "Каждый код можно использовать только один раз. Новые коды можно получить в любое время. Действительны только последние сгенерированные коды.", + "BackupCodesTitle": "Резервные коды", + "CodesCounter": "коды:", + "PrintButton": "Печать", + "RequestNewButton": "Запросить новые" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ru/ChangePhoneDialog.json b/products/ASC.People/Client/public/locales/ru/ChangePhoneDialog.json index ab0bd1c1ac..445c14e994 100644 --- a/products/ASC.People/Client/public/locales/ru/ChangePhoneDialog.json +++ b/products/ASC.People/Client/public/locales/ru/ChangePhoneDialog.json @@ -1,5 +1,5 @@ { + "ChangePhoneInstructionSent": "Инструкции по смене номера мобильного телефона были успешно отправлены", "MobilePhoneChangeTitle": "Изменение номера телефона", - "MobilePhoneEraseDescription": "Инструкция по смене номера мобильного телефона будет отправлена на Вашу почту", - "ChangePhoneInstructionSent": "Инструкции по смене номера мобильного телефона были успешно отправлены" + "MobilePhoneEraseDescription": "Инструкция по смене номера мобильного телефона будет отправлена на Вашу почту" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ru/ChangeUserStatusDialog.json b/products/ASC.People/Client/public/locales/ru/ChangeUserStatusDialog.json index 532edbf294..6aa4146452 100644 --- a/products/ASC.People/Client/public/locales/ru/ChangeUserStatusDialog.json +++ b/products/ASC.People/Client/public/locales/ru/ChangeUserStatusDialog.json @@ -2,7 +2,7 @@ "ChangeUsersActiveStatus": "разблокированы", "ChangeUsersDisableStatus": "заблокированы", "ChangeUsersStatusButton": "Изменить статус", - "ChangeUserStatusDialog": "Пользователи со статусом '{{ userStatus }}' будут {{ status }}.", + "ChangeUserStatusDialog": "Пользователи со статусом '{{status}}' будут отключены.", "ChangeUserStatusDialogHeader": "Изменение статуса пользователя", "ChangeUserStatusDialogMessage": "Вы не можете изменить статус владельца портала и свой собственный статус" -} \ No newline at end of file +} diff --git a/products/ASC.People/Client/public/locales/ru/DeleteProfileEverDialog.json b/products/ASC.People/Client/public/locales/ru/DeleteProfileEverDialog.json index 16023ea526..95975c497d 100644 --- a/products/ASC.People/Client/public/locales/ru/DeleteProfileEverDialog.json +++ b/products/ASC.People/Client/public/locales/ru/DeleteProfileEverDialog.json @@ -1,6 +1,5 @@ { - "Confirmation": "Подтверждение", "DeleteUserConfirmation": "{{userCaption}} {{user}} будет удален.", "DeleteUserDataConfirmation": "Будут удалены личные документы пользователя, доступные для других. Чтобы избежать этого, нужно перед удалением запустить процесс передачи данных.", "SuccessfullyDeleteUserInfoMessage": "Пользователь успешно удален" -} \ No newline at end of file +} diff --git a/products/ASC.People/Client/public/locales/ru/DeleteSelfProfileDialog.json b/products/ASC.People/Client/public/locales/ru/DeleteSelfProfileDialog.json index a8320dcfe7..346232174e 100644 --- a/products/ASC.People/Client/public/locales/ru/DeleteSelfProfileDialog.json +++ b/products/ASC.People/Client/public/locales/ru/DeleteSelfProfileDialog.json @@ -1,4 +1,4 @@ { "DeleteProfileInfo": "Отправить инструкции по удалению профиля на адрес электронной почты", "DeleteProfileTitle": "Диалог удаления профиля" -} +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ru/Home.json b/products/ASC.People/Client/public/locales/ru/Home.json index 33079d9655..2606c3f0ee 100644 --- a/products/ASC.People/Client/public/locales/ru/Home.json +++ b/products/ASC.People/Client/public/locales/ru/Home.json @@ -1,20 +1,20 @@ -{ - "Administrator": "Администратор", - "ChangeToGuest": "Изменить на {{guestCaption}}", - "ChangeToUser": "Изменить на {{userCaption}}", - "EmptyGroupDescription": "Вы можете добавить новых сотрудников вручную или пригласить их по ссылке.", - "EmptyGroupTitle": "Здесь пока нет сотрудников", - "LblInviteAgain": "Выслать прилашение ещё раз", - "LblInvited": "Приглашен", - "LblOther": "Другое", - "LblSendEmail": "Отправить email", - "LblSendMessage": "Отправить сообщение", - "LblSetActive": "Разблокировать", - "LblSetDisabled": "Заблокировать", - "MakeInvitationLink": "Создать пригласительную ссылку", - "MessageEmailActivationInstuctionsSentOnEmail": "Инструкции по активации электронной почты были отправлены на адрес <1>{{email}}", - "NotFoundDescription": "Попробуйте изменить или очистить настройки фильтра, чтобы увидеть всех людей в разделе.", - "NotFoundTitle": "Сотрудников не найдено", - "SuccessfullyRemovedGroup": "Группа была успешно удалена", - "UserStatus": "Статус" +{ + "Administrator": "Администратор", + "ChangeToGuest": "Изменить на {{guestCaption}}", + "ChangeToUser": "Изменить на {{userCaption}}", + "EmptyGroupDescription": "Вы можете добавить новых сотрудников вручную или пригласить их по ссылке.", + "EmptyGroupTitle": "Здесь пока нет сотрудников", + "LblInviteAgain": "Выслать прилашение ещё раз", + "LblInvited": "Приглашен", + "LblOther": "Другое", + "LblSendEmail": "Отправить email", + "LblSendMessage": "Отправить сообщение", + "LblSetActive": "Разблокировать", + "LblSetDisabled": "Заблокировать", + "MakeInvitationLink": "Создать пригласительную ссылку", + "MessageEmailActivationInstuctionsSentOnEmail": "Инструкции по активации электронной почты были отправлены на адрес <1>{{email}}", + "NotFoundDescription": "Попробуйте изменить или очистить настройки фильтра, чтобы увидеть всех людей в разделе.", + "NotFoundTitle": "Сотрудников не найдено", + "SuccessfullyRemovedGroup": "Группа была успешно удалена", + "UserStatus": "Статус" } \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ru/Profile.json b/products/ASC.People/Client/public/locales/ru/Profile.json index 2089e300be..dffce4e0ff 100644 --- a/products/ASC.People/Client/public/locales/ru/Profile.json +++ b/products/ASC.People/Client/public/locales/ru/Profile.json @@ -1,22 +1,21 @@ -{ - "ChangeEmailSuccess": "Email успешно изменен", - "ChangesApplied": "Изменения успешно применены", - "Connect": "Подключить", - "ContactInformation": "Контактные данные", - "Disconnect": "Отключить", - "EditPhoto": "Изменить фотографию", - "EditSubscriptionsBtn": "Изменить подписки", - "EditUser": "Редактировать", - "InviteAgainLbl": "Активировать адрес email ещё раз", - "LoginSettings": "Вход через социальные сети", - "MessageEmailActivationInstuctionsSentOnEmail": "Инструкция по активации почты пользователя была отправлена по адресу {{ email }}", - "PhoneLbl": "Основной телефон", - "ProviderSuccessfullyConnected": "Провайдер успешно подключен", - "ProviderSuccessfullyDisconnected": "Провайдер успешно отключен", - "Subscriptions": "Подписки", - - "TwoFactorDescription": "Двухфакторная аутентификация через приложение для генерации кодов включена для всех пользователей администратором облачного сервиса.", - "ShowBackupCodes": "Показать резервные коды", - "CountCodesRemaining": "кодов осталось", - "TfaLoginSettings": "Настройки входа" -} +{ + "ChangeEmailSuccess": "Email успешно изменен", + "ChangesApplied": "Изменения успешно применены", + "Connect": "Подключить", + "ContactInformation": "Контактные данные", + "CountCodesRemaining": "оставшиеся коды", + "Disconnect": "Отключить", + "EditPhoto": "Изменить фотографию", + "EditSubscriptionsBtn": "Изменить подписки", + "EditUser": "Редактировать", + "InviteAgainLbl": "Активировать адрес email ещё раз", + "LoginSettings": "Вход через социальные сети", + "MessageEmailActivationInstuctionsSentOnEmail": "Инструкция по активации почты пользователя была отправлена по адресу {{ email }}", + "PhoneLbl": "Основной телефон", + "ProviderSuccessfullyConnected": "Провайдер успешно подключен", + "ProviderSuccessfullyDisconnected": "Провайдер успешно отключен", + "ShowBackupCodes": "Показать резервные коды", + "Subscriptions": "Подписки", + "TfaLoginSettings": "Настройки входа", + "TwoFactorDescription": "Двухфакторная аутентификация с помощью приложения для генерации кодов включена администратором для всех пользователей." +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ru/ProfileAction.json b/products/ASC.People/Client/public/locales/ru/ProfileAction.json index da27899c0f..4dd63cd0d1 100644 --- a/products/ASC.People/Client/public/locales/ru/ProfileAction.json +++ b/products/ASC.People/Client/public/locales/ru/ProfileAction.json @@ -12,6 +12,8 @@ "EditPhoto": "Изменить фотографию", "EditUserDialogTitle": "Редактирование профиля", "EmailPopupHelper": "Основной email нужен для восстановления доступа к порталу в случае потери пароля, а также для отправки оповещений. <1>Вы можете создать новый email на домене в качестве основного. В этом случае потребуется задать одноразовый пароль, чтобы пользователь смог войти на портал в первый раз. Основной email можно использовать как логин при входе на портал.", + "ErrorInvalidUserLastName": "Недопустимая фамилия", + "ErrorInvalidUserFirstName": "Недопустимое имя", "FirstName": "Имя", "Message": "Чат", "ProductsAndInstruments_Products": "Модули", @@ -20,7 +22,5 @@ "TemporaryPassword": "Временный пароль", "TermsOfUsePopupHelperLink": "Подробнее об условиях использования", "UpdatingProcess": "Обновление...", - "WriteComment": "Добавить комментарий", - "ErrorInvalidUserLastName": "Недопустимая фамилия", - "ErrorInvalidUserFirstName": "Недопустимое имя" + "WriteComment": "Добавить комментарий" } diff --git a/products/ASC.People/Client/public/locales/ru/ResetApplicationDialog.json b/products/ASC.People/Client/public/locales/ru/ResetApplicationDialog.json index 1b7a9fe968..7fec7621f4 100644 --- a/products/ASC.People/Client/public/locales/ru/ResetApplicationDialog.json +++ b/products/ASC.People/Client/public/locales/ru/ResetApplicationDialog.json @@ -1,4 +1,4 @@ -{ - "ResetApplicationTitle": "Сбросить настройки приложения", - "ResetApplicationDescription": " Настройки приложения для аутентификации будут сброшены." -} +{ + "ResetApplicationDescription": "Настройки приложения для аутентификации будут сброшены.", + "ResetApplicationTitle": "Сбросить настройки приложения" +} \ No newline at end of file diff --git a/products/ASC.People/Client/public/locales/ru/Translations.json b/products/ASC.People/Client/public/locales/ru/Translations.json index 00c37976d2..b2eb341f41 100644 --- a/products/ASC.People/Client/public/locales/ru/Translations.json +++ b/products/ASC.People/Client/public/locales/ru/Translations.json @@ -1,30 +1,30 @@ -{ - "AddMembers": "Добавить участников", - "Comments": "Комментарии", - "DeleteSelfProfile": "Удалить профиль", - "DisabledEmployeeStatus": "Заблокирован", - "DisableUserButton": "Заблокировать", - "EmailChangeButton": "Изменить email", - "EnableUserButton": "Разблокировать", - "ErrorUnknownFileImageType": "Неизвестный тип файла изображения", - "FemaleSexStatus": "Женский", - "InviteLinkTitle": "Пригласительная ссылка", - "LDAPLbl": "LDAP", - "Location": "Местоположение", - "MaleSexStatus": "Мужской", - "maxSizeFileError": "Превышен максимальный размер файла", - "NotBeUndone": "Внимание: это действие необратимо.", - "orDropFileHereLabel": "или перетащите файл сюда", - "PasswordChangeButton": "Изменить пароль", - "PendingTitle": "Ожидание", - "ReassignData": "Передать данные", - "RemoveData": "Удалить личные данные", - "selectNewPhotoLabel": "Выбрать новое фото", - "SendInviteAgain": "Отправить приглашение ещё раз", - "Sex": "Пол", - "SocialProfiles": "Социальные профили", - "SuccessChangeUserStatus": "Статус пользователя успешно изменен", - "SuccessSentInvitation": "Приглашение было успешно отправлено", - "SuccessDeletePersonalData": "Персональные данные успешно удалены", - "Birthdate": "Дата рождения" -} +{ + "AddMembers": "Добавить участников", + "Birthdate": "Дата рождения", + "Comments": "Комментарии", + "DeleteSelfProfile": "Удалить профиль", + "DisabledEmployeeStatus": "Заблокирован", + "DisableUserButton": "Заблокировать", + "EmailChangeButton": "Изменить email", + "EnableUserButton": "Разблокировать", + "ErrorUnknownFileImageType": "Неизвестный тип файла изображения", + "FemaleSexStatus": "Женский", + "InviteLinkTitle": "Пригласительная ссылка", + "LDAPLbl": "LDAP", + "Location": "Местоположение", + "MaleSexStatus": "Мужской", + "maxSizeFileError": "Превышен максимальный размер файла", + "NotBeUndone": "Внимание: это действие необратимо.", + "orDropFileHereLabel": "или перетащите файл сюда", + "PasswordChangeButton": "Изменить пароль", + "PendingTitle": "Ожидание", + "ReassignData": "Передать данные", + "RemoveData": "Удалить личные данные", + "selectNewPhotoLabel": "Выбрать новое фото", + "SendInviteAgain": "Отправить приглашение ещё раз", + "Sex": "Пол", + "SocialProfiles": "Социальные профили", + "SuccessChangeUserStatus": "Статус пользователя успешно изменен", + "SuccessDeletePersonalData": "Персональные данные успешно удалены", + "SuccessSentInvitation": "Приглашение было успешно отправлено" +} \ No newline at end of file diff --git a/products/ASC.People/Client/src/HOCs/withContextOptions.js b/products/ASC.People/Client/src/HOCs/withContextOptions.js index 69d8bbc02a..f1b73c16d8 100644 --- a/products/ASC.People/Client/src/HOCs/withContextOptions.js +++ b/products/ASC.People/Client/src/HOCs/withContextOptions.js @@ -26,7 +26,7 @@ export default function withContextOptions(WrappedComponent) { const isRefetchPeople = true; //TODO: why always true? - const { t } = useTranslation(["Home", "Translations"]); + const { t } = useTranslation(["Home", "Common", "Translations"]); const onEmailSentClick = () => { window.open("mailto:" + email); @@ -258,7 +258,11 @@ export default function withContextOptions(WrappedComponent) { : {}; return ( - + ); }; diff --git a/products/ASC.People/Client/src/components/Article/MainButton/index.js b/products/ASC.People/Client/src/components/Article/MainButton/index.js index 454032703a..6a2030336f 100644 --- a/products/ASC.People/Client/src/components/Article/MainButton/index.js +++ b/products/ASC.People/Client/src/components/Article/MainButton/index.js @@ -75,6 +75,7 @@ class ArticleMainButtonContent extends React.Component { isDisabled={false} isDropdown={true} text={t("Common:Actions")} + className="people_main-button" > {/* - {t("Confirmation")} + {t("Common:Confirmation")} { const { + t, item, contextOptionsProps, element, @@ -39,6 +40,21 @@ const PeopleTableRow = (props) => { } = props; const { displayName, email, role, statusType, userName } = item; + const getRoleTranslation = () => { + switch (role) { + case "owner": + return t("Common:Owner"); + case "admin": + return t("Administrator"); + case "guest": + return t("Common:Guest"); + default: + return t("Common:User"); + } + }; + + const userRole = getRoleTranslation(); + const nameColor = statusType === "pending" ? "#A3A9AE" : "#333333"; const sideInfoColor = statusType === "pending" ? "#D0D5DA" : "#A3A9AE"; @@ -79,20 +95,20 @@ const PeopleTableRow = (props) => { - {role} + {userRole} { - const { t } = useTranslation("Home"); const onNextClick = useCallback( (e) => { if (!filter.hasNext()) { @@ -152,6 +152,8 @@ const SectionPagingContent = ({ ); }; +const SectionPagingContent = withTranslation("Home")(PureSectionPagingContent); + export default inject(({ auth, peopleStore }) => { const { isLoaded } = auth; const { usersStore, filterStore, loadingStore } = peopleStore; diff --git a/products/ASC.People/Client/src/pages/Home/index.js b/products/ASC.People/Client/src/pages/Home/index.js index d714043e83..70cceadaca 100644 --- a/products/ASC.People/Client/src/pages/Home/index.js +++ b/products/ASC.People/Client/src/pages/Home/index.js @@ -26,6 +26,7 @@ const Home = ({ setIsLoading, setIsRefresh, selectedGroup, + viewAs, }) => { const { location } = history; const { pathname } = location; @@ -62,6 +63,7 @@ const Home = ({ withBodyScroll withBodyAutoFocus={!isMobile} isLoading={isLoading} + viewAs={viewAs} > @@ -102,7 +104,7 @@ Home.propTypes = { }; export default inject(({ peopleStore }) => { - const { usersStore, selectedGroupStore, loadingStore } = peopleStore; + const { usersStore, selectedGroupStore, loadingStore, viewAs } = peopleStore; const { getUsersList } = usersStore; const { selectedGroup } = selectedGroupStore; const { isLoading, setIsLoading, setIsRefresh } = loadingStore; @@ -113,5 +115,6 @@ export default inject(({ peopleStore }) => { setIsLoading, setIsRefresh, selectedGroup, + viewAs, }; })(observer(withRouter(Home))); diff --git a/products/ASC.People/Client/src/pages/My/i18n.js b/products/ASC.People/Client/src/pages/My/i18n.js index d43849f397..fd010d44e5 100644 --- a/products/ASC.People/Client/src/pages/My/i18n.js +++ b/products/ASC.People/Client/src/pages/My/i18n.js @@ -9,7 +9,7 @@ const newInstance = i18n.createInstance(); newInstance.use(Backend).init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.People/Client/src/pages/Profile/Section/Body/index.js b/products/ASC.People/Client/src/pages/Profile/Section/Body/index.js index 36290ae029..ade7345fea 100644 --- a/products/ASC.People/Client/src/pages/Profile/Section/Body/index.js +++ b/products/ASC.People/Client/src/pages/Profile/Section/Body/index.js @@ -209,7 +209,7 @@ class SectionBodyContent extends React.PureComponent { }; loginCallback = (profile) => { const { setProviders, t } = this.props; - linkOAuth(profile.Serialized).then((resp) => { + linkOAuth(profile).then((resp) => { getAuthProviders().then((providers) => { setProviders(providers); toastr.success(t("ProviderSuccessfullyConnected")); diff --git a/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js b/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js index a038ab85a6..a076b33cdb 100644 --- a/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js +++ b/products/ASC.People/Client/src/pages/Profile/Section/Header/index.js @@ -149,6 +149,9 @@ class SectionHeaderContent extends React.PureComponent { data.append("Autosave", false); loadAvatar(this.state.profile.id, data) .then((response) => { + if (!response.success && response.message) { + throw response.message; + } var img = new Image(); img.onload = function () { var stateCopy = Object.assign({}, _this.state); diff --git a/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/avatarEditorPage.js b/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/avatarEditorPage.js index b81b5a28e6..efa0651c96 100644 --- a/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/avatarEditorPage.js +++ b/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/avatarEditorPage.js @@ -219,6 +219,9 @@ class AvatarEditorPage extends React.PureComponent { data.append("Autosave", false); loadAvatar(profile.id, data) .then((response) => { + if (!response.success && response.message) { + throw response.message; + } var img = new Image(); img.onload = function () { _this.setState({ isLoading: false }); diff --git a/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/createAvatarEditorPage.js b/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/createAvatarEditorPage.js index 1c3a02ec2a..7c1d4bf3c3 100644 --- a/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/createAvatarEditorPage.js +++ b/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/createAvatarEditorPage.js @@ -143,6 +143,9 @@ class CreateAvatarEditorPage extends React.PureComponent { loadAvatar(0, data) .then((response) => { + if (!response.success && response.message) { + throw response.message; + } var img = new Image(); img.onload = function () { if (fileData) { diff --git a/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/createUserForm.js b/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/createUserForm.js index f96233ad15..a9b308ed35 100644 --- a/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/createUserForm.js +++ b/products/ASC.People/Client/src/pages/ProfileAction/Section/Body/createUserForm.js @@ -118,6 +118,9 @@ class CreateUserForm extends React.Component { loadAvatar(0, data) .then((response) => { + if (!response.success && response.message) { + throw response.message; + } var img = new Image(); img.onload = function () { if (fileData) { @@ -442,6 +445,8 @@ class CreateUserForm extends React.Component { onValidateEmailField = (value) => this.setState({ errors: { ...this.state.errors, email: !value.isValid } }); + onSaveClick = () => this.setState({ isLoading: true }); + render() { const { isLoading, errors, profile, selector, isMobile } = this.state; const { @@ -480,7 +485,7 @@ class CreateUserForm extends React.Component { image={createdAvatar.image} visible={this.state.visibleAvatarEditor} onClose={this.onCloseAvatarEditor} - onSave={this.onSaveAvatar} + onSave={this.onSaveClick} onLoadFile={this.onLoadFileAvatar} headerLabel={t("AddPhoto")} selectNewPhotoLabel={t("Translations:selectNewPhotoLabel")} @@ -489,6 +494,7 @@ class CreateUserForm extends React.Component { maxSizeFileError={t("Translations:maxSizeFileError")} unknownError={t("Common:Error")} saveButtonLabel={t("Common:SaveButton")} + saveButtonLoading={this.state.isLoading} /> { + if (!response.success && response.message) { + throw response.message; + } var img = new Image(); img.onload = function () { _this.setState({ isLoading: false }); @@ -602,6 +604,8 @@ class UpdateUserForm extends React.Component { this.setIsEdit(); } + onSaveClick = () => this.setState({ isLoading: true }); + render() { const { isLoading, @@ -735,7 +739,7 @@ class UpdateUserForm extends React.Component { image={this.state.avatar.image} visible={this.state.visibleAvatarEditor} onClose={this.onCloseAvatarEditor} - onSave={this.onSaveAvatar} + onSave={this.onSaveClick} onLoadFile={this.onLoadFileAvatar} headerLabel={t("EditPhoto")} selectNewPhotoLabel={t("Translations:selectNewPhotoLabel")} diff --git a/products/ASC.People/Client/src/store/GroupsStore.js b/products/ASC.People/Client/src/store/GroupsStore.js index 6c6e238f40..5b36f6ce15 100644 --- a/products/ASC.People/Client/src/store/GroupsStore.js +++ b/products/ASC.People/Client/src/store/GroupsStore.js @@ -32,6 +32,7 @@ class GroupsStore { const res = await api.groups.createGroup(groupName, groupManager, members); this.peopleStore.selectedGroupStore.resetGroup(); this.groups.push(res); + this.groups.sort((a, b) => a.name.localeCompare(b.name)); return Promise.resolve(res); }; diff --git a/products/ASC.People/Server/ASC.People.csproj b/products/ASC.People/Server/ASC.People.csproj index bf7a8861a9..27c2945ebb 100644 --- a/products/ASC.People/Server/ASC.People.csproj +++ b/products/ASC.People/Server/ASC.People.csproj @@ -1,7 +1,7 @@  - net5.0 + net6.0 false $(DefaultItemExcludes); false @@ -24,9 +24,8 @@ - - - + + diff --git a/products/ASC.People/Server/Controllers/PeopleController.cs b/products/ASC.People/Server/Controllers/PeopleController.cs index e8e984d942..17d7da9cde 100644 --- a/products/ASC.People/Server/Controllers/PeopleController.cs +++ b/products/ASC.People/Server/Controllers/PeopleController.cs @@ -1,11 +1,9 @@  using System; using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Imaging; using System.IO; using System.Linq; -using System.Net; +using System.Net.Http; using System.Net.Mail; using System.Security; using System.ServiceModel.Security; @@ -48,6 +46,9 @@ using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; + using SecurityContext = ASC.Core.SecurityContext; namespace ASC.Employee.Core.Controllers @@ -1046,7 +1047,7 @@ namespace ASC.Employee.Core.Controllers } } - catch (UnknownImageFormatException) + catch (Web.Core.Users.UnknownImageFormatException) { result.Success = false; result.Message = PeopleResource.ErrorUnknownFileImageType; @@ -1611,14 +1612,9 @@ namespace ASC.Employee.Core.Controllers { var url = VirtualPathUtility.ToAbsolute("~/login.ashx") + $"?auth={provider}"; - var mode = (settingsView || inviteView || (!MobileDetector.IsMobile() && !Request.DesktopApp()) - ? ("&mode=popup&callback=" + clientCallback) - : ("&mode=Redirect&returnurl=" - + HttpUtility.UrlEncode(new Uri(Request.GetUrlRewriter(), - "Auth.aspx" - + (Request.DesktopApp() ? "?desktop=true" : "") - ).ToString()) - )); + var mode = settingsView || inviteView || (!MobileDetector.IsMobile() && !Request.DesktopApp()) + ? $"&mode=popup&callback={clientCallback}" + : "&mode=Redirect&desktop=true"; infos.Add(new AccountInfo { @@ -1866,9 +1862,12 @@ namespace ASC.Employee.Core.Controllers { using (var memstream = new MemoryStream()) { - var req = WebRequest.Create(url); - using (var response = req.GetResponse()) - using (var stream = response.GetResponseStream()) + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(url); + + using (var httpClient = new HttpClient()) + using (var response = httpClient.Send(request)) + using (var stream = response.Content.ReadAsStream()) { var buffer = new byte[512]; int bytesRead; @@ -2113,23 +2112,24 @@ namespace ASC.Employee.Core.Controllers { files = new Uri(ApiContext.HttpContextAccessor.HttpContext.Request.GetDisplayUrl()).GetLeftPart(UriPartial.Scheme | UriPartial.Authority) + "/" + files.TrimStart('/'); } - var request = WebRequest.Create(files); - using var response = (HttpWebResponse)request.GetResponse(); - using var inputStream = response.GetResponseStream(); + var request = new HttpRequestMessage(); + request.RequestUri = new Uri(files); + + using var httpClient = new HttpClient(); + using var response = httpClient.Send(request); + using var inputStream = response.Content.ReadAsStream(); using var br = new BinaryReader(inputStream); - var imageByteArray = br.ReadBytes((int)response.ContentLength); + var imageByteArray = br.ReadBytes((int)inputStream.Length); UserPhotoManager.SaveOrUpdatePhoto(user.ID, imageByteArray); } private static void CheckImgFormat(byte[] data) { - ImageFormat imgFormat; - + IImageFormat imgFormat; try { - using var stream = new MemoryStream(data); - using var img = new Bitmap(stream); - imgFormat = img.RawFormat; + using var img = Image.Load(data, out var format); + imgFormat = format; } catch (OutOfMemoryException) { @@ -2137,12 +2137,12 @@ namespace ASC.Employee.Core.Controllers } catch (ArgumentException error) { - throw new UnknownImageFormatException(error); + throw new Web.Core.Users.UnknownImageFormatException(error); } - if (!imgFormat.Equals(ImageFormat.Png) && !imgFormat.Equals(ImageFormat.Jpeg)) + if (imgFormat.Name != "PNG" && imgFormat.Name != "JPEG") { - throw new UnknownImageFormatException(); + throw new Web.Core.Users.UnknownImageFormatException(); } } } diff --git a/products/ASC.Projects/Client/package.json b/products/ASC.Projects/Client/package.json index e05588bfe6..6c82ca2fe5 100644 --- a/products/ASC.Projects/Client/package.json +++ b/products/ASC.Projects/Client/package.json @@ -1,6 +1,6 @@ { "name": "@appserver/projects", - "version": "1.0.0", + "version": "1.0.1", "private": true, "homepage": "/products/projects", "scripts": { diff --git a/products/ASC.Projects/Client/src/i18n.js b/products/ASC.Projects/Client/src/i18n.js index db1337a1ee..cfd53fe032 100644 --- a/products/ASC.Projects/Client/src/i18n.js +++ b/products/ASC.Projects/Client/src/i18n.js @@ -11,7 +11,7 @@ i18n .init({ lng: localStorage.getItem(LANGUAGE) || "en", fallbackLng: "en", - load: "all", + load: "currentOnly", //debug: true, interpolation: { diff --git a/products/ASC.Projects/Server/ASC.Projects.csproj b/products/ASC.Projects/Server/ASC.Projects.csproj index d815380634..37e034f792 100644 --- a/products/ASC.Projects/Server/ASC.Projects.csproj +++ b/products/ASC.Projects/Server/ASC.Projects.csproj @@ -1,16 +1,15 @@  - net5.0 + net6.0 false false false - - - + + diff --git a/public/images/icons/24/docxf.svg b/public/images/icons/24/docxf.svg index bb5feabda7..ffd6a62b86 100644 --- a/public/images/icons/24/docxf.svg +++ b/public/images/icons/24/docxf.svg @@ -1,20 +1,16 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/public/images/icons/24/oform.svg b/public/images/icons/24/oform.svg index e0979ea3b2..8027a139e9 100644 --- a/public/images/icons/24/oform.svg +++ b/public/images/icons/24/oform.svg @@ -1,14 +1,21 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/public/images/icons/32/docxf.svg b/public/images/icons/32/docxf.svg index bd449753f1..a6e6c0fcb8 100644 --- a/public/images/icons/32/docxf.svg +++ b/public/images/icons/32/docxf.svg @@ -1,46 +1,16 @@ - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/images/icons/32/oform.svg b/public/images/icons/32/oform.svg index e47db63de4..5cb02fcbef 100644 --- a/public/images/icons/32/oform.svg +++ b/public/images/icons/32/oform.svg @@ -1,27 +1,21 @@ - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - + - - - - - - - diff --git a/public/images/icons/64/docxf.svg b/public/images/icons/64/docxf.svg index 5bd4987f9f..c28a74b5e4 100644 --- a/public/images/icons/64/docxf.svg +++ b/public/images/icons/64/docxf.svg @@ -1,34 +1,12 @@ - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - diff --git a/public/images/icons/64/oform.svg b/public/images/icons/64/oform.svg index 749d219983..3ad181fcd4 100644 --- a/public/images/icons/64/oform.svg +++ b/public/images/icons/64/oform.svg @@ -1,31 +1,18 @@ - - + + - - - - - - - - - - - - - - - + + + + + + + + - - - - - - diff --git a/public/images/icons/96/docxf.svg b/public/images/icons/96/docxf.svg index 959ac8251c..b9fb63ed1f 100644 --- a/public/images/icons/96/docxf.svg +++ b/public/images/icons/96/docxf.svg @@ -1,33 +1,17 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - + + diff --git a/public/images/icons/96/oform.svg b/public/images/icons/96/oform.svg index f10951feb2..3af046fffe 100644 --- a/public/images/icons/96/oform.svg +++ b/public/images/icons/96/oform.svg @@ -1,33 +1,22 @@ - + - - - - - - - - - - - + - - - - - - + + + + + + + + + - - - - - + diff --git a/public/locales/de/Common.json b/public/locales/de/Common.json index d3587e000c..decb07eadb 100644 --- a/public/locales/de/Common.json +++ b/public/locales/de/Common.json @@ -12,6 +12,7 @@ "CloseButton": "Schließen", "ComingSoon": "Kommt demnächst", "CommunityProduct": "Community", + "Confirmation": "Bestätigung", "ContinueButton": "Weiter", "CopyEmailAndPassword": "E-Mail und Passwort kopieren", "CountPerPage": "{{count}} pro Seite", @@ -83,5 +84,6 @@ "ViewWeb": "Web-Version öffnen", "Warning": "Warnung", "Name": "Name", - "Phone": "Telefon" + "Phone": "Telefon", + "Owner": "Besitzer" } diff --git a/public/locales/en/Common.json b/public/locales/en/Common.json index 519b0445f1..e968f45d33 100644 --- a/public/locales/en/Common.json +++ b/public/locales/en/Common.json @@ -14,6 +14,7 @@ "CloseButton": "Close", "ComingSoon": "Coming soon", "CommunityProduct": "Community", + "Confirmation": "Confirmation", "ContinueButton": "Continue", "CopyEmailAndPassword": "Copy email and password", "CountPerPage": "{{count}} per page", @@ -104,5 +105,6 @@ "Audio": "Audio", "Department": "Department", "Role": "Role", - "Phone": "Phone" + "Phone": "Phone", + "Owner": "Owner" } diff --git a/public/locales/fr/Common.json b/public/locales/fr/Common.json index 31b79754bf..363298f442 100644 --- a/public/locales/fr/Common.json +++ b/public/locales/fr/Common.json @@ -12,6 +12,7 @@ "CloseButton": "Fermer", "ComingSoon": "Bientôt disponible", "CommunityProduct": "Communauté", + "Confirmation": "Confirmation", "ContinueButton": "Continuer", "CopyEmailAndPassword": "Copier l'adresse mail et le mot de passe", "CountPerPage": "{{count}} par page", @@ -73,5 +74,6 @@ "ViewWeb": "Voir la version web", "Warning": "Attention", "Name": "Nom", - "Phone": "Téléphone" + "Phone": "Téléphone", + "Owner": "Propriétaire" } diff --git a/public/locales/it/Common.json b/public/locales/it/Common.json index 7ae310ad6c..f3e6a4c6d3 100644 --- a/public/locales/it/Common.json +++ b/public/locales/it/Common.json @@ -12,6 +12,7 @@ "CloseButton": "Chiudi", "ComingSoon": "Prossimamente", "CommunityProduct": "Comunità", + "Confirmation": "Conferma", "ContinueButton": "Continua", "CopyEmailAndPassword": "Copia email e password", "CountPerPage": "{{count}} per pagina", @@ -75,5 +76,6 @@ "ViewWeb": "Visualizza la versione web", "Warning": "Avviso", "Name": "Nome", - "Phone": "Telefono" + "Phone": "Telefono", + "Owner": "Proprietario" } diff --git a/public/locales/lo/Common.json b/public/locales/lo/Common.json index 57bbe32147..4cef12dac2 100644 --- a/public/locales/lo/Common.json +++ b/public/locales/lo/Common.json @@ -12,9 +12,10 @@ "CloseButton": "ປິດ", "ComingSoon": "ກຳລັງມາ", "CommunityProduct": "ຊຸມຊົນ", + "Confirmation": "ການຢັ້ງຢືນຕົວຕົນ", "ContinueButton": "ສືບຕໍ່", "CopyEmailAndPassword": "ສຳເນົາອີເມວ ແລະ ລະຫັດຜ່ານ", - "CountPerPage": "{{ນັບ}} ຕໍ່ ໜ້າ", + "CountPerPage": "{{count}} ຕໍ່ ໜ້າ", "Culture_en": "ພາສາອັງກິດ", "Culture_en-US": "ພາສາອັງກິດ (ອາເມລິກາ)", "Culture_ru-RU": "ພາສາລັດເຊຍ", @@ -42,11 +43,11 @@ "Next": "ຖັດໄປ", "NotFoundLanguage": "ບໍ່ສາມາດຫາພາສາຂອງທ່ານໄດ້ແມ່ນບໍ່? ຕິດຕໍ່ພວກເຮົາທີ່ <1> {{supportEmail}} ເພື່ອໃຫ້ພວກເຮົາມີສ່ວນຮ່ວມໃນການແປພາສາ.", "OKButton": "ຕົກລົງ", - "OpenApp": "ເປີດ {{ຫົວຂໍ້}} ແອັບຂອງທ່ານ", - "PageOfTotalPage": "{{ໜ້າ}} ຂອງ {{ໜ້າ ທັງ ໝົດ}}", + "OpenApp": "ເປີດ {{title}} ແອັບຂອງທ່ານ", + "PageOfTotalPage": "{{page}} ຂອງ {{totalPage}}", "Password": "ລະຫັດຜ່ານ", "PasswordLimitDigits": "ຕົວເລກ", - "PasswordLimitLength": "ຕັ້ງຄ່າຕົວອັກສອນ {{ຈາກຕົວເລກນີ້}} ເຖິງ {{ຕົວເລກນີ້}}", + "PasswordLimitLength": "ຕັ້ງຄ່າຕົວອັກສອນ {{fromNumber}} ເຖິງ {{toNumber}}", "PasswordLimitMessage": "ລະຫັດຜ່ານຕ້ອງມີ", "PasswordLimitSpecialSymbols": "ຕົວອັກສອນພິເສດ", "PasswordLimitUpperCase": "ໂຕອັກສອນໃຫຍ່", @@ -75,5 +76,6 @@ "ViewWeb": "ເປີດຜ່ານຫນ້າເວັບ", "Warning": "ແຈ້ງເຕືອນ", "Name": "ຊື່", - "Phone": "ໂທລະສັບ" + "Phone": "ໂທລະສັບ", + "Owner": "ເຈົ້າຂອງ" } diff --git a/public/locales/pt-BR/Common.json b/public/locales/pt-BR/Common.json index c0bdbcecc1..d1e7f76765 100644 --- a/public/locales/pt-BR/Common.json +++ b/public/locales/pt-BR/Common.json @@ -12,6 +12,7 @@ "CloseButton": "Fechar", "ComingSoon": "Em breve", "CommunityProduct": "Comunidade", + "Confirmation": "Confirmação", "ContinueButton": "Continue", "CopyEmailAndPassword": "Copiar e-mail e senha", "CountPerPage": "{{count}} por página", @@ -40,7 +41,7 @@ "MeLabel": "Eu", "More": "Mais", "Next": "Próximo", - "NotFoundLanguage": "Não consegue encontrar seu idioma? Entre em contato conosco em <1>{{supportEmail} para participar da tradução e receber recompensas.", + "NotFoundLanguage": "Não consegue encontrar seu idioma? Entre em contato conosco em <1>{{supportEmail}} para participar da tradução e receber recompensas.", "OKButton": "OK", "OpenApp": "Abra seu {{title}} app", "PageOfTotalPage": "{{page}} de {{totalPage}}", @@ -75,5 +76,6 @@ "ViewWeb": "Veja a versão web", "Warning": "Aviso", "Name": "Nome", - "Phone": "Telefone" + "Phone": "Telefone", + "Owner": "Proprietário" } diff --git a/public/locales/ro/Common.json b/public/locales/ro/Common.json index 88bc5467a6..98ec2dc2ae 100644 --- a/public/locales/ro/Common.json +++ b/public/locales/ro/Common.json @@ -12,6 +12,7 @@ "CloseButton": "Închidere", "ComingSoon": "În curând", "CommunityProduct": "Comunitate", + "Confirmation": "Confirmare", "ContinueButton": "Continuare", "CopyEmailAndPassword": "Copiază adresa de e-mail și parola", "CountPerPage": "{{count}} per pagină", @@ -75,5 +76,6 @@ "ViewWeb": "Accesați versiunea online", "Warning": "Avertisment", "Name": "Numele", - "Phone": "Telefon" + "Phone": "Telefon", + "Owner": "Proprietar" } diff --git a/public/locales/ru/Common.json b/public/locales/ru/Common.json index 423ce82af3..e778ccf345 100644 --- a/public/locales/ru/Common.json +++ b/public/locales/ru/Common.json @@ -14,6 +14,7 @@ "CloseButton": "Закрыть", "ComingSoon": "Скоро появится", "CommunityProduct": "Сообщество", + "Confirmation": "Подтверждение", "ContinueButton": "Продолжить", "CopyEmailAndPassword": "Скопировать email и пароль", "CountPerPage": "{{count}} на странице", @@ -104,5 +105,6 @@ "Audio": "Аудио", "Department": "Отдел", "Role": "Позиция", - "Phone": "Телефон" + "Phone": "Телефон", + "Owner": "Владелец" } diff --git a/public/thirdparty/third-party.html b/public/thirdparty/third-party.html index 20d6bff100..fcd43c2678 100644 --- a/public/thirdparty/third-party.html +++ b/public/thirdparty/third-party.html @@ -52,10 +52,12 @@ const searchUrl = location.search.substring(1); const object = JSON.parse( '{"' + - decodeURIComponent(searchUrl) - .replace(/"/g, '\\"') - .replace(/&/g, '","') - .replace(/=/g, '":"') + + decodeURIComponent( + searchUrl + .replace(/"/g, '\\"') + .replace(/&/g, '","') + .replace(/=/g, '":"') + ) + '"}' ); @@ -70,6 +72,8 @@ const urlParams = getObjectByLocation(window.location); const code = urlParams ? urlParams.code || null : null; const error = urlParams ? urlParams.error || null : null; + const desktop = urlParams ? urlParams.desktop || false : false; + const p = urlParams ? urlParams.p || false : false; @@ -78,6 +82,10 @@