Merge branch 'release/v1.0.0' of github.com:ONLYOFFICE/DocSpace into release/v1.0.0

This commit is contained in:
Maksim Chegulov 2023-04-12 23:01:15 +03:00
commit bf659c6d82
104 changed files with 3406 additions and 694 deletions

40
.github/workflows/build-ffvideo.yml vendored Normal file
View File

@ -0,0 +1,40 @@
name: ffvideo build
on:
push:
branches:
- release/v1.0.0
paths:
- 'build/install/docker/**.ffvideo'
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
platform: [linux/amd64]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
file: ./build/install/docker/Dockerfile.ffvideo
push: true
tags: onlyoffice/ffvideo:6.0

View File

@ -227,14 +227,12 @@ CMD ["ASC.Files.dll", "ASC.Files"]
## ASC.Files.Service ##
FROM dotnetrun AS files_services
RUN apt-get -y update && \
apt-get install -yq ffmpeg &&\
rm -rf /var/lib/apt/lists/*
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64
WORKDIR ${BUILD_PATH}/products/ASC.Files/service/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Files.Service/service/ .
COPY --from=onlyoffice/ffvideo:6.0 --chown=onlyoffice:onlyoffice /usr/local /usr/local/
CMD ["ASC.Files.Service.dll", "ASC.Files.Service", "core:eventBus:subscriptionClientName=asc_event_bus_files_service_queue"]

View File

@ -225,7 +225,6 @@ CMD ["ASC.Files.dll", "ASC.Files"]
FROM dotnetrun AS files_services
RUN apt-get -y update && \
apt-get install -yq ffmpeg
WORKDIR ${BUILD_PATH}/products/ASC.Files/service/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py

View File

@ -0,0 +1,107 @@
FROM ubuntu:20.04 AS base
ENV DEBIAN_FRONTEND="noninteractive"
ENV TZ="Etc/UTC"
WORKDIR /tmp/workdir
RUN apt-get -yqq update && \
apt-get install -yq --no-install-recommends ca-certificates expat libgomp1 && \
apt-get autoremove -y && \
apt-get clean -y
FROM base as build
ENV FFMPEG_VERSION=6.0 \
X264_VERSION=20170226-2245-stable \
X265_VERSION=3.4 \
VPX_VERSION=1.8.0 \
SRC=/usr/local
ARG LD_LIBRARY_PATH=/opt/ffmpeg/lib
ARG MAKEFLAGS="-j2"
ARG PKG_CONFIG_PATH="/opt/ffmpeg/share/pkgconfig:/opt/ffmpeg/lib/pkgconfig:/opt/ffmpeg/lib64/pkgconfig"
ARG PREFIX=/opt/ffmpeg
ARG LD_LIBRARY_PATH="/opt/ffmpeg/lib:/opt/ffmpeg/lib64"
RUN buildDeps="autoconf \
automake \
cmake \
curl \
bzip2 \
libexpat1-dev \
g++ \
gcc \
git \
gperf \
libtool \
make \
meson \
nasm \
perl \
pkg-config \
python \
libssl-dev \
yasm \
zlib1g-dev" && \
apt-get -yqq update && \
apt-get install -yq --no-install-recommends ${buildDeps}
### libvpx
RUN \
DIR=/tmp/vpx && \
mkdir -p ${DIR} && \
cd ${DIR} && \
curl -sL https://codeload.github.com/webmproject/libvpx/tar.gz/v${VPX_VERSION} | \
tar -zx --strip-components=1 && \
./configure --prefix="${PREFIX}" --enable-vp8 --enable-vp9 --enable-vp9-highbitdepth --enable-pic --enable-shared \
--disable-debug --disable-examples --disable-docs --disable-install-bins && \
make && \
make install && \
rm -rf ${DIR}
## Download ffmpeg
RUN \
DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \
curl -sLO https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2 && \
tar -jx --strip-components=1 -f ffmpeg-${FFMPEG_VERSION}.tar.bz2 && \
./configure --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-gpl --extra-libs=-ldl && \
make ; make install
## Build ffmpeg
RUN \
DIR=/tmp/ffmpeg && cd ${DIR} && \
./configure \
--disable-debug \
--disable-doc \
--disable-ffplay \
--enable-gpl \
--enable-libvpx \
--extra-cflags="-I${PREFIX}/include" \
--extra-ldflags="-L${PREFIX}/lib" \
--extra-libs=-ldl \
--extra-libs=-lpthread \
--prefix="${PREFIX}" && \
make clean && \
make && \
make install && \
make distclean && \
hash -r && \
cd tools && \
make qt-faststart && cp qt-faststart ${PREFIX}/bin/
## cleanup
RUN \
ldd ${PREFIX}/bin/ffmpeg | grep opt/ffmpeg | cut -d ' ' -f 3 | xargs -i cp {} /usr/local/lib/ && \
for lib in /usr/local/lib/*.so.*; do ln -s "${lib##*/}" "${lib%%.so.*}".so; done && \
cp ${PREFIX}/bin/* /usr/local/bin/ && \
cp -r ${PREFIX}/share/ffmpeg /usr/local/share/ && \
LD_LIBRARY_PATH=/usr/local/lib ffmpeg -buildconf && \
cp -r ${PREFIX}/include/libav* ${PREFIX}/include/libpostproc ${PREFIX}/include/libsw* /usr/local/include && \
mkdir -p /usr/local/lib/pkgconfig && \
for pc in ${PREFIX}/lib/pkgconfig/libav*.pc ${PREFIX}/lib/pkgconfig/libpostproc.pc ${PREFIX}/lib/pkgconfig/libsw*.pc; do \
sed "s:${PREFIX}:/usr/local:g" <"$pc" >/usr/local/lib/pkgconfig/"${pc##*/}"; \
done
FROM base AS release
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64
COPY --from=build /usr/local /usr/local/
ENTRYPOINT ["bash"]

View File

@ -40,7 +40,7 @@ public class WarmupServicesStartupTask : IStartupTask
}
public Task ExecuteAsync(CancellationToken cancellationToken)
{
{
var processedFailed = 0;
var processedSuccessed = 0;
var startTime = DateTime.UtcNow;
@ -52,13 +52,13 @@ public class WarmupServicesStartupTask : IStartupTask
logger.TraceWarmupStarted();
tenantManager.SetCurrentTenant("localhost");
tenantManager.SetCurrentTenant("localhost");
foreach (var service in GetServices(_services))
{
try
{
scope.ServiceProvider.GetServices(service);
{
scope.ServiceProvider.GetService(service);
processedSuccessed++;
}
@ -72,9 +72,9 @@ public class WarmupServicesStartupTask : IStartupTask
var processed = processedSuccessed + processedFailed;
logger.TraceWarmupFinished(processed,
processedSuccessed,
processedFailed,
logger.TraceWarmupFinished(processed,
processedSuccessed,
processedFailed,
(DateTime.UtcNow - startTime).TotalMilliseconds);
}
@ -86,7 +86,7 @@ public class WarmupServicesStartupTask : IStartupTask
return services
.Where(descriptor => descriptor.ImplementationType != typeof(WarmupServicesStartupTask))
.Where(descriptor => descriptor.ServiceType.ContainsGenericParameters == false)
.Select(descriptor => descriptor.ServiceType)
.Select(descriptor => descriptor.ServiceType)
.Distinct();
}
}

View File

@ -146,7 +146,7 @@ public static class ServiceCollectionExtension
var logger = sp.GetRequiredService<ILogger<DefaultActiveMQPersistentConnection>>();
var factory = new Apache.NMS.NMSConnectionFactory(activeMQConfiguration.Uri);
var retryCount = 5;
if (!string.IsNullOrEmpty(cfg["core:eventBus:connectRetryCount"]))
@ -195,10 +195,8 @@ public static class ServiceCollectionExtension
/// Add a IHostedService for given type.
/// Only one copy of this instance type will active in multi process architecture.
/// </remarks>
public static void AddActivePassiveHostedService<T>(this IServiceCollection services) where T : class, IHostedService
public static void AddActivePassiveHostedService<T>(this IServiceCollection services, DIHelper diHelper) where T : class, IHostedService
{
var diHelper = new DIHelper(services);
diHelper.TryAdd<IRegisterInstanceDao<T>, RegisterInstanceDao<T>>();
diHelper.TryAdd<IRegisterInstanceManager<T>, RegisterInstanceManager<T>>();

View File

@ -156,7 +156,6 @@ public class TariffService : ITariffService
}
var tariff = refresh ? null : GetTariffFromCache(tenantId);
int? tariffId = null;
if (tariff == null)
{
@ -165,11 +164,13 @@ public class TariffService : ITariffService
if (string.IsNullOrEmpty(_cache.Get<string>(GetTariffNeedToUpdateCacheKey(tenantId))))
{
tariffId = tariff.Id;
UpdateCache(tariff.Id);
}
if (_billingClient.Configured && withRequestToPaymentSystem)
{
var paymentFound = false;
try
{
var currentPayments = _billingClient.GetCurrentPayments(GetPortalId(tenantId));
@ -221,24 +222,21 @@ public class TariffService : ITariffService
{
asynctariff = CalculateTariff(tenantId, asynctariff);
tariff = asynctariff;
tariffId = asynctariff.Id;
}
UpdateCache(tariff.Id);
paymentFound = true;
}
catch (Exception error)
{
if (tariff.Id != 0)
{
tariffId = tariff.Id;
}
if (error is not BillingNotFoundException)
{
LogError(error, tenantId.ToString());
}
}
if (!tariffId.HasValue || tariffId.Value == 0)
if (!paymentFound)
{
var freeTariff = tariff.Quotas.FirstOrDefault(tariffRow =>
{
@ -262,12 +260,9 @@ public class TariffService : ITariffService
{
asynctariff = CalculateTariff(tenantId, asynctariff);
tariff = asynctariff;
tariffId = asynctariff.Id;
}
else
{
tariffId = tariff.Id;
}
UpdateCache(tariff.Id);
}
}
}
@ -276,12 +271,12 @@ public class TariffService : ITariffService
tariff = CalculateTariff(tenantId, tariff);
}
if (tariffId.HasValue && tariffId.Value != 0)
{
_notify.Publish(new TariffCacheItem { TenantId = tenantId, TariffId = tariffId.Value }, CacheNotifyAction.Insert);
}
return tariff;
void UpdateCache(int tariffId)
{
_notify.Publish(new TariffCacheItem { TenantId = tenantId, TariffId = tariffId }, CacheNotifyAction.Insert);
}
}
public async Task<bool> PaymentChange(int tenantId, Dictionary<string, int> quantity)
@ -755,6 +750,7 @@ public class TariffService : ITariffService
if (efTariff.Id == default)
{
efTariff.Id = (-tenant);
tariffInfo.Id = efTariff.Id;
}
if (efTariff.CustomerId == default)

View File

@ -271,6 +271,7 @@ public class CachedUserService : IUserService, ICachedService
{
Service.SetUserPhoto(tenant, id, photo);
CacheUserPhotoItem.Publish(new UserPhotoCacheItem { Key = UserServiceCache.GetUserPhotoCacheKey(tenant, id) }, CacheNotifyAction.Remove);
CacheUserInfoItem.Publish(new UserInfoCacheItem { Id = id.ToString(), Tenant = tenant }, CacheNotifyAction.Any);
}
public DateTime GetUserPasswordStamp(int tenant, Guid id)

View File

@ -24,6 +24,8 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using ASC.Core.Common.EF;
namespace ASC.Core.Data;
[Scope]
@ -227,7 +229,7 @@ public class EFUserService : IUserService
if (sortBy == "type")
{
var q1 = from user in q
join userGroup in userDbContext.UserGroups.Where(g => !g.Removed && (g.UserGroupId == Users.Constants.GroupAdmin.ID || g.UserGroupId == Users.Constants.GroupUser.ID
join userGroup in userDbContext.UserGroups.Where(g => !g.Removed && (g.UserGroupId == Users.Constants.GroupAdmin.ID || g.UserGroupId == Users.Constants.GroupUser.ID
|| g.UserGroupId == Users.Constants.GroupCollaborator.ID))
on user.Id equals userGroup.Userid into joinedGroup
from @group in joinedGroup.DefaultIfEmpty()
@ -317,8 +319,8 @@ public class EFUserService : IUserService
if (immediate)
{
await userGroups.ExecuteDeleteAsync();
await groups.ExecuteDeleteAsync();
await userGroups.ExecuteDeleteAsync();
await groups.ExecuteDeleteAsync();
}
else
{
@ -372,15 +374,15 @@ public class EFUserService : IUserService
.SetProperty(p => p.Removed, true)
.SetProperty(p => p.LastModified, DateTime.UtcNow));
await users.ExecuteUpdateAsync(ug => ug
.SetProperty(p => p.Removed, true)
.SetProperty(p => p.LastModified, DateTime.UtcNow)
.SetProperty(p => p.TerminatedDate, DateTime.UtcNow)
.SetProperty(p => p.Status, EmployeeStatus.Terminated)
);
await users.ExecuteUpdateAsync(ug => ug
.SetProperty(p => p.Removed, true)
.SetProperty(p => p.LastModified, DateTime.UtcNow)
.SetProperty(p => p.TerminatedDate, DateTime.UtcNow)
.SetProperty(p => p.Status, EmployeeStatus.Terminated)
);
}
await tr.CommitAsync();
await tr.CommitAsync();
}).GetAwaiter()
.GetResult();
}
@ -403,7 +405,7 @@ public class EFUserService : IUserService
var userGroups = userDbContext.UserGroups.Where(r => r.Tenant == tenant && r.Userid == userId && r.UserGroupId == groupId && r.RefType == refType);
if (immediate)
{
await userGroups.ExecuteDeleteAsync();
await userGroups.ExecuteDeleteAsync();
}
else
{
@ -517,7 +519,7 @@ public class EFUserService : IUserService
if (user != null)
{
user.LastModified = userGroupRef.LastModified;
await userDbContext.AddOrUpdateAsync(r => userDbContext.UserGroups, _mapper.Map<UserGroupRef, UserGroup>(userGroupRef));
await userDbContext.AddOrUpdateAsync(r => userDbContext.UserGroups, _mapper.Map<UserGroupRef, UserGroup>(userGroupRef));
}
await userDbContext.SaveChangesAsync();
@ -573,7 +575,18 @@ public class EFUserService : IUserService
userPhoto.Photo = photo;
}
await userDbContext.AddOrUpdateAsync(r => userDbContext.Photos, userPhoto);
var userEntity = new User
{
Id = id,
LastModified = DateTime.UtcNow,
Tenant = tenant
};
userDbContext.Entry(userEntity).Property(x => x.LastModified).IsModified = true;
}
else if (userPhoto != null)
{

View File

@ -61,6 +61,7 @@ public class LocalesTest
public List<JavaScriptFile> JavaScriptFiles { get; set; }
public List<ModuleFolder> ModuleFolders { get; set; }
public List<KeyValuePair<string, string>> NotTranslatedToasts { get; set; }
public List<KeyValuePair<string, string>> NotTranslatedProps { get; set; }
public List<LanguageItem> CommonTranslations { get; set; }
public List<ParseJsonError> ParseJsonErrors { get; set; }
public static string ConvertPathToOS { get; private set; }
@ -201,7 +202,10 @@ public class LocalesTest
"|(?<=toastr.success\\([\"`\'])(.*)(?=[\"\'`])" +
"|(?<=toastr.warn\\([\"`\'])(.*)(?=[\"\'`])", RegexOptions.Multiline | RegexOptions.ECMAScript);
var notTranslatedPropsRegex = new Regex("<[\\w\\n][^>]* (title|placeholder|label|text)={?[\\\"\\'](.*)[\\\"\\']}?", RegexOptions.Multiline | RegexOptions.ECMAScript);
NotTranslatedToasts = new List<KeyValuePair<string, string>>();
NotTranslatedProps = new List<KeyValuePair<string, string>>();
foreach (var path in javascriptFiles)
{
@ -219,6 +223,18 @@ public class LocalesTest
}
}
var propsMatches = notTranslatedPropsRegex.Matches(jsFileText).ToList();
if (propsMatches.Any())
{
foreach (var propsMatch in propsMatches)
{
var found = propsMatch.Value;
if (!string.IsNullOrEmpty(found) && !NotTranslatedProps.Exists(t => t.Value == found))
NotTranslatedProps.Add(new KeyValuePair<string, string>(path, found));
}
}
var matches = regexp.Matches(jsFileText);
var translationKeys = matches
@ -1079,6 +1095,29 @@ public class LocalesTest
Assert.AreEqual(0, NotTranslatedToasts.Count, message);
}
[Test]
[Category("Locales")]
public void NotTranslatedPropsTest()
{
var message = $"Next text not translated props (title, placeholder, label, text):\r\n\r\n";
var i = 0;
NotTranslatedProps.GroupBy(t => t.Key)
.Select(g => new
{
FilePath = g.Key,
Values = g.ToList()
})
.ToList()
.ForEach(t =>
{
message += $"{++i}. Path='{t.FilePath}'\r\n\r\n{string.Join("\r\n", t.Values.Select(v => v.Value))}\r\n\r\n";
});
Assert.AreEqual(0, NotTranslatedProps.Count, message);
}
[Test]
[Category("Locales")]
public void WrongTranslationVariablesTest()

View File

@ -102,15 +102,15 @@ public class PortalController : ControllerBase
[HttpPost("register")]
[AllowCrossSiteJson]
[Authorize(AuthenticationSchemes = "auth:allowskip:registerportal")]
public Task<IActionResult> RegisterAsync(TenantModel model)
public async Task<IActionResult> RegisterAsync(TenantModel model)
{
if (model == null)
{
return Task.FromResult<IActionResult>(BadRequest(new
return BadRequest(new
{
error = "portalNameEmpty",
message = "PortalName is required"
}));
});
}
if (!ModelState.IsValid)
@ -122,11 +122,11 @@ public class PortalController : ControllerBase
message.Add(ModelState[k].Errors.FirstOrDefault().ErrorMessage);
}
return Task.FromResult<IActionResult>(BadRequest(new
return BadRequest(new
{
error = "params",
message
}));
});
}
var sw = Stopwatch.StartNew();
@ -136,7 +136,7 @@ public class PortalController : ControllerBase
if (!CheckPasswordPolicy(model.Password, out var error1))
{
sw.Stop();
return Task.FromResult<IActionResult>(BadRequest(error1));
return BadRequest(error1);
}
if (!string.IsNullOrEmpty(model.Password))
@ -152,16 +152,11 @@ public class PortalController : ControllerBase
{
sw.Stop();
return Task.FromResult<IActionResult>(BadRequest(error));
return BadRequest(error);
}
return InternalRegisterAsync(model, error, sw);
}
private async Task<IActionResult> InternalRegisterAsync(TenantModel model, object error, Stopwatch sw)
{
model.PortalName = (model.PortalName ?? "").Trim();
var (exists, _) = await CheckExistingNamePortalAsync(model.PortalName);
(var exists, error) = await CheckExistingNamePortalAsync(model.PortalName);
if (!exists)
{

View File

@ -66,8 +66,8 @@ public class Startup : BaseStartup
services.AddHostedService<BackupCleanerTempFileService>();
services.AddHostedService<BackupWorkerService>();
services.AddActivePassiveHostedService<BackupCleanerService>();
services.AddActivePassiveHostedService<BackupSchedulerService>();
services.AddActivePassiveHostedService<BackupCleanerService>(DIHelper);
services.AddActivePassiveHostedService<BackupSchedulerService>(DIHelper);
services.AddBaseDbContextPool<BackupsContext>();
services.AddBaseDbContextPool<FilesDbContext>();

View File

@ -53,8 +53,8 @@ public class Startup : BaseWorkerStartup
DIHelper.TryAdd<NotifyInvokeSendMethodRequestedIntegrationEventHandler>();
DIHelper.TryAdd<NotifySendMessageRequestedIntegrationEventHandler>();
services.AddActivePassiveHostedService<NotifySenderService>();
services.AddActivePassiveHostedService<NotifyCleanerService>();
services.AddActivePassiveHostedService<NotifySenderService>(DIHelper);
services.AddActivePassiveHostedService<NotifyCleanerService>(DIHelper);
services.AddBaseDbContextPool<NotifyDbContext>();
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,22 @@
{
"Ascending": "Artan",
"CopyWindowCode": "Pəncərə yerləşdirmə kodunu kopyalayın",
"DataDisplay": "Məlumatların göstərilməsi parametrləri",
"Descending": "Azalan",
"Destroy": "Məhv etmək",
"EnterCount": "Sayını daxil edin",
"EnterHeight": "Hündürlüyü daxil edin",
"EnterId": "ID daxil edin",
"EnterPage": "Nömrə səhifəsini daxil edin",
"EnterWidth": "Genişliyi daxil edin",
"FolderId": "Qovluq id",
"FrameId": "Çərçivə id",
"Header": "Başlıq",
"ItemsCount": "Maddələr sayılır",
"JavascriptSdk": "Javascript SDK",
"Menu": "Menyu",
"Page": "Səhifə",
"SearchTerm": "Axtarış termini",
"SortOrder": "Sırala",
"WindowParameters": "Pəncərə parametrləri"
}

View File

@ -109,6 +109,7 @@
"LogoDocsEditorEmbedded": "Redaktor başlığı - quraşdırılmış rejim üçün loqo",
"LogoFavicon": "Favicon",
"LogoLightSmall": "Portal başlığı üçün loqo",
"LogoLogin": "Giriş səhifəsi və e-məktublar üçün loqo",
"ManagementCategoryDataManagement": "Məlumatların idarə olunması",
"ManagementCategoryIntegration": "İnteqrasiya",
"ManagementCategorySecurity": "Təhlükəsizlik",

View File

@ -0,0 +1,22 @@
{
"Ascending": "Възходящ",
"CopyWindowCode": "Копирайте кода за вграждане на прозорец",
"DataDisplay": "Настройки за показване на данни",
"Descending": "Низходящ",
"Destroy": "Унищожи",
"EnterCount": "Въведете броя",
"EnterHeight": "Въведете височина",
"EnterId": "Въведете id",
"EnterPage": "Въведете номер на страницата",
"EnterWidth": "Въведете ширина",
"FolderId": "ID на папка",
"FrameId": "ID на рамката",
"Header": "Удар с глава",
"ItemsCount": "Елементите се броят",
"JavascriptSdk": "Javascript SDK",
"Menu": "Меню",
"Page": "Страница",
"SearchTerm": "Термин за търсене",
"SortOrder": "Ред на сортиране",
"WindowParameters": "Параметри на прозореца"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "На път сте да превишите ограниченията за съхранение и администратори/опитни потребители.",
"StorageQuotaDescription": "Можете да премахнете ненужните файлове или <1>{{clickHere}}</1>, за да намерите по-подходящ ценови план за вашия DocSpace.",
"StorageQuotaHeader": "Размерът на пространството за съхранение е на път да бъде надвишен: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1>, за да намерите по-добър абонаментен план за вашия портал.",
"UserQuotaDescription": "<1>{{clickHere}}</1>, за да намерите по-добър абонаментен план за вашия DocSpace.",
"UserQuotaHeader": "На път сте да превишите броят на администраторите/опитните потребители: {{currentValue}} / {{maxValue}}."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Vzestupně",
"CopyWindowCode": "Kopírovat kód pro vložení okna",
"DataDisplay": "Nastavení zobrazení dat",
"Descending": "Klesající",
"Destroy": "Zničit",
"EnterCount": "Zadejte počet",
"EnterHeight": "Zadejte výšku",
"EnterId": "Zadejte ID",
"EnterPage": "Zadejte číselnou stránku",
"EnterWidth": "Zadejte šířku",
"FolderId": "ID složky",
"FrameId": "ID snímku",
"Header": "Záhlaví",
"ItemsCount": "Položky se počítají",
"JavascriptSdk": "Javascript sdk",
"Menu": "Jídelní lístek",
"Page": "Stránka",
"SearchTerm": "Hledaný výraz",
"SortOrder": "Seřadit objednávku",
"WindowParameters": "Parametry okna"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Limity pro úložiště a správce/oprávněné uživatele budou brzy překročeny.",
"StorageQuotaDescription": "Nepotřebné soubory můžete odstranit nebo <1>{{clickHere}}}</1> pro nalezení vhodnějšího cenového tarifu pro váš DocSpace.",
"StorageQuotaHeader": "Množství úložného prostoru bude brzy překročeno: {{currentValue}} / {{maxValue}}.",
"UserQuotaDescription": "<1>{{clickHere}}</1> a najděte lepší cenový tarif pro svůj portál.",
"UserQuotaDescription": "<1>{{clickHere}}</1> a najděte lepší cenový tarif pro svůj DocSpace.",
"UserQuotaHeader": "Počet administrátorů/přístupných uživatelů bude brzy překročen: {{currentValue}} / {{maxValue}}."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Aufsteigend",
"CopyWindowCode": "Fenster-Einbettungscode kopieren",
"DataDisplay": "Einstellungen für die Datenanzeige",
"Descending": "Absteigend",
"Destroy": "Zerstören",
"EnterCount": "Anzahl eingeben",
"EnterHeight": "Höhe eingeben",
"EnterId": "ID eingeben",
"EnterPage": "Nummernseite eingeben",
"EnterWidth": "Breite eingeben",
"FolderId": "Ordner-ID",
"FrameId": "Frame-ID",
"Header": "Header",
"ItemsCount": "Artikel zählen",
"JavascriptSdk": "Javascript-SDK",
"Menu": "Speisekarte",
"Page": "Seite",
"SearchTerm": "Suchbegriff",
"SortOrder": "Sortierreihenfolge",
"WindowParameters": "Fensterparameter"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Limits für Speicherplatz und Admins/Power-User werden bald überschritten sein.",
"StorageQuotaDescription": "Sie können die unerwünschten Dateien entfernen oder <1>{{{clickHere}}</1> einen geeigneteren Preisplan für Ihren DocSpace finden.",
"StorageQuotaHeader": "Das Speicherplatzlimit wird bald überschritten: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1>, um einen besseren Preisplan für Ihr Portal zu finden.",
"UserQuotaDescription": "<1>{{clickHere}}</1>, um einen besseren Preisplan für Ihr DocSpace zu finden.",
"UserQuotaHeader": "Die Anzahl der Admins/Power-User wird bald überschritten sein: {{currentValue}} / {{maxValue}}."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Ανερχόμενος",
"CopyWindowCode": "Αντιγραφή κώδικα ενσωμάτωσης παραθύρου",
"DataDisplay": "Ρυθμίσεις εμφάνισης δεδομένων",
"Descending": "Φθίνων",
"Destroy": "Καταστρέφω",
"EnterCount": "Εισαγάγετε τον αριθμό",
"EnterHeight": "Εισαγάγετε ύψος",
"EnterId": "Εισαγάγετε το αναγνωριστικό",
"EnterPage": "Εισαγάγετε τη σελίδα αριθμού",
"EnterWidth": "Εισαγάγετε πλάτος",
"FolderId": "Αναγνωριστικό φακέλου",
"FrameId": "Ταυτότητα πλαισίου",
"Header": "Επί κεφαλής",
"ItemsCount": "Τα στοιχεία μετράνε",
"JavascriptSdk": "Javascript sdk",
"Menu": "Μενού",
"Page": "Σελίδα",
"SearchTerm": "Ορος αναζήτησης",
"SortOrder": "Σειρά ταξινόμησης",
"WindowParameters": "Παράμετροι παραθύρου"
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Ascending",
"CopyWindowCode": "Copy window embed code",
"DataDisplay": "Data display settings",
"Descending": "Descending",
"Destroy": "Destroy",
"EnterCount": "Enter count",
"EnterHeight": "Enter height",
"EnterId": "Enter id",
"EnterPage": "Enter number page",
"EnterWidth": "Enter width",
"FolderId": "Folder id",
"FrameId": "Frame id",
"Header": "Header",
"ItemsCount": "Items count",
"JavascriptSdk": "Javascript sdk",
"Menu": "Menu",
"Page": "Page",
"SearchTerm": "Search term",
"SortOrder": "Sort order",
"WindowParameters": "Window parameters"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Storage and admins/power users limits are about to be exceeded.",
"StorageQuotaDescription": "You can remove the unnecessary files or <1>{{clickHere}}</1> to find a more suitable pricing plan for your DocSpace.",
"StorageQuotaHeader": "Storage space amount is about to be exceeded: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1> to find a better pricing plan for your portal.",
"UserQuotaDescription": "<1>{{clickHere}}</1> to find a better pricing plan for your DocSpace.",
"UserQuotaHeader": "The number of admins/power users is about to be exceeded: {{currentValue}} / {{maxValue}}."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Ascendente",
"CopyWindowCode": "Copiar el código de incrustación de la ventana",
"DataDisplay": "Configuración de visualización de datos",
"Descending": "Descendiendo",
"Destroy": "Destruir",
"EnterCount": "Ingresar cuenta",
"EnterHeight": "Ingrese la altura",
"EnterId": "Ingrese ID",
"EnterPage": "Introduzca el número de página",
"EnterWidth": "Introducir ancho",
"FolderId": "Identificación de la carpeta",
"FrameId": "Identificación del marco",
"Header": "Encabezamiento",
"ItemsCount": "Cuenta de artículos",
"JavascriptSdk": "SDK de Javascript",
"Menu": "Menú",
"Page": "Página",
"SearchTerm": "Término de búsqueda",
"SortOrder": "Orden de clasificación",
"WindowParameters": "Parámetros de la ventana"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Los límites de almacenamiento y de administradores/usuarios avanzados están a punto de excederse.",
"StorageQuotaDescription": "Puede eliminar los archivos innecesarios o <1>{{clickHere}}</1> para encontrar un plan de precios más adecuado para su DocSpace.",
"StorageQuotaHeader": "La cantidad de espacio de almacenamiento está a punto de excederse: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1> para encontrar un mejor plan de precios para su portal.",
"UserQuotaDescription": "<1>{{clickHere}}</1> para encontrar un mejor plan de precios para su DocSpace.",
"UserQuotaHeader": "El número de administradores/usuarios avanzados está a punto de excederse: {{currentValue}} / {{maxValue}}."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Nouseva",
"CopyWindowCode": "Kopioi ikkunan upotuskoodi",
"DataDisplay": "Tietojen näyttöasetukset",
"Descending": "Laskeva",
"Destroy": "Tuhota",
"EnterCount": "Anna määrä",
"EnterHeight": "Syötä korkeus",
"EnterId": "Anna tunnus",
"EnterPage": "Anna numerosivu",
"EnterWidth": "Anna leveys",
"FolderId": "Kansion tunnus",
"FrameId": "Kehyksen tunnus",
"Header": "Ylätunniste",
"ItemsCount": "Kohteet laskevat",
"JavascriptSdk": "Javascript sdk",
"Menu": "Valikko",
"Page": "Sivu",
"SearchTerm": "Hakusana",
"SortOrder": "Lajittelujärjestys",
"WindowParameters": "Ikkunan parametrit"
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Ascendant",
"CopyWindowCode": "Copier le code d'intégration de la fenêtre",
"DataDisplay": "Paramètres d'affichage des données",
"Descending": "Descendant",
"Destroy": "Détruire",
"EnterCount": "Entrez le nombre",
"EnterHeight": "Entrez la hauteur",
"EnterId": "Entrer l'ID",
"EnterPage": "Entrez le numéro de la page",
"EnterWidth": "Entrez la largeur",
"FolderId": "Identifiant du dossier",
"FrameId": "Identifiant du cadre",
"Header": "Entête",
"ItemsCount": "Nombre d'Articles",
"JavascriptSdk": "SDK Javascript",
"Menu": "Menu",
"Page": "Page",
"SearchTerm": "Terme de recherche",
"SortOrder": "Ordre de tri",
"WindowParameters": "Paramètres de la fenêtre"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Les limites de stockage et d'administrateurs/utilisateurs avancés sont sur le point d'être dépassées.",
"StorageQuotaDescription": "Vous pouvez supprimer les fichiers inutiles ou <1>{{clickHere}}</1> pour trouver un plan tarifaire plus adapté à votre DocSpace.",
"StorageQuotaHeader": "Lespace de stockage est sur le point dêtre dépassé : {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1> pour trouver un meilleur plan tarifaire pour votre portail.",
"UserQuotaDescription": "<1>{{clickHere}}</1> pour trouver un meilleur plan tarifaire pour votre DocSpace.",
"UserQuotaHeader": "Le nombre d'administrateurs/utilisateurs avancés est sur le point d'être dépassé : {{currentValue}} / {{maxValue}}."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Բարձրանալով",
"CopyWindowCode": "Պատճենել պատուհանի ներդրման կոդը",
"DataDisplay": "Տվյալների ցուցադրման կարգավորումներ",
"Descending": "Նվազող",
"Destroy": "Ոչնչացնել",
"EnterCount": "Մուտքագրեք հաշվարկը",
"EnterHeight": "Մուտքագրեք բարձրությունը",
"EnterId": "Մուտքագրեք ID-ն",
"EnterPage": "Մուտքագրեք համարի էջը",
"EnterWidth": "Մուտքագրեք լայնությունը",
"FolderId": "Թղթապանակի ID",
"FrameId": "Շրջանակի ID",
"Header": "Վերնագիր",
"ItemsCount": "Նյութերը հաշվում են",
"JavascriptSdk": "Javascript sdk",
"Menu": "ՄԵՆՈՒ",
"Page": "Էջ",
"SearchTerm": "Որոնման տերմին",
"SortOrder": "Տեսակավորելու կարգը",
"WindowParameters": "Պատուհանների պարամետրեր"
}

View File

@ -127,6 +127,7 @@
"PortalAccessSubTitle": "Այս բաժինը թույլ է տալիս օգտվողներին տրամադրել կայքէջ մուտք գործելու անվտանգ և հարմար եղանակներ:",
"PortalDeactivation": "Ապագործունացնել DocSpace-ը",
"PortalDeactivationDescription": "Օգտագործեք այս տարբերակը՝ ձեր տարածքը ժամանակավորապես անջատելու համար:",
"PortalDeactivationHelper": "Եթե ​​ցանկանում եք ապաակտիվացնել այս DocSpace-ը, ձեր տարածքը և դրա հետ կապված բոլոր տեղեկությունները կարգելափակվեն, որպեսզի ոչ ոք որոշակի ժամանակահատվածում մուտք չունենա այն: Դա անելու համար սեղմեք «Անջատել» կոճակը: Գործողությունը հաստատելու հղումը կուղարկվի տարածքի սեփականատիրոջ էլ.փոստի հասցեին:\nԵթե ​​ցանկանում եք վերադառնալ տարածք և շարունակել օգտագործել այն, դուք պետք է օգտագործեք հաստատման նամակում նշված երկրորդ հղումը: Այսպիսով, խնդրում եմ, պահեք այս էլփոստը ապահով տեղում:",
"PortalDeletion": "Պորտալի ջնջում",
"PortalDeletionDescription": "Օգտագործեք այս տարբերակը՝ ձեր տարածքը ընդմիշտ ջնջելու համար:",
"PortalDeletionEmailSended": "Գործողությունը հաստատող հղում է ուղարկվել {{ownerEmail}} (տարածքի սեփականատիրոջ էլ.փոստի հասցեն).",

View File

@ -0,0 +1,22 @@
{
"Ascending": "Ascendente",
"CopyWindowCode": "Copia il codice di incorporamento della finestra",
"DataDisplay": "Impostazioni di visualizzazione dei dati",
"Descending": "Discendente",
"Destroy": "Distruggere",
"EnterCount": "Inserisci conteggio",
"EnterHeight": "Immettere l'altezza",
"EnterId": "Immettere l'ID",
"EnterPage": "Inserisci il numero di pagina",
"EnterWidth": "Inserisci la larghezza",
"FolderId": "Id Cartella",
"FrameId": "ID telaio",
"Header": "Intestazione",
"ItemsCount": "Gli elementi contano",
"JavascriptSdk": "SDK Javascript",
"Menu": "Menu",
"Page": "Pagina",
"SearchTerm": "Termine di ricerca",
"SortOrder": "Ordinamento",
"WindowParameters": "Parametri della finestra"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "I limiti di spazio di archiviazione e amministratori/utenti esperti stanno per essere superati.",
"StorageQuotaDescription": "Puoi rimuovere i file non necessari o <1>{{clickHere}}</1> per trovare un piano tariffario più adatto per il tuo DocSpace.",
"StorageQuotaHeader": "Lo spazio di archiviazione sta per essere esaurito: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1> per trovare un piano tariffario migliore per il tuo portale.",
"UserQuotaDescription": "<1>{{clickHere}}</1> per trovare un piano tariffario migliore per il tuo DocSpace.",
"UserQuotaHeader": "Il numero di amministratori/utenti esperti sta per essere superato: {{currentValue}} / {{maxValue}}."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "上昇",
"CopyWindowCode": "ウィンドウの埋め込みコードをコピーする",
"DataDisplay": "データ表示設定",
"Descending": "降順",
"Destroy": "破壊する",
"EnterCount": "カウントを入力してください",
"EnterHeight": "高さを入力してください",
"EnterId": "IDを入力してください",
"EnterPage": "ページ番号を入力してください",
"EnterWidth": "幅を入力してください",
"FolderId": "フォルダ ID",
"FrameId": "フレーム ID",
"Header": "ヘッダ",
"ItemsCount": "アイテム数",
"JavascriptSdk": "JavaScript SDK",
"Menu": "メニュー",
"Page": "ページ",
"SearchTerm": "検索語",
"SortOrder": "並べ替え順序",
"WindowParameters": "ウィンドウ パラメータ"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "ストレージと管理者/パワーユーザーの制限を超えそうです。",
"StorageQuotaDescription": "不要なファイルを削除するか、<1>{{clickHere}}</1>して、DocSpaceに適した料金プランを見つけることができます。",
"StorageQuotaHeader": "ストレージのスペースは、もうすぐサイズ上限を超えます:{{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "お使いのポータルに適した料金プランを探すには、<1>{{clickHere}}</1>。",
"UserQuotaDescription": "お使いのDocSpaceに適した料金プランを選択するには、<1>{{clickHere}}</1>。",
"UserQuotaHeader": "管理者/パワーユーザー数を超えそうです:{{currentValue}} / {{maxValue}}"
}

View File

@ -26,7 +26,7 @@
"Payer": "支払人",
"PayerDescription": "このユーザーは、支払いの詳細へのアクセス権を持ち、クォータの調整と支払いを行うことができる唯一のユーザーです。DocSpaceの所有者だけでなく、支払いマネージャー自身も、Stripeカスタマーポータルを使用してペイイングマネージャーの役割を再割り当てすることができます。",
"PaymentOverdue": "新しいユーザーを追加することができません。",
"PowerUserDescription": "パワーユーザーは、ルーム内のファイルの作成と編集はできますが、ルームの作成、ユーザーの管理、設定へのアクセスはできません",
"PowerUserDescription": "パワーユーザーは、ルーム内のファイルの作成と編集はできますが、ルームの作成、ユーザーの管理、設定へのアクセスはできません",
"PriceCalculation": "価格を計算する",
"QuotaPaidUserLimitError": "有料ユーザー数の上限に達しました。<1>支払額</1>",
"RenewSubscription": "{{planName}}プランの契約を更新する",

View File

@ -0,0 +1,22 @@
{
"Ascending": "오름차순",
"CopyWindowCode": "창 임베드 코드 복사",
"DataDisplay": "데이터 표시 설정",
"Descending": "내림차순",
"Destroy": "파괴하다",
"EnterCount": "개수 입력",
"EnterHeight": "높이 입력",
"EnterId": "아이디 입력",
"EnterPage": "번호 입력 페이지",
"EnterWidth": "폭 입력",
"FolderId": "폴더 아이디",
"FrameId": "프레임 ID",
"Header": "머리글",
"ItemsCount": "항목 수",
"JavascriptSdk": "자바스크립트 SDK",
"Menu": "메뉴",
"Page": "페이지",
"SearchTerm": "검색어",
"SortOrder": "정렬 순서",
"WindowParameters": "창 매개변수"
}

View File

@ -2,5 +2,6 @@
"ChangeUserStatusDialog": "ສະຖານະຂອງຜູ້ໃຊ້ທີ່ມີ '{{ userStatus }}' ຈະເປັນ {{ status }}.",
"ChangeUserStatusDialogHeader": "ປ່ຽນສະຖານະຜູ້ໃຊ້",
"ChangeUserStatusDialogMessage": "ທ່ານບໍ່ສາມາດປ່ຽນສະຖານະພາບສຳລັບເຈົ້າຂອງ DocSpace ແລະ ສຳລັບທ່ານເອງ.",
"ChangeUsersActiveStatus": "ເປີດໃຊ້ແລ້ວ"
"ChangeUsersActiveStatus": "ເປີດໃຊ້ແລ້ວ",
"ChangeUsersDisableStatus": "ປິດການໃຊ້ງານ"
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "ຕັ້ງຊັນຂຶ້ນ",
"CopyWindowCode": "ສຳເນົາລະຫັດຝັງໜ້າຕ່າງ",
"DataDisplay": "ການຕັ້ງຄ່າການສະແດງຂໍ້ມູນ",
"Descending": "ລົງມາ",
"Destroy": "ທໍາລາຍ",
"EnterCount": "ເຂົ້ານັບ",
"EnterHeight": "ໃສ່ຄວາມສູງ",
"EnterId": "ໃສ່ id",
"EnterPage": "ໃສ່ໜ້າເລກ",
"EnterWidth": "ໃສ່ຄວາມກວ້າງ",
"FolderId": "ID ໂຟນເດີ",
"FrameId": "ID ກອບ",
"Header": "ຫົວ",
"ItemsCount": "ຈໍານວນລາຍການ",
"JavascriptSdk": "Javascript sdk",
"Menu": "ເມນູ",
"Page": "ໜ້າ",
"SearchTerm": "ຄຳສັບຊອກຫາ",
"SortOrder": "ຮຽງລຳດັບ",
"WindowParameters": "ຕົວກໍານົດການປ່ອງຢ້ຽມ"
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Augošā",
"CopyWindowCode": "Kopējiet loga iegulšanas kodu",
"DataDisplay": "Datu displeja iestatījumi",
"Descending": "Dilstošā",
"Destroy": "Iznīcināt",
"EnterCount": "Ievadiet skaitu",
"EnterHeight": "Ievadiet augstumu",
"EnterId": "Ievadiet id",
"EnterPage": "Ievadiet numuru lapu",
"EnterWidth": "Ievadiet platumu",
"FolderId": "Mapes ID",
"FrameId": "Rāmja ID",
"Header": "Galvene",
"ItemsCount": "Preču skaits",
"JavascriptSdk": "Javascript sdk",
"Menu": "Izvēlne",
"Page": "Lappuse",
"SearchTerm": "Meklēšanas vienums",
"SortOrder": "Šķirošanas secība",
"WindowParameters": "Logu parametri"
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Oplopend",
"CopyWindowCode": "Kopieer de insluitcode van het venster",
"DataDisplay": "Instellingen voor gegevensweergave",
"Descending": "Aflopend",
"Destroy": "Vernietigen",
"EnterCount": "Voer het aantal in",
"EnterHeight": "Voer Hoogte in",
"EnterId": "Voer ID in",
"EnterPage": "Voer nummerpagina in",
"EnterWidth": "Voer de breedte in",
"FolderId": "Map-ID",
"FrameId": "Frame-ID",
"Header": "Hoofd",
"ItemsCount": "Artikelen tellen",
"JavascriptSdk": "Javascript-sdk",
"Menu": "Menu",
"Page": "Pagina",
"SearchTerm": "Zoekterm",
"SortOrder": "Sorteervolgorde",
"WindowParameters": "Venster parameters"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "De beperkingen voor opslag en beheerders/power users worden binnenkort overschreden.",
"StorageQuotaDescription": "U kunt de overbodige bestanden verwijderen of <1>{clickHere}}</1> om een meer geschikt prijsplan voor uw DocSpace te vinden.",
"StorageQuotaHeader": "De hoeveelheid opslagruimte staat op het punt overschreden te worden: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1> om een beter prijsplan voor uw portaal te vinden.",
"UserQuotaDescription": "<1>{{clickHere}}</1> om een beter prijsplan voor uw DocSpace te vinden.",
"UserQuotaHeader": "Het aantal beheerders/power users staan op het punt overschreden te worden: {{currentValue}} / {{maxValue}}."
}

View File

@ -17,6 +17,8 @@
"ErrorNotification": "Niet gelukt om tariefplan bij te werken. Probeer het later nog eens of neem contact op met de verkoopafdeling.",
"GracePeriodActivatedDescription": "Tijdens de wachtperiode kunnen beheerders geen nieuwe ruimtes aanmaken en geen nieuwe gebruikers toevoegen. Na de vervaldatum van de wachtperiode wordt DocSpace onbeschikbaar totdat de betaling is verricht.",
"GracePeriodActivatedInfo": "De wachtperiode is van kracht <1>van {{fromDate}} tot {{byDate}}</1> (resterende dagen: {{delayDaysCount}}).",
"InvalidEmailWithActiveSubscription": "Uw abonnement blijft actief, maar wij raden u aan een nieuwe betaler te kiezen die toegang krijgt tot de abonnementsinstellingen in DocSpace.",
"InvalidEmailWithActiveSubscriptionForAdmin": "Uw abonnement blijft actief, maar wij raden u aan contact op te nemen met de DocSpace eigenaar om een nieuwe Betaler te kiezen.",
"InvalidEmailWithoutActiveSubscription": "Wij raden aan een nieuwe Betaler te kiezen die toegang krijgt tot de abonnementsinstellingen in DocSpace.",
"InvalidEmailWithoutActiveSubscriptionByAdmin": "Wij raden u aan contact op te nemen met de DocSpace eigenaar om een nieuwe Betaler te kiezen.",
"ManagerTypesDescription": "Beheerder accounts en hun rechten",

View File

@ -0,0 +1,22 @@
{
"Ascending": "Rosnąco",
"CopyWindowCode": "Skopiuj kod osadzania okna",
"DataDisplay": "Ustawienia wyświetlania danych",
"Descending": "Malejąco",
"Destroy": "Zniszczyć",
"EnterCount": "Wpisz liczbę",
"EnterHeight": "Wprowadź wysokość",
"EnterId": "Wprowadź identyfikator",
"EnterPage": "Wprowadź numer strony",
"EnterWidth": "Wprowadź szerokość",
"FolderId": "Identyfikator folderu",
"FrameId": "Identyfikator ramki",
"Header": "Nagłówek",
"ItemsCount": "Liczba przedmiotów",
"JavascriptSdk": "SDK JavaScript",
"Menu": "Menu",
"Page": "Strona",
"SearchTerm": "Szukany termin",
"SortOrder": "Kolejność sortowania",
"WindowParameters": "Parametry okna"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Limity pamięci/użytkowników z większą liczbą uprawnień zostaną wkrótce przekroczone.",
"StorageQuotaDescription": "Możesz usunąć niepotrzebne pliki lub <1>{{clickHere}}</1>, aby znaleźć bardziej odpowiedni plan cenowy dla swojego konta DocSpace.",
"StorageQuotaHeader": "Ilość miejsca w pamięci zostanie wkrótce przekroczona: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1>, aby znaleźć lepszy plan cenowy dla swojego portalu.",
"UserQuotaDescription": "<1>{{clickHere}}</1>, aby znaleźć lepszy plan cenowy dla swojego DocSpace.",
"UserQuotaHeader": "Liczba administratorów/użytkowników z większą liczbą uprawnień zostanie wkrótce przekroczona: {{currentValue}} / {{maxValue}}."
}

View File

@ -1,4 +1,5 @@
{
"DeleteOwnerRestrictionText": "Sendo proprietário deste DocSpace, você deve transferir a propriedade para outro usuário antes de excluir sua conta. Escolha um novo proprietário para continuar.",
"DeleteProfileInfo": "Enviar as instruções de exclusão de perfil para o endereço de e-mail",
"DeleteProfileTitle": "Excluir diálogo do perfil"
}

View File

@ -26,6 +26,7 @@
"FeedUpdateUser": "foi atribuído o papel {{role}}",
"FileExtension": "Extensão de arquivo",
"FilesEmptyScreenText": "Veja os detalhes do arquivo e da pasta aqui",
"HistoryEmptyScreenText": "O histórico de atividades será mostrado aqui",
"ItemsSelected": "Itens selecionados",
"LastModifiedBy": "Última Modificação Por",
"PendingInvitations": "Convites pendentes",

View File

@ -0,0 +1,22 @@
{
"Ascending": "Ascendente",
"CopyWindowCode": "Copiar código de incorporação da janela",
"DataDisplay": "Configurações de exibição de dados",
"Descending": "Descendente",
"Destroy": "Destruir",
"EnterCount": "Inserir contagem",
"EnterHeight": "Insira a altura",
"EnterId": "Digite o ID",
"EnterPage": "Insira a página do número",
"EnterWidth": "Insira a largura",
"FolderId": "ID da pasta",
"FrameId": "ID do quadro",
"Header": "Cabeçalho",
"ItemsCount": "Contagem de itens",
"JavascriptSdk": "Javascript SDK",
"Menu": "Cardápio",
"Page": "Página",
"SearchTerm": "Termo de pesquisa",
"SortOrder": "Ordem de classificação",
"WindowParameters": "Parâmetros da janela"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Os limites de armazenamento e administradores/usuários avançados estão prestes a ser excedidos.",
"StorageQuotaDescription": "Você pode remover os arquivos desnecessários ou <1>{{clickHere}}</1> para encontrar um plano de preços mais adequado para o seu DocSpace.",
"StorageQuotaHeader": "A quantidade de espaço de armazenamento está prestes a ser excedida: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1> para encontrar um plano de preços melhor para o seu portal.",
"UserQuotaDescription": "<1>{{clickHere}}</1> para encontrar um plano de preços melhor para o seu DocSpace.",
"UserQuotaHeader": "O número de administradores/usuários avançados está prestes a ser excedido: {{currentValue}} / {{maxValue}}."
}

View File

@ -66,6 +66,7 @@
"MoveToFolderMessage": "Não pode mover a pasta para a sua subpasta",
"New": "Novo",
"NewRoom": "Nova sala",
"NoAccessRoomDescription": "Será redirecionado para As Minhas Salas automaticamente em 5 segundos.",
"NoAccessRoomTitle": "Lamentamos, mas não tem acesso a esta sala.",
"NoFilesHereYet": "Ainda não há ficheiros aqui",
"Open": "Abrir",

View File

@ -0,0 +1,22 @@
{
"Ascending": "Ascendente",
"CopyWindowCode": "Copiar código de incorporação da janela",
"DataDisplay": "Configurações de exibição de dados",
"Descending": "Descendente",
"Destroy": "Destruir",
"EnterCount": "Inserir contagem",
"EnterHeight": "Insira a altura",
"EnterId": "Digite o ID",
"EnterPage": "Insira a página do número",
"EnterWidth": "Insira a largura",
"FolderId": "ID da pasta",
"FrameId": "ID do quadro",
"Header": "Cabeçalho",
"ItemsCount": "Contagem de itens",
"JavascriptSdk": "Javascript SDK",
"Menu": "Cardápio",
"Page": "Página",
"SearchTerm": "Termo de pesquisa",
"SortOrder": "Ordem de classificação",
"WindowParameters": "Parâmetros da janela"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Os limites para o armazenamento e para o número de administradores/utilizadores com poder estão prestes a ser excedidos.",
"StorageQuotaDescription": "Pode remover os ficheiros desnecessários ou <1>{{{clickHere}}</1> para encontrar um plano de preços mais adequado para o seu DocSpace.",
"StorageQuotaHeader": "A capacidade de armazenamento do espaço está prestes a ser excedida: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1> para encontrar um plano de preços melhor para o seu portal.",
"UserQuotaDescription": "<1>{{clickHere}}</1> para encontrar um plano de preços melhor para o seu DocSpace.",
"UserQuotaHeader": "O número de administradores/utilizadores com poder está prestes a ser excedido: {{currentValue}} / {{maxValue}}."
}

View File

@ -3,5 +3,5 @@
"ChangePricingPlan": "Schimbare abonament",
"PlanStorageLimit": "O limită la abonamentul nou este <1>{{storageValue}}</1> de spațiu de stocare, și spațiul de stocare ocupat este de <1>{{currentStorageValue}}</1>.",
"PlanUsersLimit": "Doriți să retrogradați echipa la <1>{{usersCount}}</1> administratori/utilizatori avansați, numărul curent astfel de utilizatori din spațiul dvs DocSpace este <1>{{currentUsersCount}}</1>.",
"SaveOrChange": "Diminuați valoarea parametrului necesar sau păstraţi tariful actual."
"SaveOrChange": "Eliminați nepotrivirea în parametrul de conflict pentru a continua sau mențineți abonamentul dvs actual."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Ascendent",
"CopyWindowCode": "Copiați codul de încorporare a ferestrei",
"DataDisplay": "Setări de afișare a datelor",
"Descending": "Descendentă",
"Destroy": "Distruge",
"EnterCount": "Introduceți numărul",
"EnterHeight": "Introduceți înălțimea",
"EnterId": "Introduceți id",
"EnterPage": "Introduceți pagina cu numărul",
"EnterWidth": "Introduceți lățimea",
"FolderId": "ID dosar",
"FrameId": "ID cadru",
"Header": "Antet",
"ItemsCount": "Articolele contează",
"JavascriptSdk": "Javascript sdk",
"Menu": "Meniul",
"Page": "Pagină",
"SearchTerm": "Termen de căutare",
"SortOrder": "Ordinea de sortare",
"WindowParameters": "Parametrii ferestrei"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Limite de stocare pentru administratori/utilizatori avansați sunt pe punctul de a fi depăşiti.",
"StorageQuotaDescription": "Puteţi elimina fişierele inutile sau <1>{{{clickHere}}</1> pentru a găsi un abonament mai potrivit pentru spaţiul dvs DocSpace.",
"StorageQuotaHeader": "Cota spaţiului de stocare este pe punctul de a fi depăşită: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1> pentru a găsi cea mai bună ofertă pentru portalul dvs.",
"UserQuotaDescription": "<1>{{clickHere}}</1> pentru a găsi cea mai bună ofertă pentru spațiul dvs DocSpace.",
"UserQuotaHeader": "Numărul maxim de administratori/utilizatori avansați este pe punctul de a fi depăşit. {{currentValue}} / {{maxValue}}."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "По возрастанию",
"CopyWindowCode": "Скопировать код встраивания окна",
"DataDisplay": "Настройки отображения данных",
"Descending": "По убыванию",
"Destroy": "Уничтожить",
"EnterCount": "Введите количество",
"EnterHeight": "Введите высоту",
"EnterId": "Введите идентификатор",
"EnterPage": "Введите номер страницы",
"EnterWidth": "Введите ширину",
"FolderId": "Идентификатор папки",
"FrameId": "Идентификатор кадра",
"Header": "Заголовок",
"ItemsCount": "Количество предметов",
"JavascriptSdk": "Пакет SDK для Javascript",
"Menu": "Меню",
"Page": "Страница",
"SearchTerm": "Искать термин",
"SortOrder": "Порядок сортировки",
"WindowParameters": "Параметры окна"
}

View File

@ -28,5 +28,6 @@
"SetAppTitle": "Nakonfigurujte si aplikáciu autentifikátora",
"SuccessDeactivate": "Váš účet bol úspešne deaktivovaný. Po 10 sekundách budete presmerovaní na <1>webovú stránku</1>.",
"SuccessReactivate": "Váš účet bol úspešne znovu aktivovaný. Po 10 sekundách budete presmerovaní na <1>portál</1>.",
"SuccessRemoved": "Váš účet bol úspešne odstránený. O 10 sekúnd budete presmerovaní na <1>webovú stránku</1>.",
"WelcomeUser": "Vitajte na našom DocSpace!\nAk chcete začať, zaregistrujte sa alebo sa prihláste cez sociálne siete."
}

View File

@ -37,13 +37,19 @@
"EnableNotifications": "Vypnúť upozornenia",
"ExcludeSubfolders": "Vylúčiť podpriečinky",
"FavoritesEmptyContainerDescription": "Ak chcete označiť súbory ako obľúbené alebo ich odstrániť zo zoznamu, použite kontextovú ponuku.",
"FileContents": "Obsah súboru",
"FileRemoved": "Súbor bol presunutý do koša",
"FileRenamed": "Dokument „{{oldTitle}}“ bol premenovaný na „{{newTitle}}“",
"FillingFormRooms": "Formulár na vyplnenie",
"Filter": "Filter",
"FinalizeVersion": "Dokončiť verziu",
"Folder": "Priečinok",
"FolderRemoved": "Priečinok bol presunutý do koša",
"FolderRenamed": "Priečinok '{{folderTitle}}' bol premenovaný na '{{newFoldedTitle}}'",
"Forms": "Formuláre",
"FormsTemplates": "Šablóny formulárov",
"GoToMyRooms": "Prejdite do Moje miestnosti",
"GoToPersonal": "Prejdite do Moje dokumenty",
"Images": "Obrázky",
"LinkForPortalUsers": "Odkaz pre užívateľov portálu",
"MarkAsFavorite": "Označiť ako obľúbené",
@ -54,10 +60,17 @@
"MoveItems": "<strong>{{qty}}</strong> prvkov bolo presunutých",
"MoveOrCopy": "Presunúť alebo Kopírovať",
"MoveTo": "Presunúť do",
"MoveToArchive": "Presunúť do archívu",
"MoveToFolderMessage": "Priečinok nemôžete presunúť do jeho podpriečinka",
"New": "Nový",
"NewRoom": "Nová miestnosť",
"NoAccessRoomDescription": "O 5 sekúnd budete automaticky presmerovaní na Moje miestnosti.",
"NoAccessRoomTitle": "Do tejto miestnosti bohužiaľ nemáte prístup.",
"NoFilesHereYet": "Zatiaľ tu nie sú žiadne súbory",
"Open": "Otvoriť",
"OpenLocation": "Otvoriť umiestnenie",
"Pin": "Pripnúť",
"PinToTop": "Pripnúť hore",
"Presentation": "Prezentácia",
"PrivateRoomDescriptionEncrypted": "Šifrované úpravy a spolupráca v reálnom čase.",
"PrivateRoomDescriptionSafest": "Najbezpečnejšie úložisko pre docx, xlsx a pptx .",
@ -65,10 +78,23 @@
"PrivateRoomDescriptionUnbreakable": "Neprelomiteľný algoritmus AES-256.",
"PrivateRoomHeader": "Vitajte v súkromnej miestnosti ONLYOFFICE, kde je každý vami zadaný symbol šifrovaný",
"PrivateRoomSupport": "Práca v súkromnej miestnosti je k dispozícii prostredníctvom počítačovej aplikácie {{organizationName}}. <3>Pokyny</3>",
"RecentEmptyContainerDescription": "V tejto časti sa zobrazia vaše naposledy zobrazené alebo upravené dokumenty.",
"RecycleBinAction": "Vyprázdniť smetný kôš",
"RemoveFromFavorites": "Odstrániť z obľúbených",
"RemoveFromList": "Odstrániť zo zoznamu",
"RemovedFromFavorites": "Odstránené z obľúbených",
"Rename": "Premenovať",
"RestoreAll": "Obnoviť všetko",
"RoomCreated": "Miestnosť vytvorená",
"RoomEmptyContainerDescription": "Prosím vytvorte prvú miestnosť.",
"RoomEmptyContainerDescriptionUser": "Tu sa zobrazia miestnosti, ktoré s vami niekto zdieľa.",
"RoomNotificationsDisabled": "Upozornenia o miestnosti sú vypnuté",
"RoomNotificationsEnabled": "Upozornenia o miestnosti sú zapnuté",
"RoomPinned": "Miestnosť je pripnutá",
"RoomRemoved": "Miestnosť bola odstránená",
"RoomUnpinned": "Miestnosť je odopnutá",
"RoomsRemoved": "Miestnosti boli odstránené",
"SearchByContent": "Vyhľadávanie podľa obsahu súboru",
"SendByEmail": "Poslať e-mailom",
"Share": "Zdieľať",
"ShowVersionHistory": "Zobraziť históriu verzií",
@ -77,9 +103,15 @@
"TooltipElementsCopyMessage": "Kopírovať prvky {{element}}",
"TooltipElementsMoveMessage": "Presunúť prvky {{element}}",
"TrashEmptyDescription": "Do sekcie 'Kôš' sa presúvajú všetky zmazané súbory. V prípade chyby ich môžete obnoviť. Ak zmažete súbory zo sekcie 'Kôš', tak ich nebudete vedieť obnoviť.",
"TrashErasureWarning": "Položky v smetnom koši sa automaticky vymažú po 30 dňoch.",
"UnarchivedRoomAction": "Miestnosť '{{name}}' bola rozbalená z archívu.",
"UnarchivedRoomsAction": "Miestnosti nie sú archivované.",
"UnblockVersion": "Odblokovať/nahlásiť sa",
"Unpin": "Odopnúť",
"VersionBadge": "V.{{version}}",
"VersionHistory": "História verzií",
"ViewList": "Zoznam",
"ViewTiles": "Dlaždice"
"ViewOnlyRooms": "Iba prezeranie",
"ViewTiles": "Dlaždice",
"WithSubfolders": "S podpriečinkami"
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Stúpajúca",
"CopyWindowCode": "Kopírovať kód na vloženie okna",
"DataDisplay": "Nastavenia zobrazovania údajov",
"Descending": "Zostupne",
"Destroy": "Zničiť",
"EnterCount": "Zadajte počet",
"EnterHeight": "Zadajte výšku",
"EnterId": "Zadajte ID",
"EnterPage": "Zadajte stránku s číslom",
"EnterWidth": "Zadajte šírku",
"FolderId": "ID priečinka",
"FrameId": "ID rámu",
"Header": "Hlavička",
"ItemsCount": "Položky sa počítajú",
"JavascriptSdk": "Javascript sdk",
"Menu": "Ponuka",
"Page": "Strana",
"SearchTerm": "Hľadaný výraz",
"SortOrder": "Zoradiť objednávku",
"WindowParameters": "Parametre okna"
}

View File

@ -5,6 +5,10 @@
"RequestActivation": "Požiadať o aktiváciu ešte raz",
"RoomQuotaDescription": "Miestnosti, ktore nepotrebujete môžete archivovať alebo <1>{{clickHere}}</1> nájsť lepší plán pre svoj DocSpace.",
"RoomQuotaHeader": "Počet miestností bude čoskoro prekročený: {{currentValue}} / {{maxValue}}",
"StorageAndRoomHeader": "Limity úložísk a miestností budú čoskoro prekročené.",
"StorageAndUserHeader": "Objem úložísk a maximálny počet administrátorov/pokročilých používateľov budú čoskoro prekročené.",
"StorageQuotaDescription": "Môžete odstrániť súbory, ktore nepotrebujete alebo <1>{{clickHere}}</1> nájsť lepší plán pre svoj DocSpace.",
"StorageQuotaHeader": "Veľkosť úložného priestoru bude čoskoro prekročená: {{currentValue}} / {{maxValue}}"
"StorageQuotaHeader": "Veľkosť úložného priestoru bude čoskoro prekročená: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1> a nájdite najlepší cenový plán pre váš DocSpace.",
"UserQuotaHeader": "Maximálny počet administrátorov/pokročilých používateľov bude čoskoro prekročený: {{currentValue}} / {{maxValue}}."
}

View File

@ -1,4 +1,5 @@
{
"ActionsWithFilesDescription": "Označenia vás budú upozorňovať na akcie, ako je nahrávanie, vytváranie a úprava súborov.",
"Badges": "Menovky",
"DailyFeed": "Denný informačný kanál DocSpace",
"DailyFeedDescription": "Prečítajte si správy a udalosti z vášho DocSpace v dennom prehľade.",

View File

@ -5,9 +5,11 @@
"BusinessExpired": "Platnosť vášho plánu {{planName}} vypršala dňa {{date}}",
"BusinessFinalDateInfo": "Predplatné bude automaticky obnovené dňa {{finalDate}} s aktualizovanými cenami a špecifikáciami. Môžete ho zrušiť alebo zmeniť svoje fakturačné údaje na zákazníckom portáli Stripe.",
"BusinessPlanPaymentOverdue": "Nie je možné pridávať nových používateľov a vytvárať nové miestnosti. Splátka plánu {{planName}} je po splatnosti.",
"BusinessRequestDescription": "Cenové plány s viac ako {{peopleNumber}} administrátormi/pokročilými používateľmi sú dostupné len na požiadanie.",
"BusinessSuggestion": "Prispôsobte si svoj plán {{planName}}",
"BusinessTitle": "Používate plán {{planName}}",
"BusinessUpdated": "Plán {{planName}} bol aktualizovaný",
"ChooseNewPayer": "Vyberte si nového platiteľa",
"ChooseNewPlan": "Chcete si vybrať nový tarifný program?",
"ContactUs": "V prípade otázok týkajúcich sa predaja nás kontaktujte na",
"DelayedPayment": "Oneskorená platba za plán {{planName}} zo dňa {{date}}",
@ -15,11 +17,16 @@
"ErrorNotification": "Aktualizácia tarifného plánu zlyhala. Skúste to znova neskôr alebo kontaktujte obchodné oddelenie.",
"GracePeriodActivatedDescription": "Počas doby odkladu platby nemôžu administrátori vytvárať nové miestnosti ani pridávať nových používateľov. Po uplynutí doby odkladu platby bude DocSpace nedostupný až do zaplatenia.",
"GracePeriodActivatedInfo": "Doba odkladu platby bude aktívna <1>od {{fromDate}} do {{byDate}}</1> (zostávajúce dni: {{delayDaysCount}}).",
"InvalidEmailWithActiveSubscription": "Vaše predplatné zostáva aktívne, ale odporúčame vybrať nového platiteľa, ktorý bude mať prístup k nastaveniam predplatného v DocSpace.",
"InvalidEmailWithActiveSubscriptionForAdmin": "Vaše predplatné zostáva aktívne, ale odporúčame vám kontaktovať vlastníka DocSpace a vybrať nového platcu.",
"InvalidEmailWithoutActiveSubscription": "Odporúčame vybrať nového platiteľa, ktorý bude mať prístup k nastaveniam predplatného v DocSpace.",
"InvalidEmailWithoutActiveSubscriptionByAdmin": "Odporúčame vám kontaktovať vlastníka DocSpace pred výberom nového platiteľa.",
"ManagerTypesDescription": "Typy účtov administrátorov a ich oprávnenia",
"Pay": "Zaplatiť",
"Payer": "Platiteľ",
"PayerDescription": "Tento používateľ má prístup k detailom platby a je jediným používateľom, ktorý môže nastaviť kvótu a vykonávať platby. Vlastník DocSpace, ako aj samotný správca platieb, môže rolu správcu platieb zmeniť pomocou zákazníckeho portálu Stripe.",
"PaymentOverdue": "Nie je možné pridávať nových používateľov.",
"PowerUserDescription": "Pokročilí používatelia môžu vytvárať a upravovať súbory v miestnosti, ale nemôžu vytvárať miestnosti, spravovať používateľov ani nemajú prístup k nastaveniam.",
"PriceCalculation": "Vypočítajte svoju cenu",
"QuotaPaidUserLimitError": "Bol dosiahnutý limit platených používateľov. <1>Platby</1>",
"RenewSubscription": "Obnovte predplatné plánu {{planName}}",
@ -32,5 +39,6 @@
"UpgradePlan": "Aktualizovať plán",
"UpgradePlanInfo": "Pridaním nových používateľov prekročíte maximálny počet členov v miestnosti povolený vaším aktuálnym cenovým plánom.",
"UserNotFound": "Používateľ <1>{{email}}</1> sa nenašiel.",
"UserNotFoundMatchingEmail": "Nepodarilo sa nám nájsť používateľa so zodpovedajúcou e-mailovou adresou Stripe.",
"YourPrice": "Vaša cena"
}

View File

@ -108,6 +108,7 @@
"LogoDocsEditorEmbedded": "Logo pre hlavičku editorov - vložený režim",
"LogoFavicon": "Favicon",
"LogoLightSmall": "Logo pre hlavičku portálu",
"LogoLogin": "Logo pre prihlasovaciu stránku a e-maily",
"ManagementCategoryDataManagement": "Správa dat",
"ManagementCategoryIntegration": "Integrácia",
"ManagementCategorySecurity": "Bezpečnosť",

View File

@ -26,7 +26,9 @@
"FolderTitleYandex": "Priečinok Yandex",
"FolderTitlekDrive": "Priečinok kDrive",
"Folders": "Priečinky",
"FormTemplates": "Šablóny formulára",
"LinkCopySuccess": "Odkaz bol skopírovaný do schránky",
"LinkValidTime": "Tento odkaz je platný iba {{days_count}} dní.",
"MobileAndroid": "Stiahnite si ONLYOFFICE Documents na Google Play",
"MobileIos": "Stiahnite si ONLYOFFICE Documents na App Store",
"MobileLinux": "Stiahnite si ONLYOFFICE Desktop Editors pre Linux",
@ -46,6 +48,7 @@
"RoleEditorDescription": "Operácie s existujúcimi súbormi: prezeranie, úprava, vypĺňanie formulárov, kontrola, komentovanie.",
"RoleFormFiller": "Vyplnenie formulára",
"RoleFormFillerDescription": "Operácie s existujúcimi súbormi: prezeranie, vypĺňanie formulárov, kontrola, komentovanie.",
"RolePowerUserDescription": "Pokročilí používatelia môžu vytvárať a upravovať súbory v miestnosti, ale nemôžu vytvárať miestnosti, spravovať používateľov ani nemajú prístup k nastaveniam.",
"RoleReviewer": "Recenzent",
"RoleReviewerDescription": "Operácie s existujúcimi súbormi: prezeranie, kontrola, komentovanie.",
"RoleRoomAdminDescription": "Administrátori miestností môžu vytvárať a spravovať priradené miestnosti, pozývať nových používateľov a prideľovať role, ktoré sú nižšie ako pozícia administrátora. Všetci administrátori majú prístup do sekcie Osobné.",

View File

@ -1,4 +1,5 @@
{
"CancelUpload": "Sťahovanie bolo prerušené. Niektoré súbory neboli načítane.",
"EnterPassword": "Zadajte heslo",
"HideInput": "Skryť",
"Ready": "Hotovo",

View File

@ -0,0 +1,22 @@
{
"Ascending": "Naraščajoče",
"CopyWindowCode": "Kopiraj kodo za vdelavo okna",
"DataDisplay": "Nastavitve prikaza podatkov",
"Descending": "Padajoče",
"Destroy": "Uničiti",
"EnterCount": "Vnesite štetje",
"EnterHeight": "Vnesite višino",
"EnterId": "Vnesite id",
"EnterPage": "Vnesite številko strani",
"EnterWidth": "Vnesite širino",
"FolderId": "ID mape",
"FrameId": "ID okvirja",
"Header": "Glava",
"ItemsCount": "Predmeti štejejo",
"JavascriptSdk": "Javascript sdk",
"Menu": "MENU",
"Page": "Stran",
"SearchTerm": "Iskalni izraz",
"SortOrder": "Vrstni red",
"WindowParameters": "Parametri oken"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Omejitve prostora za shranjevanje in število skrbnikov/naprednih uporabnikov bodo kmalu presežene.",
"StorageQuotaDescription": "Nepotrebne datoteke lahko odstranite ali <1>{{clickHere}}</1> poiščete primernejši finančni paket za vaš DocSpace.",
"StorageQuotaHeader": "Dovoljen prostor za shranjevanje bo kmalu presežen: {{currentValue}} / {{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1> Poiščite primernejši finančni načrt za svoj portal.",
"UserQuotaDescription": "<1>{{clickHere}}</1> Poiščite primernejši finančni načrt za svoj DocSpace.",
"UserQuotaHeader": "Število skrbnikov/naprednih uporabnikov bo kmalu preseženo: {{currentValue}} / {{maxValue}}."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Artan",
"CopyWindowCode": "Pencere yerleştirme kodunu kopyala",
"DataDisplay": "Veri görüntüleme ayarları",
"Descending": "Azalan",
"Destroy": "Yıkmak",
"EnterCount": "Sayı girin",
"EnterHeight": "Yüksekliği girin",
"EnterId": "Kimliği girin",
"EnterPage": "Numara sayfasını girin",
"EnterWidth": "Genişliği girin",
"FolderId": "Klasör kimliği",
"FrameId": "Çerçeve kimliği",
"Header": "Başlık",
"ItemsCount": "Ürün sayısı",
"JavascriptSdk": "Javascript SDK'sı",
"Menu": "Menü",
"Page": "Sayfa",
"SearchTerm": "Arama terimi",
"SortOrder": "Sıralama düzeni",
"WindowParameters": "Pencere parametreleri"
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Висхідний",
"CopyWindowCode": "Скопіюйте код вбудовування вікна",
"DataDisplay": "Налаштування відображення даних",
"Descending": "Спускається",
"Destroy": "Знищити",
"EnterCount": "Введіть кількість",
"EnterHeight": "Введіть висоту",
"EnterId": "Введіть id",
"EnterPage": "Введіть номер сторінки",
"EnterWidth": "Введіть ширину",
"FolderId": "Ідентифікатор папки",
"FrameId": "Ідентифікатор кадру",
"Header": "Заголовок",
"ItemsCount": "Кількість елементів",
"JavascriptSdk": "Javascript SDK",
"Menu": "Меню",
"Page": "Сторінка",
"SearchTerm": "Пошуковий термін",
"SortOrder": "Порядок сортування",
"WindowParameters": "Параметри вікна"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "Обмеження сховища та обмеження для адміністраторів / досвідчених користувачів скоро буде перевищено.",
"StorageQuotaDescription": "Ви можете видалити непотрібні файли, або <1>{{clickHere}}</1>, щоб знайти більш підходящий тарифний план для вашого DocSpace.",
"StorageQuotaHeader": "Обсяг сховища скоро буде перевищено: {{currentValue}}/{{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1>, щоб знайти кращий тарифний план для вашого порталу.",
"UserQuotaDescription": "<1>{{clickHere}}</1>, щоб знайти кращий тарифний план для вашого DocSpace.",
"UserQuotaHeader": "Кількість адміністраторів / досвідчених користувачів скоро буде перевищено: {{currentValue}}/{{maxValue}}."
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "Tăng dần",
"CopyWindowCode": "Sao chép mã nhúng cửa sổ",
"DataDisplay": "Cài đặt hiển thị dữ liệu",
"Descending": "Giảm dần",
"Destroy": "Hủy hoại",
"EnterCount": "Nhập số lượng",
"EnterHeight": "Nhập chiều cao",
"EnterId": "Nhập ID",
"EnterPage": "Nhập số trang",
"EnterWidth": "Nhập chiều rộng",
"FolderId": "ID thư mục",
"FrameId": "Id khung",
"Header": "Tiêu đề",
"ItemsCount": "Số lượng mặt hàng",
"JavascriptSdk": "Sdk Javascript",
"Menu": "Thực đơn",
"Page": "Trắng",
"SearchTerm": "Cụm từ tìm kiếm",
"SortOrder": "Thứ tự sắp xếp",
"WindowParameters": "Thông số cửa sổ"
}

View File

@ -0,0 +1,22 @@
{
"Ascending": "上升",
"CopyWindowCode": "复制窗口嵌入代码",
"DataDisplay": "数据显示设置",
"Descending": "降序",
"Destroy": "破坏",
"EnterCount": "输入计数",
"EnterHeight": "输入身高",
"EnterId": "输入ID",
"EnterPage": "输入号码页面",
"EnterWidth": "输入宽度",
"FolderId": "文件夹编号",
"FrameId": "框架编号",
"Header": "头",
"ItemsCount": "项目计数",
"JavascriptSdk": "Javascript SDK",
"Menu": "菜单",
"Page": "页",
"SearchTerm": "搜索词",
"SortOrder": "排序",
"WindowParameters": "窗口参数"
}

View File

@ -9,6 +9,6 @@
"StorageAndUserHeader": "存储和管理员/高级用户的数量限制即将被超过。",
"StorageQuotaDescription": "您可移除不需要的文件或<1>{{clickHere}}</1>了解更适合您协作空间的定价版本。",
"StorageQuotaHeader": "存储空间数量即将超出限制:{{currentValue}}/{{maxValue}}",
"UserQuotaDescription": "<1>{{clickHere}}</1>,选择更适合您的定价方案。",
"UserQuotaDescription": "<1>{{clickHere}}</1>,选择更合适的协作空间定价方案。",
"UserQuotaHeader": "管理员/高级用户的数量限制即将被超过。 {{currentValue}} / {{maxValue}}"
}

View File

@ -174,7 +174,7 @@ const ChangePortalOwnerDialog = ({
<Text className="display-name" noSelect title={displayName}>
{displayName}
</Text>
<Text className="owner" noSelect title={"Owner"}>
<Text className="owner" noSelect title={t("Common:Owner")}>
{t("Common:Owner")}
</Text>
</div>

View File

@ -37,7 +37,6 @@ const FilesListRow = ({
fontSize="13px"
fontWeight="400"
name={`${index}`}
label=""
isChecked={isChecked}
onClick={onFileClick}
value=""

View File

@ -70,7 +70,6 @@ class PureVersionHistoryPanel extends React.Component {
className="loader-version-history"
height="28"
width="688"
title="version-history-header-loader"
/>
)}
</StyledHeaderContent>

View File

@ -96,6 +96,7 @@ const TfaActivationForm = withLoader((props) => {
loginWithCodeAndCookie,
history,
location,
currentColorScheme,
} = props;
const [code, setCode] = useState("");
@ -153,15 +154,27 @@ const TfaActivationForm = withLoader((props) => {
portal security. Configure your authenticator application to
continue work on the portal. For example you could use Google
Authenticator for
<Link isHovered href={props.tfaAndroidAppUrl} target="_blank">
<Link
color={currentColorScheme?.main?.accent}
href={props.tfaAndroidAppUrl}
target="_blank"
>
Android
</Link>
and{" "}
<Link isHovered href={props.tfaIosAppUrl} target="_blank">
<Link
color={currentColorScheme?.main?.accent}
href={props.tfaIosAppUrl}
target="_blank"
>
iOS
</Link>{" "}
or Authenticator for{" "}
<Link isHovered href={props.tfaWinAppUrl} target="_blank">
<Link
color={currentColorScheme?.main?.accent}
href={props.tfaWinAppUrl}
target="_blank"
>
Windows Phone
</Link>{" "}
.
@ -252,7 +265,7 @@ const TfaActivationWrapper = (props) => {
const [qrCode, setQrCode] = useState("");
const [error, setError] = useState(null);
useEffect(async () => {
const fetchData = async () => {
try {
setIsLoading(true);
const confirmKey = linkData.confirmHeader;
@ -265,9 +278,12 @@ const TfaActivationWrapper = (props) => {
setError(e.error);
toastr.error(e);
}
setIsLoaded(true);
setIsLoading(false);
};
useEffect(() => {
fetchData();
}, []);
return error ? (
@ -286,6 +302,7 @@ export default inject(({ auth, confirm }) => ({
tfaAndroidAppUrl: auth.tfaStore.tfaAndroidAppUrl,
tfaIosAppUrl: auth.tfaStore.tfaIosAppUrl,
tfaWinAppUrl: auth.tfaStore.tfaWinAppUrl,
currentColorScheme: auth.settingsStore.currentColorScheme,
}))(
withRouter(
withTranslation(["Confirm", "Common"])(observer(TfaActivationWrapper))

View File

@ -161,7 +161,7 @@ const TfaAuthForm = withLoader((props) => {
const TfaAuthFormWrapper = (props) => {
const { setIsLoaded, setIsLoading } = props;
useEffect(async () => {
useEffect(() => {
setIsLoaded(true);
setIsLoading(false);
}, []);

View File

@ -89,7 +89,7 @@ const History = ({
return { ...fetchedHistory, feedsByDays: parsedFeeds };
};
useEffect(async () => {
useEffect(() => {
if (!isMount.current) return;
if (selection.history) {
@ -101,7 +101,8 @@ const History = ({
}, [selection]);
if (showLoader) return <Loaders.InfoPanelViewLoader view="history" />;
if (!history || history?.feeds.length === 0) return <NoHistory t={t} />;
if (!history) return <></>;
if (history?.feeds?.length === 0) return <NoHistory t={t} />;
return (
<>

View File

@ -164,7 +164,6 @@ const FilesRowContent = ({
className="row-content-text"
fontSize="12px"
fontWeight={400}
title=""
truncate={true}
>
{isRooms

View File

@ -9,15 +9,17 @@ const SizeCell = ({ t, item, sideColor }) => {
filesCount,
foldersCount,
} = item;
const date = fileExst || contentLength ? contentLength : "—";
return (
<StyledText
color={sideColor}
fontSize="12px"
fontWeight={600}
title=""
title={date}
truncate
>
{fileExst || contentLength ? contentLength : "—"}
{date}
</StyledText>
);
};

View File

@ -49,10 +49,17 @@ const TypeCell = ({ t, item, sideColor }) => {
const type = item.isRoom ? getRoomType() : getItemType();
const Exst = fileExst ? fileExst.slice(1).toUpperCase() : "";
const data = `${type} ${Exst}`;
return (
<StyledText fontSize="12px" fontWeight="600" color={sideColor} truncate>
{type} {Exst}
<StyledText
fontSize="12px"
fontWeight="600"
color={sideColor}
truncate
title={data}
>
{data}
</StyledText>
);
};

View File

@ -48,7 +48,6 @@ const BackupListBody = ({
fontSize="13px"
fontWeight="400"
value=""
label=""
isChecked={isChecked}
onClick={onSelectFile}
name={`${index}_${fileId}`}

View File

@ -76,43 +76,22 @@ const Preview = styled(Box)`
const PortalIntegration = (props) => {
const { t, setDocumentTitle } = props;
setDocumentTitle(t("PortalIntegration"));
setDocumentTitle(t("JavascriptSdk"));
const scriptUrl = `${window.location.origin}/static/scripts/api.js`;
const dataSortBy = [
{ key: "DateAndTime", label: "Last modified date", default: true },
{ key: "AZ", label: "Title" },
{ key: "Type", label: "Type" },
{ key: "Size", label: "Size" },
{ key: "DateAndTimeCreation", label: "Creation date" },
{ key: "Author", label: "Author" },
];
const dataFilterType = [
{ key: 0, label: "None", default: true },
{ key: 1, label: "Files" },
{ key: 2, label: "Folders" },
{ key: 3, label: "Documents" },
{ key: 4, label: "Presentations" },
{ key: 5, label: "Spreadsheets" },
{ key: 7, label: "Images" },
{ key: 8, label: "By user" },
{ key: 9, label: "By department" },
{ key: 10, label: "Archive" },
{ key: 11, label: "By Extension" },
{ key: 12, label: "Media" },
{ key: "DateAndTime", label: t("Common:LastModifiedDate"), default: true },
{ key: "AZ", label: t("Common:Title") },
{ key: "Type", label: t("Common:Type") },
{ key: "Size", label: t("Common:Size") },
{ key: "DateAndTimeCreation", label: t("Files:ByCreation") },
{ key: "Author", label: t("Files:ByAuthor") },
];
const dataSortOrder = [
{ key: "descending", label: "Descending", default: true },
{ key: "ascending", label: "Ascending" },
];
const dataDisplayType = [
{ key: "row", label: "Row", default: true },
{ key: "table", label: "Table" },
{ key: "tile", label: "Tile" },
{ key: "descending", label: t("Descending"), default: true },
{ key: "ascending", label: t("Ascending") },
];
const [config, setConfig] = useState({
@ -127,8 +106,6 @@ const PortalIntegration = (props) => {
const [sortBy, setSortBy] = useState(dataSortBy[0]);
const [sortOrder, setSortOrder] = useState(dataSortOrder[0]);
const [filterType, setFilterType] = useState(dataFilterType[0]);
const [displayType, setDisplayType] = useState(dataDisplayType[0]);
const [withSubfolders, setWithSubfolders] = useState(false);
const params = objectToGetParams(config);
@ -269,141 +246,119 @@ const PortalIntegration = (props) => {
return (
<>
{isMobile ? (
<BreakpointWarning sectionName={t("Settings:Branding")} />
<BreakpointWarning sectionName={t("JavascriptSdk")} />
) : (
<Container>
<Controls>
<Heading level={1} size="small">
Frame options
{t("WindowParameters")}
</Heading>
<ControlsGroup>
<Label className="label" text="Frame id" />
<Label className="label" text={t("FrameId")} />
<TextInput
scale={true}
onChange={onChangeFrameId}
placeholder="Frame id"
placeholder={t("EnterId")}
value={config.frameId}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Frame width" />
<Label className="label" text={t("EmbeddingPanel:Width")} />
<TextInput
scale={true}
onChange={onChangeWidth}
placeholder="Frame width"
placeholder={t("EnterWidth")}
value={config.width}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Frame height" />
<Label className="label" text={t("EmbeddingPanel:Height")} />
<TextInput
scale={true}
onChange={onChangeHeight}
placeholder="Frame height"
placeholder={t("EnterHeight")}
value={config.height}
/>
</ControlsGroup>
{/* <ControlsGroup>
<Label className="label" text="Display mode: " />
<ComboBox
scale={true}
onSelect={onChangeDisplayType}
options={dataDisplayType}
scaled={true}
selectedOption={displayType}
displaySelectedOption
/>
</ControlsGroup> */}
<Checkbox
label="Show header"
label={t("Header")}
onChange={onChangeShowHeader}
isChecked={config.showHeader}
/>
<Checkbox
label="Show title"
label={t("Common:Title")}
onChange={onChangeShowTitle}
isChecked={config.showTitle}
/>
<Checkbox
label="Show article"
label={t("Menu")}
onChange={onChangeShowArticle}
isChecked={config.showArticle}
/>
<Checkbox
label="Show filter"
label={t("Files:Filter")}
onChange={onChangeShowFilter}
isChecked={config.showFilter}
/>
<Heading level={1} size="small">
Filter options
{t("DataDisplay")}
</Heading>
<ControlsGroup>
<Label className="label" text="Folder id" />
<Label className="label" text={t("FolderId")} />
<TextInput
scale={true}
onChange={onChangeFolderId}
placeholder="Folder id"
placeholder={t("EnterId")}
value={config.folder}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Items count" />
<Label className="label" text={t("ItemsCount")} />
<TextInput
scale={true}
onChange={onChangeCount}
placeholder="Items count"
placeholder={t("EnterCount")}
value={config.count}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Page" />
<Label className="label" text={t("Page")} />
<TextInput
scale={true}
onChange={onChangePage}
placeholder="Page"
placeholder={t("EnterPage")}
value={config.page}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Search term" />
<Label className="label" text={t("SearchTerm")} />
<Box
style={{ flexDirection: "row", display: "flex", gap: "16px" }}
>
<TextInput
scale={true}
onChange={onChangeSearch}
placeholder="Search term"
placeholder={t("Common:Search")}
value={config.search}
/>
<Checkbox
label="With subfolders"
label={t("Files:WithSubfolders")}
onChange={onChangeWithSubfolders}
isChecked={withSubfolders}
/>
</Box>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Author" />
<Label className="label" text={t("Files:ByAuthor")} />
<TextInput
scale={true}
onChange={onChangeAuthor}
placeholder="Author"
placeholder={t("Common:EnterName")}
value={config.authorType}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Filter type:" />
<ComboBox
onSelect={onChangeFilterType}
options={dataFilterType}
scaled={true}
selectedOption={filterType}
displaySelectedOption
directionY="top"
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Sort by:" />
<Label className="label" text={t("Common:SortBy")} />
<ComboBox
onSelect={onChangeSortBy}
options={dataSortBy}
@ -414,7 +369,7 @@ const PortalIntegration = (props) => {
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Sort order:" />
<Label className="label" text={t("SortOrder")} />
<ComboBox
onSelect={onChangeSortOrder}
options={dataSortOrder}
@ -428,7 +383,7 @@ const PortalIntegration = (props) => {
<Preview>
<Frame>
<Box id={frameId} className="frameStyle">
Frame content
{t("Common:Preview")}
</Box>
</Frame>
@ -442,13 +397,13 @@ const PortalIntegration = (props) => {
<Button
primary
size="normal"
label="Destroy"
label={t("Destroy")}
onClick={destroyFrame}
/>
</Buttons>
<Heading level={1} size="xsmall">
Paste this code block on page:
{t("CopyWindowCode")}
</Heading>
<Textarea value={codeBlock} />
@ -467,4 +422,8 @@ export default inject(({ setup, auth }) => {
theme,
setDocumentTitle,
};
})(withTranslation(["Settings", "Common"])(observer(PortalIntegration)));
})(
withTranslation(["JavascriptSdk", "Files", "EmbeddingPanel", "Common"])(
observer(PortalIntegration)
)
);

View File

@ -12,7 +12,7 @@ import UploadXML from "./sub-components/UploadXML";
import { bindingOptions, nameIdOptions } from "./sub-components/constants";
const IdpSettings = (props) => {
const { t } = useTranslation("SingleSignOn");
const { t } = useTranslation(["SingleSignOn", "Settings"]);
const {
ssoBinding,
enableSso,
@ -40,7 +40,7 @@ const IdpSettings = (props) => {
<SsoFormField
labelText={t("CustomEntryButton")}
name="spLoginLabel"
placeholder="Single Sign-on"
placeholder={t("Settings:SingleSignOn")}
tabIndex={4}
tooltipContent={t("CustomEntryTooltip")}
value={spLoginLabel}

View File

@ -142,7 +142,7 @@ const StyledSsoPage = styled.div`
width: 350px;
}
p > div {
.label > div {
display: inline-flex;
margin-left: 4px;
}

View File

@ -1,456 +0,0 @@
import React, { useState, useEffect } from "react";
import { withTranslation } from "react-i18next";
import styled from "styled-components";
import Box from "@docspace/components/box";
import TextInput from "@docspace/components/text-input";
import Textarea from "@docspace/components/textarea";
import Label from "@docspace/components/label";
import Checkbox from "@docspace/components/checkbox";
import Button from "@docspace/components/button";
import ComboBox from "@docspace/components/combobox";
import Heading from "@docspace/components/heading";
import toastr from "@docspace/components/toast/toastr";
import { tablet } from "@docspace/components/utils/device";
import { objectToGetParams, loadScript } from "@docspace/common/utils";
import { inject, observer } from "mobx-react";
const Controls = styled(Box)`
width: 500px;
display: flex;
flex-direction: column;
gap: 16px;
@media ${tablet} {
width: 100%;
}
.label {
min-width: fit-content;
}
`;
const ControlsGroup = styled(Box)`
display: flex;
flex-direction: column;
gap: 8px;
`;
const Frame = styled(Box)`
margin-top: 16px;
> div {
border: 1px dashed gray;
border-radius: 3px;
min-width: 100%;
min-height: 400px;
}
`;
const Buttons = styled(Box)`
margin-top: 16px;
button {
margin-right: 16px;
}
`;
const Container = styled(Box)`
width: 100%;
display: flex;
gap: 16px;
`;
const Preview = styled(Box)`
width: 50%;
flex-direction: row;
.frameStyle {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}
`;
const PortalIntegration = (props) => {
const { t, setDocumentTitle } = props;
setDocumentTitle(`Portal integration`);
const scriptUrl = `${window.location.origin}/static/scripts/api.js`;
const dataSortBy = [
{ key: "DateAndTime", label: "Last modified date", default: true },
{ key: "AZ", label: "Title" },
{ key: "Type", label: "Type" },
{ key: "Size", label: "Size" },
{ key: "DateAndTimeCreation", label: "Creation date" },
{ key: "Author", label: "Author" },
];
const dataFilterType = [
{ key: 0, label: "None", default: true },
{ key: 1, label: "Files" },
{ key: 2, label: "Folders" },
{ key: 3, label: "Documents" },
{ key: 4, label: "Presentations" },
{ key: 5, label: "Spreadsheets" },
{ key: 7, label: "Images" },
{ key: 8, label: "By user" },
{ key: 9, label: "By department" },
{ key: 10, label: "Archive" },
{ key: 11, label: "By Extension" },
{ key: 12, label: "Media" },
];
const dataSortOrder = [
{ key: "descending", label: "Descending", default: true },
{ key: "ascending", label: "Ascending" },
];
const dataDisplayType = [
{ key: "row", label: "Row", default: true },
{ key: "table", label: "Table" },
{ key: "tile", label: "Tile" },
];
const [config, setConfig] = useState({
width: "100%",
height: "400px",
frameId: "ds-frame",
showHeader: false,
showTitle: true,
showArticle: false,
showFilter: false,
});
const [sortBy, setSortBy] = useState(dataSortBy[0]);
const [sortOrder, setSortOrder] = useState(dataSortOrder[0]);
const [filterType, setFilterType] = useState(dataFilterType[0]);
const [displayType, setDisplayType] = useState(dataDisplayType[0]);
const [withSubfolders, setWithSubfolders] = useState(false);
const params = objectToGetParams(config);
const frameId = config.frameId || "ds-frame";
const destroyFrame = () => {
DocSpace.destroyFrame();
};
const loadFrame = () => {
const script = document.getElementById("integration");
if (script) {
destroyFrame();
script.remove();
}
const params = objectToGetParams(config);
loadScript(`${scriptUrl}${params}`, "integration");
};
const onChangeWidth = (e) => {
setConfig((config) => {
return { ...config, width: e.target.value };
});
};
const onChangeHeight = (e) => {
setConfig((config) => {
return { ...config, height: e.target.value };
});
};
const onChangeFolderId = (e) => {
setConfig((config) => {
return { ...config, folder: e.target.value };
});
};
const onChangeFrameId = (e) => {
setConfig((config) => {
return { ...config, frameId: e.target.value };
});
};
const onChangeWithSubfolders = (e) => {
setConfig((config) => {
return { ...config, withSubfolders: !withSubfolders };
});
setWithSubfolders(!withSubfolders);
};
const onChangeSortBy = (item) => {
setConfig((config) => {
return { ...config, sortby: item.key };
});
setSortBy(item);
};
const onChangeSortOrder = (item) => {
setConfig((config) => {
return { ...config, sortorder: item.key };
});
setSortOrder(item);
};
const onChangeFilterType = (item) => {
setConfig((config) => {
return { ...config, filterType: item.key };
});
setFilterType(item);
};
const onChangeDisplayType = (item) => {
setConfig((config) => {
return { ...config, viewAs: item.key };
});
setDisplayType(item);
};
const onChangeShowHeader = (e) => {
setConfig((config) => {
return { ...config, showHeader: !config.showHeader };
});
};
const onChangeShowTitle = () => {
setConfig((config) => {
return { ...config, showTitle: !config.showTitle };
});
};
const onChangeShowArticle = (e) => {
setConfig((config) => {
return { ...config, showArticle: !config.showArticle };
});
};
const onChangeShowFilter = (e) => {
setConfig((config) => {
return { ...config, showFilter: !config.showFilter };
});
};
const onChangeCount = (e) => {
setConfig((config) => {
return { ...config, count: e.target.value };
});
};
const onChangePage = (e) => {
setConfig((config) => {
return { ...config, page: e.target.value };
});
};
const onChangeSearch = (e) => {
setConfig((config) => {
return { ...config, search: e.target.value };
});
};
const onChangeAuthor = (e) => {
setConfig((config) => {
return { ...config, authorType: e.target.value };
});
};
const codeBlock = `<div id="${frameId}">Fallback text</div>\n<script src="${scriptUrl}${params}"></script>`;
return (
<Container>
<Controls>
<Heading level={1} size="small">
Frame options
</Heading>
<ControlsGroup>
<Label className="label" text="Frame id" />
<TextInput
scale={true}
onChange={onChangeFrameId}
placeholder="Frame id"
value={config.frameId}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Frame width" />
<TextInput
scale={true}
onChange={onChangeWidth}
placeholder="Frame width"
value={config.width}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Frame height" />
<TextInput
scale={true}
onChange={onChangeHeight}
placeholder="Frame height"
value={config.height}
/>
</ControlsGroup>
{/* <ControlsGroup>
<Label className="label" text="Display mode: " />
<ComboBox
scale={true}
onSelect={onChangeDisplayType}
options={dataDisplayType}
scaled={true}
selectedOption={displayType}
displaySelectedOption
/>
</ControlsGroup> */}
<Checkbox
label="Show header"
onChange={onChangeShowHeader}
isChecked={config.showHeader}
/>
<Checkbox
label="Show title"
onChange={onChangeShowTitle}
isChecked={config.showTitle}
/>
<Checkbox
label="Show article"
onChange={onChangeShowArticle}
isChecked={config.showArticle}
/>
<Checkbox
label="Show filter"
onChange={onChangeShowFilter}
isChecked={config.showFilter}
/>
<Heading level={1} size="small">
Filter options
</Heading>
<ControlsGroup>
<Label className="label" text="Folder id" />
<TextInput
scale={true}
onChange={onChangeFolderId}
placeholder="Folder id"
value={config.folder}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Items count" />
<TextInput
scale={true}
onChange={onChangeCount}
placeholder="Items count"
value={config.count}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Page" />
<TextInput
scale={true}
onChange={onChangePage}
placeholder="Page"
value={config.page}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Search term" />
<Box style={{ flexDirection: "row", display: "flex", gap: "16px" }}>
<TextInput
scale={true}
onChange={onChangeSearch}
placeholder="Search term"
value={config.search}
/>
<Checkbox
label="With subfolders"
onChange={onChangeWithSubfolders}
isChecked={withSubfolders}
/>
</Box>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Author" />
<TextInput
scale={true}
onChange={onChangeAuthor}
placeholder="Author"
value={config.authorType}
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Filter type:" />
<ComboBox
onSelect={onChangeFilterType}
options={dataFilterType}
scaled={true}
selectedOption={filterType}
displaySelectedOption
directionY="top"
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Sort by:" />
<ComboBox
onSelect={onChangeSortBy}
options={dataSortBy}
scaled={true}
selectedOption={sortBy}
displaySelectedOption
directionY="top"
/>
</ControlsGroup>
<ControlsGroup>
<Label className="label" text="Sort order:" />
<ComboBox
onSelect={onChangeSortOrder}
options={dataSortOrder}
scaled={true}
selectedOption={sortOrder}
displaySelectedOption
directionY="top"
/>
</ControlsGroup>
</Controls>
<Preview>
<Frame>
<Box id={frameId} className="frameStyle">
Frame content
</Box>
</Frame>
<Buttons>
<Button primary size="normal" label={t("Common:Preview")} onClick={loadFrame} />
<Button
primary
size="normal"
label="Destroy"
onClick={destroyFrame}
/>
</Buttons>
<Heading level={1} size="xsmall">
Paste this code block on page:
</Heading>
<Textarea value={codeBlock} />
</Preview>
</Container>
);
};
export default inject(({ setup, auth }) => {
const { settingsStore, setDocumentTitle } = auth;
const { theme } = settingsStore;
return {
theme,
setDocumentTitle,
};
})(withTranslation(["Settings", "Common"])(observer(PortalIntegration)));

View File

@ -83,6 +83,7 @@ const PersonalSettings = ({
[setIsLoadingRecent, setRecentSetting]
);
const thumbnailsSizeLabel = "Thumbnails 1280x720";
return (
<StyledSettings
showTitle={showTitle}
@ -96,7 +97,7 @@ const PersonalSettings = ({
)}
<ToggleButton
className="toggle-btn"
label={"Thumbnails 1280x720"}
label={thumbnailsSizeLabel}
onChange={onChangeThumbnailsSize}
isChecked={thumbnails1280x720}
style={{ display: "none" }}

View File

@ -128,7 +128,7 @@ class SectionBodyContent extends React.Component {
</div>
) : (
<div className="loader-history-rows">
<Loaders.HistoryRows title="version-history-body-loader" />
<Loaders.HistoryRows />
</div>
)}
</StyledBody>

View File

@ -29,7 +29,7 @@ class PureVersionHistory extends React.Component {
onClickBack={this.redirectToHomepage}
/>
) : (
<Loaders.SectionHeader title="version-history-title-loader" />
<Loaders.SectionHeader />
)}
</Section.SectionHeader>

View File

@ -1,5 +1,6 @@
import styled, { css } from "styled-components";
import Base from "../themes/base";
import { isMobileOnly } from "react-device-detect";
const StyledDropdown = styled.div`
@media (orientation: landscape) {
@ -58,6 +59,14 @@ const StyledDropdown = styled.div`
box-shadow: ${(props) => props.theme.dropDown.boxShadow};
-moz-box-shadow: ${(props) => props.theme.dropDown.boxShadow};
-webkit-box-shadow: ${(props) => props.theme.dropDown.boxShadow};
${(props) =>
(props.isMobileView || isMobileOnly) &&
css`
box-shadow: ${(props) => props.theme.dropDown.boxShadowMobile};
-moz-box-shadow: ${(props) => props.theme.dropDown.boxShadowMobile};
-webkit-box-shadow: ${(props) => props.theme.dropDown.boxShadowMobile};
`}
padding: ${(props) => !props.maxHeight && props.itemCount > 1 && `4px 0px`};
${(props) =>
props.columnCount &&

View File

@ -162,7 +162,7 @@ class GroupButton extends React.Component {
{label}
</StyledDropdownToggle>
)}
{isSeparator && <Separator title="" />}
{isSeparator && <Separator />}
</StyledGroupButton>
);
}

View File

@ -84,7 +84,9 @@ const Caret = styled.div`
`}
`;
const Separator = styled.div`
const Separator = styled.div.attrs(() => ({
title: "",
}))`
vertical-align: middle;
border: ${(props) => props.theme.groupButton.separator.border};
width: ${(props) => props.theme.groupButton.separator.width};

View File

@ -14,6 +14,8 @@ import DropDown from "@docspace/components/drop-down";
import DropDownItem from "@docspace/components/drop-down-item";
import Text from "@docspace/components/text";
const PLUS = "+";
const InputPhone = ({
defaultCountry,
onChange,
@ -138,7 +140,7 @@ const InputPhone = ({
fillIcon={true}
selectedOption={country}
/>
<Label text="+" className="prefix" />
<Label text={PLUS} className="prefix" />
<TextInput
type="tel"
className="input-phone"

View File

@ -116,6 +116,7 @@ RadioButton.propTypes = {
RadioButton.defaultProps = {
isChecked: false,
isDisabled: false,
label: "",
};
export default RadioButton;

View File

@ -1376,6 +1376,7 @@ const Dark = {
borderRadius: "6px",
boxShadow:
"0px 16px 16px rgba(0, 0, 0, 0.16), 0px 8.1px 6.975px rgba(0, 0, 0, 0.108), 0px 3.2px 2.6px rgba(0, 0, 0, 0.08), 0px 0.7px 0.925px rgba(0, 0, 0, 0.052)",
boxShadowMobile: "0px -4px 60px rgba(0, 0, 0, 0.25)",
border: "1px solid #474747",
},

View File

@ -24,8 +24,6 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using System.Threading.Channels;
namespace ASC.Files.Service;
public class Startup : BaseWorkerStartup
{
@ -66,12 +64,12 @@ public class Startup : BaseWorkerStartup
DIHelper.TryAdd<FeedAggregatorService>();
services.AddHostedService<FeedCleanerService>();
DIHelper.TryAdd<FeedCleanerService>();
services.AddActivePassiveHostedService<FileConverterService<int>>();
DIHelper.TryAdd<FeedCleanerService>();
services.AddActivePassiveHostedService<FileConverterService<int>>(DIHelper);
DIHelper.TryAdd<FileConverterService<int>>();
services.AddActivePassiveHostedService<FileConverterService<string>>();
services.AddActivePassiveHostedService<FileConverterService<string>>(DIHelper);
DIHelper.TryAdd<FileConverterService<string>>();
services.AddHostedService<ThumbnailBuilderService>();

View File

@ -103,7 +103,7 @@ public class PhotoController : PeopleControllerBase
await _userManager.UpdateUserInfoWithSyncCardDavAsync(user);
_messageService.Send(MessageAction.UserUpdatedAvatarThumbnails, _messageTarget.Create(user.Id), user.DisplayUserName(false, _displayUserSettingsHelper));
return await ThumbnailsDataDto.Create(user.Id, _userPhotoManager);
return await ThumbnailsDataDto.Create(user, _userPhotoManager);
}
[HttpDelete("{userid}/photo")]
@ -122,7 +122,7 @@ public class PhotoController : PeopleControllerBase
await _userManager.UpdateUserInfoWithSyncCardDavAsync(user);
_messageService.Send(MessageAction.UserDeletedAvatar, _messageTarget.Create(user.Id), user.DisplayUserName(false, _displayUserSettingsHelper));
return await ThumbnailsDataDto.Create(user.Id, _userPhotoManager);
return await ThumbnailsDataDto.Create(user, _userPhotoManager);
}
[HttpGet("{userid}/photo")]
@ -135,7 +135,7 @@ public class PhotoController : PeopleControllerBase
throw new SecurityException();
}
return await ThumbnailsDataDto.Create(user.Id, _userPhotoManager);
return await ThumbnailsDataDto.Create(user, _userPhotoManager);
}
[HttpPut("{userid}/photo")]
@ -156,7 +156,7 @@ public class PhotoController : PeopleControllerBase
await _userManager.UpdateUserInfoWithSyncCardDavAsync(user);
_messageService.Send(MessageAction.UserAddedAvatar, _messageTarget.Create(user.Id), user.DisplayUserName(false, _displayUserSettingsHelper));
return await ThumbnailsDataDto.Create(user.Id, _userPhotoManager);
return await ThumbnailsDataDto.Create(user, _userPhotoManager);
}
[HttpPost("{userid}/photo")]
@ -207,17 +207,19 @@ public class PhotoController : PeopleControllerBase
throw new ImageSizeLimitException();
}
var mainPhoto = _userPhotoManager.SaveOrUpdatePhoto(userId, data);
var mainPhoto = _userPhotoManager.SaveOrUpdatePhoto(userId, data);
var userInfo = _userManager.GetUsers(userId);
var cacheKey = Math.Abs(userInfo.LastModified.GetHashCode());
result.Data =
new
{
main = mainPhoto,
retina = _userPhotoManager.GetRetinaPhotoURL(userId),
max = _userPhotoManager.GetMaxPhotoURL(userId),
big = _userPhotoManager.GetBigPhotoURL(userId),
medium = _userPhotoManager.GetMediumPhotoURL(userId),
small = _userPhotoManager.GetSmallPhotoURL(userId),
main = mainPhoto + $"?hash={cacheKey}",
retina = _userPhotoManager.GetRetinaPhotoURL(userId) + $"?hash={cacheKey}",
max = _userPhotoManager.GetMaxPhotoURL(userId) + $"?hash={cacheKey}",
big = _userPhotoManager.GetBigPhotoURL(userId) + $"?hash={cacheKey}",
medium = _userPhotoManager.GetMediumPhotoURL(userId) + $"?hash={cacheKey}",
small = _userPhotoManager.GetSmallPhotoURL(userId) + $"?hash={cacheKey}"
};
}
else

View File

@ -30,16 +30,18 @@ public class ThumbnailsDataDto
{
private ThumbnailsDataDto() { }
public static async Task<ThumbnailsDataDto> Create(Guid userId, UserPhotoManager userPhotoManager)
public static async Task<ThumbnailsDataDto> Create(UserInfo userInfo, UserPhotoManager userPhotoManager)
{
var cacheKey = Math.Abs(userInfo.LastModified.GetHashCode());
return new ThumbnailsDataDto
{
Original = await userPhotoManager.GetPhotoAbsoluteWebPath(userId),
Retina = await userPhotoManager.GetRetinaPhotoURL(userId),
Max = await userPhotoManager.GetMaxPhotoURL(userId),
Big = await userPhotoManager.GetBigPhotoURL(userId),
Medium = await userPhotoManager.GetMediumPhotoURL(userId),
Small = await userPhotoManager.GetSmallPhotoURL(userId)
Original = await userPhotoManager.GetPhotoAbsoluteWebPath(userInfo.Id) + $"?hash={cacheKey}",
Retina = await userPhotoManager.GetRetinaPhotoURL(userInfo.Id) + $"?hash={cacheKey}",
Max = await userPhotoManager.GetMaxPhotoURL(userInfo.Id) + $"?hash={cacheKey}",
Big = await userPhotoManager.GetBigPhotoURL(userInfo.Id) + $"?hash={cacheKey}",
Medium = await userPhotoManager.GetMediumPhotoURL(userInfo.Id) + $"?hash={cacheKey}",
Small = await userPhotoManager.GetSmallPhotoURL(userInfo.Id) + $"?hash={cacheKey}"
};
}

Some files were not shown because too many files have changed in this diff Show More