Merge branch 'feature/virtual-rooms-1.2' of github.com:ONLYOFFICE/AppServer into feature/virtual-rooms-1.2

This commit is contained in:
Timofey 2022-02-18 22:31:28 +08:00
commit f30cb432f7
19 changed files with 513 additions and 73 deletions

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0-windows</TargetFramework>
<TargetFramework>net6.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
@ -13,12 +13,13 @@
<ItemGroup>
<PackageReference Include="CommandLineParser" Version="2.8.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.5" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.2" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="6.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

View File

@ -2,6 +2,8 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Hosting.Internal;
namespace ASC.Resource.Manager
{
@ -24,6 +26,8 @@ namespace ASC.Resource.Manager
services.AddLogging();
diHelper.Configure(services);
services.AddSingleton(Configuration);
services.AddSingleton<IHostEnvironment, HostingEnvironment>();
diHelper.TryAdd<ProgramScope>();
//LogNLogExtension.ConfigureLog(diHelper);
}

View File

@ -26,7 +26,7 @@
"ConnectionStrings": {
"default": {
"name": "default",
"connectionString": "Server=localhost;Database=teamlab_translate;User ID=dev;Password=dev;Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none",
"connectionString": "Server=localhost;Database=teamlab_translate;User ID=root;Password=root;Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none",
"providerName": "MySql.Data.MySqlClient"
}
},

View File

@ -17,9 +17,12 @@ using ASC.Web.Api.Models;
using ASC.Web.Api.Routing;
using ASC.Web.Core;
using ASC.Web.Core.Files;
using ASC.Web.Core.Helpers;
using ASC.Web.Core.Mobile;
using ASC.Web.Core.PublicResources;
using ASC.Web.Core.Utility;
using ASC.Web.Studio.Core;
using ASC.Web.Studio.Core.Notify;
using ASC.Web.Studio.UserControls.Management;
using ASC.Web.Studio.Utility;
@ -55,6 +58,10 @@ namespace ASC.Web.Api.Controllers
private LicenseReader LicenseReader { get; }
private SetupInfo SetupInfo { get; }
private DocumentServiceLicense DocumentServiceLicense { get; }
private CoreSettings CoreSettings { get; }
private PermissionContext PermissionContext { get; }
private ApiSystemHelper ApiSystemHelper { get; }
private StudioNotifyService StudioNotifyService { get; }
private TenantExtra TenantExtra { get; set; }
public ILog Log { get; }
public IHttpClientFactory ClientFactory { get; }
@ -79,6 +86,10 @@ namespace ASC.Web.Api.Controllers
LicenseReader licenseReader,
SetupInfo setupInfo,
DocumentServiceLicense documentServiceLicense,
CoreSettings coreSettings,
PermissionContext permissionContext,
ApiSystemHelper apiSystemHelper,
StudioNotifyService studioNotifyService,
IHttpClientFactory clientFactory
)
{
@ -99,6 +110,10 @@ namespace ASC.Web.Api.Controllers
LicenseReader = licenseReader;
SetupInfo = setupInfo;
DocumentServiceLicense = documentServiceLicense;
CoreSettings = coreSettings;
PermissionContext = permissionContext;
ApiSystemHelper = apiSystemHelper;
StudioNotifyService = studioNotifyService;
TenantExtra = tenantExtra;
ClientFactory = clientFactory;
}
@ -279,5 +294,79 @@ namespace ASC.Web.Api.Controllers
var currentUser = UserManager.GetUsers(SecurityContext.CurrentAccount.ID);
MobileAppInstallRegistrator.RegisterInstall(currentUser.Email, type);
}
[Update("portalrename")]
public object UpdatePortalName(PortalRenameModel model)
{
var enabled = SetupInfo.IsVisibleSettings("PortalRename");
if (!enabled)
throw new SecurityException(Resource.PortalAccessSettingsTariffException);
if (CoreBaseSettings.Personal)
throw new Exception(Resource.ErrorAccessDenied);
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
var alias = model.Alias;
if (string.IsNullOrEmpty(alias)) throw new ArgumentException();
var tenant = TenantManager.GetCurrentTenant();
var user = UserManager.GetUsers(SecurityContext.CurrentAccount.ID);
var localhost = CoreSettings.BaseDomain == "localhost" || tenant.TenantAlias == "localhost";
var newAlias = alias.ToLowerInvariant();
var oldAlias = tenant.TenantAlias;
var oldVirtualRootPath = CommonLinkUtility.GetFullAbsolutePath("~").TrimEnd('/');
if (!string.Equals(newAlias, oldAlias, StringComparison.InvariantCultureIgnoreCase))
{
if (!string.IsNullOrEmpty(ApiSystemHelper.ApiSystemUrl))
{
ApiSystemHelper.ValidatePortalName(newAlias, user.ID);
}
else
{
TenantManager.CheckTenantAddress(newAlias.Trim());
}
if (!string.IsNullOrEmpty(ApiSystemHelper.ApiCacheUrl))
{
ApiSystemHelper.AddTenantToCache(newAlias, user.ID);
}
tenant.TenantAlias = alias;
tenant = TenantManager.SaveTenant(tenant);
if (!string.IsNullOrEmpty(ApiSystemHelper.ApiCacheUrl))
{
ApiSystemHelper.RemoveTenantFromCache(oldAlias, user.ID);
}
if (!localhost || string.IsNullOrEmpty(tenant.MappedDomain))
{
StudioNotifyService.PortalRenameNotify(tenant, oldVirtualRootPath);
}
}
else
{
return null;
}
var reference = string.Format("{0}{1}{2}/{3}",
ApiContext.HttpContextAccessor.HttpContext.Request?.Scheme ?? Uri.UriSchemeHttp,
Uri.SchemeDelimiter,
tenant.GetTenantDomain(CoreSettings),
CommonLinkUtility.GetConfirmationUrlRelative(tenant.TenantId, user.Email, ConfirmType.Auth));
return new
{
message = Resource.SuccessfullyPortalRenameMessage,
reference = reference
};
}
}
}

View File

@ -63,6 +63,7 @@ using ASC.FederatedLogin.LoginProviders;
using ASC.IPSecurity;
using ASC.MessagingSystem;
using ASC.Security.Cryptography;
using ASC.Web.Api.Core;
using ASC.Web.Api.Models;
using ASC.Web.Api.Routing;
using ASC.Web.Core;
@ -174,6 +175,7 @@ namespace ASC.Api.Settings
private InstanceCrypto InstanceCrypto { get; }
private Signature Signature { get; }
private DbWorker WebhookDbWorker { get; }
private DnsSettings DnsSettings { get; }
public IHttpClientFactory ClientFactory { get; }
public SettingsController(
@ -240,6 +242,7 @@ namespace ASC.Api.Settings
InstanceCrypto instanceCrypto,
Signature signature,
DbWorker dbWorker,
DnsSettings dnsSettings,
IHttpClientFactory clientFactory)
{
Log = option.Get("ASC.Api");
@ -302,6 +305,7 @@ namespace ASC.Api.Settings
TelegramHelper = telegramHelper;
PaymentManager = paymentManager;
WebhookDbWorker = dbWorker;
DnsSettings = dnsSettings;
Constants = constants;
InstanceCrypto = instanceCrypto;
Signature = signature;
@ -730,6 +734,13 @@ namespace ASC.Api.Settings
return Dns.GetHostName().ToLowerInvariant();
}
[Update("dns")]
public object SaveDnsSettings(DnsSettingsModel model)
{
return DnsSettings.SaveDnsSettings(model.DnsName, model.Enable);
}
[Read("greetingsettings")]
public ContentResult GetGreetingSettings()
{
@ -889,11 +900,29 @@ namespace ASC.Api.Settings
[Read("security/password", Check = false)]
[Authorize(AuthenticationSchemes = "confirm", Roles = "Everyone")]
public object GetPasswordSettings()
public PasswordSettings GetPasswordSettings()
{
var UserPasswordSettings = SettingsManager.Load<PasswordSettings>();
return SettingsManager.Load<PasswordSettings>();
}
[Update("security/password")]
public PasswordSettings UpdatePasswordSettings(PasswordSettingsModel model)
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
var userPasswordSettings = SettingsManager.Load<PasswordSettings>();
userPasswordSettings.MinLength = model.MinLength;
userPasswordSettings.UpperCase = model.UpperCase;
userPasswordSettings.Digits = model.Digits;
userPasswordSettings.SpecSymbols = model.SpecSymbols;
SettingsManager.Save(userPasswordSettings);
MessageService.Send(MessageAction.PasswordStrengthSettingsUpdated);
return userPasswordSettings;
return UserPasswordSettings;
}
[Update("security")]
@ -1113,7 +1142,7 @@ namespace ASC.Api.Settings
{
var logoDict = new Dictionary<int, string>();
foreach(var l in model.Logo)
foreach (var l in model.Logo)
{
logoDict.Add(Int32.Parse(l.Key), l.Value);
}

View File

@ -0,0 +1,165 @@
using System;
using System.Text;
using ASC.Common;
using ASC.Core;
using ASC.Core.Tenants;
using ASC.MessagingSystem;
using ASC.Web.Core.PublicResources;
using ASC.Web.Studio.Core;
using ASC.Web.Studio.Core.Notify;
using ASC.Web.Studio.Utility;
namespace ASC.Web.Api.Core
{
[Scope]
public class DnsSettings
{
private readonly PermissionContext _permissionContext;
private readonly TenantManager _tenantManager;
private readonly UserManager _userManager;
private readonly CoreBaseSettings _coreBaseSettings;
private readonly CoreSettings _coreSettings;
private readonly StudioNotifyService _studioNotifyService;
private readonly CommonLinkUtility _commonLinkUtility;
private readonly MessageService _messageService;
private readonly TenantExtra _tenantExtra;
public DnsSettings(
PermissionContext permissionContext,
TenantManager tenantManager,
UserManager userManager,
CoreBaseSettings coreBaseSettings,
CoreSettings coreSettings,
StudioNotifyService studioNotifyService,
CommonLinkUtility commonLinkUtility,
MessageService messageService,
TenantExtra tenantExtra)
{
_permissionContext = permissionContext;
_tenantManager = tenantManager;
_userManager = userManager;
_coreBaseSettings = coreBaseSettings;
_coreSettings = coreSettings;
_studioNotifyService = studioNotifyService;
_commonLinkUtility = commonLinkUtility;
_messageService = messageService;
_tenantExtra = tenantExtra;
}
protected bool EnableDomain
{
get { return _coreBaseSettings.Standalone || _tenantExtra.GetTenantQuota().HasDomain; }
}
public string SaveDnsSettings(string dnsName, bool enableDns)
{
try
{
if (!EnableDomain || !SetupInfo.IsVisibleSettings<DnsSettings>()) throw new Exception(Resource.ErrorNotAllowedOption);
_permissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
var tenant = _tenantManager.GetCurrentTenant();
if (!enableDns || string.IsNullOrEmpty(dnsName))
{
dnsName = null;
}
if (dnsName == null || CheckCustomDomain(dnsName))
{
if (_coreBaseSettings.Standalone)
{
tenant.MappedDomain = dnsName;
_tenantManager.SaveTenant(tenant);
return null;
}
if (tenant.MappedDomain != dnsName)
{
var portalAddress = $"http://{tenant.TenantAlias ?? string.Empty}.{ _coreSettings.BaseDomain}";
var u = _userManager.GetUsers(tenant.OwnerId);
_studioNotifyService.SendMsgDnsChange(tenant, GenerateDnsChangeConfirmUrl(u.Email, dnsName, tenant.TenantAlias, ConfirmType.DnsChange), portalAddress, dnsName);
_messageService.Send(MessageAction.DnsSettingsUpdated);
return string.Format(Resource.DnsChangeMsg, string.Format("<a href=\"mailto:{0}\">{0}</a>", u.Email.HtmlEncode()));
}
return null;
}
throw new Exception(Resource.ErrorNotCorrectTrustedDomain);
}
catch (Exception e)
{
throw new Exception(e.Message.HtmlEncode());
}
}
private bool CheckCustomDomain(string domain)
{
if (string.IsNullOrEmpty(domain))
{
return false;
}
if (!string.IsNullOrEmpty(TenantBaseDomain) &&
(domain.EndsWith(TenantBaseDomain, StringComparison.InvariantCultureIgnoreCase) || domain.Equals(TenantBaseDomain.TrimStart('.'), StringComparison.InvariantCultureIgnoreCase)))
{
return false;
}
Uri test;
if (Uri.TryCreate(domain.Contains(Uri.SchemeDelimiter) ? domain : Uri.UriSchemeHttp + Uri.SchemeDelimiter + domain, UriKind.Absolute, out test))
{
try
{
_tenantManager.CheckTenantAddress(test.Host);
}
catch (TenantTooShortException ex)
{
var minLength = ex.MinLength;
var maxLength = ex.MaxLength;
if (minLength > 0 && maxLength > 0)
{
throw new TenantTooShortException(string.Format(Resource.ErrorTenantTooShortFormat, minLength, maxLength));
}
throw new TenantTooShortException(Resource.ErrorTenantTooShort);
}
catch (TenantIncorrectCharsException)
{
}
return true;
}
return false;
}
private string GenerateDnsChangeConfirmUrl(string email, string dnsName, string tenantAlias, ConfirmType confirmType)
{
var postfix = string.Join(string.Empty, new[] { dnsName, tenantAlias });
var sb = new StringBuilder();
sb.Append(_commonLinkUtility.GetConfirmationUrl(email, confirmType, postfix));
if (!string.IsNullOrEmpty(dnsName))
{
sb.AppendFormat("&dns={0}", dnsName);
}
if (!string.IsNullOrEmpty(tenantAlias))
{
sb.AppendFormat("&alias={0}", tenantAlias);
}
return sb.ToString();
}
protected string TenantBaseDomain
{
get
{
return string.IsNullOrEmpty(_coreSettings.BaseDomain)
? string.Empty
: $".{_coreSettings.BaseDomain}";
}
}
}
}

View File

@ -0,0 +1,8 @@
namespace ASC.Web.Api.Models
{
public class DnsSettingsModel
{
public string DnsName { get; set; }
public bool Enable { get; set; }
}
}

View File

@ -0,0 +1,25 @@
namespace ASC.Web.Api.Models
{
public class PasswordSettingsModel
{
/// <summary>
/// Minimal length password has
/// </summary>
public int MinLength { get; set; }
/// <summary>
/// Password must contains upper case
/// </summary>
public bool UpperCase { get; set; }
/// <summary>
/// Password must contains digits
/// </summary>
public bool Digits { get; set; }
/// <summary>
/// Password must contains special symbols
/// </summary>
public bool SpecSymbols { get; set; }
}
}

View File

@ -0,0 +1,7 @@
namespace ASC.Web.Api.Models
{
public class PortalRenameModel
{
public string Alias { get; set; }
}
}

View File

@ -14,6 +14,7 @@ import { AppServerConfig } from "@appserver/common/constants";
import withCultureNames from "@appserver/common/hoc/withCultureNames";
import LanguageAndTimeZone from "./language-and-time-zone";
import CustomTitles from "./custom-titles";
import PortalRenaming from "./portal-renaming";
import { Base } from "@appserver/components/themes";
import { Consumer } from "@appserver/components/utils/context";
@ -218,36 +219,7 @@ class Customization extends React.Component {
<CustomTitles sectionWidth={context.sectionWidth} />
</div>
<div className="category-item-wrapper">
<div className="category-item-heading">
<Link
truncate={true}
className="inherit-title-link header"
onClick={this.onClickLink}
href={combineUrl(
AppServerConfig.proxyURL,
"/settings/common/customization/team-template"
)}
>
{t("TeamTemplate")}
</Link>
<StyledArrowRightIcon size="small" />
</div>
<Box marginProp="4px 0 6px 0">
<Text fontWeight="600">{`${customNames.name}`}</Text>
</Box>
<Text className="category-item-description">
{t("TeamTemplateSettingsDescription")}
</Text>
<Box marginProp="16px 0 0 0">
<Link
color={theme.studio.settings.common.linkColorHelp}
target="_blank"
isHovered={true}
href={helpUrlCommonSettings}
>
{t("Common:LearnMore")}
</Link>
</Box>
<PortalRenaming sectionWidth={context.sectionWidth} />
</div>
</StyledComponent>
)}

View File

@ -79,7 +79,9 @@ const StyledComponent = styled.div`
`;
let languageFromSessionStorage = "";
let languageDefaultFromSessionStorage = "";
let timezoneFromSessionStorage = "";
let timezoneDefaultFromSessionStorage = "";
const settingNames = ["language", "timezone"];
@ -108,8 +110,13 @@ class LanguageAndTimeZone extends React.Component {
);
languageFromSessionStorage = getFromSessionStorage("language");
languageDefaultFromSessionStorage = getFromSessionStorage(
"languageDefault"
);
timezoneFromSessionStorage = getFromSessionStorage("timezone");
timezoneDefaultFromSessionStorage = getFromSessionStorage(
"timezoneDefault"
);
setDocumentTitle(t("Customization"));
this.state = {
@ -117,9 +124,9 @@ class LanguageAndTimeZone extends React.Component {
isLoading: false,
timezones,
timezone: timezoneFromSessionStorage || timezone,
timezoneDefault: timezone,
timezoneDefault: timezoneDefaultFromSessionStorage || timezone,
language: languageFromSessionStorage || language,
languageDefault: language,
languageDefault: languageDefaultFromSessionStorage || language,
isLoadingGreetingSave: false,
isLoadingGreetingRestore: false,
hasChanged: false,
@ -134,16 +141,7 @@ class LanguageAndTimeZone extends React.Component {
portalTimeZoneId,
getPortalTimezones,
} = this.props;
const { timezones, isLoadedData, showReminder } = this.state;
if (
(languageFromSessionStorage || timezoneFromSessionStorage) &&
!showReminder
) {
this.setState({
showReminder: true,
});
}
const { timezones, isLoadedData } = this.state;
if (!timezones.length) {
getPortalTimezones().then(() => {
@ -225,11 +223,9 @@ class LanguageAndTimeZone extends React.Component {
this.setState({ language });
if (this.settingIsEqualInitialValue("language", language)) {
saveToSessionStorage("language", "");
saveToSessionStorage("languageDefault", "");
} else {
saveToSessionStorage("language", language);
this.setState({
showReminder: true,
});
}
this.checkChanges();
};
@ -238,11 +234,9 @@ class LanguageAndTimeZone extends React.Component {
this.setState({ timezone });
if (this.settingIsEqualInitialValue("timezone", timezone)) {
saveToSessionStorage("timezone", "");
saveToSessionStorage("timezoneDefault", "");
} else {
saveToSessionStorage("timezone", timezone);
this.setState({
showReminder: true,
});
}
this.checkChanges();
@ -272,6 +266,9 @@ class LanguageAndTimeZone extends React.Component {
timezoneDefault: this.state.timezone,
languageDefault: this.state.language,
});
saveToSessionStorage("languageDefault", language);
saveToSessionStorage("timezoneDefault", timezone);
};
onCancelClick = () => {
@ -317,6 +314,7 @@ class LanguageAndTimeZone extends React.Component {
if (hasChanged !== this.state.hasChanged) {
this.setState({
hasChanged: hasChanged,
showReminder: hasChanged,
});
}
};

View File

@ -0,0 +1,7 @@
import React from "react";
const PortalRenaming = () => {
return <div></div>;
};
export default PortalRenaming;

View File

@ -1509,6 +1509,15 @@ namespace ASC.Web.Core.PublicResources {
}
}
/// <summary>
/// Ищет локализованную строку, похожую на A link to confirm the operation has been sent to {0} (the email address of the portal owner)..
/// </summary>
public static string DnsChangeMsg {
get {
return ResourceManager.GetString("DnsChangeMsg", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Incorrect Instance id..
/// </summary>
@ -1752,6 +1761,24 @@ namespace ASC.Web.Core.PublicResources {
}
}
/// <summary>
/// Ищет локализованную строку, похожую на The tenant domain can not be empty..
/// </summary>
public static string ErrorTenantTooShort {
get {
return ResourceManager.GetString("ErrorTenantTooShort", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на The domain name must be between {0} and {1} characters long..
/// </summary>
public static string ErrorTenantTooShortFormat {
get {
return ResourceManager.GetString("ErrorTenantTooShortFormat", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на The user could not be found.
/// </summary>
@ -1950,6 +1977,15 @@ namespace ASC.Web.Core.PublicResources {
}
}
/// <summary>
/// Ищет локализованную строку, похожую на This feature enabled on free tariff only.
/// </summary>
public static string PortalAccessSettingsTariffException {
get {
return ResourceManager.GetString("PortalAccessSettingsTariffException", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Portal Access.
/// </summary>
@ -2076,6 +2112,15 @@ namespace ASC.Web.Core.PublicResources {
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Portal has been renamed successfully.
/// </summary>
public static string SuccessfullyPortalRenameMessage {
get {
return ResourceManager.GetString("SuccessfullyPortalRenameMessage", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Welcome Page settings have been successfully saved.
/// </summary>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Das Feld mit dem Prüfcode darf nicht leer sein</value>
@ -545,6 +545,9 @@
<data name="CustomNamingPeopleSchema" xml:space="preserve">
<value>Einstellbar</value>
</data>
<data name="DnsChangeMsg" xml:space="preserve">
<value>Der Link zum Bestätigen der Operation wurde an {0} verschickt (die E-Mail-Adresse des Portalbesitzers).</value>
</data>
<data name="EmailAndPasswordIncorrectAmiId" xml:space="preserve">
<value>Falsche Instanz-ID.</value>
</data>
@ -626,6 +629,12 @@
<data name="ErrorRequestLimitExceeded" xml:space="preserve">
<value>Anforderungslimit wurde überschritten</value>
</data>
<data name="ErrorTenantTooShort" xml:space="preserve">
<value>Die Mandantendomäne darf nicht leer sein.</value>
</data>
<data name="ErrorTenantTooShortFormat" xml:space="preserve">
<value>Der Domänenname muss zwischen {0} und {1} Zeichen lang sein.</value>
</data>
<data name="ErrorUserNotFound" xml:space="preserve">
<value>Der Benutzer konnte nicht gefunden werden</value>
</data>
@ -692,6 +701,9 @@
<data name="PersonalFreeSpaceException" xml:space="preserve">
<value>Der verfügbare Speicherplatz ist überschritten</value>
</data>
<data name="PortalAccessSettingsTariffException" xml:space="preserve">
<value>Diese Funktion ist nur für den kostenlosen Tarif verfügbar</value>
</data>
<data name="PortalSecurity" xml:space="preserve">
<value>Zugang zum Portal</value>
</data>
@ -734,6 +746,9 @@
<data name="SsoSettingsInvalidMapping" xml:space="preserve">
<value>Ungültige Feldzuordnung</value>
</data>
<data name="SuccessfullyPortalRenameMessage" xml:space="preserve">
<value>Portal wurde erfolgreich umbenannt </value>
</data>
<data name="SuccessfullySaveGreetingSettingsMessage" xml:space="preserve">
<value>Die Begrüßungseinstellungen wurden erfolgreich gespeichert</value>
</data>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Campo de código de validación no puede estar vacío</value>
@ -508,6 +508,9 @@
<data name="CustomNamingPeopleSchema" xml:space="preserve">
<value>Personalizado</value>
</data>
<data name="DnsChangeMsg" xml:space="preserve">
<value>Un enlace para confirmar la operación ha sido enviada al :correo electrónico (la dirección del correo electrónico del propietario del portal).</value>
</data>
<data name="EmailAndPasswordIncorrectAmiId" xml:space="preserve">
<value>Id. incorrecta de instancia</value>
</data>
@ -589,6 +592,12 @@
<data name="ErrorRequestLimitExceeded" xml:space="preserve">
<value>Límite de solicitudes es excedido</value>
</data>
<data name="ErrorTenantTooShort" xml:space="preserve">
<value>El dominio de espacio empresarial no puede estar vacío.</value>
</data>
<data name="ErrorTenantTooShortFormat" xml:space="preserve">
<value>El nombre del dominio debe tener entre {0} y {1} caracteres.</value>
</data>
<data name="ErrorUserNotFound" xml:space="preserve">
<value>Usuario no ha sido encontrado</value>
</data>
@ -655,6 +664,9 @@
<data name="PersonalFreeSpaceException" xml:space="preserve">
<value>Cuota de espacio en disco excedida </value>
</data>
<data name="PortalAccessSettingsTariffException" xml:space="preserve">
<value>Esta característica se proporciona sólo en portales gratuitos</value>
</data>
<data name="PortalSecurity" xml:space="preserve">
<value>Acceso a portal</value>
</data>
@ -697,6 +709,9 @@
<data name="SsoSettingsInvalidMapping" xml:space="preserve">
<value>Cartografía de campos no válida</value>
</data>
<data name="SuccessfullyPortalRenameMessage" xml:space="preserve">
<value>El portal ha sido renombrado con éxito </value>
</data>
<data name="SuccessfullySaveGreetingSettingsMessage" xml:space="preserve">
<value>Los ajustes de bienvenida han sido guardados con éxito</value>
</data>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Le champ du code de validation ne peut pas être vide</value>
@ -541,6 +541,9 @@
<data name="CustomNamingPeopleSchema" xml:space="preserve">
<value>Personnel</value>
</data>
<data name="DnsChangeMsg" xml:space="preserve">
<value>Un lien pour confirmer l'opération a été envoyé à {0}(l'adresse e-mail du propriétaire du portail).</value>
</data>
<data name="EmailAndPasswordIncorrectAmiId" xml:space="preserve">
<value>Identifiant de l'instance n'est pas valide.</value>
</data>
@ -622,6 +625,12 @@
<data name="ErrorRequestLimitExceeded" xml:space="preserve">
<value>Le délai de requête est dépassé</value>
</data>
<data name="ErrorTenantTooShort" xml:space="preserve">
<value>L'hôte du domaine ne peut pas être vide</value>
</data>
<data name="ErrorTenantTooShortFormat" xml:space="preserve">
<value>Le nom de domaine doit contenir de {0} à {1} caractères.</value>
</data>
<data name="ErrorUserNotFound" xml:space="preserve">
<value>Il est impossible de trouver l'utilisateur</value>
</data>
@ -690,6 +699,9 @@
<data name="PersonalFreeSpaceException" xml:space="preserve">
<value>Quota d'espace disque est dépassé</value>
</data>
<data name="PortalAccessSettingsTariffException" xml:space="preserve">
<value>Cette fonctionalité n'est activée que pour le tarif gratuit</value>
</data>
<data name="PortalSecurity" xml:space="preserve">
<value>Accès au portail</value>
</data>
@ -732,6 +744,9 @@
<data name="SsoSettingsInvalidMapping" xml:space="preserve">
<value>Mappage des champs non valides</value>
</data>
<data name="SuccessfullyPortalRenameMessage" xml:space="preserve">
<value>Le portail a été renommé avec succès</value>
</data>
<data name="SuccessfullySaveGreetingSettingsMessage" xml:space="preserve">
<value>Les paramètres de la page d'accueil ont été enregistrés avec succès</value>
</data>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Il campo Valida codice non può essere vuoto</value>
@ -503,6 +503,9 @@
<data name="CustomNamingPeopleSchema" xml:space="preserve">
<value>Personalizzato</value>
</data>
<data name="DnsChangeMsg" xml:space="preserve">
<value>Un collegamento per confermare l'operazione è stato inviato all'indirizzo {0} (l'indirizzo email del proprietario del portale).</value>
</data>
<data name="EmailAndPasswordIncorrectAmiId" xml:space="preserve">
<value>ID istanza errato.</value>
</data>
@ -584,6 +587,12 @@
<data name="ErrorRequestLimitExceeded" xml:space="preserve">
<value>Il limite di richieste è stato superato</value>
</data>
<data name="ErrorTenantTooShort" xml:space="preserve">
<value>Il dominio Tenant non può essere vuoto.</value>
</data>
<data name="ErrorTenantTooShortFormat" xml:space="preserve">
<value>Il nome del dominio deve essere composto da {0} a {1} caratteri.</value>
</data>
<data name="ErrorUserNotFound" xml:space="preserve">
<value>L'utente non è stato trovato</value>
</data>
@ -647,6 +656,9 @@
<data name="PersonalFreeSpaceException" xml:space="preserve">
<value>Quota di spazio su disco superata</value>
</data>
<data name="PortalAccessSettingsTariffException" xml:space="preserve">
<value>Questa funzione è attiva solo per il piano tariffario gratuito</value>
</data>
<data name="PortalSecurity" xml:space="preserve">
<value>Accesso al portale</value>
</data>
@ -689,6 +701,9 @@
<data name="SsoSettingsInvalidMapping" xml:space="preserve">
<value>Mappatura campi non valida</value>
</data>
<data name="SuccessfullyPortalRenameMessage" xml:space="preserve">
<value>Il portale è stato rinominato con successo.</value>
</data>
<data name="SuccessfullySaveGreetingSettingsMessage" xml:space="preserve">
<value>Le impostazioni della pagina di saluto sono state salvate con successo</value>
</data>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Validation code field cannot be empty</value>
@ -541,6 +541,9 @@
<data name="CustomNamingPeopleSchema" xml:space="preserve">
<value>Custom</value>
</data>
<data name="DnsChangeMsg" xml:space="preserve">
<value>A link to confirm the operation has been sent to {0} (the email address of the portal owner).</value>
</data>
<data name="EmailAndPasswordIncorrectAmiId" xml:space="preserve">
<value>Incorrect Instance id.</value>
</data>
@ -622,6 +625,12 @@
<data name="ErrorRequestLimitExceeded" xml:space="preserve">
<value>Request limit is exceeded</value>
</data>
<data name="ErrorTenantTooShort" xml:space="preserve">
<value>The tenant domain can not be empty.</value>
</data>
<data name="ErrorTenantTooShortFormat" xml:space="preserve">
<value>The domain name must be between {0} and {1} characters long.</value>
</data>
<data name="ErrorUserNotFound" xml:space="preserve">
<value>The user could not be found</value>
</data>
@ -688,6 +697,9 @@
<data name="PersonalFreeSpaceException" xml:space="preserve">
<value>Disk space quota exceeded</value>
</data>
<data name="PortalAccessSettingsTariffException" xml:space="preserve">
<value>This feature enabled on free tariff only</value>
</data>
<data name="PortalSecurity" xml:space="preserve">
<value>Portal Access</value>
</data>
@ -730,6 +742,9 @@
<data name="SsoSettingsInvalidMapping" xml:space="preserve">
<value>Invalid fields mapping</value>
</data>
<data name="SuccessfullyPortalRenameMessage" xml:space="preserve">
<value>Portal has been renamed successfully</value>
</data>
<data name="SuccessfullySaveGreetingSettingsMessage" xml:space="preserve">
<value>Welcome Page settings have been successfully saved</value>
</data>

View File

@ -53,10 +53,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.9.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ActivateMobilePhoneEmptyCode" xml:space="preserve">
<value>Поле кода подтверждения не может быть пустым</value>
@ -541,6 +541,9 @@
<data name="CustomNamingPeopleSchema" xml:space="preserve">
<value>Пользовательский</value>
</data>
<data name="DnsChangeMsg" xml:space="preserve">
<value>Ссылка для подтверждения операции была отправлена на {0} (адрес электронной почты владельца портала).</value>
</data>
<data name="EmailAndPasswordIncorrectAmiId" xml:space="preserve">
<value>Неправильный ID экземпляра.</value>
</data>
@ -622,6 +625,12 @@
<data name="ErrorRequestLimitExceeded" xml:space="preserve">
<value>Превышен лимит запросов</value>
</data>
<data name="ErrorTenantTooShort" xml:space="preserve">
<value>Домен клиента не может быть пустым</value>
</data>
<data name="ErrorTenantTooShortFormat" xml:space="preserve">
<value>Доменное имя должно содержать от {0} до {1} символов.</value>
</data>
<data name="ErrorUserNotFound" xml:space="preserve">
<value>Пользователь не найден</value>
</data>
@ -688,6 +697,9 @@
<data name="PersonalFreeSpaceException" xml:space="preserve">
<value>Превышена квота на размер дискового пространства</value>
</data>
<data name="PortalAccessSettingsTariffException" xml:space="preserve">
<value>Эта функция доступна только для бесплатного тарифа</value>
</data>
<data name="PortalSecurity" xml:space="preserve">
<value>Доступ к порталу</value>
</data>
@ -730,6 +742,9 @@
<data name="SsoSettingsInvalidMapping" xml:space="preserve">
<value>Недопустимое сопоставление полей</value>
</data>
<data name="SuccessfullyPortalRenameMessage" xml:space="preserve">
<value>Портал успешно переименован</value>
</data>
<data name="SuccessfullySaveGreetingSettingsMessage" xml:space="preserve">
<value>Настройки страницы приветствия успешно сохранены</value>
</data>