Compare commits

...

57 Commits

Author SHA1 Message Date
Chris Collins
c8ed7eff7e Merge branch 'prerel-1.7.0.1' into 'main'
Detect changes to cron schedules

See merge request personal/wedding-share!83
2025-08-03 17:59:57 +01:00
Cirx08
3943bf3dc6 Detect changes to cron schedules 2025-08-03 17:57:15 +01:00
Chris Collins
0714b93dc9 Merge branch 'prerel-1.6.11.2' into 'main'
Prerel 1.7.0

See merge request personal/wedding-share!82
2025-08-01 17:36:42 +01:00
Chris Collins
d391709be6 Prerel 1.7.0 2025-08-01 17:36:42 +01:00
Chris Collins
adb9d5242e Merge branch 'prerel-1.6.11.1' into 'main'
- Fix to remove async from RequiresSecretKeyAttribute as it was allowing the...

See merge request personal/wedding-share!81
2025-07-30 21:24:16 +01:00
Chris Collins
b72e493675 - Fix to remove async from RequiresSecretKeyAttribute as it was allowing the... 2025-07-30 21:24:15 +01:00
Chris Collins
907c460d97 Merge branch 'prerel-1.6.11' into 'main'
Prerel 1.6.11

See merge request personal/wedding-share!80
2025-07-29 22:03:24 +01:00
Chris Collins
98572919b2 Prerel 1.6.11 2025-07-29 22:03:24 +01:00
Chris Collins
febd844c91 Merge branch 'prerel-1.6.10.8' into 'main'
Added cookie consent when policy is disabled

See merge request personal/wedding-share!79
2025-07-18 21:06:19 +01:00
Cirx08
bda3c61f7f Added cookie consent when policy is disabled 2025-07-18 21:04:01 +01:00
Chris Collins
254734bdc1 Merge branch 'prerel-1.6.10.7' into 'main'
1.6.10.7

See merge request personal/wedding-share!78
2025-07-18 17:03:05 +01:00
Chris Collins
829281b616 1.6.10.7 2025-07-18 17:03:05 +01:00
Chris Collins
dff86d9232 Merge branch 'prerel-1.6.10.6' into 'main'
Prerel 1.6.10.6

See merge request personal/wedding-share!77
2025-07-18 11:45:26 +01:00
Chris Collins
50668efc1b Prerel 1.6.10.6 2025-07-18 11:45:26 +01:00
Chris Collins
845634e8f1 Merge branch 'prerel-1.6.10.5' into 'main'
Localization fixes

See merge request personal/wedding-share!76
2025-07-15 20:27:49 +01:00
Cirx08
9ad2253972 Localization fixes 2025-07-15 20:03:56 +01:00
Chris Collins
a155c3a442 Merge branch 'prerel-1.6.10.4' into 'main'
Prerel 1.6.10.4

See merge request personal/wedding-share!75
2025-07-15 17:41:07 +01:00
Chris Collins
4ac9622374 Prerel 1.6.10.4 2025-07-15 17:41:07 +01:00
Chris Collins
c59e2bb3b9 Added gallery override to IncludeCulture on gallery page 2025-07-15 16:36:34 +01:00
Chris Collins
e6bb583601 Merge branch 'prerel-1.6.10.2' into 'main'
Fix for QR code culture setting

See merge request personal/wedding-share!74
2025-07-15 16:00:13 +01:00
Chris Collins
a7f1b0c906 Fix for QR code culture setting 2025-07-15 15:52:03 +01:00
Chris Collins
1607961543 Bumped version number 2025-07-15 10:42:45 +01:00
Christopher Collins
e1d2e5e4d9 Bumped version number 2025-07-15 10:32:12 +01:00
Christopher Collins
a30eb683d6 Fixes for gallery creation and SQLite connection test 2025-07-15 09:59:35 +01:00
Chris Collins
e454d46e49 Merge branch 'prerel-1.6.9' into 'main'
Migrated settings to Ids instead of gallery name

See merge request personal/wedding-share!69
2025-07-14 19:22:39 +01:00
Chris Collins
067f631c6c Migrated settings to Ids instead of gallery name 2025-07-14 19:22:38 +01:00
Chris Collins
3b36854a21 Merge branch 'prerel-1.6.9.3' into 'main'
Halt application if DB connection issues

See merge request personal/wedding-share!73
2025-07-13 10:51:18 +01:00
Cirx08
421d8afa36 Halt application if DB connection issues 2025-07-13 10:44:17 +01:00
Chris Collins
5ad8ccdf2f Merge branch 'prerel-1.6.9.2' into 'main'
Bug fix for MySQL DBUP init scripts

See merge request personal/wedding-share!72
2025-07-12 18:02:46 +01:00
Cirx08
313152ed92 Bug fix for MySQL DBUP init scripts 2025-07-12 17:52:55 +01:00
Chris Collins
e5c6578264 Added alias to MySQL query 2025-07-11 16:11:46 +01:00
Chris Collins
9e7ff7fff7 Merge branch 'prerel-1.6.8.5' into 'main'
Prerel 1.6.9

See merge request personal/wedding-share!71
2025-07-09 21:45:14 +01:00
Chris Collins
f0f57cf093 Prerel 1.6.9 2025-07-09 21:45:14 +01:00
Chris Collins
30db4523f4 Merge branch 'prerel-1.6.8.4' into 'main'
Allow special characters in identity while preventing XSS

See merge request personal/wedding-share!70
2025-07-07 21:55:07 +01:00
Chris Collins
894b4b37e7 Allow special characters in identity while preventing XSS 2025-07-07 21:55:07 +01:00
Chris Collins
17832f1ac1 Merge branch 'prerel-1.6.8.3' into 'main'
Simplified file uploader

See merge request personal/wedding-share!68
2025-06-27 16:49:43 +01:00
Cirx08
1adbb294aa Simplified file uploader 2025-06-25 21:16:18 +01:00
Chris Collins
804ab650d7 Merge branch 'prerel-1.6.8.2' into 'main'
Updated IT translations

See merge request personal/wedding-share!67
2025-06-18 21:19:46 +01:00
Cirx08
efd5dd9bd5 Updated IT translations 2025-06-18 21:15:48 +01:00
Chris Collins
af13edbf0c Merge branch 'prerel-1.6.8.1' into 'main'
Add support for older instances using the Admin keys

See merge request personal/wedding-share!66
2025-06-16 22:42:53 +01:00
Cirx08
bb79429079 Add support for older instances using the Admin keys 2025-06-16 22:40:46 +01:00
Chris Collins
aa1debcba3 Merge branch 'prerel-30-organise-thumbnails-in-folders' into 'main'
Moved thumbnails directory

See merge request personal/wedding-share!65
2025-06-14 11:43:02 +01:00
Chris Collins
dd757c2aca Moved thumbnails directory 2025-06-14 11:43:02 +01:00
Chris Collins
aeb53708de Merge branch 'prerel-italian-translations' into 'main'
Updated translations provided by CoffeePerry

See merge request personal/wedding-share!64
2025-06-11 21:10:41 +01:00
Chris Collins
aac4937f35 Updated translations provided by CoffeePerry 2025-06-11 21:10:41 +01:00
Chris Collins
d0a58d5d08 Merge branch 'prerel-29-migrate-admin-controller-to-account-controller' into 'main'
Replaced the Admin controller with the Account controller

See merge request personal/wedding-share!63
2025-06-08 20:16:37 +01:00
Cirx08
aa54385ce2 Replaced the Admin controller with the Account controller 2025-06-08 17:05:35 +01:00
Chris Collins
36d0e4ac6a Merge branch 'prerel-1.6.6.8' into 'main'
Updated `Gallery_Key_Placeholder` value to be less confusing

See merge request personal/wedding-share!62
2025-06-03 15:02:16 +01:00
Chris
db5f811ae4 Updated Gallery_Key_Placeholder value to be less confusing 2025-06-03 14:59:59 +01:00
Chris Collins
a056596325 Bumped version number to 1.6.6.7. 2025-05-22 10:40:31 +01:00
Cirx08
d8edf39aab Updated identity check text to prevent wrapping 2025-05-21 18:49:37 +01:00
Cirx08
33d0b6be0d Added sponsors link options to popup 2025-05-20 10:37:55 +01:00
Cirx08
7b6bc83953 Fixed sponsors list display issues 2025-05-20 10:17:29 +01:00
Cirx08
ec71b8a43a Removed Github profile link from BuyMeACoffee sponsor cards 2025-05-19 23:22:20 +01:00
Cirx08
84ee089e3d Changed "Identity Check" to "Guest Name" and increased default upload size from 10MB to 50MB 2025-05-19 15:47:28 +01:00
Cirx08
6a330a7215 Bumped version number 2025-05-19 15:27:15 +01:00
Cirx08
d6bb68ec5d Prepend filename with uploader name 2025-05-19 15:26:27 +01:00
376 changed files with 13964 additions and 2808 deletions

1
.gitignore vendored
View File

@@ -25,3 +25,4 @@
/WeddingShare/wwwroot/logos
/WeddingShare/wwwroot/banners
/WeddingShare/wwwroot/images/custom_resources
/WeddingShare/config/wedding-share.db.bak

View File

@@ -1,3 +1,4 @@
using System.Data.Common;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@@ -40,25 +41,20 @@ namespace WeddingShare.UnitTests.Tests.Helpers
{
_env.WebRootPath.Returns("/app/wwwroot");
_database.GetGallery("default").Returns(Task.FromResult<GalleryModel?>(new GalleryModel()
{
Id = 1,
Name = "default",
SecretKey = "password",
ApprovedItems = 32,
PendingItems = 50,
TotalItems = 72
}));
_database.GetGallery("blaa").Returns(Task.FromResult<GalleryModel?>(new GalleryModel()
{
Id = 2,
Name = "blaa",
SecretKey = "456789",
ApprovedItems = 2,
PendingItems = 1,
TotalItems = 3
}));
_database.GetGallery("missing").Returns(Task.FromResult<GalleryModel?>(null));
var mockData = GetMockData();
_database.GetGallery(1).Returns(Task.FromResult<GalleryModel?>(mockData["default"]));
_database.GetGallery(2).Returns(Task.FromResult<GalleryModel?>(mockData["blaa"]));
_database.GetGallery(3).Returns(Task.FromResult<GalleryModel?>(null));
_database.GetGalleryId("default").Returns(Task.FromResult<int?>(mockData["default"].Id));
_database.GetGalleryId("blaa").Returns(Task.FromResult<int?>(mockData["blaa"].Id));
_database.GetGalleryId("missing").Returns(Task.FromResult<int?>(null));
_database.GetGalleryIdByName("default").Returns(Task.FromResult<int?>(mockData["default"].Id));
_database.GetGalleryIdByName("blaa").Returns(Task.FromResult<int?>(mockData["blaa"].Id));
_database.GetGalleryIdByName("missing").Returns(Task.FromResult<int?>(null));
_database.AddGallery(Arg.Any<GalleryModel>()).Returns(Task.FromResult<GalleryModel?>(new GalleryModel()
{
Id = 101,
@@ -76,17 +72,17 @@ namespace WeddingShare.UnitTests.Tests.Helpers
_database.GetAllGalleryItems(Arg.Any<int>(), GalleryItemState.Approved, Arg.Any<MediaType>(), Arg.Any<ImageOrientation>(), Arg.Any<GalleryGroup>(), Arg.Any<GalleryOrder>(), Arg.Any<int>(), Arg.Any<int>()).Returns(Task.FromResult(MockData.MockGalleryItems(10, 1, GalleryItemState.Approved)));
_database.GetGalleryItemByChecksum(Arg.Any<int>(), Arg.Any<string>()).ReturnsNull();
_settings.GetOrDefault(Settings.Gallery.SecretKey, Arg.Any<string>(), Arg.Any<string>()).Returns("password");
_settings.GetOrDefault(Settings.Gallery.SecretKey, Arg.Any<string>(), "blaa").Returns("456789");
_settings.GetOrDefault(Settings.Gallery.SecretKey, Arg.Any<string>(), "missing").Returns("123456");
_settings.GetOrDefault(Settings.Gallery.Upload, Arg.Any<bool>(), Arg.Any<string>()).Returns(true);
_settings.GetOrDefault(Settings.Gallery.Download, Arg.Any<bool>(), Arg.Any<string>()).Returns(true);
_settings.GetOrDefault(Settings.Gallery.UploadPeriod, Arg.Any<string>(), Arg.Any<string>()).Returns("1970-01-01 00:00:00");
_settings.GetOrDefault(Settings.Gallery.PreventDuplicates, Arg.Any<bool>(), Arg.Any<string>()).Returns(true);
_settings.GetOrDefault(Settings.Gallery.DefaultView, Arg.Any<int>(), Arg.Any<string>()).Returns((int)ViewMode.Default);
_settings.GetOrDefault(Settings.Gallery.AllowedFileTypes, Arg.Any<string>(), Arg.Any<string>()).Returns(".jpg,.jpeg,.png,.mp4,.mov");
_settings.GetOrDefault(Settings.Gallery.RequireReview, Arg.Any<bool>(), Arg.Any<string>()).Returns(true);
_settings.GetOrDefault(Settings.Gallery.MaxFileSizeMB, Arg.Any<int>(), Arg.Any<string>()).Returns(10);
_settings.GetOrDefault(Settings.Gallery.SecretKey, Arg.Any<string>(), Arg.Any<int>()).Returns("password");
_settings.GetOrDefault(Settings.Gallery.SecretKey, Arg.Any<string>(), 2).Returns("456789");
_settings.GetOrDefault(Settings.Gallery.SecretKey, Arg.Any<string>(), 101).Returns("123456");
_settings.GetOrDefault(Settings.Gallery.Upload, Arg.Any<bool>(), Arg.Any<int>()).Returns(true);
_settings.GetOrDefault(Settings.Gallery.Download, Arg.Any<bool>(), Arg.Any<int>()).Returns(true);
_settings.GetOrDefault(Settings.Gallery.UploadPeriod, Arg.Any<string>(), Arg.Any<int>()).Returns("1970-01-01 00:00:00");
_settings.GetOrDefault(Settings.Gallery.PreventDuplicates, Arg.Any<bool>(), Arg.Any<int>()).Returns(true);
_settings.GetOrDefault(Settings.Gallery.DefaultView, Arg.Any<int>(), Arg.Any<int>()).Returns((int)ViewMode.Default);
_settings.GetOrDefault(Settings.Gallery.AllowedFileTypes, Arg.Any<string>(), Arg.Any<int>()).Returns(".jpg,.jpeg,.png,.mp4,.mov");
_settings.GetOrDefault(Settings.Gallery.RequireReview, Arg.Any<bool>(), Arg.Any<int>()).Returns(true);
_settings.GetOrDefault(Settings.Gallery.MaxFileSizeMB, Arg.Any<int>(), Arg.Any<int>()).Returns(10);
_file.GetChecksum(Arg.Any<string>()).Returns(Guid.NewGuid().ToString());
@@ -95,10 +91,10 @@ namespace WeddingShare.UnitTests.Tests.Helpers
_localizer[Arg.Any<string>()].Returns(new LocalizedString("UnitTest", "UnitTest"));
}
[TestCase(DeviceType.Desktop, 1, "default", "password", ViewMode.Default, GalleryGroup.None, GalleryOrder.Descending, true)]
[TestCase(DeviceType.Mobile, 2, "blaa", "456789", ViewMode.Presentation, GalleryGroup.Date, GalleryOrder.Ascending, true)]
[TestCase(DeviceType.Tablet, 101, "missing", "123456", ViewMode.Slideshow, GalleryGroup.Uploader, GalleryOrder.Ascending, false)]
public async Task GalleryController_Index(DeviceType deviceType, int id, string name, string? key, ViewMode? mode, GalleryGroup group, GalleryOrder order, bool existing)
[TestCase(DeviceType.Desktop, 1, "default", "default", "password", ViewMode.Default, GalleryGroup.None, GalleryOrder.Descending, true)]
[TestCase(DeviceType.Mobile, 2, "blaa", "blaa", "456789", ViewMode.Presentation, GalleryGroup.Date, GalleryOrder.Ascending, true)]
[TestCase(DeviceType.Tablet, 101, "missing", "missing", "123456", ViewMode.Slideshow, GalleryGroup.Uploader, GalleryOrder.Ascending, false)]
public async Task GalleryController_Index(DeviceType deviceType, int id, string? identifier, string? name, string? key, ViewMode? mode, GalleryGroup group, GalleryOrder order, bool existing)
{
_deviceDetector.ParseDeviceType(Arg.Any<string>()).Returns(deviceType);
_settings.GetOrDefault(Settings.Basic.SingleGalleryMode, Arg.Any<bool>()).Returns(false);
@@ -109,42 +105,61 @@ namespace WeddingShare.UnitTests.Tests.Helpers
if (existing)
{
ViewResult actual = (ViewResult)await controller.Index(name, key, mode, group, order);
ViewResult actual = (ViewResult)await controller.Index(identifier, name, key, mode, group, order);
Assert.That(actual, Is.TypeOf<ViewResult>());
Assert.That(actual?.Model, Is.Not.Null);
PhotoGallery model = (PhotoGallery)actual.Model;
Assert.That(model?.GalleryId, Is.EqualTo(id));
Assert.That(model?.GalleryName, Is.EqualTo(name));
Assert.That(model?.Gallery?.Id, Is.EqualTo(id));
Assert.That(model?.Gallery?.Identifier, Is.EqualTo(identifier));
Assert.That(model?.Gallery?.Name, Is.EqualTo(name));
Assert.That(model?.SecretKey, Is.EqualTo(key));
Assert.That(model.ViewMode, Is.EqualTo(mode));
Assert.That(model?.FileUploader?.GalleryId, Is.EqualTo(name));
Assert.That(model?.FileUploader?.SecretKey, Is.EqualTo(key));
Assert.That(model?.FileUploader?.UploadUrl, Is.EqualTo("/Gallery/UploadImage"));
}
else
{
RedirectToActionResult actual = (RedirectToActionResult)await controller.Index(name, key, mode, group, order);
RedirectToActionResult actual = (RedirectToActionResult)await controller.Index(identifier, name, key, mode, group, order);
Assert.That(actual, Is.TypeOf<RedirectToActionResult>());
}
}
[TestCase(true, true)]
[TestCase(false, false)]
public async Task GalleryController_UploadDisabled(bool disabled, bool expected)
[TestCase(null, "default", "default")]
[TestCase("default", null, "default")]
[TestCase("default", "blaa", "blaa")]
public async Task GalleryController_Index_GetByIdentifier(string? id, string? identifier, string expected)
{
_deviceDetector.ParseDeviceType(Arg.Any<string>()).Returns(DeviceType.Desktop);
_settings.GetOrDefault(Settings.Basic.SingleGalleryMode, Arg.Any<bool>()).Returns(false);
_settings.GetOrDefault(Settings.Gallery.Upload, Arg.Any<bool>(), Arg.Any<string>()).Returns(disabled);
_settings.GetOrDefault(Settings.Basic.GuestGalleryCreation, Arg.Any<bool>()).Returns(false);
var controller = new GalleryController(_env, _settings, _database, _file, _deviceDetector, _image, _notification, _encryption, _url, _logger, _localizer);
controller.ControllerContext.HttpContext = MockData.MockHttpContext();
ViewResult actual = (ViewResult)await controller.Index("default", "password", ViewMode.Default, GalleryGroup.None, GalleryOrder.Descending);
ViewResult actual = (ViewResult)await controller.Index(id, identifier, "password", ViewMode.Default, GalleryGroup.None, GalleryOrder.Random);
Assert.That(actual, Is.TypeOf<ViewResult>());
Assert.That(actual?.Model, Is.Not.Null);
PhotoGallery model = (PhotoGallery)actual.Model;
Assert.That(model?.FileUploader, expected ? Is.Not.Null : Is.Null);
Assert.That(model?.Gallery?.Identifier, Is.EqualTo(expected));
}
[TestCase(true, true)]
[TestCase(false, false)]
public async Task GalleryController_UploadDisabled(bool enabled, bool expected)
{
_deviceDetector.ParseDeviceType(Arg.Any<string>()).Returns(DeviceType.Desktop);
_settings.GetOrDefault(Settings.Basic.SingleGalleryMode, Arg.Any<bool>()).Returns(false);
_settings.GetOrDefault(Settings.Gallery.Upload, Arg.Any<bool>(), Arg.Any<int>()).Returns(enabled);
var controller = new GalleryController(_env, _settings, _database, _file, _deviceDetector, _image, _notification, _encryption, _url, _logger, _localizer);
controller.ControllerContext.HttpContext = MockData.MockHttpContext();
ViewResult actual = (ViewResult)await controller.Index("default", "default", "password", ViewMode.Default, GalleryGroup.None, GalleryOrder.Descending);
Assert.That(actual, Is.TypeOf<ViewResult>());
Assert.That(actual?.Model, Is.Not.Null);
PhotoGallery model = (PhotoGallery)actual.Model;
Assert.That(model?.UploadActivated, Is.EqualTo(expected));
}
[TestCase("1970-01-01 00:00", true)]
@@ -156,17 +171,17 @@ namespace WeddingShare.UnitTests.Tests.Helpers
{
_deviceDetector.ParseDeviceType(Arg.Any<string>()).Returns(DeviceType.Desktop);
_settings.GetOrDefault(Settings.Basic.SingleGalleryMode, Arg.Any<bool>()).Returns(false);
_settings.GetOrDefault(Settings.Gallery.UploadPeriod, Arg.Any<string>(), Arg.Any<string>()).Returns(uploadPeriod);
_settings.GetOrDefault(Settings.Gallery.UploadPeriod, Arg.Any<string>(), Arg.Any<int>()).Returns(uploadPeriod);
var controller = new GalleryController(_env, _settings, _database, _file, _deviceDetector, _image, _notification, _encryption, _url, _logger, _localizer);
controller.ControllerContext.HttpContext = MockData.MockHttpContext();
ViewResult actual = (ViewResult)await controller.Index("default", "password", ViewMode.Default, GalleryGroup.None, GalleryOrder.Descending);
ViewResult actual = (ViewResult)await controller.Index("default", "default", "password", ViewMode.Default, GalleryGroup.None, GalleryOrder.Descending);
Assert.That(actual, Is.TypeOf<ViewResult>());
Assert.That(actual?.Model, Is.Not.Null);
PhotoGallery model = (PhotoGallery)actual.Model;
Assert.That(model?.FileUploader, expected ? Is.Not.Null : Is.Null);
Assert.That(model?.UploadActivated, Is.EqualTo(expected));
}
[TestCase(DeviceType.Desktop, ViewMode.Default, GalleryGroup.None, GalleryOrder.Descending)]
@@ -180,17 +195,16 @@ namespace WeddingShare.UnitTests.Tests.Helpers
var controller = new GalleryController(_env, _settings, _database, _file, _deviceDetector, _image, _notification, _encryption, _url, _logger, _localizer);
controller.ControllerContext.HttpContext = MockData.MockHttpContext();
ViewResult actual = (ViewResult)await controller.Index("default", "password", mode, group, order);
ViewResult actual = (ViewResult)await controller.Index("default", "default", "password", mode, group, order);
Assert.That(actual, Is.TypeOf<ViewResult>());
Assert.That(actual?.Model, Is.Not.Null);
PhotoGallery model = (PhotoGallery)actual.Model;
Assert.That(model?.GalleryId, Is.EqualTo(1));
Assert.That(model?.GalleryName, Is.EqualTo("default"));
Assert.That(model?.Gallery?.Id, Is.EqualTo(1));
Assert.That(model?.Gallery?.Identifier, Is.EqualTo("default"));
Assert.That(model?.Gallery?.Name, Is.EqualTo("default"));
Assert.That(model?.SecretKey, Is.EqualTo("password"));
Assert.That(model.ViewMode, Is.EqualTo(mode));
Assert.That(model?.FileUploader?.GalleryId, Is.EqualTo("default"));
Assert.That(model?.FileUploader?.SecretKey, Is.EqualTo("password"));
Assert.That(model?.FileUploader?.UploadUrl, Is.EqualTo("/Gallery/UploadImage"));
}
[TestCase(true, 1, null)]
@@ -215,7 +229,7 @@ namespace WeddingShare.UnitTests.Tests.Helpers
session: session,
form: new Dictionary<string, StringValues>
{
{ "Id", "default" },
{ "Id", "1" },
{ "SecretKey", "password" }
},
files: files);
@@ -245,7 +259,7 @@ namespace WeddingShare.UnitTests.Tests.Helpers
session: session,
form: new Dictionary<string, StringValues>
{
{ "Id", "default" },
{ "Id", "1" },
{ "SecretKey", "password" }
},
files: files);
@@ -283,7 +297,7 @@ namespace WeddingShare.UnitTests.Tests.Helpers
var controller = new GalleryController(_env, _settings, _database, _file, _deviceDetector, _image, _notification, _encryption, _url, _logger, _localizer);
controller.ControllerContext.HttpContext = MockData.MockHttpContext(form: new Dictionary<string, StringValues>
{
{ "Id", "default" },
{ "Id", "1" },
{ "SecretKey", key }
});
@@ -318,7 +332,7 @@ namespace WeddingShare.UnitTests.Tests.Helpers
var controller = new GalleryController(_env, _settings, _database, _file, _deviceDetector, _image, _notification, _encryption, _url, _logger, _localizer);
controller.ControllerContext.HttpContext = MockData.MockHttpContext(form: new Dictionary<string, StringValues>
{
{ "Id", "default" },
{ "Id", "1" },
{ "SecretKey", "password" }
});
@@ -337,7 +351,7 @@ namespace WeddingShare.UnitTests.Tests.Helpers
controller.ControllerContext.HttpContext = MockData.MockHttpContext(
form: new Dictionary<string, StringValues>
{
{ "Id", "default" },
{ "Id", "1" },
{ "SecretKey", "password" }
},
files: new FormFileCollection() {
@@ -359,7 +373,7 @@ namespace WeddingShare.UnitTests.Tests.Helpers
controller.ControllerContext.HttpContext = MockData.MockHttpContext(
form: new Dictionary<string, StringValues>
{
{ "Id", "default" },
{ "Id", "1" },
{ "SecretKey", "password" }
},
files: new FormFileCollection() {
@@ -373,5 +387,49 @@ namespace WeddingShare.UnitTests.Tests.Helpers
Assert.That(JsonResponseHelper.GetPropertyValue(actual.Value, "uploaded", 0), Is.EqualTo(0));
Assert.That(JsonResponseHelper.GetPropertyValue(actual.Value, "errors", new List<string>()).Count, Is.GreaterThan(0));
}
private IDictionary<string, GalleryModel> GetMockData()
{
return new Dictionary<string, GalleryModel>()
{
{
"default", new GalleryModel()
{
Id = 1,
Identifier = "default",
Name = "default",
SecretKey = "password",
ApprovedItems = 32,
PendingItems = 50,
TotalItems = 72
}
},
{
"blaa", new GalleryModel()
{
Id = 2,
Identifier = "blaa",
Name = "blaa",
SecretKey = "456789",
ApprovedItems = 2,
PendingItems = 1,
TotalItems = 3
}
},
{
"missing", new GalleryModel()
{
Id = 101,
Identifier = "missing",
Name = "missing",
SecretKey = "123456",
ApprovedItems = 0,
PendingItems = 0,
TotalItems = 0,
Owner = 0
}
}
};
}
}
}

View File

@@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using WeddingShare.Constants;
@@ -16,6 +17,7 @@ namespace WeddingShare.UnitTests.Tests.Helpers
private readonly ISettingsHelper _settings = Substitute.For<ISettingsHelper>();
private readonly IDatabaseHelper _database = Substitute.For<IDatabaseHelper>();
private readonly IDeviceDetector _deviceDetector = Substitute.For<IDeviceDetector>();
private readonly IAuditHelper _audit = Substitute.For<IAuditHelper>();
private readonly ILogger<HomeController> _logger = Substitute.For<ILogger<HomeController>>();
private readonly IStringLocalizer<Lang.Translations> _localizer = Substitute.For<IStringLocalizer<Lang.Translations>>();
@@ -40,9 +42,9 @@ namespace WeddingShare.UnitTests.Tests.Helpers
{
_deviceDetector.ParseDeviceType(Arg.Any<string>()).Returns(deviceType);
_settings.GetOrDefault(Settings.Basic.SingleGalleryMode, Arg.Any<bool>()).Returns(singleGalleryMode);
_settings.GetOrDefault(Settings.Gallery.SecretKey, Arg.Any<string>(), Arg.Any<string>()).Returns(secretKey);
_settings.GetOrDefault(Settings.Gallery.SecretKey, Arg.Any<string>(), Arg.Any<int>()).Returns(secretKey);
var controller = new HomeController(_settings, _database, _deviceDetector, _logger, _localizer);
var controller = new HomeController(_settings, _database, _deviceDetector, _audit, _logger, _localizer);
controller.ControllerContext.HttpContext = new DefaultHttpContext()
{
Session = new MockSession()
@@ -60,7 +62,7 @@ namespace WeddingShare.UnitTests.Tests.Helpers
Assert.That(actual.Permanent, Is.EqualTo(false));
Assert.That(actual.ControllerName, Is.EqualTo("Gallery"));
Assert.That(actual.ActionName, Is.EqualTo("Index"));
Assert.That(actual.RouteValues, Is.Null);
Assert.That(actual.RouteValues, singleGalleryMode ? Is.EqualTo(new RouteValueDictionary { { "identifier", "default" } }) : Is.Null);
Assert.That(actual.Fragment, Is.Null);
}
}

View File

@@ -0,0 +1,62 @@
using WeddingShare.Helpers;
namespace WeddingShare.UnitTests.Tests.Helpers
{
public class HtmlSanitizerTests
{
public HtmlSanitizerTests()
{
}
[SetUp]
public void Setup()
{
}
[TestCase("<div><b>Test</b></div>", new[] { "b" }, "<div>Test</div>")]
[TestCase("<div><b>Test</b></div>", new[] { "div" }, "<b>Test</b>")]
[TestCase("<div><b>Test</b></div>", new[] { "div", "b" }, "Test")]
[TestCase("<script src=\"asdasd\">Test</script>", new[] { "script" }, "Test")]
[TestCase("<script src=\"asdasd\"/>", new[] { "script" }, "")]
[TestCase("<img src=\"asdasd\"/>", new[] { "img" }, "")]
[TestCase("Blaa<div><b>Test</b></div>", new[] { ".*" }, "Blaa")]
public void HtmlSanitizer_SanitizeHtmlTags(string input, string[] tags, string expected)
{
var actual = HtmlSanitizer.SanitizeHtmlTags(input, tags);
Assert.That(actual, Is.EqualTo(expected));
}
[TestCase("<script src=\"blaa\" link=\"unit\"></script>", new[] { "src" }, "<script link=\"unit\"></script>")]
[TestCase("<script src=\"blaa\" link=\"unit\"></script>", new[] { "link" }, "<script src=\"blaa\" ></script>")]
[TestCase("<script src=\"blaa\" link=\"unit\"></script>", new[] { ".*" }, "></script>")]
public void HtmlSanitizer_SanitizeHtmlAttributes(string input, string[] tags, string expected)
{
var actual = HtmlSanitizer.SanitizeHtmlAttributes(input, tags);
Assert.That(actual, Is.EqualTo(expected));
}
[TestCase("this is a https://unit.com/ test", "this is a test")]
[TestCase("this is a https://www.unit.com/ test", "this is a test")]
[TestCase("this is a https://www.unit.com/home test", "this is a test")]
[TestCase("this is a http://unit.com/ test", "this is a test")]
[TestCase("this is a http://www.unit.com/ test", "this is a test")]
[TestCase("this is a http://www.unit.com/home test", "this is a test")]
public void HtmlSanitizer_SanitizeHtmlAttributes(string input, string expected)
{
var actual = HtmlSanitizer.SanitizeLinks(input);
Assert.That(actual, Is.EqualTo(expected));
}
[TestCase("this is a test", false)]
[TestCase("this is a <img src=x onerror=alert(0)> test", true)]
[TestCase("this is a <script/> test", true)]
[TestCase("this is a <script></script> test", true)]
[TestCase("this is a http://www.unit.com/home test", true)]
[TestCase("this is a https://www.unit.com/home test", true)]
public void HtmlSanitizer_MayContainXss(string input, bool expected)
{
var actual = HtmlSanitizer.MayContainXss(input);
Assert.That(actual, Is.EqualTo(expected));
}
}
}

View File

@@ -0,0 +1,50 @@
using System.Globalization;
using WeddingShare.Helpers;
namespace WeddingShare.UnitTests.Tests.Helpers
{
public class LanguageHelperTests
{
private readonly List<CultureInfo> _supportedCultures;
public LanguageHelperTests()
{
_supportedCultures = new List<CultureInfo>()
{
new CultureInfo("en-GB"),
new CultureInfo("fr-FR"),
new CultureInfo("de-DE"),
};
}
[SetUp]
public void Setup()
{
}
[TestCase("en-GB", true)]
[TestCase("fr-FR", true)]
[TestCase("de-DE", true)]
[TestCase("de-de", true)]
[TestCase("en-US", false)]
[TestCase("cn-CSS", false)]
[TestCase("", false)]
public void LanguageHelper_IsCultureSupported(string culture, bool expected)
{
var actual = new LanguageHelper().IsCultureSupported(culture, _supportedCultures);
Assert.That(actual, Is.EqualTo(expected));
}
[TestCase("en-GB", "en-GB", "en-GB")]
[TestCase("en-US", "en-GB", "en-GB")]
[TestCase("en-US", "en-US", "en-GB")]
[TestCase("fr-FR", "en-GB", "fr-FR")]
[TestCase("de-DE", "fr-FR", "de-DE")]
[TestCase("de-de", "fr-fr", "de-DE")]
public void LanguageHelper_GetOrFallbackCulture(string culture, string fallback, string expected)
{
var actual = new LanguageHelper().GetOrFallbackCulture(culture, fallback, _supportedCultures);
Assert.That(actual, Is.EqualTo(expected));
}
}
}

View File

@@ -63,8 +63,8 @@ namespace WeddingShare.UnitTests.Tests.Helpers
Assert.That(actual, Is.EqualTo(expected));
}
[TestCase(null, false)]
[TestCase("", false)]
[TestCase(null, true)]
[TestCase("", true)]
[TestCase("UnitTest", true)]
public async Task NtfyHelper_Token(string? token, bool expected)
{

View File

@@ -13,46 +13,66 @@ namespace WeddingShare.Attributes
{
try
{
int? galleryId = null;
var request = filterContext.HttpContext.Request;
var galleryId = (request.Query.ContainsKey("id") && !string.IsNullOrWhiteSpace(request.Query["id"])) ? request.Query["id"].ToString().ToLower() : "default";
var databaseHelper = filterContext.HttpContext.RequestServices.GetService<IDatabaseHelper>();
var gallery = databaseHelper?.GetGallery(galleryId).Result;
if (gallery != null)
if (databaseHelper != null)
{
var encryptionHelper = filterContext.HttpContext.RequestServices.GetService<IEncryptionHelper>();
if (encryptionHelper != null)
var galleryIdentifier = (request.Query.ContainsKey("identifier") && !string.IsNullOrWhiteSpace(request.Query["identifier"])) ? request.Query["identifier"].ToString().ToLower() : null;
if (!string.IsNullOrWhiteSpace(galleryIdentifier))
{
galleryId = databaseHelper.GetGalleryId(galleryIdentifier).Result;
}
if (galleryId == null)
{
var key = request.Query.ContainsKey("key") ? request.Query["key"].ToString() : string.Empty;
var isEncrypted = request.Query.ContainsKey("enc") ? bool.Parse(request.Query["enc"].ToString().ToLower()) : false;
if (!isEncrypted && !string.IsNullOrWhiteSpace(key) && encryptionHelper.IsEncryptionEnabled())
{
var queryString = HttpUtility.ParseQueryString(request.QueryString.ToString());
queryString.Set("enc", "true");
queryString.Set("key", encryptionHelper.Encrypt(key));
filterContext.Result = new RedirectResult($"/Gallery?{queryString.ToString()}");
var galleryName = (request.Query.ContainsKey("id") && !string.IsNullOrWhiteSpace(request.Query["id"])) ? request.Query["id"].ToString().ToLower() : "default";
if (!string.IsNullOrWhiteSpace(galleryName))
{
galleryId = (databaseHelper?.GetGalleryIdByName(galleryName)?.Result) ?? 1;
}
else
{
var settingsHelper = filterContext.HttpContext.RequestServices.GetService<ISettingsHelper>();
if (settingsHelper != null)
{
var secretKey = settingsHelper.GetOrDefault(Settings.Gallery.SecretKey, string.Empty, galleryId).Result ?? string.Empty;
if (!string.IsNullOrWhiteSpace(secretKey))
{
secretKey = encryptionHelper.IsEncryptionEnabled() ? encryptionHelper.Encrypt(secretKey) : secretKey;
if (!string.IsNullOrWhiteSpace(secretKey) && !string.Equals(secretKey, key))
{
var logger = filterContext.HttpContext.RequestServices.GetService<ILogger<RequiresSecretKeyAttribute>>();
if (logger != null)
{
logger.LogWarning($"A request was made to an endpoint with an invalid secure key");
}
}
filterContext.Result = new RedirectToActionResult("Index", "Error", new { Reason = ErrorCode.InvalidSecretKey }, false);
if (galleryId != null)
{
var gallery = databaseHelper?.GetGallery(galleryId.Value).Result;
if (gallery != null)
{
var encryptionHelper = filterContext.HttpContext.RequestServices.GetService<IEncryptionHelper>();
if (encryptionHelper != null)
{
var key = request.Query.ContainsKey("key") ? request.Query["key"].ToString() : string.Empty;
var isEncrypted = request.Query.ContainsKey("enc") ? bool.Parse(request.Query["enc"].ToString().ToLower()) : false;
if (!isEncrypted && !string.IsNullOrWhiteSpace(key) && encryptionHelper.IsEncryptionEnabled())
{
var queryString = HttpUtility.ParseQueryString(request.QueryString.ToString());
queryString.Set("enc", "true");
queryString.Set("key", encryptionHelper.Encrypt(key));
filterContext.Result = new RedirectResult($"/Gallery?{queryString.ToString()}");
}
else
{
var settingsHelper = filterContext.HttpContext.RequestServices.GetService<ISettingsHelper>();
if (settingsHelper != null)
{
var secretKey = settingsHelper.GetOrDefault(Settings.Gallery.SecretKey, string.Empty, galleryId).Result ?? string.Empty;
if (!string.IsNullOrWhiteSpace(secretKey))
{
secretKey = encryptionHelper.IsEncryptionEnabled() ? encryptionHelper.Encrypt(secretKey) : secretKey;
if (!string.IsNullOrWhiteSpace(secretKey) && !string.Equals(secretKey, key))
{
var logger = filterContext.HttpContext.RequestServices.GetService<ILogger<RequiresSecretKeyAttribute>>();
if (logger != null)
{
logger.LogWarning($"A request was made to an endpoint with an invalid secure key");
}
filterContext.Result = new RedirectToActionResult("Index", "Error", new { Reason = ErrorCode.InvalidSecretKey }, false);
}
}
}
}
}

View File

@@ -8,19 +8,36 @@ namespace WeddingShare.BackgroundWorkers
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var cron = await settingsHelper.GetOrDefault(BackgroundServices.Schedules.Cleanup, "0 4 * * *");
var schedule = CrontabSchedule.Parse(cron, new CrontabSchedule.ParseOptions() { IncludingSeconds = cron.Split(new[] { ' ' }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Length == 6 });
await Task.Delay((int)TimeSpan.FromSeconds(10).TotalMilliseconds, stoppingToken);
while (!stoppingToken.IsCancellationRequested)
var enabled = await settingsHelper.GetOrDefault(BackgroundServices.Cleanup.Enabled, true);
if (enabled)
{
var now = DateTime.Now;
var nextExecutionTime = schedule.GetNextOccurrence(now);
var waitTime = nextExecutionTime - now;
await Task.Delay(waitTime, stoppingToken);
var cron = await settingsHelper.GetOrDefault(BackgroundServices.Cleanup.Schedule, "0 4 * * *");
var nextExecutionTime = DateTime.Now.AddSeconds(10);
await Cleanup();
while (!stoppingToken.IsCancellationRequested)
{
var currentCron = await settingsHelper.GetOrDefault(BackgroundServices.Cleanup.Schedule, "0 4 * * *");
var now = DateTime.Now;
if (now >= nextExecutionTime)
{
await Cleanup();
var schedule = CrontabSchedule.Parse(cron, new CrontabSchedule.ParseOptions() { IncludingSeconds = cron.Split(new[] { ' ' }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Length == 6 });
nextExecutionTime = schedule.GetNextOccurrence(now);
}
else
{
if (!currentCron.Equals(cron))
{
nextExecutionTime = DateTime.Now;
}
await Task.Delay(TimeSpan.FromSeconds(1), stoppingToken);
}
cron = currentCron;
}
}
}

View File

@@ -13,20 +13,36 @@ namespace WeddingShare.BackgroundWorkers
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var cron = settingsHelper.GetOrDefault(BackgroundServices.Schedules.DirectoryScanner, "*/30 * * * *").Result;
var schedule = CrontabSchedule.Parse(cron, new CrontabSchedule.ParseOptions() { IncludingSeconds = cron.Split(new[] { ' ' }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Length == 6 });
await Task.Delay((int)TimeSpan.FromSeconds(10).TotalMilliseconds, stoppingToken);
await ScanForFiles();
while (!stoppingToken.IsCancellationRequested)
var enabled = await settingsHelper.GetOrDefault(BackgroundServices.DirectoryScanner.Enabled, true);
if (enabled)
{
var now = DateTime.Now;
var nextExecutionTime = schedule.GetNextOccurrence(now);
var waitTime = nextExecutionTime - now;
await Task.Delay(waitTime, stoppingToken);
var cron = await settingsHelper.GetOrDefault(BackgroundServices.DirectoryScanner.Schedule, "*/30 * * * *");
var nextExecutionTime = DateTime.Now.AddSeconds(10);
await ScanForFiles();
while (!stoppingToken.IsCancellationRequested)
{
var currentCron = await settingsHelper.GetOrDefault(BackgroundServices.DirectoryScanner.Schedule, "*/30 * * * *");
var now = DateTime.Now;
if (now >= nextExecutionTime)
{
await ScanForFiles();
var schedule = CrontabSchedule.Parse(cron, new CrontabSchedule.ParseOptions() { IncludingSeconds = cron.Split(new[] { ' ' }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Length == 6 });
nextExecutionTime = schedule.GetNextOccurrence(now);
}
else
{
if (!currentCron.Equals(cron))
{
nextExecutionTime = DateTime.Now;
}
await Task.Delay(TimeSpan.FromSeconds(1), stoppingToken);
}
cron = currentCron;
}
}
}
@@ -51,142 +67,117 @@ namespace WeddingShare.BackgroundWorkers
var uploadsDirectory = Path.Combine(hostingEnvironment.WebRootPath, Directories.Uploads);
if (fileHelper.DirectoryExists(uploadsDirectory))
{
var searchPattern = !settingsHelper.GetOrDefault(Settings.Basic.SingleGalleryMode, false).Result ? "*" : "default";
var galleries = fileHelper.GetDirectories(uploadsDirectory, searchPattern, SearchOption.TopDirectoryOnly)?.Where(x => !Path.GetFileName(x).StartsWith("."));
if (galleries != null)
var galleryDirs = fileHelper.GetDirectories(uploadsDirectory, "*", SearchOption.TopDirectoryOnly)?.Where(x => !Path.GetFileName(x).StartsWith("."));
if (galleryDirs != null)
{
foreach (var gallery in galleries)
foreach (var galleryDir in galleryDirs)
{
try
{
var id = Path.GetFileName(gallery).ToLower();
var galleryItem = await databaseHelper.GetGallery(id);
if (galleryItem == null)
{
if (await databaseHelper.GetGalleryCount() < await settingsHelper.GetOrDefault(Settings.Basic.MaxGalleryCount, 1000000))
{
galleryItem = await databaseHelper.AddGallery(new GalleryModel()
{
Name = id,
Owner = 0
});
}
}
var identifier = Path.GetFileName(galleryDir).ToLower();
if (galleryItem != null)
var galleryId = await databaseHelper.GetGalleryId(identifier);
if (galleryId != null)
{
var allowedFileTypes = settingsHelper.GetOrDefault(Settings.Gallery.AllowedFileTypes, ".jpg,.jpeg,.png,.mp4,.mov", galleryItem?.Name).Result.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var galleryItems = await databaseHelper.GetAllGalleryItems(galleryItem.Id);
if (Path.Exists(gallery))
var galleryItem = await databaseHelper.GetGallery(galleryId.Value);
if (galleryItem == null)
{
var approvedFiles = fileHelper.GetFiles(gallery, "*.*", SearchOption.TopDirectoryOnly).Where(x => allowedFileTypes.Any(y => string.Equals(Path.GetExtension(x).Trim('.'), y.Trim('.'), StringComparison.OrdinalIgnoreCase)));
if (approvedFiles != null)
if (await databaseHelper.GetGalleryCount() < await settingsHelper.GetOrDefault(Settings.Basic.MaxGalleryCount, 1000000))
{
foreach (var file in approvedFiles)
galleryItem = await databaseHelper.AddGallery(new GalleryModel()
{
try
{
var filename = Path.GetFileName(file);
var g = galleryItems.FirstOrDefault(x => string.Equals(x.Title, filename, StringComparison.OrdinalIgnoreCase));
if (g == null)
{
g = await databaseHelper.AddGalleryItem(new GalleryItemModel()
{
GalleryId = galleryItem.Id,
Title = filename,
Checksum = await fileHelper.GetChecksum(file),
MediaType = imageHelper.GetMediaType(file),
State = GalleryItemState.Approved,
UploadedDate = await fileHelper.GetCreationDatetime(file),
FileSize = fileHelper.FileSize(file)
});
}
var thumbnailPath = Path.Combine(thumbnailsDirectory, $"{Path.GetFileNameWithoutExtension(file)}.webp");
if (!fileHelper.FileExists(thumbnailPath))
{
await imageHelper.GenerateThumbnail(file, thumbnailPath, settingsHelper.GetOrDefault(Settings.Basic.ThumbnailSize, 720).Result);
}
else
{
using (var img = await Image.LoadAsync(thumbnailPath))
{
var width = img.Width;
img.Mutate(x => x.AutoOrient());
if (width != img.Width)
{
await img.SaveAsWebpAsync(thumbnailPath);
}
}
}
if (g != null)
{
var updated = false;
if (g.UploadedDate == null)
{
g.UploadedDate = new FileInfo(file).CreationTimeUtc;
updated = true;
}
if (g.MediaType == MediaType.Unknown)
{
g.MediaType = imageHelper.GetMediaType(file);
updated = true;
}
if (g.Orientation == ImageOrientation.None)
{
g.Orientation = await imageHelper.GetOrientation(thumbnailPath);
updated = true;
}
if (g.FileSize == 0)
{
g.FileSize = fileHelper.FileSize(file);
updated = true;
}
if (updated)
{
await databaseHelper.EditGalleryItem(g);
}
}
}
catch (Exception ex)
{
logger.LogError(ex, $"An error occurred while scanning file '{file}'");
}
}
Name = identifier,
Owner = 0
});
}
}
if (Path.Exists(Path.Combine(gallery, "Pending")))
if (galleryItem != null)
{
var allowedFileTypes = settingsHelper.GetOrDefault(Settings.Gallery.AllowedFileTypes, ".jpg,.jpeg,.png,.mp4,.mov", galleryItem?.Id).Result.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var galleryItems = await databaseHelper.GetAllGalleryItems(galleryItem.Id);
if (Path.Exists(galleryDir))
{
var pendingFiles = fileHelper.GetFiles(Path.Combine(gallery, "Pending"), "*.*", SearchOption.TopDirectoryOnly).Where(x => allowedFileTypes.Any(y => string.Equals(Path.GetExtension(x).Trim('.'), y.Trim('.'), StringComparison.OrdinalIgnoreCase)));
if (pendingFiles != null)
var approvedFiles = fileHelper.GetFiles(galleryDir, "*.*", SearchOption.TopDirectoryOnly).Where(x => allowedFileTypes.Any(y => string.Equals(Path.GetExtension(x).Trim('.'), y.Trim('.'), StringComparison.OrdinalIgnoreCase)));
if (approvedFiles != null)
{
foreach (var file in pendingFiles)
foreach (var file in approvedFiles)
{
try
{
var filename = Path.GetFileName(file);
if (!galleryItems.Exists(x => string.Equals(x.Title, filename, StringComparison.OrdinalIgnoreCase)))
var g = galleryItems.FirstOrDefault(x => string.Equals(x.Title, filename, StringComparison.OrdinalIgnoreCase));
if (g == null)
{
await databaseHelper.AddGalleryItem(new GalleryItemModel()
g = await databaseHelper.AddGalleryItem(new GalleryItemModel()
{
GalleryId = galleryItem.Id,
Title = filename,
Checksum = await fileHelper.GetChecksum(file),
MediaType = imageHelper.GetMediaType(file),
State = GalleryItemState.Pending,
State = GalleryItemState.Approved,
UploadedDate = await fileHelper.GetCreationDatetime(file),
FileSize = new FileInfo(file).Length
FileSize = fileHelper.FileSize(file)
});
}
var thumbnailDir = Path.Combine(thumbnailsDirectory, galleryItem.Name);
var thumbnailPath = Path.Combine(thumbnailDir, $"{Path.GetFileNameWithoutExtension(file)}.webp");
if (!fileHelper.FileExists(thumbnailPath))
{
fileHelper.CreateDirectoryIfNotExists(thumbnailDir);
await imageHelper.GenerateThumbnail(file, thumbnailPath, settingsHelper.GetOrDefault(Settings.Basic.ThumbnailSize, 720).Result);
fileHelper.DeleteFileIfExists(Path.Combine(thumbnailsDirectory, $"{Path.GetFileNameWithoutExtension(file)}.webp"));
}
else
{
using (var img = await Image.LoadAsync(thumbnailPath))
{
var width = img.Width;
img.Mutate(x => x.AutoOrient());
if (width != img.Width)
{
await img.SaveAsWebpAsync(thumbnailPath);
}
}
}
if (g != null)
{
var updated = false;
if (g.UploadedDate == null)
{
g.UploadedDate = new FileInfo(file).CreationTimeUtc;
updated = true;
}
if (g.MediaType == MediaType.Unknown)
{
g.MediaType = imageHelper.GetMediaType(file);
updated = true;
}
if (g.Orientation == ImageOrientation.None)
{
g.Orientation = await imageHelper.GetOrientation(thumbnailPath);
updated = true;
}
if (g.FileSize == 0)
{
g.FileSize = fileHelper.FileSize(file);
updated = true;
}
if (updated)
{
await databaseHelper.EditGalleryItem(g);
}
}
}
catch (Exception ex)
{
@@ -194,13 +185,45 @@ namespace WeddingShare.BackgroundWorkers
}
}
}
if (Path.Exists(Path.Combine(galleryDir, "Pending")))
{
var pendingFiles = fileHelper.GetFiles(Path.Combine(galleryDir, "Pending"), "*.*", SearchOption.TopDirectoryOnly).Where(x => allowedFileTypes.Any(y => string.Equals(Path.GetExtension(x).Trim('.'), y.Trim('.'), StringComparison.OrdinalIgnoreCase)));
if (pendingFiles != null)
{
foreach (var file in pendingFiles)
{
try
{
var filename = Path.GetFileName(file);
if (!galleryItems.Exists(x => string.Equals(x.Title, filename, StringComparison.OrdinalIgnoreCase)))
{
await databaseHelper.AddGalleryItem(new GalleryItemModel()
{
GalleryId = galleryItem.Id,
Title = filename,
Checksum = await fileHelper.GetChecksum(file),
MediaType = imageHelper.GetMediaType(file),
State = GalleryItemState.Pending,
UploadedDate = await fileHelper.GetCreationDatetime(file),
FileSize = new FileInfo(file).Length
});
}
}
catch (Exception ex)
{
logger.LogError(ex, $"An error occurred while scanning file '{file}'");
}
}
}
}
}
}
}
}
catch (Exception ex)
{
logger.LogError(ex, $"An error occurred while scanning directory '{gallery}'");
logger.LogError(ex, $"An error occurred while scanning directory '{galleryDir}'");
}
}
}

View File

@@ -11,19 +11,38 @@ namespace WeddingShare.BackgroundWorkers
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
if (await settingsHelper.GetOrDefault(Settings.Basic.EmailReport, true) && await settingsHelper.GetOrDefault(Notifications.Smtp.Enabled, false))
{
var cron = await settingsHelper.GetOrDefault(BackgroundServices.Schedules.EmailReport, "0 0 * * *");
var schedule = CrontabSchedule.Parse(cron, new CrontabSchedule.ParseOptions() { IncludingSeconds = cron.Split(new[] { ' ' }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Length == 6 });
var enabled = await settingsHelper.GetOrDefault(BackgroundServices.EmailReport.Enabled, true);
if (enabled)
{
var cron = await settingsHelper.GetOrDefault(BackgroundServices.EmailReport.Schedule, "0 0 * * *");
var nextExecutionTime = DateTime.Now.AddSeconds(10);
while (!stoppingToken.IsCancellationRequested)
{
var now = DateTime.Now;
var nextExecutionTime = schedule.GetNextOccurrence(now);
var waitTime = nextExecutionTime - now;
await Task.Delay(waitTime, stoppingToken);
var currentCron = await settingsHelper.GetOrDefault(BackgroundServices.EmailReport.Schedule, "0 0 * * *");
await SendReport();
var now = DateTime.Now;
if (now >= nextExecutionTime)
{
if (await settingsHelper.GetOrDefault(Settings.Basic.EmailReport, true) && await settingsHelper.GetOrDefault(Notifications.Smtp.Enabled, false))
{
await SendReport();
}
var schedule = CrontabSchedule.Parse(cron, new CrontabSchedule.ParseOptions() { IncludingSeconds = cron.Split(new[] { ' ' }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Length == 6 });
nextExecutionTime = schedule.GetNextOccurrence(now);
}
else
{
if (!currentCron.Equals(cron))
{
nextExecutionTime = DateTime.Now;
}
await Task.Delay(TimeSpan.FromSeconds(1), stoppingToken);
}
cron = currentCron;
}
}
}
@@ -38,15 +57,19 @@ namespace WeddingShare.BackgroundWorkers
var builder = new StringBuilder();
builder.AppendLine($"<h1>You have items pending review!</h1>");
foreach (var item in pendingItems.GroupBy(x => x.GalleryName).OrderBy(x => x.Key))
foreach (var item in pendingItems.GroupBy(x => x.GalleryId).OrderByDescending(x => x.Count()))
{
try
{
builder.AppendLine($"<p style=\"font-size: 16pt;\">{item.Key} - Pending Items ({item.Count()})</p>");
}
catch (Exception ex)
{
loggerFactory.CreateLogger<NotificationReport>().LogError(ex, $"Failed to build gallery report for id '{item?.Key}' - {ex?.Message}");
var gallery = await databaseHelper.GetGallery(item.Key);
if (gallery != null)
{
try
{
builder.AppendLine($"<p style=\"font-size: 16pt;\">{gallery.Name} - Pending Items ({item.Count()})</p>");
}
catch (Exception ex)
{
loggerFactory.CreateLogger<NotificationReport>().LogError(ex, $"Failed to build gallery report for '{gallery.Name}' - {ex?.Message}");
}
}
}

View File

@@ -2,12 +2,25 @@
{
public class BackgroundServices
{
public class Schedules
public class DirectoryScanner
{
public const string DirectoryScanner = "BackgroundServices:Schedules:Directory_Scanner";
public const string EmailReport = "BackgroundServices:Schedules:Email_Report";
public const string Cleanup = "BackgroundServices:Schedules:Cleanup";
public const string DemoSystemReset = "BackgroundServices:Schedules:Demo_System_Reset";
public const string BaseKey = "BackgroundServices:Directory_Scanner:";
public const string Enabled = "BackgroundServices:Directory_Scanner:Enabled";
public const string Schedule = "BackgroundServices:Directory_Scanner:Schedule";
}
public class EmailReport
{
public const string BaseKey = "BackgroundServices:Email_Report:";
public const string Enabled = "BackgroundServices:Email_Report:Enabled";
public const string Schedule = "BackgroundServices:Email_Report:Schedule";
}
public class Cleanup
{
public const string BaseKey = "BackgroundServices:Cleanup:";
public const string Enabled = "BackgroundServices:Cleanup:Enabled";
public const string Schedule = "BackgroundServices:Cleanup:Schedule";
}
}
}

View File

@@ -2,11 +2,9 @@
{
public class Directories
{
public const string Banners = "banners";
public const string Config = "config";
public const string CustomResources = "custom_resources";
public const string Images = "images";
public const string Logos = "logos";
public const string TempFiles = "temp";
public const string Thumbnails = "thumbnails";
public const string Uploads = "uploads";

View File

@@ -13,10 +13,16 @@
public class Admin
{
public const string BaseKey = "Settings:Account:Admin:";
public const string Username = "Settings:Account:Admin:Username";
public const string Password = "Settings:Account:Admin:Password";
public const string LogPassword = "Settings:Account:Admin:Log_Password";
}
public class Owner
{
public const string BaseKey = "Settings:Account:Owner:";
public const string Username = "Settings:Account:Owner:Username";
public const string Password = "Settings:Account:Owner:Password";
public const string LogPassword = "Settings:Account:Owner:Log_Password";
}
}
@@ -42,6 +48,7 @@
public const string BaseKey = "Settings:Database:";
public const string Type = "Settings:Database:Type";
public const string ConnectionString = "Settings:Database:Connection_String";
public const string DatabaseName = "Settings:Database:Database_Name";
public const string SyncFromConfig = "Settings:Database:Sync_From_Config";
}
@@ -67,6 +74,7 @@
public const string UploadPeriod = "Settings:Gallery:Upload_Period";
public const string AllowedFileTypes = "Settings:Gallery:Allowed_File_Types";
public const string CameraUploads = "Settings:Gallery:Camera_Uploads";
public const string ShowFilters = "Settings:Gallery:Show_Filters";
public class QRCode
{
@@ -115,5 +123,12 @@
public const string Enabled = "Settings:Themes:Enabled";
public const string Default = "Settings:Themes:Default";
}
public class Policies
{
public const string BaseKey = "Settings:Policies:";
public const string Enabled = "Settings:Policies:Enabled";
public const string CookiePolicy = "Settings:Policies:CookiePolicy";
}
}
}

View File

@@ -16,12 +16,12 @@ using WeddingShare.Helpers.Database;
using WeddingShare.Helpers.Notifications;
using WeddingShare.Models;
using WeddingShare.Models.Database;
using WeddingShare.Views.Admin;
using WeddingShare.Views.Account;
namespace WeddingShare.Controllers
{
[Authorize]
public class AdminController : Controller
public class AccountController : Controller
{
private readonly IWebHostEnvironment _hostingEnvironment;
private readonly ISettingsHelper _settings;
@@ -38,11 +38,9 @@ namespace WeddingShare.Controllers
private readonly string TempDirectory;
private readonly string UploadsDirectory;
private readonly string ThumbnailsDirectory;
private readonly string LogosDirectory;
private readonly string BannersDirectory;
private readonly string CustomResourcesDirectory;
public AdminController(IWebHostEnvironment hostingEnvironment, ISettingsHelper settings, IDatabaseHelper database, IDeviceDetector deviceDetector, IFileHelper fileHelper, IEncryptionHelper encryption, INotificationHelper notificationHelper, Helpers.IUrlHelper url, IAuditHelper audit, ILogger<AdminController> logger, IStringLocalizer<Lang.Translations> localizer)
public AccountController(IWebHostEnvironment hostingEnvironment, ISettingsHelper settings, IDatabaseHelper database, IDeviceDetector deviceDetector, IFileHelper fileHelper, IEncryptionHelper encryption, INotificationHelper notificationHelper, Helpers.IUrlHelper url, IAuditHelper audit, ILogger<AccountController> logger, IStringLocalizer<Lang.Translations> localizer)
{
_hostingEnvironment = hostingEnvironment;
_settings = settings;
@@ -59,8 +57,6 @@ namespace WeddingShare.Controllers
TempDirectory = Path.Combine(_hostingEnvironment.WebRootPath, Directories.TempFiles);
UploadsDirectory = Path.Combine(_hostingEnvironment.WebRootPath, Directories.Uploads);
ThumbnailsDirectory = Path.Combine(_hostingEnvironment.WebRootPath, Directories.Thumbnails);
LogosDirectory = Path.Combine(_hostingEnvironment.WebRootPath, Directories.Logos);
BannersDirectory = Path.Combine(_hostingEnvironment.WebRootPath, Directories.Banners);
CustomResourcesDirectory = Path.Combine(_hostingEnvironment.WebRootPath, Directories.CustomResources);
}
@@ -71,7 +67,7 @@ namespace WeddingShare.Controllers
{
if (User?.Identity != null && User.Identity.IsAuthenticated)
{
return RedirectToAction("Index", "Admin");
return RedirectToAction("Index", "Account");
}
return View();
@@ -185,18 +181,21 @@ namespace WeddingShare.Controllers
{
await _audit.LogAction(User?.Identity?.Name, _localizer["Audit_LoggedOut"].Value);
await this.HttpContext.SignOutAsync();
return RedirectToAction("Index", "Admin");
return RedirectToAction("Index", "Account");
}
[HttpGet]
public async Task<IActionResult> Index()
public async Task<IActionResult> Index(AccountTabs tab = AccountTabs.Reviews)
{
if (User?.Identity == null || !User.Identity.IsAuthenticated)
{
return Redirect("/");
}
var model = new IndexModel();
var model = new IndexModel()
{
ActiveTab = tab
};
var deviceType = HttpContext.Session.GetString(SessionKey.DeviceType);
if (string.IsNullOrWhiteSpace(deviceType))
@@ -209,35 +208,40 @@ namespace WeddingShare.Controllers
{
var user = await _database.GetUser(User.Identity.GetUserId());
if (user != null)
{
if (!await _settings.GetOrDefault(Settings.Basic.SingleGalleryMode, false))
{
if (tab == AccountTabs.Reviews)
{
model.Galleries = await _database.GetAllGalleries();
model.PendingRequests = await GetPendingReviews();
}
else if (tab == AccountTabs.Galleries)
{
model.Galleries = (await _database.GetAllGalleries())?.Where(x => !x.Identifier.Equals("All", StringComparison.OrdinalIgnoreCase))?.ToList();
if (model.Galleries != null)
{
{
var all = await _database.GetGallery(0);
if (all != null)
{
{
model.Galleries.Add(all);
}
}
model.PendingRequests = await _database.GetPendingGalleryItems();
}
else
else if (tab == AccountTabs.Users)
{
var gallery = await _database.GetGallery("default");
if (gallery != null)
{
model.Galleries = new List<GalleryModel>() { gallery };
model.PendingRequests = await _database.GetPendingGalleryItems(gallery.Id);
}
model.Users = await _database.GetAllUsers();
}
else if (tab == AccountTabs.Resources)
{
model.CustomResources = await _database.GetAllCustomResources();
}
else if (tab == AccountTabs.Settings)
{
model.Settings = (await _database.GetAllSettings())?.ToDictionary(x => x.Id.ToUpper(), x => x.Value ?? string.Empty);
model.CustomResources = await _database.GetAllCustomResources();
}
else if (tab == AccountTabs.Audit)
{
model.AuditLogs = await _database.GetAuditLogs();
}
model.CustomResources = await _database.GetAllCustomResources();
model.Users = await _database.GetAllUsers();
model.Settings = (await _database.GetAllSettings())?.ToDictionary(x => x.Id.ToUpper(), x => x.Value ?? string.Empty);
model.AuditLogs = await _database.GetAuditLogs();
}
}
catch (Exception ex)
@@ -264,24 +268,13 @@ namespace WeddingShare.Controllers
var user = await _database.GetUser(User.Identity.GetUserId());
if (user != null)
{
if (!await _settings.GetOrDefault(Settings.Basic.SingleGalleryMode, false))
result = (await _database.GetAllGalleries())?.Where(x => !x.Identifier.Equals("All", StringComparison.OrdinalIgnoreCase))?.ToList();
if (result != null)
{
result = await _database.GetAllGalleries();
if (result != null)
var all = await _database.GetGallery(0);
if (all != null)
{
var all = await _database.GetGallery(0);
if (all != null)
{
result.Add(all);
}
}
}
else
{
var gallery = await _database.GetGallery("default");
if (gallery != null)
{
result = new List<GalleryModel>() { gallery };
result.Add(all);
}
}
}
@@ -291,37 +284,26 @@ namespace WeddingShare.Controllers
_logger.LogError(ex, $"{_localizer["Gallery_List_Failed"].Value} - {ex?.Message}");
}
return PartialView("~/Views/Admin/Partials/GalleriesList.cshtml", result ?? new List<GalleryModel>());
return PartialView("~/Views/Account/Partials/GalleriesList.cshtml", result ?? new List<GalleryModel>());
}
[HttpGet]
[RequiresRole(Permission = AccessPermissions.Review_View)]
public async Task<IActionResult> PendingReviews()
{
var galleries = new List<PhotoGallery>();
if (User?.Identity == null || !User.Identity.IsAuthenticated)
{
return Redirect("/");
}
List<GalleryItemModel>? result = null;
try
{
var user = await _database.GetUser(User.Identity.GetUserId());
if (user != null)
{
if (!await _settings.GetOrDefault(Settings.Basic.SingleGalleryMode, false))
{
result = await _database.GetPendingGalleryItems();
}
else
{
var gallery = await _database.GetGallery("default");
if (gallery != null)
{
result = await _database.GetPendingGalleryItems(gallery.Id);
}
}
galleries = await GetPendingReviews();
}
}
catch (Exception ex)
@@ -329,7 +311,7 @@ namespace WeddingShare.Controllers
_logger.LogError(ex, $"{_localizer["Pending_Uploads_Failed"].Value} - {ex?.Message}");
}
return PartialView("~/Views/Admin/Partials/PendingReviews.cshtml", result ?? new List<GalleryItemModel>());
return PartialView("~/Views/Account/Partials/PendingReviews.cshtml", galleries);
}
[HttpGet]
@@ -356,7 +338,7 @@ namespace WeddingShare.Controllers
_logger.LogError(ex, $"{_localizer["Users_List_Failed"].Value} - {ex?.Message}");
}
return PartialView("~/Views/Admin/Partials/UsersList.cshtml", result ?? new List<UserModel>());
return PartialView("~/Views/Account/Partials/UsersList.cshtml", result ?? new List<UserModel>());
}
[HttpGet]
@@ -379,7 +361,7 @@ namespace WeddingShare.Controllers
_logger.LogError(ex, $"{_localizer["Custom_Resources_Failed"].Value} - {ex?.Message}");
}
return PartialView("~/Views/Admin/Partials/CustomResources.cshtml", result ?? new List<CustomResourceModel>());
return PartialView("~/Views/Account/Partials/CustomResources.cshtml", result ?? new List<CustomResourceModel>());
}
[HttpGet]
@@ -391,7 +373,7 @@ namespace WeddingShare.Controllers
return Redirect("/");
}
var model = new Views.Admin.Partials.SettingsListModel();
var model = new Views.Account.Partials.SettingsListModel();
try
{
@@ -403,7 +385,7 @@ namespace WeddingShare.Controllers
_logger.LogError(ex, $"{_localizer["Settings_Failed"].Value} - {ex?.Message}");
}
return PartialView("~/Views/Admin/Partials/SettingsList.cshtml", model);
return PartialView("~/Views/Account/Partials/SettingsList.cshtml", model);
}
[HttpPost]
@@ -427,12 +409,12 @@ namespace WeddingShare.Controllers
_logger.LogError(ex, $"{_localizer["Audit_List_Failed"].Value} - {ex?.Message}");
}
return PartialView("~/Views/Admin/Partials/AuditList.cshtml", result ?? new List<AuditLogModel>());
return PartialView("~/Views/Account/Partials/AuditList.cshtml", result ?? new List<AuditLogModel>());
}
[HttpGet]
[RequiresRole(Permission = AccessPermissions.Settings_Gallery_Update)]
[Route("Admin/Settings/{galleryId}")]
[Route("Account/Settings/{galleryId}")]
public async Task<IActionResult> GallerySettingsPartial(int galleryId)
{
if (User?.Identity == null || !User.Identity.IsAuthenticated)
@@ -440,14 +422,14 @@ namespace WeddingShare.Controllers
return Redirect("/");
}
var model = new Views.Admin.Settings.GalleryModel();
var model = new Views.Account.Settings.GalleryModel();
try
{
var gallery = await _database.GetGallery(galleryId);
if (!string.IsNullOrWhiteSpace(gallery?.Name))
{
model.Settings = (await _database.GetAllSettings(gallery.Name))?.Where(x => x.Id.StartsWith(Settings.Gallery.BaseKey, StringComparison.OrdinalIgnoreCase))?.ToDictionary(x => x.Id.ToUpper(), x => x.Value ?? string.Empty);
model.Settings = (await _database.GetAllSettings(gallery.Id))?.Where(x => x.Id.StartsWith(Settings.Gallery.BaseKey, StringComparison.OrdinalIgnoreCase))?.ToDictionary(x => x.Id.ToUpper(), x => x.Value ?? string.Empty);
model.CustomResources = await _database.GetAllCustomResources();
}
}
@@ -456,7 +438,7 @@ namespace WeddingShare.Controllers
_logger.LogError(ex, $"{_localizer["Settings_Failed"].Value} - {ex?.Message}");
}
return PartialView("~/Views/Admin/Settings/Gallery.cshtml", model);
return PartialView("~/Views/Account/Settings/Gallery.cshtml", model);
}
[HttpPost]
@@ -469,42 +451,46 @@ namespace WeddingShare.Controllers
{
var review = await _database.GetPendingGalleryItem(id);
if (review != null)
{
var galleryDir = Path.Combine(UploadsDirectory, review.GalleryName);
var reviewFile = Path.Combine(galleryDir, "Pending", review.Title);
if (action == ReviewAction.APPROVED)
{
_fileHelper.MoveFileIfExists(reviewFile, Path.Combine(galleryDir, review.Title));
review.State = GalleryItemState.Approved;
await _database.EditGalleryItem(review);
await _audit.LogAction(User?.Identity?.Name, $"'{review.Title}' {_localizer["Audit_ItemApprovedInGallery"].Value} '{review.GalleryName}'");
}
else if (action == ReviewAction.REJECTED)
{
var retain = await _settings.GetOrDefault(Settings.Gallery.RetainRejectedItems, false);
if (retain)
{
var gallery = await _database.GetGallery(review.GalleryId);
if (gallery != null)
{
var galleryDir = Path.Combine(UploadsDirectory, gallery.Identifier);
var reviewFile = Path.Combine(galleryDir, "Pending", review.Title);
if (action == ReviewAction.APPROVED)
{
var rejectedDir = Path.Combine(galleryDir, "Rejected");
_fileHelper.CreateDirectoryIfNotExists(rejectedDir);
_fileHelper.MoveFileIfExists(reviewFile, Path.Combine(rejectedDir, review.Title));
_fileHelper.MoveFileIfExists(reviewFile, Path.Combine(galleryDir, review.Title));
review.State = GalleryItemState.Approved;
await _database.EditGalleryItem(review);
await _audit.LogAction(User?.Identity?.Name, $"'{review.Title}' {_localizer["Audit_ItemApprovedInGallery"].Value} '{gallery.Identifier}'");
}
else
else if (action == ReviewAction.REJECTED)
{
_fileHelper.DeleteFileIfExists(reviewFile);
var retain = await _settings.GetOrDefault(Settings.Gallery.RetainRejectedItems, false);
if (retain)
{
var rejectedDir = Path.Combine(galleryDir, "Rejected");
_fileHelper.CreateDirectoryIfNotExists(rejectedDir);
_fileHelper.MoveFileIfExists(reviewFile, Path.Combine(rejectedDir, review.Title));
}
else
{
_fileHelper.DeleteFileIfExists(reviewFile);
}
await _database.DeleteGalleryItem(review);
await _audit.LogAction(User?.Identity?.Name, $"'{review.Title}' {_localizer["Audit_ItemRejectedInGallery"].Value} '{gallery.Identifier}'");
}
else if (action == ReviewAction.UNKNOWN)
{
throw new Exception(_localizer["Unknown_Review_Action"].Value);
}
await _database.DeleteGalleryItem(review);
await _audit.LogAction(User?.Identity?.Name, $"'{review.Title}' {_localizer["Audit_ItemRejectedInGallery"].Value} '{review.GalleryName}'");
return Json(new { success = true, action });
}
else if (action == ReviewAction.UNKNOWN)
{
throw new Exception(_localizer["Unknown_Review_Action"].Value);
}
return Json(new { success = true, action });
}
else
{
@@ -531,40 +517,47 @@ namespace WeddingShare.Controllers
var items = await _database.GetPendingGalleryItems();
if (items != null && items.Any())
{
foreach (var review in items)
{
var galleryDir = Path.Combine(UploadsDirectory, review.GalleryName);
var reviewFile = Path.Combine(galleryDir, "Pending", review.Title);
if (action == ReviewAction.APPROVED)
foreach (var galleryGroup in items.GroupBy(x => x.GalleryId))
{
var gallery = await _database.GetGallery(galleryGroup.Key);
if (gallery != null)
{
_fileHelper.MoveFileIfExists(reviewFile, Path.Combine(galleryDir, review.Title));
review.State = GalleryItemState.Approved;
await _database.EditGalleryItem(review);
await _audit.LogAction(User?.Identity?.Name, _localizer["Audit_BulkApproveReviews"].Value);
}
else if (action == ReviewAction.REJECTED)
{
var retain = await _settings.GetOrDefault(Settings.Gallery.RetainRejectedItems, false);
if (retain)
foreach (var review in galleryGroup)
{
var rejectedDir = Path.Combine(galleryDir, "Rejected");
_fileHelper.CreateDirectoryIfNotExists(rejectedDir);
_fileHelper.MoveFileIfExists(reviewFile, Path.Combine(rejectedDir, review.Title));
}
else
{
_fileHelper.DeleteFileIfExists(reviewFile);
}
var galleryDir = Path.Combine(UploadsDirectory, gallery.Identifier);
var reviewFile = Path.Combine(galleryDir, "Pending", review.Title);
if (action == ReviewAction.APPROVED)
{
_fileHelper.MoveFileIfExists(reviewFile, Path.Combine(galleryDir, review.Title));
await _database.DeleteGalleryItem(review);
review.State = GalleryItemState.Approved;
await _database.EditGalleryItem(review);
await _audit.LogAction(User?.Identity?.Name, _localizer["Audit_BulkRejectReviews"].Value);
}
else if (action == ReviewAction.UNKNOWN)
{
throw new Exception(_localizer["Unknown_Review_Action"].Value);
await _audit.LogAction(User?.Identity?.Name, _localizer["Audit_BulkApproveReviews"].Value);
}
else if (action == ReviewAction.REJECTED)
{
var retain = await _settings.GetOrDefault(Settings.Gallery.RetainRejectedItems, false);
if (retain)
{
var rejectedDir = Path.Combine(galleryDir, "Rejected");
_fileHelper.CreateDirectoryIfNotExists(rejectedDir);
_fileHelper.MoveFileIfExists(reviewFile, Path.Combine(rejectedDir, review.Title));
}
else
{
_fileHelper.DeleteFileIfExists(reviewFile);
}
await _database.DeleteGalleryItem(review);
await _audit.LogAction(User?.Identity?.Name, _localizer["Audit_BulkRejectReviews"].Value);
}
else if (action == ReviewAction.UNKNOWN)
{
throw new Exception(_localizer["Unknown_Review_Action"].Value);
}
}
}
}
}
@@ -590,8 +583,8 @@ namespace WeddingShare.Controllers
{
try
{
var check = await _database.GetGallery(model.Name);
if (check == null)
var alreadyExists = ((await _database.GetGalleryNames()).Any(x => x.Equals(model.Name, StringComparison.OrdinalIgnoreCase))) || ((await _database.GetGalleryId(model.Identifier)) != null);
if (!alreadyExists)
{
if (await _database.GetGalleryCount() < await _settings.GetOrDefault(Settings.Basic.MaxGalleryCount, 1000000))
{
@@ -634,7 +627,7 @@ namespace WeddingShare.Controllers
{
try
{
var check = await _database.GetGallery(model.Name);
var check = await _database.GetGallery(model.Id);
if (check == null || model.Id == check.Id)
{
var gallery = await _database.GetGallery(model.Id);
@@ -682,12 +675,12 @@ namespace WeddingShare.Controllers
var gallery = await _database.GetGallery(id);
if (gallery != null)
{
var galleryDir = Path.Combine(UploadsDirectory, gallery.Name);
var galleryDir = Path.Combine(UploadsDirectory, gallery.Identifier);
if (_fileHelper.DirectoryExists(galleryDir))
{
foreach (var photo in _fileHelper.GetFiles(galleryDir, "*.*", SearchOption.AllDirectories))
{
var thumbnail = Path.Combine(ThumbnailsDirectory, $"{Path.GetFileNameWithoutExtension(photo)}.webp");
var thumbnail = Path.Combine(ThumbnailsDirectory, gallery.Identifier, $"{Path.GetFileNameWithoutExtension(photo)}.webp");
_fileHelper.DeleteFileIfExists(thumbnail);
}
@@ -696,7 +689,7 @@ namespace WeddingShare.Controllers
if (await _settings.GetOrDefault(Notifications.Alerts.DestructiveAction, true))
{
await _notificationHelper.Send(_localizer["Destructive_Action_Performed"].Value, $"The destructive action 'Wipe' was performed on gallery '{gallery.Name}'.", _url.GenerateBaseUrl(HttpContext?.Request, "/Admin"));
await _notificationHelper.Send(_localizer["Destructive_Action_Performed"].Value, $"The destructive action 'Wipe' was performed on gallery '{gallery.Name}'.", _url.GenerateBaseUrl(HttpContext?.Request, "/Account"));
}
}
@@ -742,7 +735,7 @@ namespace WeddingShare.Controllers
if (await _settings.GetOrDefault(Notifications.Alerts.DestructiveAction, true))
{
await _notificationHelper.Send(_localizer["Destructive_Action_Performed"].Value, $"The destructive action 'Wipe' was performed on all galleries'.", _url.GenerateBaseUrl(HttpContext?.Request, "/Admin"));
await _notificationHelper.Send(_localizer["Destructive_Action_Performed"].Value, $"The destructive action 'Wipe' was performed on all galleries'.", _url.GenerateBaseUrl(HttpContext?.Request, "/Account"));
}
}
@@ -770,12 +763,12 @@ namespace WeddingShare.Controllers
var gallery = await _database.GetGallery(id);
if (gallery != null && gallery.Id > 1)
{
var galleryDir = Path.Combine(UploadsDirectory, gallery.Name);
var galleryDir = Path.Combine(UploadsDirectory, gallery.Identifier);
_fileHelper.DeleteDirectoryIfExists(galleryDir);
if (await _settings.GetOrDefault(Notifications.Alerts.DestructiveAction, true))
{
await _notificationHelper.Send(_localizer["Destructive_Action_Performed"].Value, $"The destructive action 'Delete' was performed on gallery '{gallery.Name}'.", _url.GenerateBaseUrl(HttpContext?.Request, "/Admin"));
await _notificationHelper.Send(_localizer["Destructive_Action_Performed"].Value, $"The destructive action 'Delete' was performed on gallery '{gallery.Name}'.", _url.GenerateBaseUrl(HttpContext?.Request, "/Account"));
}
await _audit.LogAction(User?.Identity?.Name, $"{_localizer["Audit_DeletedGallery"].Value} '{gallery?.Name}'");
@@ -810,7 +803,7 @@ namespace WeddingShare.Controllers
var gallery = await _database.GetGallery(photo.GalleryId);
if (gallery != null)
{
var photoPath = Path.Combine(UploadsDirectory, gallery.Name, photo.Title);
var photoPath = Path.Combine(UploadsDirectory, gallery.Identifier, photo.Title);
_fileHelper.DeleteFileIfExists(photoPath);
await _audit.LogAction(User?.Identity?.Name, $"'{photo?.Title}' {_localizer["Audit_ItemDeletedInGallery"].Value} '{gallery?.Name}'");
@@ -1023,7 +1016,7 @@ namespace WeddingShare.Controllers
{
if (await _settings.GetOrDefault(Notifications.Alerts.DestructiveAction, true))
{
await _notificationHelper.Send(_localizer["Destructive_Action_Performed"].Value, $"The destructive action 'Delete' was performed on user '{user.Username}'.", _url.GenerateBaseUrl(HttpContext?.Request, "/Admin"));
await _notificationHelper.Send(_localizer["Destructive_Action_Performed"].Value, $"The destructive action 'Delete' was performed on user '{user.Username}'.", _url.GenerateBaseUrl(HttpContext?.Request, "/Account"));
}
await _audit.LogAction(User?.Identity?.Name, $"{_localizer["Audit_DeletedUser"].Value} '{user?.Username}'");
@@ -1070,7 +1063,7 @@ namespace WeddingShare.Controllers
{
Id = m.Key,
Value = m.Value
}, gallery?.Name ?? string.Empty);
}, gallery?.Id);
if (setting == null || (setting.Value ?? string.Empty) != (m.Value ?? string.Empty))
{
@@ -1141,18 +1134,6 @@ namespace WeddingShare.Controllers
ZipFile.CreateFromDirectory(ThumbnailsDirectory, thumbnailsZip, CompressionLevel.Optimal, false);
}
var logosZip = Path.Combine(exportDir, $"Logos.bak");
if (options.Logos && _fileHelper.DirectoryExists(LogosDirectory))
{
ZipFile.CreateFromDirectory(LogosDirectory, logosZip, CompressionLevel.Optimal, false);
}
var bannersZip = Path.Combine(exportDir, $"Banners.bak");
if (options.Banners && _fileHelper.DirectoryExists(BannersDirectory))
{
ZipFile.CreateFromDirectory(BannersDirectory, bannersZip, CompressionLevel.Optimal, false);
}
var customResourcesZip = Path.Combine(exportDir, $"CustomResources.bak");
if (options.CustomResources && _fileHelper.DirectoryExists(CustomResourcesDirectory))
{
@@ -1166,8 +1147,6 @@ namespace WeddingShare.Controllers
_fileHelper.DeleteFileIfExists(dbExport);
_fileHelper.DeleteFileIfExists(uploadsZip);
_fileHelper.DeleteFileIfExists(thumbnailsZip);
_fileHelper.DeleteFileIfExists(logosZip);
_fileHelper.DeleteFileIfExists(bannersZip);
_fileHelper.DeleteFileIfExists(customResourcesZip);
await _audit.LogAction(User?.Identity?.Name, _localizer["Audit_ExportedBackup"].Value);
@@ -1226,18 +1205,6 @@ namespace WeddingShare.Controllers
var thumbnailsZip = Path.Combine(importDir, "Thumbnails.bak");
ZipFile.ExtractToDirectory(thumbnailsZip, ThumbnailsDirectory, true);
var logosZip = Path.Combine(importDir, "Logos.bak");
if (_fileHelper.FileExists(logosZip))
{
ZipFile.ExtractToDirectory(logosZip, LogosDirectory, true);
}
var bannersZip = Path.Combine(importDir, "Banners.bak");
if (_fileHelper.FileExists(bannersZip))
{
ZipFile.ExtractToDirectory(bannersZip, BannersDirectory, true);
}
var customResourcesZip = Path.Combine(importDir, "CustomResources.bak");
if (_fileHelper.FileExists(customResourcesZip))
{
@@ -1530,10 +1497,10 @@ namespace WeddingShare.Controllers
{
if (await _settings.GetOrDefault(Notifications.Alerts.FailedLogin, true))
{
var ipAddress = this.TryGetIpAddress(Request.HttpContext);
var country = this.TryGetCountry(Request.HttpContext);
var ipAddress = Request.HttpContext.TryGetIpAddress();
var country = Request.HttpContext.TryGetCountry();
await _notificationHelper.Send("Invalid Login Detected", $"An invalid login attempt was made for account '{model?.Username}' from ip address '{ipAddress}' based in country '{country}'.", _url.GenerateBaseUrl(HttpContext?.Request, "/Admin"));
await _notificationHelper.Send("Invalid Login Detected", $"An invalid login attempt was made for account '{model?.Username}' from ip address '{ipAddress}' based in country '{country}'.", _url.GenerateBaseUrl(HttpContext?.Request, "/Account"));
}
var failedAttempts = await _database.IncrementLockoutCount(user.Id);
@@ -1544,7 +1511,7 @@ namespace WeddingShare.Controllers
if (await _settings.GetOrDefault(Notifications.Alerts.AccountLockout, true))
{
await _notificationHelper.Send("Account Lockout", $"Account '{model?.Username}' has been locked out for {timeout} minutes due to too many failed login attempts.", _url.GenerateBaseUrl(HttpContext?.Request, "/Admin"));
await _notificationHelper.Send("Account Lockout", $"Account '{model?.Username}' has been locked out for {timeout} minutes due to too many failed login attempts.", _url.GenerateBaseUrl(HttpContext?.Request, "/Account"));
}
}
@@ -1558,49 +1525,40 @@ namespace WeddingShare.Controllers
}
}
private string TryGetIpAddress(HttpContext ctx)
private async Task<List<PhotoGallery>> GetPendingReviews()
{
try
var galleries = new List<PhotoGallery>();
var items = await _database.GetPendingGalleryItems();
if (items != null)
{
var ipAddress = TryGetHeaderValue(ctx, ["CF-Connecting-IP", "CF-Connecting-IPv6", "X-Forwarded-For", "HTTP_X_FORWARDED_FOR", "REMOTE_ADDR"]);
if (string.IsNullOrWhiteSpace(ipAddress) || ipAddress.Equals("Unknown", StringComparison.OrdinalIgnoreCase))
foreach (var galleryGroup in items.GroupBy(x => x.GalleryId))
{
return ctx.Connection?.RemoteIpAddress?.ToString() ?? "Unknown";
}
return ipAddress;
}
catch
{
return "Unknown";
}
}
private string TryGetCountry(HttpContext ctx)
{
return TryGetHeaderValue(ctx, [ "CF-IPCountry" ]);
}
private string TryGetHeaderValue(HttpContext ctx, string[] headers)
{
foreach (var header in headers)
{
try
{
string? val = ctx.Request.Headers[header];
if (!string.IsNullOrWhiteSpace(val))
var gallery = await _database.GetGallery(galleryGroup.Key);
if (gallery != null)
{
var vals = val.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
if (vals.Length != 0)
galleries.Add(new PhotoGallery()
{
return vals[0];
}
Gallery = gallery,
Images = items?.Select(x => new PhotoGalleryImage()
{
Id = x.Id,
GalleryId = x.GalleryId,
Name = Path.GetFileName(x.Title),
UploadedBy = x.UploadedBy,
UploadDate = x.UploadedDate,
ImagePath = $"/{Path.Combine(UploadsDirectory, gallery.Identifier).Remove(_hostingEnvironment.WebRootPath).Replace('\\', '/').TrimStart('/')}/Pending/{x.Title}",
ThumbnailPath = $"/{Path.Combine(ThumbnailsDirectory, gallery.Identifier).Remove(_hostingEnvironment.WebRootPath).Replace('\\', '/').TrimStart('/')}/{Path.GetFileNameWithoutExtension(x.Title)}.webp",
ThumbnailPathFallback = $"/{ThumbnailsDirectory.Remove(_hostingEnvironment.WebRootPath).Replace('\\', '/').TrimStart('/')}/{Path.GetFileNameWithoutExtension(x.Title)}.webp",
MediaType = x.MediaType
})?.ToList(),
ItemsPerPage = int.MaxValue,
});
}
}
catch { }
}
return "Unknown";
return galleries;
}
}
}

View File

@@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using Mysqlx.Expr;
using WeddingShare.Attributes;
using WeddingShare.Constants;
using WeddingShare.Enums;
@@ -13,7 +14,6 @@ using WeddingShare.Helpers.Database;
using WeddingShare.Helpers.Notifications;
using WeddingShare.Models;
using WeddingShare.Models.Database;
using static WeddingShare.Constants.Notifications;
namespace WeddingShare.Controllers
{
@@ -58,25 +58,29 @@ namespace WeddingShare.Controllers
}
[HttpPost]
public async Task<IActionResult> Login(string id = "default", string? key = null)
public async Task<IActionResult> Login(string? id, string? identifier, string? key = null)
{
id = id.Trim();
int? galleryId = 0;
var append = new List<KeyValuePair<string, string>>()
if (!string.IsNullOrWhiteSpace(identifier))
{
new KeyValuePair<string, string>("id", id)
};
galleryId = await _database.GetGalleryId(identifier);
}
else if (!string.IsNullOrWhiteSpace(id))
{
galleryId = await _database.GetGalleryIdByName(id);
}
GalleryModel? gallery = await _database.GetGallery(id);
GalleryModel? gallery = await _database.GetGallery(galleryId.Value);
if (gallery == null)
{
if (await _settings.GetOrDefault(Settings.Basic.GuestGalleryCreation, false))
{
if (await _database.GetGalleryCount() < await _settings.GetOrDefault(Settings.Basic.MaxGalleryCount, 1000000))
{
await _database.AddGallery(new GalleryModel()
gallery = await _database.AddGallery(new GalleryModel()
{
Name = id.ToLower(),
Name = id?.ToLower() ?? GalleryHelper.GenerateGalleryIdentifier(),
SecretKey = key,
Owner = 0
});
@@ -92,6 +96,11 @@ namespace WeddingShare.Controllers
}
}
var append = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("identifier", gallery.Identifier)
};
if (!string.IsNullOrWhiteSpace(key))
{
var enc = _encryptionHelper.IsEncryptionEnabled();
@@ -107,117 +116,127 @@ namespace WeddingShare.Controllers
[HttpGet]
[RequiresSecretKey]
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public async Task<IActionResult> Index(string id = "default", string? key = null, ViewMode? mode = null, GalleryGroup group = GalleryGroup.None, GalleryOrder order = GalleryOrder.Descending, GalleryFilter filter = GalleryFilter.All, string? culture = null, bool partial = false)
public async Task<IActionResult> Index(string? id, string? identifier, string? key = null, ViewMode? mode = null, GalleryGroup group = GalleryGroup.None, GalleryOrder order = GalleryOrder.Descending, GalleryFilter filter = GalleryFilter.All, string? culture = null, bool partial = false)
{
id = (!string.IsNullOrWhiteSpace(id) && !await _settings.GetOrDefault(Settings.Basic.SingleGalleryMode, false)) ? id.Trim().ToLower() : "default";
int? galleryId = null;
if (!string.IsNullOrWhiteSpace(culture))
{
try
{
HttpContext.Session.SetString(SessionKey.SelectedLanguage, culture);
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
}
catch { }
if (!string.IsNullOrWhiteSpace(identifier))
{
galleryId = await _database.GetGalleryId(identifier);
}
else if (!string.IsNullOrWhiteSpace(id))
{
galleryId = await _database.GetGalleryIdByName(id);
}
try
if (galleryId != null)
{
ViewBag.ViewMode = mode ?? (ViewMode)await _settings.GetOrDefault(Settings.Gallery.DefaultView, (int)ViewMode.Default, id);
}
catch
{
ViewBag.ViewMode = ViewMode.Default;
}
var deviceType = HttpContext.Session.GetString(SessionKey.DeviceType);
if (string.IsNullOrWhiteSpace(deviceType))
{
deviceType = (await _deviceDetector.ParseDeviceType(Request.Headers["User-Agent"].ToString())).ToString();
HttpContext.Session.SetString(SessionKey.DeviceType, deviceType ?? "Desktop");
}
ViewBag.IsMobile = !string.Equals("Desktop", deviceType, StringComparison.OrdinalIgnoreCase);
var galleryPath = Path.Combine(UploadsDirectory, id);
_fileHelper.CreateDirectoryIfNotExists(galleryPath);
_fileHelper.CreateDirectoryIfNotExists(Path.Combine(galleryPath, "Pending"));
GalleryModel? gallery = await _database.GetGallery(id);
if (gallery != null)
{
ViewBag.GalleryId = gallery.Name;
var secretKey = await _settings.GetOrDefault(Settings.Gallery.SecretKey, string.Empty, gallery.Name);
ViewBag.SecretKey = secretKey;
var currentPage = 1;
try
if (!string.IsNullOrWhiteSpace(culture))
{
currentPage = int.Parse((Request.Query.ContainsKey("page") && !string.IsNullOrWhiteSpace(Request.Query["page"])) ? Request.Query["page"].ToString().ToLower() : "1");
}
catch { }
var mediaType = MediaType.All;
if (mode == ViewMode.Slideshow)
{
mediaType = MediaType.Image;
}
else
{
switch (filter)
{
case GalleryFilter.Images:
mediaType = MediaType.Image;
break;
case GalleryFilter.Videos:
mediaType = MediaType.Video;
break;
default:
mediaType = MediaType.All;
break;
}
}
var orientation = ImageOrientation.None;
switch (filter)
{
case GalleryFilter.Landscape:
orientation = ImageOrientation.Landscape;
break;
case GalleryFilter.Portrait:
orientation = ImageOrientation.Portrait;
break;
case GalleryFilter.Square:
orientation = ImageOrientation.Square;
break;
default:
orientation = ImageOrientation.None;
break;
}
var itemsPerPage = await _settings.GetOrDefault(Settings.Gallery.ItemsPerPage, 50, gallery?.Name);
var allowedFileTypes = (await _settings.GetOrDefault(Settings.Gallery.AllowedFileTypes, ".jpg,.jpeg,.png,.mp4,.mov", gallery?.Name)).Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var items = (await _database.GetAllGalleryItems(gallery?.Id, GalleryItemState.Approved, mediaType, orientation, group, order, itemsPerPage, currentPage))?.Where(x => allowedFileTypes.Any(y => string.Equals(Path.GetExtension(x.Title).Trim('.'), y.Trim('.'), StringComparison.OrdinalIgnoreCase)));
var userPermissions = User?.Identity?.GetUserPermissions() ?? AccessPermissions.None;
var isAdmin = User?.Identity != null && User.Identity.IsAuthenticated && userPermissions.HasFlag(AccessPermissions.Gallery_Upload);
FileUploader? fileUploader = null;
if (!string.Equals("All", gallery?.Name, StringComparison.OrdinalIgnoreCase) && (await _settings.GetOrDefault(Settings.Gallery.Upload, true, gallery?.Name) || isAdmin))
{
var uploadActvated = isAdmin;
try
{
if (!uploadActvated)
{
var periods = (await _settings.GetOrDefault(Settings.Gallery.UploadPeriod, "1970-01-01 00:00", gallery?.Name))?.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
HttpContext.Session.SetString(SessionKey.SelectedLanguage, culture);
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
}
catch { }
}
try
{
ViewBag.ViewMode = mode ?? (ViewMode)await _settings.GetOrDefault(Settings.Gallery.DefaultView, (int)ViewMode.Default, galleryId);
}
catch
{
ViewBag.ViewMode = ViewMode.Default;
}
var deviceType = HttpContext.Session.GetString(SessionKey.DeviceType);
if (string.IsNullOrWhiteSpace(deviceType))
{
deviceType = (await _deviceDetector.ParseDeviceType(Request.Headers["User-Agent"].ToString())).ToString();
HttpContext.Session.SetString(SessionKey.DeviceType, deviceType ?? "Desktop");
}
ViewBag.IsMobile = !string.Equals("Desktop", deviceType, StringComparison.OrdinalIgnoreCase);
GalleryModel? gallery = await _database.GetGallery(galleryId.Value);
if (gallery != null)
{
var galleryPath = Path.Combine(UploadsDirectory, gallery.Identifier);
_fileHelper.CreateDirectoryIfNotExists(galleryPath);
_fileHelper.CreateDirectoryIfNotExists(Path.Combine(galleryPath, "Pending"));
ViewBag.GalleryIdentifier = gallery.Identifier;
var secretKey = await _settings.GetOrDefault(Settings.Gallery.SecretKey, string.Empty, gallery.Id);
ViewBag.SecretKey = secretKey;
var currentPage = 1;
try
{
currentPage = int.Parse((Request.Query.ContainsKey("page") && !string.IsNullOrWhiteSpace(Request.Query["page"])) ? Request.Query["page"].ToString().ToLower() : "1");
}
catch { }
var mediaType = MediaType.All;
if (mode == ViewMode.Slideshow)
{
mediaType = MediaType.Image;
}
else
{
switch (filter)
{
case GalleryFilter.Images:
mediaType = MediaType.Image;
break;
case GalleryFilter.Videos:
mediaType = MediaType.Video;
break;
default:
mediaType = MediaType.All;
break;
}
}
var orientation = ImageOrientation.None;
switch (filter)
{
case GalleryFilter.Landscape:
orientation = ImageOrientation.Landscape;
break;
case GalleryFilter.Portrait:
orientation = ImageOrientation.Portrait;
break;
case GalleryFilter.Square:
orientation = ImageOrientation.Square;
break;
default:
orientation = ImageOrientation.None;
break;
}
var itemsPerPage = await _settings.GetOrDefault(Settings.Gallery.ItemsPerPage, 50, gallery?.Id);
var allowedFileTypes = (await _settings.GetOrDefault(Settings.Gallery.AllowedFileTypes, ".jpg,.jpeg,.png,.mp4,.mov", gallery?.Id)).Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var items = (await _database.GetAllGalleryItems(gallery?.Id, GalleryItemState.Approved, mediaType, orientation, group, order, itemsPerPage, currentPage))?.Where(x => allowedFileTypes.Any(y => string.Equals(Path.GetExtension(x.Title).Trim('.'), y.Trim('.'), StringComparison.OrdinalIgnoreCase)));
var userPermissions = User?.Identity?.GetUserPermissions() ?? AccessPermissions.None;
var isGalleryAdmin = User?.Identity != null && User.Identity.IsAuthenticated && userPermissions.HasFlag(AccessPermissions.Gallery_Upload);
var uploadActvated = !gallery.Identifier.Equals("All", StringComparison.OrdinalIgnoreCase) && (await _settings.GetOrDefault(Settings.Gallery.Upload, true, gallery?.Id) || isGalleryAdmin);
if (uploadActvated)
{
try
{
var periods = (await _settings.GetOrDefault(Settings.Gallery.UploadPeriod, "1970-01-01 00:00", gallery?.Id))?.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
if (periods != null)
{
{
uploadActvated = false;
var now = DateTime.UtcNow;
foreach (var period in periods)
{
@@ -244,48 +263,43 @@ namespace WeddingShare.Controllers
}
}
}
}
catch
{
uploadActvated = true;
catch
{
uploadActvated = true;
}
}
if (uploadActvated)
{
fileUploader = new FileUploader(gallery?.Name ?? "default", secretKey, "/Gallery/UploadImage", await _settings.GetOrDefault(Settings.IdentityCheck.RequireIdentityForUpload, false));
}
var itemCounts = await _database.GetGalleryItemCount(gallery?.Id, GalleryItemState.All, mediaType, orientation);
var model = new PhotoGallery()
{
Gallery = gallery,
SecretKey = secretKey,
Images = items?.Select(x => new PhotoGalleryImage()
{
Id = x.Id,
GalleryId = x.GalleryId,
Name = Path.GetFileName(x.Title),
UploadedBy = x.UploadedBy,
UploadDate = x.UploadedDate,
ImagePath = $"/{Path.Combine(UploadsDirectory, gallery.Identifier).Remove(_hostingEnvironment.WebRootPath).Replace('\\', '/').TrimStart('/')}/{x.Title}",
ThumbnailPath = $"/{Path.Combine(ThumbnailsDirectory, gallery.Identifier).Remove(_hostingEnvironment.WebRootPath).Replace('\\', '/').TrimStart('/')}/{Path.GetFileNameWithoutExtension(x.Title)}.webp",
ThumbnailPathFallback = $"/{ThumbnailsDirectory.Remove(_hostingEnvironment.WebRootPath).Replace('\\', '/').TrimStart('/')}/{Path.GetFileNameWithoutExtension(x.Title)}.webp",
MediaType = x.MediaType
})?.ToList(),
CurrentPage = currentPage,
ApprovedCount = (int)itemCounts["Approved"],
PendingCount = (int)itemCounts["Pending"],
ItemsPerPage = itemsPerPage,
UploadActivated = uploadActvated,
ViewMode = (ViewMode)ViewBag.ViewMode,
GroupBy = group,
OrderBy = order,
Pagination = order != GalleryOrder.Random,
LoadScripts = !partial
};
return partial ? PartialView("~/Views/Gallery/GalleryWrapper.cshtml", model) : View(model);
}
var itemCounts = await _database.GetGalleryItemCount(gallery?.Id, GalleryItemState.All, mediaType, orientation);
var model = new PhotoGallery()
{
GalleryId = gallery?.Id,
GalleryName = gallery?.Name,
Images = items?.Select(x => new PhotoGalleryImage()
{
Id = x.Id,
GalleryId = x.GalleryId,
GalleryName = x.GalleryName,
Name = Path.GetFileName(x.Title),
UploadedBy = x.UploadedBy,
UploadDate = x.UploadedDate,
ImagePath = $"/{Path.Combine(UploadsDirectory, x.GalleryName).Remove(_hostingEnvironment.WebRootPath).Replace('\\', '/').TrimStart('/')}/{x.Title}",
ThumbnailPath = $"/{ThumbnailsDirectory.Remove(_hostingEnvironment.WebRootPath).Replace('\\', '/').TrimStart('/')}/{Path.GetFileNameWithoutExtension(x.Title)}.webp",
MediaType = x.MediaType
})?.ToList(),
CurrentPage = currentPage,
ApprovedCount = (int)itemCounts["Approved"],
PendingCount = (int)itemCounts["Pending"],
ItemsPerPage = itemsPerPage,
FileUploader = fileUploader,
ViewMode = (ViewMode)ViewBag.ViewMode,
GroupBy = group,
OrderBy = order,
Pagination = order != GalleryOrder.Random,
LoadScripts = !partial
};
return partial ? PartialView("~/Views/Gallery/GalleryWrapper.cshtml", model) : View(model);
}
return new RedirectToActionResult("Index", "Error", new { Reason = ErrorCode.InvalidGalleryId }, false);
@@ -298,8 +312,7 @@ namespace WeddingShare.Controllers
try
{
string galleryId = (Request?.Form?.FirstOrDefault(x => string.Equals("Id", x.Key, StringComparison.OrdinalIgnoreCase)).Value)?.ToString()?.ToLower() ?? string.Empty;
if (string.IsNullOrWhiteSpace(galleryId))
if (!int.TryParse((Request?.Form?.FirstOrDefault(x => string.Equals("Id", x.Key, StringComparison.OrdinalIgnoreCase)).Value)?.ToString()?.ToLower() ?? string.Empty, out var galleryId))
{
return Json(new { success = false, uploaded = 0, errors = new List<string>() { _localizer["Invalid_Gallery_Id"].Value } });
}
@@ -307,19 +320,19 @@ namespace WeddingShare.Controllers
var gallery = await _database.GetGallery(galleryId);
if (gallery != null)
{
var secretKey = await _settings.GetOrDefault(Settings.Gallery.SecretKey, string.Empty, galleryId);
var secretKey = await _settings.GetOrDefault(Settings.Gallery.SecretKey, string.Empty, gallery.Id);
string key = (Request?.Form?.FirstOrDefault(x => string.Equals("SecretKey", x.Key, StringComparison.OrdinalIgnoreCase)).Value)?.ToString() ?? string.Empty;
if (!string.IsNullOrWhiteSpace(secretKey) && !string.Equals(secretKey, key))
{
return Json(new { success = false, uploaded = 0, errors = new List<string>() { _localizer["Invalid_Secret_Key_Warning"].Value } });
}
string uploadedBy = HttpContext.Session.GetString(SessionKey.ViewerIdentity) ?? "Anonymous";
string uploadedBy = HttpContext.Session.GetString(SessionKey.ViewerIdentity)?.Trim() ?? "Anonymous";
var files = Request?.Form?.Files;
if (files != null && files.Count > 0)
{
var requiresReview = await _settings.GetOrDefault(Settings.Gallery.RequireReview, true, galleryId);
var requiresReview = await _settings.GetOrDefault(Settings.Gallery.RequireReview, true, gallery.Id);
var uploaded = 0;
var errors = new List<string>();
@@ -328,11 +341,11 @@ namespace WeddingShare.Controllers
try
{
var extension = Path.GetExtension(file.FileName);
var maxGallerySize = await _settings.GetOrDefault(Settings.Gallery.MaxSizeMB, 1024L, galleryId) * 1000000;
var maxFilesSize = await _settings.GetOrDefault(Settings.Gallery.MaxFileSizeMB, 10L, galleryId) * 1000000;
var galleryPath = Path.Combine(UploadsDirectory, gallery.Name);
var maxGallerySize = await _settings.GetOrDefault(Settings.Gallery.MaxSizeMB, 1024L, gallery.Id) * 1000000;
var maxFilesSize = await _settings.GetOrDefault(Settings.Gallery.MaxFileSizeMB, 50L, gallery.Id) * 1000000;
var galleryPath = Path.Combine(UploadsDirectory, gallery.Identifier);
var allowedFileTypes = (await _settings.GetOrDefault(Settings.Gallery.AllowedFileTypes, ".jpg,.jpeg,.png,.mp4,.mov", galleryId)).Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
var allowedFileTypes = (await _settings.GetOrDefault(Settings.Gallery.AllowedFileTypes, ".jpg,.jpeg,.png,.mp4,.mov", gallery.Id)).Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
if (!allowedFileTypes.Any(x => string.Equals(x.Trim('.'), extension.Trim('.'), StringComparison.OrdinalIgnoreCase)))
{
errors.Add($"{_localizer["File_Upload_Failed"].Value}. {_localizer["Invalid_File_Type"].Value}");
@@ -347,7 +360,7 @@ namespace WeddingShare.Controllers
}
else
{
var fileName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
var fileName = _fileHelper.SanitizeFilename($"{(!string.IsNullOrWhiteSpace(uploadedBy) ? $"{uploadedBy.Replace(" ", "_")}-" : string.Empty)}{Guid.NewGuid()}{Path.GetExtension(file.FileName)}");
galleryPath = requiresReview ? Path.Combine(galleryPath, "Pending") : galleryPath;
_fileHelper.CreateDirectoryIfNotExists(galleryPath);
@@ -366,16 +379,19 @@ namespace WeddingShare.Controllers
}
var checksum = await _fileHelper.GetChecksum(filePath);
if (await _settings.GetOrDefault(Settings.Gallery.PreventDuplicates, true, galleryId) && (string.IsNullOrWhiteSpace(checksum) || await _database.GetGalleryItemByChecksum(gallery.Id, checksum) != null))
if (await _settings.GetOrDefault(Settings.Gallery.PreventDuplicates, true, gallery.Id) && (string.IsNullOrWhiteSpace(checksum) || await _database.GetGalleryItemByChecksum(gallery.Id, checksum) != null))
{
errors.Add($"{_localizer["File_Upload_Failed"].Value}. {_localizer["Duplicate_Item_Detected"].Value}");
_fileHelper.DeleteFileIfExists(filePath);
}
else
{
var savePath = Path.Combine(ThumbnailsDirectory, $"{Path.GetFileNameWithoutExtension(filePath)}.webp");
var gallerySavePath = Path.Combine(ThumbnailsDirectory, gallery.Identifier);
_fileHelper.CreateDirectoryIfNotExists(ThumbnailsDirectory);
_fileHelper.CreateDirectoryIfNotExists(gallerySavePath);
var savePath = Path.Combine(gallerySavePath, $"{Path.GetFileNameWithoutExtension(filePath)}.webp");
await _imageHelper.GenerateThumbnail(filePath, savePath, await _settings.GetOrDefault(Settings.Basic.ThumbnailSize, 720));
var item = await _database.AddGalleryItem(new GalleryItemModel()
@@ -434,8 +450,7 @@ namespace WeddingShare.Controllers
try
{
string galleryId = (Request?.Form?.FirstOrDefault(x => string.Equals("Id", x.Key, StringComparison.OrdinalIgnoreCase)).Value)?.ToString()?.ToLower() ?? string.Empty;
if (string.IsNullOrWhiteSpace(galleryId))
if (!int.TryParse((Request?.Form?.FirstOrDefault(x => string.Equals("Id", x.Key, StringComparison.OrdinalIgnoreCase)).Value)?.ToString()?.ToLower() ?? string.Empty, out var galleryId))
{
return Json(new { success = false, uploaded = 0, errors = new List<string>() { _localizer["Invalid_Gallery_Id"].Value } });
}
@@ -456,7 +471,7 @@ namespace WeddingShare.Controllers
int uploaded = int.Parse((Request?.Form?.FirstOrDefault(x => string.Equals("Count", x.Key, StringComparison.OrdinalIgnoreCase)).Value)?.ToString() ?? "0");
if (uploaded > 0 && requiresReview && await _settings.GetOrDefault(Notifications.Alerts.PendingReview, true))
{
await _notificationHelper.Send(_localizer["New_Items_Pending_Review"].Value, $"{uploaded} new item(s) have been uploaded to gallery '{gallery.Name}' by '{(!string.IsNullOrWhiteSpace(uploadedBy) ? uploadedBy : "Anonymous")}' and are awaiting your review.", _urlHelper.GenerateBaseUrl(HttpContext?.Request, "/Admin"));
await _notificationHelper.Send(_localizer["New_Items_Pending_Review"].Value, $"{uploaded} new item(s) have been uploaded to gallery '{gallery.Name}' by '{(!string.IsNullOrWhiteSpace(uploadedBy) ? uploadedBy : "Anonymous")}' and are awaiting your review.", _urlHelper.GenerateBaseUrl(HttpContext?.Request, "/Account"));
}
Response.StatusCode = (int)HttpStatusCode.OK;
@@ -486,15 +501,15 @@ namespace WeddingShare.Controllers
{
secretKey = secretKey ?? string.Empty;
var gallerySecret = await _settings.GetOrDefault(Settings.Gallery.SecretKey, string.Empty, gallery.Name);
var gallerySecret = await _settings.GetOrDefault(Settings.Gallery.SecretKey, string.Empty, gallery.Id);
if (!secretKey.Equals(gallerySecret))
{
return Json(new { success = false, message = _localizer["Failed_Download_Gallery_Invalid_Key"].Value });
}
if (await _settings.GetOrDefault(Settings.Gallery.Download, true, gallery?.Name) || (User?.Identity != null && User.Identity.IsAuthenticated))
if (await _settings.GetOrDefault(Settings.Gallery.Download, true, gallery?.Id) || (User?.Identity != null && User.Identity.IsAuthenticated))
{
var galleryDir = id > 0 ? Path.Combine(UploadsDirectory, gallery.Name) : UploadsDirectory;
var galleryDir = id > 0 ? Path.Combine(UploadsDirectory, gallery.Identifier) : UploadsDirectory;
if (_fileHelper.DirectoryExists(galleryDir))
{
var keepFiles = new List<string>();
@@ -554,7 +569,7 @@ namespace WeddingShare.Controllers
_fileHelper.CreateDirectoryIfNotExists(TempDirectory);
var tempZipFile = Path.Combine(TempDirectory, $"{gallery.Name}-{DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")}.zip");
var tempZipFile = Path.Combine(TempDirectory, $"{gallery.Identifier}-{DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")}.zip");
ZipFile.CreateFromDirectory(galleryDir, tempZipFile, CompressionLevel.Optimal, false);
if (User?.Identity == null || !User.Identity.IsAuthenticated)

View File

@@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using WeddingShare.Constants;
using WeddingShare.Extensions;
using WeddingShare.Helpers;
using WeddingShare.Helpers.Database;
using WeddingShare.Models;
@@ -15,14 +16,16 @@ namespace WeddingShare.Controllers
private readonly ISettingsHelper _settings;
private readonly IDatabaseHelper _database;
private readonly IDeviceDetector _deviceDetector;
private readonly IAuditHelper _audit;
private readonly ILogger _logger;
private readonly IStringLocalizer<Lang.Translations> _localizer;
public HomeController(ISettingsHelper settings, IDatabaseHelper database, IDeviceDetector deviceDetector, ILogger<HomeController> logger, IStringLocalizer<Lang.Translations> localizer)
public HomeController(ISettingsHelper settings, IDatabaseHelper database, IDeviceDetector deviceDetector, IAuditHelper audit, ILogger<HomeController> logger, IStringLocalizer<Lang.Translations> localizer)
{
_settings = settings;
_database = database;
_deviceDetector = deviceDetector;
_audit = audit;
_logger = logger;
_localizer = localizer;
}
@@ -44,14 +47,14 @@ namespace WeddingShare.Controllers
if (await _settings.GetOrDefault(Settings.Basic.SingleGalleryMode, false))
{
var key = await _settings.GetOrDefault(Settings.Gallery.SecretKey, string.Empty, "default");
var key = await _settings.GetOrDefault(Settings.Gallery.SecretKey, string.Empty, 1);
if (string.IsNullOrWhiteSpace(key))
{
return RedirectToAction("Index", "Gallery");
return RedirectToAction("Index", "Gallery", new { identifier = "default" });
}
}
model.GalleryNames = await _settings.GetOrDefault(Settings.GallerySelector.Dropdown, false) ? await _database.GetGalleryNames() : new List<string>() { "default" };
model.GalleryNames = await _settings.GetOrDefault(Settings.GallerySelector.Dropdown, false) ? (await _database.GetGalleryNames()).Where(x => !x.Equals("all", StringComparison.OrdinalIgnoreCase)) : new List<string>();
if (await _settings.GetOrDefault(Settings.GallerySelector.HideDefaultOption, false))
{
model.GalleryNames = model.GalleryNames.Where(x => !x.Equals("default", StringComparison.OrdinalIgnoreCase));
@@ -65,12 +68,28 @@ namespace WeddingShare.Controllers
return View(model);
}
[HttpGet]
[Route("CookiePolicy")]
[Route("Home/CookiePolicy")]
public async Task<IActionResult> CookiePolicy()
{
ViewBag.CompanyName = await _settings.GetOrDefault(Settings.Basic.Title, "WeddingShare");
ViewBag.SiteHostname = await _settings.GetOrDefault(Settings.Basic.BaseUrl, "www.wedding-share.org");
ViewBag.CustomPolicy = await _settings.GetOrDefault(Settings.Policies.CookiePolicy, string.Empty);
return View("~/Views/Home/CookiePolicy.cshtml");
}
[HttpPost]
public IActionResult SetIdentity(string name)
{
try
{
if (Regex.IsMatch(name, @"^[a-zA-Z-\s\-\']+$", RegexOptions.Compiled))
if (HtmlSanitizer.MayContainXss(name))
{
return Json(new { success = false, reason = 1 });
}
else
{
HttpContext.Session.SetString(SessionKey.ViewerIdentity, name);
@@ -84,5 +103,22 @@ namespace WeddingShare.Controllers
return Json(new { success = false });
}
[HttpPost]
public async Task<IActionResult> LogCookieApproval()
{
try
{
var ipAddress = Request.HttpContext.TryGetIpAddress();
return Json(new { success = await _audit.LogAction("Visitor", $"{_localizer["Audit_CookieConsentApproved"].Value}: {ipAddress}") });
}
catch (Exception ex)
{
_logger.LogError(ex, $"{_localizer["Cookie_Audit_Error"].Value}");
}
return Json(new { success = false });
}
}
}

View File

@@ -12,11 +12,13 @@ namespace WeddingShare.Controllers
{
private readonly ISettingsHelper _settings;
private readonly ILanguageHelper _languageHelper;
private readonly ILogger<LanguageController> _logger;
public LanguageController(ISettingsHelper settings, ILanguageHelper languageHelper)
public LanguageController(ISettingsHelper settings, ILanguageHelper languageHelper, ILogger<LanguageController> logger)
{
_settings = settings;
_languageHelper = languageHelper;
_logger = logger;
}
[HttpGet]
@@ -29,11 +31,10 @@ namespace WeddingShare.Controllers
var defaultLang = HttpContext.Session.GetString(SessionKey.SelectedLanguage);
if (string.IsNullOrWhiteSpace(defaultLang))
{
defaultLang = await _settings.GetOrDefault(Settings.Languages.Default, "en-GB");
defaultLang = await _languageHelper.GetOrFallbackCulture(string.Empty, await _settings.GetOrDefault(Settings.Languages.Default, "en-GB"));
}
options = (await _languageHelper.DetectSupportedCulturesAsync())
.Where(x => x.Name.Contains("-"))
.Select(x => new SupportedLanguage() { Key = x.Name, Value = $"{(x.EnglishName.Contains("(") ? x.EnglishName.Substring(0, x.EnglishName.IndexOf("(")) : x.EnglishName).Trim()} ({x.Name})", Selected = string.Equals(defaultLang, x.Name, StringComparison.OrdinalIgnoreCase) })
.OrderBy(x => x.Value.ToLower())
.ToList();
@@ -48,6 +49,8 @@ namespace WeddingShare.Controllers
{
try
{
culture = await _languageHelper.GetOrFallbackCulture(culture, await _settings.GetOrDefault(Settings.Languages.Default, "en-GB"));
HttpContext.Session.SetString(SessionKey.SelectedLanguage, culture);
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
@@ -57,7 +60,19 @@ namespace WeddingShare.Controllers
return Json(new { success = true });
}
catch { }
catch (Exception ex)
{
_logger.LogWarning(ex, $"Failed to set display language to '{culture}' - {ex?.Message}");
culture = "en-GB";
HttpContext.Session.SetString(SessionKey.SelectedLanguage, culture);
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
}
return Json(new { success = false });
}

View File

@@ -0,0 +1,13 @@
namespace WeddingShare.Enums
{
public enum AccountTabs
{
Reviews,
Galleries,
Users,
Resources,
Settings,
Audit,
Data
}
}

View File

@@ -0,0 +1,50 @@
namespace WeddingShare.Extensions
{
public static class HttpContextExtensions
{
public static string TryGetIpAddress(this HttpContext ctx)
{
try
{
var ipAddress = TryGetHeaderValue(ctx, ["CF-Connecting-IP", "CF-Connecting-IPv6", "X-Forwarded-For", "HTTP_X_FORWARDED_FOR", "REMOTE_ADDR"]);
if (string.IsNullOrWhiteSpace(ipAddress) || ipAddress.Equals("Unknown", StringComparison.OrdinalIgnoreCase))
{
return ctx.Connection?.RemoteIpAddress?.ToString() ?? "Unknown";
}
return ipAddress;
}
catch
{
return "Unknown";
}
}
public static string TryGetCountry(this HttpContext ctx)
{
return ctx.TryGetHeaderValue(["CF-IPCountry"]);
}
public static string TryGetHeaderValue(this HttpContext ctx, string[] headers)
{
foreach (var header in headers)
{
try
{
string? val = ctx.Request.Headers[header];
if (!string.IsNullOrWhiteSpace(val))
{
var vals = val.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
if (vals.Length != 0)
{
return vals[0];
}
}
}
catch { }
}
return "Unknown";
}
}
}

View File

@@ -8,10 +8,10 @@ namespace WeddingShare.Helpers.Database
Task<int> GetGalleryCount();
Task<IEnumerable<string>> GetGalleryNames();
Task<List<GalleryModel>> GetAllGalleries();
Task<int?> GetGalleryId(string name);
Task<int?> GetGalleryId(string identifier);
Task<int?> GetGalleryIdByName(string name);
Task<string?> GetGalleryName(int id);
Task<GalleryModel?> GetGallery(int id);
Task<GalleryModel?> GetGallery(string name);
Task<GalleryModel?> AddGallery(GalleryModel model);
Task<GalleryModel?> EditGallery(GalleryModel model);
Task<bool> WipeGallery(GalleryModel model);
@@ -27,7 +27,7 @@ namespace WeddingShare.Helpers.Database
Task<GalleryItemModel?> AddGalleryItem(GalleryItemModel model);
Task<GalleryItemModel?> EditGalleryItem(GalleryItemModel model);
Task<bool> DeleteGalleryItem(GalleryItemModel model);
Task<bool> InitAdminAccount(UserModel model);
Task<bool> InitOwnerAccount(UserModel model);
Task<bool> ValidateCredentials(string username, string password);
Task<List<UserModel>?> GetAllUsers();
Task<UserModel?> GetUser(int id);
@@ -43,14 +43,15 @@ namespace WeddingShare.Helpers.Database
Task<bool> ResetMultiFactorToDefault();
Task<bool> Import(string path);
Task<bool> Export(string path);
Task<IEnumerable<SettingModel>?> GetAllSettings(string? gallery = "");
Task<SettingModel?> GetSetting(string id, string? gallery = "");
Task<SettingModel?> GetGallerySpecificSetting(string id, string gallery);
Task<SettingModel?> AddSetting(SettingModel model, string? gallery = "");
Task<SettingModel?> EditSetting(SettingModel model, string? gallery = "");
Task<SettingModel?> SetSetting(SettingModel model, string? gallery = "");
Task<bool> DeleteSetting(SettingModel model, string? gallery = "");
Task<bool> DeleteAllSettings(string? gallery = "");
Task<IEnumerable<SettingModel>?> GetAllSettings(int? galleryId = null);
Task<SettingModel?> GetSetting(string id);
Task<SettingModel?> GetSetting(string id, int gallery);
Task<SettingModel?> GetGallerySpecificSetting(string id, int galleryId);
Task<SettingModel?> AddSetting(SettingModel model, int? galleryId = null);
Task<SettingModel?> EditSetting(SettingModel model, int? galleryId = null);
Task<SettingModel?> SetSetting(SettingModel model, int? galleryId = null);
Task<bool> DeleteSetting(SettingModel model, int? galleryId = null);
Task<bool> DeleteAllSettings(int? galleryId = null);
Task<CustomResourceModel?> GetCustomResource(int id);
Task<List<CustomResourceModel>> GetAllCustomResources();
Task<CustomResourceModel?> AddCustomResource(CustomResourceModel model);

View File

@@ -1,6 +1,5 @@
using System.Data;
using System.Data.Common;
using Microsoft.Data.Sqlite;
using MySql.Data.MySqlClient;
using WeddingShare.Constants;
using WeddingShare.Enums;
@@ -19,6 +18,8 @@ namespace WeddingShare.Helpers.Database
_logger = logger;
_logger.LogInformation($"Using MySQL connection string: '{_connString}'");
this.TestConnection();
}
#region Setup
@@ -34,6 +35,28 @@ namespace WeddingShare.Helpers.Database
return conn;
}
private void TestConnection()
{
try
{
using (var conn = GetConnection().Result)
{
var cmd = CreateCommand($"SELECT 1", conn);
cmd.CommandType = CommandType.Text;
conn.Open();
cmd.ExecuteScalarAsync();
conn.Close();
}
}
catch (Exception ex)
{
var message = $"Failed to connect to the database instance. Please check your database is up and running and the connection string used is correct";
_logger.LogCritical(ex, message);
Environment.FailFast(message, ex);
}
}
private MySqlCommand CreateCommand(string cmd, MySqlConnection conn)
{
return new MySqlCommand(cmd, conn);
@@ -143,14 +166,46 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<int?> GetGalleryId(string? name)
public async Task<int?> GetGalleryIdByName(string? name)
{
int? result = null;
if (!string.IsNullOrWhiteSpace(name))
{
return (await this.GetGallery(name))?.Id;
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"SELECT g.`id` FROM `galleries` AS g WHERE UPPER(g.`name`)=UPPER(@Name);", conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("Name", name);
await conn.OpenAsync();
result = (int?)(long?)await cmd.ExecuteScalarAsync();
await conn.CloseAsync();
}
}
return null;
return result;
}
public async Task<int?> GetGalleryId(string identifier)
{
int? result = null;
if (!string.IsNullOrWhiteSpace(identifier))
{
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"SELECT g.`id` FROM `galleries` AS g WHERE UPPER(g.`identifier`)=UPPER(@Identifier);", conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("Identifier", identifier);
await conn.OpenAsync();
result = (int?)(long?)await cmd.ExecuteScalarAsync();
await conn.CloseAsync();
}
}
return result;
}
public async Task<string?> GetGalleryName(int id)
@@ -186,12 +241,14 @@ namespace WeddingShare.Helpers.Database
result = new GalleryModel()
{
Id = 0,
Identifier = "all",
Name = "all",
SecretKey = null,
TotalItems = galleries?.Sum(x => x.TotalItems) ?? 0,
ApprovedItems = galleries?.Sum(x => x.ApprovedItems) ?? 0,
PendingItems = galleries?.Sum(x => x.PendingItems) ?? 0,
TotalGallerySize = galleries?.Sum(x => x.TotalGallerySize) ?? 0
TotalGallerySize = galleries?.Sum(x => x.TotalGallerySize) ?? 0,
Owner = 1
};
}
}
@@ -201,45 +258,15 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<GalleryModel?> GetGallery(string name)
{
GalleryModel? result = null;
if (string.Equals("All", name, StringComparison.OrdinalIgnoreCase))
{
result = await GetGallery(0);
}
else
{
long? galleryId = 0;
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"SELECT `id` FROM `galleries` WHERE `name`=@Name;", conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("Name", name?.ToLower());
await conn.OpenAsync();
galleryId = (long?)await cmd.ExecuteScalarAsync();
await conn.CloseAsync();
}
if (galleryId != null && galleryId > 0)
{
result = await GetGallery((int)galleryId);
}
}
return result;
}
public async Task<GalleryModel?> AddGallery(GalleryModel model)
{
GalleryModel? result = null;
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"INSERT INTO `galleries` (`name`, `secret_key`, `owner`) VALUES (@Name, @SecretKey, @Owner); SELECT g.*, COUNT(gi.`id`) AS `total`, SUM(CASE WHEN gi.`state`=@ApprovedState THEN 1 ELSE 0 END) AS `approved`, SUM(CASE WHEN gi.`state`=@PendingState THEN 1 ELSE 0 END) AS `pending`, SUM(gi.file_size) AS `total_gallery_size` FROM `galleries` AS g LEFT JOIN `gallery_items` AS gi ON g.`id` = gi.`gallery_id` WHERE g.`id`=LAST_INSERT_ID();", conn);
var cmd = CreateCommand($"INSERT INTO `galleries` (`identifier`, `name`, `secret_key`, `owner`) VALUES (@Identifier, @Name, @SecretKey, @Owner); SELECT g.*, COUNT(gi.`id`) AS `total`, SUM(CASE WHEN gi.`state`=@ApprovedState THEN 1 ELSE 0 END) AS `approved`, SUM(CASE WHEN gi.`state`=@PendingState THEN 1 ELSE 0 END) AS `pending`, SUM(gi.file_size) AS `total_gallery_size` FROM `galleries` AS g LEFT JOIN `gallery_items` AS gi ON g.`id` = gi.`gallery_id` WHERE g.`id`=LAST_INSERT_ID();", conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("Identifier", model.Identifier);
cmd.Parameters.AddWithValue("Name", model.Name.ToLower());
cmd.Parameters.AddWithValue("SecretKey", !string.IsNullOrWhiteSpace(model.SecretKey) ? model.SecretKey : DBNull.Value);
cmd.Parameters.AddWithValue("ApprovedState", (int)GalleryItemState.Approved);
@@ -272,7 +299,7 @@ namespace WeddingShare.Helpers.Database
{
Id = Settings.Gallery.SecretKey,
Value = model.SecretKey
}, result.Name);
}, result.Id);
}
return result;
@@ -735,7 +762,7 @@ namespace WeddingShare.Helpers.Database
#endregion
#region Users
public async Task<bool> InitAdminAccount(UserModel model)
public async Task<bool> InitOwnerAccount(UserModel model)
{
bool result = false;
@@ -918,7 +945,7 @@ namespace WeddingShare.Helpers.Database
{
bool result = false;
if (model.Id > 1 && !string.Equals("Admin", model.Username, StringComparison.OrdinalIgnoreCase))
if (model.Id > 1)
{
using (var conn = await GetConnection())
{
@@ -1267,7 +1294,7 @@ namespace WeddingShare.Helpers.Database
#endregion
#region Settings
public async Task<IEnumerable<SettingModel>?> GetAllSettings(string? gallery = "")
public async Task<IEnumerable<SettingModel>?> GetAllSettings(int? galleryId = null)
{
List<SettingModel> result = new List<SettingModel>();
@@ -1284,24 +1311,20 @@ namespace WeddingShare.Helpers.Database
result = await ReadSettings(reader);
}
if (result != null && !string.IsNullOrWhiteSpace(gallery))
if (result != null && galleryId != null)
{
var galleryId = await this.GetGalleryId(gallery);
if (galleryId != null)
{
// Get Gallery Overrides
cmd = CreateCommand($"SELECT `id`, `value` FROM `gallery_settings` WHERE `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", (int)galleryId);
cmd.CommandType = CommandType.Text;
// Get Gallery Overrides
cmd = CreateCommand($"SELECT `id`, `value` FROM `gallery_settings` WHERE `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", (int)galleryId);
cmd.CommandType = CommandType.Text;
using (var reader = await cmd.ExecuteReaderAsync())
using (var reader = await cmd.ExecuteReaderAsync())
{
var overrides = (await ReadSettings(reader))?.Where(x => !string.IsNullOrWhiteSpace(x.Value));
if (overrides != null && overrides.Any())
{
var overrides = (await ReadSettings(reader))?.Where(x => !string.IsNullOrWhiteSpace(x.Value));
if (overrides != null && overrides.Any())
{
result = result.Where(x => !overrides.Any(o => o.Id.Equals(x.Id, StringComparison.OrdinalIgnoreCase))).ToList();
result.AddRange(overrides);
}
result = result.Where(x => !overrides.Any(o => o.Id.Equals(x.Id, StringComparison.OrdinalIgnoreCase))).ToList();
result.AddRange(overrides);
}
}
}
@@ -1312,17 +1335,26 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<SettingModel?> GetSetting(string id, string? gallery = "")
public async Task<SettingModel?> GetSetting(string id)
{
return await GetSetting(id, 0);
}
public async Task<SettingModel?> GetSetting(string id, string gallery)
{
return await GetSetting(id, await this.GetGalleryIdByName(gallery) ?? 0);
}
public async Task<SettingModel?> GetSetting(string id, int galleryId)
{
SettingModel? result;
var galleryId = await this.GetGalleryId(gallery);
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"SELECT `id`, `value` FROM (SELECT `id`, `value`, '2' AS `priority` FROM `settings` WHERE `id`=@Id UNION SELECT `id`, `value`, '1' AS `priority` FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId) ORDER BY `priority` ASC LIMIT 1;", conn);
var cmd = CreateCommand($"SELECT `id`, `value` FROM (SELECT `id`, `value`, '2' AS `priority` FROM `settings` WHERE `id`=@Id UNION SELECT `id`, `value`, '1' AS `priority` FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId) AS sq1 ORDER BY `priority` ASC LIMIT 1;", conn);
cmd.Parameters.AddWithValue("Id", id.ToUpper());
cmd.Parameters.AddWithValue("GalleryId", galleryId ?? 0);
cmd.Parameters.AddWithValue("GalleryId", galleryId);
cmd.CommandType = CommandType.Text;
await conn.OpenAsync();
@@ -1336,42 +1368,37 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<SettingModel?> GetGallerySpecificSetting(string id, string gallery)
public async Task<SettingModel?> GetGallerySpecificSetting(string id, int galleryId)
{
SettingModel? result = null;
var galleryId = await this.GetGalleryId(gallery);
if (galleryId != null)
using (var conn = await GetConnection())
{
using (var conn = await GetConnection())
var cmd = CreateCommand($"SELECT `id`, `value` FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("Id", id.ToUpper());
cmd.Parameters.AddWithValue("GalleryId", galleryId);
cmd.CommandType = CommandType.Text;
await conn.OpenAsync();
using (var reader = await cmd.ExecuteReaderAsync())
{
var cmd = CreateCommand($"SELECT `id`, `value` FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("Id", id.ToUpper());
cmd.Parameters.AddWithValue("GalleryId", galleryId);
cmd.CommandType = CommandType.Text;
await conn.OpenAsync();
using (var reader = await cmd.ExecuteReaderAsync())
{
result = (await ReadSettings(reader))?.FirstOrDefault();
}
await conn.CloseAsync();
result = (await ReadSettings(reader))?.FirstOrDefault();
}
await conn.CloseAsync();
}
return result;
}
public async Task<SettingModel?> AddSetting(SettingModel model, string? gallery = "")
public async Task<SettingModel?> AddSetting(SettingModel model, int? galleryId = null)
{
SettingModel? result = null;
var galleryId = await this.GetGalleryId(gallery);
using (var conn = await GetConnection())
{
MySqlCommand cmd;
if (!string.IsNullOrWhiteSpace(gallery))
if (galleryId != null)
{
cmd = CreateCommand($"INSERT INTO `gallery_settings` (`id`, `gallery_id`, `value`) VALUES (@Id, @GalleryId, @Value); SELECT * FROM `gallery_settings` WHERE `id`=LAST_INSERT_ID() AND `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", galleryId);
@@ -1408,15 +1435,14 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<SettingModel?> EditSetting(SettingModel model, string? gallery = "")
public async Task<SettingModel?> EditSetting(SettingModel model, int? galleryId = null)
{
SettingModel? result = null;
var galleryId = await this.GetGalleryId(gallery);
using (var conn = await GetConnection())
{
MySqlCommand cmd;
if (!string.IsNullOrWhiteSpace(gallery))
if (galleryId != null)
{
cmd = CreateCommand($"UPDATE `gallery_settings` SET `value`=@Value WHERE `id`=@Id AND `gallery_id`=@GalleryId; SELECT * FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", galleryId);
@@ -1453,23 +1479,23 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<SettingModel?> SetSetting(SettingModel model, string? gallery = "")
public async Task<SettingModel?> SetSetting(SettingModel model, int? galleryId = null)
{
if (!string.IsNullOrWhiteSpace(model.Id))
{
try
{
if (!string.IsNullOrWhiteSpace(gallery))
if (galleryId != null)
{
// Gallery Override
var result = await GetGallerySpecificSetting(model.Id, gallery);
var result = await GetGallerySpecificSetting(model.Id, galleryId.Value);
if (result == null && !string.IsNullOrEmpty(model.Value))
{
return await AddSetting(new SettingModel()
{
Id = model.Id.ToUpper(),
Value = model.Value
}, gallery);
}, galleryId);
}
else if (result != null && !string.IsNullOrEmpty(model.Value))
{
@@ -1477,7 +1503,7 @@ namespace WeddingShare.Helpers.Database
{
Id = model.Id.ToUpper(),
Value = model.Value
}, gallery);
}, galleryId);
}
else if (result != null && string.IsNullOrEmpty(model.Value))
{
@@ -1485,7 +1511,7 @@ namespace WeddingShare.Helpers.Database
{
Id = model.Id.ToUpper(),
Value = model.Value
}, gallery);
}, galleryId);
}
}
else
@@ -1528,15 +1554,14 @@ namespace WeddingShare.Helpers.Database
};
}
public async Task<bool> DeleteSetting(SettingModel model, string? gallery = "")
public async Task<bool> DeleteSetting(SettingModel model, int? galleryId = null)
{
bool result = false;
var galleryId = await this.GetGalleryId(gallery);
using (var conn = await GetConnection())
{
MySqlCommand cmd;
if (!string.IsNullOrWhiteSpace(gallery))
if (galleryId != null)
{
cmd = CreateCommand($"DELETE FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", galleryId);
@@ -1569,15 +1594,14 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<bool> DeleteAllSettings(string? gallery = "")
public async Task<bool> DeleteAllSettings(int? galleryId = null)
{
bool result = false;
var galleryId = await this.GetGalleryId(gallery);
using (var conn = await GetConnection())
{
MySqlCommand cmd;
if (!string.IsNullOrWhiteSpace(gallery))
if (galleryId != null)
{
cmd = CreateCommand($"DELETE FROM `gallery_settings` WHERE `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", galleryId);
@@ -1693,21 +1717,18 @@ namespace WeddingShare.Helpers.Database
{
try
{
var id = !await reader.IsDBNullAsync("id") ? reader.GetInt32("id") : 0;
if (id > 0)
items.Add(new GalleryModel()
{
items.Add(new GalleryModel()
{
Id = id,
Name = !await reader.IsDBNullAsync("name") ? reader.GetString("name") : "Unknown",
SecretKey = !await reader.IsDBNullAsync("secret_key") ? reader.GetString("secret_key") : null,
TotalItems = !await reader.IsDBNullAsync("total") ? reader.GetInt32("total") : 0,
ApprovedItems = !await reader.IsDBNullAsync("approved") ? reader.GetInt32("approved") : 0,
PendingItems = !await reader.IsDBNullAsync("pending") ? reader.GetInt32("pending") : 0,
TotalGallerySize = !await reader.IsDBNullAsync("total_gallery_size") ? reader.GetInt64("total_gallery_size") : 0,
Owner = !await reader.IsDBNullAsync("owner") ? reader.GetInt32("owner") : 0
});
}
Id = !await reader.IsDBNullAsync("id") ? reader.GetInt32("id") : 0,
Identifier = !await reader.IsDBNullAsync("identifier") ? reader.GetString("identifier") : GalleryHelper.GenerateGalleryIdentifier(),
Name = !await reader.IsDBNullAsync("name") ? reader.GetString("name") : "Unknown",
SecretKey = !await reader.IsDBNullAsync("secret_key") ? reader.GetString("secret_key") : null,
TotalItems = !await reader.IsDBNullAsync("total") ? reader.GetInt32("total") : 0,
ApprovedItems = !await reader.IsDBNullAsync("approved") ? reader.GetInt32("approved") : 0,
PendingItems = !await reader.IsDBNullAsync("pending") ? reader.GetInt32("pending") : 0,
TotalGallerySize = !await reader.IsDBNullAsync("total_gallery_size") ? reader.GetInt64("total_gallery_size") : 0,
Owner = !await reader.IsDBNullAsync("owner") ? reader.GetInt32("owner") : 0
});
}
catch (Exception ex)
{
@@ -1736,7 +1757,6 @@ namespace WeddingShare.Helpers.Database
{
Id = id,
GalleryId = !await reader.IsDBNullAsync("gallery_id") ? reader.GetInt32("gallery_id") : 0,
GalleryName = !await reader.IsDBNullAsync("gallery_name") ? reader.GetString("gallery_name") : string.Empty,
Title = !await reader.IsDBNullAsync("title") ? reader.GetString("title") : string.Empty,
UploadedBy = !await reader.IsDBNullAsync("uploaded_by") ? reader.GetString("uploaded_by") : null,
UploadedDate = !await reader.IsDBNullAsync("uploaded_date") ? reader.GetDateTime("uploaded_date") : null,
@@ -1776,7 +1796,6 @@ namespace WeddingShare.Helpers.Database
{
Id = id,
GalleryId = !await reader.IsDBNullAsync("gallery_id") ? reader.GetInt32("gallery_id") : 0,
GalleryName = !await reader.IsDBNullAsync("gallery_name") ? reader.GetString("gallery_name") : "default",
Title = !await reader.IsDBNullAsync("title") ? reader.GetString("title") : string.Empty,
UploadedBy = !await reader.IsDBNullAsync("uploaded_by") ? reader.GetString("uploaded_by") : null,
Checksum = !await reader.IsDBNullAsync("checksum") ? reader.GetString("checksum") : null,

View File

@@ -1,11 +1,9 @@
using System;
using System.Data;
using System.Data;
using System.Data.Common;
using Microsoft.Data.Sqlite;
using WeddingShare.Constants;
using WeddingShare.Enums;
using WeddingShare.Models.Database;
using static WeddingShare.Constants.Settings;
namespace WeddingShare.Helpers.Database
{
@@ -126,14 +124,46 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<int?> GetGalleryId(string? name)
public async Task<int?> GetGalleryIdByName(string? name)
{
int? result = null;
if (!string.IsNullOrWhiteSpace(name))
{
return (await this.GetGallery(name))?.Id;
{
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"SELECT g.`id` FROM `galleries` AS g WHERE UPPER(g.`name`)=UPPER(@Name);", conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("Name", name);
await conn.OpenAsync();
result = (int?)(long?)await cmd.ExecuteScalarAsync();
await conn.CloseAsync();
}
}
return null;
return result;
}
public async Task<int?> GetGalleryId(string identifier)
{
int? result = null;
if (!string.IsNullOrWhiteSpace(identifier))
{
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"SELECT g.`id` FROM `galleries` AS g WHERE UPPER(g.`identifier`)=UPPER(@Identifier);", conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("Identifier", identifier);
await conn.OpenAsync();
result = (int?)(long?)await cmd.ExecuteScalarAsync();
await conn.CloseAsync();
}
}
return result;
}
public async Task<string?> GetGalleryName(int id)
@@ -169,12 +199,14 @@ namespace WeddingShare.Helpers.Database
result = new GalleryModel()
{
Id = 0,
Identifier = "all",
Name = "all",
SecretKey = null,
TotalItems = galleries?.Sum(x => x.TotalItems) ?? 0,
ApprovedItems = galleries?.Sum(x => x.ApprovedItems) ?? 0,
PendingItems = galleries?.Sum(x => x.PendingItems) ?? 0,
TotalGallerySize = galleries?.Sum(x => x.TotalGallerySize) ?? 0
TotalGallerySize = galleries?.Sum(x => x.TotalGallerySize) ?? 0,
Owner = 1
};
}
}
@@ -184,37 +216,6 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<GalleryModel?> GetGallery(string name)
{
GalleryModel? result = null;
if (string.Equals("All", name, StringComparison.OrdinalIgnoreCase))
{
result = await GetGallery(0);
}
else
{
long? galleryId = 0;
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"SELECT `id` FROM `galleries` WHERE `name`=@Name;", conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("Name", name?.ToLower());
await conn.OpenAsync();
galleryId = (long?)await cmd.ExecuteScalarAsync();
await conn.CloseAsync();
}
if (galleryId != null && galleryId > 0)
{
result = await GetGallery((int)galleryId);
}
}
return result;
}
public async Task<GalleryModel?> AddGallery(GalleryModel model)
{
GalleryModel? result = null;
@@ -227,8 +228,9 @@ namespace WeddingShare.Helpers.Database
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"INSERT INTO `galleries` (`name`, `secret_key`, `owner`) VALUES (@Name, @SecretKey, @Owner); SELECT g.*, COUNT(gi.`id`) AS `total`, SUM(CASE WHEN gi.`state`=@ApprovedState THEN 1 ELSE 0 END) AS `approved`, SUM(CASE WHEN gi.`state`=@PendingState THEN 1 ELSE 0 END) AS `pending`, SUM(gi.file_size) AS `total_gallery_size` FROM `galleries` AS g LEFT JOIN `gallery_items` AS gi ON g.`id` = gi.`gallery_id` WHERE g.`id`=last_insert_rowid();", conn);
var cmd = CreateCommand($"INSERT INTO `galleries` (`identifier`, `name`, `secret_key`, `owner`) VALUES (@Identifier, @Name, @SecretKey, @Owner); SELECT g.*, COUNT(gi.`id`) AS `total`, SUM(CASE WHEN gi.`state`=@ApprovedState THEN 1 ELSE 0 END) AS `approved`, SUM(CASE WHEN gi.`state`=@PendingState THEN 1 ELSE 0 END) AS `pending`, SUM(gi.file_size) AS `total_gallery_size` FROM `galleries` AS g LEFT JOIN `gallery_items` AS gi ON g.`id` = gi.`gallery_id` WHERE g.`id`=last_insert_rowid();", conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("Identifier", model.Identifier);
cmd.Parameters.AddWithValue("Name", model.Name.ToLower());
cmd.Parameters.AddWithValue("SecretKey", !string.IsNullOrWhiteSpace(model.SecretKey) ? model.SecretKey : DBNull.Value);
cmd.Parameters.AddWithValue("ApprovedState", (int)GalleryItemState.Approved);
@@ -261,7 +263,7 @@ namespace WeddingShare.Helpers.Database
{
Id = Settings.Gallery.SecretKey,
Value = model.SecretKey
}, result.Name);
}, result.Id);
}
return result;
@@ -724,7 +726,7 @@ namespace WeddingShare.Helpers.Database
#endregion
#region Users
public async Task<bool> InitAdminAccount(UserModel model)
public async Task<bool> InitOwnerAccount(UserModel model)
{
bool result = false;
@@ -907,7 +909,7 @@ namespace WeddingShare.Helpers.Database
{
bool result = false;
if (model.Id > 1 && !string.Equals("Admin", model.Username, StringComparison.OrdinalIgnoreCase))
if (model.Id > 1)
{
using (var conn = await GetConnection())
{
@@ -1256,7 +1258,7 @@ namespace WeddingShare.Helpers.Database
#endregion
#region Settings
public async Task<IEnumerable<SettingModel>?> GetAllSettings(string? gallery = "")
public async Task<IEnumerable<SettingModel>?> GetAllSettings(int? galleryId = null)
{
List<SettingModel> result = new List<SettingModel>();
@@ -1273,24 +1275,20 @@ namespace WeddingShare.Helpers.Database
result = await ReadSettings(reader);
}
if (result != null && !string.IsNullOrWhiteSpace(gallery))
if (result != null && galleryId != null)
{
var galleryId = await this.GetGalleryId(gallery);
if (galleryId != null)
{
// Get Gallery Overrides
cmd = CreateCommand($"SELECT `id`, `value` FROM `gallery_settings` WHERE `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", (int)galleryId);
cmd.CommandType = CommandType.Text;
// Get Gallery Overrides
cmd = CreateCommand($"SELECT `id`, `value` FROM `gallery_settings` WHERE `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", (int)galleryId);
cmd.CommandType = CommandType.Text;
using (var reader = await cmd.ExecuteReaderAsync())
using (var reader = await cmd.ExecuteReaderAsync())
{
var overrides = (await ReadSettings(reader))?.Where(x => !string.IsNullOrWhiteSpace(x.Value));
if (overrides != null && overrides.Any())
{
var overrides = (await ReadSettings(reader))?.Where(x => !string.IsNullOrWhiteSpace(x.Value));
if (overrides != null && overrides.Any())
{
result = result.Where(x => !overrides.Any(o => o.Id.Equals(x.Id, StringComparison.OrdinalIgnoreCase))).ToList();
result.AddRange(overrides);
}
result = result.Where(x => !overrides.Any(o => o.Id.Equals(x.Id, StringComparison.OrdinalIgnoreCase))).ToList();
result.AddRange(overrides);
}
}
}
@@ -1301,17 +1299,21 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<SettingModel?> GetSetting(string id, string? gallery = "")
public async Task<SettingModel?> GetSetting(string id)
{
return await GetSetting(id, 0);
}
public async Task<SettingModel?> GetSetting(string id, int galleryId)
{
SettingModel? result;
var galleryId = await this.GetGalleryId(gallery);
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"SELECT `id`, `value` FROM (SELECT `id`, `value`, '2' AS `priority` FROM `settings` WHERE `id`=@Id UNION SELECT `id`, `value`, '1' AS `priority` FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId) ORDER BY `priority` ASC LIMIT 1;", conn);
cmd.Parameters.AddWithValue("Id", id.ToUpper());
cmd.Parameters.AddWithValue("GalleryId", galleryId ?? 0);
cmd.Parameters.AddWithValue("GalleryId", galleryId);
cmd.CommandType = CommandType.Text;
await conn.OpenAsync();
@@ -1325,42 +1327,37 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<SettingModel?> GetGallerySpecificSetting(string id, string gallery)
public async Task<SettingModel?> GetGallerySpecificSetting(string id, int galleryId)
{
SettingModel? result = null;
var galleryId = await this.GetGalleryId(gallery);
if (galleryId != null)
{
using (var conn = await GetConnection())
using (var conn = await GetConnection())
{
var cmd = CreateCommand($"SELECT `id`, `value` FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("Id", id.ToUpper());
cmd.Parameters.AddWithValue("GalleryId", galleryId);
cmd.CommandType = CommandType.Text;
await conn.OpenAsync();
using (var reader = await cmd.ExecuteReaderAsync())
{
var cmd = CreateCommand($"SELECT `id`, `value` FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("Id", id.ToUpper());
cmd.Parameters.AddWithValue("GalleryId", galleryId);
cmd.CommandType = CommandType.Text;
await conn.OpenAsync();
using (var reader = await cmd.ExecuteReaderAsync())
{
result = (await ReadSettings(reader))?.FirstOrDefault();
}
await conn.CloseAsync();
result = (await ReadSettings(reader))?.FirstOrDefault();
}
await conn.CloseAsync();
}
return result;
}
public async Task<SettingModel?> AddSetting(SettingModel model, string? gallery = "")
public async Task<SettingModel?> AddSetting(SettingModel model, int? galleryId = null)
{
SettingModel? result = null;
var galleryId = await this.GetGalleryId(gallery);
using (var conn = await GetConnection())
{
SqliteCommand cmd;
if (!string.IsNullOrWhiteSpace(gallery))
if (galleryId != null)
{
cmd = CreateCommand($"INSERT INTO `gallery_settings` (`id`, `gallery_id`, `value`) VALUES (@Id, @GalleryId, @Value); SELECT * FROM `gallery_settings` WHERE `id`=last_insert_rowid() AND `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", galleryId);
@@ -1396,21 +1393,20 @@ namespace WeddingShare.Helpers.Database
if (result == null)
{
result = await this.GetSetting(model.Id, gallery);
result = galleryId != null ? await this.GetSetting(model.Id, galleryId.Value) : await this.GetSetting(model.Id);
}
return result;
}
public async Task<SettingModel?> EditSetting(SettingModel model, string? gallery = "")
public async Task<SettingModel?> EditSetting(SettingModel model, int? galleryId = null)
{
SettingModel? result = null;
var galleryId = await this.GetGalleryId(gallery);
using (var conn = await GetConnection())
{
SqliteCommand cmd;
if (!string.IsNullOrWhiteSpace(gallery))
if (galleryId != null)
{
cmd = CreateCommand($"UPDATE `gallery_settings` SET `value`=@Value WHERE `id`=@Id AND `gallery_id`=@GalleryId; SELECT * FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", galleryId);
@@ -1447,23 +1443,23 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<SettingModel?> SetSetting(SettingModel model, string? gallery = "")
public async Task<SettingModel?> SetSetting(SettingModel model, int? galleryId = null)
{
if (!string.IsNullOrWhiteSpace(model.Id))
{
try
{
if (!string.IsNullOrWhiteSpace(gallery))
if (galleryId != null)
{
// Gallery Override
var result = await GetGallerySpecificSetting(model.Id, gallery);
var result = await GetGallerySpecificSetting(model.Id, galleryId.Value);
if (result == null && !string.IsNullOrEmpty(model.Value))
{
return await AddSetting(new SettingModel()
{
Id = model.Id.ToUpper(),
Value = model.Value
}, gallery);
}, galleryId);
}
else if (result != null && !string.IsNullOrEmpty(model.Value))
{
@@ -1471,7 +1467,7 @@ namespace WeddingShare.Helpers.Database
{
Id = model.Id.ToUpper(),
Value = model.Value
}, gallery);
}, galleryId);
}
else if (result != null && string.IsNullOrEmpty(model.Value))
{
@@ -1479,7 +1475,7 @@ namespace WeddingShare.Helpers.Database
{
Id = model.Id.ToUpper(),
Value = model.Value
}, gallery);
}, galleryId);
}
}
else
@@ -1522,15 +1518,14 @@ namespace WeddingShare.Helpers.Database
};
}
public async Task<bool> DeleteSetting(SettingModel model, string? gallery = "")
public async Task<bool> DeleteSetting(SettingModel model, int? galleryId = null)
{
bool result = false;
var galleryId = await this.GetGalleryId(gallery);
using (var conn = await GetConnection())
{
SqliteCommand cmd;
if (!string.IsNullOrWhiteSpace(gallery))
if (galleryId != null)
{
cmd = CreateCommand($"DELETE FROM `gallery_settings` WHERE `id`=@Id AND `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", galleryId);
@@ -1563,15 +1558,14 @@ namespace WeddingShare.Helpers.Database
return result;
}
public async Task<bool> DeleteAllSettings(string? gallery = "")
public async Task<bool> DeleteAllSettings(int? galleryId = null)
{
bool result = false;
var galleryId = await this.GetGalleryId(gallery);
using (var conn = await GetConnection())
{
SqliteCommand cmd;
if (!string.IsNullOrWhiteSpace(gallery))
if (galleryId != null)
{
cmd = CreateCommand($"DELETE FROM `gallery_settings` WHERE `gallery_id`=@GalleryId;", conn);
cmd.Parameters.AddWithValue("GalleryId", galleryId);
@@ -1730,21 +1724,18 @@ namespace WeddingShare.Helpers.Database
{
try
{
var id = !await reader.IsDBNullAsync("id") ? reader.GetInt32("id") : 0;
if (id > 0)
{
items.Add(new GalleryModel()
{
Id = id,
Name = !await reader.IsDBNullAsync("name") ? reader.GetString("name") : "Unknown",
SecretKey = !await reader.IsDBNullAsync("secret_key") ? reader.GetString("secret_key") : null,
TotalItems = !await reader.IsDBNullAsync("total") ? reader.GetInt32("total") : 0,
ApprovedItems = !await reader.IsDBNullAsync("approved") ? reader.GetInt32("approved") : 0,
PendingItems = !await reader.IsDBNullAsync("pending") ? reader.GetInt32("pending") : 0,
TotalGallerySize = !await reader.IsDBNullAsync("total_gallery_size") ? reader.GetInt64("total_gallery_size") : 0,
Owner = !await reader.IsDBNullAsync("owner") ? reader.GetInt32("owner") : 0
});
}
items.Add(new GalleryModel()
{
Id = !await reader.IsDBNullAsync("id") ? reader.GetInt32("id") : 0,
Identifier = !await reader.IsDBNullAsync("identifier") ? reader.GetString("identifier") : GalleryHelper.GenerateGalleryIdentifier(),
Name = !await reader.IsDBNullAsync("name") ? reader.GetString("name") : "Unknown",
SecretKey = !await reader.IsDBNullAsync("secret_key") ? reader.GetString("secret_key") : null,
TotalItems = !await reader.IsDBNullAsync("total") ? reader.GetInt32("total") : 0,
ApprovedItems = !await reader.IsDBNullAsync("approved") ? reader.GetInt32("approved") : 0,
PendingItems = !await reader.IsDBNullAsync("pending") ? reader.GetInt32("pending") : 0,
TotalGallerySize = !await reader.IsDBNullAsync("total_gallery_size") ? reader.GetInt64("total_gallery_size") : 0,
Owner = !await reader.IsDBNullAsync("owner") ? reader.GetInt32("owner") : 0
});
}
catch (Exception ex)
{
@@ -1773,7 +1764,6 @@ namespace WeddingShare.Helpers.Database
{
Id = id,
GalleryId = !await reader.IsDBNullAsync("gallery_id") ? reader.GetInt32("gallery_id") : 0,
GalleryName = !await reader.IsDBNullAsync("gallery_name") ? reader.GetString("gallery_name") : string.Empty,
Title = !await reader.IsDBNullAsync("title") ? reader.GetString("title") : string.Empty,
UploadedBy = !await reader.IsDBNullAsync("uploaded_by") ? reader.GetString("uploaded_by") : null,
UploadedDate = !await reader.IsDBNullAsync("uploaded_date") ? DateTime.UnixEpoch.AddSeconds(reader.GetInt32("uploaded_date")) : null,
@@ -1813,7 +1803,6 @@ namespace WeddingShare.Helpers.Database
{
Id = id,
GalleryId = !await reader.IsDBNullAsync("gallery_id") ? reader.GetInt32("gallery_id") : 0,
GalleryName = !await reader.IsDBNullAsync("gallery_name") ? reader.GetString("gallery_name") : "default",
Title = !await reader.IsDBNullAsync("title") ? reader.GetString("title") : string.Empty,
UploadedBy = !await reader.IsDBNullAsync("uploaded_by") ? reader.GetString("uploaded_by") : null,
Checksum = !await reader.IsDBNullAsync("checksum") ? reader.GetString("checksum") : null,

View File

@@ -1,4 +1,5 @@
using System.Reflection;
using System.Text.RegularExpressions;
using DbUp;
using DbUp.Engine;
using WeddingShare.Constants;
@@ -30,7 +31,8 @@ namespace WeddingShare.Helpers.Dbup
dbupResult = new DbupSqliteHelper().Migrate(connString);
break;
case "mysql":
dbupResult = new DbupMySqlHelper().Migrate(connString);
var databaseName = config.GetOrDefault(Settings.Database.DatabaseName, "weddingshare");
dbupResult = new DbupMySqlHelper().Migrate(connString, databaseName);
break;
default:
var error = $"Database type '{dbType}' is not yet supported by this application";
@@ -50,19 +52,19 @@ namespace WeddingShare.Helpers.Dbup
}
var isDemoMode = config.GetOrDefault(Settings.IsDemoMode, false);
var username = !isDemoMode ? config.GetOrDefault(Settings.Account.Admin.Username, "admin").ToLower() : "demo";
var adminAccount = new UserModel()
var username = !isDemoMode ? config.GetOrDefault(Settings.Account.Admin.Username, config.GetOrDefault(Settings.Account.Owner.Username, "admin")).ToLower() : "demo";
var ownerAccount = new UserModel()
{
Username = username,
Password = encryption.Encrypt(!isDemoMode ? config.GetOrDefault(Settings.Account.Admin.Password, "admin") : "demo", username)
Password = encryption.Encrypt(!isDemoMode ? config.GetOrDefault(Settings.Account.Admin.Password, config.GetOrDefault(Settings.Account.Owner.Password, "admin")) : "demo", username)
};
await database.InitAdminAccount(adminAccount);
await database.InitOwnerAccount(ownerAccount);
await new DbupImporter(config, database, loggerFactory.CreateLogger<DbupImporter>()).ImportSettings();
if (config.GetOrDefault(Settings.Account.Admin.LogPassword, false))
if (config.GetOrDefault(Settings.Account.Owner.LogPassword, false))
{
logger.LogInformation($"Password: {adminAccount.Password}");
logger.LogInformation($"Password: {ownerAccount.Password}");
}
if (config.GetOrDefault(Security.MultiFactor.ResetToDefault, false))
@@ -103,17 +105,19 @@ namespace WeddingShare.Helpers.Dbup
public class DbupMySqlHelper
{
public DatabaseUpgradeResult Migrate(string connectionString)
public DatabaseUpgradeResult Migrate(string connectionString, string database)
{
try
{
database = !string.IsNullOrWhiteSpace(database) ? database : Regex.Match(connectionString, "Database\\=(.+?)(;|$)", RegexOptions.IgnoreCase | RegexOptions.Multiline).Groups[1].Value;
var dbupBuilder = DeployChanges.To
.MySqlDatabase(connectionString)
.WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly())
.WithScriptNameComparer(new DbupScriptComparer())
.WithFilter(new DbupScriptFilter(DatabaseType.MySQL))
.LogToConsole();
dbupBuilder.Configure(c => c.Journal = new DbupMySqlTableJournal(() => c.ConnectionManager, () => c.Log, "weddingshare", "schemaversions"));
dbupBuilder.Configure(c => c.Journal = new DbupMySqlTableJournal(() => c.ConnectionManager, () => c.Log, database, "schemaversions"));
return dbupBuilder.Build().PerformUpgrade();
}

View File

@@ -32,7 +32,7 @@ namespace WeddingShare.Helpers.Dbup
catch { }
}
var galleries = await database.GetAllGalleries();
var galleries = (await database.GetAllGalleries())?.Where(x => !x.Identifier.Equals("All", StringComparison.OrdinalIgnoreCase));
if (galleries != null && galleries.Any())
{
var galleryKeys = GetKeys<Constants.Settings.Gallery>();
@@ -51,7 +51,7 @@ namespace WeddingShare.Helpers.Dbup
{
Id = key,
Value = galleryOverride
}, gallery.Name);
}, gallery.Id);
}
}
catch { }

View File

@@ -1,6 +1,7 @@
using System.Numerics;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
namespace WeddingShare.Helpers
{
@@ -22,6 +23,7 @@ namespace WeddingShare.Helpers
Task<string> GetChecksum(string path);
Task<DateTime?> GetCreationDatetime(string path);
string BytesToHumanReadable(long bytes, int decimalPlaces = 0);
string SanitizeFilename(string filename);
}
public class FileHelper : IFileHelper
@@ -211,5 +213,13 @@ namespace WeddingShare.Helpers
return total.ToString($"{decimalFormat.TrimEnd('.')} {sizes[place]}");
}
public string SanitizeFilename(string filename)
{
var invalidChars = Regex.Escape(new string(Path.GetInvalidFileNameChars()));
var regex = string.Format(@"([{0}]*\.+$)|([{0}]+)", invalidChars);
return Regex.Replace(filename, regex, string.Empty, RegexOptions.Compiled);
}
}
}

View File

@@ -0,0 +1,10 @@
namespace WeddingShare.Helpers
{
public class GalleryHelper
{
public static string GenerateGalleryIdentifier()
{
return Guid.NewGuid().ToString().Replace("-", string.Empty).ToLower();
}
}
}

View File

@@ -0,0 +1,66 @@
using System.Text.RegularExpressions;
using System.Web;
namespace WeddingShare.Helpers
{
public class HtmlSanitizer
{
public static string Sanitize(string input)
{
var output = input;
if (!string.IsNullOrWhiteSpace(output))
{
output = SanitizeHtmlTags(input, new[] { ".*" });
output = SanitizeHtmlAttributes(output, new[] { ".*" });
output = SanitizeLinks(output);
output = HttpUtility.HtmlEncode(output);
}
return output;
}
public static string SanitizeHtmlTags(string input, string[] tags)
{
var output = input;
foreach (var tag in tags)
{
output = new Regex($"<\\/?\\s*{tag}\\s*[^>]*>", RegexOptions.IgnoreCase).Replace(output, string.Empty);
}
return output;
}
public static string SanitizeHtmlAttributes(string input, string[] attrs)
{
var output = input;
foreach (var attr in attrs)
{
output = new Regex($"{attr}\\s*=\\s*['\"].*?['\"]", RegexOptions.IgnoreCase).Replace(output, string.Empty);
}
return output;
}
public static string SanitizeLinks(string input)
{
var output = input;
output = new Regex(@"href\s*=\s*['""]javascript:[^'""]*['""]", RegexOptions.IgnoreCase).Replace(output, string.Empty);
output = new Regex(@"(http|https):\/\/[^\s<>]+", RegexOptions.IgnoreCase).Replace(output, string.Empty);
return output;
}
public static bool MayContainXss(string input)
{
var sanitized = Sanitize(input);
return !string.Equals(input, sanitized);
}
}
}

View File

@@ -6,6 +6,8 @@ namespace WeddingShare.Helpers
{
public List<CultureInfo> DetectSupportedCultures();
public Task<List<CultureInfo>> DetectSupportedCulturesAsync();
public Task<bool> IsCultureSupported(string culture);
public Task<string> GetOrFallbackCulture(string culture, string fallback);
}
public class LanguageHelper : ILanguageHelper
@@ -19,7 +21,7 @@ namespace WeddingShare.Helpers
var resourceFiles = Directory.GetFiles(Path.Combine("Resources", "Lang"), "*.resx");
var detectedCultures = resourceFiles
.Select(x => Path.GetFileNameWithoutExtension(x))
.Where(x => x.Contains("."))
.Where(x => x.Contains(".") && x.Contains("-"))
.Select(x => x.Split('.').LastOrDefault());
foreach (var detectedCulture in detectedCultures)
@@ -46,5 +48,56 @@ namespace WeddingShare.Helpers
{
return Task.Run(DetectSupportedCultures);
}
public async Task<bool> IsCultureSupported(string culture)
{
return this.IsCultureSupported(culture, await DetectSupportedCulturesAsync());
}
public bool IsCultureSupported(string culture, List<CultureInfo> supported)
{
try
{
if (!string.IsNullOrWhiteSpace(culture) && supported.Any(x => string.Equals(x.Name, culture, StringComparison.OrdinalIgnoreCase)))
{
return true;
}
}
catch { }
return false;
}
public async Task<string> GetOrFallbackCulture(string culture, string fallback)
{
return this.GetOrFallbackCulture(culture, fallback, await DetectSupportedCulturesAsync());
}
public string GetOrFallbackCulture(string culture, string fallback, List<CultureInfo> supported)
{
try
{
if (!string.IsNullOrWhiteSpace(culture))
{
var match = supported.FirstOrDefault(x => string.Equals(x.Name, culture, StringComparison.OrdinalIgnoreCase));
if (match != null)
{
return match.Name;
}
}
if (!string.IsNullOrWhiteSpace(fallback))
{
var match = supported.FirstOrDefault(x => string.Equals(x.Name, fallback, StringComparison.OrdinalIgnoreCase));
if (match != null)
{
return match.Name;
}
}
}
catch { }
return "en-GB";
}
}
}

View File

@@ -25,8 +25,7 @@ namespace WeddingShare.Helpers.Notifications
if (string.IsNullOrWhiteSpace(await _settings.GetOrDefault(Constants.Notifications.Ntfy.Token, string.Empty)))
{
_logger.LogWarning($"Invalid Ntfy token specified");
return false;
_logger.LogWarning($"No Ntfy token specified. It is recommended that you secure your topic with a token");
}
if (await _settings.GetOrDefault(Constants.Notifications.Ntfy.Enabled, false))

View File

@@ -7,16 +7,16 @@ namespace WeddingShare.Helpers
{
public interface ISettingsHelper
{
Task<SettingModel?> Get(string key, string? gallery = "");
Task<string> GetOrDefault(string key, string defaultValue, string? gallery = "");
Task<int> GetOrDefault(string key, int defaultValue, string? gallery = "");
Task<long> GetOrDefault(string key, long defaultValue, string? gallery = "");
Task<decimal> GetOrDefault(string key, decimal defaultValue, string? gallery = "");
Task<double> GetOrDefault(string key, double defaultValue, string? gallery = "");
Task<bool> GetOrDefault(string key, bool defaultValue, string? gallery = "");
Task<DateTime?> GetOrDefault(string key, DateTime? defaultValue, string? gallery = "");
Task<SettingModel?> SetSetting(string key, string value, string? gallery = "");
Task<bool> DeleteSetting(string key, string? gallery = "");
Task<SettingModel?> Get(string key, int? galleryId = null);
Task<string> GetOrDefault(string key, string defaultValue, int? galleryId = null);
Task<int> GetOrDefault(string key, int defaultValue, int? galleryId = null);
Task<long> GetOrDefault(string key, long defaultValue, int? galleryId = null);
Task<decimal> GetOrDefault(string key, decimal defaultValue, int? galleryId = null);
Task<double> GetOrDefault(string key, double defaultValue, int? galleryId = null);
Task<bool> GetOrDefault(string key, bool defaultValue, int? galleryId = null);
Task<DateTime?> GetOrDefault(string key, DateTime? defaultValue, int? galleryId = null);
Task<SettingModel?> SetSetting(string key, string value, int? galleryId = null);
Task<bool> DeleteSetting(string key, int? galleryId = null);
Task<string> GetReleaseVersion(int places = 3);
}
@@ -33,13 +33,13 @@ namespace WeddingShare.Helpers
_logger = logger;
}
public async Task<SettingModel?> Get(string key, string? gallery = "")
public async Task<SettingModel?> Get(string key, int? galleryId = null)
{
if (!string.IsNullOrWhiteSpace(key))
{
try
{
var dbValue = await _databaseHelper.GetSetting(key, gallery);
var dbValue = galleryId != null ? await _databaseHelper.GetSetting(key, galleryId.Value) : await _databaseHelper.GetSetting(key);
if (dbValue != null)
{
return dbValue;
@@ -64,11 +64,11 @@ namespace WeddingShare.Helpers
return null;
}
public async Task<string> GetOrDefault(string key, string defaultValue, string? gallery = "")
public async Task<string> GetOrDefault(string key, string defaultValue, int? galleryId = null)
{
try
{
var value = (await this.Get(key, gallery))?.Value;
var value = (await this.Get(key, galleryId))?.Value;
if (!string.IsNullOrWhiteSpace(value))
{
return value;
@@ -79,11 +79,11 @@ namespace WeddingShare.Helpers
return defaultValue;
}
public async Task<int> GetOrDefault(string key, int defaultValue, string? gallery = "")
public async Task<int> GetOrDefault(string key, int defaultValue, int? galleryId = null)
{
try
{
var value = await this.GetOrDefault(key, string.Empty, gallery);
var value = await this.GetOrDefault(key, string.Empty, galleryId);
if (!string.IsNullOrWhiteSpace(value))
{
return Convert.ToInt32(value);
@@ -94,11 +94,11 @@ namespace WeddingShare.Helpers
return defaultValue;
}
public async Task<long> GetOrDefault(string key, long defaultValue, string? gallery = "")
public async Task<long> GetOrDefault(string key, long defaultValue, int? galleryId = null)
{
try
{
var value = await this.GetOrDefault(key, string.Empty, gallery);
var value = await this.GetOrDefault(key, string.Empty, galleryId);
if (!string.IsNullOrWhiteSpace(value))
{
return Convert.ToInt64(value);
@@ -109,11 +109,11 @@ namespace WeddingShare.Helpers
return defaultValue;
}
public async Task<decimal> GetOrDefault(string key, decimal defaultValue, string? gallery = "")
public async Task<decimal> GetOrDefault(string key, decimal defaultValue, int? galleryId = null)
{
try
{
var value = await this.GetOrDefault(key, string.Empty, gallery);
var value = await this.GetOrDefault(key, string.Empty, galleryId);
if (!string.IsNullOrWhiteSpace(value))
{
return Convert.ToDecimal(value);
@@ -124,11 +124,11 @@ namespace WeddingShare.Helpers
return defaultValue;
}
public async Task<double> GetOrDefault(string key, double defaultValue, string? gallery = "")
public async Task<double> GetOrDefault(string key, double defaultValue, int? galleryId = null)
{
try
{
var value = await this.GetOrDefault(key, string.Empty, gallery);
var value = await this.GetOrDefault(key, string.Empty, galleryId);
if (!string.IsNullOrWhiteSpace(value))
{
return Convert.ToDouble(value);
@@ -139,11 +139,11 @@ namespace WeddingShare.Helpers
return defaultValue;
}
public async Task<bool> GetOrDefault(string key, bool defaultValue, string? gallery = "")
public async Task<bool> GetOrDefault(string key, bool defaultValue, int? galleryId = null)
{
try
{
var value = await this.GetOrDefault(key, string.Empty, gallery);
var value = await this.GetOrDefault(key, string.Empty, galleryId);
if (!string.IsNullOrWhiteSpace(value))
{
return Convert.ToBoolean(value);
@@ -154,11 +154,11 @@ namespace WeddingShare.Helpers
return defaultValue;
}
public async Task<DateTime?> GetOrDefault(string key, DateTime? defaultValue, string? gallery = "")
public async Task<DateTime?> GetOrDefault(string key, DateTime? defaultValue, int? galleryId = null)
{
try
{
var value = await this.GetOrDefault(key, string.Empty, gallery);
var value = await this.GetOrDefault(key, string.Empty, galleryId);
if (!string.IsNullOrWhiteSpace(value))
{
return Convert.ToDateTime(value);
@@ -169,7 +169,7 @@ namespace WeddingShare.Helpers
return defaultValue;
}
public async Task<SettingModel?> SetSetting(string key, string value, string? gallery = "")
public async Task<SettingModel?> SetSetting(string key, string value, int? galleryId = null)
{
if (!string.IsNullOrWhiteSpace(key))
{
@@ -177,28 +177,28 @@ namespace WeddingShare.Helpers
{
Id = key,
Value = value
}, gallery);
}, galleryId);
}
return null;
}
public async Task<bool> DeleteSetting(string key, string? gallery = "")
public async Task<bool> DeleteSetting(string key, int? galleryId = null)
{
if (!string.IsNullOrWhiteSpace(key))
{
return await _databaseHelper.DeleteSetting(new SettingModel()
{
Id = key.ToUpper()
}, gallery);
}, galleryId);
}
return false;
}
public async Task<bool> DeleteAllSettings(string? gallery = "")
public async Task<bool> DeleteAllSettings(int? galleryId = null)
{
return await _databaseHelper.DeleteAllSettings(gallery);
return await _databaseHelper.DeleteAllSettings(galleryId);
}
public async Task<string> GetReleaseVersion(int places = 3)

View File

@@ -5,15 +5,14 @@ namespace WeddingShare.Models.Database
public class GalleryItemModel
{
public GalleryItemModel()
: this(0, 0, string.Empty, string.Empty, null, null, null, MediaType.Unknown, ImageOrientation.None, GalleryItemState.Pending, 0)
: this(0, 0, string.Empty, null, null, null, MediaType.Unknown, ImageOrientation.None, GalleryItemState.Pending, 0)
{
}
public GalleryItemModel(int id, int galleryId, string galleryName, string title, string? uploadedBy, DateTime? uploadedDate, string? checksum, MediaType mediaType, ImageOrientation orientation, GalleryItemState state, long file_size)
public GalleryItemModel(int id, int galleryId, string title, string? uploadedBy, DateTime? uploadedDate, string? checksum, MediaType mediaType, ImageOrientation orientation, GalleryItemState state, long file_size)
{
Id = id;
GalleryId = galleryId;
GalleryName = galleryName;
Title = title;
UploadedBy = uploadedBy;
UploadedDate = uploadedDate;
@@ -26,7 +25,6 @@ namespace WeddingShare.Models.Database
public int Id { get; set; }
public int GalleryId { get; set; }
public string GalleryName { get; set; }
public string Title { get; set; }
public string? UploadedBy { get; set; }
public DateTime? UploadedDate { get; set; }

View File

@@ -1,9 +1,12 @@
namespace WeddingShare.Models.Database
using WeddingShare.Helpers;
namespace WeddingShare.Models.Database
{
public class GalleryModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Identifier { get; set; } = GalleryHelper.GenerateGalleryIdentifier();
public string Name { get; set; } = "Unknown";
public string? SecretKey { get; set; }
public int TotalItems { get; set; }
public int ApprovedItems { get; set; }

View File

@@ -5,8 +5,6 @@
public bool Database { get; set; } = true;
public bool Uploads { get; set; } = true;
public bool Thumbnails { get; set; } = true;
public bool Logos { get; set; } = true;
public bool Banners { get; set; } = true;
public bool CustomResources { get; set; } = true;
}
}

View File

@@ -1,18 +0,0 @@
namespace WeddingShare.Models
{
public class FileUploader
{
public FileUploader(string id, string? key, string url, bool identityRequired = false)
{
this.GalleryId = id;
this.SecretKey = key;
this.UploadUrl = url;
this.IdentityRequired = identityRequired;
}
public string? GalleryId { get; set; }
public string? SecretKey { get; set; }
public string? UploadUrl { get; set; }
public bool IdentityRequired { get; set; }
}
}

View File

@@ -1,4 +1,5 @@
using WeddingShare.Enums;
using WeddingShare.Models.Database;
namespace WeddingShare.Models
{
@@ -10,24 +11,24 @@ namespace WeddingShare.Models
}
public PhotoGallery(ViewMode viewMode, GalleryGroup groupBy, GalleryOrder orderBy)
: this(1, "default", string.Empty, viewMode, groupBy, orderBy, new List<PhotoGalleryImage>(), false)
: this(null, string.Empty, viewMode, groupBy, orderBy, new List<PhotoGalleryImage>(), false)
{
}
public PhotoGallery(int id, string name, string secretKey, ViewMode viewMode, GalleryGroup groupBy, GalleryOrder orderBy, List<PhotoGalleryImage> images, bool requireIdentity)
public PhotoGallery(GalleryModel? gallery, string secretKey, ViewMode viewMode, GalleryGroup groupBy, GalleryOrder orderBy, List<PhotoGalleryImage> images, bool uploadActivated)
{
this.GalleryId = id;
this.GalleryName = name;
this.Gallery = gallery;
this.SecretKey = secretKey;
this.ViewMode = viewMode;
this.GroupBy = groupBy;
this.OrderBy = orderBy;
this.PendingCount = 0;
this.Images = images;
this.FileUploader = new FileUploader(name, secretKey, "/Gallery/UploadImage", requireIdentity);
this.UploadActivated = uploadActivated;
}
public int? GalleryId { get; set; }
public string? GalleryName { get; set; }
public GalleryModel? Gallery { get; set; }
public string? SecretKey { get; set; }
public ViewMode ViewMode { get; set; }
public GalleryGroup GroupBy { get; set; }
public GalleryOrder OrderBy { get; set; }
@@ -45,7 +46,7 @@ namespace WeddingShare.Models
}
}
public List<PhotoGalleryImage>? Images { get; set; }
public FileUploader? FileUploader { get; set; }
public bool UploadActivated { get; set; } = false;
}
public class PhotoGalleryImage
@@ -62,6 +63,7 @@ namespace WeddingShare.Models
public DateTime? UploadDate { get; set; }
public string? ImagePath { get; set; }
public string? ThumbnailPath { get; set; }
public string? ThumbnailPathFallback { get; set; }
public MediaType MediaType { get; set; }
}
}

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>جالري</value>
</data>
<data name="Accept" xml:space="preserve">
<value>قبول</value>
</data>
<data name="Action" xml:space="preserve">
<value>الإجراء</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>رفض الشعب جميع الاستعراضات المعلقة</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>قام زائر بالموافقة على استخدام الكعك</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>معرض مبتكر</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>يرجى الاتصال بمدير الموقع لتوفير إمكانية الوصول</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>فشل في تسجيل رسالة مراجعة حسابات لموافقة الكعك</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>سياسة كوكي</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>من خلال استخدام هذا الموقع، توافق على استخدامنا للكوكيز الأساسي وفقا لشروط استخدام الكعك. لمعرفة المزيد من الرجاء مشاهدة</value>
</data>
<data name="Create" xml:space="preserve">
<value>الإبداع</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>هل أنت متأكد أنك تريد حذف هذا المعرض؟?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>هذه نسخة تجريبية وتُمسح جميع التشكيلات بصورة دورية لضمان وضع قائمة نظيفة للمختبرين في المستقبل.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>الإجراءات المدمرة</value>
</data>
@@ -371,7 +389,7 @@
<value>من فضلك أدخل المفتاح السري.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>يوم الزفاف</value>
<value>مفتاح سري هنا</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>تم الوصول إلى الحد الأقصى المسموح به من المغالي</value>
@@ -449,7 +467,7 @@
<value>من فضلك أدخل اسم المستخدم.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>المستعمل</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>العنوان</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>محتوى عرضه على صفحة معلومات شرطة كوكي</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>سياسة كوكي العرفية</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>السياسات العرفية</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>فشل في الحصول على الظروف</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>المفتاح السري</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>هل يجب أن يكون المستعمل قادراً على التصفية و وسائل الإعلام؟?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>مصورون</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>هل يسمح للضيوف بتحميل المواد</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>الموضوع</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>هل يجب على المستعمل أن يرى نمط الناتج المحلي الإجمالي؟?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>زيارة</value>
</data>
<data name="Warning" xml:space="preserve">
<value>تحذير</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalid Gallery</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Action" xml:space="preserve">
<value>Proqram</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bütün gözəl baxışlar</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Bir ziyaretçi cookies istifadə etdi</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Yaradılıb</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>E-poçt ünvanı</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Cookie təsdiq üçün bir audit mesajının qeydiyyatı</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Bu saytdan istifadə etmək üçün əsas cookies istifadə etməyinizə razılaşırsınız. Daha çox tapmaq</value>
</data>
<data name="Create" xml:space="preserve">
<value>Yapon</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Bu gallery silmək istəyirsiniz?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Bu demo versiyasıdır. Bütün konfiqurasiya müxtəlif mühasibatçıları üçün təmiz bir slate təmin edir.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Daxil olmaq</value>
</data>
@@ -371,7 +389,7 @@
<value>Daxil əsas daxil edin.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>qoca</value>
<value>Burada gizli əsas</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Sərgilərin maksimum xidmət nömrələrinə çatdı</value>
@@ -449,7 +467,7 @@
<value>Qeydiyyatdan istifadə edin.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Qeydiyyat</value>
<value>Ad Soyad</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Daxil ol</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Ümumi</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>CookiePolicy info səhifənin göstərilməsi üçün məlumat</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Xüsusi Cookie Policy</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Xüsusi Siyasətlər</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Sığorta almaq</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Gizli Keyf</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Istifadəçi filtr və qrup media edə bilər?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filologiya</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Qeydiyyatdan keçmək lazımdır</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tarix</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Istifadəçi GDPR stil popups görmək lazımdır?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value> Slide</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Bakı</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Bakı</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalid Gallery</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Action" xml:space="preserve">
<value>Proqram</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bütün gözəl baxışlar</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Bir ziyaretçi cookies istifadə etdi</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Yaradılıb</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>E-poçt ünvanı</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Cookie təsdiq üçün bir audit mesajının qeydiyyatı</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Bu saytdan istifadə etmək üçün əsas cookies istifadə etməyinizə razılaşırsınız. Daha çox tapmaq</value>
</data>
<data name="Create" xml:space="preserve">
<value>Yapon</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Bu gallery silmək istəyirsiniz?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Bu demo versiyasıdır. Bütün konfiqurasiya müxtəlif mühasibatçıları üçün təmiz bir slate təmin edir.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Daxil olmaq</value>
</data>
@@ -371,7 +389,7 @@
<value>Daxil əsas daxil edin.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>qoca</value>
<value>Burada gizli əsas</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Sərgilərin maksimum xidmət nömrələrinə çatdı</value>
@@ -449,7 +467,7 @@
<value>Qeydiyyatdan istifadə edin.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Qeydiyyat</value>
<value>Ad Soyad</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Daxil ol</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Ümumi</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>CookiePolicy info səhifənin göstərilməsi üçün məlumat</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Xüsusi Cookie Policy</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Xüsusi Siyasətlər</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Sığorta almaq</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Gizli Keyf</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Istifadəçi filtr və qrup media edə bilər?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filologiya</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Qeydiyyatdan keçmək lazımdır</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tarix</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Istifadəçi GDPR stil popups görmək lazımdır?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value> Slide</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Bakı</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Bakı</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalid Gallery</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Action" xml:space="preserve">
<value>Proqram</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bütün gözəl baxışlar</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Bir ziyaretçi cookies istifadə etdi</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Yaradılıb</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>E-poçt ünvanı</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Cookie təsdiq üçün bir audit mesajının qeydiyyatı</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Bu saytdan istifadə etmək üçün əsas cookies istifadə etməyinizə razılaşırsınız. Daha çox tapmaq</value>
</data>
<data name="Create" xml:space="preserve">
<value>Yapon</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Bu gallery silmək istəyirsiniz?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Bu demo versiyasıdır. Bütün konfiqurasiya müxtəlif mühasibatçıları üçün təmiz bir slate təmin edir.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Daxil olmaq</value>
</data>
@@ -371,7 +389,7 @@
<value>Daxil əsas daxil edin.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>qoca</value>
<value>Burada gizli əsas</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Sərgilərin maksimum xidmət nömrələrinə çatdı</value>
@@ -449,7 +467,7 @@
<value>Qeydiyyatdan istifadə edin.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Qeydiyyat</value>
<value>Ad Soyad</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Daxil ol</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Ümumi</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>CookiePolicy info səhifənin göstərilməsi üçün məlumat</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Xüsusi Cookie Policy</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Xüsusi Siyasətlər</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Sığorta almaq</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Gizli Keyf</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Istifadəçi filtr və qrup media edə bilər?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filologiya</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Qeydiyyatdan keçmək lazımdır</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tarix</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Istifadəçi GDPR stil popups görmək lazımdır?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value> Slide</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Bakı</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Bakı</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalid Gallery</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Action" xml:space="preserve">
<value>Proqram</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bütün gözəl baxışlar</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Bir ziyaretçi cookies istifadə etdi</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Yaradılıb</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>E-poçt ünvanı</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Cookie təsdiq üçün bir audit mesajının qeydiyyatı</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Bu saytdan istifadə etmək üçün əsas cookies istifadə etməyinizə razılaşırsınız. Daha çox tapmaq</value>
</data>
<data name="Create" xml:space="preserve">
<value>Yapon</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Bu gallery silmək istəyirsiniz?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Bu demo versiyasıdır. Bütün konfiqurasiya müxtəlif mühasibatçıları üçün təmiz bir slate təmin edir.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Daxil olmaq</value>
</data>
@@ -371,7 +389,7 @@
<value>Daxil əsas daxil edin.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>qoca</value>
<value>Burada gizli əsas</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Sərgilərin maksimum xidmət nömrələrinə çatdı</value>
@@ -449,7 +467,7 @@
<value>Qeydiyyatdan istifadə edin.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Qeydiyyat</value>
<value>Ad Soyad</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Daxil ol</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Ümumi</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>CookiePolicy info səhifənin göstərilməsi üçün məlumat</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Xüsusi Cookie Policy</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Xüsusi Siyasətlər</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Sığorta almaq</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Gizli Keyf</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Istifadəçi filtr və qrup media edə bilər?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filologiya</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Qeydiyyatdan keçmək lazımdır</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tarix</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Istifadəçi GDPR stil popups görmək lazımdır?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value> Slide</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Bakı</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Bakı</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalid Gallery</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Action" xml:space="preserve">
<value>Proqram</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bütün gözəl baxışlar</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Bir ziyaretçi cookies istifadə etdi</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Yaradılıb</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>E-poçt ünvanı</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Cookie təsdiq üçün bir audit mesajının qeydiyyatı</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Bu saytdan istifadə etmək üçün əsas cookies istifadə etməyinizə razılaşırsınız. Daha çox tapmaq</value>
</data>
<data name="Create" xml:space="preserve">
<value>Yapon</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Bu gallery silmək istəyirsiniz?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Bu demo versiyasıdır. Bütün konfiqurasiya müxtəlif mühasibatçıları üçün təmiz bir slate təmin edir.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Daxil olmaq</value>
</data>
@@ -371,7 +389,7 @@
<value>Daxil əsas daxil edin.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>qoca</value>
<value>Burada gizli əsas</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Sərgilərin maksimum xidmət nömrələrinə çatdı</value>
@@ -449,7 +467,7 @@
<value>Qeydiyyatdan istifadə edin.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Qeydiyyat</value>
<value>Ad Soyad</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Daxil ol</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Ümumi</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>CookiePolicy info səhifənin göstərilməsi üçün məlumat</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Xüsusi Cookie Policy</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Xüsusi Siyasətlər</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Sığorta almaq</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Gizli Keyf</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Istifadəçi filtr və qrup media edə bilər?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filologiya</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Qeydiyyatdan keçmək lazımdır</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tarix</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Istifadəçi GDPR stil popups görmək lazımdır?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value> Slide</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Bakı</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Qeydiyyat</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Bakı</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Невалидна галерия</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Приемане</value>
</data>
<data name="Action" xml:space="preserve">
<value>Действие</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk отхвърли всички висящи прегледи</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Посетител е одобрил използването на бисквитки</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Създадена галерия</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Моля, свържете се с администратор на сайта, за да предоставите достъп</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Грешка при запис на одитно съобщение за одобрение на бисквитки</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Политика за бисквитки</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>С използването на този уебсайт Вие се съгласявате с използването на основните бисквитки в съответствие с нашите условия за използване на бисквитки. За да разберете повече, моля вижте нашия</value>
</data>
<data name="Create" xml:space="preserve">
<value>Създаване</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Сигурен ли си, че искаш да изтриеш галерията?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Това е демо версия. Цялата конфигурация периодично се изтрива, за да се осигури ново начало за бъдещите тестери.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Извършване на разрушително действие</value>
</data>
@@ -371,7 +389,7 @@
<value>Моля, въведете тайния ключ.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>сватбен ден</value>
<value>Въведете таен ключ тук</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Достигнат е максималния позволен брой галерии</value>
@@ -449,7 +467,7 @@
<value>Моля, въведете потребителско име на акаунта.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Администратор</value>
<value>Потребител</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Изход</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Заглавие</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Съдържанието на страницата с информация за CookiePolicy</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Потребителска политика за бисквитки</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Потребителски политики</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Грешка при получаване на настройките</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Тайен ключ</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Трябва ли потребителят да може да филтрира и групира медия?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Показване на филтрите</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Ако гостите имат право да качват предмети</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Тема</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Трябва ли потребителят да види изскачащи GDPR стилове?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Включване</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Слайдшоу</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Посещение</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Предупреждение</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Изтриване</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Невалидна галерия</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Приемане</value>
</data>
<data name="Action" xml:space="preserve">
<value>Действие</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk отхвърли всички висящи прегледи</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Посетител е одобрил използването на бисквитки</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Създадена галерия</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Моля, свържете се с администратор на сайта, за да предоставите достъп</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Грешка при запис на одитно съобщение за одобрение на бисквитки</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Политика за бисквитки</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>С използването на този уебсайт Вие се съгласявате с използването на основните бисквитки в съответствие с нашите условия за използване на бисквитки. За да разберете повече, моля вижте нашия</value>
</data>
<data name="Create" xml:space="preserve">
<value>Създаване</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Сигурен ли си, че искаш да изтриеш галерията?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Това е демо версия. Цялата конфигурация периодично се изтрива, за да се осигури ново начало за бъдещите тестери.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Извършване на разрушително действие</value>
</data>
@@ -371,7 +389,7 @@
<value>Моля, въведете тайния ключ.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>сватбен ден</value>
<value>Въведете таен ключ тук</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Достигнат е максималния позволен брой галерии</value>
@@ -449,7 +467,7 @@
<value>Моля, въведете потребителско име на акаунта.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Администратор</value>
<value>Потребител</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Изход</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Заглавие</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Съдържанието на страницата с информация за CookiePolicy</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Потребителска политика за бисквитки</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Потребителски политики</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Грешка при получаване на настройките</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Тайен ключ</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Трябва ли потребителят да може да филтрира и групира медия?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Показване на филтрите</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Ако гостите имат право да качват предмети</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Тема</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Трябва ли потребителят да види изскачащи GDPR стилове?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Включване</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Слайдшоу</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Посещение</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Предупреждение</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Изтриване</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>গ্যালারি বৈধ নয়</value>
</data>
<data name="Accept" xml:space="preserve">
<value>গ্রহণ করুন</value>
</data>
<data name="Action" xml:space="preserve">
<value>কাজ</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Ked সকল অপেক্ষমান পর্যালোচনা প্রত্যাখ্যান করেছে</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>একজন অতিথি কুকির ব্যবহার অনুমোদন করেছেন</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>সংকলন নির্মাণ ব্যবস্থা</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>অনুগ্রহ করে সহায়তার জন্য একটি সাইট নির্বাচন করুন</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>কুকি অনুমোদনের জন্য অডিট করতে ব্যর্থ</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>কুকি সংক্রান্ত নিয়ম</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>এই ওয়েবসাইট ব্যবহার করে আপনি কুকি ব্যবহারের শর্ত অনুযায়ী আমাদের মূল কুকি ব্যবহার করতে রাজি আছেন। আরো জানার জন্য দয়া করে আমাদের দৃশ্য দেখুন</value>
</data>
<data name="Create" xml:space="preserve">
<value>তৈরি করুন (_r)</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>আপনি কি নিশ্চিতরূপে এই গ্যালারিটি মুছে ফেলতে ইচ্ছুক?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>এটি একটি ডেমো সংস্করণ। সকল কনফিগারেশন ভবিষ্যৎ পরীক্ষার জন্য পরিষ্কারকরণ নিশ্চিত করার জন্য সংরক্ষণ করা হয়েছে।.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>তালিকাবদ্ধ কাজ</value>
</data>
@@ -371,7 +389,7 @@
<value>অনুগ্রহ করে গোপনীয় কি সন্নিবেশ করুন.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>বিয়ের দিন</value>
<value>সিকিউর শেল কি লিখুন</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>সর্বোচ্চ সংখ্যক কলামের সংখ্যা পৌঁছেছে</value>
@@ -449,7 +467,7 @@
<value>অনুগ্রহ করে অ্যাকাউন্টের নাম লিখুন।.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>্যাডমিন</value>
<value>্যবহারকারীর নাম</value>
</data>
<data name="Logout" xml:space="preserve">
<value>লগ-আউট করুন</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>শিরোনাম</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>কুকি সংক্রান্ত তথ্য প্রদর্শন করার জন্য চিহ্নিত বিষয়বস্তু</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>স্বনির্বাচিত কুকি পলিসি</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>স্বনির্ধারিত নীতি</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>বৈশিষ্ট্য প্রাপ্ত করতে ব্যর্থ</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>গোপনীয় কি</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>ব্যবহারকারী কি ফিল্টার ও দলগুলোকে মিডিয়া করতে ইচ্ছুক?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>ফিল্টার দেখাও</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>আপলোড করার জন্য অতিথিকে অনুমতি প্রদান করা হবে</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>বিষয়</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>ব্যবহারকারীদের কি দেশাত্ম্যতার পপ-আপ প্রদর্শন করা হবে?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>সক্রিয়</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>স্লাইড-শো</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>পরিদর্শন করুন</value>
</data>
<data name="Warning" xml:space="preserve">
<value>সতর্কবার্তা</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>ওয়াইপে</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>গ্যালারি বৈধ নয়</value>
</data>
<data name="Accept" xml:space="preserve">
<value>গ্রহণ করুন</value>
</data>
<data name="Action" xml:space="preserve">
<value>কাজ</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Ked সকল অপেক্ষমান পর্যালোচনা প্রত্যাখ্যান করেছে</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>একজন অতিথি কুকির ব্যবহার অনুমোদন করেছেন</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>সংকলন নির্মাণ ব্যবস্থা</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>অনুগ্রহ করে সহায়তার জন্য একটি সাইট নির্বাচন করুন</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>কুকি অনুমোদনের জন্য অডিট করতে ব্যর্থ</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>কুকি সংক্রান্ত নিয়ম</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>এই ওয়েবসাইট ব্যবহার করে আপনি কুকি ব্যবহারের শর্ত অনুযায়ী আমাদের মূল কুকি ব্যবহার করতে রাজি আছেন। আরো জানার জন্য দয়া করে আমাদের দৃশ্য দেখুন</value>
</data>
<data name="Create" xml:space="preserve">
<value>তৈরি করুন (_r)</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>আপনি কি নিশ্চিতরূপে এই গ্যালারিটি মুছে ফেলতে ইচ্ছুক?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>এটি একটি ডেমো সংস্করণ। সকল কনফিগারেশন ভবিষ্যৎ পরীক্ষার জন্য পরিষ্কারকরণ নিশ্চিত করার জন্য সংরক্ষণ করা হয়েছে।.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>তালিকাবদ্ধ কাজ</value>
</data>
@@ -371,7 +389,7 @@
<value>অনুগ্রহ করে গোপনীয় কি সন্নিবেশ করুন.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>বিয়ের দিন</value>
<value>সিকিউর শেল কি লিখুন</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>সর্বোচ্চ সংখ্যক কলামের সংখ্যা পৌঁছেছে</value>
@@ -449,7 +467,7 @@
<value>অনুগ্রহ করে অ্যাকাউন্টের নাম লিখুন।.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>্যাডমিন</value>
<value>্যবহারকারীর নাম</value>
</data>
<data name="Logout" xml:space="preserve">
<value>লগ-আউট করুন</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>শিরোনাম</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>কুকি সংক্রান্ত তথ্য প্রদর্শন করার জন্য চিহ্নিত বিষয়বস্তু</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>স্বনির্বাচিত কুকি পলিসি</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>স্বনির্ধারিত নীতি</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>বৈশিষ্ট্য প্রাপ্ত করতে ব্যর্থ</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>গোপনীয় কি</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>ব্যবহারকারী কি ফিল্টার ও দলগুলোকে মিডিয়া করতে ইচ্ছুক?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>ফিল্টার দেখাও</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>আপলোড করার জন্য অতিথিকে অনুমতি প্রদান করা হবে</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>বিষয়</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>ব্যবহারকারীদের কি দেশাত্ম্যতার পপ-আপ প্রদর্শন করা হবে?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>সক্রিয়</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>স্লাইড-শো</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>পরিদর্শন করুন</value>
</data>
<data name="Warning" xml:space="preserve">
<value>সতর্কবার্তা</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>ওয়াইপে</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>গ্যালারি বৈধ নয়</value>
</data>
<data name="Accept" xml:space="preserve">
<value>গ্রহণ করুন</value>
</data>
<data name="Action" xml:space="preserve">
<value>কাজ</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Ked সকল অপেক্ষমান পর্যালোচনা প্রত্যাখ্যান করেছে</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>একজন অতিথি কুকির ব্যবহার অনুমোদন করেছেন</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>সংকলন নির্মাণ ব্যবস্থা</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>অনুগ্রহ করে সহায়তার জন্য একটি সাইট নির্বাচন করুন</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>কুকি অনুমোদনের জন্য অডিট করতে ব্যর্থ</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>কুকি সংক্রান্ত নিয়ম</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>এই ওয়েবসাইট ব্যবহার করে আপনি কুকি ব্যবহারের শর্ত অনুযায়ী আমাদের মূল কুকি ব্যবহার করতে রাজি আছেন। আরো জানার জন্য দয়া করে আমাদের দৃশ্য দেখুন</value>
</data>
<data name="Create" xml:space="preserve">
<value>তৈরি করুন (_r)</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>আপনি কি নিশ্চিতরূপে এই গ্যালারিটি মুছে ফেলতে ইচ্ছুক?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>এটি একটি ডেমো সংস্করণ। সকল কনফিগারেশন ভবিষ্যৎ পরীক্ষার জন্য পরিষ্কারকরণ নিশ্চিত করার জন্য সংরক্ষণ করা হয়েছে।.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>তালিকাবদ্ধ কাজ</value>
</data>
@@ -371,7 +389,7 @@
<value>অনুগ্রহ করে গোপনীয় কি সন্নিবেশ করুন.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>বিয়ের দিন</value>
<value>সিকিউর শেল কি লিখুন</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>সর্বোচ্চ সংখ্যক কলামের সংখ্যা পৌঁছেছে</value>
@@ -449,7 +467,7 @@
<value>অনুগ্রহ করে অ্যাকাউন্টের নাম লিখুন।.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>্যাডমিন</value>
<value>্যবহারকারীর নাম</value>
</data>
<data name="Logout" xml:space="preserve">
<value>লগ-আউট করুন</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>শিরোনাম</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>কুকি সংক্রান্ত তথ্য প্রদর্শন করার জন্য চিহ্নিত বিষয়বস্তু</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>স্বনির্বাচিত কুকি পলিসি</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>স্বনির্ধারিত নীতি</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>বৈশিষ্ট্য প্রাপ্ত করতে ব্যর্থ</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>গোপনীয় কি</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>ব্যবহারকারী কি ফিল্টার ও দলগুলোকে মিডিয়া করতে ইচ্ছুক?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>ফিল্টার দেখাও</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>আপলোড করার জন্য অতিথিকে অনুমতি প্রদান করা হবে</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>বিষয়</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>ব্যবহারকারীদের কি দেশাত্ম্যতার পপ-আপ প্রদর্শন করা হবে?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>সক্রিয়</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>স্লাইড-শো</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>পরিদর্শন করুন</value>
</data>
<data name="Warning" xml:space="preserve">
<value>সতর্কবার্তা</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>ওয়াইপে</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Galeria no vàlida</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Accepta</value>
</data>
<data name="Action" xml:space="preserve">
<value>Acció</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Massa rebutjat totes les revisions pendents</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Un visitant ha aprovat l'ús de les galetesName</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>S' ha creat la galeria</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Si us plau, contacteu amb un administrador del lloc web per proporcionar accés</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Ha fallat en registrar un missatge d'auditori per aprovar galetes</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Política de galetes</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Utilitzant aquest lloc web estàs d'acord amb el nostre ús de galetes bàsiques d'acord amb els nostres termes d'ús de galeta. Per descobrir-ne més si us plau, mireu la nostra</value>
</data>
<data name="Create" xml:space="preserve">
<value>Crea</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Esteu segur que voleu esborrar aquesta galeria?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Aquesta és una versió demo. Tota la configuració està periòdicament esborrada per assegurar una pissarra neta per als futurs exàmens.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Acció obsoleta realitzada</value>
</data>
@@ -371,7 +389,7 @@
<value>Si us plau, introduïu la clau secreta.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>dia del casament@ info: whatsthis</value>
<value>Introduïu aquí la clau secreta</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>S' ha arribat al màxim nombre permès de galeries</value>
@@ -449,7 +467,7 @@
<value>Introduïu el nom d' usuari del compte.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Administrador</value>
<value>Nom d' usuari</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Surt</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Títol</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>El contingut que s'ha de mostrar a la pàgina d'informació de galeta</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Política de galetes personalitzada</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Polítiques personalitzades</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Ha fallat en obtenir l' arranjament</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Clau secreta</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>L' usuari hauria de filtrar i agrupar els suports?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Mostra els filtres</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Cal que els convidats pugin elements</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>L' usuari hauria de veure els emergents d' estil R del PIB?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Habilitat</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Passi de diapositives</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Visiteu</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Avís</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Esborrat</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Galeria no vàlida</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Accepta</value>
</data>
<data name="Action" xml:space="preserve">
<value>Acció</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Massa rebutjat totes les revisions pendents</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Un visitant ha aprovat l'ús de les galetesName</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>S' ha creat la galeria</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Si us plau, contacteu amb un administrador del lloc web per proporcionar accés</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Ha fallat en registrar un missatge d'auditori per aprovar galetes</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Política de galetes</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Utilitzant aquest lloc web estàs d'acord amb el nostre ús de galetes bàsiques d'acord amb els nostres termes d'ús de galeta. Per descobrir-ne més si us plau, mireu la nostra</value>
</data>
<data name="Create" xml:space="preserve">
<value>Crea</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Esteu segur que voleu esborrar aquesta galeria?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Aquesta és una versió demo. Tota la configuració està periòdicament esborrada per assegurar una pissarra neta per als futurs exàmens.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Acció obsoleta realitzada</value>
</data>
@@ -371,7 +389,7 @@
<value>Si us plau, introduïu la clau secreta.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>dia del casament@ info: whatsthis</value>
<value>Introduïu aquí la clau secreta</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>S' ha arribat al màxim nombre permès de galeries</value>
@@ -449,7 +467,7 @@
<value>Introduïu el nom d' usuari del compte.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Administrador</value>
<value>Nom d' usuari</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Surt</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Títol</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>El contingut que s'ha de mostrar a la pàgina d'informació de galeta</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Política de galetes personalitzada</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Polítiques personalitzades</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Ha fallat en obtenir l' arranjament</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Clau secreta</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>L' usuari hauria de filtrar i agrupar els suports?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Mostra els filtres</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Cal que els convidats pugin elements</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>L' usuari hauria de veure els emergents d' estil R del PIB?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Habilitat</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Passi de diapositives</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Visiteu</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Avís</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Esborrat</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Galeria no vàlida</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Accepta</value>
</data>
<data name="Action" xml:space="preserve">
<value>Acció</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Massa rebutjat totes les revisions pendents</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Un visitant ha aprovat l'ús de les galetesName</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>S' ha creat la galeria</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Si us plau, contacteu amb un administrador del lloc web per proporcionar accés</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Ha fallat en registrar un missatge d'auditori per aprovar galetes</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Política de galetes</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Utilitzant aquest lloc web estàs d'acord amb el nostre ús de galetes bàsiques d'acord amb els nostres termes d'ús de galeta. Per descobrir-ne més si us plau, mireu la nostra</value>
</data>
<data name="Create" xml:space="preserve">
<value>Crea</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Esteu segur que voleu esborrar aquesta galeria?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Aquesta és una versió demo. Tota la configuració està periòdicament esborrada per assegurar una pissarra neta per als futurs exàmens.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Acció obsoleta realitzada</value>
</data>
@@ -371,7 +389,7 @@
<value>Si us plau, introduïu la clau secreta.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>dia del casament@ info: whatsthis</value>
<value>Introduïu aquí la clau secreta</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>S' ha arribat al màxim nombre permès de galeries</value>
@@ -449,7 +467,7 @@
<value>Introduïu el nom d' usuari del compte.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Administrador</value>
<value>Nom d' usuari</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Surt</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Títol</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>El contingut que s'ha de mostrar a la pàgina d'informació de galeta</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Política de galetes personalitzada</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Polítiques personalitzades</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Ha fallat en obtenir l' arranjament</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Clau secreta</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>L' usuari hauria de filtrar i agrupar els suports?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Mostra els filtres</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Cal que els convidats pugin elements</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>L' usuari hauria de veure els emergents d' estil R del PIB?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Habilitat</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Passi de diapositives</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Visiteu</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Avís</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Esborrat</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Galeria no vàlida</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Accepta</value>
</data>
<data name="Action" xml:space="preserve">
<value>Acció</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Massa rebutjat totes les revisions pendents</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Un visitant ha aprovat l'ús de les galetesName</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>S' ha creat la galeria</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Si us plau, contacteu amb un administrador del lloc web per proporcionar accés</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Ha fallat en registrar un missatge d'auditori per aprovar galetes</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Política de galetes</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Utilitzant aquest lloc web estàs d'acord amb el nostre ús de galetes bàsiques d'acord amb els nostres termes d'ús de galeta. Per descobrir-ne més si us plau, mireu la nostra</value>
</data>
<data name="Create" xml:space="preserve">
<value>Crea</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Esteu segur que voleu esborrar aquesta galeria?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Aquesta és una versió demo. Tota la configuració està periòdicament esborrada per assegurar una pissarra neta per als futurs exàmens.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Acció obsoleta realitzada</value>
</data>
@@ -371,7 +389,7 @@
<value>Si us plau, introduïu la clau secreta.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>dia del casament@ info: whatsthis</value>
<value>Introduïu aquí la clau secreta</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>S' ha arribat al màxim nombre permès de galeries</value>
@@ -449,7 +467,7 @@
<value>Introduïu el nom d' usuari del compte.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Administrador</value>
<value>Nom d' usuari</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Surt</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Títol</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>El contingut que s'ha de mostrar a la pàgina d'informació de galeta</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Política de galetes personalitzada</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Polítiques personalitzades</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Ha fallat en obtenir l' arranjament</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Clau secreta</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>L' usuari hauria de filtrar i agrupar els suports?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Mostra els filtres</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Cal que els convidats pugin elements</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>L' usuari hauria de veure els emergents d' estil R del PIB?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Habilitat</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Passi de diapositives</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Visiteu</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Avís</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Esborrat</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Galeria no vàlida</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Accepta</value>
</data>
<data name="Action" xml:space="preserve">
<value>Acció</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Massa rebutjat totes les revisions pendents</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Un visitant ha aprovat l'ús de les galetesName</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>S' ha creat la galeria</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Si us plau, contacteu amb un administrador del lloc web per proporcionar accés</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Ha fallat en registrar un missatge d'auditori per aprovar galetes</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Política de galetes</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Utilitzant aquest lloc web estàs d'acord amb el nostre ús de galetes bàsiques d'acord amb els nostres termes d'ús de galeta. Per descobrir-ne més si us plau, mireu la nostra</value>
</data>
<data name="Create" xml:space="preserve">
<value>Crea</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Esteu segur que voleu esborrar aquesta galeria?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Aquesta és una versió demo. Tota la configuració està periòdicament esborrada per assegurar una pissarra neta per als futurs exàmens.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Acció obsoleta realitzada</value>
</data>
@@ -371,7 +389,7 @@
<value>Si us plau, introduïu la clau secreta.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>dia del casament@ info: whatsthis</value>
<value>Introduïu aquí la clau secreta</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>S' ha arribat al màxim nombre permès de galeries</value>
@@ -449,7 +467,7 @@
<value>Introduïu el nom d' usuari del compte.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Administrador</value>
<value>Nom d' usuari</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Surt</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Títol</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>El contingut que s'ha de mostrar a la pàgina d'informació de galeta</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Política de galetes personalitzada</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Polítiques personalitzades</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Ha fallat en obtenir l' arranjament</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Clau secreta</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>L' usuari hauria de filtrar i agrupar els suports?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Mostra els filtres</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Cal que els convidats pugin elements</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>L' usuari hauria de veure els emergents d' estil R del PIB?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Habilitat</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Passi de diapositives</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Visiteu</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Avís</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Esborrat</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Neplatná galerie</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Přijmout</value>
</data>
<data name="Action" xml:space="preserve">
<value>Akce</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk odmítl všechny probíhající recenze</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Návštěvník schválil používání cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Vytvořeno galerie</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Kontaktujte prosím správce stránek, aby poskytl přístup</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Selhalo zaznamenávání auditní zprávy pro schválení cookie</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie politika</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Použitím této webové stránky souhlasíte s použitím základních cookies v souladu s našimi podmínkami používání cookies. Chcete-li zjistit více, podívejte se na naše</value>
</data>
<data name="Create" xml:space="preserve">
<value>Vytvořit</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Jste si jistý, že chcete tuto galerii smazat?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Tohle je demo verze. Veškerá konfigurace je pravidelně vymazána, aby byla zajištěna čistá břidlice pro budoucí testovače.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Provedená destruktivní akce</value>
</data>
@@ -371,7 +389,7 @@
<value>Prosím, zadejte tajný klíč.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>svatební den</value>
<value>Zde zadejte tajný klíč</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Maximální povolený počet galerií byl dosažen</value>
@@ -449,7 +467,7 @@
<value>Zadejte prosím uživatelské jméno účtu.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Uživatelské jméno</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Odhlášení</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Název</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Obsah zobrazený na stránce Informace o CookiePolicy</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Vlastní Cookie politika</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Celní politika</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Nepodařilo se získat nastavení</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Tajný klíč</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Měl by být uživatel schopen filtrovat a seskupovat média?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Zobrazit filtry</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Mělo by být hostům dovoleno nahrávat položky</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Téma</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Měl by uživatel vidět popupy ve stylu GDPR?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Povoleno</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Návštěva</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Varování</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Utřít</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Neplatná galerie</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Přijmout</value>
</data>
<data name="Action" xml:space="preserve">
<value>Akce</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk odmítl všechny probíhající recenze</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Návštěvník schválil používání cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Vytvořeno galerie</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Kontaktujte prosím správce stránek, aby poskytl přístup</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Selhalo zaznamenávání auditní zprávy pro schválení cookie</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie politika</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Použitím této webové stránky souhlasíte s použitím základních cookies v souladu s našimi podmínkami používání cookies. Chcete-li zjistit více, podívejte se na naše</value>
</data>
<data name="Create" xml:space="preserve">
<value>Vytvořit</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Jste si jistý, že chcete tuto galerii smazat?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Tohle je demo verze. Veškerá konfigurace je pravidelně vymazána, aby byla zajištěna čistá břidlice pro budoucí testovače.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Provedená destruktivní akce</value>
</data>
@@ -371,7 +389,7 @@
<value>Prosím, zadejte tajný klíč.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>svatební den</value>
<value>Zde zadejte tajný klíč</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Maximální povolený počet galerií byl dosažen</value>
@@ -449,7 +467,7 @@
<value>Zadejte prosím uživatelské jméno účtu.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Uživatelské jméno</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Odhlášení</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Název</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Obsah zobrazený na stránce Informace o CookiePolicy</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Vlastní Cookie politika</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Celní politika</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Nepodařilo se získat nastavení</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Tajný klíč</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Měl by být uživatel schopen filtrovat a seskupovat média?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Zobrazit filtry</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Mělo by být hostům dovoleno nahrávat položky</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Téma</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Měl by uživatel vidět popupy ve stylu GDPR?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Povoleno</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Návštěva</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Varování</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Utřít</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Ugyldigt galleri</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Accepter</value>
</data>
<data name="Action" xml:space="preserve">
<value>Handling</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk afviste alle verserende anmeldelser</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>En besøgende har godkendt brugen af cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Oprettet galleri</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Kontakt venligst en site administrator for at give adgang</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Kunne ikke logge en revisionsmeddelelse for cookie-godkendelse</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-politik</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Ved at bruge denne hjemmeside accepterer du vores brug af grundlæggende cookies i overensstemmelse med vores vilkår for cookie brug. For at finde ud af mere se venligst vores</value>
</data>
<data name="Create" xml:space="preserve">
<value>Opret</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Er du sikker på, du vil slette dette galleri?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Det er en demo-version. Alle konfigurationer aftørres regelmæssigt for at sikre en ren skifer til fremtidige testere.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktiv handling udført</value>
</data>
@@ -371,7 +389,7 @@
<value>Indtast venligst den hemmelige nøgle.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>ægteskab- dag</value>
<value>Indtast hemmelig nøgle her</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Det maksimalt tilladte antal gallerier er nået</value>
@@ -449,7 +467,7 @@
<value>Indtast venligst kontobrugernavn.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Brugernavn</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Indholdet at vise på CookiePolicy info side</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Brugerdefineret cookie-politik</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Brugerdefineret politik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Kunne ikke få indstillinger</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Hemmelig nøgle</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Skal brugeren kunne filtrere og gruppere medier?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Vis filtre</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Skal gæsterne have lov til at uploade elementer</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Emne</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Skal brugeren se GDPR stil popups?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Aktiveret</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besøg</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Advarsel</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Tør</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Ugyldigt galleri</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Accepter</value>
</data>
<data name="Action" xml:space="preserve">
<value>Handling</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk afviste alle verserende anmeldelser</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>En besøgende har godkendt brugen af cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Oprettet galleri</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Kontakt venligst en site administrator for at give adgang</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Kunne ikke logge en revisionsmeddelelse for cookie-godkendelse</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-politik</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Ved at bruge denne hjemmeside accepterer du vores brug af grundlæggende cookies i overensstemmelse med vores vilkår for cookie brug. For at finde ud af mere se venligst vores</value>
</data>
<data name="Create" xml:space="preserve">
<value>Opret</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Er du sikker på, du vil slette dette galleri?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Det er en demo-version. Alle konfigurationer aftørres regelmæssigt for at sikre en ren skifer til fremtidige testere.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktiv handling udført</value>
</data>
@@ -371,7 +389,7 @@
<value>Indtast venligst den hemmelige nøgle.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>ægteskab- dag</value>
<value>Indtast hemmelig nøgle her</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Det maksimalt tilladte antal gallerier er nået</value>
@@ -449,7 +467,7 @@
<value>Indtast venligst kontobrugernavn.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Brugernavn</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Indholdet at vise på CookiePolicy info side</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Brugerdefineret cookie-politik</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Brugerdefineret politik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Kunne ikke få indstillinger</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Hemmelig nøgle</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Skal brugeren kunne filtrere og gruppere medier?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Vis filtre</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Skal gæsterne have lov til at uploade elementer</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Emne</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Skal brugeren se GDPR stil popups?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Aktiveret</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besøg</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Advarsel</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Tør</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Ugyldigt galleri</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Accepter</value>
</data>
<data name="Action" xml:space="preserve">
<value>Handling</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk afviste alle verserende anmeldelser</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>En besøgende har godkendt brugen af cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Oprettet galleri</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Kontakt venligst en site administrator for at give adgang</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Kunne ikke logge en revisionsmeddelelse for cookie-godkendelse</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-politik</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Ved at bruge denne hjemmeside accepterer du vores brug af grundlæggende cookies i overensstemmelse med vores vilkår for cookie brug. For at finde ud af mere se venligst vores</value>
</data>
<data name="Create" xml:space="preserve">
<value>Opret</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Er du sikker på, du vil slette dette galleri?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Det er en demo-version. Alle konfigurationer aftørres regelmæssigt for at sikre en ren skifer til fremtidige testere.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktiv handling udført</value>
</data>
@@ -371,7 +389,7 @@
<value>Indtast venligst den hemmelige nøgle.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>ægteskab- dag</value>
<value>Indtast hemmelig nøgle her</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Det maksimalt tilladte antal gallerier er nået</value>
@@ -449,7 +467,7 @@
<value>Indtast venligst kontobrugernavn.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Brugernavn</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Indholdet at vise på CookiePolicy info side</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Brugerdefineret cookie-politik</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Brugerdefineret politik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Kunne ikke få indstillinger</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Hemmelig nøgle</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Skal brugeren kunne filtrere og gruppere medier?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Vis filtre</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Skal gæsterne have lov til at uploade elementer</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Emne</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Skal brugeren se GDPR stil popups?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Aktiveret</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besøg</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Advarsel</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Tør</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalide Galerie</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Annahme</value>
</data>
<data name="Action" xml:space="preserve">
<value>Aktion</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk hat alle anhängigen Bewertungen abgelehnt</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ein Besucher hat die Verwendung von Cookies genehmigt</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Erstellte Galerie</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Bitte kontaktieren Sie einen Website-Administrator, um Zugang zu erhalten</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Nicht eingeloggt, um eine Audit-Nachricht für die Cookie-Zulassung zu protokollieren</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-Richtlinie</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Durch die Nutzung dieser Website erklären Sie sich mit unserer Nutzung grundlegender Cookies gemäß unseren Nutzungsbedingungen einverstanden. Weitere Informationen finden Sie hier</value>
</data>
<data name="Create" xml:space="preserve">
<value>Erstellung</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Sind Sie sicher, dass Sie diese Galerie löschen möchten?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Das ist eine Demoversion. Alle Konfigurationen werden periodisch gelöscht, um einen sauberen Schiefer für zukünftige Tester zu gewährleisten.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktive Aktion durchgeführt</value>
</data>
@@ -371,7 +389,7 @@
<value>Bitte geben Sie den geheimen Schlüssel ein.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>hochzeitstag</value>
<value>Geheimschlüssel hier eingeben</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Die maximal zulässige Anzahl von Galerien wurde erreicht</value>
@@ -449,7 +467,7 @@
<value>Bitte geben Sie den Benutzernamen des Kontos ein.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Benutzername</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Anmeldung</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Die Inhalte auf der CookiePolicy-Infoseite</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Kundenspezifische Cookie-Richtlinie</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Zollpolitik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Nicht verfügbar, um Einstellungen zu erhalten</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Geheimer Schlüssel</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Sollte der Benutzer in der Lage sein, Medien zu filtern und zu gruppen?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filter anzeigen</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Sollten die Gäste Gegenstände hochladen dürfen</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Thema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Sollte der Nutzer die DSGVO-Stil Popups sehen?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ermöglicht</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Diashow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besuchen Sie uns</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warnung</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>WEITER</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalide Galerie</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Annahme</value>
</data>
<data name="Action" xml:space="preserve">
<value>Aktion</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk hat alle anhängigen Bewertungen abgelehnt</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ein Besucher hat die Verwendung von Cookies genehmigt</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Erstellte Galerie</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Bitte kontaktieren Sie einen Website-Administrator, um Zugang zu erhalten</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Nicht eingeloggt, um eine Audit-Nachricht für die Cookie-Zulassung zu protokollieren</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-Richtlinie</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Durch die Nutzung dieser Website erklären Sie sich mit unserer Nutzung grundlegender Cookies gemäß unseren Nutzungsbedingungen einverstanden. Weitere Informationen finden Sie hier</value>
</data>
<data name="Create" xml:space="preserve">
<value>Erstellung</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Sind Sie sicher, dass Sie diese Galerie löschen möchten?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Das ist eine Demoversion. Alle Konfigurationen werden periodisch gelöscht, um einen sauberen Schiefer für zukünftige Tester zu gewährleisten.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktive Aktion durchgeführt</value>
</data>
@@ -371,7 +389,7 @@
<value>Bitte geben Sie den geheimen Schlüssel ein.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>hochzeitstag</value>
<value>Geheimschlüssel hier eingeben</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Die maximal zulässige Anzahl von Galerien wurde erreicht</value>
@@ -449,7 +467,7 @@
<value>Bitte geben Sie den Benutzernamen des Kontos ein.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Benutzername</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Anmeldung</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Die Inhalte auf der CookiePolicy-Infoseite</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Kundenspezifische Cookie-Richtlinie</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Zollpolitik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Nicht verfügbar, um Einstellungen zu erhalten</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Geheimer Schlüssel</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Sollte der Benutzer in der Lage sein, Medien zu filtern und zu gruppen?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filter anzeigen</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Sollten die Gäste Gegenstände hochladen dürfen</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Thema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Sollte der Nutzer die DSGVO-Stil Popups sehen?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ermöglicht</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Diashow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besuchen Sie uns</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warnung</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>WEITER</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalide Galerie</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Annahme</value>
</data>
<data name="Action" xml:space="preserve">
<value>Aktion</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk hat alle anhängigen Bewertungen abgelehnt</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ein Besucher hat die Verwendung von Cookies genehmigt</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Erstellte Galerie</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Bitte kontaktieren Sie einen Website-Administrator, um Zugang zu erhalten</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Nicht eingeloggt, um eine Audit-Nachricht für die Cookie-Zulassung zu protokollieren</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-Richtlinie</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Durch die Nutzung dieser Website erklären Sie sich mit unserer Nutzung grundlegender Cookies gemäß unseren Nutzungsbedingungen einverstanden. Weitere Informationen finden Sie hier</value>
</data>
<data name="Create" xml:space="preserve">
<value>Erstellung</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Sind Sie sicher, dass Sie diese Galerie löschen möchten?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Das ist eine Demoversion. Alle Konfigurationen werden periodisch gelöscht, um einen sauberen Schiefer für zukünftige Tester zu gewährleisten.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktive Aktion durchgeführt</value>
</data>
@@ -371,7 +389,7 @@
<value>Bitte geben Sie den geheimen Schlüssel ein.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>hochzeitstag</value>
<value>Geheimschlüssel hier eingeben</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Die maximal zulässige Anzahl von Galerien wurde erreicht</value>
@@ -449,7 +467,7 @@
<value>Bitte geben Sie den Benutzernamen des Kontos ein.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Benutzername</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Anmeldung</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Die Inhalte auf der CookiePolicy-Infoseite</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Kundenspezifische Cookie-Richtlinie</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Zollpolitik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Nicht verfügbar, um Einstellungen zu erhalten</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Geheimer Schlüssel</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Sollte der Benutzer in der Lage sein, Medien zu filtern und zu gruppen?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filter anzeigen</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Sollten die Gäste Gegenstände hochladen dürfen</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Thema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Sollte der Nutzer die DSGVO-Stil Popups sehen?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ermöglicht</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Diashow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besuchen Sie uns</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warnung</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>WEITER</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalide Galerie</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Annahme</value>
</data>
<data name="Action" xml:space="preserve">
<value>Aktion</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk hat alle anhängigen Bewertungen abgelehnt</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ein Besucher hat die Verwendung von Cookies genehmigt</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Erstellte Galerie</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Bitte kontaktieren Sie einen Website-Administrator, um Zugang zu erhalten</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Nicht eingeloggt, um eine Audit-Nachricht für die Cookie-Zulassung zu protokollieren</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-Richtlinie</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Durch die Nutzung dieser Website erklären Sie sich mit unserer Nutzung grundlegender Cookies gemäß unseren Nutzungsbedingungen einverstanden. Weitere Informationen finden Sie hier</value>
</data>
<data name="Create" xml:space="preserve">
<value>Erstellen</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Bist du dir sicher, dass du diese Galerie löschen möchtest?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Das ist eine Demoversion. Alle Konfigurationen werden periodisch gelöscht, um einen sauberen Schiefer für zukünftige Tester zu gewährleisten.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktive Aktion durchgeführt</value>
</data>
@@ -371,7 +389,7 @@
<value>Bitte gib den geheimen Schlüssel ein.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>hochzeitstag</value>
<value>Geheimschlüssel hier eingeben</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Die maximal zulässige Anzahl von Galerien wurde erreicht</value>
@@ -449,7 +467,7 @@
<value>Bitte gib den Benutzernamen ein.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Benutzername</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Abmeldung</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Die Inhalte auf der CookiePolicy-Infoseite</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Kundenspezifische Cookie-Richtlinie</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Zollpolitik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Nicht verfügbar, um Einstellungen zu erhalten</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Geheimer Schlüssel</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Sollte der Benutzer in der Lage sein, Medien zu filtern und zu gruppen?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filter anzeigen</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Sollten die Gäste Gegenstände hochladen dürfen</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Thema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Sollte der Nutzer die DSGVO-Stil Popups sehen?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ermöglicht</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Diashow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besuche uns</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warnung</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Löschen</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalide Galerie</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Annahme</value>
</data>
<data name="Action" xml:space="preserve">
<value>Aktion</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk hat alle anhängigen Bewertungen abgelehnt</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ein Besucher hat die Verwendung von Cookies genehmigt</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Erstellte Galerie</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Bitte kontaktieren Sie einen Website-Administrator, um Zugang zu erhalten</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Nicht eingeloggt, um eine Audit-Nachricht für die Cookie-Zulassung zu protokollieren</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-Richtlinie</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Durch die Nutzung dieser Website erklären Sie sich mit unserer Nutzung grundlegender Cookies gemäß unseren Nutzungsbedingungen einverstanden. Weitere Informationen finden Sie hier</value>
</data>
<data name="Create" xml:space="preserve">
<value>Erstellung</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Sind Sie sicher, dass Sie diese Galerie löschen möchten?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Das ist eine Demoversion. Alle Konfigurationen werden periodisch gelöscht, um einen sauberen Schiefer für zukünftige Tester zu gewährleisten.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktive Aktion durchgeführt</value>
</data>
@@ -371,7 +389,7 @@
<value>Bitte geben Sie den geheimen Schlüssel ein.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>hochzeitstag</value>
<value>Geheimschlüssel hier eingeben</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Die maximal zulässige Anzahl von Galerien wurde erreicht</value>
@@ -449,7 +467,7 @@
<value>Bitte geben Sie den Benutzernamen des Kontos ein.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Benutzername</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Anmeldung</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Die Inhalte auf der CookiePolicy-Infoseite</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Kundenspezifische Cookie-Richtlinie</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Zollpolitik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Nicht verfügbar, um Einstellungen zu erhalten</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Geheimer Schlüssel</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Sollte der Benutzer in der Lage sein, Medien zu filtern und zu gruppen?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filter anzeigen</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Sollten die Gäste Gegenstände hochladen dürfen</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Thema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Sollte der Nutzer die DSGVO-Stil Popups sehen?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ermöglicht</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Diashow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besuchen Sie uns</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warnung</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>WEITER</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalide Galerie</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Annahme</value>
</data>
<data name="Action" xml:space="preserve">
<value>Aktion</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk hat alle anhängigen Bewertungen abgelehnt</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ein Besucher hat die Verwendung von Cookies genehmigt</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Erstellte Galerie</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Bitte kontaktieren Sie einen Website-Administrator, um Zugang zu erhalten</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Nicht eingeloggt, um eine Audit-Nachricht für die Cookie-Zulassung zu protokollieren</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-Richtlinie</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Durch die Nutzung dieser Website erklären Sie sich mit unserer Nutzung grundlegender Cookies gemäß unseren Nutzungsbedingungen einverstanden. Weitere Informationen finden Sie hier</value>
</data>
<data name="Create" xml:space="preserve">
<value>Erstellung</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Sind Sie sicher, dass Sie diese Galerie löschen möchten?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Das ist eine Demoversion. Alle Konfigurationen werden periodisch gelöscht, um einen sauberen Schiefer für zukünftige Tester zu gewährleisten.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktive Aktion durchgeführt</value>
</data>
@@ -371,7 +389,7 @@
<value>Bitte geben Sie den geheimen Schlüssel ein.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>hochzeitstag</value>
<value>Geheimschlüssel hier eingeben</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Die maximal zulässige Anzahl von Galerien wurde erreicht</value>
@@ -449,7 +467,7 @@
<value>Bitte geben Sie den Benutzernamen des Kontos ein.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Benutzername</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Anmeldung</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Die Inhalte auf der CookiePolicy-Infoseite</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Kundenspezifische Cookie-Richtlinie</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Zollpolitik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Nicht verfügbar, um Einstellungen zu erhalten</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Geheimer Schlüssel</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Sollte der Benutzer in der Lage sein, Medien zu filtern und zu gruppen?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filter anzeigen</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Sollten die Gäste Gegenstände hochladen dürfen</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Thema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Sollte der Nutzer die DSGVO-Stil Popups sehen?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ermöglicht</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Diashow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besuchen Sie uns</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warnung</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>WEITER</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalide Galerie</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Annahme</value>
</data>
<data name="Action" xml:space="preserve">
<value>Aktion</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk hat alle anhängigen Bewertungen abgelehnt</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ein Besucher hat die Verwendung von Cookies genehmigt</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Erstellte Galerie</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Bitte kontaktieren Sie einen Website-Administrator, um Zugang zu erhalten</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Nicht eingeloggt, um eine Audit-Nachricht für die Cookie-Zulassung zu protokollieren</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-Richtlinie</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Durch die Nutzung dieser Website erklären Sie sich mit unserer Nutzung grundlegender Cookies gemäß unseren Nutzungsbedingungen einverstanden. Weitere Informationen finden Sie hier</value>
</data>
<data name="Create" xml:space="preserve">
<value>Erstellung</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Sind Sie sicher, dass Sie diese Galerie löschen möchten?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Das ist eine Demoversion. Alle Konfigurationen werden periodisch gelöscht, um einen sauberen Schiefer für zukünftige Tester zu gewährleisten.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktive Aktion durchgeführt</value>
</data>
@@ -371,7 +389,7 @@
<value>Bitte geben Sie den geheimen Schlüssel ein.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>hochzeitstag</value>
<value>Geheimschlüssel hier eingeben</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Die maximal zulässige Anzahl von Galerien wurde erreicht</value>
@@ -449,7 +467,7 @@
<value>Bitte geben Sie den Benutzernamen des Kontos ein.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Benutzername</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Anmeldung</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Die Inhalte auf der CookiePolicy-Infoseite</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Kundenspezifische Cookie-Richtlinie</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Zollpolitik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Nicht verfügbar, um Einstellungen zu erhalten</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Geheimer Schlüssel</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Sollte der Benutzer in der Lage sein, Medien zu filtern und zu gruppen?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filter anzeigen</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Sollten die Gäste Gegenstände hochladen dürfen</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Thema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Sollte der Nutzer die DSGVO-Stil Popups sehen?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ermöglicht</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Diashow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besuchen Sie uns</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warnung</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>WEITER</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalide Galerie</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Annahme</value>
</data>
<data name="Action" xml:space="preserve">
<value>Aktion</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk hat alle anhängigen Bewertungen abgelehnt</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ein Besucher hat die Verwendung von Cookies genehmigt</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Erstellte Galerie</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Bitte kontaktieren Sie einen Website-Administrator, um Zugang zu erhalten</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Nicht eingeloggt, um eine Audit-Nachricht für die Cookie-Zulassung zu protokollieren</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie-Richtlinie</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Durch die Nutzung dieser Website erklären Sie sich mit unserer Nutzung grundlegender Cookies gemäß unseren Nutzungsbedingungen einverstanden. Weitere Informationen finden Sie hier</value>
</data>
<data name="Create" xml:space="preserve">
<value>Erstellung</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Sind Sie sicher, dass Sie diese Galerie löschen möchten?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Das ist eine Demoversion. Alle Konfigurationen werden periodisch gelöscht, um einen sauberen Schiefer für zukünftige Tester zu gewährleisten.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktive Aktion durchgeführt</value>
</data>
@@ -371,7 +389,7 @@
<value>Bitte geben Sie den geheimen Schlüssel ein.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>hochzeitstag</value>
<value>Geheimschlüssel hier eingeben</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Die maximal zulässige Anzahl von Galerien wurde erreicht</value>
@@ -449,7 +467,7 @@
<value>Bitte geben Sie den Benutzernamen des Kontos ein.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Benutzername</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Anmeldung</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titel</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Die Inhalte auf der CookiePolicy-Infoseite</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Kundenspezifische Cookie-Richtlinie</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Zollpolitik</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Nicht verfügbar, um Einstellungen zu erhalten</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Geheimer Schlüssel</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Sollte der Benutzer in der Lage sein, Medien zu filtern und zu gruppen?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Filter anzeigen</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Sollten die Gäste Gegenstände hochladen dürfen</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Thema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Sollte der Nutzer die DSGVO-Stil Popups sehen?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ermöglicht</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Diashow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Besuchen Sie uns</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warnung</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>WEITER</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Μη έγκυρη συλλογή</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Αποδοχή</value>
</data>
<data name="Action" xml:space="preserve">
<value>Δράση</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Η Bulk απέρριψε όλες τις εκκρεμείς κριτικές</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ένας επισκέπτης έχει εγκρίνει τη χρήση cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Δημιουργία συλλογής</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Παρακαλούμε επικοινωνήστε με έναν διαχειριστή του site για να παρέχουν πρόσβαση</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Αποτυχία καταγραφής ενός μηνύματος ελέγχου για την έγκριση cookie</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Πολιτική για τα cookies</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Με τη χρήση αυτής της ιστοσελίδας συμφωνείτε με τη χρήση βασικών cookies σύμφωνα με τους όρους χρήσης των cookies. Για να μάθετε περισσότερα παρακαλώ δείτε μας</value>
</data>
<data name="Create" xml:space="preserve">
<value>Δημιουργία</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Σίγουρα θέλετε να διαγράψετε αυτή την γκαλερί?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Αυτή είναι μια έκδοση επίδειξης. Όλες οι ρυθμίσεις σβήνονται περιοδικά για να εξασφαλιστεί μια καθαρή πλάκα για τους μελλοντικούς δοκιμαστές.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Εκτελείται Καταστροφική Δράση</value>
</data>
@@ -371,7 +389,7 @@
<value>Παρακαλώ εισάγετε το μυστικό κλειδί.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>ημέρα γάμου</value>
<value>Εισάγετε εδώ το μυστικό κλειδί</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Έχει επιτευχθεί ο μέγιστος επιτρεπόμενος αριθμός γκαλερί</value>
@@ -449,7 +467,7 @@
<value>Παρακαλώ εισάγετε το όνομα χρήστη του λογαριασμού.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Διαχειριστής</value>
<value>Όνομα χρήστη</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Αποσύνδεση</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Τίτλος</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Το περιεχόμενο που θα εμφανιστεί στη σελίδα πληροφοριών της CookiePolicy</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Προσαρμοσμένη πολιτική cookies</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Προσαρμοσμένες πολιτικές</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Αποτυχία λήψης ρυθμίσεων</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Μυστικό κλειδί</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Θα πρέπει ο χρήστης να μπορεί να φιλτράρει και να ομαδοποιήσει τα μέσα?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Εμφάνιση φίλτρων</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Σε περίπτωση που επιτρέπεται στους επισκέπτες να ανεβάζουν αντικείμενα</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Θέμα</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Πρέπει ο χρήστης να δει τα αναδυόμενα στυλ GDPR?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ενεργοποίηση</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Προβολή σλάιντ</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Επίσκεψη</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Προειδοποίηση</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Σκουπίστε</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Μη έγκυρη συλλογή</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Αποδοχή</value>
</data>
<data name="Action" xml:space="preserve">
<value>Δράση</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Η Bulk απέρριψε όλες τις εκκρεμείς κριτικές</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ένας επισκέπτης έχει εγκρίνει τη χρήση cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Δημιουργία συλλογής</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Παρακαλούμε επικοινωνήστε με έναν διαχειριστή του site για να παρέχουν πρόσβαση</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Αποτυχία καταγραφής ενός μηνύματος ελέγχου για την έγκριση cookie</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Πολιτική για τα cookies</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Με τη χρήση αυτής της ιστοσελίδας συμφωνείτε με τη χρήση βασικών cookies σύμφωνα με τους όρους χρήσης των cookies. Για να μάθετε περισσότερα παρακαλώ δείτε μας</value>
</data>
<data name="Create" xml:space="preserve">
<value>Δημιουργία</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Σίγουρα θέλετε να διαγράψετε αυτή την γκαλερί?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Αυτή είναι μια έκδοση επίδειξης. Όλες οι ρυθμίσεις σβήνονται περιοδικά για να εξασφαλιστεί μια καθαρή πλάκα για τους μελλοντικούς δοκιμαστές.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Εκτελείται Καταστροφική Δράση</value>
</data>
@@ -371,7 +389,7 @@
<value>Παρακαλώ εισάγετε το μυστικό κλειδί.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>ημέρα γάμου</value>
<value>Εισάγετε εδώ το μυστικό κλειδί</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Έχει επιτευχθεί ο μέγιστος επιτρεπόμενος αριθμός γκαλερί</value>
@@ -449,7 +467,7 @@
<value>Παρακαλώ εισάγετε το όνομα χρήστη του λογαριασμού.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Διαχειριστής</value>
<value>Όνομα χρήστη</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Αποσύνδεση</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Τίτλος</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Το περιεχόμενο που θα εμφανιστεί στη σελίδα πληροφοριών της CookiePolicy</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Προσαρμοσμένη πολιτική cookies</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Προσαρμοσμένες πολιτικές</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Αποτυχία λήψης ρυθμίσεων</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Μυστικό κλειδί</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Θα πρέπει ο χρήστης να μπορεί να φιλτράρει και να ομαδοποιήσει τα μέσα?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Εμφάνιση φίλτρων</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Σε περίπτωση που επιτρέπεται στους επισκέπτες να ανεβάζουν αντικείμενα</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Θέμα</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Πρέπει ο χρήστης να δει τα αναδυόμενα στυλ GDPR?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ενεργοποίηση</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Προβολή σλάιντ</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Επίσκεψη</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Προειδοποίηση</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Σκουπίστε</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Μη έγκυρη συλλογή</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Αποδοχή</value>
</data>
<data name="Action" xml:space="preserve">
<value>Δράση</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Η Bulk απέρριψε όλες τις εκκρεμείς κριτικές</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Ένας επισκέπτης έχει εγκρίνει τη χρήση cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Δημιουργία συλλογής</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Παρακαλούμε επικοινωνήστε με έναν διαχειριστή του site για να παρέχουν πρόσβαση</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Αποτυχία καταγραφής ενός μηνύματος ελέγχου για την έγκριση cookie</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Πολιτική για τα cookies</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Με τη χρήση αυτής της ιστοσελίδας συμφωνείτε με τη χρήση βασικών cookies σύμφωνα με τους όρους χρήσης των cookies. Για να μάθετε περισσότερα παρακαλώ δείτε μας</value>
</data>
<data name="Create" xml:space="preserve">
<value>Δημιουργία</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Σίγουρα θέλετε να διαγράψετε αυτή την γκαλερί?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Αυτή είναι μια έκδοση επίδειξης. Όλες οι ρυθμίσεις σβήνονται περιοδικά για να εξασφαλιστεί μια καθαρή πλάκα για τους μελλοντικούς δοκιμαστές.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Εκτελείται Καταστροφική Δράση</value>
</data>
@@ -371,7 +389,7 @@
<value>Παρακαλώ εισάγετε το μυστικό κλειδί.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>ημέρα γάμου</value>
<value>Εισάγετε εδώ το μυστικό κλειδί</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Έχει επιτευχθεί ο μέγιστος επιτρεπόμενος αριθμός γκαλερί</value>
@@ -449,7 +467,7 @@
<value>Παρακαλώ εισάγετε το όνομα χρήστη του λογαριασμού.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Διαχειριστής</value>
<value>Όνομα χρήστη</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Αποσύνδεση</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Τίτλος</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>Το περιεχόμενο που θα εμφανιστεί στη σελίδα πληροφοριών της CookiePolicy</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Προσαρμοσμένη πολιτική cookies</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Προσαρμοσμένες πολιτικές</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Αποτυχία λήψης ρυθμίσεων</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Μυστικό κλειδί</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Θα πρέπει ο χρήστης να μπορεί να φιλτράρει και να ομαδοποιήσει τα μέσα?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Εμφάνιση φίλτρων</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Σε περίπτωση που επιτρέπεται στους επισκέπτες να ανεβάζουν αντικείμενα</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Θέμα</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Πρέπει ο χρήστης να δει τα αναδυόμενα στυλ GDPR?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Ενεργοποίηση</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Προβολή σλάιντ</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Επίσκεψη</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Προειδοποίηση</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Σκουπίστε</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalid Gallery</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Accept</value>
</data>
<data name="Action" xml:space="preserve">
<value>Action</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk rejected all pending reviews</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>A visitor has approved the use of cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Created gallery</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Please contact a site administrator to provide access</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Failed to log an audit message for cookie approval</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie Policy</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>By using this website you agree to our use of basic cookies in accordance with our terms of cookie usage. To find out more please view our</value>
</data>
<data name="Create" xml:space="preserve">
<value>Create</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Are you sure you want to delete this gallery?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>This is a demo version. All configuration is periodically wiped to ensure a clean slate for future testers.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destructive Action Performed</value>
</data>
@@ -371,7 +389,7 @@
<value>Please enter the secret key.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>wedding-day</value>
<value>Enter secret key here</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>The maximum allowed number of galleries has been reached</value>
@@ -449,7 +467,7 @@
<value>Please enter account username.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Username</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -601,9 +619,6 @@
<data name="Settings_Basic" xml:space="preserve">
<value>Basic</value>
</data>
<data name="Settings_Basic" xml:space="preserve">
<value>Basic</value>
</data>
<data name="Settings_Basic_BaseUrl_Help" xml:space="preserve">
<value>The base Url to be used in links and notifications</value>
</data>
@@ -688,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Title</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>The content to display on the CookiePolicy info page</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Custom Cookie Policy</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Custom Policies</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Failed to get settings</value>
</data>
@@ -820,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Secret Key</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Should the user be able to filter and group media?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Show Filters</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Should guests be allowed to upload items</value>
</data>
@@ -860,7 +890,7 @@
<value>Access Token</value>
</data>
<data name="Settings_IdentityCheck" xml:space="preserve">
<value>Identity Check</value>
<value>Guest Name</value>
</data>
<data name="Settings_IdentityCheck_Enabled_Help" xml:space="preserve">
<value>Prompt users for their name</value>
@@ -869,13 +899,13 @@
<value>Enabled</value>
</data>
<data name="Settings_IdentityCheck_PageLoad_Help" xml:space="preserve">
<value>Should the identity check be displayed at page load</value>
<value>Should the guest name check be displayed at page load</value>
</data>
<data name="Settings_IdentityCheck_PageLoad_Label" xml:space="preserve">
<value>Page Load Prompt</value>
</data>
<data name="Settings_IdentityCheck_Upload_Help" xml:space="preserve">
<value>Should the identity check be required to upload media</value>
<value>Should the guest name check be required to upload media</value>
</data>
<data name="Settings_IdentityCheck_Upload_Label" xml:space="preserve">
<value>Upload Prompt</value>
@@ -928,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Topic</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Should the user see GDPR style popups?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1093,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Visit</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warning</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalid Gallery</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Accept</value>
</data>
<data name="Action" xml:space="preserve">
<value>Action</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk rejected all pending reviews</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>A visitor has approved the use of cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Created gallery</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Please contact a site administrator to provide access</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Failed to log an audit message for cookie approval</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie Policy</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>By using this website you agree to our use of basic cookies in accordance with our terms of cookie usage. To find out more please view our</value>
</data>
<data name="Create" xml:space="preserve">
<value>Create</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Are you sure you want to delete this gallery?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>This is a demo version. All configuration is periodically wiped to ensure a clean slate for future testers.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destructive Action Performed</value>
</data>
@@ -371,7 +389,7 @@
<value>Please enter the secret key.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>wedding-day</value>
<value>Enter secret key here</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>The maximum allowed number of galleries has been reached</value>
@@ -449,7 +467,7 @@
<value>Please enter account username.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Username</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Logout</value>
@@ -601,9 +619,6 @@
<data name="Settings_Basic" xml:space="preserve">
<value>Basic</value>
</data>
<data name="Settings_Basic" xml:space="preserve">
<value>Basic</value>
</data>
<data name="Settings_Basic_BaseUrl_Help" xml:space="preserve">
<value>The base Url to be used in links and notifications</value>
</data>
@@ -688,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Title</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>The content to display on the CookiePolicy info page</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Custom Cookie Policy</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Custom Policies</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Failed to get settings</value>
</data>
@@ -820,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Secret Key</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Should the user be able to filter and group media?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Show Filters</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Should guests be allowed to upload items</value>
</data>
@@ -860,7 +890,7 @@
<value>Access Token</value>
</data>
<data name="Settings_IdentityCheck" xml:space="preserve">
<value>Identity Check</value>
<value>Guest Name</value>
</data>
<data name="Settings_IdentityCheck_Enabled_Help" xml:space="preserve">
<value>Prompt users for their name</value>
@@ -869,13 +899,13 @@
<value>Enabled</value>
</data>
<data name="Settings_IdentityCheck_PageLoad_Help" xml:space="preserve">
<value>Should the identity check be displayed at page load</value>
<value>Should the guest name check be displayed at page load</value>
</data>
<data name="Settings_IdentityCheck_PageLoad_Label" xml:space="preserve">
<value>Page Load Prompt</value>
</data>
<data name="Settings_IdentityCheck_Upload_Help" xml:space="preserve">
<value>Should the identity check be required to upload media</value>
<value>Should the guest name check be required to upload media</value>
</data>
<data name="Settings_IdentityCheck_Upload_Label" xml:space="preserve">
<value>Upload Prompt</value>
@@ -928,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Topic</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Should the user see GDPR style popups?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1093,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Visit</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Warning</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalid Gallery</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Akcepto</value>
</data>
<data name="Action" xml:space="preserve">
<value>Ago</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk malaprobis ĉiujn klarigitajn recenzojn</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Vizito aprobis la uzon de kuketoj</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Kreita galerio</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Bonvolu kontakti retejon administranto por provizi aliron</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Malsukcesa por ensaluti revizimesaĝon por kliko</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie Politiko</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Uzante ĉi tiun retejon vi konsentas al nia uzo de bazaj kuketoj laŭ niaj kondiĉoj de kuketo-uzokutimo. Por ekscii pli, bonvolu vidi nian</value>
</data>
<data name="Create" xml:space="preserve">
<value>Krei</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Ĉu vi volas forigi tiun galerion?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Tio estas demo versio. Ĉiu konfiguracio periode estas forviŝita por certigi puran ardezon por estontaj testistoj.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktura Ago rezultas</value>
</data>
@@ -371,7 +389,7 @@
<value>Bonvolu eniri la sekretan ŝlosilon.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>geedziĝ-tago</value>
<value>Enmetu sekretan ŝlosilon ĉi tie</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>La maksimuma permesita nombro da galerioj estis atingita</value>
@@ -449,7 +467,7 @@
<value>Bonvolu eniri konton uzantnomo.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Uzantnomo</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Diskuto</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titolo</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>La enhavo por montri sur la CookiePolicy info paĝo</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Kutimo Cookie Politiko</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Kutimaj Politikoj</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Malsukcesis akiri agordojn</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Sekretoj</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Ĉu la uzanto povas filtri kaj grupigi amaskomunikilojn?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Montri Filters</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Ĉu gastoj rajtas alŝuti erojn</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Temoj</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Ĉu la uzanto vidas GDPR stilajn poplojn?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Vizito</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Averto</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Invalid Gallery</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Akcepto</value>
</data>
<data name="Action" xml:space="preserve">
<value>Ago</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk malaprobis ĉiujn klarigitajn recenzojn</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Vizito aprobis la uzon de kuketoj</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Kreita galerio</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Bonvolu kontakti retejon administranto por provizi aliron</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>Malsukcesa por ensaluti revizimesaĝon por kliko</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Cookie Politiko</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Uzante ĉi tiun retejon vi konsentas al nia uzo de bazaj kuketoj laŭ niaj kondiĉoj de kuketo-uzokutimo. Por ekscii pli, bonvolu vidi nian</value>
</data>
<data name="Create" xml:space="preserve">
<value>Krei</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>Ĉu vi volas forigi tiun galerion?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Tio estas demo versio. Ĉiu konfiguracio periode estas forviŝita por certigi puran ardezon por estontaj testistoj.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destruktura Ago rezultas</value>
</data>
@@ -371,7 +389,7 @@
<value>Bonvolu eniri la sekretan ŝlosilon.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>geedziĝ-tago</value>
<value>Enmetu sekretan ŝlosilon ĉi tie</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>La maksimuma permesita nombro da galerioj estis atingita</value>
@@ -449,7 +467,7 @@
<value>Bonvolu eniri konton uzantnomo.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Uzantnomo</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Diskuto</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Titolo</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>La enhavo por montri sur la CookiePolicy info paĝo</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Kutimo Cookie Politiko</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Kutimaj Politikoj</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Malsukcesis akiri agordojn</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Sekretoj</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>Ĉu la uzanto povas filtri kaj grupigi amaskomunikilojn?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Montri Filters</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Ĉu gastoj rajtas alŝuti erojn</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Temoj</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>Ĉu la uzanto vidas GDPR stilajn poplojn?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Vizito</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Averto</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Galería Inválida</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Aceptar</value>
</data>
<data name="Action" xml:space="preserve">
<value>Medida</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk rechazó todos los exámenes pendientes</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Un visitante ha aprobado el uso de cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Galería creada</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Por favor contacte con un administrador del sitio para proporcionar acceso</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>No logré un mensaje de auditoría para la aprobación de las cookies</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Política de cookies</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Al utilizar este sitio web usted acepta el uso de cookies básicas de acuerdo con nuestros términos de uso de cookies. Para saber más, por favor vea nuestra</value>
</data>
<data name="Create" xml:space="preserve">
<value>Crear</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>¿Estás seguro de querer borrar esta galería?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Es una versión demo. Toda la configuración se limpia periódicamente para asegurar una pizarra limpia para futuros probadores.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destructive Action Performed</value>
</data>
@@ -371,7 +389,7 @@
<value>Por favor, introduce la llave secreta.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>boda-día</value>
<value>Entra la llave secreta aquí</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Se ha alcanzado el número máximo permitido de galerías</value>
@@ -449,7 +467,7 @@
<value>Por favor ingrese el nombre de usuario de la cuenta.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Nombre de usuario</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Cerrar sesión</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Título</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>El contenido para mostrar en la página Información sobre CookiePolicy</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Política de cookies personalizada</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Políticas aduaneras</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Failed to get settings</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Secret Key</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>¿Debería el usuario poder filtrar y agrupar los medios?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Mostrar filtros</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Si se permite a los huéspedes subir artículos</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>¿Debería el usuario ver popups de estilo GDPR?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Visita</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Advertencia</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

View File

@@ -94,6 +94,9 @@
<data name="406_Error_Title" xml:space="preserve">
<value>Galería Inválida</value>
</data>
<data name="Accept" xml:space="preserve">
<value>Aceptar</value>
</data>
<data name="Action" xml:space="preserve">
<value>Medida</value>
</data>
@@ -118,6 +121,9 @@
<data name="Audit_BulkRejectReviews" xml:space="preserve">
<value>Bulk rechazó todos los exámenes pendientes</value>
</data>
<data name="Audit_CookieConsentApproved" xml:space="preserve">
<value>Un visitante ha aprobado el uso de cookies</value>
</data>
<data name="Audit_CreatedGallery" xml:space="preserve">
<value>Galería creada</value>
</data>
@@ -235,6 +241,15 @@
<data name="Contact_Admin_For_Access" xml:space="preserve">
<value>Por favor contacte con un administrador del sitio para proporcionar acceso</value>
</data>
<data name="Cookie_Audit_Error" xml:space="preserve">
<value>No logré un mensaje de auditoría para la aprobación de las cookies</value>
</data>
<data name="CookiePolicy_Button_Text" xml:space="preserve">
<value>Política de cookies</value>
</data>
<data name="CookiePolicy_Message_Short" xml:space="preserve">
<value>Al utilizar este sitio web usted acepta el uso de cookies básicas de acuerdo con nuestros términos de uso de cookies. Para saber más, por favor vea nuestra</value>
</data>
<data name="Create" xml:space="preserve">
<value>Crear</value>
</data>
@@ -271,6 +286,9 @@
<data name="Delete_Confirmation" xml:space="preserve">
<value>¿Estás seguro de querer borrar esta galería?</value>
</data>
<data name="Demo_Message" xml:space="preserve">
<value>Es una versión demo. Toda la configuración se limpia periódicamente para asegurar una pizarra limpia para futuros probadores.</value>
</data>
<data name="Destructive_Action_Performed" xml:space="preserve">
<value>Destructive Action Performed</value>
</data>
@@ -371,7 +389,7 @@
<value>Por favor, introduce la llave secreta.</value>
</data>
<data name="Gallery_Key_Placeholder" xml:space="preserve">
<value>boda-día</value>
<value>Entra la llave secreta aquí</value>
</data>
<data name="Gallery_Limit_Reached" xml:space="preserve">
<value>Se ha alcanzado el número máximo permitido de galerías</value>
@@ -449,7 +467,7 @@
<value>Por favor ingrese el nombre de usuario de la cuenta.</value>
</data>
<data name="Login_Username_Placeholder" xml:space="preserve">
<value>Admin</value>
<value>Nombre de usuario</value>
</data>
<data name="Logout" xml:space="preserve">
<value>Cerrar sesión</value>
@@ -685,6 +703,15 @@
<data name="Settings_Basic_Title_Label" xml:space="preserve">
<value>Título</value>
</data>
<data name="Settings_CustomCookiePolicy_Help" xml:space="preserve">
<value>El contenido para mostrar en la página Información sobre CookiePolicy</value>
</data>
<data name="Settings_CustomCookiePolicy_Label" xml:space="preserve">
<value>Política de cookies personalizada</value>
</data>
<data name="Settings_CustomPolicies" xml:space="preserve">
<value>Políticas aduaneras</value>
</data>
<data name="Settings_Failed" xml:space="preserve">
<value>Failed to get settings</value>
</data>
@@ -817,6 +844,12 @@
<data name="Settings_Gallery_SecretKey_Label" xml:space="preserve">
<value>Secret Key</value>
</data>
<data name="Settings_Gallery_ShowFilters_Help" xml:space="preserve">
<value>¿Debería el usuario poder filtrar y agrupar los medios?</value>
</data>
<data name="Settings_Gallery_ShowFilters_Label" xml:space="preserve">
<value>Mostrar filtros</value>
</data>
<data name="Settings_Gallery_Upload_Help" xml:space="preserve">
<value>Si se permite a los huéspedes subir artículos</value>
</data>
@@ -925,6 +958,12 @@
<data name="Settings_Ntfy_Topic_Label" xml:space="preserve">
<value>Tema</value>
</data>
<data name="Settings_PoliciesEnabled_Help" xml:space="preserve">
<value>¿Debería el usuario ver popups de estilo GDPR?</value>
</data>
<data name="Settings_PoliciesEnabled_Label" xml:space="preserve">
<value>Enabled</value>
</data>
<data name="Settings_Slideshow" xml:space="preserve">
<value>Slideshow</value>
</data>
@@ -1090,6 +1129,9 @@
<data name="Visit" xml:space="preserve">
<value>Visita</value>
</data>
<data name="Warning" xml:space="preserve">
<value>Advertencia</value>
</data>
<data name="Wipe" xml:space="preserve">
<value>Wipe</value>
</data>

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