Merge branch 'release/v1.1.0' into feature/sdk

This commit is contained in:
Ilya Oleshko 2023-06-13 09:28:20 +03:00
commit 6dafe52577
42 changed files with 1300 additions and 124 deletions

View File

@ -24,6 +24,7 @@ x-service: &x-service-base
APP_KNOWN_PROXIES: ${APP_KNOWN_PROXIES}
APP_CORE_BASE_DOMAIN: ${APP_CORE_BASE_DOMAIN}
APP_CORE_MACHINEKEY: ${APP_CORE_MACHINEKEY}
INSTALLATION_TYPE: ${INSTALLATION_TYPE}
DOCUMENT_SERVER_JWT_SECRET: ${DOCUMENT_SERVER_JWT_SECRET}
DOCUMENT_SERVER_JWT_HEADER: ${DOCUMENT_SERVER_JWT_HEADER}
DOCUMENT_SERVER_URL_PUBLIC: ${DOCUMENT_SERVER_URL_PUBLIC}

View File

@ -206,8 +206,8 @@ public class LicenseReader
AutoBackupRestore = true,
Oauth = true,
ContentSearch = true,
MaxTotalSize = TenantQuota.Default.MaxTotalSize,
MaxFileSize = TenantQuota.Default.MaxFileSize,
MaxTotalSize = long.MaxValue,
MaxFileSize = 100L * 1024 * 1024 * 1024,
DocsEdition = true,
Customization = license.Customization
};

View File

@ -239,9 +239,9 @@ public class TenantQuota : IMapFrom<DbQuota>
_customizationFeature = new TenantQuotaFeatureFlag(this) { Name = "customization", Visible = false };
_customFeature = new TenantQuotaFeatureFlag(this) { Name = "custom", Visible = false };
_autoBackupRestoreFeature = new TenantQuotaFeatureFlag(this) { Name = "restore", Order = 6 };
_oauthFeature = new TenantQuotaFeatureFlag(this) { Name = "oauth", Visible = false };
_oauthFeature = new TenantQuotaFeatureFlag(this) { Name = "oauth" };
_contentSearchFeature = new TenantQuotaFeatureFlag(this) { Name = "contentsearch", Visible = false };
_thirdPartyFeature = new TenantQuotaFeatureFlag(this) { Name = "thirdparty" };
_thirdPartyFeature = new TenantQuotaFeatureFlag(this) { Name = "thirdparty", Order = 9 };
TenantQuotaFeatures = new List<TenantQuotaFeature>
{

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ButtonSetPassword" xml:space="preserve">
<value>Establecer contraseña</value>
</data>
<data name="BackupNotFound" xml:space="preserve">
<value>El archivo de copia de seguridad no es válido. Por favor, utilice un archivo creado en ONLYOFFICE v11.5 o superior.</value>
</data>
</root>

View File

@ -120,4 +120,7 @@
<data name="ButtonSetPassword" xml:space="preserve">
<value>Установка пароля</value>
</data>
<data name="BackupNotFound" xml:space="preserve">
<value>Файл резервной копии недействителен. Пожалуйста, используйте файл, созданный в ONLYOFFICE v11.5 или в более поздней версии.</value>
</data>
</root>

View File

@ -30,6 +30,7 @@ public abstract class BaseStorage : IDataStore
{
public IQuotaController QuotaController { get; set; }
public virtual bool IsSupportInternalUri => true;
public virtual bool IsSupportCdnUri => false;
public virtual bool IsSupportedPreSignedUri => true;
public virtual bool IsSupportChunking => false;
internal string Modulename { get; set; }
@ -154,6 +155,11 @@ public abstract class BaseStorage : IDataStore
return null;
}
public virtual Task<Uri> GetCdnPreSignedUriAsync(string domain, string path, TimeSpan expire, IEnumerable<string> headers)
{
return null;
}
public abstract Task<Stream> GetReadStreamAsync(string domain, string path);
public abstract Task<Stream> GetReadStreamAsync(string domain, string path, long offset);

View File

@ -63,12 +63,20 @@ public interface IDataStore
/// <param name="headers"></param>
/// <returns></returns>
Task<Uri> GetPreSignedUriAsync(string domain, string path, TimeSpan expire, IEnumerable<string> headers);
///<summary>
/// Supporting generate uri to the file
///</summary>
///<returns></returns>
bool IsSupportInternalUri { get; }
///<summary>
/// Supporting generate uri to the file
///</summary>
///<returns></returns>
bool IsSupportCdnUri { get; }
/// <summary>
/// Get absolute Uri for html links
/// </summary>
@ -79,6 +87,16 @@ public interface IDataStore
/// <returns></returns>
Task<Uri> GetInternalUriAsync(string domain, string path, TimeSpan expire, IEnumerable<string> headers);
/// <summary>
/// Get absolute Uri via CDN for html links
/// </summary>
/// <param name="domain"></param>
/// <param name="path"></param>
/// <param name="expire"></param>
/// <param name="headers"></param>
/// <returns></returns>
Task<Uri> GetCdnPreSignedUriAsync(string domain, string path, TimeSpan expire, IEnumerable<string> headers);
///<summary>
/// A stream of read-only. In the case of the C3 stream NetworkStream general, and with him we have to work
/// Very carefully as a Jedi cutter groin lightsaber.

View File

@ -33,6 +33,7 @@ namespace ASC.Data.Storage.S3;
[Scope]
public class S3Storage : BaseStorage
{
public override bool IsSupportCdnUri => true;
public override bool IsSupportChunking => true;
private readonly List<string> _domains = new List<string>();
@ -50,8 +51,10 @@ public class S3Storage : BaseStorage
private readonly ServerSideEncryptionMethod _sse = ServerSideEncryptionMethod.AES256;
private bool _useHttp = true;
private bool _lowerCasing = true;
private bool _revalidateCloudFront;
private string _distributionId = "";
private bool _cdnEnabled;
private string _cdnKeyPairId;
private string _cdnPrivateKeyPath;
private string _cdnDistributionDomain;
private string _subDir = "";
private EncryptionMethod _encryptionMethod = EncryptionMethod.None;
@ -145,9 +148,80 @@ public class S3Storage : BaseStorage
}
using var client = GetClient();
return Task.FromResult(MakeUri(client.GetPreSignedURL(pUrlRequest)));
}
public override Task<Uri> GetCdnPreSignedUriAsync(string domain, string path, TimeSpan expire, IEnumerable<string> headers)
{
if (!_cdnEnabled) return GetInternalUriAsync(domain, path, expire, headers);
var proto = SecureHelper.IsSecure(_httpContextAccessor?.HttpContext, _options) ? "https" : "http";
var baseUrl = $"{proto}://{_cdnDistributionDomain}/{MakePath(domain, path)}";
var uriBuilder = new UriBuilder(baseUrl)
{
Port = -1
};
var queryParams = HttpUtility.ParseQueryString(uriBuilder.Query);
if (headers != null && headers.Any())
{
foreach (var h in headers)
{
if (h.StartsWith("Content-Disposition"))
{
queryParams["response-content-disposition"] = h.Substring("Content-Disposition".Length + 1);
}
else if (h.StartsWith("Cache-Control"))
{
queryParams["response-cache-control"] = h.Substring("Cache-Control".Length + 1);
}
else if (h.StartsWith("Content-Encoding"))
{
queryParams["response-content-encoding"] = h.Substring("Content-Encoding".Length + 1);
}
else if (h.StartsWith("Content-Language"))
{
queryParams["response-content-language"] = h.Substring("Content-Language".Length + 1);
}
else if (h.StartsWith("Content-Type"))
{
queryParams["response-content-type"] = h.Substring("Content-Type".Length + 1);
}
else if (h.StartsWith("Expires"))
{
queryParams["response-expires"] = h.Substring("Expires".Length + 1);
}
else if (h.StartsWith("Custom-Cache-Key"))
{
queryParams["custom-cache-key"] = h.Substring("Custom-Cache-Key".Length + 1);
}
else
{
throw new FormatException(string.Format("Invalid header: {0}", h));
}
}
}
uriBuilder.Query = queryParams.ToString();
var signedUrl = "";
using (TextReader textReader = File.OpenText(_cdnPrivateKeyPath))
{
signedUrl = AmazonCloudFrontUrlSigner.GetCannedSignedURL(
uriBuilder.ToString(),
textReader,
_cdnKeyPairId,
DateTime.UtcNow.Add(expire));
}
return Task.FromResult(new Uri(signedUrl));
}
public override Task<Stream> GetReadStreamAsync(string domain, string path)
{
return GetReadStreamAsync(domain, path, 0);
@ -217,12 +291,7 @@ public class S3Storage : BaseStorage
ContentType = mime,
ServerSideEncryptionMethod = _sse,
InputStream = buffered,
AutoCloseStream = false,
Headers =
{
CacheControl = string.Format("public, maxage={0}", (int)TimeSpan.FromDays(cacheDays).TotalSeconds),
ExpiresUtc = DateTime.UtcNow.Add(TimeSpan.FromDays(cacheDays))
}
AutoCloseStream = false
};
if (!(client is IAmazonS3Encryption))
@ -259,7 +328,7 @@ public class S3Storage : BaseStorage
await uploader.UploadAsync(request);
await InvalidateCloudFrontAsync(MakePath(domain, path));
//await InvalidateCloudFrontAsync(MakePath(domain, path));
await QuotaUsedAdd(domain, buffered.Length);
@ -348,7 +417,7 @@ public class S3Storage : BaseStorage
using (var s3 = GetClient())
{
await s3.CompleteMultipartUploadAsync(request);
await InvalidateCloudFrontAsync(MakePath(domain, path));
// await InvalidateCloudFrontAsync(MakePath(domain, path));
}
if (QuotaController != null)
@ -969,12 +1038,17 @@ public class S3Storage : BaseStorage
{
bool.TryParse(lower, out _lowerCasing);
}
if (props.TryGetValue("cloudfront", out var front))
if (props.TryGetValue("cdn_enabled", out var cdnEnabled))
{
bool.TryParse(front, out _revalidateCloudFront);
if (bool.TryParse(cdnEnabled, out _cdnEnabled))
{
_cdnKeyPairId = props["cdn_keyPairId"];
_cdnPrivateKeyPath = props["cdn_privateKeyPath"];
_cdnDistributionDomain = props["cdn_distributionDomain"];
}
}
props.TryGetValue("distribution", out _distributionId);
props.TryGetValue("subdir", out _subDir);
return this;
@ -1029,7 +1103,7 @@ public class S3Storage : BaseStorage
private Task InvalidateCloudFrontAsync(params string[] paths)
{
if (!_revalidateCloudFront || string.IsNullOrEmpty(_distributionId))
if (!_cdnEnabled || string.IsNullOrEmpty(_cdnDistributionDomain))
{
return Task.CompletedTask;
}
@ -1042,7 +1116,7 @@ public class S3Storage : BaseStorage
using var cfClient = GetCloudFrontClient();
var invalidationRequest = new CreateInvalidationRequest
{
DistributionId = _distributionId,
DistributionId = _cdnDistributionDomain,
InvalidationBatch = new InvalidationBatch
{
CallerReference = Guid.NewGuid().ToString(),

View File

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="DumpParse" xml:space="preserve">
<value>Análisis de la base de datos</value>
</data>
<data name="GoogleModuleNameContacts" xml:space="preserve">
<value>Contactos de correo</value>
</data>
<data name="OnlyofficeModuleNameCalendar" xml:space="preserve">
<value>Calendario</value>
</data>
<data name="ModuleNameCalendar" xml:space="preserve">
<value>Calendario</value>
</data>
<data name="NextcloudModuleNameContacts" xml:space="preserve">
<value>Contactos</value>
</data>
<data name="OnlyofficeModuleNameMail" xml:space="preserve">
<value>Correo</value>
</data>
<data name="ModuleNameMail" xml:space="preserve">
<value>Correo</value>
</data>
<data name="MigrationCanceled" xml:space="preserve">
<value>La migración se ha cancelado</value>
</data>
<data name="GroupMigration" xml:space="preserve">
<value>Migración de grupo {0} ({1}/{2})</value>
</data>
<data name="UserMigration" xml:space="preserve">
<value>Migración de usuarios {0} ({1}/{2})</value>
</data>
<data name="MigratingUserContacts" xml:space="preserve">
<value>Migrando contactos de usuario {0} ({1}/{2})</value>
</data>
<data name="MigratingUserFiles" xml:space="preserve">
<value>Migrando archivos de usuario {0} ({1}/{2})</value>
</data>
<data name="UserCalendarMigration" xml:space="preserve">
<value>Migración del calendario de usuario {0} ({1}/{2})</value>
</data>
<data name="MigrationCompleted" xml:space="preserve">
<value>La migración se ha completado</value>
</data>
<data name="OnlyofficeModuleNamePeople" xml:space="preserve">
<value>Personas</value>
</data>
<data name="PreparingForMigration" xml:space="preserve">
<value>Preparando la migración</value>
</data>
<data name="DataProcessingCompleted" xml:space="preserve">
<value>El procesamiento de datos se ha completado</value>
</data>
<data name="DataProcessing" xml:space="preserve">
<value>Procesamiento de datos...</value>
</data>
<data name="ModuleNameUsers" xml:space="preserve">
<value>Usuarios</value>
</data>
<data name="StartOfDataProcessing" xml:space="preserve">
<value>Iniciando el procesamiento de datos...</value>
</data>
<data name="UnzippingFinished" xml:space="preserve">
<value>La descompresión se ha completado...</value>
</data>
<data name="Unzipping" xml:space="preserve">
<value>Descomprimiendo...</value>
</data>
<data name="OnlyofficeModuleNameDocuments" xml:space="preserve">
<value>Documentos</value>
</data>
<data name="UserSkipped" xml:space="preserve">
<value>Échec de l'importation de l'utilisateur : {0} ({1}/{2})</value>
</data>
<data name="ClearingTemporaryData" xml:space="preserve">
<value>Effacement des données temporaires</value>
</data>
<data name="GoogleModuleNameDocuments" xml:space="preserve">
<value>Fichiers de Google Drive</value>
</data>
<data name="NextcloudModuleNameDocuments" xml:space="preserve">
<value>Fichiers de lutilisateur</value>
</data>
<data name="ModuleNameGroups" xml:space="preserve">
<value>Groupes</value>
</data>
</root>

View File

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ClearingTemporaryData" xml:space="preserve">
<value>Effacement des données temporaires</value>
</data>
<data name="DataProcessing" xml:space="preserve">
<value>Traitement des données...</value>
</data>
<data name="DataProcessingCompleted" xml:space="preserve">
<value>Traitement des données terminé</value>
</data>
<data name="DumpParse" xml:space="preserve">
<value>Analyse de la base de données</value>
</data>
<data name="GoogleModuleNameContacts" xml:space="preserve">
<value>Contacts de Mail</value>
</data>
<data name="GoogleModuleNameDocuments" xml:space="preserve">
<value>Fichiers de Google Drive</value>
</data>
<data name="GroupMigration" xml:space="preserve">
<value>Migration de groupe {0} ({1}/{2})</value>
</data>
<data name="MigratingUserContacts" xml:space="preserve">
<value>Migration des contacts de l'utilisateur {0} ({1}/{2})</value>
</data>
<data name="MigratingUserFiles" xml:space="preserve">
<value>Migration des fichiers de l'utilisateur {0} ({1}/{2})</value>
</data>
<data name="MigrationCanceled" xml:space="preserve">
<value>Migration annulée</value>
</data>
<data name="MigrationCompleted" xml:space="preserve">
<value>Migration terminée</value>
</data>
<data name="ModuleNameCalendar" xml:space="preserve">
<value>Calendrier</value>
</data>
<data name="ModuleNameGroups" xml:space="preserve">
<value>Groupes</value>
</data>
<data name="ModuleNameMail" xml:space="preserve">
<value>Mail</value>
</data>
<data name="ModuleNameUsers" xml:space="preserve">
<value>Utilisateurs</value>
</data>
<data name="NextcloudModuleNameContacts" xml:space="preserve">
<value>Contacts</value>
</data>
<data name="NextcloudModuleNameDocuments" xml:space="preserve">
<value>Fichiers de lutilisateur</value>
</data>
<data name="OnlyofficeModuleNameCalendar" xml:space="preserve">
<value>Calendrier</value>
</data>
<data name="OnlyofficeModuleNameDocuments" xml:space="preserve">
<value>Documents</value>
</data>
<data name="OnlyofficeModuleNameMail" xml:space="preserve">
<value>Mail</value>
</data>
<data name="OnlyofficeModuleNamePeople" xml:space="preserve">
<value>Personnes</value>
</data>
<data name="PreparingForMigration" xml:space="preserve">
<value>Préparation de la migration</value>
</data>
<data name="StartOfDataProcessing" xml:space="preserve">
<value>Démarrage du traitement des données...</value>
</data>
<data name="Unzipping" xml:space="preserve">
<value>Dézippage...</value>
</data>
<data name="UnzippingFinished" xml:space="preserve">
<value>Dézippage terminé...</value>
</data>
<data name="UserCalendarMigration" xml:space="preserve">
<value>Migration du calendrier de l'utilisateur {0} ({1}/{2})</value>
</data>
<data name="UserMigration" xml:space="preserve">
<value>Migration de l'utilisateur {0} ({1}/{2})</value>
</data>
<data name="UserSkipped" xml:space="preserve">
<value>Échec de l'importation de l'utilisateur : {0} ({1}/{2})</value>
</data>
</root>

View File

@ -670,4 +670,52 @@
<data name="TrashEmptied" xml:space="preserve">
<value>Papelera vaciada</value>
</data>
<data name="RoomUpdateAccessForUser" xml:space="preserve">
<value>{0} appointed: {1} {0} designado: {1}</value>
</data>
<data name="AddedRoomTags" xml:space="preserve">
<value>Etiquetas añadidas: [{1}]</value>
</data>
<data name="DeletedRoomTags" xml:space="preserve">
<value>Etiquetas eliminadas: [{1}]</value>
</data>
<data name="TagsDeleted" xml:space="preserve">
<value>Etiquetas eliminadas: {0}</value>
</data>
<data name="TagCreated" xml:space="preserve">
<value>Etiqueta creada: {0}</value>
</data>
<data name="RoomLinkCreated" xml:space="preserve">
<value>Enlace creado. Rol: {1}</value>
</data>
<data name="RoomLinkUpdated" xml:space="preserve">
<value>Enlace actualizado. Rol: {1}</value>
</data>
<data name="RoomLinkDeleted" xml:space="preserve">
<value>El enlace se ha eliminado</value>
</data>
<data name="RoomLogoCreated" xml:space="preserve">
<value>El logotipo se ha creado</value>
</data>
<data name="RoomLogoDeleted" xml:space="preserve">
<value>El logotipo se ha eliminado</value>
</data>
<data name="RoomUnarchived" xml:space="preserve">
<value>La sala se ha desarchivado</value>
</data>
<data name="RoomRenamed" xml:space="preserve">
<value>Sala renombrada: {0}</value>
</data>
<data name="RoomArchived" xml:space="preserve">
<value>La sala se ha archivado</value>
</data>
<data name="RoomDeleted" xml:space="preserve">
<value>La sala se ha eliminado</value>
</data>
<data name="RoomCreateUser" xml:space="preserve">
<value>Usuario añadido: {0}. Rol: {1}</value>
</data>
<data name="RoomRemoveUser" xml:space="preserve">
<value>Usuario eliminado: {0}</value>
</data>
</root>

View File

@ -670,4 +670,52 @@
<data name="TrashEmptied" xml:space="preserve">
<value>Corbeille vidée</value>
</data>
<data name="AddedRoomTags" xml:space="preserve">
<value>Étiquettes ajoutées : [{1}]</value>
</data>
<data name="DeletedRoomTags" xml:space="preserve">
<value>Étiquettes supprimées : [{1}]</value>
</data>
<data name="RoomArchived" xml:space="preserve">
<value>Salle archivée</value>
</data>
<data name="RoomCreateUser" xml:space="preserve">
<value>Utilisateur ajouté : {0}. Rôle : {1}</value>
</data>
<data name="RoomDeleted" xml:space="preserve">
<value>Salle supprimée</value>
</data>
<data name="RoomLinkCreated" xml:space="preserve">
<value>Lien créé. Rôle : {1}</value>
</data>
<data name="RoomLinkDeleted" xml:space="preserve">
<value>Lien supprimé</value>
</data>
<data name="RoomLinkUpdated" xml:space="preserve">
<value>Lien mis à jour. Rôle : {1}</value>
</data>
<data name="RoomLogoCreated" xml:space="preserve">
<value>Logo créé</value>
</data>
<data name="RoomLogoDeleted" xml:space="preserve">
<value>Logo supprimé</value>
</data>
<data name="RoomRemoveUser" xml:space="preserve">
<value>Utilisateur supprimé : {0}</value>
</data>
<data name="RoomRenamed" xml:space="preserve">
<value>Salle renommée : {0}</value>
</data>
<data name="RoomUnarchived" xml:space="preserve">
<value>Salle non archivée</value>
</data>
<data name="RoomUpdateAccessForUser" xml:space="preserve">
<value>{0} nommé : {1}</value>
</data>
<data name="TagCreated" xml:space="preserve">
<value>Étiquette créée : {0}</value>
</data>
<data name="TagsDeleted" xml:space="preserve">
<value>Étiquettes supprimées : {0}</value>
</data>
</root>

View File

@ -67,7 +67,6 @@ const Wizard = (props) => {
hashSettings,
setPortalOwner,
setWizardComplete,
getPortalSettings,
isLicenseRequired,
setLicense,
licenseUpload,
@ -253,7 +252,6 @@ const Wizard = (props) => {
analytics
);
setWizardComplete();
getPortalSettings();
history.push(combineUrl(window.DocSpaceConfig?.proxy?.url, "/"));
} catch (error) {
console.error(error);
@ -488,7 +486,6 @@ export default inject(({ auth, wizard }) => {
timezone,
urlLicense,
hashSettings,
getPortalSettings,
setWizardComplete,
getPortalTimezones,
getPortalPasswordSettings,
@ -522,7 +519,6 @@ export default inject(({ auth, wizard }) => {
machineName,
isLicenseRequired,
licenseUpload,
getPortalSettings,
setWizardComplete,
getPortalPasswordSettings,
getPortalTimezones,

View File

@ -47,8 +47,10 @@ const Article = ({
...rest
}) => {
const [articleHeaderContent, setArticleHeaderContent] = React.useState(null);
const [articleMainButtonContent, setArticleMainButtonContent] =
React.useState(null);
const [
articleMainButtonContent,
setArticleMainButtonContent,
] = React.useState(null);
const [articleBodyContent, setArticleBodyContent] = React.useState(null);
const [correctTabletHeight, setCorrectTabletHeight] = React.useState(null);
@ -90,6 +92,8 @@ const Article = ({
}, [children]);
const sizeChangeHandler = React.useCallback(() => {
const showArticle = JSON.parse(localStorage.getItem("showArticle"));
if (isMobileOnly || isMobileUtils() || window.innerWidth === 375) {
setShowText(true);
setIsMobileArticle(true);
@ -98,8 +102,11 @@ const Article = ({
((isTabletUtils() && window.innerWidth !== 375) || isMobile) &&
!isMobileOnly
) {
setShowText(false);
setIsMobileArticle(true);
if (showArticle) return;
setShowText(false);
}
if (isDesktopUtils() && !isMobile) {
setShowText(true);

View File

@ -118,6 +118,7 @@ const StyledArticle = styled.article`
overflow-x: hidden !important;
padding: 0 20px !important;
margin-bottom: 0px !important;
@media ${tablet} {
padding: 0 8px !important;

View File

@ -3,6 +3,8 @@ import MacOSReactSvgUrl from "PUBLIC_DIR/images/macOS.react.svg?url";
import LinuxReactSvgUrl from "PUBLIC_DIR/images/linux.react.svg?url";
import AndroidReactSvgUrl from "PUBLIC_DIR/images/android.react.svg?url";
import IOSReactSvgUrl from "PUBLIC_DIR/images/iOS.react.svg?url";
import IOSHoverReactSvgUrl from "PUBLIC_DIR/images/iOSHover.react.svg?url";
import React from "react";
import styled, { css } from "styled-components";
import { useTranslation } from "react-i18next";
@ -65,7 +67,7 @@ const ArticleApps = React.memo(({ theme, showText }) => {
onClick={() => window.open(desktopLink)}
iconName={WindowsReactSvgUrl}
size="32"
isfill={true}
isFill={true}
hoverColor={theme.filesArticleBody.downloadAppList.winHoverColor}
title={t("Translations:MobileWin")}
/>
@ -73,7 +75,7 @@ const ArticleApps = React.memo(({ theme, showText }) => {
onClick={() => window.open(desktopLink)}
iconName={MacOSReactSvgUrl}
size="32"
isfill={true}
isFill={true}
hoverColor={theme.filesArticleBody.downloadAppList.macHoverColor}
title={t("Translations:MobileMac")}
/>
@ -81,7 +83,7 @@ const ArticleApps = React.memo(({ theme, showText }) => {
onClick={() => window.open(desktopLink)}
iconName={LinuxReactSvgUrl}
size="32"
isfill={true}
isFill={true}
hoverColor={theme.filesArticleBody.downloadAppList.linuxHoverColor}
title={t("Translations:MobileLinux")}
/>
@ -89,16 +91,16 @@ const ArticleApps = React.memo(({ theme, showText }) => {
onClick={() => window.open(androidLink)}
iconName={AndroidReactSvgUrl}
size="32"
isfill={true}
isFill={true}
hoverColor={theme.filesArticleBody.downloadAppList.androidHoverColor}
title={t("Translations:MobileAndroid")}
/>
<IconButton
onClick={() => window.open(iosLink)}
iconName={IOSReactSvgUrl}
iconHoverName={IOSHoverReactSvgUrl}
size="32"
isfill={true}
hoverColor={theme.filesArticleBody.downloadAppList.iosHoverColor}
isFill={false}
title={t("Translations:MobileIos")}
/>
</div>

View File

@ -35,19 +35,20 @@ const ArticleHeader = ({
: getLogoFromPath(whiteLabelLogoUrls[0].path.light);
if (isMobileOnly) return <></>;
return (
<StyledArticleHeader showText={showText} {...rest}>
{isTabletView && isBurgerLoading ? (
<Loaders.ArticleHeader height="28px" width="28px" />
const isLoadingComponent = isTabletView ? (
<Loaders.ArticleHeader height="28px" width={showText ? "100%" : "28px"} />
) : (
<Loaders.ArticleHeader height="28px" width="211px" />
);
const mainComponent = (
<>
{isTabletView && (
<StyledIconBox name="article-burger" showText={showText}>
<img src={burgerLogo} onClick={onLogoClick} />
</StyledIconBox>
)}
{!isTabletView && isBurgerLoading ? (
<Loaders.ArticleHeader height="28px" width="211px" />
) : (
<StyledHeading showText={showText} size="large">
{isTabletView ? (
<img className="logo-icon_svg" src={logo} onClick={onLogoClick} />
@ -57,7 +58,12 @@ const ArticleHeader = ({
</Link>
)}
</StyledHeading>
)}
</>
);
return (
<StyledArticleHeader showText={showText} {...rest}>
{isBurgerLoading ? isLoadingComponent : mainComponent}
</StyledArticleHeader>
);
};

View File

@ -12,7 +12,6 @@ const ArticleFolderLoader = ({
className,
style,
showText,
isVisitor,
...rest
}) => {
@ -25,27 +24,54 @@ const ArticleFolderLoader = ({
>
{isVisitor ? (
<>
<StyledBlock>
<StyledRectangleLoader {...rest} />
<StyledRectangleLoader {...rest} />
<StyledBlock showText={showText}>
<StyledRectangleLoader
{...rest}
className="article-folder-loader"
/>
<StyledRectangleLoader
{...rest}
className="article-folder-loader"
/>
</StyledBlock>
<StyledBlock>
<StyledRectangleLoader {...rest} />
<StyledBlock showText={showText}>
<StyledRectangleLoader
{...rest}
className="article-folder-loader"
/>
</StyledBlock>
</>
) : (
<>
<StyledBlock>
<StyledRectangleLoader {...rest} />
<StyledRectangleLoader {...rest} />
<StyledRectangleLoader {...rest} />
<StyledBlock showText={showText}>
<StyledRectangleLoader
{...rest}
className="article-folder-loader"
/>
<StyledRectangleLoader
{...rest}
className="article-folder-loader"
/>
<StyledRectangleLoader
{...rest}
className="article-folder-loader"
/>
</StyledBlock>
<StyledBlock>
<StyledRectangleLoader {...rest} />
<StyledRectangleLoader {...rest} />
<StyledRectangleLoader {...rest} />
<StyledBlock showText={showText}>
<StyledRectangleLoader
{...rest}
className="article-folder-loader"
/>
<StyledRectangleLoader
{...rest}
className="article-folder-loader"
/>
<StyledRectangleLoader
{...rest}
className="article-folder-loader"
/>
</StyledBlock>
</>
)}

View File

@ -51,6 +51,17 @@ const StyledBlock = styled.div`
@media ${tablet} {
margin-bottom: 24px;
}
.article-folder-loader {
@media ${tablet} {
${(props) => (props.showText ? "width: 200px" : "width: 20px")};
}
${isMobile &&
css`
${(props) => (props.showText ? "width: 200px" : "width: 20px")};
`}
}
`;
const StyledRectangleLoader = styled(RectangleLoader)`
@ -60,14 +71,12 @@ const StyledRectangleLoader = styled(RectangleLoader)`
@media ${tablet} {
height: 20px;
width: 20px;
padding: 0 0 24px;
}
${isMobile &&
css`
height: 20px;
width: 20px;
padding: 0 0 24px;
`}

View File

@ -1,9 +1,11 @@
import React from "react";
import PropTypes from "prop-types";
import { inject, observer } from "mobx-react";
import StyledContainer from "./StyledArticleHeader";
import RectangleLoader from "../RectangleLoader";
const ArticleHeaderLoader = ({ id, className, style, ...rest }) => {
const ArticleHeaderLoader = ({ id, className, style, showText, ...rest }) => {
const {
title,
width,
@ -17,7 +19,12 @@ const ArticleHeaderLoader = ({ id, className, style, ...rest }) => {
animate,
} = rest;
return (
<StyledContainer id={id} className={className} style={style}>
<StyledContainer
id={id}
className={className}
style={style}
showText={showText}
>
<RectangleLoader
title={title}
width={width}
@ -46,4 +53,8 @@ ArticleHeaderLoader.defaultProps = {
style: undefined,
};
export default ArticleHeaderLoader;
export default inject(({ auth }) => {
return {
showText: auth.settingsStore.showText,
};
})(observer(ArticleHeaderLoader));

View File

@ -5,12 +5,13 @@ const StyledContainer = styled.div`
max-width: 211px;
margin-left: 1px;
@media ${tablet} {
${isMobile} {
margin-left: 0;
}
${isMobile} {
margin-left: 0;
@media ${tablet} {
${(props) => (props.showText ? "margin-left: 10px" : "margin-left:0")};
}
`;

View File

@ -84,7 +84,7 @@ class SettingsStore {
isHeaderVisible = false;
isTabletView = false;
showText = false;
showText = JSON.parse(localStorage.getItem("showArticle")) ?? false;
articleOpen = false;
isMobileArticle = false;
@ -392,7 +392,7 @@ class SettingsStore {
this.pluginOptions = origSettings.plugins.allow;
}
if (origSettings.tenantAlias) {
if (origSettings?.tenantAlias) {
this.setTenantAlias(origSettings.tenantAlias);
}
};
@ -650,7 +650,11 @@ class SettingsStore {
};
toggleShowText = () => {
this.showText = !this.showText;
const reverseValue = !this.showText;
localStorage.setItem("showArticle", reverseValue);
this.showText = reverseValue;
};
setArticleOpen = (articleOpen) => {

View File

@ -76,13 +76,8 @@ class IconButton extends React.PureComponent {
onMouseDown && onMouseDown(e);
}
onMouseUp(e) {
const {
isDisabled,
iconHoverName,
iconName,
color,
onMouseUp,
} = this.props;
const { isDisabled, iconHoverName, iconName, color, onMouseUp } =
this.props;
if (isDisabled) return;
@ -162,6 +157,7 @@ class IconButton extends React.PureComponent {
id={id}
style={style}
color={this.state.currentIconColor}
isFill={isFill}
{...rest}
>
{/* {React.createElement(Icons["CalendarIcon"], {

View File

@ -1,4 +1,4 @@
import styled from "styled-components";
import styled, { css } from "styled-components";
import { Base } from "../themes";
const StyledOuter = styled.div`
@ -10,6 +10,10 @@ const StyledOuter = styled.div`
props.isDisabled || !props.isClickable ? "default" : "pointer"};
line-height: 0;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
${(props) =>
props.isFill &&
css`
svg {
&:not(:root) {
width: 100%;
@ -32,6 +36,7 @@ const StyledOuter = styled.div`
}
}
}
`}
`;
StyledOuter.defaultProps = { theme: Base };

View File

@ -2126,7 +2126,6 @@ const Base = {
macHoverColor: "#000",
linuxHoverColor: "#FFB800",
androidHoverColor: "#9BD71C",
iosHoverColor: "url(#iosGradient-1)",
},
thirdPartyList: {
color: "#818b91",

View File

@ -2121,7 +2121,6 @@ const Dark = {
macHoverColor: "#000",
linuxHoverColor: "#FFB800",
androidHoverColor: "#9BD71C",
iosHoverColor: "url(#iosGradient-1)",
},
thirdPartyList: {

View File

@ -48,11 +48,13 @@ internal class FileDao : AbstractDao, IFileDao<int>
private readonly IQuotaService _quotaService;
private readonly StorageFactory _storageFactory;
private readonly TenantQuotaController _tenantQuotaController;
private readonly FileUtility _fileUtility;
public FileDao(
ILogger<FileDao> logger,
FactoryIndexerFile factoryIndexer,
UserManager userManager,
FileUtility fileUtility,
IDbContextFactory<FilesDbContext> dbContextManager,
TenantManager tenantManager,
TenantUtil tenantUtil,
@ -108,6 +110,7 @@ internal class FileDao : AbstractDao, IFileDao<int>
_quotaService = quotaService;
_storageFactory = storageFactory;
_tenantQuotaController = tenantQuotaController;
_fileUtility = fileUtility;
}
public Task InvalidateCacheAsync(int fileId)
@ -377,6 +380,19 @@ internal class FileDao : AbstractDao, IFileDao<int>
public Task<Uri> GetPreSignedUriAsync(File<int> file, TimeSpan expires)
{
var storage = _globalStore.GetStore();
if (storage.IsSupportCdnUri && !_fileUtility.CanWebEdit(file.Title)
&& (_fileUtility.CanMediaView(file.Title) || _fileUtility.CanImageView(file.Title)))
{
return _globalStore.GetStore().GetCdnPreSignedUriAsync(string.Empty, GetUniqFilePath(file), expires,
new List<string>
{
$"Content-Disposition:{ContentDispositionUtil.GetHeaderValue(file.Title, withoutBase: true)}",
$"Custom-Cache-Key:{file.ModifiedOn.Ticks}"
});
}
return _globalStore.GetStore().GetPreSignedUriAsync(string.Empty, GetUniqFilePath(file), expires,
new List<string>
{

View File

@ -371,4 +371,49 @@
<data name="AceStatusEnum_RoomAdmin" xml:space="preserve">
<value>Administrador de la sala</value>
</data>
<data name="ErrorMessage_ProviderAlreadyConnect" xml:space="preserve">
<value>Este proveedor ya está conectado a la sala</value>
</data>
<data name="ErrorMessage_InvalidProvider" xml:space="preserve">
<value>Proveedor no válido</value>
</data>
<data name="ErrorMessage_InvalidThirdPartyFolder" xml:space="preserve">
<value>No es posible utilizar esta carpeta para almacenar la sala</value>
</data>
<data name="ErrorMassage_FileUpdateToVersion" xml:space="preserve">
<value>La nueva versión no puede ser la misma que la actual</value>
</data>
<data name="ErrorMessage_InvintationLink" xml:space="preserve">
<value>El enlace de invitación no es válido o su validez ha expirado</value>
</data>
<data name="ErrorMessage_RoleNotAvailable" xml:space="preserve">
<value>El rol no está disponible para este tipo de usuario</value>
</data>
<data name="ErrorMessage_SecurityException_EditRoom" xml:space="preserve">
<value>No tiene permisos para editar la sala</value>
</data>
<data name="ErrorMessage_SecurityException_ArchiveRoom" xml:space="preserve">
<value>No tiene permisos suficientes para archivar la sala</value>
</data>
<data name="ErrorMessage_SecurityException_CopyToFolder" xml:space="preserve">
<value>No tiene permisos para copiar algo a esta carpeta</value>
</data>
<data name="ErrorMassage_SecurityException_CopyFolder" xml:space="preserve">
<value>No tiene permisos suficientes para copiar la carpeta</value>
</data>
<data name="ErrorMassage_SecurityException_CopyFile" xml:space="preserve">
<value>No tiene permisos suficientes para copiar el archivo</value>
</data>
<data name="ErrorMessage_SecurityException_MoveToFolder" xml:space="preserve">
<value>No tiene permisos suficientes para copiar la carpeta</value>
</data>
<data name="ErrorMessage_SecurityException_UnarchiveRoom" xml:space="preserve">
<value>No tiene permisos suficientes para desarchivar la sala</value>
</data>
<data name="ErrorrMessage_PinRoom" xml:space="preserve">
<value>No puede anclar una sala</value>
</data>
<data name="ErrorMessage_UpdateArchivedRoom" xml:space="preserve">
<value>No puede editar salas archivadas</value>
</data>
</root>

View File

@ -370,4 +370,49 @@
<data name="AceStatusEnum_RoomAdmin" xml:space="preserve">
<value>Administrateur de la salle</value>
</data>
<data name="ErrorMassage_FileUpdateToVersion" xml:space="preserve">
<value>La nouvelle version ne peut pas être identique à la version actuelle</value>
</data>
<data name="ErrorMassage_SecurityException_CopyFile" xml:space="preserve">
<value>Vous n'avez pas l'autorisation de copier le fichier</value>
</data>
<data name="ErrorMassage_SecurityException_CopyFolder" xml:space="preserve">
<value>Vous n'avez pas l'autorisation de copier le dossier</value>
</data>
<data name="ErrorMessage_InvalidProvider" xml:space="preserve">
<value>Fournisseur non valide</value>
</data>
<data name="ErrorMessage_InvalidThirdPartyFolder" xml:space="preserve">
<value>Il n'est pas possible d'utiliser ce dossier pour stocker la salle</value>
</data>
<data name="ErrorMessage_InvintationLink" xml:space="preserve">
<value>Le lien d'invitation n'est pas valide ou sa validité a expiré</value>
</data>
<data name="ErrorMessage_ProviderAlreadyConnect" xml:space="preserve">
<value>Ce fournisseur est déjà connecté à la salle</value>
</data>
<data name="ErrorMessage_RoleNotAvailable" xml:space="preserve">
<value>Le rôle n'est pas disponible pour ce type d'utilisateur</value>
</data>
<data name="ErrorMessage_SecurityException_ArchiveRoom" xml:space="preserve">
<value>Vous n'avez pas l'autorisation d'archiver la salle</value>
</data>
<data name="ErrorMessage_SecurityException_CopyToFolder" xml:space="preserve">
<value>Vous n'avez pas l'autorisation de copier dans ce dossier</value>
</data>
<data name="ErrorMessage_SecurityException_EditRoom" xml:space="preserve">
<value>Vous n'avez pas la permission d'éditer la salle</value>
</data>
<data name="ErrorMessage_SecurityException_MoveToFolder" xml:space="preserve">
<value>Vous n'avez pas l'autorisation de déplacer vers ce dossier</value>
</data>
<data name="ErrorMessage_SecurityException_UnarchiveRoom" xml:space="preserve">
<value>Vous n'avez pas suffisamment d'autorisation pour désarchiver la salle</value>
</data>
<data name="ErrorMessage_UpdateArchivedRoom" xml:space="preserve">
<value>Vous ne pouvez pas modifier les salles archivées</value>
</data>
<data name="ErrorrMessage_PinRoom" xml:space="preserve">
<value>Vous ne pouvez pas épingler une salle</value>
</data>
</root>

View File

@ -279,7 +279,7 @@ namespace ASC.Files.Core.Services.NotifyService {
}
/// <summary>
/// Looks up a localized string similar to Access granted to the encrypted document: $DocumentTitle.
/// Looks up a localized string similar to Access granted to document: $DocumentTitle.
/// </summary>
public static string subject_ShareEncryptedDocument_push {
get {

View File

@ -125,4 +125,31 @@ $Message</value>
 
$__AuthorName a supprimé la salle : $RoomTitle</value>
</data>
<data name="subject_DocuSignComplete_push" xml:space="preserve">
<value>Tous les signataires ont rempli $DocumentTitle</value>
</data>
<data name="subject_DocuSignStatus_push" xml:space="preserve">
<value>Changement de statut du signe</value>
</data>
<data name="subject_EditorMentions" xml:space="preserve">
<value>Notification DocSpace. Mentionné dans le document</value>
</data>
<data name="subject_EditorMentions_push" xml:space="preserve">
<value>Mentionné dans le document</value>
</data>
<data name="subject_MailMergeEnd_push" xml:space="preserve">
<value>L'envoi est terminé.</value>
</data>
<data name="subject_RoomRemoved" xml:space="preserve">
<value>Notification DocSpace. Salle supprimée</value>
</data>
<data name="subject_ShareDocument_push" xml:space="preserve">
<value>Accès accordé au document : $DocumentTitle</value>
</data>
<data name="subject_ShareEncryptedDocument_push" xml:space="preserve">
<value>Accès accordé au document chiffré : $DocumentTitle</value>
</data>
<data name="subject_ShareFolder_push" xml:space="preserve">
<value>Accès autorisé au dossier : $DocumentTitle</value>
</data>
</root>

View File

@ -143,7 +143,7 @@ $Message</value>
<value>Mailing is complete.</value>
</data>
<data name="subject_ShareEncryptedDocument_push" xml:space="preserve">
<value>Access granted to the encrypted document: $DocumentTitle</value>
<value>Access granted to document: $DocumentTitle</value>
</data>
<data name="subject_ShareFolder_push" xml:space="preserve">
<value>Access granted to folder: $DocumentTitle</value>

View File

@ -1,15 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="iosGradient" x1="5.50036" y1="10.0004" x2="26.5004" y2="23.0004" gradientUnits="userSpaceOnUse">
<stop stop-color="#009688"/>
<stop offset="0.138984" stop-color="#03A9F4"/>
<stop offset="0.283761" stop-color="#3F51B5"/>
<stop offset="0.429821" stop-color="#9C27B0"/>
<stop offset="0.57304" stop-color="#E91E63"/>
<stop offset="0.698208" stop-color="#F44336"/>
<stop offset="0.846467" stop-color="#FF5722"/>
<stop offset="1" stop-color="#FFC107"/>
</linearGradient>
</defs>
<path d="M2.78663 22.3999H4.99996V13.0132H2.78663V22.3999ZM3.89329 11.7866C4.05311 11.7901 4.21202 11.7617 4.36071 11.703C4.50939 11.6443 4.64484 11.5564 4.75911 11.4447C4.87338 11.3329 4.96417 11.1994 5.02613 11.052C5.0881 10.9047 5.12 10.7464 5.11996 10.5866C5.11996 9.91987 4.58663 9.38653 3.89329 9.38653C3.73348 9.38298 3.57456 9.4114 3.42588 9.47011C3.2772 9.52882 3.14174 9.61665 3.02747 9.72844C2.9132 9.84022 2.82242 9.97371 2.76045 10.1211C2.69849 10.2685 2.66659 10.4267 2.66663 10.5866C2.66663 11.2532 3.19996 11.7866 3.89329 11.7866ZM12.3333 9.4132C8.61329 9.4132 6.26663 11.9466 6.26663 15.9999C6.26663 20.0799 8.61329 22.6132 12.3333 22.6132C16.0533 22.6132 18.4 20.0799 18.4 15.9999C18.4 11.9466 16.0533 9.4132 12.3333 9.4132ZM12.3333 11.3332C14.6133 11.3332 16.0666 13.1599 16.0666 15.9999C16.0666 18.8666 14.6133 20.6666 12.3333 20.6666C10.0533 20.6666 8.61329 18.8666 8.61329 15.9999C8.61329 13.1599 10.0533 11.3332 12.3333 11.3332ZM19.3333 18.8132C19.4266 21.1599 21.3333 22.6132 24.2933 22.6132C27.3866 22.6132 29.3333 21.0932 29.3333 18.6666C29.3333 16.7599 28.24 15.6932 25.64 15.0932L24.1733 14.7599C22.6 14.3866 21.96 13.8932 21.96 13.0399C21.96 11.9999 22.9333 11.2666 24.3733 11.2666C25.84 11.2666 26.84 11.9999 26.9466 13.1866H29.12C29.0666 10.9332 27.2133 9.4132 24.3866 9.4132C21.6133 9.4132 19.64 10.9466 19.64 13.2132C19.64 15.0399 20.7466 16.1732 23.1066 16.7066L24.76 17.0932C26.3733 17.4799 27.0266 17.9999 27.0266 18.9332C27.0266 19.9999 25.96 20.7599 24.4133 20.7599C22.8666 20.7599 21.68 19.9999 21.5466 18.8132H19.3333Z" fill="#CDCFD1"/>
<path d="M2.78699 22.4004H5.00032V13.0137H2.78699V22.4004ZM3.89365 11.7871C4.05347 11.7906 4.21238 11.7622 4.36107 11.7035C4.50975 11.6448 4.6452 11.5569 4.75947 11.4452C4.87374 11.3334 4.96453 11.1999 5.02649 11.0525C5.08846 10.9052 5.12036 10.7469 5.12032 10.5871C5.12032 9.92036 4.58699 9.38701 3.89365 9.38701C3.73384 9.38346 3.57492 9.41188 3.42624 9.47059C3.27756 9.5293 3.1421 9.61714 3.02783 9.72893C2.91356 9.84071 2.82278 9.97419 2.76081 10.1216C2.69885 10.269 2.66695 10.4272 2.66699 10.5871C2.66699 11.2537 3.20032 11.7871 3.89365 11.7871ZM12.3337 9.41369C8.61365 9.41369 6.26699 11.9471 6.26699 16.0004C6.26699 20.0804 8.61365 22.6137 12.3337 22.6137C16.0537 22.6137 18.4004 20.0804 18.4004 16.0004C18.4004 11.9471 16.0537 9.41369 12.3337 9.41369ZM12.3337 11.3337C14.6137 11.3337 16.067 13.1604 16.067 16.0004C16.067 18.8671 14.6137 20.6671 12.3337 20.6671C10.0537 20.6671 8.61365 18.8671 8.61365 16.0004C8.61365 13.1604 10.0537 11.3337 12.3337 11.3337ZM19.3337 18.8137C19.427 21.1604 21.3337 22.6137 24.2937 22.6137C27.387 22.6137 29.3337 21.0937 29.3337 18.6671C29.3337 16.7604 28.2404 15.6937 25.6404 15.0937L24.1737 14.7604C22.6004 14.3871 21.9604 13.8937 21.9604 13.0404C21.9604 12.0004 22.9337 11.2671 24.3737 11.2671C25.8404 11.2671 26.8404 12.0004 26.947 13.1871H29.1204C29.067 10.9337 27.2137 9.41369 24.387 9.41369C21.6137 9.41369 19.6404 10.9471 19.6404 13.2137C19.6404 15.0404 20.747 16.1737 23.107 16.7071L24.7604 17.0937C26.3737 17.4804 27.027 18.0004 27.027 18.9337C27.027 20.0004 25.9604 20.7604 24.4137 20.7604C22.867 20.7604 21.6804 20.0004 21.547 18.8137H19.3337Z" fill="#A3A9AE"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,15 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.78699 22.4004H5.00032V13.0137H2.78699V22.4004ZM3.89365 11.7871C4.05347 11.7906 4.21238 11.7622 4.36107 11.7035C4.50975 11.6448 4.6452 11.5569 4.75947 11.4452C4.87374 11.3334 4.96453 11.1999 5.02649 11.0525C5.08846 10.9052 5.12036 10.7469 5.12032 10.5871C5.12032 9.92036 4.58699 9.38701 3.89365 9.38701C3.73384 9.38346 3.57492 9.41188 3.42624 9.47059C3.27756 9.5293 3.1421 9.61714 3.02783 9.72893C2.91356 9.84071 2.82278 9.97419 2.76081 10.1216C2.69885 10.269 2.66695 10.4272 2.66699 10.5871C2.66699 11.2537 3.20032 11.7871 3.89365 11.7871ZM12.3337 9.41369C8.61365 9.41369 6.26699 11.9471 6.26699 16.0004C6.26699 20.0804 8.61365 22.6137 12.3337 22.6137C16.0537 22.6137 18.4004 20.0804 18.4004 16.0004C18.4004 11.9471 16.0537 9.41369 12.3337 9.41369ZM12.3337 11.3337C14.6137 11.3337 16.067 13.1604 16.067 16.0004C16.067 18.8671 14.6137 20.6671 12.3337 20.6671C10.0537 20.6671 8.61365 18.8671 8.61365 16.0004C8.61365 13.1604 10.0537 11.3337 12.3337 11.3337ZM19.3337 18.8137C19.427 21.1604 21.3337 22.6137 24.2937 22.6137C27.387 22.6137 29.3337 21.0937 29.3337 18.6671C29.3337 16.7604 28.2404 15.6937 25.6404 15.0937L24.1737 14.7604C22.6004 14.3871 21.9604 13.8937 21.9604 13.0404C21.9604 12.0004 22.9337 11.2671 24.3737 11.2671C25.8404 11.2671 26.8404 12.0004 26.947 13.1871H29.1204C29.067 10.9337 27.2137 9.41369 24.387 9.41369C21.6137 9.41369 19.6404 10.9471 19.6404 13.2137C19.6404 15.0404 20.747 16.1737 23.107 16.7071L24.7604 17.0937C26.3737 17.4804 27.027 18.0004 27.027 18.9337C27.027 20.0004 25.9604 20.7604 24.4137 20.7604C22.867 20.7604 21.6804 20.0004 21.547 18.8137H19.3337Z" fill="url(#paint0_linear_6243_174940)"/>
<defs>
<linearGradient id="paint0_linear_6243_174940" x1="5.50036" y1="10.0004" x2="26.5004" y2="23.0004" gradientUnits="userSpaceOnUse">
<stop stop-color="#009688"/>
<stop offset="0.138984" stop-color="#03A9F4"/>
<stop offset="0.283761" stop-color="#3F51B5"/>
<stop offset="0.429821" stop-color="#9C27B0"/>
<stop offset="0.57304" stop-color="#E91E63"/>
<stop offset="0.698208" stop-color="#F44336"/>
<stop offset="0.846467" stop-color="#FF5722"/>
<stop offset="1" stop-color="#FFC107"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -26,6 +26,7 @@
<None Remove="img\restore.svg" />
<None Remove="img\room.svg" />
<None Remove="img\sso.svg" />
<None Remove="img\thirdparty.svg" />
<None Remove="img\total_size.svg" />
<None Remove="img\users.svg" />
<None Remove="img\whitelabel.svg" />
@ -35,6 +36,7 @@
<EmbeddedResource Include="img\restore.svg" />
<EmbeddedResource Include="img\room.svg" />
<EmbeddedResource Include="img\sso.svg" />
<EmbeddedResource Include="img\thirdparty.svg" />
<EmbeddedResource Include="img\total_size.svg" />
<EmbeddedResource Include="img\users.svg" />
<EmbeddedResource Include="img\whitelabel.svg" />

View File

@ -0,0 +1,13 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_43880_80889)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.25 13C4.83579 13 4.5 13.3358 4.5 13.75C4.5 13.839 4.51519 13.9228 4.54248 14.0001C4.62362 14.2296 4.58828 14.4843 4.44771 14.683C4.30713 14.8818 4.07882 15 3.83535 15H1.5V21.25C1.5 21.9404 2.05964 22.5 2.75 22.5H9V20.9863C7.87501 20.8619 7 19.9081 7 18.75C7 17.5919 7.87501 16.6381 9 16.5137V15H6.66465C6.42118 15 6.19287 14.8818 6.05229 14.683C5.91172 14.4843 5.87638 14.2296 5.95752 14.0001C5.98482 13.9228 6 13.839 6 13.75C6 13.3358 5.66421 13 5.25 13ZM3.01373 13.5C3.13809 12.375 4.09186 11.5 5.25 11.5C6.40814 11.5 7.36191 12.375 7.48627 13.5H9.75C10.1642 13.5 10.5 13.8358 10.5 14.25V17.3354C10.5 17.5788 10.3818 17.8071 10.183 17.9477C9.98426 18.0883 9.72961 18.1236 9.50006 18.0425C9.42283 18.0152 9.339 18 9.25 18C8.83579 18 8.5 18.3358 8.5 18.75C8.5 19.1642 8.83579 19.5 9.25 19.5C9.339 19.5 9.42283 19.4848 9.50006 19.4575C9.72961 19.3764 9.98426 19.4117 10.183 19.5523C10.3818 19.6929 10.5 19.9212 10.5 20.1646V23.25C10.5 23.6642 10.1642 24 9.75 24H2.75C1.23122 24 0 22.7688 0 21.25V14.25C0 13.8358 0.335786 13.5 0.75 13.5H3.01373Z" fill="#657077"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.75 11C19.1642 11 19.5 10.6642 19.5 10.25C19.5 10.161 19.4848 10.0772 19.4575 9.99993C19.3764 9.77039 19.4117 9.51574 19.5523 9.31696C19.6929 9.11818 19.9212 9 20.1646 9H22.5V2.75C22.5 2.05964 21.9404 1.5 21.25 1.5H15V3.01373C16.125 3.13809 17 4.09186 17 5.25C17 6.40814 16.125 7.36191 15 7.48627V9H17.3354C17.5788 9 17.8071 9.11818 17.9477 9.31696C18.0883 9.51574 18.1236 9.77039 18.0425 9.99994C18.0152 10.0772 18 10.161 18 10.25C18 10.6642 18.3358 11 18.75 11ZM20.9863 10.5C20.8619 11.625 19.9081 12.5 18.75 12.5C17.5919 12.5 16.6381 11.625 16.5137 10.5H14.25C13.8358 10.5 13.5 10.1642 13.5 9.75V6.66465C13.5 6.42118 13.6182 6.19287 13.817 6.05229C14.0157 5.91172 14.2704 5.87638 14.4999 5.95752C14.5772 5.98482 14.661 6 14.75 6C15.1642 6 15.5 5.66421 15.5 5.25C15.5 4.83579 15.1642 4.5 14.75 4.5C14.661 4.5 14.5772 4.51518 14.4999 4.54248C14.2704 4.62362 14.0157 4.58828 13.817 4.44771C13.6182 4.30713 13.5 4.07882 13.5 3.83535V0.75C13.5 0.335787 13.8358 0 14.25 0H21.25C22.7688 0 24 1.23122 24 2.75V9.75C24 10.1642 23.6642 10.5 23.25 10.5H20.9863Z" fill="#657077"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11 9.75C11 9.33579 10.6642 9 10.25 9C10.161 9 10.0772 9.01519 9.99993 9.04248C9.77039 9.12362 9.51574 9.08828 9.31696 8.94771C9.11818 8.80713 9 8.57882 9 8.33535V6L2.75 6C2.05964 6 1.5 6.55964 1.5 7.25V13.5H3.01373C3.13809 12.375 4.09186 11.5 5.25 11.5C6.40814 11.5 7.36191 12.375 7.48627 13.5H9V11.1646C9 10.9212 9.11818 10.6929 9.31696 10.5523C9.51574 10.4117 9.77039 10.3764 9.99994 10.4575C10.0772 10.4848 10.161 10.5 10.25 10.5C10.6642 10.5 11 10.1642 11 9.75ZM10.5 7.51373C11.625 7.63809 12.5 8.59186 12.5 9.75C12.5 10.9081 11.625 11.8619 10.5 11.9863V14.25C10.5 14.6642 10.1642 15 9.75 15H6.66465C6.42118 15 6.19287 14.8818 6.05229 14.683C5.91172 14.4843 5.87638 14.2296 5.95752 14.0001C5.98482 13.9228 6 13.839 6 13.75C6 13.3358 5.66421 13 5.25 13C4.83579 13 4.5 13.3358 4.5 13.75C4.5 13.839 4.51518 13.9228 4.54248 14.0001C4.62362 14.2296 4.58828 14.4843 4.44771 14.683C4.30713 14.8818 4.07882 15 3.83535 15H0.75C0.335787 15 0 14.6642 0 14.25V7.25C0 5.73122 1.23122 4.5 2.75 4.5L9.75 4.5C10.1642 4.5 10.5 4.83579 10.5 5.25V7.51373Z" fill="#657077"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.5 18.75C8.5 19.1642 8.83579 19.5 9.25 19.5C9.339 19.5 9.42283 19.4848 9.50007 19.4575C9.72961 19.3764 9.98426 19.4117 10.183 19.5523C10.3818 19.6929 10.5 19.9212 10.5 20.1646V22.5H16.75C17.4404 22.5 18 21.9404 18 21.25V15H16.4863C16.3619 16.125 15.4081 17 14.25 17C13.0919 17 12.1381 16.125 12.0137 15H10.5V17.3354C10.5 17.5788 10.3818 17.8071 10.183 17.9477C9.98426 18.0883 9.72961 18.1236 9.50006 18.0425C9.42283 18.0152 9.339 18 9.25 18C8.83579 18 8.5 18.3358 8.5 18.75ZM9 20.9863C7.87501 20.8619 7 19.9081 7 18.75C7 17.5919 7.87501 16.6381 9 16.5137V14.25C9 13.8358 9.33579 13.5 9.75 13.5H12.8354C13.0788 13.5 13.3071 13.6182 13.4477 13.817C13.5883 14.0157 13.6236 14.2704 13.5425 14.4999C13.5152 14.5772 13.5 14.661 13.5 14.75C13.5 15.1642 13.8358 15.5 14.25 15.5C14.6642 15.5 15 15.1642 15 14.75C15 14.661 14.9848 14.5772 14.9575 14.4999C14.8764 14.2704 14.9117 14.0157 15.0523 13.817C15.1929 13.6182 15.4212 13.5 15.6646 13.5H18.75C19.1642 13.5 19.5 13.8358 19.5 14.25V21.25C19.5 22.7688 18.2688 24 16.75 24H9.75C9.33579 24 9 23.6642 9 23.25V20.9863Z" fill="#657077"/>
</g>
<defs>
<clipPath id="clip0_43880_80889">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -2697,6 +2697,15 @@ namespace ASC.Web.Core.PublicResources {
}
}
/// <summary>
/// Looks up a localized string similar to Third-party integrations.
/// </summary>
public static string TariffsFeature_thirdparty {
get {
return ResourceManager.GetString("TariffsFeature_thirdparty", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} storage space.
/// </summary>

View File

@ -937,4 +937,55 @@
<data name="ConsumersWordpressInstruction" xml:space="preserve">
<value>Habilite la aplicación para publicar fácilmente documentos en su sitio web de WordPress. {0}En la página de Desarrolladores de Wordpress, cree una nueva aplicación para la integración de ONLYOFFICE. Pegue los datos que recibió a continuación:</value>
</data>
<data name="ConsumersEasyBibInstruction" xml:space="preserve">
<value>Habilite esta aplicación para crear bibliografías en los editores ONLYOFFICE. {0}Vaya a la página de registro de EasyBib y rellene el formulario para añadir la integración de ONLYOFFICE. Después de obtener la clave de la aplicación, péguela a continuación:</value>
</data>
<data name="ConsumersMicrosoftDescription" xml:space="preserve">
<value>Habilite la aplicación para iniciar sesión en el portal utilizando una cuenta de Microsoft.</value>
</data>
<data name="ConsumersTelegramDescription" xml:space="preserve">
<value>Conecte la cuenta de Telegram para recibir notificaciones del portal a través de Telegram.</value>
</data>
<data name="ConsumersSelectelprivate_containerDescription" xml:space="preserve">
<value>Introduzca el nombre del contenedor privado de Selectel para guardar las copias de seguridad.</value>
</data>
<data name="ConsumersRackspaceprivate_containerDescription" xml:space="preserve">
<value>Introduzca la dirección URL del contenedor privado Rackspace para guardar las copias de seguridad.</value>
</data>
<data name="ConsumersTelegramInstruction" xml:space="preserve">
<value>Para recibir notificaciones del portal a través de Telegram, habilite el bot de Telegram. Puede crear un nuevo bot usando BotFather en Telegram Desktop. Para usar este bot, los usuarios del portal deben habilitar las notificaciones a través de Telegram en su página de perfil. {0}Pegue el nombre de usuario del bot y el token que recibió en los campos de abajo.</value>
</data>
<data name="ConsumersmicrosoftClientId" xml:space="preserve">
<value>Application Client ID ID del cliente de aplicación</value>
</data>
<data name="ConsumersS3bucket" xml:space="preserve">
<value>Contenedor</value>
</data>
<data name="PortalName" xml:space="preserve">
<value>Espacio en la nube para sus documentos ofimáticos</value>
</data>
<data name="ConsumersS3regionDescription" xml:space="preserve">
<value>Enter the AWS region where your Amazon bucket resides. Introduzca la región de AWS en la que reside su cubo de Amazon.</value>
</data>
<data name="ConsumersGoogleCloudbucketDescription" xml:space="preserve">
<value>Introduzca el nombre del contenedor privado de Selectel para almacenar las copias de seguridad.</value>
</data>
<data name="ConsumersSelectelpublic_containerDescription" xml:space="preserve">
<value>Enter the name of the Selectel public container for storing backups. Introduzca el nombre del contenedor público de Selectel para almacenar las copias de seguridad.</value>
</data>
<data name="ConsumersRackspaceregionDescription" xml:space="preserve">
<value>Introduzca la región donde se encuentran sus contenedores de Rackspace.</value>
</data>
<data name="ConsumersS3bucketDescription" xml:space="preserve">
<value>Introduzca el nombre único del cubo de Amazon para almacenar las copias de seguridad.</value>
</data>
<data name="ConsumersTelegramBotName" xml:space="preserve">
<value>Bot username Nombre de usuario del bot</value>
</data>
<data name="ConsumersTelegramBotToken" xml:space="preserve">
<value>Bot token Token del bot</value>
</data>
<data name="ConsumersRackspacepublic_containerDescription" xml:space="preserve">
<value>Introduzca la dirección URL del contenedor público de Rackspace para almacenar las copias de seguridad.</value>
</data>
</root>

View File

@ -967,4 +967,25 @@
<data name="ConsumersSelectelInstruction" xml:space="preserve">
<value>Connectez le service Selectel Cloud Storage pour sauvegarder et stocker les données de votre portail. {0}Obtenez les données d'accès utilisateur avec les permissions de lecture ou d'édition aux containeurs où vous envisagez de stocker les sauvegardes de vos données et collez-les ci-dessous :</value>
</data>
<data name="ConsumersmicrosoftClientId" xml:space="preserve">
<value>ID du client de l'application</value>
</data>
<data name="ConsumersMicrosoftDescription" xml:space="preserve">
<value>Autoriser lapplication de se connecter au portail avec un compte Microsoft.</value>
</data>
<data name="ConsumersTelegramBotName" xml:space="preserve">
<value>Nom d'utilisateur du bot</value>
</data>
<data name="ConsumersTelegramBotToken" xml:space="preserve">
<value>Jeton de bot</value>
</data>
<data name="ConsumersTelegramDescription" xml:space="preserve">
<value>Connectez votre compte Telegram pour recevoir les notifications du portail via Telegram.</value>
</data>
<data name="ConsumersTelegramInstruction" xml:space="preserve">
<value>Pour recevoir les notifications du portail via Telegram, activez le bot Telegram. Vous pouvez créer un nouveau bot à l'aide de BotFather dans Telegram Desktop. Pour utiliser ce bot, les utilisateurs du portail doivent activer les notifications Telegram sur leur page de profil. {0}Collez le nom d'utilisateur du bot et le jeton que vous avez reçu dans les champs ci-dessous.</value>
</data>
<data name="PortalName" xml:space="preserve">
<value>Espace cloud pour vos documents bureautiques</value>
</data>
</root>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Validation code field cannot be empty</value>
@ -988,4 +988,7 @@
<data name="WhatsNewSubscriptionName" xml:space="preserve">
<value>What's New</value>
</data>
<data name="TariffsFeature_thirdparty" xml:space="preserve">
<value>Third-party integrations</value>
</data>
</root>

View File

@ -1111,4 +1111,28 @@ El enlace es válido durante 7 días.
<data name="ButtonConfirmEmail" xml:space="preserve">
<value>CONFIRMAR</value>
</data>
<data name="subject_opensource_admin_activation_v1" xml:space="preserve">
<value>¡Bienvenido/a a ONLYOFFICE DocSpace!</value>
</data>
<data name="subject_enterprise_user_welcome_v1" xml:space="preserve">
<value>¡Bienvenido/a a ONLYOFFICE DocSpace!</value>
</data>
<data name="subject_opensource_user_welcome_v1" xml:space="preserve">
<value>¡Bienvenido/a a ONLYOFFICE DocSpace!</value>
</data>
<data name="subject_saas_user_welcome_v1" xml:space="preserve">
<value>¡Bienvenido/a a ONLYOFFICE DocSpace!</value>
</data>
<data name="subject_enterprise_whitelabel_user_welcome_v1" xml:space="preserve">
<value>¡Bienvenido/a a ONLYOFFICE DocSpace!</value>
</data>
<data name="subject_enterprise_whitelabel_admin_activation_v1" xml:space="preserve">
<value>¡Bienvenido/a a ONLYOFFICE DocSpace!</value>
</data>
<data name="subject_saas_admin_activation_v1" xml:space="preserve">
<value>¡Bienvenido/a a ONLYOFFICE DocSpace!</value>
</data>
<data name="subject_enterprise_admin_activation_v1" xml:space="preserve">
<value>¡Bienvenido/a a ONLYOFFICE DocSpace!</value>
</data>
</root>

View File

@ -1653,4 +1653,127 @@ Bien à vous,
équipe ONLYOFFICE
"www.onlyoffice.com":”https://www.onlyoffice.com/fr/”</value>
</data>
<data name="subject_saas_user_welcome_v1" xml:space="preserve">
<value>Bienvenue sur ONLYOFFICE DocSpace !</value>
</data>
<data name="subject_opensource_user_welcome_v1" xml:space="preserve">
<value>Bienvenue sur ONLYOFFICE DocSpace !</value>
</data>
<data name="subject_enterprise_user_welcome_v1" xml:space="preserve">
<value>Bienvenue sur ONLYOFFICE DocSpace !</value>
</data>
<data name="subject_enterprise_whitelabel_user_welcome_v1" xml:space="preserve">
<value>Bienvenue sur ONLYOFFICE DocSpace !</value>
</data>
<data name="subject_opensource_admin_activation_v1" xml:space="preserve">
<value>Bienvenue sur ONLYOFFICE DocSpace !</value>
</data>
<data name="subject_enterprise_whitelabel_admin_activation_v1" xml:space="preserve">
<value>Bienvenue sur ONLYOFFICE DocSpace !</value>
</data>
<data name="subject_enterprise_admin_activation_v1" xml:space="preserve">
<value>Bienvenue sur ONLYOFFICE DocSpace !</value>
</data>
<data name="subject_saas_admin_user_docs_tips_v1" xml:space="preserve">
<value>Quelques conseils pour travailler efficacement sur vos documents</value>
</data>
<data name="subject_opensource_user_docs_tips_v1" xml:space="preserve">
<value>Quelques conseils pour travailler efficacement sur vos documents</value>
</data>
<data name="subject_opensource_admin_docs_tips_v1" xml:space="preserve">
<value>Quelques conseils pour travailler efficacement sur vos documents</value>
</data>
<data name="subject_saas_admin_welcome_v1" xml:space="preserve">
<value>Découvrez l'abonnement business dONLYOFFICE DocSpace</value>
</data>
<data name="subject_opensource_admin_welcome_v1" xml:space="preserve">
<value>Découvrez l'abonnement business dONLYOFFICE DocSpace</value>
</data>
<data name="subject_enterprise_whitelabel_admin_welcome_v1" xml:space="preserve">
<value>Découvrez l'abonnement business dONLYOFFICE DocSpace</value>
</data>
<data name="subject_enterprise_admin_welcome_v1" xml:space="preserve">
<value>Découvrez l'abonnement business dONLYOFFICE DocSpace</value>
</data>
<data name="subject_saas_admin_trial_warning_after_half_year_v1" xml:space="preserve">
<value>Votre ONLYOFFICE DocSpace sera supprimé</value>
</data>
<data name="subject_portal_delete_success_v1" xml:space="preserve">
<value>ONLYOFFICE DocSpace a été désactivé</value>
</data>
<data name="subject_personal_after_registration14_v1" xml:space="preserve">
<value>Obtenez des applications ONLYOFFICE gratuites</value>
</data>
<data name="subject_saas_user_activation_v1" xml:space="preserve">
<value>Obtenez des applications ONLYOFFICE gratuites</value>
</data>
<data name="subject_opensource_user_activation_v1" xml:space="preserve">
<value>Obtenez des applications ONLYOFFICE gratuites</value>
</data>
<data name="subject_enterprise_whitelabel_user_activation_v1" xml:space="preserve">
<value>Obtenez des applications ONLYOFFICE gratuites</value>
</data>
<data name="subject_enterprise_user_activation_v1" xml:space="preserve">
<value>Obtenez des applications ONLYOFFICE gratuites</value>
</data>
<data name="subject_saas_admin_activation_v1" xml:space="preserve">
<value>Bienvenue sur ONLYOFFICE DocSpace !</value>
</data>
<data name="subject_enterprise_admin_user_apps_tips_v1" xml:space="preserve">
<value>Obtenez des applications ONLYOFFICE gratuites</value>
</data>
<data name="subject_saas_admin_user_apps_tips_v1" xml:space="preserve">
<value>Obtenez des applications ONLYOFFICE gratuites</value>
</data>
<data name="subject_saas_room_invite" xml:space="preserve">
<value>Rejoindre ONLYOFFICE DocSpace</value>
</data>
<data name="subject_saas_owner_payment_warning_grace_period_before_activation" xml:space="preserve">
<value>Votre abonnement ONLYOFFICE DocSpace va expirer</value>
</data>
<data name="subject_saas_owner_payment_warning_grace_period_expired" xml:space="preserve">
<value>Période de grâce pour votre ONLYOFFICE DocSpace a expiré</value>
</data>
<data name="subject_saas_owner_payment_warning_grace_period_last_day" xml:space="preserve">
<value>La période de grâce pour votre ONLYOFFICE DocSpace expire demain</value>
</data>
<data name="subject_saas_admin_modules_v1" xml:space="preserve">
<value>Configurez votre ONLYOFFICE DocSpace</value>
</data>
<data name="pattern_for_sales_notify" xml:space="preserve">
<value>h1.Message du portail "${__VirtualRootPath}":"${__VirtualRootPath}"
Nom : $UserName
E-mail : $UserEmail
$Body</value>
</data>
<data name="subject_personal_already_exist" xml:space="preserve">
<value>Connectez-vous à votre compte ONLYOFFICE Personal</value>
</data>
<data name="subject_change_password_v115" xml:space="preserve">
<value>Confirmez le changement de votre mot de passe</value>
</data>
<data name="subject_for_sales_notify" xml:space="preserve">
<value>Demande du service des ventes</value>
</data>
<data name="AcceptDocSpace" xml:space="preserve">
<value>ACCEPTER</value>
</data>
<data name="subject_saas_docspace_invite" xml:space="preserve">
<value>Rejoindre ONLYOFFICE DocSpace</value>
</data>
<data name="subject_send_whats_new" xml:space="preserve">
<value>Quoi de neuf sur votre portail pour le $Date</value>
</data>
<data name="subject_enterprise_admin_user_docs_tips_v1" xml:space="preserve">
<value>Quelques conseils pour travailler efficacement sur vos documents</value>
</data>
<data name="ButtonConfirmEmail" xml:space="preserve">
<value>CONFIRMER</value>
</data>
<data name="subject_saas_owner_payment_warning_grace_period_activation" xml:space="preserve">
<value>Période de grâce pour votre ONLYOFFICE DocSpace activé</value>
</data>
</root>