Merge pull request #2244 from sbwalker/dev
allow multiple aliases to be defined as default
This commit is contained in:
commit
380cb192c7
|
@ -170,24 +170,54 @@
|
||||||
@if (_aliases != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
@if (_aliases != null && UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
||||||
{
|
{
|
||||||
<Section Name="Aliases" Heading="Aliases" ResourceKey="Aliases">
|
<Section Name="Aliases" Heading="Aliases" ResourceKey="Aliases">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row mb-1 align-items-center">
|
<div class="row mb-1 align-items-center">
|
||||||
<Label Class="col-sm-3" For="alias" HelpText="The aliases for the site. An alias can be a domain name (www.site.com) or a virtual folder (ie. www.site.com/folder). If a site has multiple aliases they should be separated by commas." ResourceKey="Aliases">Aliases: </Label>
|
<Label Class="col-sm-3" For="aliases" HelpText="The list of aliases for this site" ResourceKey="Aliases">Aliases: </Label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<textarea id="alias" class="form-control" @bind="@_urls" rows="3" required></textarea>
|
<button type="button" class="btn btn-primary" @onclick="AddAlias">@SharedLocalizer["Add"]</button>
|
||||||
|
<Pager Items="@_aliases">
|
||||||
|
<Header>
|
||||||
|
<th style="width: 1px;"> </th>
|
||||||
|
<th style="width: 1px;"> </th>
|
||||||
|
<th>@Localizer["AliasName"]</th>
|
||||||
|
<th>@Localizer["AliasDefault"]</th>
|
||||||
|
</Header>
|
||||||
|
<Row>
|
||||||
|
@if (context.AliasId != _aliasid)
|
||||||
|
{
|
||||||
|
<td>
|
||||||
|
@if (_aliasid == -1)
|
||||||
|
{
|
||||||
|
<button type="button" class="btn btn-primary" @onclick="@(() => EditAlias(context))">@SharedLocalizer["Edit"]</button>
|
||||||
|
}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
@if (_aliasid == -1)
|
||||||
|
{
|
||||||
|
<ActionDialog Action="Delete" OnClick="@(async () => await DeleteAlias(context))" ResourceKey="DeleteModule" Class="btn btn-danger" Header="Delete Alias" Message="@string.Format(Localizer["Confirm.Alias.Delete", context.Name])" />
|
||||||
|
}
|
||||||
|
</td>
|
||||||
|
<td>@context.Name</td>
|
||||||
|
<td>@context.IsDefault</td>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<td><button type="button" class="btn btn-success" @onclick="@(async () => await SaveAlias())">@SharedLocalizer["Save"]</button></td>
|
||||||
|
<td><button type="button" class="btn btn-secondary" @onclick="@(async () => await CancelAlias())">@SharedLocalizer["Cancel"]</button></td>
|
||||||
|
<td>
|
||||||
|
<input id="aliasname" class="form-control" @bind="@_aliasname" />
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select id="defaultaias" class="form-select" @bind="@_defaultalias" required>
|
||||||
|
<option value="True">@SharedLocalizer["Yes"]</option>
|
||||||
|
<option value="False">@SharedLocalizer["No"]</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
}
|
||||||
|
</Row>
|
||||||
|
</Pager>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div class="row mb-1 align-items-center">
|
|
||||||
<Label Class="col-sm-3" For="defaultalias" HelpText="The default alias for the site. Requests for non-default aliases will be redirected to the default alias." ResourceKey="DefaultAlias">Default Alias: </Label>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<select id="defaultalias" class="form-select" @bind="@_defaultalias" required>
|
|
||||||
@foreach (string name in _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(sValue => sValue.Trim()).ToArray())
|
|
||||||
{
|
|
||||||
<option value="@name">@name</option>
|
|
||||||
}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</Section>
|
</Section>
|
||||||
<Section Name="Hosting" Heading="Hosting Model" ResourceKey="Hosting">
|
<Section Name="Hosting" Heading="Hosting Model" ResourceKey="Hosting">
|
||||||
|
@ -253,8 +283,9 @@
|
||||||
private List<ThemeControl> _containers = new List<ThemeControl>();
|
private List<ThemeControl> _containers = new List<ThemeControl>();
|
||||||
private string _name = string.Empty;
|
private string _name = string.Empty;
|
||||||
private List<Alias> _aliases;
|
private List<Alias> _aliases;
|
||||||
private string _defaultalias = string.Empty;
|
private int _aliasid = -1;
|
||||||
private string _urls = string.Empty;
|
private string _aliasname;
|
||||||
|
private string _defaultalias;
|
||||||
private string _runtime = "";
|
private string _runtime = "";
|
||||||
private string _prerender = "";
|
private string _prerender = "";
|
||||||
private int _logofileid = -1;
|
private int _logofileid = -1;
|
||||||
|
@ -304,10 +335,7 @@
|
||||||
_prerender = site.RenderMode.Replace(_runtime, "");
|
_prerender = site.RenderMode.Replace(_runtime, "");
|
||||||
_isdeleted = site.IsDeleted.ToString();
|
_isdeleted = site.IsDeleted.ToString();
|
||||||
|
|
||||||
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
await GetAliases();
|
||||||
{
|
|
||||||
await GetAliases();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (site.LogoFileId != null)
|
if (site.LogoFileId != null)
|
||||||
{
|
{
|
||||||
|
@ -409,152 +437,92 @@
|
||||||
{
|
{
|
||||||
if (_name != string.Empty && _themetype != "-" && _containertype != "-")
|
if (_name != string.Empty && _themetype != "-" && _containertype != "-")
|
||||||
{
|
{
|
||||||
var unique = true;
|
var site = await SiteService.GetSiteAsync(PageState.Site.SiteId);
|
||||||
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
if (site != null)
|
||||||
{
|
{
|
||||||
_urls = Regex.Replace(_urls, @"\r\n?|\n", ","); // convert line breaks to commas
|
bool refresh = false;
|
||||||
var aliases = await AliasService.GetAliasesAsync();
|
bool reload = false;
|
||||||
foreach (string name in _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(sValue => sValue.Trim()).ToArray())
|
|
||||||
|
site.Name = _name;
|
||||||
|
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
||||||
{
|
{
|
||||||
var alias = aliases.Where(item => item.Name == name).FirstOrDefault();
|
if (site.Runtime != _runtime || site.RenderMode != _runtime + _prerender)
|
||||||
if (alias != null && unique)
|
|
||||||
{
|
{
|
||||||
unique = (alias.TenantId == PageState.Site.TenantId && alias.SiteId == PageState.Site.SiteId);
|
site.Runtime = _runtime;
|
||||||
|
site.RenderMode = _runtime + _prerender;
|
||||||
|
reload = true; // needs to be reloaded on server
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (unique && string.IsNullOrEmpty(_defaultalias)) unique = false;
|
site.IsDeleted = (_isdeleted == null ? true : Boolean.Parse(_isdeleted));
|
||||||
}
|
|
||||||
|
|
||||||
if (unique)
|
site.LogoFileId = null;
|
||||||
{
|
var logofileid = _logofilemanager.GetFileId();
|
||||||
var site = await SiteService.GetSiteAsync(PageState.Site.SiteId);
|
if (logofileid != -1)
|
||||||
if (site != null)
|
|
||||||
{
|
{
|
||||||
bool refresh = false;
|
site.LogoFileId = logofileid;
|
||||||
bool reload = false;
|
}
|
||||||
|
int? faviconFieldId = _faviconfilemanager.GetFileId();
|
||||||
site.Name = _name;
|
if (faviconFieldId == -1) faviconFieldId = null;
|
||||||
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
if (site.FaviconFileId != faviconFieldId)
|
||||||
{
|
{
|
||||||
if (site.Runtime != _runtime || site.RenderMode != _runtime + _prerender)
|
site.FaviconFileId = faviconFieldId;
|
||||||
{
|
reload = true; // needs to be reloaded on server
|
||||||
site.Runtime = _runtime;
|
}
|
||||||
site.RenderMode = _runtime + _prerender;
|
if (site.DefaultThemeType != _themetype)
|
||||||
reload = true; // needs to be reloaded on server
|
{
|
||||||
}
|
site.DefaultThemeType = _themetype;
|
||||||
}
|
refresh = true; // needs to be refreshed on client
|
||||||
site.IsDeleted = (_isdeleted == null ? true : Boolean.Parse(_isdeleted));
|
}
|
||||||
|
if (site.DefaultContainerType != _containertype)
|
||||||
site.LogoFileId = null;
|
{
|
||||||
var logofileid = _logofilemanager.GetFileId();
|
site.DefaultContainerType = _containertype;
|
||||||
if (logofileid != -1)
|
refresh = true; // needs to be refreshed on client
|
||||||
{
|
}
|
||||||
site.LogoFileId = logofileid;
|
site.AdminContainerType = _admincontainertype;
|
||||||
}
|
|
||||||
int? faviconFieldId = _faviconfilemanager.GetFileId();
|
if (site.PwaIsEnabled.ToString() != _pwaisenabled)
|
||||||
if (faviconFieldId == -1) faviconFieldId = null;
|
{
|
||||||
if (site.FaviconFileId != faviconFieldId)
|
site.PwaIsEnabled = Boolean.Parse(_pwaisenabled);
|
||||||
{
|
reload = true; // needs to be reloaded on server
|
||||||
site.FaviconFileId = faviconFieldId;
|
}
|
||||||
reload = true; // needs to be reloaded on server
|
int? pwaappiconfileid = _pwaappiconfilemanager.GetFileId();
|
||||||
}
|
if (pwaappiconfileid == -1) pwaappiconfileid = null;
|
||||||
if (site.DefaultThemeType != _themetype)
|
if (site.PwaAppIconFileId != pwaappiconfileid)
|
||||||
{
|
{
|
||||||
site.DefaultThemeType = _themetype;
|
site.PwaAppIconFileId = pwaappiconfileid;
|
||||||
refresh = true; // needs to be refreshed on client
|
reload = true; // needs to be reloaded on server
|
||||||
}
|
}
|
||||||
if (site.DefaultContainerType != _containertype)
|
int? pwasplashiconfileid = _pwasplashiconfilemanager.GetFileId();
|
||||||
{
|
if (pwasplashiconfileid == -1) pwasplashiconfileid = null;
|
||||||
site.DefaultContainerType = _containertype;
|
if (site.PwaSplashIconFileId != pwasplashiconfileid)
|
||||||
refresh = true; // needs to be refreshed on client
|
{
|
||||||
}
|
site.PwaSplashIconFileId = pwasplashiconfileid;
|
||||||
site.AdminContainerType = _admincontainertype;
|
reload = true; // needs to be reloaded on server
|
||||||
|
}
|
||||||
if (site.PwaIsEnabled.ToString() != _pwaisenabled)
|
|
||||||
{
|
site = await SiteService.UpdateSiteAsync(site);
|
||||||
site.PwaIsEnabled = Boolean.Parse(_pwaisenabled);
|
|
||||||
reload = true; // needs to be reloaded on server
|
var settings = await SettingService.GetSiteSettingsAsync(site.SiteId);
|
||||||
}
|
settings = SettingService.SetSetting(settings, "SMTPHost", _smtphost, true);
|
||||||
int? pwaappiconfileid = _pwaappiconfilemanager.GetFileId();
|
settings = SettingService.SetSetting(settings, "SMTPPort", _smtpport, true);
|
||||||
if (pwaappiconfileid == -1) pwaappiconfileid = null;
|
settings = SettingService.SetSetting(settings, "SMTPSSL", _smtpssl, true);
|
||||||
if (site.PwaAppIconFileId != pwaappiconfileid)
|
settings = SettingService.SetSetting(settings, "SMTPUsername", _smtpusername, true);
|
||||||
{
|
settings = SettingService.SetSetting(settings, "SMTPPassword", _smtppassword, true);
|
||||||
site.PwaAppIconFileId = pwaappiconfileid;
|
settings = SettingService.SetSetting(settings, "SMTPSender", _smtpsender, true);
|
||||||
reload = true; // needs to be reloaded on server
|
settings = SettingService.SetSetting(settings, "NotificationRetention", _retention, true);
|
||||||
}
|
await SettingService.UpdateSiteSettingsAsync(settings, site.SiteId);
|
||||||
int? pwasplashiconfileid = _pwasplashiconfilemanager.GetFileId();
|
|
||||||
if (pwasplashiconfileid == -1) pwasplashiconfileid = null;
|
await logger.LogInformation("Site Settings Saved {Site}", site);
|
||||||
if (site.PwaSplashIconFileId != pwasplashiconfileid)
|
|
||||||
{
|
if (refresh || reload)
|
||||||
site.PwaSplashIconFileId = pwasplashiconfileid;
|
{
|
||||||
reload = true; // needs to be reloaded on server
|
NavigationManager.NavigateTo(NavigateUrl(true), reload); // refresh/reload
|
||||||
}
|
}
|
||||||
|
else
|
||||||
site = await SiteService.UpdateSiteAsync(site);
|
{
|
||||||
|
AddModuleMessage(Localizer["Success.Settings.SaveSite"], MessageType.Success);
|
||||||
var settings = await SettingService.GetSiteSettingsAsync(site.SiteId);
|
await interop.ScrollTo(0, 0, "smooth");
|
||||||
settings = SettingService.SetSetting(settings, "SMTPHost", _smtphost, true);
|
|
||||||
settings = SettingService.SetSetting(settings, "SMTPPort", _smtpport, true);
|
|
||||||
settings = SettingService.SetSetting(settings, "SMTPSSL", _smtpssl, true);
|
|
||||||
settings = SettingService.SetSetting(settings, "SMTPUsername", _smtpusername, true);
|
|
||||||
settings = SettingService.SetSetting(settings, "SMTPPassword", _smtppassword, true);
|
|
||||||
settings = SettingService.SetSetting(settings, "SMTPSender", _smtpsender, true);
|
|
||||||
settings = SettingService.SetSetting(settings, "NotificationRetention", _retention, true);
|
|
||||||
await SettingService.UpdateSiteSettingsAsync(settings, site.SiteId);
|
|
||||||
|
|
||||||
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
|
||||||
{
|
|
||||||
var names = _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
|
|
||||||
.Select(sValue => sValue.Trim()).ToArray();
|
|
||||||
foreach (Alias alias in _aliases)
|
|
||||||
{
|
|
||||||
if (!names.Contains(alias.Name.Trim()))
|
|
||||||
{
|
|
||||||
await AliasService.DeleteAliasAsync(alias.AliasId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (string name in names)
|
|
||||||
{
|
|
||||||
var alias = _aliases.Find(item => item.Name.Trim() == name);
|
|
||||||
if (alias == null)
|
|
||||||
{
|
|
||||||
alias = new Alias();
|
|
||||||
alias.Name = name;
|
|
||||||
alias.TenantId = site.TenantId;
|
|
||||||
alias.SiteId = site.SiteId;
|
|
||||||
alias.IsDefault = (name == _defaultalias);
|
|
||||||
await AliasService.AddAliasAsync(alias);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (alias.Name != name || alias.IsDefault != (alias.Name.Trim() == _defaultalias))
|
|
||||||
{
|
|
||||||
alias.Name = name;
|
|
||||||
alias.IsDefault = (name == _defaultalias);
|
|
||||||
await AliasService.UpdateAliasAsync(alias);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await GetAliases();
|
|
||||||
}
|
|
||||||
|
|
||||||
await logger.LogInformation("Site Settings Saved {Site}", site);
|
|
||||||
|
|
||||||
if (refresh || reload)
|
|
||||||
{
|
|
||||||
NavigationManager.NavigateTo(NavigateUrl(true), reload); // refresh/reload
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AddModuleMessage(Localizer["Success.Settings.SaveSite"], MessageType.Success);
|
|
||||||
await interop.ScrollTo(0, 0, "smooth");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else // deuplicate alias or default alias not specified
|
|
||||||
{
|
|
||||||
AddModuleMessage(Localizer["Message.Aliases.Taken"], MessageType.Warning);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -637,20 +605,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task GetAliases()
|
|
||||||
{
|
|
||||||
_urls = string.Empty;
|
|
||||||
_defaultalias = string.Empty;
|
|
||||||
_aliases = await AliasService.GetAliasesAsync();
|
|
||||||
_aliases = _aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Site.TenantId).OrderBy(item => item.AliasId).ToList();
|
|
||||||
foreach (Alias alias in _aliases)
|
|
||||||
{
|
|
||||||
_urls += (_urls == string.Empty) ? alias.Name.Trim() : ", " + alias.Name.Trim();
|
|
||||||
if (alias.IsDefault && string.IsNullOrEmpty(_defaultalias)) _defaultalias = alias.Name.Trim();
|
|
||||||
}
|
|
||||||
if (string.IsNullOrEmpty(_defaultalias)) _defaultalias = _aliases.First().Name.Trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ToggleSMTPPassword()
|
private void ToggleSMTPPassword()
|
||||||
{
|
{
|
||||||
if (_smtppasswordtype == "password")
|
if (_smtppasswordtype == "password")
|
||||||
|
@ -664,4 +618,84 @@
|
||||||
_togglesmtppassword = SharedLocalizer["ShowPassword"];
|
_togglesmtppassword = SharedLocalizer["ShowPassword"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task GetAliases()
|
||||||
|
{
|
||||||
|
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
||||||
|
{
|
||||||
|
_aliases = await AliasService.GetAliasesAsync();
|
||||||
|
_aliases = _aliases.Where(item => item.SiteId == PageState.Site.SiteId && item.TenantId == PageState.Site.TenantId).OrderBy(item => item.AliasId).ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddAlias()
|
||||||
|
{
|
||||||
|
_aliases.Add(new Alias { AliasId = 0, Name = "", IsDefault = false });
|
||||||
|
_aliasid = 0;
|
||||||
|
_aliasname = "";
|
||||||
|
_defaultalias = "False";
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EditAlias(Alias alias)
|
||||||
|
{
|
||||||
|
_aliasid = alias.AliasId;
|
||||||
|
_aliasname = alias.Name;
|
||||||
|
_defaultalias = alias.IsDefault.ToString();
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task DeleteAlias(Alias alias)
|
||||||
|
{
|
||||||
|
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
||||||
|
{
|
||||||
|
await AliasService.DeleteAliasAsync(alias.AliasId);
|
||||||
|
await GetAliases();
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SaveAlias()
|
||||||
|
{
|
||||||
|
if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(_aliasname))
|
||||||
|
{
|
||||||
|
var aliases = await AliasService.GetAliasesAsync();
|
||||||
|
var alias = aliases.Where(item => item.Name == _aliasname).FirstOrDefault();
|
||||||
|
bool unique = (alias == null || alias.AliasId == _aliasid);
|
||||||
|
if (unique)
|
||||||
|
{
|
||||||
|
if (_aliasid == 0)
|
||||||
|
{
|
||||||
|
alias = new Alias { SiteId = PageState.Site.SiteId, TenantId = PageState.Site.TenantId, Name = _aliasname, IsDefault = bool.Parse(_defaultalias) };
|
||||||
|
await AliasService.AddAliasAsync(alias);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
alias = _aliases.Single(item => item.AliasId == _aliasid);
|
||||||
|
alias.Name = _aliasname;
|
||||||
|
alias.IsDefault = bool.Parse(_defaultalias);
|
||||||
|
await AliasService.UpdateAliasAsync(alias);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // duplicate alias
|
||||||
|
{
|
||||||
|
AddModuleMessage(Localizer["Message.Aliases.Taken"], MessageType.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await GetAliases();
|
||||||
|
_aliasid = -1;
|
||||||
|
_aliasname = "";
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task CancelAlias()
|
||||||
|
{
|
||||||
|
await GetAliases();
|
||||||
|
_aliasid = -1;
|
||||||
|
_aliasname = "";
|
||||||
|
StateHasChanged();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,7 +142,7 @@
|
||||||
<value>Site Settings Saved</value>
|
<value>Site Settings Saved</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Message.Aliases.Taken" xml:space="preserve">
|
<data name="Message.Aliases.Taken" xml:space="preserve">
|
||||||
<value>The Default Alias Has Not Been Specified Or An Alias Was Specified That Has Already Been Used For Another Site</value>
|
<value>An Alias Was Specified That Has Already Been Used For Another Site</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Message.Required.SiteName" xml:space="preserve">
|
<data name="Message.Required.SiteName" xml:space="preserve">
|
||||||
<value>You Must Provide A Site Name, Alias, And Default Theme/Container</value>
|
<value>You Must Provide A Site Name, Alias, And Default Theme/Container</value>
|
||||||
|
@ -324,4 +324,13 @@
|
||||||
<data name="Aliases.Heading" xml:space="preserve">
|
<data name="Aliases.Heading" xml:space="preserve">
|
||||||
<value>Aliases</value>
|
<value>Aliases</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="AliasName" xml:space="preserve">
|
||||||
|
<value>Name</value>
|
||||||
|
</data>
|
||||||
|
<data name="AliasDefault" xml:space="preserve">
|
||||||
|
<value>Default?</value>
|
||||||
|
</data>
|
||||||
|
<data name="Confirm.Alias.Delete" xml:space="preserve">
|
||||||
|
<value>Are You Sure You Wish To Delete {0}?</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
Loading…
Reference in New Issue
Block a user